Uno v2.9.0 implements substantial improvements to the barrier method.
As of Sept 9, 2026, Uno can solve 45/47 instances on the Mittelmann benchmark, in about the same time as IPOPT.
Features
- Second-order corrections implemented for line-search interior-point methods (#812, #864, #876, #904)
- Computation of least-square multipliers for equality-constrained problems (#833, #852, #856)
- Use a filter method for globalizing the restoration phase (#903)
- Function scaling (#866)
- Update to HiGHS v1.15.1 and MUMPS v5.9.1 (#869, #881, #892)
Improvements
- Optimized settings for linear solvers
- Flush calls to write the logger info to the disk immediately (#824)
- Replaced raw pointers with views for KKT blocks (#831)
- Reset Wächter's filter after 5 successive filter rejections (#835)
- Upon
BacktrackingLineSearch::is_tiny_direction(), skip backtracking and accept (#839) - Improved timer (#847)
- Use previous Hessian if its evaluation fails (#857, #862)
- Create the Jacobian sparsity once in the models, and copy them in the subproblem solvers (#865)
- Print the versions of the subproblem solvers (#845)
- Detect diverging iterates (added status
DIVERGING_ITERATE) (#874) - Slight relaxation of bounds if variables too close to bounds in IPM (#883)
- Allow the user to set the model name (#894)
- Improved printing of methods and stat table (#905)
- Improved preallocation of vectors (#907)
- Cache optimized computation of predicted reductions (#909)
- Minimum step length for the backtracking line search (#910)
- Tie trial evaluations reset to assembly of trial iterate (#912)
Bug fixes
- Resize bound duals in
Iterate::set_number_variables(#825) - Check parameterization on current inequality handling method in
FeasibilityRestoration(#832) - Fixed
statistics.print_current_line()inBacktrackingLineSearch(#836) - Set
OptimizationProblem::dual_regularization_factorto 1 (#837) - Properly handle the evaluation cache during SOCs (#838)
- Apply dual regularization in the loop, not just once at the beginning (#841, #855)
- Set the logger before AMPL model creation (#848)
- Refresh the parameterization with the new barrier parameter in
InteriorPointMethod::initialize_feasibility_problem(#859) - Attach progress measures and predicted reductions to
OptimizationProblemand subclasses (#860) - Reset the trial evaluations when the line search fails (#861)
- Dual inertia correction should be applied to all constraints (#872)
- Fixed complementarity error for one-sided constraints (#875)
- Detect unboundedness only when primal feasibility is achieved (#873)
- Fixed quasi-Newton update guards (#880)
- When accepting tiny steps, make sure the constraints and Jacobian can be evaluated (#884)
- big one: Forgot to scale step length with fraction-to-boundary step length when calling
this->constraint_relaxation_strategy->is_iterate_acceptable(#886, #890) - Fixed
Subproblem::assemble_augmented_rhs(#888) - Fixed switch back to optimality phase (#898)
- When exiting restoration, reset the constraint multipliers to 0 (#900)
- Several IPM bug fixes (#902, #911)
- Relax linear constraints as well in
l1RelaxedProblem(#906)
CI
- Taylor Julia tests to problem nature (bound-constrained, equality-constrained, inequality-constrained, LP, NLP) (#764)
- Use a shared cache for all the Julia CI jobs (#827)
- Added bfpc instance to Julia tests (#843)
- Parameterized Julia equality-constrained tests with linear solver (#820)
- Self-hosted runners at ZIB (#844, #849, #868, #870)
- Run all tests with equality constrained problems with HSL solvers (#846)
- Ensure that the new options are always documented (#867)
- Test unopy + CoinHSL via dynamic loading (#871)
- Parameterized tests for the linear solvers (#878)
- Compile Uno with SPRAL (#588, #892)
- Workflow for Mittelmann benchmark (#893, #897, #896)
- Test the ipopt preset on infeasible instances (#899)
- Run the MOI tests with various presets (#822)
Refactoring
- Moved
Directionto subproblem solver (#823) - Moved
SubproblemandSubproblemSolvertoInequalityHandlingMethod(#828) - Split
Filter::acceptable_wrt_infeasibility_upper_boundandFilter::filter_acceptable(#834) - Use more views (#882, #885, #887)
- Moved switch to feasibility problem to globalization mechanism (#891)