Coverage for mlos_core/mlos_core/spaces/converters/flaml.py: 96%
23 statements
« prev ^ index » next coverage.py v7.5.1, created at 2024-05-06 00:35 +0000
« prev ^ index » next coverage.py v7.5.1, created at 2024-05-06 00:35 +0000
1#
2# Copyright (c) Microsoft Corporation.
3# Licensed under the MIT License.
4#
5"""
6Contains space converters for FLAML.
7"""
9from typing import Dict
11import sys
13import ConfigSpace
14import numpy as np
16import flaml.tune
17import flaml.tune.sample
19if sys.version_info >= (3, 10):
20 from typing import TypeAlias
21else:
22 from typing_extensions import TypeAlias
25FlamlDomain: TypeAlias = flaml.tune.sample.Domain
26FlamlSpace: TypeAlias = Dict[str, flaml.tune.sample.Domain]
29def configspace_to_flaml_space(config_space: ConfigSpace.ConfigurationSpace) -> Dict[str, FlamlDomain]:
30 """Converts a ConfigSpace.ConfigurationSpace to dict.
32 Parameters
33 ----------
34 config_space : ConfigSpace.ConfigurationSpace
35 Input configuration space.
37 Returns
38 -------
39 flaml_space : dict
40 A dictionary of flaml.tune.sample.Domain objects keyed by parameter name.
41 """
42 flaml_numeric_type = {
43 (ConfigSpace.UniformIntegerHyperparameter, False): flaml.tune.randint,
44 (ConfigSpace.UniformIntegerHyperparameter, True): flaml.tune.lograndint,
45 (ConfigSpace.UniformFloatHyperparameter, False): flaml.tune.uniform,
46 (ConfigSpace.UniformFloatHyperparameter, True): flaml.tune.loguniform,
47 }
49 def _one_parameter_convert(parameter: ConfigSpace.hyperparameters.Hyperparameter) -> FlamlDomain:
50 if isinstance(parameter, ConfigSpace.UniformFloatHyperparameter):
51 # FIXME: upper isn't included in the range
52 return flaml_numeric_type[(type(parameter), parameter.log)](parameter.lower, parameter.upper)
53 elif isinstance(parameter, ConfigSpace.UniformIntegerHyperparameter):
54 return flaml_numeric_type[(type(parameter), parameter.log)](parameter.lower, parameter.upper + 1)
55 elif isinstance(parameter, ConfigSpace.CategoricalHyperparameter):
56 if len(np.unique(parameter.probabilities)) > 1:
57 raise ValueError("FLAML doesn't support categorical parameters with non-uniform probabilities.")
58 return flaml.tune.choice(parameter.choices) # TODO: set order?
59 raise ValueError(f"Type of parameter {parameter} ({type(parameter)}) not supported.")
61 return {param.name: _one_parameter_convert(param) for param in config_space.values()}