def test_equality(): """Test that equality checks both bounds and units.""" value1 = UniformReal(0, 1, '') value2 = UniformReal(0, 1, 'cm') value3 = UniformReal(0, 2, '') assert value1 == value1 assert value1 != value2 assert value1 != value3 assert value1 != 0.5
def test_simple_deserialization(valid_data): """Ensure that a deserialized Process Spec looks sane.""" process_spec: ProcessSpec = ProcessSpec.build(valid_data) assert process_spec.uids == {'id': valid_data['uids']['id']} assert process_spec.tags == ['baking::cakes', 'danger::low'] assert process_spec.parameters[0] == Parameter(name='oven temp', value=UniformReal( 195, 205, ''), origin='specified') assert process_spec.conditions == [] assert process_spec.template == \ ProcessTemplate('the template', uids={'id': valid_data['template']['uids']['id']}, parameters=[ [ParameterTemplate('oven temp template', bounds=RealBounds(175, 225, ''), uids={'id': valid_data['template']['parameters'][0][0]['uids']['id']}), RealBounds(175, 225, '')] ], description='a long description', allowed_labels=['a', 'b'], allowed_names=['a name']) assert process_spec.name == 'Process 1' assert process_spec.notes == 'make sure to use oven mitts' assert process_spec.file_links == [ FileLink('cake_recipe.txt', 'www.baking.com') ] assert process_spec.typ == 'process_spec' assert process_spec.audit_info == AuditInfo(**valid_data['audit_info'])
def test_access_data(): """Demonstrate and test access patterns within the data island.""" binders = { "Polyethylene Glycol 100M": 0.02, "Sodium lignosulfonate": 0.004, "Polyvinyl Acetate": 0.0001 } powders = {"Al2O3": 0.96} island = make_data_island(density=1.0, bulk_modulus=300.0, firing_temperature=750.0, binders=binders, powders=powders, tag="Me") # read the density value assert (island.measurements[0].properties[0].value == NominalReal(1.0, '')) # read the bulk modulus value assert (island.measurements[0].properties[1].value == NormalReal( 300.0, 3.0, '')) # read the firing temperature assert (island.process.conditions[0].value == UniformReal( 749.5, 750.5, 'degC')) assert (island.process.parameters[0].value == DiscreteCategorical( {"hot": 1.0})) # read the quantity of alumina quantities = island.process.ingredients[0].material.process.conditions[ 0].value.quantities assert (list(keyfilter(lambda x: x == "Al2O3", quantities).values())[0] == 0.96) # check that the serialization results in the correct number of objects in the preface # (note that neither measurements nor ingredients are serialized) assert (len(json.loads(dumps(island))["context"]) == 26)
def test_simple_deserialization(valid_data): """Ensure that a deserialized Process Run looks sane.""" process_run: ProcessRun = ProcessRun.build(valid_data) assert process_run.uids == { 'id': valid_data['uids']['id'], 'my_id': 'process1-v1' } assert process_run.tags == ['baking::cakes', 'danger::low'] assert process_run.conditions[0] == Condition(name='oven temp', value=NominalReal(203.0, ''), origin='measured') assert process_run.parameters == [] assert process_run.file_links == [] assert process_run.template is None assert process_run.output_material is None assert process_run.spec == \ ProcessSpec(name="Spec for proc 1", uids={'id': valid_data['spec']['uids']['id']}, conditions=[Condition(name='oven temp', value=UniformReal(175, 225, ''), origin='specified')] ) assert process_run.name == 'Process 1' assert process_run.notes == 'make sure to use oven mitts' assert process_run.typ == 'process_run'
def make_data_island(density, bulk_modulus, firing_temperature, binders, powders, tag=None): """Helper function to create a relatively involved data island.""" binder_specs = keymap(lambda x: MaterialSpec(name=x), binders) powder_specs = keymap(lambda x: MaterialSpec(name=x), powders) binder_runs = keymap(lambda x: MaterialRun(name=x.name, spec=x), binder_specs) powder_runs = keymap(lambda x: MaterialRun(name=x.name, spec=x), powder_specs) all_input_materials = keymap(lambda x: x.spec.name, merge(binder_runs, powder_runs)) mixing_composition = Condition( name="composition", value=NominalComposition(all_input_materials)) mixing_process = ProcessRun(name="Mixing", tags=["mixing"], conditions=[mixing_composition]) binder_ingredients = [] for run in binder_runs: binder_ingredients.append( IngredientRun( material=run, process=mixing_process, mass_fraction=NominalReal(binders[run.spec.name], ''), )) powder_ingredients = [] for run in powder_runs: powder_ingredients.append( IngredientRun( material=run, process=mixing_process, mass_fraction=NominalReal(powders[run.spec.name], ''), )) green_sample = MaterialRun("Green", process=mixing_process) measured_firing_temperature = Condition( name="Firing Temperature", value=UniformReal(firing_temperature - 0.5, firing_temperature + 0.5, 'degC'), template=firing_temperature_template) specified_firing_setting = Parameter(name="Firing setting", value=DiscreteCategorical("hot")) firing_spec = ProcessSpec("Firing", template=firing_template) firing_process = ProcessRun(name=firing_spec.name, conditions=[measured_firing_temperature], parameters=[specified_firing_setting], spec=firing_spec) IngredientRun(material=green_sample, process=firing_process, mass_fraction=NormalReal(1.0, 0.0, ''), volume_fraction=NormalReal(1.0, 0.0, ''), number_fraction=NormalReal(1.0, 0.0, '')) measured_density = Property(name="Density", value=NominalReal(density, ''), template=density_template) measured_modulus = Property(name="Bulk modulus", value=NormalReal(bulk_modulus, bulk_modulus / 100.0, '')) measurement_spec = MeasurementSpec("Mechanical Properties", template=measurement_template) measurement = MeasurementRun( measurement_spec.name, properties=[measured_density, measured_modulus], spec=measurement_spec) tags = [tag] if tag else [] material_spec = MaterialSpec("Coupon", template=material_template) material_run = MaterialRun(material_spec.name, process=firing_process, tags=tags, spec=material_spec) measurement.material = material_run return material_run
def test_invalid_bounds(): """Test that invalid bounds throw the appropriate error.""" with pytest.raises(ValueError): SampleAttributeTemplate(name="name") # Must have a bounds with pytest.raises(TypeError): SampleAttributeTemplate(name="name", bounds=UniformReal(0, 1, ''))
def test_bounds_order(): """Lower bound must be <= upper bound.""" UniformReal(4.4, 8.8, 'm') UniformReal(100.0, 100.0, 'm') with pytest.raises(AssertionError): UniformReal(23.2, 18.9, 'm')
def test_contains(): """Test that bounds know if a Value is contained within it.""" bounds = RealBounds(1, 3, 'm') assert bounds.contains(UniformReal(100, 200, 'cm')._to_bounds()) assert not bounds.contains(UniformReal(3, 5, 'm')._to_bounds()) assert not bounds.contains(UniformReal(1, 3, '')._to_bounds())
def test_invalid_instance(): """Calling make_instance on a non-spec should throw a TypeError.""" not_specs = [MeasurementRun("meas"), Condition("cond"), UniformReal(0, 1, ''), 'foo', 10] for not_spec in not_specs: with pytest.raises(TypeError): make_instance(not_spec)
assert frying.ingredients == [] oil.process = frying assert oil.process == frying assert boiling.ingredients == [potatoes] assert frying.ingredients == [oil] potatoes.process = frying assert potatoes.process == frying assert boiling.ingredients == [] assert set(frying.ingredients) == {oil, potatoes} VALID_QUANTITIES = [ NominalReal(14.0, ''), UniformReal(0.5, 0.6, 'm'), NormalReal(-0.3, 0.6, "kg") ] INVALID_QUANTITIES = [ NominalCategorical("blue"), NominalInteger(5), EmpiricalFormula("CH4"), 0.33, "0.5" ] @pytest.mark.parametrize("valid_quantity", VALID_QUANTITIES) def test_valid_quantities(valid_quantity): """ Check that all quantities must be continuous values.