Source code for boa.ax_instantiation_utils
from __future__ import annotations
import copy
import time
from ax import Experiment, Runner, SearchSpace
from ax.modelbridge.dispatch_utils import choose_generation_strategy
from ax.modelbridge.generation_strategy import GenerationStep, GenerationStrategy
from ax.modelbridge.registry import Models
from ax.service.scheduler import Scheduler, SchedulerOptions
from boa.instantiation_base import BoaInstantiationBase
from boa.utils import get_dictionary_from_callable
[docs]def instantiate_search_space_from_json(
parameters: list | None = None, parameter_constraints: list | None = None
) -> SearchSpace:
parameters = parameters if parameters is not None else []
parameter_constraints = parameter_constraints if parameter_constraints is not None else []
return BoaInstantiationBase.make_search_space(parameters, parameter_constraints)
[docs]def get_generation_strategy(config: dict, experiment: Experiment = None):
if config.get("steps"): # if they are explicitly defining the steps, use those to make gen strat
return generation_strategy_from_config(config=config, experiment=experiment)
# else auto generate the gen strat
return choose_generation_strategy_from_experiment(experiment=experiment, config=config)
[docs]def generation_strategy_from_config(config: dict, experiment: Experiment = None):
config_ = copy.deepcopy(config)
for i, step in enumerate(config_["steps"]):
try:
step["model"] = Models[step["model"]]
except KeyError:
step["model"] = Models(step["model"])
config_["steps"][i] = GenerationStep(**step)
gs = GenerationStrategy(**get_dictionary_from_callable(GenerationStrategy.__init__, config_))
if experiment:
gs.experiment = experiment
return gs
[docs]def choose_generation_strategy_from_experiment(experiment: Experiment, config: dict) -> GenerationStrategy:
return choose_generation_strategy(
search_space=experiment.search_space,
**get_dictionary_from_callable(choose_generation_strategy, config),
)
[docs]def get_scheduler(
experiment: Experiment,
generation_strategy: GenerationStrategy = None,
scheduler_options: SchedulerOptions = None,
config: dict = None,
):
scheduler_options = scheduler_options or SchedulerOptions(**config["optimization_options"]["scheduler"])
if generation_strategy is None:
if (
"total_trials" in config["optimization_options"]["scheduler"]
and "num_trials" not in config["optimization_options"]["generation_strategy"]
):
config["optimization_options"]["generation_strategy"]["num_trials"] = config["optimization_options"][
"scheduler"
]["total_trials"]
generation_strategy = get_generation_strategy(
config=config["optimization_options"]["generation_strategy"], experiment=experiment
)
# db_settings = DBSettings(
# url="sqlite:///foo.db",
# decoder=Decoder(config=SQAConfig()),
# encoder=Encoder(config=SQAConfig()),
# )
# init_engine_and_session_factory(url=db_settings.url)
# engine = get_engine()
# create_all_tables(engine)
return Scheduler(
experiment=experiment,
generation_strategy=generation_strategy,
options=scheduler_options,
# db_settings=db_settings,
)
[docs]def get_experiment(
config: dict,
runner: Runner,
wrapper=None,
):
opt_options = config["optimization_options"]
search_space = instantiate_search_space_from_json(config.get("parameters"), config.get("parameter_constraints"))
optimization_config = BoaInstantiationBase.make_optimization_config(
**get_dictionary_from_callable(BoaInstantiationBase.make_optimization_config, opt_options["objective_options"]),
wrapper=wrapper,
)
if "name" not in opt_options["experiment"]:
if "name" in opt_options:
opt_options["experiment"]["name"] = opt_options["name"]
else:
opt_options["experiment"]["name"] = time.time()
return Experiment(
search_space=search_space,
optimization_config=optimization_config,
runner=runner,
**get_dictionary_from_callable(Experiment.__init__, opt_options["experiment"]),
)