Пример #1
0
    def setUpClass(cls) -> None:

        cls.simple_hypergrid = SimpleHypergrid(
            name='simple_adaptee',
            dimensions=[
                CategoricalDimension(name='categorical_mixed_types', values=['red', True, False, 1]),
                DiscreteDimension(name='one_to_ten', min=1, max=10),
                ContinuousDimension(name='zero_to_one', min=0, max=1),
                OrdinalDimension(name='ordinal_mixed_types', ordered_values=[1, False, 'two'])
            ]
        )

        cls.hierarchical_hypergrid = SimpleHypergrid(
            name='hierarchical_adaptee',
            dimensions=[
                CategoricalDimension(name='categorical_mixed_types', values=['red', True, False, 3]),
                DiscreteDimension(name='one_to_ten', min=1, max=10),
                ContinuousDimension(name='zero_to_one', min=0, max=1),
                OrdinalDimension(name='ordinal_mixed_types', ordered_values=[3, False, 'two'])
            ]
        ).join(
            subgrid=SimpleHypergrid(
                name="nested_grid",
                dimensions=[
                    CategoricalDimension(name='categorical_mixed_types', values=['red', False, True, 3]),
                    DiscreteDimension(name='one_to_ten', min=1, max=10),
                    ContinuousDimension(name='zero_to_one', min=0, max=1),
                    OrdinalDimension(name='ordinal_mixed_types', ordered_values=[3, 'two', False])
                ]
            ),
            on_external_dimension=CategoricalDimension("categorical_mixed_types", values=[True])
        )
 def decode_ordinal_dimension(serialized: OptimizerService_pb2.OrdinalDimension) -> OrdinalDimension:
     assert isinstance(serialized, OptimizerService_pb2.OrdinalDimension)
     return OrdinalDimension(
         name=serialized.Name,
         ascending=serialized.Ascending,
         ordered_values=[OptimizerServiceDecoder.decode_primitive_value(value) for value in serialized.OrderedValues]
     )
Пример #3
0
 def test_ordinal_dimension(self):
     ordinal_dimension = OrdinalDimension(
         name='ordinal', ordered_values=['good', 'better', 'best'])
     serialized = OptimizerServiceEncoder.encode_ordinal_dimension(
         ordinal_dimension)
     deserialized = OptimizerServiceDecoder.decode_ordinal_dimension(
         serialized)
     assert deserialized == ordinal_dimension
     assert isinstance(serialized, OptimizerService_pb2.OrdinalDimension)
Пример #4
0
    def setup_class(cls) -> None:

        cls.simple_hypergrid = SimpleHypergrid(
            name='simple_adaptee',
            dimensions=[
                CategoricalDimension(name='categorical_mixed_types',
                                     values=['red', True, False, 5]),
                DiscreteDimension(name='one_to_ten', min=1, max=10),
                ContinuousDimension(name='z_one', min=-1, max=2),
                ContinuousDimension(name='z_two', min=-2, max=1),
                ContinuousDimension(name='z_3', min=-2, max=-1),
                OrdinalDimension(name='ordinal_mixed_types',
                                 ordered_values=[1, False, 'two'])
            ])

        cls.unbalanced_hierarchical_hypergrid = SimpleHypergrid(
            name='hierarchical_adaptee',
            dimensions=[
                CategoricalDimension(name='categorical_mixed_types',
                                     values=['red', True, False, 3]),
                DiscreteDimension(name='one_to_ten', min=1, max=10),
                ContinuousDimension(name='x1', min=-1, max=1),
                ContinuousDimension(name='x2', min=-1, max=1),
                OrdinalDimension(name='ordinal_mixed_types',
                                 ordered_values=[3, False, 'two'])
            ]).join(subgrid=SimpleHypergrid(
                name="nested_grid",
                dimensions=[
                    CategoricalDimension(name='categorical_mixed_types',
                                         values=['red', False, True, 3]),
                    DiscreteDimension(name='one_to_ten', min=1, max=10),
                    ContinuousDimension(name='x1', min=-1, max=1),
                    ContinuousDimension(name='x2', min=-1, max=1),
                    OrdinalDimension(name='ordinal_mixed_types',
                                     ordered_values=[3, 'two', False])
                ]),
                    on_external_dimension=CategoricalDimension(
                        "categorical_mixed_types", values=[True]))

        cls.balanced_hierarchical_hypergrid = ThreeLevelQuadratic(
        ).parameter_space
