use core::fmt;
use crate::{ConditioningError, PosteriorError};
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum BayesianQuadratureError {
EmptyObservations,
ObservationLengthMismatch,
NonFiniteObservationNode,
NonFiniteObservationValue,
Conditioning(ConditioningError),
Posterior(PosteriorError),
MateriallyNegativePosteriorVariance {
value: f64,
tolerance: f64,
},
}
impl fmt::Display for BayesianQuadratureError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::EmptyObservations => write!(f, "at least one observation is required"),
Self::ObservationLengthMismatch => {
write!(f, "observation nodes and values must have equal lengths")
}
Self::NonFiniteObservationNode => {
write!(f, "observation nodes must be finite")
}
Self::NonFiniteObservationValue => {
write!(f, "observed function values must be finite")
}
Self::Conditioning(error) => write!(f, "Gaussian conditioning failed: {error}"),
Self::Posterior(error) => write!(f, "posterior construction failed: {error}"),
Self::MateriallyNegativePosteriorVariance { value, tolerance } => write!(
f,
"posterior variance {value:.16e} is negative beyond roundoff tolerance {tolerance:.16e}"
),
}
}
}
impl std::error::Error for BayesianQuadratureError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Self::Conditioning(error) => Some(error),
Self::Posterior(error) => Some(error),
_ => None,
}
}
}
impl From<ConditioningError> for BayesianQuadratureError {
fn from(error: ConditioningError) -> Self {
Self::Conditioning(error)
}
}
impl From<PosteriorError> for BayesianQuadratureError {
fn from(error: PosteriorError) -> Self {
Self::Posterior(error)
}
}