use super::{sorted_finite, StatsError};
#[derive(Debug, Clone, PartialEq)]
pub struct Ecdf {
pub x: Vec<f64>,
pub p: Vec<f64>,
pub n: usize,
}
pub fn ecdf(data: &[f64]) -> Result<Ecdf, StatsError> {
let sorted = sorted_finite(data);
if sorted.is_empty() {
return Err(StatsError::EmptyInput);
}
let n = sorted.len();
let mut x = Vec::new();
let mut p = Vec::new();
let mut i = 0;
while i < n {
let v = sorted[i];
while i < n && sorted[i] == v {
i += 1;
}
x.push(v);
p.push(i as f64 / n as f64);
}
Ok(Ecdf { x, p, n })
}
pub fn dkw_epsilon(n: usize, alpha: f64) -> f64 {
if n == 0 {
return f64::INFINITY;
}
((2.0 / alpha).ln() / (2.0 * n as f64)).sqrt()
}