47b5f9cec8
- Add blanket `impl Objective<V> for Fn(&mut Trial) -> Result<V, E>` so closures work directly with `optimize` - Rewrite optimize, optimize_async, optimize_parallel to accept `impl Objective<V>` with before_trial/after_trial hooks - Remove optimize_with, optimize_with_async, optimize_with_parallel - Remove max_retries and retry logic from Objective trait - Add explicit closure type annotations for HRTB inference - Convert FnMut test closures to Fn via RefCell/Cell
149 lines
4.3 KiB
Rust
149 lines
4.3 KiB
Rust
use optimizer::parameter::{FloatParam, Parameter};
|
|
use optimizer::{AttrValue, Direction, Study};
|
|
|
|
#[test]
|
|
fn set_and_get_float_attr() {
|
|
let study: Study<f64> = Study::new(Direction::Minimize);
|
|
let x = FloatParam::new(0.0, 1.0);
|
|
|
|
study
|
|
.optimize(1, |trial: &mut optimizer::Trial| {
|
|
let _ = x.suggest(trial)?;
|
|
trial.set_user_attr("score", 42.5);
|
|
assert_eq!(trial.user_attr("score"), Some(&AttrValue::Float(42.5)));
|
|
Ok::<_, optimizer::Error>(1.0)
|
|
})
|
|
.unwrap();
|
|
}
|
|
|
|
#[test]
|
|
fn set_and_get_int_attr() {
|
|
let study: Study<f64> = Study::new(Direction::Minimize);
|
|
let x = FloatParam::new(0.0, 1.0);
|
|
|
|
study
|
|
.optimize(1, |trial: &mut optimizer::Trial| {
|
|
let _ = x.suggest(trial)?;
|
|
trial.set_user_attr("epoch", 42_i64);
|
|
assert_eq!(trial.user_attr("epoch"), Some(&AttrValue::Int(42)));
|
|
Ok::<_, optimizer::Error>(1.0)
|
|
})
|
|
.unwrap();
|
|
}
|
|
|
|
#[test]
|
|
fn set_and_get_string_attr() {
|
|
let study: Study<f64> = Study::new(Direction::Minimize);
|
|
let x = FloatParam::new(0.0, 1.0);
|
|
|
|
study
|
|
.optimize(1, |trial: &mut optimizer::Trial| {
|
|
let _ = x.suggest(trial)?;
|
|
trial.set_user_attr("model", "resnet50");
|
|
assert_eq!(
|
|
trial.user_attr("model"),
|
|
Some(&AttrValue::String("resnet50".to_owned()))
|
|
);
|
|
Ok::<_, optimizer::Error>(1.0)
|
|
})
|
|
.unwrap();
|
|
}
|
|
|
|
#[test]
|
|
fn set_and_get_bool_attr() {
|
|
let study: Study<f64> = Study::new(Direction::Minimize);
|
|
let x = FloatParam::new(0.0, 1.0);
|
|
|
|
study
|
|
.optimize(1, |trial: &mut optimizer::Trial| {
|
|
let _ = x.suggest(trial)?;
|
|
trial.set_user_attr("converged", true);
|
|
assert_eq!(trial.user_attr("converged"), Some(&AttrValue::Bool(true)));
|
|
Ok::<_, optimizer::Error>(1.0)
|
|
})
|
|
.unwrap();
|
|
}
|
|
|
|
#[test]
|
|
fn attrs_propagate_to_completed_trial() {
|
|
let study: Study<f64> = Study::new(Direction::Minimize);
|
|
let x = FloatParam::new(0.0, 1.0);
|
|
|
|
study
|
|
.optimize(1, |trial: &mut optimizer::Trial| {
|
|
let _ = x.suggest(trial)?;
|
|
trial.set_user_attr("time_secs", 1.5);
|
|
trial.set_user_attr("tag", "baseline");
|
|
Ok::<_, optimizer::Error>(1.0)
|
|
})
|
|
.unwrap();
|
|
|
|
let best = study.best_trial().unwrap();
|
|
assert_eq!(best.user_attr("time_secs"), Some(&AttrValue::Float(1.5)));
|
|
assert_eq!(
|
|
best.user_attr("tag"),
|
|
Some(&AttrValue::String("baseline".to_owned()))
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn overwrite_attr_replaces_value() {
|
|
let study: Study<f64> = Study::new(Direction::Minimize);
|
|
let x = FloatParam::new(0.0, 1.0);
|
|
|
|
study
|
|
.optimize(1, |trial: &mut optimizer::Trial| {
|
|
let _ = x.suggest(trial)?;
|
|
trial.set_user_attr("key", "old");
|
|
trial.set_user_attr("key", "new");
|
|
assert_eq!(
|
|
trial.user_attr("key"),
|
|
Some(&AttrValue::String("new".to_owned()))
|
|
);
|
|
Ok::<_, optimizer::Error>(1.0)
|
|
})
|
|
.unwrap();
|
|
|
|
let best = study.best_trial().unwrap();
|
|
assert_eq!(
|
|
best.user_attr("key"),
|
|
Some(&AttrValue::String("new".to_owned()))
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn missing_attr_returns_none() {
|
|
let study: Study<f64> = Study::new(Direction::Minimize);
|
|
let x = FloatParam::new(0.0, 1.0);
|
|
|
|
study
|
|
.optimize(1, |trial: &mut optimizer::Trial| {
|
|
let _ = x.suggest(trial)?;
|
|
assert_eq!(trial.user_attr("nonexistent"), None);
|
|
Ok::<_, optimizer::Error>(1.0)
|
|
})
|
|
.unwrap();
|
|
|
|
let best = study.best_trial().unwrap();
|
|
assert_eq!(best.user_attr("nonexistent"), None);
|
|
}
|
|
|
|
#[test]
|
|
fn user_attrs_map_returns_all() {
|
|
let study: Study<f64> = Study::new(Direction::Minimize);
|
|
let x = FloatParam::new(0.0, 1.0);
|
|
|
|
study
|
|
.optimize(1, |trial: &mut optimizer::Trial| {
|
|
let _ = x.suggest(trial)?;
|
|
trial.set_user_attr("a", 1.0);
|
|
trial.set_user_attr("b", true);
|
|
assert_eq!(trial.user_attrs().len(), 2);
|
|
Ok::<_, optimizer::Error>(1.0)
|
|
})
|
|
.unwrap();
|
|
|
|
let best = study.best_trial().unwrap();
|
|
assert_eq!(best.user_attrs().len(), 2);
|
|
}
|