#![allow(missing_docs)] use criterion::{Criterion, criterion_group, criterion_main};
use std::hint::black_box;
use bobyqa::{Bobyqa, Config};
fn rosenbrock(x: &[f64]) -> f64 {
let mut f = 0.0;
for i in 0..x.len() - 1 {
let a = x[i + 1] - x[i] * x[i];
let b = 1.0 - x[i];
f += 100.0 * a * a + b * b;
}
f
}
const CASES: &[(usize, usize)] = &[(2, 5), (3, 6), (6, 10), (3, 7), (4, 9), (5, 11)];
fn bench_minimize(c: &mut Criterion) {
for &(n, npt) in CASES {
let config = Config {
npt,
rho_begin: 0.5,
rho_end: 1e-6,
..Config::new(n)
};
let mut solver = Bobyqa::new(n, config).unwrap();
let lower = vec![-5.0; n];
let upper = vec![5.0; n];
let mut x = vec![0.0; n];
c.bench_function(&format!("minimize/rosen/n{n}_npt{npt}"), |b| {
b.iter(|| {
x.fill(0.0);
let out = solver.minimize(rosenbrock, black_box(&mut x), &lower, &upper);
black_box(out.f)
});
});
let mut solver = Bobyqa::new(n, config).unwrap();
let upper_clip = vec![0.9; n];
c.bench_function(&format!("minimize/rosen_clip/n{n}_npt{npt}"), |b| {
b.iter(|| {
x.fill(0.0);
let out = solver.minimize(rosenbrock, black_box(&mut x), &lower, &upper_clip);
black_box(out.f)
});
});
}
}
criterion_group!(benches, bench_minimize);
criterion_main!(benches);