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

1# 

2# Copyright (c) Microsoft Corporation. 

3# Licensed under the MIT License. 

4# 

5""" 

6Contains space converters for FLAML. 

7""" 

8 

9from typing import Dict 

10 

11import sys 

12 

13import ConfigSpace 

14import numpy as np 

15 

16import flaml.tune 

17import flaml.tune.sample 

18 

19if sys.version_info >= (3, 10): 

20 from typing import TypeAlias 

21else: 

22 from typing_extensions import TypeAlias 

23 

24 

25FlamlDomain: TypeAlias = flaml.tune.sample.Domain 

26FlamlSpace: TypeAlias = Dict[str, flaml.tune.sample.Domain] 

27 

28 

29def configspace_to_flaml_space(config_space: ConfigSpace.ConfigurationSpace) -> Dict[str, FlamlDomain]: 

30 """Converts a ConfigSpace.ConfigurationSpace to dict. 

31 

32 Parameters 

33 ---------- 

34 config_space : ConfigSpace.ConfigurationSpace 

35 Input configuration space. 

36 

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 } 

48 

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.") 

60 

61 return {param.name: _one_parameter_convert(param) for param in config_space.values()}