1use std::fmt;
2
3#[derive(Debug, Clone)]
5pub struct OptimResult<F> {
6 pub x: Vec<F>,
8 pub value: F,
10 pub gradient: Vec<F>,
12 pub gradient_norm: F,
14 pub iterations: usize,
16 pub func_evals: usize,
18 pub termination: TerminationReason,
20}
21
22#[derive(Debug, Clone, Copy, PartialEq, Eq)]
24pub enum TerminationReason {
25 GradientNorm,
27 StepSize,
29 FunctionChange,
31 MaxIterations,
33 LineSearchFailed,
35 NumericalError,
37}
38
39impl fmt::Display for TerminationReason {
40 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
41 match self {
42 TerminationReason::GradientNorm => write!(f, "gradient norm below tolerance"),
43 TerminationReason::StepSize => write!(f, "step size below tolerance"),
44 TerminationReason::FunctionChange => write!(f, "function change below tolerance"),
45 TerminationReason::MaxIterations => write!(f, "maximum iterations reached"),
46 TerminationReason::LineSearchFailed => write!(f, "line search failed"),
47 TerminationReason::NumericalError => write!(f, "numerical error"),
48 }
49 }
50}