KKT systems
MadNLP manipulates KKT systems using two abstractions: an AbstractKKTSystem storing the KKT system' matrix and an AbstractKKTVector storing the KKT system's right-hand-side.
AbstractKKTSystem
MadNLP.AbstractKKTSystem — TypeAbstractKKTSystem{T, VT<:AbstractVector{T}, MT<:AbstractMatrix{T}, QN<:AbstractHessian{T}}Abstract type for KKT system.
MadNLP implements three different types of AbstractKKTSystem, depending how far we reduce the KKT system.
MadNLP.AbstractUnreducedKKTSystem — TypeAbstractUnreducedKKTSystem{T, VT, MT, QN} <: AbstractKKTSystem{T, VT, MT, QN}Augmented KKT system associated to the linearization of the KKT conditions at the current primal-dual iterate $(x, s, y, z, ν, w)$.
The associated matrix is
[Wₓₓ 0 Aₑ' Aᵢ' V½ 0 ] [Δx]
[0 0 0 -I 0 W½ ] [Δs]
[Aₑ 0 0 0 0 0 ] [Δy]
[Aᵢ -I 0 0 0 0 ] [Δz]
[V½ 0 0 0 -X 0 ] [Δτ]
[0 W½ 0 0 0 -S ] [Δρ]with
- $Wₓₓ$: Hessian of the Lagrangian.
- $Aₑ$: Jacobian of the equality constraints
- $Aᵢ$: Jacobian of the inequality constraints
- $X = diag(x)$
- $S = diag(s)$
- $V = diag(ν)$
- $W = diag(w)$
- $Δτ = -W^{-½}Δν$
- $Δρ = -W^{-½}Δw$
MadNLP.AbstractReducedKKTSystem — TypeAbstractReducedKKTSystem{T, VT, MT, QN} <: AbstractKKTSystem{T, VT, MT, QN}The reduced KKT system is a simplification of the original Augmented KKT system. Comparing to AbstractUnreducedKKTSystem), AbstractReducedKKTSystem removes the two last rows associated to the bounds' duals $(ν, w)$.
At a primal-dual iterate $(x, s, y, z)$, the matrix writes
[Wₓₓ + Σₓ 0 Aₑ' Aᵢ'] [Δx]
[0 Σₛ 0 -I ] [Δs]
[Aₑ 0 0 0 ] [Δy]
[Aᵢ -I 0 0 ] [Δz]with
- $Wₓₓ$: Hessian of the Lagrangian.
- $Aₑ$: Jacobian of the equality constraints
- $Aᵢ$: Jacobian of the inequality constraints
- $Σₓ = X⁻¹ V$
- $Σₛ = S⁻¹ W$
MadNLP.AbstractCondensedKKTSystem — TypeAbstractCondensedKKTSystem{T, VT, MT, QN} <: AbstractKKTSystem{T, VT, MT, QN}The condensed KKT system simplifies further the AbstractReducedKKTSystem by removing the rows associated to the slack variables $s$ and the inequalities.
At the primal-dual iterate $(x, y)$, the matrix writes
[Wₓₓ + Σₓ + Aᵢ' Σₛ Aᵢ Aₑ'] [Δx]
[ Aₑ 0 ] [Δy]with
- $Wₓₓ$: Hessian of the Lagrangian.
- $Aₑ$: Jacobian of the equality constraints
- $Aᵢ$: Jacobian of the inequality constraints
- $Σₓ = X⁻¹ V$
- $Σₛ = S⁻¹ W$
Each AbstractKKTSystem follows the interface described below:
MadNLP.create_kkt_system — Functioncreate_kkt_system(
::Type{KKT},
cb::AbstractCallback,
ind_cons::NamedTuple,
linear_solver::Type{LinSol};
opt_linear_solver=default_options(linear_solver),
hessian_approximation=ExactHessian,
) where {KKT<:AbstractKKTSystem, LinSol<:AbstractLinearSolver}Instantiate a new KKT system with type KKT, associated to the the nonlinear program encoded inside the callback cb. The NamedTuple ind_cons stores the indexes of all the variables and constraints in the callback cb. In addition, the user should pass the linear solver linear_solver that will be used to solve the KKT system after it has been assembled.
MadNLP.num_variables — FunctionNumber of primal variables (including slacks) associated to the KKT system.
MadNLP.get_kkt — Functionget_kkt(kkt::AbstractKKTSystem)::AbstractMatrixReturn a pointer to the KKT matrix implemented in kkt. The pointer is passed afterward to a linear solver.
MadNLP.get_jacobian — FunctionGet Jacobian matrix
MadNLP.get_hessian — FunctionGet Hessian matrix
MadNLP.initialize! — Functioninitialize!(kkt::AbstractKKTSystem)Initialize KKT system with default values. Called when we initialize the MadNLPSolver storing the current KKT system kkt.
MadNLP.build_kkt! — Functionbuild_kkt!(kkt::AbstractKKTSystem)Assemble the KKT matrix before calling the factorization routine.
MadNLP.compress_hessian! — Functioncompress_hessian!(kkt::AbstractKKTSystem)Compress the Hessian inside kkt's internals. This function is called every time a new Hessian is evaluated.
Default implementation do nothing.
MadNLP.compress_jacobian! — Functioncompress_jacobian!(kkt::AbstractKKTSystem)Compress the Jacobian inside kkt's internals. This function is called every time a new Jacobian is evaluated.
By default, the function updates in the Jacobian the coefficients associated to the slack variables.
MadNLP.jtprod! — Functionjtprod!(y::AbstractVector, kkt::AbstractKKTSystem, x::AbstractVector)Multiply with transpose of Jacobian and store the result in y, such that $y = A' x$ (with $A$ current Jacobian).
MadNLP.regularize_diagonal! — Functionregularize_diagonal!(kkt::AbstractKKTSystem, primal_values::Number, dual_values::Number)Regularize the values in the diagonal of the KKT system in an incremental fashion. Called internally inside the interior-point routine.
MadNLP.is_inertia_correct — Functionis_inertia_correct(kkt::AbstractKKTSystem, n::Int, m::Int, p::Int)Check if the inertia $(n, m, p)$ returned by the linear solver is adapted to the KKT system implemented in kkt.
MadNLP.nnz_jacobian — FunctionNonzero in Jacobian
Sparse KKT systems
By default, MadNLP stores a AbstractReducedKKTSystem in sparse format, as implemented by SparseKKTSystem:
MadNLP.SparseKKTSystem — TypeSparseKKTSystem{T, VT, MT, QN} <: AbstractReducedKKTSystem{T, VT, MT, QN}Implement the AbstractReducedKKTSystem in sparse COO format.
Alternatively, the user has the choice to store the KKT system as a SparseUnreducedKKTSystem or as a SparseCondensedKKTSystem:
MadNLP.SparseUnreducedKKTSystem — TypeSparseUnreducedKKTSystem{T, VT, MT, QN} <: AbstractUnreducedKKTSystem{T, VT, MT, QN}Implement the AbstractUnreducedKKTSystem in sparse COO format.
MadNLP.SparseCondensedKKTSystem — TypeSparseCondensedKKTSystem{T, VT, MT, QN} <: AbstractCondensedKKTSystem{T, VT, MT, QN}Implement the AbstractCondensedKKTSystem in sparse COO format.
Dense KKT systems
MadNLP provides also two structures to store the KKT system in a dense matrix. Although less efficient than their sparse counterparts, these two structures allow to store the KKT system efficiently when the problem is instantiated on the GPU.
MadNLP.DenseKKTSystem — TypeDenseKKTSystem{T, VT, MT, QN, VI} <: AbstractReducedKKTSystem{T, VT, MT, QN}Implement AbstractReducedKKTSystem with dense matrices.
Requires a dense linear solver to be factorized (otherwise an error is returned).
MadNLP.DenseCondensedKKTSystem — TypeDenseCondensedKKTSystem{T, VT, MT, QN} <: AbstractCondensedKKTSystem{T, VT, MT, QN}Implement AbstractCondensedKKTSystem with dense matrices.
Requires a dense linear solver to factorize the associated KKT system (otherwise an error is returned).
AbstractKKTVector
Each instance of AbstractKKTVector implements the following interface.
MadNLP.AbstractKKTVector — TypeAbstractKKTVector{T, VT}Supertype for KKT's right-hand-side vectors $(x, s, y, z, ν, w)$.
MadNLP.number_primal — Functionnumber_primal(X::AbstractKKTVector)Get total number of primal values $(x, s)$ in KKT vector X.
MadNLP.number_dual — Functionnumber_dual(X::AbstractKKTVector)Get total number of dual values $(y, z)$ in KKT vector X.
MadNLP.full — Functionfull(X::AbstractKKTVector)Return the all the values stored inside the KKT vector X.
MadNLP.primal — Functionprimal(X::AbstractKKTVector)Return the primal values $(x, s)$ stored in the KKT vector X.
MadNLP.dual — Functiondual(X::AbstractKKTVector)Return the dual values $(y, z)$ stored in the KKT vector X.
MadNLP.primal_dual — Functionprimal_dual(X::AbstractKKTVector)Return both the primal and the dual values $(x, s, y, z)$ stored in the KKT vector X.
MadNLP.dual_lb — Functiondual_lb(X::AbstractKKTVector)Return the dual values $ν$ associated to the lower-bound stored in the KKT vector X.
MadNLP.dual_ub — Functiondual_ub(X::AbstractKKTVector)Return the dual values $w$ associated to the upper-bound stored in the KKT vector X.
By default, MadNLP provides one implementation of an AbstractKKTVector.
MadNLP.UnreducedKKTVector — TypeUnreducedKKTVector{T, VT<:AbstractVector{T}} <: AbstractKKTVector{T, VT}Full KKT vector $(x, s, y, z, ν, w)$, associated to a AbstractUnreducedKKTSystem.