From 1922d5defc392ab28a119b7ae9929f18fa0806c2 Mon Sep 17 00:00:00 2001
From: Stefano Borini <sborini@enthought.com>
Date: Tue, 11 Jul 2017 13:24:49 +0100
Subject: [PATCH] Spawning of the KPI evaluator from a trivial MCO

---
 force_bdss/basic_multi_criteria_optimizer.py | 10 ++++++++--
 force_bdss/bdss_application.py               | 10 ++++++++--
 force_bdss/core_mco_driver.py                | 17 +++++++++++++++--
 3 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/force_bdss/basic_multi_criteria_optimizer.py b/force_bdss/basic_multi_criteria_optimizer.py
index 6cac40d..5d9088b 100644
--- a/force_bdss/basic_multi_criteria_optimizer.py
+++ b/force_bdss/basic_multi_criteria_optimizer.py
@@ -1,3 +1,5 @@
+import subprocess
+import sys
 from traits.api import provides, HasStrictTraits
 
 from force_bdss.i_multi_criteria_optimizers import IMultiCriteriaOptimizer
@@ -5,5 +7,9 @@ from force_bdss.i_multi_criteria_optimizers import IMultiCriteriaOptimizer
 
 @provides(IMultiCriteriaOptimizer)
 class BasicMultiCriteriaOptimizer(HasStrictTraits):
-    def run(self, workflow):
-        print("Basic multicriteria optimizer in action, {}".format(workflow))
+    def run(self, application):
+        print("Basic multicriteria optimizer in action")
+        subprocess.check_call([sys.argv[0], "--evaluate",
+                               application.workflow_filepath])
+
+
diff --git a/force_bdss/bdss_application.py b/force_bdss/bdss_application.py
index 62fd89c..e6abb68 100644
--- a/force_bdss/bdss_application.py
+++ b/force_bdss/bdss_application.py
@@ -1,19 +1,25 @@
 import json
 
 from envisage.api import Application
-from traits.api import Unicode
-from traits.trait_types import List, Bool, Instance
+from traits.api import Unicode, Bool, Instance
 
 from force_bdss.workspecs.workflow import Workflow
 
 
 class BDSSApplication(Application):
+    """Main application for the BDSS.
+    """
     id = "force_bdss.bdss_application"
 
+    #: The path of the workflow file to open
     workflow_filepath = Unicode()
 
+    #: Deserialized content of the workflow file.
     workflow = Instance(Workflow)
 
+    #: This flags signals to the application not to execute and orchestrate
+    #: the MCO, but instead to perform a single evaluation under the
+    #: coordination of the MCO itself. See design notes for more details.
     evaluate = Bool()
 
     def _workflow_default(self):
diff --git a/force_bdss/core_mco_driver.py b/force_bdss/core_mco_driver.py
index 8e82a17..ef1f392 100644
--- a/force_bdss/core_mco_driver.py
+++ b/force_bdss/core_mco_driver.py
@@ -8,10 +8,23 @@ from force_bdss.i_multi_criteria_optimizers import IMultiCriteriaOptimizer
 
 
 class CoreMCODriver(Plugin):
+    """Main plugin that handles the execution of the MCO
+    or the evaluation.
+    """
+
+    # Note: we are forced to declare these extensions points here instead
+    # of the application object, and this is why we have to use this plugin.
+    # It is a workaround to an envisage bug that does not find the extension
+    # points if declared on the application.
+
+    #: A List of the available Multi Criteria Optimizers.
+    #: This will be populated by MCO plugins.
     multi_criteria_optimizers = ExtensionPoint(
         List(IMultiCriteriaOptimizer),
         id='force_bdss.multi_criteria_optimizers')
 
+    #: A list of the available Key Performance Indicator calculators.
+    #: It will be populated by plugins.
     key_performance_calculators = ExtensionPoint(
         List(IKeyPerformanceCalculator),
         id='force_bdss.key_performance_calculators')
@@ -20,7 +33,7 @@ class CoreMCODriver(Plugin):
     def application_started(self):
         if self.application.evaluate:
             for kpi in self.key_performance_calculators:
-                kpi.run(self.application.workflow)
+                kpi.run(self.application)
         else:
             for mco in self.multi_criteria_optimizers:
-                mco.run(self.application.workflow)
+                mco.run(self.application)
-- 
GitLab