pub fn suggested_window_cap(throughput: u64, change_rate: f64) -> usize {
let change_rate = if change_rate.is_finite() && change_rate > 0.0 {
change_rate.min(1.0)
} else {
0.01 };
let t = (throughput as f64).max(1.0);
let cap = (t / change_rate).sqrt().round() as usize;
cap.clamp(10, 10_000)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn suggested_window_cap_is_clamped() {
assert_eq!(suggested_window_cap(0, 0.1), 10);
assert_eq!(suggested_window_cap(1_000_000, 0.000_01), 10_000);
}
#[test]
fn suggested_window_cap_increases_with_throughput() {
let low = suggested_window_cap(100, 0.05);
let high = suggested_window_cap(10_000, 0.05);
assert!(high >= low, "higher throughput should yield larger window");
}
#[test]
fn suggested_window_cap_decreases_with_higher_change_rate() {
let slow = suggested_window_cap(1000, 0.01);
let fast = suggested_window_cap(1000, 0.5);
assert!(
slow >= fast,
"more frequent changes → smaller optimal window"
);
}
}