use std::fmt;
#[derive(Debug, Clone)]
pub struct OptimResult<F> {
pub x: Vec<F>,
pub value: F,
pub gradient: Vec<F>,
pub gradient_norm: F,
pub iterations: usize,
pub func_evals: usize,
pub termination: TerminationReason,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TerminationReason {
GradientNorm,
StepSize,
FunctionChange,
MaxIterations,
LineSearchFailed,
NumericalError,
}
impl fmt::Display for TerminationReason {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
TerminationReason::GradientNorm => write!(f, "gradient norm below tolerance"),
TerminationReason::StepSize => write!(f, "step size below tolerance"),
TerminationReason::FunctionChange => write!(f, "function change below tolerance"),
TerminationReason::MaxIterations => write!(f, "maximum iterations reached"),
TerminationReason::LineSearchFailed => write!(f, "line search failed"),
TerminationReason::NumericalError => write!(f, "numerical error"),
}
}
}