#![deny(missing_docs)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Outcome {
AWins,
BWins,
Tie,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Summary {
pub n: u64,
pub a_wins: u64,
pub b_wins: u64,
pub ties: u64,
pub a_win_rate_excl_ties: f64,
pub ci95_half_width: f64,
pub a_meaningfully_ahead: bool,
}
pub fn summarize(outcomes: &[Outcome]) -> Summary {
let n = outcomes.len() as u64;
let a_wins = outcomes.iter().filter(|o| **o == Outcome::AWins).count() as u64;
let b_wins = outcomes.iter().filter(|o| **o == Outcome::BWins).count() as u64;
let ties = outcomes.iter().filter(|o| **o == Outcome::Tie).count() as u64;
let decided = a_wins + b_wins;
let p = if decided == 0 {
0.5
} else {
a_wins as f64 / decided as f64
};
let ci = if decided == 0 {
0.0
} else {
1.96 * (p * (1.0 - p) / decided as f64).sqrt()
};
let ahead = decided > 0 && (p - ci) > 0.5;
Summary {
n,
a_wins,
b_wins,
ties,
a_win_rate_excl_ties: p,
ci95_half_width: ci,
a_meaningfully_ahead: ahead,
}
}