pub type NormalizationStats<F> = (Option<Vec<F>>, Option<Vec<F>>);
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum Centering {
#[default]
None,
Mean,
Min,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum Scaling {
#[default]
None,
Sd,
MaxAbs,
L1,
L2,
Range,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct Normalization {
pub center: Centering,
pub scale: Scaling,
}
impl Normalization {
pub fn new(center: Centering, scale: Scaling) -> Self {
Self { center, scale }
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct NormalizationParams<F = f64> {
ncols: usize,
pub(crate) centers: Option<Vec<F>>,
pub(crate) scales: Option<Vec<F>>,
}
impl<F: crate::Scalar> NormalizationParams<F> {
pub fn from_parts(ncols: usize, centers: Option<Vec<F>>, scales: Option<Vec<F>>) -> Self {
crate::gram::validate_normalization(ncols, centers.as_deref(), scales.as_deref());
Self {
ncols,
centers,
scales,
}
}
pub fn ncols(&self) -> usize {
self.ncols
}
pub fn centers(&self) -> Option<&[F]> {
self.centers.as_deref()
}
pub fn scales(&self) -> Option<&[F]> {
self.scales.as_deref()
}
pub fn into_parts(self) -> NormalizationStats<F> {
(self.centers, self.scales)
}
}