use crate::error::{CalculationError, Result};
#[inline(always)]
pub(crate) fn calculate_confidence(interactions: u32, confidence_k: f64) -> Result<f64> {
let n = interactions as f64;
let confidence = n / (n + confidence_k);
if confidence < 0.0 || confidence > 1.0 {
return Err(CalculationError::ConfidenceOutOfBounds(confidence).into());
}
Ok(confidence)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_zero_interactions() {
let confidence = calculate_confidence(0, 15.0).unwrap();
assert_eq!(confidence, 0.0);
}
#[test]
fn test_confidence_at_k() {
let confidence = calculate_confidence(15, 15.0).unwrap();
assert!((confidence - 0.5).abs() < 0.001);
let confidence = calculate_confidence(30, 30.0).unwrap();
assert!((confidence - 0.5).abs() < 0.001);
}
#[test]
fn test_confidence_growth() {
let k = 15.0;
let conf_10 = calculate_confidence(10, k).unwrap();
let conf_50 = calculate_confidence(50, k).unwrap();
let conf_100 = calculate_confidence(100, k).unwrap();
let conf_1000 = calculate_confidence(1000, k).unwrap();
assert!(conf_10 < conf_50);
assert!(conf_50 < conf_100);
assert!(conf_100 < conf_1000);
assert!((conf_10 - 0.4).abs() < 0.01); assert!((conf_50 - 0.769).abs() < 0.01); assert!((conf_100 - 0.869).abs() < 0.01); assert!((conf_1000 - 0.985).abs() < 0.01); }
#[test]
fn test_different_k_values() {
let interactions = 100;
let conf_k5 = calculate_confidence(interactions, 5.0).unwrap();
let conf_k15 = calculate_confidence(interactions, 15.0).unwrap();
let conf_k30 = calculate_confidence(interactions, 30.0).unwrap();
assert!(conf_k5 > conf_k15);
assert!(conf_k15 > conf_k30);
assert!((conf_k5 - 0.952).abs() < 0.01); assert!((conf_k15 - 0.869).abs() < 0.01); assert!((conf_k30 - 0.769).abs() < 0.01); }
#[test]
fn test_confidence_bounds() {
let k = 15.0;
for interactions in [0, 1, 10, 100, 1000, 10000, u32::MAX] {
let confidence = calculate_confidence(interactions, k).unwrap();
assert!(confidence >= 0.0);
assert!(confidence <= 1.0);
}
}
#[test]
fn test_very_small_k() {
let conf = calculate_confidence(1, 0.1).unwrap();
assert!((conf - 0.909).abs() < 0.01);
let conf = calculate_confidence(10, 0.1).unwrap();
assert!((conf - 0.990).abs() < 0.01); }
#[test]
fn test_very_large_k() {
let conf = calculate_confidence(100, 1000.0).unwrap();
assert!((conf - 0.091).abs() < 0.01);
let conf = calculate_confidence(1000, 1000.0).unwrap();
assert!((conf - 0.5).abs() < 0.01); }
}