use super::Metrics;
#[derive(Clone, Debug)]
pub struct Sample {
pub value: f64,
}
impl Sample {
pub fn new(value: f64) -> Self {
Sample { value }
}
}
#[derive(Debug, Clone)]
pub struct SampleMetrics {
pub min: f64,
pub max: f64,
pub sum: f64,
pub sum_squared: f64,
pub count: usize,
}
impl SampleMetrics {
pub fn new(min: f64, max: f64, sum: f64, sum_squared: f64, count: usize) -> Self {
SampleMetrics {
min,
max,
sum,
sum_squared,
count,
}
}
pub fn mean(&self) -> f64 {
self.sum / (self.count as f64)
}
}
impl From<Sample> for SampleMetrics {
fn from(sample: Sample) -> Self {
SampleMetrics {
min: sample.value,
max: sample.value,
sum: sample.value,
sum_squared: sample.value * sample.value,
count: 1,
}
}
}
impl Metrics<Sample> for SampleMetrics {
fn update(&mut self, sample: &Sample) {
self.min = self.min.min(sample.value);
self.max = self.max.max(sample.value);
self.sum += sample.value;
self.sum_squared += sample.value * sample.value;
self.count += 1;
}
fn include(&mut self, metrics: &SampleMetrics) {
self.min = self.min.min(metrics.min);
self.max = self.max.max(metrics.max);
self.count += metrics.count;
self.sum += metrics.sum;
self.sum_squared += metrics.sum_squared;
}
}