use crate::ewmean::EWMean;
use crate::stats::Univariate;
use num::{Float, FromPrimitive};
use serde::{Deserialize, Serialize};
use std::ops::{AddAssign, SubAssign};
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
pub struct EWVariance<F: Float + FromPrimitive + AddAssign + SubAssign> {
pub mean: EWMean<F>,
pub sq_mean: EWMean<F>,
pub alpha: F,
}
impl<F: Float + FromPrimitive + AddAssign + SubAssign> EWVariance<F> {
pub fn new(alpha: F) -> Self {
Self {
mean: EWMean::new(alpha),
sq_mean: EWMean::new(alpha),
alpha,
}
}
}
impl<F> Default for EWVariance<F>
where
F: Float + FromPrimitive + AddAssign + SubAssign,
{
fn default() -> Self {
let alpha = F::from_f64(0.5).unwrap();
Self {
mean: EWMean::new(alpha),
sq_mean: EWMean::new(alpha),
alpha,
}
}
}
impl<F: Float + FromPrimitive + AddAssign + SubAssign> Univariate<F> for EWVariance<F> {
fn update(&mut self, x: F) {
self.mean.update(x);
self.sq_mean.update(x.powf(F::from_i8(2).unwrap()))
}
fn get(&self) -> F {
self.sq_mean.get() - self.mean.get().powf(F::from_i8(2).unwrap())
}
}