pub fn certify(inp: &CertificateInput<'_>) -> CertificateExpand description
Which stationarity class x satisfies, as benchmarks/calipso/ stationarity.py decides it — same columns, same thresholds — so the two
can be held to each other on the same points.
The stationarity system is
∇f = Σ λ ∇g + Σ ν ∇G + Σ w ∇H + z_L − z_U with: equality rows free;
active inequality rows and bounds sign-constrained (inactive ones absent);
a pair side free when only it is active, absent when inactive, and on a
biactive pair non-negative under S and free under W.
- Activity: a pair side counts as zero within
sqrt(solver_tol)times the family’s largest magnitude (a product driven totolpins each side only to its square root); rows and bounds withinsqrt(solver_tol). - Residual: judged against
max(1e-6, solver_tol)times the dual scale — the largest entry of∇fand of every usable column. - Signs: a multiplier counts as negative only below
-sqrt(solver_tol)times the dual scale. An answer near a biactive pair is itself onlysqrt(tol)-accurate, so smaller signs are noise, not descent. This is the one place this departs fromstationarity.py, whose BVLS has no band; on the points it was run on (exact ortol=1e-8answers away from biactive pairs) the two agree.
When the columns have full rank the multipliers are unique and the
class is a sign check. When they do not (MPCC-LICQ fails) the class is a
property of the multiplier set — reading one vector can report W for a
point that is S — so the set is searched with NNLS, up to
MAX_SEARCHED_COLUMNS and MAX_DENSE_ENTRIES; a larger set reports
NotSearched. Above DENSE_ENTRIES the unique multipliers come from a
sparse factorization rather than the SVD.