use std::hint::black_box; use criterion::{criterion_group, criterion_main, Criterion}; use rota_lib::{ config::{ToxicPair, UserConfig}, resident::Resident, schedule::{MonthlySchedule, ShiftType}, scheduler::Scheduler, slot::Day, workload::WorkloadTracker, }; fn criterion_benchmark(c: &mut Criterion) { let config = maximal_config(); let scheduler = Scheduler::new_with_config(config); c.bench_function("scheduler run", |b| { b.iter(|| { let mut schedule = MonthlySchedule::new(); let mut tracker = WorkloadTracker::default(); let result = scheduler.run(&mut schedule, &mut tracker); black_box(result) }) }); } fn maximal_config() -> UserConfig { UserConfig::default() .with_holidays(vec![2, 3, 10, 11, 12, 25]) .with_residents(vec![ Resident::new(1, "R1").with_max_shifts(3), Resident::new(2, "R2").with_max_shifts(4), Resident::new(3, "R3").with_reduced_load(), Resident::new(4, "R4").with_allowed_types(vec![ShiftType::Closed]), Resident::new(5, "R5") .with_allowed_types(vec![ShiftType::OpenFirst, ShiftType::OpenSecond]), Resident::new(6, "R6").with_negative_shifts(vec![Day(5), Day(15), Day(25)]), Resident::new(7, "R7") .with_allowed_types(vec![ShiftType::OpenFirst, ShiftType::OpenSecond]), Resident::new(8, "R8"), Resident::new(9, "R9"), Resident::new(10, "R10").with_reduced_load(), ]) .with_toxic_pairs(vec![ ToxicPair::new(1, 2), ToxicPair::new(3, 4), ToxicPair::new(3, 5), ToxicPair::new(7, 8), ]) } criterion_group!(benches, criterion_benchmark); criterion_main!(benches);