v0.8.1 — kernel alignment + new phases + honest counts
Patch release continuing the v0.8 Ipopt-3.14-alignment track. v0.8.1 adds two new solver phases (TRON for bound-constrained NLPs, and a Thierry-Biegler ℓ₁-exact penalty-barrier fallback), replaces the dense lower-triangle L-BFGS Hessian with a Byrd-Nocedal compact-form representation wrapped in a Sherman-Morrison-Woodbury bordered KKT solver, lands an auxiliary equality preprocessing path, and works through a large cluster of root-cause IPM fixes against the Ipopt 3.14 reference.
Highlights
- TRON solver for bound-constrained NLPs (#22) — direct port of Lin & Moré 1999.
- Thierry-Biegler ℓ₁-exact penalty-barrier phase (#23) — fallback when the main IPM filter stalls.
- Bordered low-rank KKT solver for L-BFGS (#30) — Byrd-Nocedal compact form
B_k = δI + UV^Tvia SMW on the augmented system; drops O(n²) dense Hessian storage. - Auxiliary equality preprocessing (PR #32, @bernalde) — Dulmage-Mendelsohn partitioning + block-triangular decomposition solves square equality subsystems outside the IPM.
- IPM kernel alignment cluster — QF μ-oracle (σ floor, endpoint re-eval, explicit centering,
n_augfor L-BFGS,eff_mu_floorpolarity, Fixed-mode floor removed from Free-mode), adaptive μ globalization, watchdog and μ_max capture, LS multiplier estimate (sign, inertia, skip-criterion), soft-restoration and Fixed-mode μ-gateE_μ(inequality-slack term),SYMSOLVER_SINGULARrouting, barrier-update ordering, L-BFGS skip-and-reset,RememberCurrentPointAsAccepted+ Free-to-Fixed rollback. - Opt-in IFRd curvature test (#17) — Chiang & Zavala 2016.
max_cpu_timewall-clock exit distinct from iteration cap (#36).- Build/CUTEst toolchain bootstraps on fresh clones; Linux/Fedora link-search and Fortran symbol fixes.
Benchmark — CUTEst (727 problems)
All counts use strict Optimal status only; per the project's "Honesty in Benchmarks" rule (CLAUDE.md), Acceptable is reported separately and never folded into the pass rate.
| Metric | ripopt | Ipopt |
|---|---|---|
| Optimal (strict) | 551/727 (75.8%) | 556/727 (76.5%) |
| Solved exclusively | 22 | 27 |
| Both Optimal | 529 | |
| Matching objectives (< 0.01%) | 514/529 (97.2%) |
Speed on the 529 commonly-Optimal problems: geomean 7.9×, median 10.6×; ripopt faster on 476/529 (90%), 10×+ faster on 286 (54%).
Honesty pass
The v0.8.1 strict-Optimal recount changed the headline from v0.8.0's "ripopt edges Ipopt by three" to v0.8.1's "Ipopt edges ripopt by five." This is the honest signal that v0.8.0's lead was partly an artifact of folding Acceptable into the count. The 22 ripopt-only wins and 27 Ipopt-only losses are both real under strict counting.
The recount also retired the v0.7-era Automatic NE-to-LS reformulation architectural claim from the manuscript. The reformulation was removed in task T2.13 earlier in the v0.8 cycle; the 22 ripopt-only CUTEst wins survived its removal via the implicit-slack KKT formulation, which accepts NE systems Ipopt's CUTEst wrapper rejects with IpoptStatus(-10) (12 of the 22 wins: BEALENE, BIGGS6NE, BOX3NE, DEVGLA1NE, DEVGLA2NE, ENGVAL2NE, EXP2NE, LANCZOS1, LEVYMONE5, NYSTROM5, NYSTROM5C, GROUPING).
Workspace bumps
| Crate | From | To |
|---|---|---|
| ripopt | 0.8.0 | 0.8.1 |
| ripopt-py | 0.8.0 | 0.8.1 |
| pyomo-ripopt | 0.8.0 | 0.8.1 |
| rmumps | 0.1.1 | 0.1.2 |
| feral dep | 0.1 | 0.4 |
| Ripopt.jl | 0.8.0 | (held — no C-ABI changes) |
See CHANGELOG.md for the full list, and Chapter Twelve of narrative-history.org for the cycle narrative.