This is an implementation of a GP using the MUMBO acquisition function through emukit, along with some other changes in order to share functionality among all emukit based optimizers.
Upcoming: FABOLAS with MUMBO acquisition. Done, read below for update.
Some more very specific design decisions that require your opinion @KEggensperger :
Rather than being a Multi-Fidelity acquisition, since MUMBO is Multi-Task BO, it treats every fidelity value as a separate task. As per the example code, it also defines a separate kernel for every such task. Here, the kernels are combined such that ki(x, x')=kerr(x, x') + ρki-1(x, x'), for i ϵ [2, 3, ..., NS] and NS is the number of individual tasks that the fidelity parameter is divided into. Are we interested in controlling the various settings related to the kernels here? If yes, how would you prefer they be exposed - a single setting for all kernels, or something different?
https://github.com/automl/HPOBenchExperimentUtils/blob/d08dbb3e72959de7d8e6a2c39f00567f67c827de/HPOBenchExperimentUtils/optimizer/mumbo.py#L144-L151
Small note on the cost estimate. I went back to check on our wrapper for dragonfly and noticed that my implementation there does add a small value of 1e-6 to prevent division by zero errors. A big difference there, though, is that since dragonfly does work on continuous fidelities, I have tried to always have a similarly linear scale of costs across fidelity types. Thus, I have now changed the cost estimation in MUMBO to be c(i) = i / NS, effectively equivalent to dragonfly's way of handling integer fidelities (but for minor numerical differences).
This is an implementation of a GP using the MUMBO acquisition function through emukit, along with some other changes in order to share functionality among all emukit based optimizers.
Upcoming: FABOLAS with MUMBO acquisition.Done, read below for update.Some more very specific design decisions that require your opinion @KEggensperger :
Update: More notes regarding FABOLAS with MUMBO: