///|
/// Fixed workloads make benchmark output comparable across revisions.
fn gaussian_benchmark_values() -> Array[Double] {
let values = []
for index in 0..<512 {
let level = if index < 256 { 0.0 } else { 4.0 }
values.push(level + (index % 7).to_double() * 0.03)
}
values
}
///|
fn poisson_benchmark_values() -> Array[Int] {
let values = []
for index in 0..<512 {
if index < 256 {
values.push(index % 3)
} else {
values.push(20 + index % 5)
}
}
values
}
///|
test (bench : @bench.T) {
let gaussian_values = gaussian_benchmark_values()
let poisson_values = poisson_benchmark_values()
let gaussian_model = GaussianModel::new(0.0, 1.0, 0.25).unwrap()
let poisson_model = PoissonModel::new(1.0, 1.0).unwrap()
bench.bench(name="gaussian_bocpd_512x64", fn() {
let detector = Detector::new(Config::new(0.04, 64, gaussian_model).unwrap())
bench.keep(detector.replay(gaussian_values).unwrap().length())
})
bench.bench(name="poisson_bocpd_512x64", fn() {
let detector = PoissonDetector::new(
PoissonConfig::new(0.04, 64, poisson_model).unwrap(),
)
bench.keep(detector.replay(poisson_values).unwrap().length())
})
}