Skip to main content

certify

Function certify 

Source
pub fn certify(inp: &CertificateInput<'_>) -> Certificate
Expand 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 to tol pins each side only to its square root); rows and bounds within sqrt(solver_tol).
  • Residual: judged against max(1e-6, solver_tol) times the dual scale — the largest entry of ∇f and 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 only sqrt(tol)-accurate, so smaller signs are noise, not descent. This is the one place this departs from stationarity.py, whose BVLS has no band; on the points it was run on (exact or tol=1e-8 answers 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.