Skip to main content

trueno_solve/
lib.rs

1#![cfg_attr(
2    test,
3    allow(
4        clippy::expect_used,
5        clippy::unwrap_used,
6        clippy::disallowed_methods,
7        clippy::float_cmp,
8        clippy::panic,
9        clippy::useless_vec
10    )
11)]
12//! Dense linear algebra solvers with provable contracts.
13//!
14//! # Solvers
15//!
16//! - **LU**: Partial pivoting, PA = LU
17//! - **QR**: Householder reflections, A = QR
18//! - **SVD**: One-sided Jacobi, A = UΣV^T
19//! - **Cholesky**: A = LL^T for positive definite matrices
20//!
21//! # Example
22//!
23//! ```
24//! use trueno_solve::lu_factorize;
25//!
26//! // Solve Ax = b where A = [[2, 1], [1, 3]]
27//! let a = [2.0, 1.0, 1.0, 3.0_f32];
28//! let lu = lu_factorize(&a, 2).unwrap();
29//! let x = lu.solve(&[5.0, 7.0]).unwrap();
30//! // x ≈ [1.6, 1.8]
31//! assert!((x[0] - 1.6).abs() < 1e-5);
32//! assert!((x[1] - 1.8).abs() < 1e-5);
33//! ```
34
35mod blas3;
36mod cholesky;
37mod error;
38mod lu;
39mod qr;
40mod svd;
41mod trsm;
42
43#[cfg(test)]
44mod tests;
45
46pub use blas3::{
47    f32_to_f16, gemm_ex, gemm_ex_epilogue, gemm_strided_batched, symm, syr2k, syrk, trmm, Epilogue,
48};
49pub use cholesky::{cholesky, CholeskyFactorization};
50pub use error::SolverError;
51pub use lu::{lu_factorize, LuFactorization};
52pub use qr::{qr_factorize, QrFactorization};
53pub use svd::{svd, SvdResult};
54pub use trsm::{trsm, DiagonalType, TriangularSide, TrsmResult};
55
56/// Unified solver trait for factorization-based linear system solving.
57///
58/// Implemented by `LuFactorization`, `QrFactorization`, and `CholeskyFactorization`.
59pub trait Solver {
60    /// Solve `Ax = b` using this factorization.
61    ///
62    /// # Errors
63    ///
64    /// Returns error on dimension mismatch or singular matrix.
65    fn solve(&self, b: &[f32]) -> Result<Vec<f32>, SolverError>;
66
67    /// Matrix dimension (n for n×n systems, or min(m,n) for rectangular).
68    fn dimension(&self) -> usize;
69}
70
71impl Solver for LuFactorization {
72    fn solve(&self, b: &[f32]) -> Result<Vec<f32>, SolverError> {
73        self.solve(b)
74    }
75    fn dimension(&self) -> usize {
76        self.n
77    }
78}
79
80impl Solver for QrFactorization {
81    fn solve(&self, b: &[f32]) -> Result<Vec<f32>, SolverError> {
82        self.solve(b)
83    }
84    fn dimension(&self) -> usize {
85        self.n
86    }
87}
88
89impl Solver for CholeskyFactorization {
90    fn solve(&self, b: &[f32]) -> Result<Vec<f32>, SolverError> {
91        self.solve(b)
92    }
93    fn dimension(&self) -> usize {
94        self.n
95    }
96}