from collections import Counter#
Description#
from smac.initial_design import LatinHypercubeInitialDesign, RandomInitialDesign, \ AbstractInitialDesign
from typing import Callable
from smac.scenario import Scenario
def make_scenario() -> Callable: def _make( configspace: ConfigurationSpace, deterministic: bool = False, use_multi_objective: bool = False, n_objectives: int = 2, use_instances: bool = False, n_instances: int = 3, n_instance_features: int = 3, min_budget: int = 2, max_budget: int = 5, n_workers: int = 1, n_trials: int = 100, use_default_config: bool = False, ) -> Scenario: objectives = "cost" if use_multi_objective: objectives = [] for i in range(n_objectives): objectives.append(f"cost{i+1}")
instances = None
instance_features = None
if use_instances and n_instances > 0:
instances = []
instance_features = {}
for i in range(n_instances):
instance_name = f"i{i+1}"
instances += [instance_name]
instance_features[instance_name] = [j + i for j in range(n_instance_features)]
return Scenario(
configspace=configspace,
name="test",
output_directory="smac3_output_test",
objectives=objectives,
deterministic=deterministic,
walltime_limit=30,
n_trials=n_trials,
n_workers=n_workers,
instances=instances,
instance_features=instance_features,
min_budget=min_budget,
max_budget=max_budget,
use_default_config=use_default_config
)
return _make
from ConfigSpace import ( Categorical, ConfigurationSpace, EqualsCondition, Float, InCondition, Integer, )
def _make( configspace: ConfigurationSpace, deterministic: bool = False, use_multi_objective: bool = False, n_objectives: int = 2, use_instances: bool = False, n_instances: int = 3, n_instance_features: int = 3, min_budget: int = 2, max_budget: int = 5, n_workers: int = 1, n_trials: int = 100, use_default_config: bool = False, ) -> Scenario: objectives = "cost" if use_multi_objective: objectives = [] for i in range(n_objectives): objectives.append(f"cost{i + 1}")
instances = None
instance_features = None
if use_instances and n_instances > 0:
instances = []
instance_features = {}
for i in range(n_instances):
instance_name = f"i{i + 1}"
instances += [instance_name]
instance_features[instance_name] = [j + i for j in range(n_instance_features)]
return Scenario(
configspace=configspace,
name="test",
output_directory="smac3_output_test",
objectives=objectives,
deterministic=deterministic,
walltime_limit=30,
n_trials=n_trials,
n_workers=n_workers,
instances=instances,
instance_features=instance_features,
min_budget=min_budget,
max_budget=max_budget,
use_default_config=use_default_config
)
def configspace_small() -> ConfigurationSpace: cs = ConfigurationSpace(seed=0)
a = Integer("a", (1, 10000), default=1)
b = Float("b", (1e-5, 1e-1), log=True, default=1e-1)
c = Categorical("c", ["cat", "dog", "mouse"], default="cat")
# Add all hyperparameters at once:
cs.add_hyperparameters([a, b, c])
return cs
print(_make(configspace_small()))
TEST 1#
scenario = _make(configspace_small(), use_default_config=True)
dc = AbstractInitialDesign( scenario=scenario, n_configs=15, ) print(f'use_default_config: {scenario.use_default_config}')
if use_default_config is True, then the default config should be included in the additional_configs#
default_config = scenario.configspace.get_default_configuration() assert default_config in dc._additional_configs
del scenario
TEST 2#
scenario2 = _make(configspace_small(), use_default_config=False)
initial_design = LatinHypercubeInitialDesign( scenario=scenario2, n_configs=54, max_ratio=1, ) print(f'use_default_config: {scenario2.use_default_config}') print(f'additional configs: {len(initial_design._additional_configs)}') configs = initial_design.select_configurations()
print(Counter([c.origin for c in configs]))
assert len(configs) == 54