mod bfgs;
mod gauss_newton;
mod jacobian;
mod levenberg_marquardt;
pub(crate) mod line_search;
mod root;
#[cfg(test)]
mod tests;
pub use bfgs::{minimize_bfgs, BfgsSettings};
pub use gauss_newton::{least_squares_gn, GaussNewtonSettings};
pub use jacobian::{finite_difference_gradient, finite_difference_jacobian};
pub use levenberg_marquardt::{least_squares_lm, LmSettings};
pub use root::{brent, newton_1d, RootSettings};
use crate::matrix::vector::Vector;
use crate::traits::FloatScalar;
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum OptimError {
MaxIterations,
BracketInvalid,
Singular,
NotFinite,
LineSearchFailed,
}
impl core::fmt::Display for OptimError {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
OptimError::MaxIterations => write!(f, "maximum iterations exceeded"),
OptimError::BracketInvalid => write!(f, "bracket endpoints must have opposite signs"),
OptimError::Singular => write!(f, "singular or near-singular matrix"),
OptimError::NotFinite => write!(f, "computed value is NaN or infinity"),
OptimError::LineSearchFailed => write!(f, "line search failed"),
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct RootResult<T> {
pub x: T,
pub fx: T,
pub iterations: usize,
pub evals: usize,
}
#[derive(Debug, Clone, Copy)]
pub struct MinimizeResult<T: FloatScalar, const N: usize> {
pub x: Vector<T, N>,
pub fx: T,
pub grad_norm: T,
pub iterations: usize,
pub f_evals: usize,
pub grad_evals: usize,
}
#[derive(Debug, Clone, Copy)]
pub struct LeastSquaresResult<T: FloatScalar, const N: usize> {
pub x: Vector<T, N>,
pub cost: T,
pub grad_norm: T,
pub iterations: usize,
pub r_evals: usize,
pub j_evals: usize,
}