pub fn mean(values: &[f32]) -> f32 {
if values.is_empty() {
return 0.0;
}
let mut acc = 0.0f32;
for &v in values {
acc += v;
}
acc / values.len() as f32
}
pub fn variance(values: &[f32]) -> f32 {
if values.len() < 2 {
return 0.0;
}
let m = mean(values);
let mut acc = 0.0f32;
for &v in values {
let d = v - m;
acc += d * d;
}
acc / values.len() as f32
}
pub fn min_max(values: &[f32]) -> Option<(f32, f32)> {
if values.is_empty() {
return None;
}
let mut min_v = values[0];
let mut max_v = values[0];
for &v in &values[1..] {
if v < min_v {
min_v = v;
}
if v > max_v {
max_v = v;
}
}
Some((min_v, max_v))
}