Homotopy Augmented Lagrangian method for EQuality-constrained Optimization
HALeqO.jl is a pure Julia implementation of a solver for continuous nonlinear equality-constrained optimization problems of the form
min f(x) over x in R^n subject to c(x) = 0
based on a homotopy augmented Lagrangian method and globalised Newton's steps with Armijo's linesearch. To invoke the haleqo
solver, you have to pass it an NLPModel; it returns a GenericExecutionStats.
using NLPModels, HALeqO
out = haleqo(nlp)
You can solve an JuMP model m
by using NLPModels to convert it.
using NLPModelsJuMP, HALeqO
nlp = MathOptNLPModel(m)
out = haleqo(nlp)
HALeqO.jl uses the free QDLDL.jl routines as main linear solver and PositiveFactorizations.jl for regularizing the Hessian matrix. These could be replaced by, or complemented with, LDLFactorizations.jl and HSL.jl's MA57
based on HSL.
If you find this code useful, you can cite the related paper as
@inproceedings{demarchi2021augmented,
author = {De~Marchi, Alberto},
title = {Augmented {L}agrangian methods as dynamical systems for constrained optimization},
year = {2021},
month = {12},
pages = {6533--6538},
booktitle = {2021 60th {IEEE} {C}onference on {D}ecision and {C}ontrol ({CDC})},
doi = {10.1109/CDC45484.2021.9683199},
}
We compared HALeqO against Ipopt, via the wrapper provided by NLPModelsIpopt, and NCL.jl invoking Ipopt.
There is also Percival now.
See run_benchmarks.jl
in the tests
folder.
To use the provided test codes (originally compatible with Julia version 1.8.5, tested on Linux x86_64, August 2021):
-
start Julia from this directory with
julia --project=.
(or with the relative path to theHALeqO
directory from somewhere else); -
do
]instantiate
to download all dependencies (only required the first time) and go back to standard Julia prompt with backspace afterwards; -
load the package with
using HALeqO
To run the CUTEst benchmarks:
- do
include("tests/run_benchmarks.jl")
to invoke the solvers, generate the results, print statistics and save figures.
Options for benchmarking (e.g., max time and tolerance) can be modified at the beginning of the tests/run_benchmarks.jl
file.