#![deny(unsafe_code)]
#![warn(missing_docs, rust_2018_idioms)]
#[cfg(feature = "timing")]
pub mod timing;
pub mod reports;
mod errors;
pub use errors::VerifyError;
#[cfg(feature = "timing")]
pub use timing::{Class, TimingResult, TimingTest};
pub mod prelude {
pub use crate::errors::VerifyError;
#[cfg(feature = "timing")]
pub use crate::timing::{Class, TimingResult, TimingTest};
}
pub mod stats {
#[cfg(feature = "timing")]
use crate::timing::OnlineStats;
pub fn welch_t_test(sample1: &[f64], sample2: &[f64]) -> f64 {
let n1 = sample1.len() as f64;
let n2 = sample2.len() as f64;
if n1 < 2.0 || n2 < 2.0 {
return 0.0;
}
let mean1: f64 = sample1.iter().sum::<f64>() / n1;
let mean2: f64 = sample2.iter().sum::<f64>() / n2;
let var1: f64 = sample1.iter().map(|x| (x - mean1).powi(2)).sum::<f64>() / (n1 - 1.0);
let var2: f64 = sample2.iter().map(|x| (x - mean2).powi(2)).sum::<f64>() / (n2 - 1.0);
let se = (var1 / n1 + var2 / n2).sqrt();
if se == 0.0 {
0.0 } else {
(mean1 - mean2) / se
}
}
#[cfg(feature = "timing")]
pub fn welch_t_online(stats1: &OnlineStats, stats2: &OnlineStats) -> f64 {
let n1 = stats1.count() as f64;
let n2 = stats2.count() as f64;
if n1 < 2.0 || n2 < 2.0 {
return 0.0;
}
let mean1 = stats1.mean();
let mean2 = stats2.mean();
let var1 = stats1.variance();
let var2 = stats2.variance();
let se = (var1 / n1 + var2 / n2).sqrt();
if se == 0.0 { 0.0 } else { (mean1 - mean2) / se }
}
pub const TIMING_LEAK_THRESHOLD: f64 = 4.5;
pub const TIMING_LEAK_THRESHOLD_STRICT: f64 = 3.0;
}