oxiblas_lapack/
lib.rs

1//! OxiBLAS LAPACK - Pure Rust LAPACK implementation.
2//!
3//! This crate provides LAPACK (Linear Algebra PACKage) operations
4//! implemented in pure Rust.
5//!
6//! # Decompositions
7//!
8//! - **LU**: LU decomposition with partial/full pivoting ✓
9//! - **Cholesky**: LL^T and LDL^T decomposition for positive definite matrices ✓
10//! - **QR**: QR decomposition with optional column pivoting ✓
11//! - **EVD**: Eigenvalue decomposition (symmetric and general) ✓
12//! - **SVD**: Singular value decomposition (Jacobi, divide-and-conquer, randomized) ✓
13//!
14//! # Example
15//!
16//! ```
17//! use oxiblas_lapack::lu::Lu;
18//! use oxiblas_matrix::Mat;
19//!
20//! let a: Mat<f64> = Mat::from_rows(&[
21//!     &[2.0, 1.0],
22//!     &[1.0, 3.0],
23//! ]);
24//!
25//! let lu = Lu::compute(a.as_ref()).expect("Matrix is not singular");
26//! let det = lu.determinant();
27//! assert!((det - 5.0).abs() < 1e-10); // det = 2*3 - 1*1 = 5
28//! ```
29
30#![warn(missing_docs)]
31#![warn(clippy::all)]
32#![allow(clippy::module_name_repetitions)]
33// LAPACK code often uses manual assign patterns for clarity
34#![allow(clippy::assign_op_pattern)]
35// Numerical code often has complex generic types
36#![allow(clippy::type_complexity)]
37// Loop index variables are common in matrix operations
38#![allow(clippy::needless_range_loop)]
39// LAPACK functions have many parameters by design
40#![allow(clippy::too_many_arguments)]
41// Bounds in two places for clarity in generic numerical code
42#![allow(clippy::multiple_bound_locations)]
43// Doc formatting variations
44#![allow(clippy::doc_overindented_list_items)]
45// Vec vs slice in internal APIs is acceptable
46#![allow(clippy::ptr_arg)]
47// Manual slice copying for explicit control
48#![allow(clippy::manual_memcpy)]
49// Balance algorithm has intentional range mutation
50#![allow(clippy::mut_range_bound)]
51// Iterative algorithms may have unusual patterns
52#![allow(clippy::collapsible_if)]
53#![allow(clippy::only_used_in_recursion)]
54#![allow(clippy::manual_strip)]
55#![allow(clippy::iter_cloned_collect)]
56#![allow(clippy::nonminimal_bool)]
57#![allow(clippy::eq_op)]
58#![allow(clippy::unwrap_or_default)]
59#![allow(clippy::unnecessary_unwrap)]
60#![allow(clippy::neg_cmp_op_on_partial_ord)]
61
62pub mod cholesky;
63pub mod error;
64pub mod evd;
65pub mod info;
66pub mod lu;
67pub mod qr;
68pub mod solve;
69pub mod svd;
70pub mod utils;
71pub mod workspace;
72
73/// Prelude module for convenient imports.
74pub mod prelude {
75    pub use crate::cholesky::{
76        BandCholesky, BandCholeskyError, Cholesky, CholeskyError, Ldlt, LdltError,
77        band_lower_to_dense, dense_to_band_lower,
78    };
79    pub use crate::error::{
80        ErrorCategory, ErrorCode, HasInfoCode, INFO_SUCCESS, InfoCode, IntoLapackError,
81        LapackError, LapackResult,
82    };
83    pub use crate::evd::{
84        Eigenvalue, EigenvalueSelector, GeneralEvd, GeneralEvdError, Hessenberg, HessenbergError,
85        Schur, SchurError, SymmetricEvd, SymmetricEvdDc, SymmetricEvdDcError, SymmetricEvdError,
86        TridiagEvd, TridiagEvdError, count_eigenvalues, eigenvalue_bounds, eigenvalues_by_index,
87        eigenvalues_in_range,
88    };
89    pub use crate::info::{
90        CholeskyInfo, EvdInfo, LuInfo, QrInfo, SvdInfo, SymmetricEvdInfo, compute_cholesky_info,
91        compute_general_evd_info, compute_lu_info, compute_qr_info, compute_svd_info,
92        compute_symmetric_evd_info,
93    };
94    pub use crate::lu::{
95        BandLu, BandLuError, Lu, LuError, LuFullPiv, LuFullPivError, band_to_dense, dense_to_band,
96    };
97    pub use crate::qr::{Qr, QrError, QrPivot, QrPivotError};
98    pub use crate::solve::{
99        Equilibrate, ExpertCholeskySolveError, ExpertCholeskySolveResult, ExpertSolveError,
100        ExpertSolveResult, ExpertSymmetricSolveError, ExpertSymmetricSolveResult,
101        LeastSquaresResult, LstSqError, RefinementError, RefinementResult, SolveError,
102        TriangularKind, TriangularSolveError, TridiagError, TridiagFactors, TridiagSPDFactors,
103        lstsq, refine_solution, refine_solution_cholesky, refine_solution_symmetric, solve,
104        solve_cholesky_expert, solve_expert, solve_multiple, solve_symmetric_expert,
105        solve_triangular, solve_triangular_multiple, tridiag_factor, tridiag_factor_spd,
106        tridiag_solve, tridiag_solve_factored, tridiag_solve_factored_spd, tridiag_solve_multiple,
107        tridiag_solve_spd,
108    };
109    pub use crate::svd::{
110        BidiagError, BidiagFactors, BidiagVect, RandomizedSvd, RandomizedSvdConfig,
111        RandomizedSvdError, SelectiveSvd, SelectiveSvdError, Side, SingularValueSelector, Svd,
112        SvdDc, SvdDcError, SvdError, Trans, count_singular_values_above, gebrd,
113        low_rank_approximation, orgbr, ormbr, rsvd, rsvd_power, singular_value_bounds, ungbr,
114        unmbr,
115    };
116    pub use crate::utils::{
117        CondError, DetError, InvError, PinvResult, RankError, col_space, cond, cond_1, cond_inf,
118        det, det_lu, inv, left_null_space, norm_1, norm_2, norm_frobenius, norm_inf, norm_max,
119        norm_nuclear, null_space, nullity, pinv, pinv_default, rank, rcond, rcond_estimate,
120        row_space, trace,
121    };
122    pub use crate::workspace::{
123        EvdWorkspaceQuery, SvdWorkspaceQuery, Workspace, WorkspaceQuery, WorkspaceQueryWithInt,
124        band_lu_workspace, bidiag_workspace, cholesky_solve_workspace, cholesky_workspace,
125        general_evd_workspace, generalized_evd_workspace, hermitian_evd_workspace,
126        hessenberg_workspace, ldlt_workspace, least_squares_workspace, lu_solve_workspace,
127        lu_workspace, orgqr_workspace, ormqr_workspace, qr_pivot_workspace, qr_workspace,
128        qz_workspace, schur_workspace, svd_dc_workspace, svd_workspace, symmetric_evd_dc_workspace,
129        symmetric_evd_workspace, triangular_solve_workspace, tridiagonal_solve_workspace,
130    };
131}