Skip to main content

radiate_core/stats/
view.rs

1use radiate_utils::{Quantile, Statistic};
2
3pub struct MetricView<'a, T> {
4    pub(super) name: &'a str,
5    pub(super) statistic: &'a Statistic,
6    pub(super) samples: Option<&'a [f32]>,
7    pub(super) mapper: fn(f32) -> T,
8}
9
10impl<'a, T> MetricView<'a, T> {
11    pub fn name(&self) -> &str {
12        self.name
13    }
14
15    pub fn count(&self) -> u32 {
16        self.statistic.count()
17    }
18
19    pub fn last(&self) -> T {
20        (self.mapper)(self.statistic.last_value())
21    }
22
23    pub fn sum(&self) -> T {
24        (self.mapper)(self.statistic.sum())
25    }
26
27    pub fn mean(&self) -> T {
28        (self.mapper)(self.statistic.mean())
29    }
30
31    pub fn var(&self) -> T {
32        (self.mapper)(self.statistic.variance().unwrap_or_default())
33    }
34
35    pub fn stddev(&self) -> T {
36        (self.mapper)(self.statistic.std_dev().unwrap_or_default())
37    }
38
39    pub fn skewness(&self) -> T {
40        (self.mapper)(self.statistic.skewness().unwrap_or_default())
41    }
42
43    pub fn kurtosis(&self) -> T {
44        (self.mapper)(self.statistic.kurtosis().unwrap_or_default())
45    }
46
47    pub fn min(&self) -> T {
48        (self.mapper)(self.statistic.min())
49    }
50
51    pub fn max(&self) -> T {
52        (self.mapper)(self.statistic.max())
53    }
54
55    pub fn quantile(&self, q: f32) -> Option<T> {
56        if let Some(samples) = &self.samples {
57            let mut quant = Quantile::new(q);
58            for &value in samples.iter() {
59                if !value.is_finite() {
60                    continue;
61                }
62
63                quant.add(value);
64            }
65
66            quant.value().map(self.mapper)
67        } else {
68            None
69        }
70    }
71
72    pub fn quantiles(&self, quantiles: &[f32]) -> Option<Vec<T>> {
73        if let Some(samples) = &self.samples {
74            let mut quants: Vec<Quantile> = quantiles.iter().map(|&q| Quantile::new(q)).collect();
75            for &value in samples.iter() {
76                if !value.is_finite() {
77                    continue;
78                }
79
80                for quant in quants.iter_mut() {
81                    quant.add(value);
82                }
83            }
84
85            quants
86                .iter()
87                .map(|quant| quant.value().map(self.mapper))
88                .collect()
89        } else {
90            None
91        }
92    }
93
94    pub fn samples(&self) -> Option<&[f32]> {
95        self.samples
96    }
97}