예제 #1
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}
        )
예제 #2
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["a"].parameter_type, ParameterType.INT)
        self.assertEqual(
            ss2.parameters["b" + OH_PARAM_INFIX + "_0"].parameter_type,
            ParameterType.FLOAT,
        )
        self.assertEqual(
            ss2.parameters["b" + OH_PARAM_INFIX + "_1"].parameter_type,
            ParameterType.FLOAT,
        )
        self.assertEqual(ss2.parameters["c" + OH_PARAM_INFIX].parameter_type,
                         ParameterType.FLOAT)
        self.assertEqual(ss2.parameters["d"].parameter_type,
                         ParameterType.FLOAT)

        # Parameter range fixed to [0,1].
        self.assertEqual(ss2.parameters["b" + OH_PARAM_INFIX + "_0"].lower,
                         0.0)
        self.assertEqual(ss2.parameters["b" + OH_PARAM_INFIX + "_1"].upper,
                         1.0)
        self.assertEqual(ss2.parameters["c" + OH_PARAM_INFIX].lower, 0.0)
        self.assertEqual(ss2.parameters["c" + OH_PARAM_INFIX].upper, 1.0)

        # Ensure we error if we try to transform a fidelity parameter
        ss3 = SearchSpace(parameters=[
            ChoiceParameter(
                "b",
                parameter_type=ParameterType.STRING,
                values=["a", "b", "c"],
                is_fidelity=True,
                target_value="c",
            )
        ])
        t = OneHot(search_space=ss3,
                   observation_features=None,
                   observation_data=None)
        with self.assertRaises(ValueError):
            t.transform_search_space(ss3)
예제 #3
0
class OneHotTransformTest(TestCase):
    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]),
                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
        })

    def testInit(self):
        self.assertEqual(list(self.t.encoded_parameters.keys()), ["b", "c"])
        self.assertEqual(list(self.t2.encoded_parameters.keys()), ["b", "c"])

    def testTransformObservationFeatures(self):
        observation_features = [self.observation_features]
        obs_ft2 = deepcopy(observation_features)
        obs_ft2 = self.t.transform_observation_features(obs_ft2)
        self.assertEqual(obs_ft2, [self.transformed_features])
        obs_ft2 = self.t.untransform_observation_features(obs_ft2)
        self.assertEqual(obs_ft2, observation_features)
        # Test partial transform
        obs_ft3 = [ObservationFeatures(parameters={"x": 2.2, "b": "b"})]
        obs_ft3 = self.t.transform_observation_features(obs_ft3)
        self.assertEqual(
            obs_ft3[0],
            ObservationFeatures(
                parameters={
                    "x": 2.2,
                    "b" + OH_PARAM_INFIX + "_0": 0,
                    "b" + OH_PARAM_INFIX + "_1": 1,
                    "b" + OH_PARAM_INFIX + "_2": 0,
                }),
        )
        obs_ft5 = self.t.transform_observation_features(
            [ObservationFeatures({})])
        self.assertEqual(obs_ft5[0], ObservationFeatures({}))

    def testRandomizedTransform(self):
        observation_features = [self.observation_features]
        obs_ft2 = deepcopy(observation_features)
        obs_ft2 = self.t2.transform_observation_features(obs_ft2)
        self.assertEqual(obs_ft2, [self.transformed_features])
        obs_ft2 = self.t2.untransform_observation_features(obs_ft2)
        self.assertEqual(obs_ft2, observation_features)

    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["a"].parameter_type, ParameterType.INT)
        self.assertEqual(
            ss2.parameters["b" + OH_PARAM_INFIX + "_0"].parameter_type,
            ParameterType.FLOAT,
        )
        self.assertEqual(
            ss2.parameters["b" + OH_PARAM_INFIX + "_1"].parameter_type,
            ParameterType.FLOAT,
        )
        self.assertEqual(ss2.parameters["c" + OH_PARAM_INFIX].parameter_type,
                         ParameterType.FLOAT)
        self.assertEqual(ss2.parameters["d"].parameter_type,
                         ParameterType.FLOAT)

        # Parameter range fixed to [0,1].
        self.assertEqual(ss2.parameters["b" + OH_PARAM_INFIX + "_0"].lower,
                         0.0)
        self.assertEqual(ss2.parameters["b" + OH_PARAM_INFIX + "_1"].upper,
                         1.0)
        self.assertEqual(ss2.parameters["c" + OH_PARAM_INFIX].lower, 0.0)
        self.assertEqual(ss2.parameters["c" + OH_PARAM_INFIX].upper, 1.0)