scirs2_optimize/
error.rs

1//! Error types for the SciRS2 optimization module
2
3use thiserror::Error;
4
5/// Optimization error type
6#[derive(Error, Debug)]
7pub enum OptimizeError {
8    /// Computation error (generic error)
9    #[error("Computation error: {0}")]
10    ComputationError(String),
11
12    /// Convergence error (algorithm did not converge)
13    #[error("Convergence error: {0}")]
14    ConvergenceError(String),
15
16    /// Value error (invalid value)
17    #[error("Value error: {0}")]
18    ValueError(String),
19
20    /// Not implemented error
21    #[error("Not implemented: {0}")]
22    NotImplementedError(String),
23}
24
25/// Result type for optimization operations
26pub type OptimizeResult<T> = Result<T, OptimizeError>;
27
28// Implement conversion from SparseError to OptimizeError
29impl From<scirs2_sparse::error::SparseError> for OptimizeError {
30    fn from(error: scirs2_sparse::error::SparseError) -> Self {
31        match error {
32            scirs2_sparse::error::SparseError::ComputationError(msg) => {
33                OptimizeError::ComputationError(msg)
34            }
35            scirs2_sparse::error::SparseError::DimensionMismatch { expected, found } => {
36                OptimizeError::ValueError(format!(
37                    "Dimension mismatch: expected {}, found {}",
38                    expected, found
39                ))
40            }
41            scirs2_sparse::error::SparseError::IndexOutOfBounds { index, shape } => {
42                OptimizeError::ValueError(format!(
43                    "Index {:?} out of bounds for array with shape {:?}",
44                    index, shape
45                ))
46            }
47            scirs2_sparse::error::SparseError::InvalidAxis => {
48                OptimizeError::ValueError("Invalid axis specified".to_string())
49            }
50            scirs2_sparse::error::SparseError::InvalidSliceRange => {
51                OptimizeError::ValueError("Invalid slice range specified".to_string())
52            }
53            scirs2_sparse::error::SparseError::InconsistentData { reason } => {
54                OptimizeError::ValueError(format!("Inconsistent data: {}", reason))
55            }
56            scirs2_sparse::error::SparseError::NotImplemented(msg) => {
57                OptimizeError::NotImplementedError(msg)
58            }
59            scirs2_sparse::error::SparseError::SingularMatrix(msg) => {
60                OptimizeError::ComputationError(format!("Singular matrix error: {}", msg))
61            }
62            scirs2_sparse::error::SparseError::ValueError(msg) => OptimizeError::ValueError(msg),
63            scirs2_sparse::error::SparseError::ConversionError(msg) => {
64                OptimizeError::ValueError(format!("Conversion error: {}", msg))
65            }
66            scirs2_sparse::error::SparseError::OperationNotSupported(msg) => {
67                OptimizeError::NotImplementedError(format!("Operation not supported: {}", msg))
68            }
69            scirs2_sparse::error::SparseError::ShapeMismatch { expected, found } => {
70                OptimizeError::ValueError(format!(
71                    "Shape mismatch: expected {:?}, found {:?}",
72                    expected, found
73                ))
74            }
75            scirs2_sparse::error::SparseError::IterativeSolverFailure(msg) => {
76                OptimizeError::ConvergenceError(format!("Iterative solver failure: {}", msg))
77            }
78            scirs2_sparse::error::SparseError::IndexCastOverflow { value, target_type } => {
79                OptimizeError::ValueError(format!(
80                    "Index value {} cannot be represented in the target type {}",
81                    value, target_type
82                ))
83            }
84        }
85    }
86}