Пример #5
0
    def test_optimization_problem_none_context(self):
        parameter_space = SimpleHypergrid(
            name="test",
            dimensions=[
                ContinuousDimension(name="x", min=0, max=1),
                OrdinalDimension(name="y", ordered_values=[1, 2, 3, 5, 10]),
                CategoricalDimension(name="y2", values=[True, False])
            ])
        objective_space = SimpleHypergrid(name="z",
                                          dimensions=[
                                              ContinuousDimension(
                                                  name="z\n special",
                                                  min=-50,
                                                  max=-49),
                                              ContinuousDimension(name="z1",
                                                                  min=-1,
                                                                  max=1)
                                          ])
        optimization_problem = OptimizationProblem(
            parameter_space=parameter_space,
            objective_space=objective_space,
            objectives=[
                Objective(name="z\n special", minimize=True),
                Objective(name="z1", minimize=False)
            ])

        encoded_problem = OptimizerServiceEncoder.encode_optimization_problem(
            optimization_problem)
        decoded_problem = OptimizerServiceDecoder.decode_optimization_problem(
            encoded_problem)

        print(f"Context space is: {decoded_problem.context_space}")
        assert decoded_problem.context_space is None

        # Ensure that the parameter space is still valid
        # Parameter Space
        for _ in range(1000):
            assert decoded_problem.parameter_space.random() in parameter_space
            assert parameter_space.random() in decoded_problem.parameter_space

        # Output Space
        for _ in range(1000):
            assert decoded_problem.objective_space.random() in objective_space
            assert objective_space.random() in decoded_problem.objective_space

        # Feature Space
        for _ in range(1000):
            assert decoded_problem.feature_space.random(
            ) in optimization_problem.feature_space
            assert optimization_problem.feature_space.random(
            ) in decoded_problem.feature_space
Пример #6
0
    def setUp(self):

        self.cache_param_space = SimpleHypergrid(
            name='cache_param_space',
            dimensions=[
                CategoricalDimension(name='cache_implementation_name', values=['lru_cache', 'associative_cache'])
            ]
        )

        self.lru_cache_param_space = SimpleHypergrid(
            name='lru_cache_config',
            dimensions=[
                DiscreteDimension(name='size', min=1, max=2**20),
                OrdinalDimension(name='color', ordered_values=['green', 'orange', 'red'])
            ]
        )


        self.associative_cache_implementation_root_param_space = SimpleHypergrid(
            name='associative_cache_config',
            dimensions=[
                CategoricalDimension(name='hash_function_name', values=['mod_prime_hash_function', 'lowest_bits']),
                CategoricalDimension(name='bucket_implementation', values=['single_value', 'binary_search_tree', 'linked_list'])
            ]
        )


        self.mod_prime_hash_function_param_space = SimpleHypergrid(
            name='mod_prime_hash_function',
            dimensions=[
                OrdinalDimension(name='prime', ordered_values=[1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59])
            ]
        )

        self.lowest_bits_param_space = SimpleHypergrid(
            name='lowest_bits',
            dimensions=[
                DiscreteDimension(name='num_bits', min=1, max=64)
            ]
        )


        self.binary_search_tree_param_space = SimpleHypergrid(
            name='binary_search_tree',
            dimensions=[
                DiscreteDimension(name='max_depth', min=1, max=2**10)
            ]
        )

        self.linked_list_param_space = SimpleHypergrid(
            name='linked_list',
            dimensions=[
                DiscreteDimension(name='max_length', min=1, max=2**10)
            ]
        )


        self.associative_cache_implementation_param_space = self.associative_cache_implementation_root_param_space.join(
            subgrid=self.mod_prime_hash_function_param_space,
            on_external_dimension=CategoricalDimension(name='hash_function_name', values=['mod_prime_hash_function'])
        ).join(
            subgrid=self.lowest_bits_param_space,
            on_external_dimension=CategoricalDimension(name='hash_function_name', values='lowest_bits')
        ).join(
            subgrid=self.binary_search_tree_param_space,
            on_external_dimension=CategoricalDimension(name='bucket_implementation', values=['binary_search_tree'])
        )

        self.cache_param_space = self.cache_param_space.join(
            subgrid=self.lru_cache_param_space,
            on_external_dimension=CategoricalDimension(name='cache_implementation_name', values=['lru_cache'])
        ).join(
            subgrid=self.associative_cache_implementation_param_space,
            on_external_dimension=CategoricalDimension(name='cache_implementation_name', values=['associative_cache'])
        ).join(
            subgrid=self.linked_list_param_space,
            on_external_dimension=CategoricalDimension(name='associative_cache_config.bucket_implementation', values=['linked_list'])
        )
