Skip to main content

uncertain_numerics/
active_design_error.rs

1use core::fmt;
2
3use crate::{ActiveSelectionError, BayesianQuadratureError};
4
5/// Errors raised while running sequential active Bayesian quadrature.
6#[derive(Debug, Clone, Copy, PartialEq)]
7pub enum ActiveDesignError {
8    /// The posterior-variance stopping tolerance is not finite.
9    NonFiniteVarianceTolerance,
10    /// The posterior-variance stopping tolerance is negative.
11    NegativeVarianceTolerance,
12    /// At least one candidate point is not finite.
13    NonFiniteCandidate,
14    /// A user-supplied function evaluation returned a non-finite value.
15    NonFiniteFunctionValue,
16    /// Candidate selection failed.
17    Selection(ActiveSelectionError),
18    /// Bayesian-quadrature posterior construction failed.
19    Posterior(BayesianQuadratureError),
20}
21
22impl fmt::Display for ActiveDesignError {
23    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
24        match self {
25            Self::NonFiniteVarianceTolerance => {
26                write!(f, "posterior-variance stopping tolerance must be finite")
27            }
28            Self::NegativeVarianceTolerance => {
29                write!(
30                    f,
31                    "posterior-variance stopping tolerance must be non-negative"
32                )
33            }
34            Self::NonFiniteCandidate => write!(f, "candidate points must be finite"),
35            Self::NonFiniteFunctionValue => {
36                write!(f, "active function evaluations must be finite")
37            }
38            Self::Selection(error) => write!(f, "active candidate selection failed: {error}"),
39            Self::Posterior(error) => write!(f, "Bayesian quadrature failed: {error}"),
40        }
41    }
42}
43
44impl std::error::Error for ActiveDesignError {
45    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
46        match self {
47            Self::Selection(error) => Some(error),
48            Self::Posterior(error) => Some(error),
49            _ => None,
50        }
51    }
52}
53
54impl From<ActiveSelectionError> for ActiveDesignError {
55    fn from(error: ActiveSelectionError) -> Self {
56        Self::Selection(error)
57    }
58}
59
60impl From<BayesianQuadratureError> for ActiveDesignError {
61    fn from(error: BayesianQuadratureError) -> Self {
62        Self::Posterior(error)
63    }
64}