Exemple #1
0
 def setUp(self):
     self.param1 = ChoiceParameter(
         name="x", parameter_type=ParameterType.STRING, values=["foo", "bar", "baz"]
     )
     self.param1_repr = (
         "ChoiceParameter(name='x', parameter_type=STRING, "
         "values=['foo', 'bar', 'baz'])"
     )
     self.param2 = ChoiceParameter(
         name="x",
         parameter_type=ParameterType.STRING,
         values=["foo", "bar", "baz"],
         is_ordered=True,
         is_task=True,
     )
     self.param3 = ChoiceParameter(
         name="x",
         parameter_type=ParameterType.STRING,
         values=["foo", "bar"],
         is_fidelity=True,
         target_value="bar",
     )
     self.param3_repr = (
         "ChoiceParameter(name='x', parameter_type=STRING, "
         "values=['foo', 'bar'], fidelity=True, target_value='bar')"
     )
Exemple #2
0
def get_factorial_search_space() -> SearchSpace:
    return SearchSpace(
        # Expected `List[ax.core.parameter.Parameter]` for 2nd parameter
        # `parameters` to call `ax.core.search_space.SearchSpace.__init__` but
        # got `List[ChoiceParameter]`.
        parameters=[
            ChoiceParameter(
                name="factor1",
                parameter_type=ParameterType.STRING,
                # Expected `List[typing.Optional[typing.Union[bool, float, str]]]` for
                # 4th parameter `values` to call
                # `ax.core.parameter.ChoiceParameter.__init__` but got
                # `List[str]`.
                values=["level11", "level12", "level13"],
            ),
            ChoiceParameter(
                name="factor2",
                parameter_type=ParameterType.STRING,
                # Expected `List[typing.Optional[typing.Union[bool, float, str]]]` for
                # 4th parameter `values` to call
                # `ax.core.parameter.ChoiceParameter.__init__` but got
                # `List[str]`.
                values=["level21", "level22"],
            ),
            ChoiceParameter(
                name="factor3",
                parameter_type=ParameterType.STRING,
                # Expected `List[typing.Optional[typing.Union[bool, float, str]]]` for
                # 4th parameter `values` to call
                # `ax.core.parameter.ChoiceParameter.__init__` but got
                # `List[str]`.
                values=["level31", "level32", "level33", "level34"],
            ),
        ])
Exemple #3
0
 def setUp(self):
     self.a = RangeParameter(
         name="a", parameter_type=ParameterType.FLOAT, lower=0.5, upper=5.5
     )
     self.b = RangeParameter(
         name="b", parameter_type=ParameterType.INT, lower=2, upper=10
     )
     self.c = ChoiceParameter(
         name="c", parameter_type=ParameterType.STRING, values=["foo", "bar", "baz"]
     )
     self.d = FixedParameter(name="d", parameter_type=ParameterType.BOOL, value=True)
     self.e = ChoiceParameter(
         name="e", parameter_type=ParameterType.FLOAT, values=[0.0, 0.1, 0.2, 0.5]
     )
     self.f = RangeParameter(
         name="f",
         parameter_type=ParameterType.INT,
         lower=2,
         upper=10,
         log_scale=True,
     )
     self.g = RangeParameter(
         name="g", parameter_type=ParameterType.FLOAT, lower=0.0, upper=1.0
     )
     self.parameters = [self.a, self.b, self.c, self.d, self.e, self.f]
     self.ss1 = SearchSpace(parameters=self.parameters)
     self.ss2 = SearchSpace(
         parameters=self.parameters,
         parameter_constraints=[
             OrderConstraint(lower_parameter=self.a, upper_parameter=self.b)
         ],
     )
     self.ss1_repr = (
         "SearchSpace("
         "parameters=["
         "RangeParameter(name='a', parameter_type=FLOAT, range=[0.5, 5.5]), "
         "RangeParameter(name='b', parameter_type=INT, range=[2, 10]), "
         "ChoiceParameter(name='c', parameter_type=STRING, "
         "values=['foo', 'bar', 'baz']), "
         "FixedParameter(name='d', parameter_type=BOOL, value=True), "
         "ChoiceParameter(name='e', parameter_type=FLOAT, "
         "values=[0.0, 0.1, 0.2, 0.5]), "
         "RangeParameter(name='f', parameter_type=INT, range=[2, 10], "
         "log_scale=True)], "
         "parameter_constraints=[])"
     )
     self.ss2_repr = (
         "SearchSpace("
         "parameters=["
         "RangeParameter(name='a', parameter_type=FLOAT, range=[0.5, 5.5]), "
         "RangeParameter(name='b', parameter_type=INT, range=[2, 10]), "
         "ChoiceParameter(name='c', parameter_type=STRING, "
         "values=['foo', 'bar', 'baz']), "
         "FixedParameter(name='d', parameter_type=BOOL, value=True), "
         "ChoiceParameter(name='e', parameter_type=FLOAT, "
         "values=[0.0, 0.1, 0.2, 0.5]), "
         "RangeParameter(name='f', parameter_type=INT, range=[2, 10], "
         "log_scale=True)], "
         "parameter_constraints=[OrderConstraint(a <= b)])"
     )
