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}