import json
import os
import sys

mlos_root_path = os.environ['MLOS_ROOT']
mlos_python_root_path = os.path.join(mlos_root_path, 'Source', 'Mlos.Python')
sys.path.append(mlos_python_root_path)

from mlos.Spaces import SimpleHypergrid, EmptyDimension, CategoricalDimension, ContinuousDimension, DiscreteDimension, OrdinalDimension
from mlos.Spaces.HypergridsJsonEncoderDecoder import HypergridJsonEncoder, HypergridJsonDecoder

continuous = ContinuousDimension(name='continuous', min=1, max=10)
discrete = DiscreteDimension(name='discrete', min=1, max=10)
ordinal = OrdinalDimension(name='ordinal', ordered_values=[1,2,3,4,5,6,7,8,9,10])
categorical = CategoricalDimension(name='categorical', values=[1,2,3,4,5,6,7,8,9,10])

simple_hypergrid = SimpleHypergrid(
    name='all_kinds_of_dimensions',
    dimensions = [
        continuous,
        discrete,
        ordinal,
        categorical
    ]
)

py_simple_hypergrid_json_string = json.dumps(simple_hypergrid, cls=HypergridJsonEncoder)
Пример #8
0
    def object_hook(self, obj):
        type_names_to_types = {
            "EmptyDimension": EmptyDimension,
            "CategoricalDimension": CategoricalDimension,
            "ContinuousDimension": ContinuousDimension,
            "DiscreteDimension": DiscreteDimension,
            "OrdinalDimension": OrdinalDimension,
            "CompositeDimension": CompositeDimension,
        }

        if 'ObjectType' not in obj:
            return obj

        object_type = obj['ObjectType']

        if object_type == 'EmptyDimension':
            return EmptyDimension(
                name=obj['Name'],
                type=type_names_to_types[obj['Type']]
            )
        if object_type == "CategoricalDimension":
            return CategoricalDimension(
                name=obj['Name'],
                values=obj['Values']
            )
        if object_type == "ContinuousDimension":
            return ContinuousDimension(
                name=obj['Name'],
                min=obj.get('Min', None),
                max=obj.get('Max', None),
                include_min=obj.get('IncludeMin', None),
                include_max=obj.get('IncludeMax', None)
            )
        if object_type == "DiscreteDimension":
            return DiscreteDimension(
                name=obj['Name'],
                min=obj['Min'],
                max=obj['Max']
            )
        if object_type == "OrdinalDimension":
            return OrdinalDimension(
                name=obj['Name'],
                ordered_values=obj.get('OrderedValues', None),
                ascending=obj.get('Ascending', True) # TODO - this looks risky
            )
        if object_type == "CompositeDimension":
            return CompositeDimension(
                name=obj['Name'],
                chunks_type=type_names_to_types[obj['ChunksType']],
                chunks=obj['Chunks']
            )
        if object_type == "SimpleHypergrid":
            simple_hypergrid = SimpleHypergrid(
                name=obj['Name'],
                dimensions=obj.get('Dimensions', [])
            )

            for _, subgrids_joined_on_dimension in obj.get('GuestSubgrids', dict()).items():
                for joined_subgrid in subgrids_joined_on_dimension:
                    simple_hypergrid.add_subgrid_on_external_dimension(
                        other_hypergrid=joined_subgrid.subgrid,
                        external_dimension=joined_subgrid.join_dimension
                    )
            return simple_hypergrid

        if object_type == "GuestSubgrid":
            return SimpleHypergrid.JoinedSubgrid(
                subgrid=obj['Subgrid'],
                join_dimension=obj['ExternalPivotDimension']
            )

        if object_type == "set":
            return set(obj['Values'])

        return obj