Exemple #4
0
 def setUp(self):
     self.search_space = SearchSpace(
         parameters=[
             RangeParameter(
                 "x", lower=1, upper=3, parameter_type=ParameterType.FLOAT
             ),
             RangeParameter("a", lower=1, upper=2, parameter_type=ParameterType.INT),
             ChoiceParameter(
                 "b",
                 parameter_type=ParameterType.FLOAT,
                 values=[1.0, 10.0, 100.0],
                 is_ordered=True,
             ),
             ChoiceParameter(
                 "c",
                 parameter_type=ParameterType.FLOAT,
                 values=[10.0, 100.0, 1000.0],
                 is_ordered=True,
             ),
             ChoiceParameter(
                 "d", parameter_type=ParameterType.STRING, values=["r", "q", "z"]
             ),
         ],
         parameter_constraints=[
             ParameterConstraint(constraint_dict={"x": -0.5, "a": 1}, bound=0.5)
         ],
     )
     self.t = OrderedChoiceEncode(
         search_space=self.search_space,
         observation_features=None,
         observation_data=None,
     )
Exemple #5
0
 def setUp(self):
     self.search_space = SearchSpace(
         parameters=[
             RangeParameter("x",
                            lower=1,
                            upper=3,
                            parameter_type=ParameterType.FLOAT),
             RangeParameter("a",
                            lower=1,
                            upper=2,
                            parameter_type=ParameterType.INT),
             ChoiceParameter(
                 "b",
                 parameter_type=ParameterType.FLOAT,
                 values=[1.0, 10.0, 100.0],
                 is_ordered=True,
             ),
             ChoiceParameter(
                 "c",
                 parameter_type=ParameterType.FLOAT,
                 values=[10.0, 100.0, 1000.0],
                 is_ordered=True,
             ),
             ChoiceParameter("d",
                             parameter_type=ParameterType.STRING,
                             values=["r", "q", "z"]),
         ],
         parameter_constraints=[
             ParameterConstraint(constraint_dict={
                 "x": -0.5,
                 "a": 1
             },
                                 bound=0.5)
         ],
     )
     self.t = ChoiceEncode(
         search_space=self.search_space,
         observation_features=None,
         observation_data=None,
     )
     self.observation_features = [
         ObservationFeatures(parameters={
             "x": 2.2,
             "a": 2,
             "b": 10.0,
             "c": 10.0,
             "d": "r"
         })
     ]
     # expected parameters after transform
     self.expected_transformed_params = {
         "x": 2.2,
         "a": 2,
         # ordered float choice originally; transformed normalized value
         "b": normalize_values([1.0, 10.0, 100.0])[1],
         # ordered float choice originally; transformed normalized value
         "c": normalize_values([10.0, 100.0, 1000.0])[0],
         # string choice originally; transformed to int index.
         "d": 0,
     }
