v0.2.0 — first tagged release
[0.2.0] — 2026-05-25
First tagged release. The 0.1.0 work-in-progress version was never
tagged; everything below summarizes the state of main as of this
release.
Solver core
- Full Ipopt-parity C ABI:
CreateIpoptProblem,IpoptSolve,
AddIpoptStrOption/AddIpoptNumOption/AddIpoptIntOption,
OpenIpoptOutputFile,SetIpoptProblemScaling,
SetIntermediateCallback,GetIpoptCurrentIterate,
GetIpoptCurrentViolations, plus a newIpoptSolversession
handle (IpoptSolverSolve,IpoptSolverResolve,
IpoptSolverKktSolve,IpoptSolverParametricStep). - Restoration phase wired through
IpoptSolvewith the soft
restoration line search; nested IPM honors the parent's
print_iter_outputgate. - Rapid infeasibility detection in the main loop; convergence
statuses certified against upstream Ipopt. - Option-parity (tier-A waves 1-4): convergence options
(tol,acceptable_tol, etc.), mu/watchdog/output toggles,
iteration-output flags, warm-start machinery,
fixed_variable_treatment,nlp_*_bound_inf,
barrier_tol_factor,sigma_min/sigma_maxfor the adaptive
quality-function oracle. - Sensitivity (sIPOPT): Phase D landed — convenience API,
eigendecomposition, fixed-variable lifting, boundcheck. New
Solversession API on top: value-typedFactorizationhandle
inpounce-linsolenables factor-once / solve-many;Solver
exposeskkt_solve,parametric_step, and
compute_reduced_hessianwithout callback shapes. - Presolve crate (
pounce-presolve) as an opt-in TNLP wrapper.
Backends and bindings
- Python (
pounce-solver): PyO3 bindings with a cyipopt-style
Problemclass and a scipy-styleminimize()facade. The wheel
bundles thepounceCLI executable. - Python session API (
pounce.Solver): pyclass that wraps the
RustSolver, enabling warm-start sequences (MPC / parametric /
B&B) and many-RHS sensitivity workflows without the
callback-based shape. - pyomo-pounce (
pyomo-pounce): Pyomo SolverFactory plugin
that drives thepounceCLI on the user's PATH. - GAMS link: native solver link (
libGamsPounce) for GAMS;
Jacobian eval skips dense memsets and pure-linear rows. - CLI: bundled
pouncebinary writes AMPL.solsolution
output; new--aboutprints version / build / features / paths;
--dumpwrites per-iteration KKT artefacts; the sIPOPT
sensitivity step is folded in.
Linear-solver layer
- Public
Factorizationinpounce-linsol: factor once,
back-solve many RHS, refactor with new values reusing the
symbolic factor / AMD ordering. - MA57 backend (
pounce-hsl) honors thelinear_solver
option default ("ma57"). - Feral backend: cascade-break and FMA default off (opt-in via
env); near-singular factorizations are flagged via an absolute
pivot floor; explicit-zero stripping before KKT factor; skips
refactor on same-matrix back-solve.
Numerical robustness
- TNLP
eval_*user-callback failures surface as NaN instead of
panicking. - Round-off-tolerant
Compare_lein the Armijo line-search test. - Unconstrained problems routed through the IPM (no degenerate
paths). push_x_into_interiorusesdim()(notvalues().len()),
fixing a subtle off-by-one on partially-filled vectors.OrigIpoptNlp::eval_halways uses theh_entry_in_full
mapping; closes the panic when an entire Hessian row sits on a
fixed variable.
Benchmarks
- Composite report (
make benchmark→
benchmarks/BENCHMARK_REPORT.md) covering 9 suites: CUTEst (727
curated; 1542 full sweep), Mittelmann LP/QP, water-network
design, gas-network, electrolyte, grid, CHO, large-scale, and
the GAMS link. - Incremental per-suite targets:
make benchmark-<suite>
skips whenresults.jsonis fresh;make benchmark-<suite>-rerun
forces a rebuild. - MA57 baseline integrated into the composite report.
Studio & tooling
- studio/mcp MCP server (
pounce-studio-mcp) with
analyze,run,explain,citationstools and an embedded
glossary; backed bypounce-studio-corevia PyO3. - Linear-solver post-mortem aggregated end-to-end and
surfaced through the studio.
Infrastructure
- CI workflow with format / clippy / build / test, plus
wheel-smoke forpounce-solverandpyomo-pounce. - mdbook documentation built and deployed to GitHub Pages via the
newdocs.ymlworkflow. - Zenodo metadata (
.zenodo.json) andCITATION.cfffor
archival on every GitHub Release.