use optimizer::prelude::*;
fn main() -> optimizer::Result<()> {
let study: Study<f64> = Study::new(Direction::Minimize);
let x = FloatParam::new(-5.0, 5.0).name("x");
let y = FloatParam::new(-5.0, 5.0).name("y");
for batch in 0..3 {
let batch_size = 5;
let mut trials = Vec::with_capacity(batch_size);
for _ in 0..batch_size {
let mut trial = study.ask();
let xv = x.suggest(&mut trial)?;
let yv = y.suggest(&mut trial)?;
trials.push((trial, xv, yv));
}
for (trial, xv, yv) in trials {
let value = xv * xv + yv * yv;
study.tell(trial, Ok::<_, &str>(value));
}
println!(
"Batch {}: evaluated {batch_size} trials (total: {})",
batch + 1,
study.n_trials(),
);
}
let best = study.best_trial()?;
println!(
"Best: f({:.3}, {:.3}) = {:.6}",
best.get(&x).unwrap(),
best.get(&y).unwrap(),
best.value,
);
Ok(())
}