pub struct ActivityReport {Show 13 fields
pub mu: Number,
pub var_status: Vec<i8>,
pub var_ratio: Vec<Number>,
pub var_q_sign: Vec<i8>,
pub var_off_central_path: Vec<bool>,
pub var_contaminated: Vec<bool>,
pub var_sigma: Vec<Number>,
pub row_status: Vec<i8>,
pub row_ratio: Vec<Number>,
pub row_q_sign: Vec<i8>,
pub row_off_central_path: Vec<bool>,
pub row_contaminated: Vec<bool>,
pub row_sigma: Vec<Number>,
}Expand description
Per-variable and per-row classification of a converged solve.
All vectors are user-space: var_* have length n_full_x (the
user TNLP’s n) and row_* length n_full_g (the user’s m).
Entries with no finite bound hold UNBOUNDED; FIXED
variables and EQUALITY rows are placeholders for entries the
barrier never classified. All three carry NaN ratios.
Fields§
§mu: NumberBarrier parameter of the converged iterate.
var_status: Vec<i8>Status per user variable (codes above).
AMBIGUOUS here includes genuine kinks whose coordinate is
coupled to a neighbour: q is the Hessian diagonal, not the
reduced curvature that generates the multiplier, so the ratio
is reduced/diagonal (gh#763). Do not read the class as an
answer to “is this bound at a kink” — [reduced_activity]
answers that, one back-solve per coordinate.
var_ratio: Vec<Number>Σ_i / q_i per user variable; NaN where not classified.
For an UNIDENTIFIED entry the value is Σ/floor, a lower
bound on any honest ratio rather than the ratio itself, since
q is below the identification floor there.
q is |H_ii|, so at a kink this ratio is
reduced/diagonal — 1 only where the coordinate is
decoupled, and μ-independent, so a tighter solve does not
move it. See Self::var_status.
var_q_sign: Vec<i8>Sign of the signed curvature H_ii (−1, 0, +1); the absolute
value goes into q, so an indefinite direction is reported
rather than hidden.
var_off_central_path: Vec<bool>s·z differs from μ by more than a factor of ten on some
side: off the central path, or the bound was relaxed.
var_contaminated: Vec<bool>Classified inactive yet r non-negligible: barrier curvature
where none should be.
var_sigma: Vec<Number>The barrier diagonal Σ_i = z/s itself per user variable, both
sides summed; 0 where not classified. In natural (unscaled)
units, the repo’s sensitivity-output contract: classification
runs on the solver’s scaled quantities (the ratio is
scale-invariant), the report does not. The covariance roadmap’s
item 1 subtracts exactly this from the factor’s natural-units
reduced Hessian.
row_status: Vec<i8>Status per user constraint row.
AMBIGUOUS here includes genuine kinks whose direction is
coupled to the remaining free space: q is the curvature
along the row’s own gradient, not the reduced curvature that
generates the multiplier, so the ratio is
reduced/directional (gh#804). Do not read the class as an
answer to “is this row at a kink” — [reduced_row_activity]
answers that, one back-solve per row.
row_ratio: Vec<Number>Σ_j / q_j per user row; NaN where not classified.
UNIDENTIFIED entries hold Σ/floor as for variables.
q is the directional curvature |∇dᵀH∇d|/‖∇d‖², so at a
kink this ratio is reduced/directional — 1 only where the
row’s direction is decoupled, and μ-independent, so a
tighter solve does not move it. See Self::row_status.
row_q_sign: Vec<i8>Sign of the signed row curvature ∇dⱼᵀ H ∇dⱼ.
row_off_central_path: Vec<bool>Central-path check per row, as for variables.
row_contaminated: Vec<bool>Contamination check per row, as for variables.
row_sigma: Vec<Number>The row barrier diagonal Σ_j = v/s per user row, both sides
summed; 0 where not classified. In natural (unscaled) units
like Self::var_sigma, and RAW rather than the geometric
weight the classification uses: item 1 restricts the normal to
its own fitted block and applies its own ‖a‖² factor there.
Auto Trait Implementations§
impl Freeze for ActivityReport
impl RefUnwindSafe for ActivityReport
impl Send for ActivityReport
impl Sync for ActivityReport
impl Unpin for ActivityReport
impl UnsafeUnpin for ActivityReport
impl UnwindSafe for ActivityReport
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<T, U> Imply<T> for U
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more