1#![forbid(unsafe_code)]
2#![warn(missing_docs)]
3#![doc = include_str!("../README.md")]
4
5#[cfg(doc)]
6mod readme_doctests {
7 fn solve_5x5_example() {}
32}
33
34mod lu;
35mod matrix;
36mod vector;
37
38use core::fmt;
39
40pub const DEFAULT_PIVOT_TOL: f64 = 1e-12;
44
45#[derive(Clone, Copy, Debug, PartialEq, Eq)]
47pub enum LaError {
48 Singular {
50 pivot_col: usize,
52 },
53 NonFinite {
55 pivot_col: usize,
57 },
58}
59
60impl fmt::Display for LaError {
61 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
62 match *self {
63 Self::Singular { pivot_col } => {
64 write!(f, "singular matrix at pivot column {pivot_col}")
65 }
66 Self::NonFinite { pivot_col } => {
67 write!(
68 f,
69 "non-finite value encountered at pivot column {pivot_col}"
70 )
71 }
72 }
73 }
74}
75
76impl std::error::Error for LaError {}
77
78pub use lu::Lu;
79pub use matrix::Matrix;
80pub use vector::Vector;
81
82pub mod prelude {
87 pub use crate::{DEFAULT_PIVOT_TOL, LaError, Lu, Matrix, Vector};
88}
89
90#[cfg(test)]
91mod tests {
92 use super::*;
93
94 use approx::assert_abs_diff_eq;
95
96 #[test]
97 fn default_pivot_tol_is_expected() {
98 assert_abs_diff_eq!(DEFAULT_PIVOT_TOL, 1e-12, epsilon = 0.0);
99 }
100
101 #[test]
102 fn laerror_display_formats_singular() {
103 let err = LaError::Singular { pivot_col: 3 };
104 assert_eq!(err.to_string(), "singular matrix at pivot column 3");
105 }
106
107 #[test]
108 fn laerror_display_formats_nonfinite() {
109 let err = LaError::NonFinite { pivot_col: 2 };
110 assert_eq!(
111 err.to_string(),
112 "non-finite value encountered at pivot column 2"
113 );
114 }
115
116 #[test]
117 fn laerror_is_std_error_with_no_source() {
118 let err = LaError::Singular { pivot_col: 0 };
119 let e: &dyn std::error::Error = &err;
120 assert!(e.source().is_none());
121 }
122
123 #[test]
124 fn prelude_reexports_compile_and_work() {
125 use crate::prelude::*;
126
127 let m = Matrix::<2>::identity();
129 let v = Vector::<2>::new([1.0, 2.0]);
130 let _ = m.lu(DEFAULT_PIVOT_TOL).unwrap().solve_vec(v).unwrap();
131 }
132}