Expand description
Post-solve activity classification (the covariance/information roadmap’s item 0, gh #362).
Classifies every bounded variable and every finite-bounded inequality row of a converged barrier solve into one of five statuses, keyed on the ratio of barrier curvature to the model’s own curvature:
r = Σ / q, Σ = z/s summed over the sides that exist,
q = |H_ii| (variable)
|∇dⱼᵀ H ∇dⱼ| / ‖∇dⱼ‖⁴ (inequality row)The row denominator carries the fourth power so that r is
invariant to rescaling the row: d → c·d sends Σ → Σ/c² while
the curvature along the unit normal is unchanged, and ‖∇d‖⁴
restores the balance. Equivalently, the geometric barrier weight
Σ‖∇d‖² (distance to the surface is d/‖∇d‖, its conjugate
multiplier v‖∇d‖) is measured against the curvature along the
unit normal. Variable bounds are invariant as written. This also
absorbs the solver’s own per-row d_scale.
H is the exact Lagrangian Hessian, so constraint curvature
contributes to q alongside the objective’s. For variables, q
reads the Hessian DIAGONAL only, so purely off-diagonal coupling is
invisible to it: f = x₁x₂ with bounds on both variables reports
unidentified on every bound even though the bound directions have
well-defined curvature. Items 1-4 of the covariance roadmap inherit
these semantics where they consume the per-coordinate statuses;
their reduced-block classification is where coupling becomes
visible, folded into the reduced diagonal by elimination.
r is O(μ) when the bound is inactive, O(1) when weakly active
(slack and multiplier vanish together), and O(1/μ) when strongly
active, so one ratio separates the regimes at any μ where a fixed
threshold on the slack or the multiplier alone cannot: both are
O(√μ) at weak activity, so any constant tracks the solve rather
than the geometry.
Everything read here is retained by the converged state the
backsolver already holds: the bound multipliers on the iterate, the
solver’s own slacks, Σ as curr_sigma_x / curr_sigma_s, the
barrier parameter, and the exact Lagrangian Hessian, so H is
never recovered from the barrier-augmented factor.
The report is indexed in user space: var_* arrays have the
user TNLP’s full variable count and row_* arrays its full
constraint count. A variable removed internally by
fixed_variable_treatment = make_parameter (lb == ub, the
default) reports FIXED at its own user index, and an equality
constraint reports EQUALITY, so user indices never shift.
Structs§
- Activity
Report - Per-variable and per-row classification of a converged solve.
Constants§
- AMBIGUOUS
rin a gap between the band and aμ-edge: undetermined at thisμ; re-solving tighter separates it.- EQUALITY
- An equality constraint: always active by construction, with no slack or multiplier pair on the barrier, so outside this classification.
- FIXED
lb == ub: the variable was removed from the solve as a parameter (fixed_variable_treatment = make_parameter), so there is no barrier geometry to classify.- INACTIVE
r = O(μ): the bound is not doing anything.- STRONGLY_
ACTIVE r = O(1/μ): the bound holds the variable; projected out.- UNBOUNDED
- No finite bound on this variable or row: nothing to classify.
- UNIDENTIFIED
- The curvature
qis below noise scale: the bound question does not arise, and the direction is poorly identified. - WEAKLY_
ACTIVE r = O(1): slack and multiplier vanish together; kept, flagged.