feat(traits,algorithms): add PartialProblem trait and Hyperband

Multi-fidelity optimization. Hyperband (Li et al. 2017) and its
foundation Successive Halving (Karnin et al. 2013) tune
hyperparameters by allocating *uneven* compute across configurations:
sample many cheap-to-evaluate-at-low-budget configs, then promote
the survivors to higher budgets. Crucial for ML hyperparameter
tuning where each evaluation is a partial training run.

This requires a new trait — `Problem::evaluate` is a single-shot
black box, but Hyperband needs to evaluate the SAME decision at
different fidelity budgets:

  pub trait PartialProblem {
      type Decision: Clone;
      fn objectives(&self) -> ObjectiveSpace;
      fn evaluate_at_budget(&self, decision: &Self::Decision,
                            budget: f64) -> Evaluation;
  }

`PartialProblem` is intentionally NOT a sub-trait of `Problem`.
Implementors who already have a `Problem` and want their
`evaluate_at_budget` to ignore budget can write a one-line wrapper.

`Hyperband` is the optimizer:

  pub struct HyperbandConfig {
      max_budget: f64, eta: f64, max_brackets: usize, seed: u64,
  }
  pub struct Hyperband<I> { config, initializer, ... }

Single-objective only. The decision sampler is an `Initializer<D>` so
it works the same way as every other heuropt algorithm. Generic over
decision type.
This commit is contained in:
2026-05-05 09:59:03 -06:00
parent 27f80fb2a3
commit bfc2875d62
5 changed files with 332 additions and 2 deletions
+2
View File
@@ -10,6 +10,7 @@ pub mod genetic_algorithm;
pub mod grea;
pub mod hill_climber;
pub mod hype;
pub mod hyperband;
pub mod ibea;
pub mod ipop_cma_es;
pub mod knea;
@@ -44,6 +45,7 @@ pub use genetic_algorithm::*;
pub use grea::*;
pub use hill_climber::*;
pub use hype::*;
pub use hyperband::*;
pub use ibea::*;
pub use ipop_cma_es::*;
pub use knea::*;