Exemple #6
0
 def testProperties(self):
     self.assertEqual(self.param1.name, "x")
     self.assertEqual(self.param1.parameter_type, ParameterType.STRING)
     self.assertEqual(len(self.param1.values), 3)
     self.assertFalse(self.param1.is_numeric)
     self.assertFalse(self.param1.is_ordered)
     self.assertFalse(self.param1.is_task)
     self.assertTrue(self.param2.is_ordered)
     self.assertTrue(self.param2.is_task)
     # check is_ordered defaults
     bool_param = ChoiceParameter(
         name="x", parameter_type=ParameterType.BOOL, values=[True, False]
     )
     self.assertTrue(bool_param.is_ordered)
     int_param = ChoiceParameter(
         name="x", parameter_type=ParameterType.INT, values=[2, 1, 3]
     )
     self.assertTrue(int_param.is_ordered)
     self.assertListEqual(int_param.values, sorted(int_param.values))
     float_param = ChoiceParameter(
         name="x", parameter_type=ParameterType.FLOAT, values=[1.5, 2.5, 3.5]
     )
     self.assertTrue(float_param.is_ordered)
     string_param = ChoiceParameter(
         name="x", parameter_type=ParameterType.STRING, values=["foo", "bar", "baz"]
     )
     self.assertFalse(string_param.is_ordered)
Exemple #7
0
 def setUp(self):
     self.search_space = SearchSpace(
         parameters=[
             RangeParameter(
                 "x", lower=1, upper=3, parameter_type=ParameterType.FLOAT
             ),
             ChoiceParameter(
                 "b",
                 parameter_type=ParameterType.FLOAT,
                 values=[1.0, 10.0, 100.0],
                 is_ordered=True,
             ),
             ChoiceParameter(
                 "c",
                 parameter_type=ParameterType.STRING,
                 values=["online", "offline"],
                 is_task=True,
             ),
         ]
     )
     self.t = TaskEncode(
         search_space=self.search_space,
         observation_features=None,
         observation_data=None,
     )
    def setUp(self):
        self.parameters = [
            ChoiceParameter("x", ParameterType.FLOAT, values=[0, 1]),
            ChoiceParameter("y", ParameterType.STRING, values=["foo", "bar"]),
            FixedParameter("z", ParameterType.BOOL, value=True),
        ]
        parameter_constraints = []

        self.search_space = SearchSpace(self.parameters, parameter_constraints)

        self.observation_features = [
            ObservationFeatures(parameters={
                "x": 0,
                "y": "foo",
                "z": True
            }),
            ObservationFeatures(parameters={
                "x": 1,
                "y": "foo",
                "z": True
            }),
            ObservationFeatures(parameters={
                "x": 1,
                "y": "bar",
                "z": True
            }),
        ]
        self.observation_data = [
            ObservationData(
                metric_names=["a", "b"],
                means=np.array([1.0, -1.0]),
                covariance=np.array([[1.0, 4.0], [4.0, 6.0]]),
            ),
            ObservationData(
                metric_names=["a", "b"],
                means=np.array([2.0, -2.0]),
                covariance=np.array([[2.0, 5.0], [5.0, 7.0]]),
            ),
            ObservationData(metric_names=["a"],
                            means=np.array([3.0]),
                            covariance=np.array([[3.0]])),
        ]
        self.observations = [
            Observation(
                features=self.observation_features[i],
                data=self.observation_data[i],
                arm_name=str(i),
            ) for i in range(3)
        ]
        self.pending_observations = {
            "b":
            [ObservationFeatures(parameters={
                "x": 0,
                "y": "foo",
                "z": True
            })]
        }
        self.model_gen_options = {"option": "yes"}
Exemple #9
0
    def setUp(self):
        self.search_space = SearchSpace(
            parameters=[
                RangeParameter(
                    "x",
                    lower=1,
                    upper=3,
                    parameter_type=ParameterType.FLOAT,
                ),
                RangeParameter("a", lower=1, upper=2, parameter_type=ParameterType.INT),
                ChoiceParameter(
                    "b", parameter_type=ParameterType.STRING, values=["a", "b", "c"]
                ),
                ChoiceParameter(
                    "c",
                    parameter_type=ParameterType.BOOL,
                    values=[True, False],
                    is_ordered=False,
                ),
                ChoiceParameter(
                    "d",
                    parameter_type=ParameterType.FLOAT,
                    values=[1.0, 10.0, 100.0],
                    is_ordered=True,
                ),
            ],
            parameter_constraints=[
                ParameterConstraint(constraint_dict={"x": -0.5, "a": 1}, bound=0.5)
            ],
        )
        self.t = OneHot(
            search_space=self.search_space,
            observation_features=None,
            observation_data=None,
        )
        self.t2 = OneHot(
            search_space=self.search_space,
            observation_features=None,
            observation_data=None,
            config={"rounding": "randomized"},
        )

        self.transformed_features = ObservationFeatures(
            parameters={
                "x": 2.2,
                "a": 2,
                "b" + OH_PARAM_INFIX + "_0": 0,
                "b" + OH_PARAM_INFIX + "_1": 1,
                "b" + OH_PARAM_INFIX + "_2": 0,
                # Only two choices => one parameter.
                "c" + OH_PARAM_INFIX: 0,
                "d": 10.0,
            }
        )
        self.observation_features = ObservationFeatures(
            parameters={"x": 2.2, "a": 2, "b": "b", "c": False, "d": 10.0}
        )
Exemple #10
0
    def testEq(self):
        param4 = ChoiceParameter(name="x",
                                 parameter_type=ParameterType.STRING,
                                 values=["foo", "bar", "baz"])
        self.assertEqual(self.param1, param4)
        self.assertNotEqual(self.param1, self.param2)

        param5 = ChoiceParameter(name="x",
                                 parameter_type=ParameterType.STRING,
                                 values=["foo", "foobar"])
        self.assertNotEqual(self.param1, param5)
Exemple #11
0
def get_large_factorial_search_space() -> SearchSpace:
    return SearchSpace(
        parameters=[
            ChoiceParameter(
                name="factor1",
                parameter_type=ParameterType.STRING,
                values=[f"level1{i}" for i in range(7)],
            ),
            ChoiceParameter(
                name="factor2",
                parameter_type=ParameterType.STRING,
                values=[f"level2{i}" for i in range(10)],
            ),
        ]
    )
Exemple #12
0
 def setUp(self):
     self.search_space = SearchSpace(
         parameters=[
             RangeParameter(
                 "x", lower=1, upper=3, parameter_type=ParameterType.FLOAT
             ),
             RangeParameter(
                 "y", lower=1, upper=2, parameter_type=ParameterType.FLOAT
             ),
             RangeParameter(
                 "z",
                 lower=1,
                 upper=2,
                 parameter_type=ParameterType.FLOAT,
                 log_scale=True,
             ),
             RangeParameter("a", lower=1, upper=2, parameter_type=ParameterType.INT),
             ChoiceParameter(
                 "b", parameter_type=ParameterType.STRING, values=["a", "b", "c"]
             ),
         ],
         parameter_constraints=[],
     )
     self.t = CenteredUnitX(
         search_space=self.search_space,
         observation_features=None,
         observation_data=None,
     )
Exemple #13
0
 def transform_search_space(self, search_space: SearchSpace) -> SearchSpace:
     transformed_parameters: List[Parameter] = []
     for p in search_space.parameters.values():
         if p.name in self.transform_parameters:
             # pyre: p_cast is declared to have type `RangeParameter` but
             # pyre-fixme[9]: is used as type `Parameter`.
             p_cast: RangeParameter = p
             transformed_parameters.append(
                 ChoiceParameter(
                     name=p_cast.name,
                     parameter_type=p_cast.parameter_type,
                     # Expected `List[Optional[typing.Union[bool, float, str]]]` for
                     # 4th parameter `values` to call
                     # `ax.core.parameter.ChoiceParameter.__init__` but got
                     # `List[int]`.
                     # pyre-fixme[6]:
                     values=list(range(p_cast.lower, p_cast.upper + 1)),
                 ))
         else:
             transformed_parameters.append(p)
     return SearchSpace(
         parameters=transformed_parameters,
         parameter_constraints=[
             pc.clone() for pc in search_space.parameter_constraints
         ],
     )
    def testTransformSearchSpace(self):
        ss2 = deepcopy(self.search_space)
        ss2 = self.t.transform_search_space(ss2)

        for p in ("x", "a", "b", "c", "d"):
            self.assertIsInstance(ss2.parameters[p], RangeParameter)
        self.assertEqual(ss2.parameters["x"].parameter_type, ParameterType.FLOAT)
        for p in ("a", "b", "c", "d"):
            self.assertEqual(ss2.parameters[p].parameter_type, ParameterType.INT)

        self.assertEqual(ss2.parameters["b"].lower, 0)
        self.assertEqual(ss2.parameters["b"].upper, 2)
        self.assertEqual(ss2.parameters["c"].lower, 0)
        self.assertEqual(ss2.parameters["c"].upper, 2)
        self.assertEqual(ss2.parameters["d"].lower, 0)
        self.assertEqual(ss2.parameters["d"].upper, 2)

        # Ensure we error if we try to transform a fidelity parameter
        ss3 = SearchSpace(
            parameters=[
                ChoiceParameter(
                    "b",
                    parameter_type=ParameterType.FLOAT,
                    values=[1.0, 10.0, 100.0],
                    is_ordered=True,
                    is_fidelity=True,
                    target_value=100.0,
                )
            ]
        )
        t = OrderedChoiceEncode(
            search_space=ss3, observation_features=None, observation_data=None
        )
        with self.assertRaises(ValueError):
            t.transform_search_space(ss3)
