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] )
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)
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
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
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)
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