Skip to main content

uncertain_numerics/
linear_solver_error.rs

1use core::fmt;
2
3/// Errors raised by probabilistic linear-system primitives.
4#[derive(Debug, Clone, Copy, PartialEq, Eq)]
5pub enum LinearSolverError {
6    /// The system dimension is zero.
7    ZeroDimension,
8    /// A flattened square matrix has the wrong length.
9    MatrixDimensionMismatch,
10    /// A vector has the wrong length.
11    VectorDimensionMismatch,
12    /// At least one matrix entry is not finite.
13    NonFiniteMatrixEntry,
14    /// At least one vector entry is not finite.
15    NonFiniteVectorEntry,
16    /// A solver tolerance is not finite.
17    NonFiniteTolerance,
18    /// A solver tolerance is negative.
19    NegativeTolerance,
20    /// No candidate projection directions were supplied.
21    EmptyCandidateDirections,
22    /// The system matrix is not symmetric within numerical tolerance.
23    NonSymmetricSystemMatrix,
24    /// The system matrix is not positive definite.
25    SystemMatrixNotPositiveDefinite,
26    /// The covariance matrix is not symmetric within numerical tolerance.
27    NonSymmetricCovariance,
28    /// The covariance matrix is not positive semidefinite within numerical tolerance.
29    CovarianceNotPositiveSemidefinite,
30    /// The observation direction contains no remaining prior uncertainty.
31    DegenerateObservation,
32}
33
34impl fmt::Display for LinearSolverError {
35    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
36        match self {
37            Self::ZeroDimension => write!(f, "linear-system dimension must be positive"),
38            Self::MatrixDimensionMismatch => {
39                write!(f, "flattened matrix length must equal dimension squared")
40            }
41            Self::VectorDimensionMismatch => {
42                write!(f, "vector length must equal the system dimension")
43            }
44            Self::NonFiniteMatrixEntry => write!(f, "matrix entries must be finite"),
45            Self::NonFiniteVectorEntry => write!(f, "vector entries must be finite"),
46            Self::NonFiniteTolerance => write!(f, "solver tolerances must be finite"),
47            Self::NegativeTolerance => write!(f, "solver tolerances must be non-negative"),
48            Self::EmptyCandidateDirections => {
49                write!(f, "at least one candidate projection direction is required")
50            }
51            Self::NonSymmetricSystemMatrix => write!(f, "system matrix must be symmetric"),
52            Self::SystemMatrixNotPositiveDefinite => {
53                write!(f, "system matrix must be positive definite")
54            }
55            Self::NonSymmetricCovariance => write!(f, "covariance matrix must be symmetric"),
56            Self::CovarianceNotPositiveSemidefinite => {
57                write!(f, "covariance matrix must be positive semidefinite")
58            }
59            Self::DegenerateObservation => write!(
60                f,
61                "observation direction has no remaining prior uncertainty"
62            ),
63        }
64    }
65}
66
67impl std::error::Error for LinearSolverError {}