Exemple #15
0
 def setUp(self):
     self.obsd1 = ObservationData(
         metric_names=["m1", "m2", "m2"],
         means=np.array([1.0, 2.0, 8.0]),
         covariance=np.array([[1.0, 0.2, 0.4], [0.2, 2.0, 0.8],
                              [0.4, 0.8, 3.0]]),
     )
     self.obsd2 = ObservationData(
         metric_names=["m1", "m1", "m2", "m2"],
         means=np.array([1.0, 5.0, 2.0, 1.0]),
         covariance=np.array([
             [1.0, 0.0, 0.0, 0.0],
             [0.0, 1.0, 0.2, 0.4],
             [0.0, 0.2, 2.0, 0.8],
             [0.0, 0.4, 0.8, 3.0],
         ]),
     )
     self.search_space = SearchSpace(parameters=[
         RangeParameter(name="x",
                        parameter_type=ParameterType.FLOAT,
                        lower=0,
                        upper=10),
         ChoiceParameter(name="z",
                         parameter_type=ParameterType.STRING,
                         values=["a", "b"]),
     ])
     self.obsf1 = ObservationFeatures({"x": 2, "z": "a"})
     self.obsf2 = ObservationFeatures({"x": 5, "z": "b"})
     self.t = StratifiedStandardizeY(
         search_space=self.search_space,
         observation_features=[self.obsf1, self.obsf2],
         observation_data=[self.obsd1, self.obsd2],
         config={"parameter_name": "z"},
     )
Exemple #16
0
 def transform_search_space(self, search_space: SearchSpace) -> SearchSpace:
     transformed_parameters: Dict[str, Parameter] = {}
     for p_name, p in search_space.parameters.items():
         if p_name in self.encoded_parameters and isinstance(
                 p, ChoiceParameter):
             if p.is_fidelity:
                 raise ValueError(
                     f"Cannot choice-encode fidelity parameter {p_name}")
             tvals, ptype = transform_choice_values(p)
             transformed_parameters[p_name] = ChoiceParameter(
                 name=p_name,
                 parameter_type=ptype,
                 values=tvals.tolist(),
                 is_ordered=p.is_ordered,
             )
         else:
             transformed_parameters[p.name] = p
     return SearchSpace(
         parameters=list(transformed_parameters.values()),
         parameter_constraints=[
             pc.clone_with_transformed_parameters(
                 transformed_parameters=transformed_parameters)
             for pc in search_space.parameter_constraints
         ],
     )
Exemple #17
0
 def transform_search_space(self, search_space: SearchSpace) -> SearchSpace:
     transformed_parameters: Dict[str, Parameter] = {}
     for p_name, p in search_space.parameters.items():
         if p_name in self.encoded_parameters and isinstance(
                 p, ChoiceParameter):
             if p.is_fidelity:
                 raise ValueError(
                     f"Cannot choice-encode fidelity parameter {p_name}.")
             # Choice(|K|) => Choice(0, K-1, is_task=True)
             transformed_parameters[p_name] = ChoiceParameter(
                 name=p_name,
                 parameter_type=ParameterType.INT,
                 values=list(range(len(p.values))),  # pyre-ignore [6]
                 is_ordered=p.is_ordered,
                 is_task=True,
                 sort_values=True,
             )
         else:
             transformed_parameters[p.name] = p
     return SearchSpace(
         parameters=list(transformed_parameters.values()),
         parameter_constraints=[
             pc.clone_with_transformed_parameters(
                 transformed_parameters=transformed_parameters)
             for pc in search_space.parameter_constraints
         ],
     )
