use core::fmt;
#[cfg_attr(
feature = "serde-support",
derive(serde::Serialize, serde::Deserialize)
)]
#[derive(Debug, Clone, PartialEq)]
#[non_exhaustive]
pub enum OptimError {
ConvergenceFailure { iterations: usize },
NonFiniteValue { context: &'static str },
InvalidParameter {
name: &'static str,
reason: &'static str,
},
BracketError,
CoreError(scivex_core::CoreError),
}
impl fmt::Display for OptimError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::ConvergenceFailure { iterations } => {
write!(f, "convergence failure after {iterations} iterations")
}
Self::NonFiniteValue { context } => {
write!(f, "non-finite value encountered in {context}")
}
Self::InvalidParameter { name, reason } => {
write!(f, "invalid parameter `{name}`: {reason}")
}
Self::BracketError => {
write!(
f,
"bracket does not contain a root (f(a) and f(b) must have opposite signs)"
)
}
Self::CoreError(e) => write!(f, "core error: {e}"),
}
}
}
impl std::error::Error for OptimError {}
impl From<scivex_core::CoreError> for OptimError {
fn from(e: scivex_core::CoreError) -> Self {
Self::CoreError(e)
}
}
pub type Result<T> = std::result::Result<T, OptimError>;