Coverage for mlos_core/mlos_core/optimizers/__init__.py: 97%

29 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""" 

6Basic initializer module for the mlos_core optimizers. 

7""" 

8 

9from enum import Enum 

10from typing import Optional, TypeVar 

11 

12import ConfigSpace 

13 

14from mlos_core.optimizers.optimizer import BaseOptimizer 

15from mlos_core.optimizers.random_optimizer import RandomOptimizer 

16from mlos_core.optimizers.bayesian_optimizers.smac_optimizer import SmacOptimizer 

17from mlos_core.optimizers.flaml_optimizer import FlamlOptimizer 

18from mlos_core.spaces.adapters import SpaceAdapterType, SpaceAdapterFactory 

19 

20__all__ = [ 

21 'SpaceAdapterType', 

22 'OptimizerFactory', 

23 'BaseOptimizer', 

24 'RandomOptimizer', 

25 'FlamlOptimizer', 

26 'SmacOptimizer', 

27] 

28 

29 

30class OptimizerType(Enum): 

31 """Enumerate supported MlosCore optimizers.""" 

32 

33 RANDOM = RandomOptimizer 

34 """An instance of RandomOptimizer class will be used""" 

35 

36 FLAML = FlamlOptimizer 

37 """An instance of FlamlOptimizer class will be used""" 

38 

39 SMAC = SmacOptimizer 

40 """An instance of SmacOptimizer class will be used""" 

41 

42 

43# To make mypy happy, we need to define a type variable for each optimizer type. 

44# https://github.com/python/mypy/issues/12952 

45# ConcreteOptimizer = TypeVar('ConcreteOptimizer', *[member.value for member in OptimizerType]) 

46# To address this, we add a test for complete coverage of the enum. 

47ConcreteOptimizer = TypeVar( 

48 'ConcreteOptimizer', 

49 RandomOptimizer, 

50 FlamlOptimizer, 

51 SmacOptimizer, 

52) 

53 

54DEFAULT_OPTIMIZER_TYPE = OptimizerType.FLAML 

55 

56 

57class OptimizerFactory: 

58 """Simple factory class for creating BaseOptimizer-derived objects""" 

59 

60 # pylint: disable=too-few-public-methods 

61 

62 @staticmethod 

63 def create(*, 

64 parameter_space: ConfigSpace.ConfigurationSpace, 

65 optimizer_type: OptimizerType = DEFAULT_OPTIMIZER_TYPE, 

66 optimizer_kwargs: Optional[dict] = None, 

67 space_adapter_type: SpaceAdapterType = SpaceAdapterType.IDENTITY, 

68 space_adapter_kwargs: Optional[dict] = None) -> ConcreteOptimizer: # type: ignore[type-var] 

69 """ 

70 Create a new optimizer instance, given the parameter space, optimizer type, 

71 and potential optimizer options. 

72 

73 Parameters 

74 ---------- 

75 parameter_space : ConfigSpace.ConfigurationSpace 

76 Input configuration space. 

77 optimizer_type : OptimizerType 

78 Optimizer class as defined by Enum. 

79 optimizer_kwargs : Optional[dict] 

80 Optional arguments passed in Optimizer class constructor. 

81 space_adapter_type : Optional[SpaceAdapterType] 

82 Space adapter class to be used alongside the optimizer. 

83 space_adapter_kwargs : Optional[dict] 

84 Optional arguments passed in SpaceAdapter class constructor. 

85 

86 Returns 

87 ------- 

88 optimizer : ConcreteOptimizer 

89 Instance of concrete optimizer class 

90 (e.g., RandomOptimizer, FlamlOptimizer, SmacOptimizer, etc.). 

91 """ 

92 if space_adapter_kwargs is None: 

93 space_adapter_kwargs = {} 

94 if optimizer_kwargs is None: 

95 optimizer_kwargs = {} 

96 

97 space_adapter = SpaceAdapterFactory.create( 

98 parameter_space=parameter_space, 

99 space_adapter_type=space_adapter_type, 

100 space_adapter_kwargs=space_adapter_kwargs, 

101 ) 

102 

103 optimizer: ConcreteOptimizer = optimizer_type.value( 

104 parameter_space=parameter_space, 

105 space_adapter=space_adapter, 

106 **optimizer_kwargs 

107 ) 

108 

109 return optimizer