1use thiserror::Error;
4
5#[derive(Error, Debug)]
7pub enum OptimizeError {
8 #[error("Computation error: {0}")]
10 ComputationError(String),
11
12 #[error("Convergence error: {0}")]
14 ConvergenceError(String),
15
16 #[error("Value error: {0}")]
18 ValueError(String),
19
20 #[error("Not implemented: {0}")]
22 NotImplementedError(String),
23}
24
25pub type OptimizeResult<T> = Result<T, OptimizeError>;
27
28impl 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}