Skip to content

v0.8.1 — kernel alignment + new phases + honest counts

Choose a tag to compare

@jkitchin jkitchin released this 18 May 22:58
· 2 commits to main since this release

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^T via 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_aug for L-BFGS, eff_mu_floor polarity, 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 μ-gate E_μ (inequality-slack term), SYMSOLVER_SINGULAR routing, barrier-update ordering, L-BFGS skip-and-reset, RememberCurrentPointAsAccepted + Free-to-Fixed rollback.
  • Opt-in IFRd curvature test (#17) — Chiang & Zavala 2016.
  • max_cpu_time wall-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.