diff --git a/force_bdss/core/data_value.py b/force_bdss/core/data_value.py index 51226d9f407e7320274fd595f91deacd9de38f0c..c03f1dae6006d4f4f805a94881858087962fcda5 100644 --- a/force_bdss/core/data_value.py +++ b/force_bdss/core/data_value.py @@ -1,4 +1,4 @@ -from traits.api import HasStrictTraits, Any, String, Enum, Bool +from traits.api import HasStrictTraits, Any, String, Enum class DataValue(HasStrictTraits): diff --git a/force_bdss/core/kpi_specification.py b/force_bdss/core/kpi_specification.py index 672a9cf54fccfd5484b2f3a62e0e43b829adf2e1..f6759396d7af882a1a201257d449576b3164144b 100644 --- a/force_bdss/core/kpi_specification.py +++ b/force_bdss/core/kpi_specification.py @@ -7,4 +7,5 @@ class KPISpecification(HasStrictTraits): #: The user defined name of the variable containing the kpi value. name = Identifier() - target = Enum("MINIMISE") + #: The expected outcome of the procedure relative to this KPI. + objective = Enum("MINIMISE") diff --git a/force_bdss/core/output_slot_info.py b/force_bdss/core/output_slot_info.py index 6fd360db20894e9808b79592ff5f93f0face13c5..b2307d49c1de988a0d651c11155bc7f7d22835c6 100644 --- a/force_bdss/core/output_slot_info.py +++ b/force_bdss/core/output_slot_info.py @@ -1,4 +1,4 @@ -from traits.api import HasStrictTraits, Bool +from traits.api import HasStrictTraits from ..local_traits import Identifier diff --git a/force_bdss/data_sources/tests/test_base_data_source_model.py b/force_bdss/data_sources/tests/test_base_data_source_model.py index 7bdcc3ca0d22cda6e63aaa702e6ba12c84bb7009..a9be54b713f94d073c2659aa001a5000758b41f9 100644 --- a/force_bdss/data_sources/tests/test_base_data_source_model.py +++ b/force_bdss/data_sources/tests/test_base_data_source_model.py @@ -57,12 +57,10 @@ class TestBaseDataSourceModel(unittest.TestCase): { "__traits_version__": "4.6.0", "name": "baz", - "is_kpi": False }, { "__traits_version__": "4.6.0", "name": "quux", - "is_kpi": False } ] }) diff --git a/force_bdss/io/tests/test_workflow_reader.py b/force_bdss/io/tests/test_workflow_reader.py index 84bd572a874aae30549a402ae58b4a04a6e754a0..c3e81cb11f8b9218edb6a37408dfff963bb099dc 100644 --- a/force_bdss/io/tests/test_workflow_reader.py +++ b/force_bdss/io/tests/test_workflow_reader.py @@ -34,7 +34,8 @@ class TestWorkflowReader(unittest.TestCase): ".dummy_mco_parameter", "model_data": {} } - ] + ], + "kpis": [] }, }, "execution_layers": [ @@ -146,6 +147,8 @@ class TestModelCreationFailure(unittest.TestCase): ".probe_mco_parameter", "model_data": {} } + ], + "kpis": [ ] }, }, diff --git a/force_bdss/io/workflow_reader.py b/force_bdss/io/workflow_reader.py index dd9687e2f28c87696caa8e4f047fbfcd60e3fc56..f2b3829875f47f0ee0728625055909372e223323 100644 --- a/force_bdss/io/workflow_reader.py +++ b/force_bdss/io/workflow_reader.py @@ -5,6 +5,7 @@ from traits.api import HasStrictTraits, Instance from force_bdss.core.execution_layer import ExecutionLayer from force_bdss.core.input_slot_info import InputSlotInfo +from force_bdss.core.kpi_specification import KPISpecification from force_bdss.core.output_slot_info import OutputSlotInfo from force_bdss.core.workflow import Workflow from ..factory_registry_plugin import IFactoryRegistryPlugin @@ -165,6 +166,9 @@ class WorkflowReader(HasStrictTraits): model_data["parameters"] = self._extract_mco_parameters( mco_id, model_data["parameters"]) + model_data["kpis"] = self._extract_kpi_specifications( + model_data["kpis"] + ) try: model = mco_factory.create_model(model_data) @@ -281,6 +285,9 @@ class WorkflowReader(HasStrictTraits): return parameters + def _extract_kpi_specifications(self, info): + return [KPISpecification(**d) for d in info] + def _extract_input_slot_info(self, info): return [InputSlotInfo(**d) for d in info] diff --git a/force_bdss/io/workflow_writer.py b/force_bdss/io/workflow_writer.py index 9a0db688d9b17cb9d9e8e1ee86fb0f50e82532d0..aadd19d2156dc98ca3ea2aff5db5fad7e5e40d0b 100644 --- a/force_bdss/io/workflow_writer.py +++ b/force_bdss/io/workflow_writer.py @@ -46,11 +46,7 @@ class WorkflowWriter(HasStrictTraits): parameters_data = [] for param in data["model_data"]["parameters"]: - state = param.__getstate__() - try: - state.pop("__traits_version__") - except KeyError: - pass + state = traits_to_dict(param) parameters_data.append( { @@ -60,6 +56,15 @@ class WorkflowWriter(HasStrictTraits): ) data["model_data"]["parameters"] = parameters_data + + kpis_data = [] + for kpi in data["model_data"]["kpis"]: + kpis_data.append( + traits_to_dict(kpi) + ) + + data["model_data"]["kpis"] = kpis_data + return data def _execution_layer_data(self, layer): @@ -75,13 +80,21 @@ class WorkflowWriter(HasStrictTraits): """ Extracts the data from an external model and returns its dictionary """ - state = model.__getstate__() - try: - state.pop("__traits_version__") - except KeyError: - pass + state = traits_to_dict(model) return { "id": model.factory.id, "model_data": state } + + +def traits_to_dict(traits_obj): + """Converts a traits class into a dict, removing the pesky + traits version.""" + state = traits_obj.__getstate__() + try: + state.pop("__traits_version__") + except KeyError: + pass + + return state diff --git a/force_bdss/mco/base_mco_model.py b/force_bdss/mco/base_mco_model.py index af89084dfeefc44ed407e22fc2f0c86ebe3887c5..b39f88ef7f7d9e503759c6428dfc2df6b97e0346 100644 --- a/force_bdss/mco/base_mco_model.py +++ b/force_bdss/mco/base_mco_model.py @@ -18,10 +18,10 @@ class BaseMCOModel(ABCHasStrictTraits): visible=False, transient=True) - # A list of the parameters for the MCO + #: A list of the parameters for the MCO parameters = List(BaseMCOParameter, visible=False) - # A list of KPI specification objects and their objective. + #: A list of KPI specification objects and their objective. kpis = List(KPISpecification, visible=False) def __init__(self, factory, *args, **kwargs): diff --git a/force_bdss/tests/fixtures/test_csv.json b/force_bdss/tests/fixtures/test_csv.json deleted file mode 100644 index 692ff7981d7c8ed1a5ed2b81e66a5f847e341f95..0000000000000000000000000000000000000000 --- a/force_bdss/tests/fixtures/test_csv.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "version": "1", - "workflow": { - "mco": { - "id": "force.bdss.enthought.factory.dummy_dakota", - "model_data": { - "parameters" : [ - { - "id": "force.bdss.enthought.factory.dummy_dakota.parameter.ranged", - "model_data": { - "initial_value": 3, - "lower_bound": 0, - "upper_bound": 10, - "name": "p0", - "type": "PRESSURE" - } - } - ] - } - }, - "data_sources": [ - { - "id": "force.bdss.enthought.factory.csv_extractor", - "model_data": { - "filename": "foo.csv", - "row": 3, - "column": 5, - "cuba_type": "PRESSURE", - "input_slot_maps": [ - ], - "output_slot_names": [ - "p1" - ] - } - }, - { - "id": "force.bdss.enthought.factory.csv_extractor", - "model_data": { - "filename": "foo.csv", - "row": 3, - "column": 5, - "cuba_type": "PRESSURE", - "input_slot_maps": [ - ], - "output_slot_names": [ - "p2" - ] - } - } - ], - "kpi_calculators": [ - { - "id": "force.bdss.enthought.factory.kpi_adder", - "model_data": { - "cuba_type_in": "PRESSURE", - "cuba_type_out": "TOTAL_PRESSURE", - "input_slot_maps": [ - { - "name": "p0" - }, - { - "name": "p1" - }, - { - "name": "p2" - } - ], - "output_slot_names": [ - "ptot" - ] - } - } - ], - "notification_listeners": [ - ] - } -} diff --git a/force_bdss/tests/fixtures/test_dummy.json b/force_bdss/tests/fixtures/test_dummy.json index 36ec5c0587db0f2d7d2bd06170c0b98f598a3a83..f11bc0668b188287157d3d54ff9529e643995585 100644 --- a/force_bdss/tests/fixtures/test_dummy.json +++ b/force_bdss/tests/fixtures/test_dummy.json @@ -12,6 +12,12 @@ "type": "PRESSURE" } } + ], + "kpis": [ + { + "name": "bar", + "objective": "MINIMISE" + } ] } }, @@ -31,8 +37,7 @@ ], "output_slot_info": [ { - "name": "bar", - "is_kpi": true + "name": "bar" } ] } diff --git a/force_bdss/tests/fixtures/test_empty.json b/force_bdss/tests/fixtures/test_empty.json index 00c6b2f2c28e9e39c2fad25d947c2b0cf13c5d38..c739dfe79e991be00f76022be596b7fe30ec7888 100644 --- a/force_bdss/tests/fixtures/test_empty.json +++ b/force_bdss/tests/fixtures/test_empty.json @@ -4,8 +4,6 @@ "mco": null, "execution_layers": [ ], - "kpi_calculators": [ - ], "notification_listeners": [ ] } diff --git a/force_bdss/tests/fixtures/test_null.json b/force_bdss/tests/fixtures/test_null.json index b5c9ab99b836a09c01b1c196165d73fd59b6f63e..8103e91c7723fdf5c648898a990bb015c7f83119 100644 --- a/force_bdss/tests/fixtures/test_null.json +++ b/force_bdss/tests/fixtures/test_null.json @@ -5,6 +5,8 @@ "id": "force.bdss.enthought.plugin.test.v0.factory.probe_mco", "model_data": { "parameters" : [ + ], + "kpis": [ ] } }, diff --git a/force_bdss/tests/fixtures/test_probe.json b/force_bdss/tests/fixtures/test_probe.json index 2eba16d229b756c737c537fc36cd3cd61bd3e528..c0c1bdeee8e1fec0854b4ff699b04bd39825ccfc 100644 --- a/force_bdss/tests/fixtures/test_probe.json +++ b/force_bdss/tests/fixtures/test_probe.json @@ -12,6 +12,12 @@ "type": "PRESSURE" } } + ], + "kpis": [ + { + "name": "bar", + "objective": "MINIMISE" + } ] } }, @@ -28,8 +34,7 @@ ], "output_slot_info": [ { - "name": "bar", - "is_kpi": true + "name": "bar" } ] } diff --git a/force_bdss/tests/test_core_evaluation_driver.py b/force_bdss/tests/test_core_evaluation_driver.py index 5d206ecdbce91993263203828b30753d2e84358d..172ceaaf381c60c3263679e3bc733b68a2129c58 100644 --- a/force_bdss/tests/test_core_evaluation_driver.py +++ b/force_bdss/tests/test_core_evaluation_driver.py @@ -4,6 +4,7 @@ import testfixtures import six from force_bdss.core.execution_layer import ExecutionLayer +from force_bdss.core.kpi_specification import KPISpecification from force_bdss.core.output_slot_info import OutputSlotInfo from force_bdss.core.workflow import Workflow from force_bdss.tests.probe_classes.factory_registry_plugin import \ @@ -14,6 +15,7 @@ from force_bdss.core.input_slot_info import InputSlotInfo from force_bdss.core.data_value import DataValue from force_bdss.core.slot import Slot from force_bdss.tests import fixtures +from force_bdss.tests.probe_classes.mco import ProbeMCOFactory try: import mock @@ -223,7 +225,14 @@ class TestCoreEvaluationDriver(unittest.TestCase): output_slots_size=1, run_function=multiplier) + mco_factory = ProbeMCOFactory(self.plugin) + mco_model = mco_factory.create_model() + mco_model.kpis = [ + KPISpecification(name="out1") + ] + wf = Workflow( + mco=mco_model, execution_layers=[ ExecutionLayer(), ExecutionLayer(), @@ -281,7 +290,7 @@ class TestCoreEvaluationDriver(unittest.TestCase): InputSlotInfo(name="res2") ] model.output_slot_info = [ - OutputSlotInfo(name="out1", is_kpi=True) + OutputSlotInfo(name="out1") ] wf.execution_layers[3].data_sources.append(model)