Exemple #18
0
 def setUp(self):
     self.search_space = SearchSpace(parameters=[
         RangeParameter(
             "x",
             lower=1,
             upper=3,
             parameter_type=ParameterType.FLOAT,
             log_scale=True,
         ),
         RangeParameter(
             "a", lower=1, upper=2, parameter_type=ParameterType.INT),
         ChoiceParameter("b",
                         parameter_type=ParameterType.STRING,
                         values=["a", "b", "c"]),
     ])
     self.t = Log(
         search_space=self.search_space,
         observation_features=None,
         observation_data=None,
     )
     self.search_space_with_target = SearchSpace(parameters=[
         RangeParameter(
             "x",
             lower=1,
             upper=3,
             parameter_type=ParameterType.FLOAT,
             log_scale=True,
             is_fidelity=True,
             target_value=3,
         )
     ])
Exemple #19
0
 def transform_search_space(self, search_space: SearchSpace) -> SearchSpace:
     transformed_parameters: Dict[str, Parameter] = {}
     for p_name, p in search_space.parameters.items():
         if p_name in self.transform_parameters and isinstance(p, RangeParameter):
             # pyre-fixme[6]: Expected `int` for 1st param but got `float`.
             values = list(range(p.lower, p.upper + 1))
             target_value = (
                 None
                 if p.target_value is None
                 else next(i for i, v in enumerate(values) if v == p.target_value)
             )
             transformed_parameters[p_name] = ChoiceParameter(
                 name=p_name,
                 parameter_type=p.parameter_type,
                 # Expected `List[Optional[typing.Union[bool, float, str]]]` for
                 # 4th parameter `values` to call
                 # `ax.core.parameter.ChoiceParameter.__init__` but got
                 # `List[int]`.
                 # pyre-fixme[6]:
                 values=values,
                 is_ordered=True,
                 is_fidelity=p.is_fidelity,
                 target_value=target_value,
             )
         else:
             transformed_parameters[p.name] = p
     return SearchSpace(
         parameters=list(transformed_parameters.values()),
         parameter_constraints=[
             pc.clone_with_transformed_parameters(
                 transformed_parameters=transformed_parameters
             )
             for pc in search_space.parameter_constraints
         ],
     )
Exemple #20
0
def get_branin_search_space(
    with_fidelity_parameter: bool = False, with_choice_parameter: bool = False
) -> SearchSpace:
    parameters = [
        RangeParameter(
            name="x1", parameter_type=ParameterType.FLOAT, lower=-5, upper=10
        ),
        ChoiceParameter(
            name="x2",
            parameter_type=ParameterType.FLOAT,
            values=[float(x) for x in range(0, 16)],
        )
        if with_choice_parameter
        else RangeParameter(
            name="x2", parameter_type=ParameterType.FLOAT, lower=0, upper=15
        ),
    ]
    if with_fidelity_parameter:
        parameters.append(
            RangeParameter(
                name="fidelity",
                parameter_type=ParameterType.FLOAT,
                lower=0.0,
                upper=1.0,
                is_fidelity=True,
                target_value=1.0,
            )
        )

    return SearchSpace(parameters=cast(List[Parameter], parameters))
