feat: unify optimize and optimize_with via blanket Objective impl

- 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
This commit is contained in:
Manuel Raimann
2026-02-12 13:09:14 +01:00
parent c20a53dfba
commit 47b5f9cec8
41 changed files with 316 additions and 793 deletions
+8 -8
View File
@@ -7,7 +7,7 @@ fn set_and_get_float_attr() {
let x = FloatParam::new(0.0, 1.0);
study
.optimize(1, |trial| {
.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)));
@@ -22,7 +22,7 @@ fn set_and_get_int_attr() {
let x = FloatParam::new(0.0, 1.0);
study
.optimize(1, |trial| {
.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)));
@@ -37,7 +37,7 @@ fn set_and_get_string_attr() {
let x = FloatParam::new(0.0, 1.0);
study
.optimize(1, |trial| {
.optimize(1, |trial: &mut optimizer::Trial| {
let _ = x.suggest(trial)?;
trial.set_user_attr("model", "resnet50");
assert_eq!(
@@ -55,7 +55,7 @@ fn set_and_get_bool_attr() {
let x = FloatParam::new(0.0, 1.0);
study
.optimize(1, |trial| {
.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)));
@@ -70,7 +70,7 @@ fn attrs_propagate_to_completed_trial() {
let x = FloatParam::new(0.0, 1.0);
study
.optimize(1, |trial| {
.optimize(1, |trial: &mut optimizer::Trial| {
let _ = x.suggest(trial)?;
trial.set_user_attr("time_secs", 1.5);
trial.set_user_attr("tag", "baseline");
@@ -92,7 +92,7 @@ fn overwrite_attr_replaces_value() {
let x = FloatParam::new(0.0, 1.0);
study
.optimize(1, |trial| {
.optimize(1, |trial: &mut optimizer::Trial| {
let _ = x.suggest(trial)?;
trial.set_user_attr("key", "old");
trial.set_user_attr("key", "new");
@@ -117,7 +117,7 @@ fn missing_attr_returns_none() {
let x = FloatParam::new(0.0, 1.0);
study
.optimize(1, |trial| {
.optimize(1, |trial: &mut optimizer::Trial| {
let _ = x.suggest(trial)?;
assert_eq!(trial.user_attr("nonexistent"), None);
Ok::<_, optimizer::Error>(1.0)
@@ -134,7 +134,7 @@ fn user_attrs_map_returns_all() {
let x = FloatParam::new(0.0, 1.0);
study
.optimize(1, |trial| {
.optimize(1, |trial: &mut optimizer::Trial| {
let _ = x.suggest(trial)?;
trial.set_user_attr("a", 1.0);
trial.set_user_attr("b", true);