pounce-sensitivity 0.12.0

Sensitivity analysis / parametric NLP warm-start / reduced Hessian for POUNCE — port of upstream Ipopt's sIPOPT contrib (Pirnay, López-Negrete, Biegler 2012).
Documentation

pounce-sensitivity

Sensitivity analysis, parametric NLP warm-start, and reduced-Hessian computation for POUNCE. Port of upstream Ipopt's contrib/sIPOPT/.

Status

Feature-complete for the standard sIPOPT workflow. The post-optimal sensitivity step (SensStepCalc + DenseGenSchurDriver), reduced- Hessian computation, and end-to-end SensApplication are all wired into the CLI: an AMPL .nl file declaring sens_state_* / sens_init_constr suffixes triggers auto-detection — no separate binary needed. Matches upstream sIPOPT's golden output to ~6e-9/component on the parametric_cpp fixture (see pounce-cli/tests/pounce_sens_end_to_end.rs). See the CLI README for usage.

Algorithmic reference

Pirnay, H., López-Negrete, R., and Biegler, L.T. (2012). Optimal sensitivity based on IPOPT. Mathematical Programming Computation, 4(4), 307–331. DOI: 10.1007/s12532-012-0043-2.

DOI verification (Crossref, 2026-05-14): resolves to Springer; title, authors, volume/issue/pages all confirmed.

Upstream source

The port follows the upstream sIPOPT contrib at ref/Ipopt/contrib/sIPOPT/src/ in this repo (EPL-2.0, © Hans Pirnay 2009–2011 per the headers).

Every public item in this crate documents the upstream symbol it mirrors, with line numbers when they're stable.

Relationship to pounce-sens-core

The engine-agnostic half of the port lives in pounce-sens-core: the SensBacksolver contract, the fix-relax / path / directional machinery in boundcheck, and the Schur-complement stack. This crate is the NLP filter-IPM implementation of that contract — PdSensBacksolver, the Solver session, the sIPOPT option surface, the corrector, and activity classification, all of which read the filter-IPM's own iterate and do not generalize.

The split exists so pounce-convex can reach the same parametric machinery without depending on the NLP engine. It does not change this crate's API: every module and item that lived here before is re-exported at its original path, so pounce_sensitivity::boundcheck::refine_step_onto_bounds and pounce_sensitivity::SensBacksolver resolve exactly as they did. The upstream-file mapping table for the moved files now lives in that crate's README.

License

EPL-2.0, matching upstream Ipopt and the sIPOPT contrib.