Source code for smac.initial_design.factorial_design

import itertools

import numpy as np
from ConfigSpace.configuration_space import Configuration
from ConfigSpace.hyperparameters import (
    CategoricalHyperparameter,
    Constant,
    NumericalHyperparameter,
    OrdinalHyperparameter,
)
from ConfigSpace.util import deactivate_inactive_hyperparameters

from smac.initial_design.initial_design import InitialDesign

__author__ = "Marius Lindauer"
__copyright__ = "Copyright 2016, ML4AAD"
__license__ = "3-clause BSD"


[docs]class FactorialInitialDesign(InitialDesign): """Factorial initial design. Attributes ---------- configs : List[Configuration] List of configurations to be evaluated Don't pass configs to the constructor; otherwise factorial design is overwritten """ def _select_configurations(self) -> Configuration: """Selects a single configuration to run. Returns ------- config: Configuration initial incumbent configuration """ params = self.cs.get_hyperparameters() values = [] mid = [] for param in params: if isinstance(param, Constant): v = [param.value] mid.append(param.value) elif isinstance(param, NumericalHyperparameter): v = [param.lower, param.upper] mid.append(np.average([param.lower, param.upper])) elif isinstance(param, CategoricalHyperparameter): v = list(param.choices) mid.append(param.choices[0]) elif isinstance(param, OrdinalHyperparameter): v = [param.sequence[0], param.sequence[-1]] length = len(param.sequence) mid.append(param.sequence[int(length / 2)]) values.append(v) factorial_design = itertools.product(*values) self.logger.debug("Initial Design") configs = [self.cs.get_default_configuration()] # add middle point in space conf_dict = dict([(p.name, v) for p, v in zip(params, mid)]) middle_conf = deactivate_inactive_hyperparameters(conf_dict, self.cs) configs.append(middle_conf) # add corner points for design in factorial_design: conf_dict = dict([(p.name, v) for p, v in zip(params, design)]) conf = deactivate_inactive_hyperparameters(conf_dict, self.cs) conf.origin = "Factorial Design" configs.append(conf) self.logger.debug(conf) self.logger.debug("Size of factorial design: %d" % (len(configs))) return configs