1use std::fmt;
6
7#[derive(Debug, Clone)]
9pub enum PicardError {
10 NotConverged {
12 gradient_norm: f64,
14 tolerance: f64,
16 iterations: usize,
18 },
19
20 InvalidDimensions {
22 message: String,
24 },
25
26 SingularMatrix,
28
29 ComputationError {
31 message: String,
33 },
34
35 InvalidConfig {
37 parameter: String,
39 message: String,
41 },
42}
43
44impl fmt::Display for PicardError {
45 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
46 match self {
47 PicardError::NotConverged {
48 gradient_norm,
49 tolerance,
50 iterations,
51 } => {
52 write!(
53 f,
54 "PICARD did not converge after {} iterations. \
55 Final gradient norm: {:.4e}, requested tolerance: {:.4e}. \
56 Consider increasing max_iter or tolerance.",
57 iterations, gradient_norm, tolerance
58 )
59 }
60 PicardError::InvalidDimensions { message } => {
61 write!(f, "Invalid dimensions: {}", message)
62 }
63 PicardError::SingularMatrix => {
64 write!(f, "Singular matrix encountered during computation")
65 }
66 PicardError::ComputationError { message } => {
67 write!(f, "Computation error: {}", message)
68 }
69 PicardError::InvalidConfig { parameter, message } => {
70 write!(f, "Invalid configuration for '{}': {}", parameter, message)
71 }
72 }
73 }
74}
75
76impl std::error::Error for PicardError {}
77
78pub type Result<T> = std::result::Result<T, PicardError>;