use contract_bridge::FullDeal;
use contract_bridge::deck::full_deal;
use core::hint::black_box;
use core::time::Duration;
use criterion::{BatchSize, Criterion, Throughput, criterion_group, criterion_main};
use pons_dds::{solve_deal, solve_deals};
use rand::SeedableRng;
use rand::rngs::SmallRng;
fn deals(seed: u64, n: usize) -> Vec<FullDeal> {
let mut rng = SmallRng::seed_from_u64(seed);
(0..n).map(|_| full_deal(&mut rng)).collect()
}
fn bench_solve_deal(c: &mut Criterion) {
let mut rng = SmallRng::seed_from_u64(0);
c.bench_function("solve_deal", |b| {
b.iter_batched(
|| full_deal(&mut rng),
|deal| black_box(solve_deal(black_box(deal))),
BatchSize::SmallInput,
);
});
}
const SIZES: &[usize] = &[32, 200];
fn bench_solve_deals(c: &mut Criterion) {
let mut group = c.benchmark_group("solve_deals");
group.sample_size(10);
group.measurement_time(Duration::from_secs(30));
for &n in SIZES {
let ds = deals(0, n);
group.throughput(Throughput::Elements(n as u64));
group.bench_function(n.to_string(), |b| {
b.iter(|| black_box(solve_deals(black_box(&ds))));
});
}
group.finish();
}
criterion_group!(benches, bench_solve_deal, bench_solve_deals);
criterion_main!(benches);