pub mod gauss_newton;
pub mod levenberg_marquardt;
pub(crate) mod trust_region;
pub use gauss_newton::GaussNewton;
pub use levenberg_marquardt::LevenbergMarquardt;
use crate::scalar::Numeric;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum TerminationReason {
Ftol,
Xtol,
Gtol,
}
#[derive(Debug, Clone, Copy)]
#[must_use]
pub struct MinimizationReport<const N: usize, T = f64> {
pub solution: [T; N],
pub objective_function: T,
pub evaluations: usize,
pub termination: TerminationReason,
}
pub(crate) fn is_finite<const K: usize, T: Numeric>(v: &[T; K]) -> bool {
v.iter().all(|value| value.is_finite())
}
pub(crate) fn report<const N: usize, T: Numeric>(
solution: [T; N],
residual_norm: T,
evaluations: usize,
termination: TerminationReason,
) -> MinimizationReport<N, T> {
MinimizationReport {
solution,
objective_function: T::HALF * residual_norm * residual_norm,
evaluations,
termination,
}
}
#[cfg(test)]
mod test;