Uno is a C++ library for solving nonlinearly constrained optimization problems of the form:
where
Uno unifies Lagrange-Newton (essentially SQP and interior-point) methods that iteratively solve the optimality (KKT) conditions with Newton's method. It breaks them down into a set of building blocks that interact with one another. Our unification framework can be visualized in the following hypergraph (not all are implemented in Uno yet):
You can combine these strategies in a ton of different ways via options. Uno also implements presets, that is strategy combinations that mimic existing solvers:
filtersqpmimics filterSQP (trust-region feasibility restoration filter SQP method with exact Hessian);ipoptmimics IPOPT (line-search feasibility restoration filter barrier method with exact Hessian and primal-dual inertia correction).
Note that all combinations do not necessarily result in sensible algorithms, or even convergent approaches.
For more details on our unification theory, check out the UNIFICATION page, our preprint, or my latest slides.
See the INSTALL file for instructions on how to compile Uno from source or use the precompiled libraries and executables.
Uno's AMPL executable can be compiled via the command make uno_ampl and requires the AMPL Solver Library (ASL). For more details, see the README.md.
Uno can be used from Julia in two ways:
-
Pure Julia interface: UnoSolver.jl is the native Julia interface to Uno. It provides direct integration with the Julia optimization ecosystem through:
- a thin wrapper around the full C API,
- an interface to NLPModels.jl for solving problems following the NLPModels API, such as CUTEst, ADNLPModels.jl, or ExaModels.jl,
- an interface to MathOptInterface.jl for handling JuMP models.
Under the hood,
UnoSolver.jluses precompiled shared libraries from Uno_jll.jl while exposing a high-level Julia API. More details can be found in the README ofUnoSolver.jl. This is the recommended way of using Uno in Julia. -
AMPL interface: Alternatively, the executable
uno_amplcan be installed via Uno_jll.jl and used through AmplNLWriter.jl. An example can be found here.
Uno's Python bindings can be compiled via the command make unopy and require pybind11. For more details, see their README.md.
Uno's C interface is compiled as part of the Uno library. For more details, see its README.md. It may be modified in future minor releases.
Uno presets have been tested against state-of-the-art solvers on 429 small problems of the CUTEst benchmark.
The figure below is a performance profile of Uno and state-of-the-art solvers filterSQP, IPOPT, SNOPT, MINOS, LANCELOT, LOQO and CONOPT; it shows how many problems are solved for a given budget of function evaluations (1 time, 2 times, 4 times, ...,
All log files can be found here.
We have submitted our paper to the Mathematical Programming Computation journal. The preprint is available on ResearchGate.
Until it is published, you can use the following bibtex entry:
@unpublished{VanaretLeyffer2024,
author = {Vanaret, Charlie and Leyffer, Sven},
title = {Implementing a unified solver for nonlinearly constrained optimization},
year = {2024},
note = {Submitted to Mathematical Programming Computation}
}
The theoretical abstract framework for unifying nonlinearly constrained optimization was developed by Charlie Vanaret (Argonne National Laboratory & Zuse-Institut Berlin) and Sven Leyffer (Argonne National Laboratory). Uno was designed and implemented by Charlie Vanaret. It is released under the MIT license (see the license file).
The contributors are (in alphabetical order): Oscar Dowson, Marcel Jacobse, Arnav Kapoor, David Kiessling, Rujia Liu, Stefano Lovato, Alexis Montoison, Manuel Schaich, Silvio Traversaro.
The Uno logo was created by Charlie Vanaret based on a saddle point icon by luimonts (CC BY 3.0).


