pub(crate) mod cholesky;
pub(crate) mod expm;
pub(crate) mod hessenberg;
pub(crate) mod lu;
pub(crate) mod qr;
pub(crate) mod schur;
pub(crate) mod svd;
pub(crate) mod symmetric_eigen;
pub use cholesky::CholeskyDecomposition;
pub use cholesky::{cholesky_rank1_update, cholesky_rank1_downdate};
pub use expm::expm;
pub use lu::LuDecomposition;
pub use qr::QrDecomposition;
pub use qr::QrPivotDecomposition;
pub use schur::SchurDecomposition;
pub use svd::SvdDecomposition;
pub use symmetric_eigen::SymmetricEigen;
use crate::traits::MatrixMut;
#[inline]
pub(crate) fn split_two_col_slices<'a, T>(
m: &'a mut impl MatrixMut<T>,
col_a: usize,
col_b: usize,
row_start: usize,
) -> (&'a mut [T], &'a mut [T]) {
debug_assert_ne!(col_a, col_b);
let ptr = m as *mut dyn MatrixMut<T>;
let a = unsafe { &mut *ptr }.col_as_mut_slice(col_a, row_start);
let b = unsafe { &mut *ptr }.col_as_mut_slice(col_b, row_start);
(a, b)
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum LinalgError {
Singular,
NotPositiveDefinite,
ConvergenceFailure,
}
impl core::fmt::Display for LinalgError {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
LinalgError::Singular => write!(f, "matrix is singular"),
LinalgError::NotPositiveDefinite => write!(f, "matrix is not positive definite"),
LinalgError::ConvergenceFailure => write!(f, "iterative algorithm did not converge"),
}
}
}