def test_product_serialization(valid_product_design_space_data): """Ensure that a serialized ProductDesignSpace looks sane.""" design_space = ProductDesignSpace.build(valid_product_design_space_data) serialized = design_space.dump() serialized['id'] = valid_product_design_space_data['id'] assert serialized == valid_serialization_output( valid_product_design_space_data)
def test_simple_product_deserialization(valid_product_data): """Ensure that a deserialized ProductDesignSpace looks sane.""" design_space: ProductDesignSpace = ProductDesignSpace.build( valid_product_data) assert design_space.name == 'my design space' assert design_space.description == 'does some things' assert type(design_space.dimensions[0]) == ContinuousDimension assert design_space.dimensions[0].lower_bound == 6.0 assert type(design_space.dimensions[1]) == EnumeratedDimension assert design_space.dimensions[1].values == ['red']
def product_design_space() -> ProductDesignSpace: """Build a ProductDesignSpace for testing.""" alpha = RealDescriptor('alpha', 0, 100) beta = RealDescriptor('beta', 0, 100) gamma = CategoricalDescriptor('gamma', ['a', 'b', 'c']) dimensions = [ ContinuousDimension(alpha, 0, 10), ContinuousDimension(beta, 0, 10), EnumeratedDimension(gamma, ['a', 'c']) ] return ProductDesignSpace('my design space', 'does some things', dimensions)
def test_old_product_serialization(old_valid_product_design_space_data): """Ensure that the old version of the product design space can be (de)serialized. The previous version had no `subspaces` field and had type `Univariate`. Some on-platform assets are saved this way, and should be converted seamlessly into ProductDesignSpaces. """ design_space = ProductDesignSpace.build( old_valid_product_design_space_data) assert design_space.subspaces == [] assert design_space.typ == 'ProductDesignSpace' serialized = design_space.dump() serialized['id'] = old_valid_product_design_space_data['id'] serialized['config']['type'] = 'Univariate' del serialized['config']['subspaces'] assert serialized == valid_serialization_output( old_valid_product_design_space_data)
def test_product_serialization(valid_product_design_space_data): """Ensure that a serialized ProductDesignSpace looks sane.""" original_data = deepcopy(valid_product_design_space_data) design_space = ProductDesignSpace.build(valid_product_design_space_data) serialized = design_space.dump() serialized['id'] = valid_product_design_space_data['id'] assert serialized['config']['subspaces'][0] == original_data['config'][ 'subspaces'][0]['id'] assert serialized['config']['subspaces'][1] == original_data['config'][ 'subspaces'][1]['instance'] # Replace one of the subspaces with its uid, and check that the serialized result is the same. design_space.subspaces[0] = design_space.subspaces[0].uid serialized_with_uid = design_space.dump() serialized_with_uid['id'] = valid_product_design_space_data['id'] assert serialized_with_uid == serialized
import pytest from citrine.informatics.constraints import ScalarRangeConstraint, CategoricalConstraint from citrine.informatics.design_spaces import ProductDesignSpace, EnumeratedDesignSpace from citrine.informatics.objectives import ScalarMaxObjective, ScalarMinObjective from citrine.informatics.processors import GridProcessor, EnumeratedProcessor from citrine.informatics.scores import LIScore, EIScore from citrine.informatics.reports import ModelSummary, FeatureImportanceReport informatics_string_data = [ (ScalarRangeConstraint('z'), "<ScalarRangeConstraint 'z'>"), (CategoricalConstraint('x', []), "<CategoricalConstraint 'x'>"), (ProductDesignSpace('my design space', 'does some things', []), "<ProductDesignSpace 'my design space'>"), (EnumeratedDesignSpace('enumerated', 'desc', [], []), "<EnumeratedDesignSpace 'enumerated'>"), (ScalarMaxObjective('z', 1.0, 10.0), "<ScalarMaxObjective 'z'>"), (ScalarMinObjective('z', 1.0, 10.0), "<ScalarMinObjective 'z'>"), (GridProcessor('my thing', 'does a thing', dict(x=1)), "<GridProcessor 'my thing'>"), (EnumeratedProcessor('my enumerated thing', 'enumerates', 10), "<EnumeratedProcessor 'my enumerated thing'>"), (LIScore("LI(z)", "score for z", [], []), "<LIScore 'LI(z)'>"), (EIScore("EI(x)", "score for x", [], [], []), "<EIScore 'EI(x)'>"), (FeatureImportanceReport("reflectivity", {}), "<FeatureImportanceReport 'reflectivity'>"), (ModelSummary("my model", "ML Model", [], [], {}, [], "predictor name"), "<ModelSummary 'my model'>"), ]
informatics_string_data = [ (IngredientCountConstraint( formulation_descriptor=FormulationDescriptor('x'), min=0, max=1), "<IngredientCountConstraint 'x'>"), (IngredientFractionConstraint( formulation_descriptor=FormulationDescriptor('x'), ingredient='y', min=0, max=1), "<IngredientFractionConstraint 'x'::'y'>"), (LabelFractionConstraint(formulation_descriptor=FormulationDescriptor('x'), label='y', min=0, max=1), "<LabelFractionConstraint 'x'::'y'>"), (ScalarRangeConstraint('z'), "<ScalarRangeConstraint 'z'>"), (CategoricalConstraint('x', []), "<CategoricalConstraint 'x'>"), (ProductDesignSpace(name='my design space', description='does some things'), "<ProductDesignSpace 'my design space'>"), (EnumeratedDesignSpace('enumerated', 'desc', [], []), "<EnumeratedDesignSpace 'enumerated'>"), (FormulationDesignSpace(name='formulation', description='desc', formulation_descriptor=FormulationDescriptor('x'), ingredients={'y'}, constraints=set(), labels={}), "<FormulationDesignSpace 'formulation'>"), (ScalarMaxObjective('z'), "<ScalarMaxObjective 'z'>"), (ScalarMinObjective('z'), "<ScalarMinObjective 'z'>"), (GridProcessor('my thing', 'does a thing', dict(x=1)), "<GridProcessor 'my thing'>"), (EnumeratedProcessor('my enumerated thing', 'enumerates',