mcai_benchmark/report/
statistics.rs

1use crate::report::Iteration;
2use serde::Serialize;
3
4#[derive(Clone, Default, Serialize)]
5struct StatsSerie {
6  values: Vec<f64>,
7}
8
9impl StatsSerie {
10  fn new(capacity: usize) -> Self {
11    StatsSerie {
12      values: Vec::with_capacity(capacity),
13    }
14  }
15
16  pub fn push(&mut self, value: f64) {
17    self.values.push(value);
18  }
19}
20
21/// Structure containing statistics showed on report graphs.
22#[derive(Clone, Default, Serialize)]
23pub struct StatsSummary {
24  q1: StatsSerie,
25  q2: StatsSerie,
26  q3: StatsSerie,
27}
28
29impl StatsSummary {
30  fn new(capacity: usize) -> Self {
31    StatsSummary {
32      q1: StatsSerie::new(capacity),
33      q2: StatsSerie::new(capacity),
34      q3: StatsSerie::new(capacity),
35    }
36  }
37}
38
39impl From<Vec<Iteration>> for StatsSummary {
40  fn from(series: Vec<Iteration>) -> Self {
41    let number_of_iterations = series.len();
42    let number_of_samples = series[0].len();
43
44    let mut summary = StatsSummary::new(number_of_samples);
45
46    for j in 0..number_of_samples {
47      let mut values: Vec<f64> = series.iter().map(|s| s[j]).collect();
48      values.sort_by(|a, b| a.partial_cmp(b).unwrap());
49
50      summary.q1.push(values[number_of_iterations / 4_usize]);
51      summary.q2.push(values[number_of_iterations / 2_usize]);
52      summary.q3.push(values[number_of_iterations / 4 * 3_usize]);
53    }
54    summary
55  }
56}