pub struct Statistics {
pub count: usize,
pub aggregate: Vec<f64>,
pub power: u32,
}
impl Statistics {
pub fn new(n_temps: usize, power: u32) -> Self {
Self {
count: 0,
aggregate: vec![0.0; n_temps],
power,
}
}
pub fn update(&mut self, values: &[f32]) {
self.count += 1;
for (agg, &v) in self.aggregate.iter_mut().zip(values.iter()) {
let v = v as f64;
*agg += if self.power == 1 {
v
} else {
v.powi(self.power as i32)
};
}
}
pub fn average(&self) -> Vec<f64> {
let c = self.count as f64;
self.aggregate.iter().map(|&a| a / c).collect()
}
pub fn variance(first: &Self, second: &Self) -> Vec<f64> {
debug_assert!(first.power == 1 && second.power == 2 && first.count == second.count);
first
.average()
.iter()
.zip(second.average())
.map(|(mean, mean_square)| mean_square - mean * mean)
.collect()
}
}