1use core::fmt;
8use numra_core::NumraError;
9
10#[derive(Clone, Debug, PartialEq)]
12pub enum FitError {
13 InsufficientData { need: usize, got: usize },
15 Underdetermined { n_params: usize, n_data: usize },
17 OptimizationFailed(String),
19 LengthMismatch { expected: usize, got: usize },
21 InvalidParameter(String),
23 SingularJacobian,
25}
26
27impl fmt::Display for FitError {
28 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
29 match self {
30 Self::InsufficientData { need, got } => {
31 write!(f, "insufficient data: need at least {need}, got {got}")
32 }
33 Self::Underdetermined { n_params, n_data } => {
34 write!(
35 f,
36 "underdetermined: {n_params} parameters but only {n_data} data points"
37 )
38 }
39 Self::OptimizationFailed(msg) => write!(f, "optimization failed: {msg}"),
40 Self::LengthMismatch { expected, got } => {
41 write!(f, "length mismatch: expected {expected}, got {got}")
42 }
43 Self::InvalidParameter(msg) => write!(f, "invalid parameter: {msg}"),
44 Self::SingularJacobian => write!(f, "singular Jacobian: covariance unreliable"),
45 }
46 }
47}
48
49impl std::error::Error for FitError {}
50
51impl From<FitError> for NumraError {
52 fn from(e: FitError) -> Self {
53 NumraError::Fit(e.to_string())
54 }
55}