pub struct SolutionInfo {
pub engine: String,
pub status: ApplicationReturnStatus,
pub status_upstream: String,
pub solve_result_num: i32,
pub objective: f64,
pub x: Vec<f64>,
pub lambda: Vec<f64>,
pub suffixes: Vec<SolutionSuffix>,
}Fields§
§engine: StringWhich engine produced this verdict: "cvx-qp", "cvx-qcqp",
"qp-active-set", "sqp-active-set" or "nlp".
"qp-active-set" and "sqp-active-set" are different engines and
not synonyms: the first is pounce_convex::active_set reached by
solver_selection=qp-active-set on an LP or convex QP, the second is
pounce_algorithm::sqp’s outer loop reached by
algorithm=active-set-sqp on a general NLP. Both solve their
subproblems with pounce-qp, which is why the names are close; they
wrap it in different algorithms, which is why they are not the same
string.
The Selected solver: banner names the engine routing chose, which
is not always the one that answered: a convex solve that declines its
own result hands the model to the NLP arm (gh #535), and the banner
has already been printed by then. scripts/sweep-fixtures.sh scraped
that banner because the report carried nothing better, so a reroute
left no trace in the sweep diff — the precise blind spot CLAUDE.md
names when it says a routing regression “used to leave no trace”.
Empty when a path does not set it, which a consumer should read as “unknown” rather than as any particular arm.
status: ApplicationReturnStatusSolveSucceeded, MaximumIterationsExceeded, etc. The string
form is the Rust enum variant name verbatim.
status_upstream: StringThe same verdict in upstream Ipopt’s C enumerator spelling —
Solve_Succeeded, Infeasible_Problem_Detected — from
IpReturnCodes_inc.h.
Self::status carries the Rust variant name, which is not the
name any Ipopt-facing consumer already keys off: CUTEst status
tables, benchmarks/scripts/run_nl_bench.sh, the reference JSONs
under benchmarks/*/ipopt_ma57.json and the CLI’s own Status:
line all spell it with separators. A consumer comparing
solution.status == "Solve_Succeeded" against the report matched
nothing and silently classified every solve as a failure (gh #767).
This field is that spelling, so the comparison can be literal.
Derived from Self::status by ReportBuilder::finish — never
set by a caller, so the two cannot disagree. Empty when read back
from a pre-#767 report.
solve_result_num: i32AMPL-style solve-result code (Gay 2005, §5 p. 23 table).
objective: f64Final unscaled objective value (mirrors
SolveStatistics::final_objective). NaN if unknown.
x: Vec<f64>Final primal vector, length problem.n_variables. Empty if
not captured.
lambda: Vec<f64>Final dual (constraint multiplier) vector, length
problem.n_constraints.
suffixes: Vec<SolutionSuffix>Optional sIPOPT-style suffix blocks (sens_sol_state_1 etc.).
Stored as a flat map keyed by suffix name → list of
(index, value) pairs, matching the AMPL .sol shape.
Empty when no sensitivity / reduced-Hessian step ran.
Trait Implementations§
Source§impl Clone for SolutionInfo
impl Clone for SolutionInfo
Source§fn clone(&self) -> SolutionInfo
fn clone(&self) -> SolutionInfo
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 SolutionInfo
impl Debug for SolutionInfo
Source§impl<'de> Deserialize<'de> for SolutionInfo
impl<'de> Deserialize<'de> for SolutionInfo
Source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<SolutionInfo, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<SolutionInfo, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
Source§impl Serialize for SolutionInfo
impl Serialize for SolutionInfo
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 SolutionInfo
impl RefUnwindSafe for SolutionInfo
impl Send for SolutionInfo
impl Sync for SolutionInfo
impl Unpin for SolutionInfo
impl UnsafeUnpin for SolutionInfo
impl UnwindSafe for SolutionInfo
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