# The Uno (Unifying Nonlinear Optimization) solver

**URL:** https://discourse.julialang.org/t/the-uno-unifying-nonlinear-optimization-solver/115883
**Category:** Optimization (Mathematical)
**Tags:** nonlinear-optimizati, nonconvex-optimizati, nonlinear-programmin, sqp
**Created:** [June 19, 2024, 8:23pm UTC](https://discourse.julialang.org/t/the-uno-unifying-nonlinear-optimization-solver/115883 "2024-06-19T20:23:45Z")
**Posts on this page:** 1
**Showing post:** 21

<div class="post-metadata">

### Author: ![cvanaret](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cvanaret/32/11594_2.png) [@cvanaret](https://discourse.julialang.org/u/cvanaret)
#### Post date: [July 7, 2025, 1:20pm UTC](https://discourse.julialang.org/t/the-uno-unifying-nonlinear-optimization-solver/115883/21 "2025-07-07T13:20:23Z")

</div>

**[Uno v2.0.0](https://github.com/cvanaret/Uno) is out!**  
Already available in your favorite language: [Uno\_jll](https://github.com/JuliaBinaryWrappers/Uno_jll.jl).

The major changes are:

- a more powerful unification framework with ingredients such as _Hessian model_ (exact, identity, zero), _regularization strategy_ (primal, primal-dual, none) and _inequality handling method_ (inequality constrained, interior-point).

 ![wheel](https://global.discourse-cdn.com/julialang/original/3X/3/2/324027556c2159194ad77ffffdefdb4bfec73d50.png)

- the null space active-set QP solver [BQPD](https://www.mcs.anl.gov/~leyffer/solvers.html) is now available as [precompiled binaries](https://github.com/leyffer/BQPD_jll.jl/releases) and a binary package [BQPD\_jll](https://juliahub.com/ui/Packages/General/BQPD_jll) 🥳 This means we can now use the `filtersqp` preset (trust-region filter SQP method) within `Uno_jll`:

```julia
julia> using JuMP, AmplNLWriter, Uno_jll
julia> options = String["preset=filtersqp", "QP_solver=BQPD"];
julia> model = Model(() -> AmplNLWriter.Optimizer(Uno_jll.amplexe, options));
julia> @variable(model, x <= 0.5, start = -2);
julia> @variable(model, y, start = 1);
julia> @objective(model, Min, 100 * (y - x^2)^2 + (1 - x)^2);
julia> @constraint(model, x*y >= 1);
julia> @constraint(model, x + y^2 >= 0);
julia> optimize!(model)
Original model /tmp/jl_gTmcsU/model.nl
2 variables, 2 constraints (0 equality, 2 inequality)
Reformulated model /tmp/jl_gTmcsU/model.nl
2 variables, 2 constraints (0 equality, 2 inequality)

Used overwritten options:
- QP_solver = BQPD
- TR_min_radius = 1e-8
- TR_radius = 10
- constraint_relaxation_strategy = feasibility_restoration
- filter_type = standard
- globalization_mechanism = TR
- globalization_strategy = fletcher_filter_method
- hessian_model = exact
- inequality_handling_method = inequality_constrained
- l1_constraint_violation_coefficient = 1.
- loose_tolerance = 1e-6
- progress_norm = L1
- protect_actual_reduction_against_roundoff = no
- regularization_strategy = none
- residual_norm = L2
- switch_to_optimality_requires_linearized_feasibility = yes
- tolerance = 1e-6

─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 iter TR iter TR radius phase step norm objective primal feas stationarity complementarity status          
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 0 - 1.0000e+01 OPT - 9.0900e+02 4.0000e+00 2.4797e+03 0.0000e+00 initial point   
 1 1 1.0000e+01 OPT 2.0000e+00 2.6000e+01 1.0000e+00 5.5713e+03 2.8887e+03 ✔ (h-type)      
 2 1 1.0000e+01 OPT - - - - - infeasible subproblem
 2 1 1.0000e+01 FEAS 7.5000e-01 2.5250e+01 1.1250e+00 - - ✘ (restoration) 
 - 2 3.7500e-01 FEAS 3.7500e-01 4.1504e-01 9.5312e-01 3.9528e-01 0.0000e+00 ✔ (restoration) 
 3 1 7.5000e-01 FEAS 7.5000e-01 3.9312e+01 5.6250e-01 5.0000e-01 0.0000e+00 ✔ (restoration) 
 4 1 1.5000e+00 FEAS 1.1250e+00 3.0650e+02 0.0000e+00 1.6654e+04 1.4508e+04 ✔ (restoration) 
 5 1 1.5000e+00 OPT 0.0000e+00 3.0650e+02 0.0000e+00 0.0000e+00 0.0000e+00 0 primal step   
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 iter TR iter TR radius phase step norm objective primal feas stationarity complementarity status          
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Uno 2.0.0 (TR Fletcher-filter restoration inequality-constrained method with exact Hessian and no regularization)
Mon Jul 7 15:13:07 2025
────────────────────────────────────────
Optimization status: Success
Iterate status: Feasible KKT point
Objective value: 306.5
Primal feasibility: 0
┌ Stationarity residual: 0
└ Complementarity residual: 0
┌ Feasibility stationarity residual:	0
└ Feasibility complementarity residual:	0
┌ Infeasibility measure: 0
│ Objective measure: 306.5
└ Auxiliary measure: 0
CPU time: 0.015675s
Iterations: 5
Objective evaluations: 3
Constraints evaluations: 7
Objective gradient evaluations: 6
Jacobian evaluations: 6
Hessian evaluations: 6
Number of subproblems solved: 7

```

cc @cgeoga

A comprehensive description of the changes from v1.3.0 can be found [here](https://github.com/cvanaret/Uno/releases/tag/v2.0.0).

I’m actively working on the following features:

- L-BFGS Hessian approximation;
- SLP-EQP method;
- a barrier method that better exploits the structure of the original problem;
- an exponential barrier method, an alternative to IPOPT’s log barrier method;
- Python bindings.

If you’re attending the ICCOPT 2025 conference in two weeks, don’t miss [our session on Recent advances in open-source continuous solvers](https://iccopt2025usc.sched.com/event/1dqmu/parallel-sessions-4v-recent-advances-in-open-source-continuous-solvers) with talks about the HiGHS, acados and Uno solvers.

---

_[View the full topic](https://discourse.julialang.org/t/the-uno-unifying-nonlinear-optimization-solver/115883)._
