pub enum SqpStatus {
Optimal,
MaxIter,
InfeasibleSubproblem,
LineSearchFailed,
QpStepFailed,
QpIterationLimit,
Unbounded,
}Variants§
Optimal
KKT residuals all below their tolerances.
MaxIter
max_iter reached without convergence.
InfeasibleSubproblem
QP subproblem returned an Infeasible status (elastic
mode certified the QP infeasible).
LineSearchFailed
Line search failed to find an acceptable step (Phase 5b commit 5+; not produced by the c3 always-full-step loop).
QpStepFailed
The QP subproblem solver neither produced a usable step nor
certified infeasibility — it hit its own iteration limit or a
numerical breakdown (e.g. the extreme m/n ≫ 1 degenerate phase-1
of #282). This is an HONEST non-committal failure: the SQP could
not compute a search direction, but — unlike InfeasibleSubproblem
— it makes no infeasibility claim it cannot back with a
certificate. Maps to Search_Direction_Becomes_Too_Small.
QpIterationLimit
The QP subproblem exhausted its own iteration budget
([QpOptions::max_iter], the sqp_qp_max_iter option) without
converging or certifying anything.
Split out from QpStepFailed because the two
call for opposite remedies and the merged status actively misled.
A budget exhaustion is actionable — raise the limit — whereas
Search_Direction_Becomes_Too_Small reads as a numerical stall with
nothing to turn. On the Maros-Mészáros set the merged mapping hid the
single largest failure class: the cold-start active-set method needs
roughly one iteration per active-set change, so the flat default of
200 is below what a few hundred constraints require, and dozens of
problems reported a step-size failure when they had simply run out of
budget. DUALC1 (n=9, m=215) is the type case — it exits here at the
default and solves exactly, in one outer iteration, at a larger limit.
Maps to Maximum_Iterations_Exceeded.
Unbounded
The problem is unbounded below: the step QP returned a certified
recession ray (zero curvature, feasible for every step length,
strict descent) and that ray was re-verified against the true
NLP — feasible points along it drive f toward −∞ at (at
least) half the linear rate out to 1e12·‖d‖. Maps to
Diverging_Iterates, POUNCE’s (Ipopt’s) unboundedness verdict,
the same status the IPM paths report on an unbounded model
(gh #388). An unverified unbounded step QP is a statement about
the local model only and falls back to
QpStepFailed.
Trait Implementations§
impl Copy for SqpStatus
impl Eq for SqpStatus
impl StructuralPartialEq for SqpStatus
Auto Trait Implementations§
impl Freeze for SqpStatus
impl RefUnwindSafe for SqpStatus
impl Send for SqpStatus
impl Sync for SqpStatus
impl Unpin for SqpStatus
impl UnsafeUnpin for SqpStatus
impl UnwindSafe for SqpStatus
Blanket Implementations§
impl<T> Boilerplate for T
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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