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