use crate::algebra::{
abstr::{Field, Scalar},
linear::matrix::{CholeskyDec, CholeskyDecomposition, General, LowerTriangular},
};
impl<T> CholeskyDecomposition<T> for General<T>
where
T: Field + Scalar,
{
fn dec_cholesky(&self) -> Result<CholeskyDec<T>, String> {
let (m, n) = self.dim();
debug_assert_eq!(m, n);
debug_assert_ne!(m, 0);
let (_m, n) = self.dim();
let n_i32: i32 = n as i32;
let mut info: i32 = 0;
let mut l_data: Vec<T> = self.clone().data;
T::xpotrf('L', n_i32, l_data.as_mut_slice(), n_i32, &mut info);
if info < 0 {
return Err(String::from("LAPACK reported illegal argument."));
}
let mut l: General<T> = General::new(n, n, l_data);
for i in 0..n {
for j in (i + 1)..n {
l[[i, j]] = T::zero();
}
}
return Ok(CholeskyDec::new(LowerTriangular::from(l)));
}
}