Exemple #21
0
    def testTransformSearchSpace(self):
        ss2 = deepcopy(self.search_space)
        ss2 = self.t.transform_search_space(ss2)

        # Parameter type fixed.
        self.assertEqual(ss2.parameters["x"].parameter_type,
                         ParameterType.FLOAT)
        self.assertEqual(ss2.parameters["b"].parameter_type,
                         ParameterType.FLOAT)
        self.assertEqual(ss2.parameters["c"].parameter_type, ParameterType.INT)

        self.assertEqual(ss2.parameters["c"].lower, 0)
        self.assertEqual(ss2.parameters["c"].upper, 1)

        # Test error if there are fidelities
        ss3 = SearchSpace(parameters=[
            ChoiceParameter(
                "c",
                parameter_type=ParameterType.STRING,
                values=["online", "offline"],
                is_task=True,
                is_fidelity=True,
                target_value="online",
            )
        ])
        with self.assertRaises(ValueError):
            TaskEncode(search_space=ss3,
                       observation_features=None,
                       observation_data=None)
 def testExtractSearchSpaceDigest(self):
     search_space_digest = extract_search_space_digest(
         self.search_space, ["x", "y", "z"])
     self.assertEqual(search_space_digest.bounds, [(0.0, 1.0), (1.0, 2.0),
                                                   (0.0, 5.0)])
     self.assertEqual(search_space_digest.task_features, [])
     self.assertEqual(search_space_digest.target_fidelities, {1: 2.0})
     search_space_digest = extract_search_space_digest(
         self.search_space, ["x", "z"])
     self.assertEqual(search_space_digest.target_fidelities, {})
     # Test that Int param is treated as task feature
     search_space = SearchSpace(self.parameters)
     search_space._parameters["x"] = RangeParameter("x",
                                                    ParameterType.INT,
                                                    lower=1,
                                                    upper=4)
     search_space_digest = extract_search_space_digest(
         search_space, ["x", "y", "z"])
     self.assertEqual(search_space_digest.task_features, [0])
     # Test validation
     search_space._parameters["x"] = ChoiceParameter(
         "x", ParameterType.FLOAT, [0.1, 0.4])
     with self.assertRaises(ValueError):
         extract_search_space_digest(search_space, ["x", "y", "z"])
     search_space._parameters["x"] = RangeParameter("x",
                                                    ParameterType.FLOAT,
                                                    lower=1.0,
                                                    upper=4.0,
                                                    log_scale=True)
     with self.assertRaises(ValueError):
         extract_search_space_digest(search_space, ["x", "y", "z"])
    def testTransformSearchSpace(self):
        ss2 = self.search_space.clone()
        ss2 = self.t.transform_search_space(ss2)
        self.assertEqual(len(ss2.parameters), 1)
        expected_parameter = ChoiceParameter(
            name="arms",
            parameter_type=ParameterType.STRING,
            values=list(self.t.signature_to_parameterization.keys()),
        )
        self.assertEqual(ss2.parameters.get("arms"), expected_parameter)

        # Test error if there are fidelities
        ss3 = SearchSpace(parameters=[
            RangeParameter(
                "a",
                lower=1,
                upper=3,
                parameter_type=ParameterType.FLOAT,
                is_fidelity=True,
                target_value=3,
            )
        ])
        with self.assertRaises(ValueError):
            SearchSpaceToChoice(
                search_space=ss3,
                observation_features=self.observation_features,
                observation_data=None,
            )
Exemple #24
0
 def testGetBoundsAndTask(self):
     bounds, task_features, target_fidelities = get_bounds_and_task(
         self.search_space, ["x", "y", "z"])
     self.assertEqual(bounds, [(0.0, 1.0), (1.0, 2.0), (0.0, 5.0)])
     self.assertEqual(task_features, [])
     self.assertEqual(target_fidelities, {1: 2.0})
     bounds, task_features, target_fidelities = get_bounds_and_task(
         self.search_space, ["x", "z"])
     self.assertEqual(target_fidelities, {})
     # Test that Int param is treated as task feature
     search_space = SearchSpace(self.parameters)
     search_space._parameters["x"] = RangeParameter("x",
                                                    ParameterType.INT,
                                                    lower=1,
                                                    upper=4)
     bounds, task_features, target_fidelities = get_bounds_and_task(
         search_space, ["x", "y", "z"])
     self.assertEqual(task_features, [0])
     # Test validation
     search_space._parameters["x"] = ChoiceParameter(
         "x", ParameterType.FLOAT, [0.1, 0.4])
     with self.assertRaises(ValueError):
         get_bounds_and_task(search_space, ["x", "y", "z"])
     search_space._parameters["x"] = RangeParameter("x",
                                                    ParameterType.FLOAT,
                                                    lower=1.0,
                                                    upper=4.0,
                                                    log_scale=True)
     with self.assertRaises(ValueError):
         get_bounds_and_task(search_space, ["x", "y", "z"])
