#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Mean {
avg: f64,
n: u64,
}
impl Mean {
#[inline]
pub fn new() -> Mean {
Mean { avg: 0., n: 0 }
}
#[inline]
fn increment(&mut self) {
self.n += 1;
}
#[inline]
fn add_inner(&mut self, delta_n: f64) {
self.avg += delta_n;
}
#[inline]
pub fn is_empty(&self) -> bool {
self.n == 0
}
#[inline]
pub fn mean(&self) -> f64 {
if self.n > 0 { self.avg } else { f64::NAN }
}
#[inline]
pub fn len(&self) -> u64 {
self.n
}
}
impl core::default::Default for Mean {
fn default() -> Mean {
Mean::new()
}
}
impl Estimate for Mean {
#[inline]
fn add(&mut self, sample: f64) {
self.increment();
let delta_n = (sample - self.avg)
/ self.n.to_f64().unwrap();
self.add_inner(delta_n);
}
fn estimate(&self) -> f64 {
self.mean()
}
}
impl Merge for Mean {
#[inline]
fn merge(&mut self, other: &Mean) {
if other.is_empty() {
return;
}
if self.is_empty() {
*self = other.clone();
return;
}
let len_self = self.n.to_f64().unwrap();
let len_other = other.n.to_f64().unwrap();
let len_total = len_self + len_other;
self.n += other.n;
self.avg = (len_self * self.avg + len_other * other.avg) / len_total;
}
}
impl_from_iterator!(Mean);
impl_from_par_iterator!(Mean);
impl_extend!(Mean);