DCISolver - Dynamic Control of Infeasibility Solver

DCI is a solver for equality-constrained nonlinear problems, i.e., optimization problems of the form

\[ \min_x \ f(x) \quad \text{s.t.} \quad c(x) = 0,\]

based on the paper

Bielschowsky, R. H., & Gomes, F. A. Dynamic control of infeasibility in equality constrained optimization. SIAM Journal on Optimization, 19(3), 1299-1325 (2008). 10.1007/s10589-020-00201-2

DCISolver is a JuliaSmoothOptimizers-compliant solver. It takes an AbstractNLPModel as an input and returns a GenericExecutionStats.

Installation

DCISolver is a registered package. To install this package, open the Julia REPL (i.e., execute the julia binary), type ] to enter package mode, and install DCISolver as follows

add DCISolver

It uses LDLFactorizations.jl by default to compute the factorization in the tangent step. Follow HSL.jl's MA57 installation for an alternative.

The feasibility steps are factorization-free and use iterative methods from Krylov.jl.

Example

using DCISolver, ADNLPModels, Logging
nlp = ADNLPModel(
  x -> 100 * (x[2] - x[1]^2)^2 + (x[1] - 1)^2,
  [-1.2; 1.0],
  x -> [x[1] * x[2] - 1],
  [0.0], [0.0],
  name = "Rosenbrock with x₁x₂=1"
)
stats = with_logger(NullLogger()) do
  dci(nlp, nlp.meta.x0)
end

println(stats)
Generic Execution stats
  status: first-order stationary
  objective value: 2.035899899718871e-10
  primal feasibility: 2.851882273002815e-6
  dual feasibility: 0.0006043535477299483
  solution: [1.0000014238685366  1.000001428011703]
  iterations: 9
  elapsed time: 0.5991299152374268
  solver specific:
    lagrangian: -2.053608276550044e-10
    multiplier: [-0.0001433968090121397]