Skip to main content

Module activity

Module activity 

Source
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§

ActivityReport
Per-variable and per-row classification of a converged solve.

Constants§

AMBIGUOUS
r in 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 q is 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.