Source code for boa.instantiation_base

from __future__ import annotations

from ax import Objective
from ax.core.objective import ScalarizedObjective
from ax.service.utils.instantiation import InstantiationBase

from boa.metrics.metrics import get_metric_from_config


[docs]class BoaInstantiationBase(InstantiationBase):
[docs] @classmethod def make_optimization_config( cls, objectives: dict, objective_thresholds: list[str] = None, outcome_constraints: list[str] = None, status_quo_defined: bool = False, weights: list[float] | None = None, minimize: bool = None, **kwargs, ): objective_thresholds = objective_thresholds or [] outcome_constraints = outcome_constraints or [] return cls.optimization_config_from_objectives( cls.make_objectives(objectives, weights=weights, minimize=minimize, **kwargs), cls.make_objective_thresholds(objective_thresholds, status_quo_defined), cls.make_outcome_constraints(outcome_constraints, status_quo_defined), )
[docs] @classmethod def get_metric_from_obj_config(cls, metric_opts, **kwargs): if metric_opts.get("minimize"): kwargs["lower_is_better"] = metric_opts["minimize"] metric = get_metric_from_config(metric_opts, **kwargs) return metric
[docs] @classmethod def get_metrics_from_obj_config(cls, objectives, info_only=False, **kwargs): """""" metrics = [] for metric_opts in objectives: tracker = metric_opts.get("info_only", False) metric = cls.get_metric_from_obj_config(metric_opts, **kwargs) if info_only is None: # get all metrics metrics.append(metric) elif info_only is True and tracker: # only get tracking metrics metrics.append(metric) elif info_only is False and not tracker: # only get not tracking metrics metrics.append(metric) return metrics
[docs] @classmethod def make_objectives( cls, objectives: dict, weights: list[float] | None = None, minimize: bool = None, **kwargs ) -> list[Objective]: metrics = cls.get_metrics_from_obj_config(objectives, **kwargs) kw = {} if weights: kw["weights"] = weights if minimize: kw["minimize"] = minimize output_objectives = [ScalarizedObjective(metrics=metrics, **kw)] else: output_objectives = [Objective(metric=metric, minimize=metric.lower_is_better) for metric in metrics] return output_objectives