def test_nested_input(): dummy_schema = WorkflowSchema() dict_protocol = DummyInputOutputProtocol('dict_protocol') dict_protocol.input_value = {'a': ThermodynamicState(temperature=1*unit.kelvin)} dummy_schema.protocols[dict_protocol.id] = dict_protocol.schema quantity_protocol = DummyInputOutputProtocol('quantity_protocol') quantity_protocol.input_value = ProtocolPath('output_value[a].temperature', dict_protocol.id) dummy_schema.protocols[quantity_protocol.id] = quantity_protocol.schema dummy_schema.validate_interfaces() dummy_property = create_dummy_property(Density) dummy_workflow = Workflow(dummy_property, {}) dummy_workflow.schema = dummy_schema with tempfile.TemporaryDirectory() as temporary_directory: workflow_graph = WorkflowGraph(temporary_directory) workflow_graph.add_workflow(dummy_workflow) dask_local_backend = DaskLocalCluster(1, ComputeResources(1)) dask_local_backend.start() results_futures = workflow_graph.submit(dask_local_backend) assert len(results_futures) == 1 result = results_futures[0].result() assert isinstance(result, CalculationLayerResult)
def test_density_dielectric_merging(): substance = Mixture() substance.add_component('C', 1.0) density = Density(thermodynamic_state=ThermodynamicState( temperature=298 * unit.kelvin, pressure=1 * unit.atmosphere), phase=PropertyPhase.Liquid, substance=substance, value=10 * unit.gram / unit.mole, uncertainty=1 * unit.gram / unit.mole) dielectric = DielectricConstant(thermodynamic_state=ThermodynamicState( temperature=298 * unit.kelvin, pressure=1 * unit.atmosphere), phase=PropertyPhase.Liquid, substance=substance, value=10 * unit.gram / unit.mole, uncertainty=1 * unit.gram / unit.mole) density_schema = density.get_default_workflow_schema( 'SimulationLayer', PropertyWorkflowOptions()) dielectric_schema = dielectric.get_default_workflow_schema( 'SimulationLayer', PropertyWorkflowOptions()) density_metadata = Workflow.generate_default_metadata( density, get_data_filename('forcefield/smirnoff99Frosst.offxml'), PropertyEstimatorOptions()) dielectric_metadata = Workflow.generate_default_metadata( density, get_data_filename('forcefield/smirnoff99Frosst.offxml'), PropertyEstimatorOptions()) density_workflow = Workflow(density, density_metadata) density_workflow.schema = density_schema dielectric_workflow = Workflow(dielectric, dielectric_metadata) dielectric_workflow.schema = dielectric_schema workflow_graph = WorkflowGraph('') workflow_graph.add_workflow(density_workflow) workflow_graph.add_workflow(dielectric_workflow) merge_order_a = graph.topological_sort(density_workflow.dependants_graph) merge_order_b = graph.topological_sort( dielectric_workflow.dependants_graph) for protocol_id_A, protocol_id_B in zip(merge_order_a, merge_order_b): if protocol_id_A.find('extract_traj') < 0 and protocol_id_A.find( 'extract_stats') < 0: assert density_workflow.protocols[protocol_id_A].schema.json() == \ dielectric_workflow.protocols[protocol_id_B].schema.json() else: assert density_workflow.protocols[protocol_id_A].schema.json() != \ dielectric_workflow.protocols[protocol_id_B].schema.json()
def test_simple_workflow_graph_with_groups(): dummy_schema = WorkflowSchema() dummy_protocol_a = DummyEstimatedQuantityProtocol('protocol_a') dummy_protocol_a.input_value = EstimatedQuantity(1 * unit.kelvin, 0.1 * unit.kelvin, 'dummy_source') dummy_protocol_b = DummyEstimatedQuantityProtocol('protocol_b') dummy_protocol_b.input_value = ProtocolPath('output_value', dummy_protocol_a.id) conditional_group = ConditionalGroup('conditional_group') conditional_group.add_protocols(dummy_protocol_a, dummy_protocol_b) condition = ConditionalGroup.Condition() condition.right_hand_value = 2 * unit.kelvin condition.type = ConditionalGroup.ConditionType.LessThan condition.left_hand_value = ProtocolPath('output_value.value', conditional_group.id, dummy_protocol_b.id) conditional_group.add_condition(condition) dummy_schema.protocols[conditional_group.id] = conditional_group.schema dummy_schema.final_value_source = ProtocolPath('output_value', conditional_group.id, dummy_protocol_b.id) dummy_schema.validate_interfaces() dummy_property = create_dummy_property(Density) dummy_workflow = Workflow(dummy_property, {}) dummy_workflow.schema = dummy_schema with tempfile.TemporaryDirectory() as temporary_directory: workflow_graph = WorkflowGraph(temporary_directory) workflow_graph.add_workflow(dummy_workflow) dask_local_backend = DaskLocalClusterBackend(1, ComputeResources(1)) dask_local_backend.start() results_futures = workflow_graph.submit(dask_local_backend) assert len(results_futures) == 1 result = results_futures[0].result() assert isinstance(result, CalculationLayerResult) assert result.calculated_property.value == 1 * unit.kelvin
def test_cloned_schema_merging_simulation(registered_property_name, available_layer): """Tests that two, the exact the same, calculations get merged into one by the `WorkflowGraph`.""" registered_property = registered_properties[registered_property_name] substance = Mixture() substance.add_component('C', 1.0) dummy_property = create_dummy_property(registered_property) workflow_schema = dummy_property.get_default_workflow_schema( available_layer, PropertyWorkflowOptions()) if workflow_schema is None: return global_metadata = create_dummy_metadata(dummy_property, available_layer) workflow_a = Workflow(dummy_property, global_metadata) workflow_a.schema = workflow_schema workflow_b = Workflow(dummy_property, global_metadata) workflow_b.schema = workflow_schema workflow_graph = WorkflowGraph() workflow_graph.add_workflow(workflow_a) workflow_graph.add_workflow(workflow_b) ordered_dict_a = OrderedDict(sorted(workflow_a.dependants_graph.items())) ordered_dict_b = OrderedDict(sorted(workflow_b.dependants_graph.items())) merge_order_a = graph.topological_sort(ordered_dict_a) merge_order_b = graph.topological_sort(ordered_dict_b) assert len(workflow_graph._protocols_by_id) == len(workflow_a.protocols) for protocol_id in workflow_a.protocols: assert protocol_id in workflow_graph._protocols_by_id for protocol_id_A, protocol_id_B in zip(merge_order_a, merge_order_b): assert protocol_id_A == protocol_id_B assert workflow_a.protocols[protocol_id_A].schema.json() == \ workflow_b.protocols[protocol_id_B].schema.json()
def test_simple_workflow_graph(): dummy_schema = WorkflowSchema() dummy_protocol_a = DummyInputOutputProtocol('protocol_a') dummy_protocol_a.input_value = EstimatedQuantity(1 * unit.kelvin, 0.1 * unit.kelvin, 'dummy_source') dummy_schema.protocols[dummy_protocol_a.id] = dummy_protocol_a.schema dummy_protocol_b = DummyInputOutputProtocol('protocol_b') dummy_protocol_b.input_value = ProtocolPath('output_value', dummy_protocol_a.id) dummy_schema.protocols[dummy_protocol_b.id] = dummy_protocol_b.schema dummy_schema.final_value_source = ProtocolPath('output_value', dummy_protocol_b.id) dummy_schema.validate_interfaces() dummy_property = create_dummy_property(Density) dummy_workflow = Workflow(dummy_property, {}) dummy_workflow.schema = dummy_schema with tempfile.TemporaryDirectory() as temporary_directory: workflow_graph = WorkflowGraph(temporary_directory) workflow_graph.add_workflow(dummy_workflow) dask_local_backend = DaskLocalCluster(1, ComputeResources(1)) dask_local_backend.start() results_futures = workflow_graph.submit(dask_local_backend) assert len(results_futures) == 1 result = results_futures[0].result() assert isinstance(result, CalculationLayerResult) assert result.calculated_property.value == 1 * unit.kelvin