diff --git a/force_bdss/core/data_value.py b/force_bdss/core/data_value.py index 9da19abdd53a7ecd59b3a808a93bb2d5fdef1bb7..51226d9f407e7320274fd595f91deacd9de38f0c 100644 --- a/force_bdss/core/data_value.py +++ b/force_bdss/core/data_value.py @@ -22,9 +22,6 @@ class DataValue(HasStrictTraits): #: A flag for the quality of the data. quality = Enum("AVERAGE", "POOR", "GOOD") - # Set by the engine. True if the data value contains a KPI. - is_kpi = Bool(False) - def __str__(self): s = "{} {} = {}".format( @@ -35,7 +32,4 @@ class DataValue(HasStrictTraits): s += " ({})".format(str(self.quality)) - if self.is_kpi: - s += " (KPI)" - return s diff --git a/force_bdss/core/kpi_specification.py b/force_bdss/core/kpi_specification.py new file mode 100644 index 0000000000000000000000000000000000000000..672a9cf54fccfd5484b2f3a62e0e43b829adf2e1 --- /dev/null +++ b/force_bdss/core/kpi_specification.py @@ -0,0 +1,10 @@ +from traits.api import Enum, HasStrictTraits + +from force_bdss.local_traits import Identifier + + +class KPISpecification(HasStrictTraits): + #: The user defined name of the variable containing the kpi value. + name = Identifier() + + target = Enum("MINIMISE") diff --git a/force_bdss/core/output_slot_info.py b/force_bdss/core/output_slot_info.py index 8385fa4f11b98d5bd200b6b4f86dabaa468e2da6..6fd360db20894e9808b79592ff5f93f0face13c5 100644 --- a/force_bdss/core/output_slot_info.py +++ b/force_bdss/core/output_slot_info.py @@ -13,7 +13,3 @@ class OutputSlotInfo(HasStrictTraits): """ #: The user defined name of the variable containing the value. name = Identifier() - - #: True if the value associated to this output slot must be exported as - #: a KPI. - is_kpi = Bool(False) diff --git a/force_bdss/core_evaluation_driver.py b/force_bdss/core_evaluation_driver.py index 151da8cbd3cb069608043df8d92acdc156fb3e39..e89f72446a5f4d9e995213b6bc6ed05544ed4084 100644 --- a/force_bdss/core_evaluation_driver.py +++ b/force_bdss/core_evaluation_driver.py @@ -65,7 +65,15 @@ def execute_workflow(workflow, data_values): available_data_values += ds_results log.info("Aggregating KPI data") - kpi_results = [dv for dv in available_data_values if dv.is_kpi] + + kpi_results = [] + kpi_names = [kpi.name for kpi in workflow.mco.kpis] + + kpi_results = [ + dv + for dv in available_data_values + if dv.name in kpi_names + ] return kpi_results @@ -165,7 +173,6 @@ def _compute_layer_results(environment_data_values, # Add the names as specified by the user. for dv, output_slot_info in zip(res, model.output_slot_info): dv.name = output_slot_info.name - dv.is_kpi = output_slot_info.is_kpi # If the name was not specified, simply discard the value, # because apparently the user is not interested in it. diff --git a/force_bdss/core_mco_driver.py b/force_bdss/core_mco_driver.py index 733b34b8a07c06a662c72b8f7c25bf0b7729071f..46b9cda35e39fe97fd0f4d50ff168109f54f460f 100644 --- a/force_bdss/core_mco_driver.py +++ b/force_bdss/core_mco_driver.py @@ -88,17 +88,10 @@ class CoreMCODriver(BaseCoreDriver): @on_trait_change("mco:started") def _deliver_start_event(self): - output_kpis = [] - for layer in self.workflow.execution_layers: - for data_source in layer.data_sources: - output_kpis.extend( - info for info in data_source.output_slot_info - if info.is_kpi - ) - + mco_model = self.workflow.mco self._deliver_event(MCOStartEvent( - input_names=tuple(p.name for p in self.workflow.mco.parameters), - output_names=tuple([on.name for on in output_kpis]) + input_names=tuple(p.name for p in mco_model.parameters), + output_names=tuple([kpi.name for kpi in mco_model.kpis]) )) @on_trait_change("mco:finished") diff --git a/force_bdss/mco/base_mco_model.py b/force_bdss/mco/base_mco_model.py index f1e545a579e9a986bb2a57147b7f0ec30f79d7bc..af89084dfeefc44ed407e22fc2f0c86ebe3887c5 100644 --- a/force_bdss/mco/base_mco_model.py +++ b/force_bdss/mco/base_mco_model.py @@ -1,5 +1,6 @@ from traits.api import ABCHasStrictTraits, Instance, List +from force_bdss.core.kpi_specification import KPISpecification from .parameters.base_mco_parameter import BaseMCOParameter from .i_mco_factory import IMCOFactory @@ -20,6 +21,9 @@ class BaseMCOModel(ABCHasStrictTraits): # A list of the parameters for the MCO parameters = List(BaseMCOParameter, visible=False) + # A list of KPI specification objects and their objective. + kpis = List(KPISpecification, visible=False) + def __init__(self, factory, *args, **kwargs): self.factory = factory super(BaseMCOModel, self).__init__(*args, **kwargs)