Exemple #25
0
 def setUp(self):
     self.fixed_parameter = FixedParameter(
         name="x", parameter_type=ParameterType.BOOL, value=True)
     self.choice_parameter = ChoiceParameter(
         name="x",
         parameter_type=ParameterType.STRING,
         values=["foo", "bar", "baz"])
Exemple #26
0
 def testSingleValue(self):
     with self.assertRaises(UserInputError):
         ChoiceParameter(name="x",
                         parameter_type=ParameterType.STRING,
                         values=["foo"])
     with self.assertRaises(UserInputError):
         self.param1.set_values(["foo"])
Exemple #27
0
    def test_validation(self):
        # Case where dependent parameter is not in the search space.
        with self.assertRaisesRegex(ValueError,
                                    ".* 'l2_reg_weight' is not part"):
            HierarchicalSearchSpace(parameters=[
                ChoiceParameter(
                    name="model",
                    parameter_type=ParameterType.STRING,
                    values=["Linear", "XGBoost"],
                    dependents={
                        "Linear": ["learning_rate", "l2_reg_weight"],
                        "XGBoost": ["num_boost_rounds"],
                    },
                ),
                self.lr_parameter,
                self.num_boost_rounds_parameter,
            ])

        # Case where there are two root-parameter candidates.
        with self.assertRaisesRegex(NotImplementedError,
                                    "Could not find the root"):
            HierarchicalSearchSpace(parameters=[
                self.model_parameter,
                self.model_2_parameter,
                self.lr_parameter,
                self.l2_reg_weight_parameter,
                self.num_boost_rounds_parameter,
            ])

        # TODO: Test case where subtrees are not independent.
        with self.assertRaisesRegex(UserInputError,
                                    ".* contain the same parameters"):
            HierarchicalSearchSpace(parameters=[
                ChoiceParameter(
                    name="root",
                    parameter_type=ParameterType.BOOL,
                    values=[True, False],
                    dependents={
                        True: ["model", "model_2"],
                    },
                ),
                self.model_parameter,
                self.model_2_parameter,
                self.lr_parameter,
                self.l2_reg_weight_parameter,
                self.num_boost_rounds_parameter,
            ])
 def setUp(self):
     self.search_space = SearchSpace(parameters=[
         RangeParameter(
             "a", lower=1, upper=3, parameter_type=ParameterType.FLOAT),
         ChoiceParameter("b",
                         parameter_type=ParameterType.STRING,
                         values=["a", "b", "c"]),
     ])
     self.observation_features = [
         ObservationFeatures(parameters={
             "a": 2,
             "b": "a"
         }),
         ObservationFeatures(parameters={
             "a": 3,
             "b": "b"
         }),
         ObservationFeatures(parameters={
             "a": 3,
             "b": "c"
         }),
     ]
     self.signature_to_parameterization = {
         Arm(parameters=obsf.parameters).signature: obsf.parameters
         for obsf in self.observation_features
     }
     self.transformed_features = [
         ObservationFeatures(
             parameters={
                 "arms": Arm(parameters={
                     "a": 2,
                     "b": "a"
                 }).signature
             }),
         ObservationFeatures(
             parameters={
                 "arms": Arm(parameters={
                     "a": 3,
                     "b": "b"
                 }).signature
             }),
         ObservationFeatures(
             parameters={
                 "arms": Arm(parameters={
                     "a": 3,
                     "b": "c"
                 }).signature
             }),
     ]
     self.t = SearchSpaceToChoice(
         search_space=self.search_space,
         observation_features=self.observation_features,
         observation_data=None,
     )
     self.t2 = SearchSpaceToChoice(
         search_space=self.search_space,
         observation_features=[self.observation_features[0]],
         observation_data=None,
     )
Exemple #29
0
def get_discrete_search_space() -> SearchSpace:
    return SearchSpace(
        [
            RangeParameter("x", ParameterType.INT, 0, 3),
            RangeParameter("y", ParameterType.INT, 5, 7),
            ChoiceParameter("z", ParameterType.STRING, ["red", "panda"]),
        ]
    )
Exemple #30
0
def get_large_factorial_search_space() -> SearchSpace:
    return SearchSpace(parameters=[
        ChoiceParameter(
            name=f"factor{j}",
            parameter_type=ParameterType.STRING,
            values=[f"level1{i}" for i in range(10)],
        ) for j in range(6)
    ])