Skip to main content

gam_linalg/
error.rs

1#[derive(Debug, thiserror::Error)]
2pub enum LinalgError {
3    #[error("Invalid input: {0}")]
4    InvalidInput(String),
5
6    #[error(
7        "Hessian matrix is not positive definite (minimum eigenvalue: {min_eigenvalue:.4e}). This indicates a numerical instability."
8    )]
9    HessianNotPositiveDefinite { min_eigenvalue: f64 },
10
11    #[error(
12        "Model is ill-conditioned with condition number {condition_number:.2e}. This typically occurs when the model is over-parameterized (too many knots relative to data points). Consider reducing the number of knots or increasing regularization."
13    )]
14    ModelIsIllConditioned { condition_number: f64 },
15}
16
17#[cfg(test)]
18mod tests {
19    use super::*;
20
21    #[test]
22    fn invalid_input_display_contains_message() {
23        let err = LinalgError::InvalidInput("bad dims".to_string());
24        assert!(err.to_string().contains("bad dims"));
25    }
26
27    #[test]
28    fn hessian_not_spd_display_contains_min_eigenvalue() {
29        let err = LinalgError::HessianNotPositiveDefinite { min_eigenvalue: -0.001 };
30        assert!(err.to_string().to_lowercase().contains("positive definite"));
31    }
32
33    #[test]
34    fn ill_conditioned_display_contains_condition_number() {
35        let err = LinalgError::ModelIsIllConditioned { condition_number: 1.5e12 };
36        assert!(err.to_string().to_lowercase().contains("ill-conditioned"));
37    }
38}