use std::collections::VecDeque;
#[derive(Debug, Clone)]
pub struct AcceptanceCounter {
window_size: usize,
buffer: std::collections::VecDeque<u8>,
n_accepted: usize,
}
impl Default for AcceptanceCounter {
fn default() -> Self {
Self::new(100)
}
}
impl AcceptanceCounter {
pub fn new(window_size: usize) -> Self {
Self {
window_size,
buffer: VecDeque::with_capacity(window_size),
n_accepted: 0,
}
}
pub fn enqueue(&mut self, accepted: bool) {
if self.buffer.len() == self.window_size {
let old = self.buffer.pop_front().unwrap();
self.n_accepted -= old as usize;
}
let value = accepted as u8;
self.buffer.push_back(value);
self.n_accepted += value as usize;
}
pub fn acceptance_ratio(&self) -> f64 {
let total = self.buffer.len();
if total == 0 {
0.0
} else {
self.n_accepted as f64 / total as f64
}
}
}