use crate::core::CovstreamCore;
use crate::{CovstreamError, MatrixLayout, ShrinkageMode};
#[derive(Debug, Clone)]
pub struct CovstreamState {
layout: MatrixLayout,
core: CovstreamCore,
}
impl CovstreamState {
pub fn new(dimension: usize, layout: MatrixLayout) -> Result<Self, CovstreamError> {
Ok(Self {
layout,
core: CovstreamCore::new(dimension)?,
})
}
pub fn layout(&self) -> MatrixLayout {
self.layout
}
pub fn dimension(&self) -> usize {
self.core.dimension()
}
pub fn sample_count(&self) -> u64 {
self.core.sample_count()
}
pub fn covariance_row_major(&self) -> Result<Vec<f64>, CovstreamError> {
self.core.covariance_row_major()
}
pub fn covariance_buffer_into(&self, out: &mut [f64]) -> Result<(), CovstreamError> {
match self.layout {
MatrixLayout::RowMajor => self.core.covariance_row_major_into(out),
MatrixLayout::UpperTrianglePacked => {
self.core.covariance_upper_triangle_packed_into(out)
}
}
}
pub fn covariance_buffer(&self) -> Result<Vec<f64>, CovstreamError> {
let mut out = vec![0.0; self.layout.output_size(self.dimension())];
self.covariance_buffer_into(&mut out)?;
Ok(out)
}
pub fn observe(&mut self, sample: &[f64]) -> Result<(), CovstreamError> {
self.core.observe(sample)
}
pub fn observe_batch_row_major(&mut self, samples: &[f64]) -> Result<(), CovstreamError> {
self.core.observe_batch_row_major(samples)
}
pub fn observe_trusted_finite(&mut self, sample: &[f64]) -> Result<(), CovstreamError> {
self.core.observe_trusted_finite(sample)
}
pub fn observe_batch_row_major_trusted_finite(
&mut self,
samples: &[f64],
) -> Result<(), CovstreamError> {
self.core.observe_batch_row_major_trusted_finite(samples)
}
pub fn reset(&mut self) {
self.core.reset();
}
pub fn ledoit_wolf_row_major(&self, mode: ShrinkageMode) -> Result<Vec<f64>, CovstreamError> {
self.core.ledoit_wolf_row_major(mode)
}
pub fn ledoit_wolf_buffer_into(
&self,
mode: ShrinkageMode,
out: &mut [f64],
) -> Result<(), CovstreamError> {
match self.layout {
MatrixLayout::RowMajor => self.core.ledoit_wolf_row_major_into(mode, out),
MatrixLayout::UpperTrianglePacked => {
self.core.ledoit_wolf_upper_triangle_packed_into(mode, out)
}
}
}
pub fn ledoit_wolf_buffer(&self, mode: ShrinkageMode) -> Result<Vec<f64>, CovstreamError> {
let mut out = vec![0.0; self.layout.output_size(self.dimension())];
self.ledoit_wolf_buffer_into(mode, &mut out)?;
Ok(out)
}
pub fn merge(&mut self, other: &Self) -> Result<(), CovstreamError> {
self.core.merge(&other.core)
}
pub fn observe_batch_row_major_parallel(
&mut self,
samples: &[f64],
) -> Result<(), CovstreamError> {
self.core.observe_batch_row_major_parallel(samples)
}
pub fn observe_batch_row_major_parallel_trusted_finite(
&mut self,
samples: &[f64],
) -> Result<(), CovstreamError> {
self.core
.observe_batch_row_major_parallel_trusted_finite(samples)
}
}