radiate_core/stats/
view.rs1use 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}