Skip to main content

check_b_stationarity

Function check_b_stationarity 

Source
pub fn check_b_stationarity(inp: &CertificateInput<'_>) -> BCheck
Expand description

Whether x is B-stationary: no direction d feasible for the linearized constraints along any branch of the biactive pairs has ∇f·d < 0.

Each branch is an LP: min ∇f·d over the linearized active rows and bounds, with each pair’s active side held (∇G·d = 0 or ∇H·d = 0) and, on a biactive pair, the side the branch releases kept non-negative, in the box -1 <= d <= 1. d = 0 is always feasible, so every LP has optimum <= 0; the point is B-stationary exactly when all of them are 0. Up to MAX_ENUMERATED_BIACTIVE biactive pairs all 2^b branches are solved (the LPEC by enumeration, no MILP); above it, the relaxed LP — both sides of every biactive pair only non-negative — picks one branch (hold the side its direction moves less), which is solved.

A decrease counts only below -sqrt(solver_tol)·max(1, ‖∇f‖∞), the certificate’s sign band: near a biactive pair the point itself is only sqrt(tol)-accurate. S implies B, so a caller checks only points the certificate did not call S. The point must be feasible and every pair complementary.