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
« 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"""
9from enum import Enum
10from typing import Optional, TypeVar
12import ConfigSpace
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
20__all__ = [
21 'SpaceAdapterType',
22 'OptimizerFactory',
23 'BaseOptimizer',
24 'RandomOptimizer',
25 'FlamlOptimizer',
26 'SmacOptimizer',
27]
30class OptimizerType(Enum):
31 """Enumerate supported MlosCore optimizers."""
33 RANDOM = RandomOptimizer
34 """An instance of RandomOptimizer class will be used"""
36 FLAML = FlamlOptimizer
37 """An instance of FlamlOptimizer class will be used"""
39 SMAC = SmacOptimizer
40 """An instance of SmacOptimizer class will be used"""
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)
54DEFAULT_OPTIMIZER_TYPE = OptimizerType.FLAML
57class OptimizerFactory:
58 """Simple factory class for creating BaseOptimizer-derived objects"""
60 # pylint: disable=too-few-public-methods
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.
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.
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 = {}
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 )
103 optimizer: ConcreteOptimizer = optimizer_type.value(
104 parameter_space=parameter_space,
105 space_adapter=space_adapter,
106 **optimizer_kwargs
107 )
109 return optimizer