Skip to main content

flow_utils/common/
mod.rs

1//! Common utilities for flow-utils
2
3/// Calculate standard deviation
4pub fn standard_deviation(data: &[f64]) -> Result<f64, String> {
5    if data.is_empty() {
6        return Err("Empty data".to_string());
7    }
8
9    let mean = data.iter().sum::<f64>() / data.len() as f64;
10    let variance = data.iter().map(|&x| (x - mean).powi(2)).sum::<f64>() / data.len() as f64;
11
12    Ok(variance.sqrt())
13}
14
15/// Calculate interquartile range (IQR = Q3 - Q1)
16pub fn interquartile_range(data: &[f64]) -> Result<f64, String> {
17    let mut sorted = data.to_vec();
18    sorted.sort_by(|a, b| a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Equal));
19
20    let n = sorted.len();
21    if n < 4 {
22        return Ok(sorted[n - 1] - sorted[0]);
23    }
24
25    let q1_idx = n / 4;
26    let q3_idx = 3 * n / 4;
27
28    Ok(sorted[q3_idx] - sorted[q1_idx])
29}
30
31/// Gaussian kernel function
32#[inline]
33pub fn gaussian_kernel(u: f64) -> f64 {
34    const INV_SQRT_2PI: f64 = 0.3989422804014327; // 1/sqrt(2*pi)
35    INV_SQRT_2PI * (-0.5 * u * u).exp()
36}