v0.4.0 — Mittelmann parity with MA57 + auto-armed cascade-break
Headline
feral is now at parity with MA57 on the 47-problem Mittelmann NLP
benchmark panel (Ipopt 3.14.20 + --linear_solver=feral vs
--linear_solver=ma57, 600 s wall timeout each):
| solver | solve-rate | geomean wall (37 both-solved) | aggregate wall |
|---|---|---|---|
| MA57 | 39/47 | 1.000 | 3166 s |
| feral | 39/47 | 0.960 | 1699 s (54%) |
Two changes closed the gap: an auto-armed cascade-break default
in the C-ABI and a tightened MC64 routing gate. Headline rescues
on Mittelmann: marine_1600 -96%, clnlbeam -87%, robot_1600 -79%,
corkscrw -70%, dtoc2 rescued from timeout.
Highlights
- Auto-armed cascade-break in
feral_new(Ipopt C-ABI). Arms
Solver::with_auto_cascade_break(0.05)by default, disable with
FERAL_AUTO_CB_BETA=0. (#37, #38) - Scaling routing tightened.
ScalingStrategy::Autonow requires
a dense-arrow head (max_col_nnz > 32) in addition to the
diag-only mass threshold, fixing a 1-D-PDE-KKT regression. (#68) - MA57-style static-pivot perturbation knob + non-finite input
validation + closed-form 2x2 eigenvalue inertia classifier +
stale-MC64-cache invalidation. (#38) mittelmann_ipoptbenchmark harness — runs Ipopt+feral and
Ipopt+MA57 over the 47-problem NLP panel and produces a side-by-
side report.- Python bindings (
feral-solveron PyPI) now at 0.4.0 with
full IPM helper (feral.ipm.KktSolver), scipy.sparse adapters,
and JAX interop. - Ipopt integration documented end-to-end in the README, with the
feral-ipopt-shimsubproject providing one-shot
make ipopt && make hs071.
See CHANGELOG.md
for the full per-PR release notes (auto-CB, scaling routing,
diagnostic tracers, env-knob reference, parity panel notes,
oracle-consensus correctness gate, and v0.4.0 housekeeping).
Install
pip install feral-solver # Python wheels (CPython 3.10+)
cargo add feral # Rust crateCompiling FERAL into Ipopt
See the "Using FERAL inside Ipopt" section of the README — one-shot
recipe is cd feral-ipopt-shim && make ipopt && make hs071.