1use std::error::Error;
4use std::fmt;
5
6#[derive(Debug)]
8pub enum OptimError {
9 InvalidConfig(String),
11 InvalidParameter(String),
13 OptimizationError(String),
15 DimensionMismatch(String),
17 PrivacyBudgetExhausted {
19 consumed_epsilon: f64,
20 target_epsilon: f64,
21 },
22 InvalidPrivacyConfig(String),
24 PrivacyAccountingError(String),
26 ConfigurationError(String),
28 InvalidState(String),
30 MonitoringError(String),
32 AnalysisError(String),
34 AnalyticsError(String),
36 UnsupportedOperation(String),
38 ResourceError(String),
40 ResourceUnavailable(String),
42 ExecutionError(String),
44 Environment(String),
46 LockError(String),
48 ThreadError(String),
50 ComputationError(String),
52 PluginStillInUse(String),
54 MissingDependency(String),
56 PluginNotFound(String),
58 PluginDisabled(String),
60 PluginLoadError(String),
62 PluginInMaintenance(String),
64 UnsupportedDataType(String),
66 IO(std::io::Error),
68 Other(String),
70}
71
72pub type OptimizerError = OptimError;
74
75impl fmt::Display for OptimError {
76 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
77 match self {
78 OptimError::InvalidConfig(msg) => write!(f, "Invalid configuration: {msg}"),
79 OptimError::InvalidParameter(msg) => write!(f, "Invalid parameter: {msg}"),
80 OptimError::OptimizationError(msg) => write!(f, "Optimization error: {msg}"),
81 OptimError::DimensionMismatch(msg) => write!(f, "Dimension mismatch: {msg}"),
82 OptimError::PrivacyBudgetExhausted {
83 consumed_epsilon,
84 target_epsilon,
85 } => {
86 write!(
87 f,
88 "Privacy budget exhausted: consumed ε={consumed_epsilon:.4}, target ε={target_epsilon:.4}"
89 )
90 }
91 OptimError::InvalidPrivacyConfig(msg) => {
92 write!(f, "Invalid privacy configuration: {msg}")
93 }
94 OptimError::PrivacyAccountingError(msg) => {
95 write!(f, "Privacy accounting error: {msg}")
96 }
97 OptimError::ConfigurationError(msg) => {
98 write!(f, "Configuration error: {msg}")
99 }
100 OptimError::InvalidState(msg) => {
101 write!(f, "Invalid state error: {msg}")
102 }
103 OptimError::MonitoringError(msg) => {
104 write!(f, "Monitoring error: {msg}")
105 }
106 OptimError::AnalysisError(msg) => {
107 write!(f, "Analysis error: {msg}")
108 }
109 OptimError::AnalyticsError(msg) => {
110 write!(f, "Analytics error: {msg}")
111 }
112 OptimError::UnsupportedOperation(msg) => {
113 write!(f, "Unsupported operation: {msg}")
114 }
115 OptimError::ResourceError(msg) => {
116 write!(f, "Resource error: {msg}")
117 }
118 OptimError::ResourceUnavailable(msg) => {
119 write!(f, "Resource unavailable: {msg}")
120 }
121 OptimError::ExecutionError(msg) => {
122 write!(f, "Execution error: {msg}")
123 }
124 OptimError::Environment(msg) => {
125 write!(f, "Environment error: {msg}")
126 }
127 OptimError::LockError(msg) => {
128 write!(f, "Lock error: {msg}")
129 }
130 OptimError::ThreadError(msg) => {
131 write!(f, "Thread error: {msg}")
132 }
133 OptimError::ComputationError(msg) => {
134 write!(f, "Computation error: {msg}")
135 }
136 OptimError::PluginStillInUse(msg) => {
137 write!(f, "Plugin still in use: {msg}")
138 }
139 OptimError::MissingDependency(msg) => {
140 write!(f, "Missing dependency: {msg}")
141 }
142 OptimError::PluginNotFound(msg) => {
143 write!(f, "Plugin not found: {msg}")
144 }
145 OptimError::PluginDisabled(msg) => {
146 write!(f, "Plugin disabled: {msg}")
147 }
148 OptimError::PluginLoadError(msg) => {
149 write!(f, "Plugin load error: {msg}")
150 }
151 OptimError::PluginInMaintenance(msg) => {
152 write!(f, "Plugin in maintenance: {msg}")
153 }
154 OptimError::UnsupportedDataType(msg) => {
155 write!(f, "Unsupported data type: {msg}")
156 }
157 OptimError::IO(err) => {
158 write!(f, "I/O error: {err}")
159 }
160 OptimError::Other(msg) => write!(f, "Error: {msg}"),
161 }
162 }
163}
164
165impl Error for OptimError {}
166
167impl From<std::time::SystemTimeError> for OptimError {
169 fn from(error: std::time::SystemTimeError) -> Self {
170 OptimError::Other(format!("System time error: {error}"))
171 }
172}
173
174impl From<scirs2_core::ndarray::ShapeError> for OptimError {
175 fn from(error: scirs2_core::ndarray::ShapeError) -> Self {
176 OptimError::DimensionMismatch(format!("Shape error: {error}"))
177 }
178}
179
180impl From<serde_json::Error> for OptimError {
181 fn from(error: serde_json::Error) -> Self {
182 OptimError::Other(format!("Serde JSON error: {error}"))
183 }
184}
185
186impl From<std::io::Error> for OptimError {
187 fn from(error: std::io::Error) -> Self {
188 OptimError::IO(error)
189 }
190}
191
192pub type Result<T> = std::result::Result<T, OptimError>;