ee59c9cdd0
- Split pruning_and_callbacks into pruning and early_stopping - Split advanced_features into async_parallel, journal_storage, ask_and_tell, multi_objective - Each example now requires only its own feature flag - Trim sampler_comparison winner logic and verbose header - Update CI workflow and README to match new example names
52 lines
1.5 KiB
Rust
52 lines
1.5 KiB
Rust
//! Ask-and-tell interface — decouple sampling from evaluation.
|
|
//!
|
|
//! Use `ask()` to get a trial with sampled parameters, evaluate it however
|
|
//! you like (workers, GPUs, external processes), then `tell()` the result.
|
|
//! This is useful for batch evaluation or custom scheduling.
|
|
//!
|
|
//! Run with: `cargo run --example ask_and_tell`
|
|
|
|
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);
|
|
|
|
// ask() creates trials with sampled parameters
|
|
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));
|
|
}
|
|
|
|
// Evaluate the batch (could be sent to workers, GPUs, etc.)
|
|
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(())
|
|
}
|