pub struct StatisticsInfo {Show 27 fields
pub iteration_count: i32,
pub final_objective: f64,
pub final_scaled_objective: f64,
pub final_dual_inf: f64,
pub final_constr_viol: f64,
pub final_declared_constr_viol: f64,
pub final_declared_box_viol: f64,
pub final_compl: f64,
pub final_kkt_error: f64,
pub final_kkt_error_above_noise: f64,
pub num_obj_evals: i32,
pub num_constr_evals: i32,
pub num_obj_grad_evals: i32,
pub num_constr_jac_evals: i32,
pub num_hess_evals: i32,
pub total_wallclock_time_secs: f64,
pub restoration_calls: i32,
pub restoration_inner_iters: i32,
pub restoration_outer_iters: i32,
pub restoration_wall_secs: f64,
pub quality_escalations: i32,
pub dual_divergence_signature: bool,
pub dual_divergence_retry_promoted: bool,
pub warnings: Vec<String>,
pub derivative_check: Option<DerivativeCheckInfo>,
pub objective_scaling: Option<ObjectiveScalingInfo>,
pub passes: Vec<SolvePassRecord>,
}Expand description
Subset of SolveStatistics projected for the report. Mirrors the
fields the existing console summary prints.
Fields§
§iteration_count: i32§final_objective: f64§final_scaled_objective: f64§final_dual_inf: f64§final_constr_viol: f64§final_declared_constr_viol: f64Primal violation against the model as declared, before the convex
arm’s bound_relax_factor widening (qp_extract::BoundRelax, gh
#744/#745).
final_constr_viol measures the model the solver was HANDED, whose
inequality rows and variable box are widened by min(factor,cap)·|b|.
That is the model its convergence test is about and every acceptance
gate reads — and it is not how far the returned point sits outside the
model the caller wrote. On netlib afiro the point is 4.99e-06
outside a declared row b = 500 (exactly 1e-8·500) while
final_constr_viol reads 8.68e-13; 25fv47 reports 2.19e-11
against 1.97e-05.
Reported on every solve of the NLP and convex arms, widened or not
(gh#987: it is no longer NaN as a “no widening” signal); under
l1_exact_penalty_barrier it is the caller’s own rows, not the
wrapper’s augmented ones. NaN only on a path that does not compute
it. Additive to pounce.solve-report/v1: readers predating it are
unaffected.
final_declared_box_viol: f64How far the returned point sits outside the declared variable box —
the box the caller wrote, before the bound_relax_factor widening.
Ipopt’s Variable bound violation, and the box half of
final_declared_constr_viol reported on its own: maxed together, a box
violation and a row violation cannot be told apart.
Variable bounds carry no scaling, so there is one number rather than a
scaled/unscaled pair. NaN on a path that does not compute it.
Additive to pounce.solve-report/v1: readers predating it are
unaffected.
final_compl: f64§final_kkt_error: f64§final_kkt_error_above_noise: f64The aggregate the strict convergence gate tested (gh #528): as
final_kkt_error, but counting each constraint row’s residual only
where it exceeds what that row can represent in floating point. Equal
to final_kkt_error unless a row is at its own resolution limit.
num_obj_evals: i32§num_constr_evals: i32§num_obj_grad_evals: i32§num_constr_jac_evals: i32§num_hess_evals: i32§total_wallclock_time_secs: f64§restoration_calls: i32§restoration_inner_iters: i32§restoration_outer_iters: i32§restoration_wall_secs: f64§quality_escalations: i32Successful linear-solver quality escalations over the whole solve,
restoration sub-solves included (gh#857). 0 on paths that never
escalate. serde(default) so a report written before this field
existed still deserializes — it reads as “no escalations”, which
is wrong-but-harmless for an old file and correct for every new
one.
dual_divergence_signature: boolThe solve saw the gh#884 biactive dual-divergence signature: at one
and the same iterate a converged primal, a scale-relative step at
zero, and an unscaled dual infeasibility far above dual_inf_tol.
Reported whether or not a retry ran or promoted, because the
distinction it draws — the multipliers ran away on a settled
iterate, as against the iterate itself never settling — is not
visible in any other field. serde(default) for the same reason as
quality_escalations.
dual_divergence_retry_promoted: boolA gh#884 dual-divergence retry ran and its answer was returned.
false both when no retry ran and when one ran and lost — in the
latter case every other field here describes the base attempt.
warnings: Vec<String>gh#983. Structured solve-quality warnings about the returned point,
each "<code>: <text>" (objective_scale_small,
unscaled_stationarity_above_tol, large_dual_scale,
unscaled_dual_inf_above_acceptable). Empty on a clean run; never
changes the status. serde(default) so older reports still load.
derivative_check: Option<DerivativeCheckInfo>gh#990 item 3. The derivative checker’s machine-readable verdict;
present only when derivative_test ran for this solve.
objective_scaling: Option<ObjectiveScalingInfo>gh#990 item 13. The objective-scaling decision: the factor gradient-based scaling chose, the gradient scale it measured, and whether a termination certificate was refused because the scaling masked it. Absent when none of that is known (a path that does not scale the objective).
passes: Vec<SolvePassRecord>Per-pass summary of a multi-pass solve (gh#987 item 6): one entry per
ℓ₁ exact-penalty ρ pass, preceded by the unwrapped attempt when the ℓ₁
fallback ran. Omitted on an ordinary single-pass solve. When present,
iteration_count is the total across the passes and iterations
(at full detail) their concatenated rows; first_row in each entry
marks where a pass’s rows start. Additive to pounce.solve-report/v1.
Trait Implementations§
Source§impl Clone for StatisticsInfo
impl Clone for StatisticsInfo
Source§fn clone(&self) -> StatisticsInfo
fn clone(&self) -> StatisticsInfo
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for StatisticsInfo
impl Debug for StatisticsInfo
Source§impl<'de> Deserialize<'de> for StatisticsInfo
impl<'de> Deserialize<'de> for StatisticsInfo
Source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<StatisticsInfo, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<StatisticsInfo, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
Source§impl Serialize for StatisticsInfo
impl Serialize for StatisticsInfo
Source§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
Auto Trait Implementations§
impl Freeze for StatisticsInfo
impl RefUnwindSafe for StatisticsInfo
impl Send for StatisticsInfo
impl Sync for StatisticsInfo
impl Unpin for StatisticsInfo
impl UnsafeUnpin for StatisticsInfo
impl UnwindSafe for StatisticsInfo
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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
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