The Uno (Unifying Nonconvex Optimization) solver

UnoSolver.jl is now a registered Julia package :partying_face:
It can be used via NLPModels.jl and MathOptInterface.jl. Thank you to MVP @amontoison for making it happen!

I’m now working on documentation and tutorials (something like First steps with Uno). Until then, here’s a small appetizer: Uno can mimic filterSQP (SQP method) and IPOPT (barrier method); all you have to do is set the Uno preset to filtersqp or ipopt like so:

using UnoSolver, JuMP

jump_model = Model(() -> UnoSolver.Optimizer(preset="filtersqp"))
x0 = [-2, 1]
uvar = [0.5, Inf]
@variable(jump_model, x[i = 1:2] ≤ uvar[i], start = x0[i])
@objective(jump_model, Min, 100 * (x[2] - x[1]^2)^2 + (1 - x[1])^2)
@constraint(jump_model, x[1] * x[2] - 1 ≥ 0)
@constraint(jump_model, x[1] + x[2]^2 ≥ 0)

optimize!(jump_model)

termination_status(jump_model)  # solver termination status
objective_value(jump_model)     # objective value
value.(x)                       # primal solution

The next Uno features will include:

  • an L-BFGS (a type of quasi-Newton) Hessian approximation;
  • SLP-EQP methods: first solve a trust-region LP to get an estimation of the active-set, then an equality-constrained QP in which the active inequality constraints are treated as equalities and the inactive constraints are dropped. This approach combines efficiency and robustness (LP solvers and linear solvers are mature technology), and warmstarting capabilities.

Try it out and give us some feedback!

17 Likes