use crate::error::{Error, Result};
pub fn eigenvector_max_6x6(matrix: &[[f64; 6]; 6]) -> Result<(f64, [f64; 6])> {
let mut eigenvalue: f64 = 0.0;
let mut eigenvector: [f64; 6] = [0.0; 6];
let code = unsafe {
empyrean_sys::empyrean_eigenvector_max_6x6(matrix, &mut eigenvalue, &mut eigenvector)
};
if code != 0 {
return Err(Error::capture(code));
}
Ok((eigenvalue, eigenvector))
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct MixtureComponent {
pub weight: f64,
pub mean: [f64; 6],
pub covariance: [[f64; 6]; 6],
}
pub fn split_gaussian(
mean: &[f64; 6],
covariance: &[[f64; 6]; 6],
k: usize,
) -> Result<Vec<MixtureComponent>> {
let mut weights: Vec<f64> = vec![0.0; k];
let mut means: Vec<[f64; 6]> = vec![[0.0; 6]; k];
let mut covs: Vec<[[f64; 6]; 6]> = vec![[[0.0; 6]; 6]; k];
let code = unsafe {
empyrean_sys::empyrean_split_gaussian(
mean,
covariance,
k,
weights.as_mut_ptr(),
means.as_mut_ptr(),
covs.as_mut_ptr(),
)
};
if code != 0 {
return Err(Error::capture(code));
}
Ok((0..k)
.map(|i| MixtureComponent {
weight: weights[i],
mean: means[i],
covariance: covs[i],
})
.collect())
}