simplebench_runtime/
statistics.rs1pub fn mean(values: &[f64]) -> f64 {
8 if values.is_empty() {
9 return 0.0;
10 }
11 values.iter().sum::<f64>() / values.len() as f64
12}
13
14pub fn variance(values: &[f64]) -> f64 {
16 if values.len() < 2 {
17 return 0.0;
18 }
19
20 let m = mean(values);
21 values.iter().map(|&x| (x - m).powi(2)).sum::<f64>() / values.len() as f64
22}
23
24pub fn standard_deviation(values: &[f64]) -> f64 {
26 variance(values).sqrt()
27}
28
29pub fn z_score(value: f64, mean: f64, stddev: f64) -> f64 {
31 if stddev < 1e-10 {
32 return 0.0;
34 }
35 (value - mean) / stddev
36}
37
38pub fn confidence_interval(mean: f64, stddev: f64, confidence_level: f64) -> (f64, f64) {
46 let z_critical = if (confidence_level - 0.90).abs() < 0.01 {
48 1.282 } else if (confidence_level - 0.95).abs() < 0.01 {
50 1.645 } else if (confidence_level - 0.99).abs() < 0.01 {
52 2.326 } else {
54 1.96
56 };
57
58 let margin = z_critical * stddev;
59 (mean - margin, mean + margin)
60}
61
62#[cfg(test)]
63mod tests {
64 use super::*;
65
66 #[test]
67 fn test_mean() {
68 let values = vec![1.0, 2.0, 3.0, 4.0, 5.0];
69 assert_eq!(mean(&values), 3.0);
70
71 let empty: Vec<f64> = vec![];
72 assert_eq!(mean(&empty), 0.0);
73 }
74
75 #[test]
76 fn test_variance() {
77 let values = vec![2.0, 4.0, 4.0, 4.0, 5.0, 5.0, 7.0, 9.0];
78 let var = variance(&values);
79 assert!((var - 4.0).abs() < 0.01);
81 }
82
83 #[test]
84 fn test_standard_deviation() {
85 let values = vec![2.0, 4.0, 4.0, 4.0, 5.0, 5.0, 7.0, 9.0];
86 let std = standard_deviation(&values);
87 assert!((std - 2.0).abs() < 0.01);
89 }
90
91 #[test]
92 fn test_z_score() {
93 let z = z_score(10.0, 5.0, 2.0);
94 assert_eq!(z, 2.5);
95
96 let z_zero = z_score(10.0, 5.0, 0.0);
98 assert_eq!(z_zero, 0.0);
99 }
100
101 #[test]
102 fn test_confidence_interval() {
103 let (lower, upper) = confidence_interval(100.0, 10.0, 0.95);
104 assert!((lower - 83.55).abs() < 1.0);
106 assert!((upper - 116.45).abs() < 1.0);
107 }
108}