From ddad0d8c9df4b4593dcc4ee832f6764325afdbab Mon Sep 17 00:00:00 2001
From: Stefano Borini <sborini@enthought.com>
Date: Fri, 14 Jul 2017 10:39:24 +0100
Subject: [PATCH] Added bundle for dakota and basic MCOs

---
 force_bdss/mco/base_multi_criteria_optimizer.py | 16 ++++++++++++++++
 force_bdss/mco/basic.py                         | 16 ----------------
 force_bdss/mco/basic_bundle.py                  | 17 +++++++++++++++++
 force_bdss/mco/basic_model.py                   |  7 +++++++
 force_bdss/mco/basic_optimizer.py               | 12 ++++++++++++
 force_bdss/mco/dakota.py                        | 17 -----------------
 force_bdss/mco/dakota_bundle.py                 | 17 +++++++++++++++++
 force_bdss/mco/dakota_model.py                  |  7 +++++++
 force_bdss/mco/dakota_optimizer.py              | 13 +++++++++++++
 .../mco/i_multi_criteria_optimizer_bundle.py    | 14 ++++++++++++++
 force_bdss/mco/i_multi_criteria_optimizers.py   |  8 --------
 .../mco/multi_criteria_optimizers_plugin.py     | 15 ++++++++-------
 12 files changed, 111 insertions(+), 48 deletions(-)
 create mode 100644 force_bdss/mco/base_multi_criteria_optimizer.py
 delete mode 100644 force_bdss/mco/basic.py
 create mode 100644 force_bdss/mco/basic_bundle.py
 create mode 100644 force_bdss/mco/basic_model.py
 create mode 100644 force_bdss/mco/basic_optimizer.py
 delete mode 100644 force_bdss/mco/dakota.py
 create mode 100644 force_bdss/mco/dakota_bundle.py
 create mode 100644 force_bdss/mco/dakota_model.py
 create mode 100644 force_bdss/mco/dakota_optimizer.py
 create mode 100644 force_bdss/mco/i_multi_criteria_optimizer_bundle.py
 delete mode 100644 force_bdss/mco/i_multi_criteria_optimizers.py

diff --git a/force_bdss/mco/base_multi_criteria_optimizer.py b/force_bdss/mco/base_multi_criteria_optimizer.py
new file mode 100644
index 0000000..eb530d5
--- /dev/null
+++ b/force_bdss/mco/base_multi_criteria_optimizer.py
@@ -0,0 +1,16 @@
+import abc
+
+
+class BaseMultiCriteriaOptimizer(metaclass=abc.ABCMeta):
+    def __init__(self, bundle, application, model):
+        self.bundle = bundle
+        self.application = application
+        self.model = model
+
+    @property
+    def name(self):
+        return self.bundle.name
+
+    @abc.abstractmethod
+    def run(self):
+        pass
diff --git a/force_bdss/mco/basic.py b/force_bdss/mco/basic.py
deleted file mode 100644
index 2e29c3b..0000000
--- a/force_bdss/mco/basic.py
+++ /dev/null
@@ -1,16 +0,0 @@
-import subprocess
-import sys
-
-from traits.api import provides, HasStrictTraits, String
-
-from force_bdss.mco.i_multi_criteria_optimizers import IMultiCriteriaOptimizer
-
-
-@provides(IMultiCriteriaOptimizer)
-class Basic(HasStrictTraits):
-    name = String("basic")
-
-    def run(self, application):
-        print("Running Basic optimizer")
-        subprocess.check_call([sys.argv[0], "--evaluate",
-                               application.workflow_filepath])
diff --git a/force_bdss/mco/basic_bundle.py b/force_bdss/mco/basic_bundle.py
new file mode 100644
index 0000000..8613956
--- /dev/null
+++ b/force_bdss/mco/basic_bundle.py
@@ -0,0 +1,17 @@
+from traits.has_traits import HasStrictTraits, provides
+
+from .i_multi_criteria_optimizer_bundle import IMultiCriteriaOptimizerBundle
+from .basic_model import BasicModel
+from .basic_optimizer import BasicOptimizer
+
+
+@provides(IMultiCriteriaOptimizerBundle)
+class BasicBundle(HasStrictTraits):
+    def create_model(self, model_data):
+        return BasicModel.from_json(model_data)
+
+    def create_ui(self):
+        pass
+
+    def create_optimizer(self, application, model):
+        return BasicOptimizer(self, application, model)
diff --git a/force_bdss/mco/basic_model.py b/force_bdss/mco/basic_model.py
new file mode 100644
index 0000000..3139ad7
--- /dev/null
+++ b/force_bdss/mco/basic_model.py
@@ -0,0 +1,7 @@
+from traits.has_traits import HasStrictTraits
+
+
+class BasicModel(HasStrictTraits):
+    @classmethod
+    def from_json(cls, model_data):
+        return cls()
diff --git a/force_bdss/mco/basic_optimizer.py b/force_bdss/mco/basic_optimizer.py
new file mode 100644
index 0000000..cc7477a
--- /dev/null
+++ b/force_bdss/mco/basic_optimizer.py
@@ -0,0 +1,12 @@
+import subprocess
+import sys
+
+from force_bdss.mco.base_multi_criteria_optimizer import \
+    BaseMultiCriteriaOptimizer
+
+
+class BasicOptimizer(BaseMultiCriteriaOptimizer):
+    def run(self):
+        print("Running Basic optimizer")
+        subprocess.check_call([sys.argv[0], "--evaluate",
+                               self.application.workflow_filepath])
diff --git a/force_bdss/mco/dakota.py b/force_bdss/mco/dakota.py
deleted file mode 100644
index b046b11..0000000
--- a/force_bdss/mco/dakota.py
+++ /dev/null
@@ -1,17 +0,0 @@
-import subprocess
-
-import sys
-
-from traits.api import provides, HasStrictTraits, String
-
-from force_bdss.mco.i_multi_criteria_optimizers import IMultiCriteriaOptimizer
-
-
-@provides(IMultiCriteriaOptimizer)
-class Dakota(HasStrictTraits):
-    name = String("dakota")
-
-    def run(self, application):
-        print("Running dakota optimizer")
-        subprocess.check_call([sys.argv[0], "--evaluate",
-                               application.workflow_filepath])
diff --git a/force_bdss/mco/dakota_bundle.py b/force_bdss/mco/dakota_bundle.py
new file mode 100644
index 0000000..a33c5ef
--- /dev/null
+++ b/force_bdss/mco/dakota_bundle.py
@@ -0,0 +1,17 @@
+from traits.has_traits import HasStrictTraits, provides
+
+from force_bdss.mco.dakota_optimizer import DakotaOptimizer
+from force_bdss.mco.dakota_model import DakotaModel
+from .i_multi_criteria_optimizer_bundle import IMultiCriteriaOptimizerBundle
+
+
+@provides(IMultiCriteriaOptimizerBundle)
+class DakotaBundle(HasStrictTraits):
+    def create_model(self, model_data):
+        return DakotaModel.from_json(model_data)
+
+    def create_ui(self):
+        pass
+
+    def create_optimizer(self, application, model):
+        return DakotaOptimizer(self, application, model)
diff --git a/force_bdss/mco/dakota_model.py b/force_bdss/mco/dakota_model.py
new file mode 100644
index 0000000..76b572f
--- /dev/null
+++ b/force_bdss/mco/dakota_model.py
@@ -0,0 +1,7 @@
+from traits.has_traits import HasStrictTraits
+
+
+class DakotaModel(HasStrictTraits):
+    @classmethod
+    def from_json(cls, model_data):
+        return cls()
diff --git a/force_bdss/mco/dakota_optimizer.py b/force_bdss/mco/dakota_optimizer.py
new file mode 100644
index 0000000..dc80532
--- /dev/null
+++ b/force_bdss/mco/dakota_optimizer.py
@@ -0,0 +1,13 @@
+import subprocess
+
+import sys
+
+from force_bdss.mco.base_multi_criteria_optimizer import \
+    BaseMultiCriteriaOptimizer
+
+
+class DakotaOptimizer(BaseMultiCriteriaOptimizer):
+    def run(self):
+        print("Running dakota optimizer")
+        subprocess.check_call([sys.argv[0], "--evaluate",
+                               self.application.workflow_filepath])
diff --git a/force_bdss/mco/i_multi_criteria_optimizer_bundle.py b/force_bdss/mco/i_multi_criteria_optimizer_bundle.py
new file mode 100644
index 0000000..3a584c4
--- /dev/null
+++ b/force_bdss/mco/i_multi_criteria_optimizer_bundle.py
@@ -0,0 +1,14 @@
+from traits.api import Interface, String
+
+
+class IMultiCriteriaOptimizerBundle(Interface):
+    name = String()
+
+    def create_optimizer(self, application, model):
+        pass
+
+    def create_ui(self):
+        pass
+
+    def create_model(self, model_data):
+        pass
diff --git a/force_bdss/mco/i_multi_criteria_optimizers.py b/force_bdss/mco/i_multi_criteria_optimizers.py
deleted file mode 100644
index 93c6b25..0000000
--- a/force_bdss/mco/i_multi_criteria_optimizers.py
+++ /dev/null
@@ -1,8 +0,0 @@
-from traits.api import Interface, String
-
-
-class IMultiCriteriaOptimizer(Interface):
-    name = String()
-
-    def run(self, application):
-        pass
diff --git a/force_bdss/mco/multi_criteria_optimizers_plugin.py b/force_bdss/mco/multi_criteria_optimizers_plugin.py
index 79e3f30..55095a2 100644
--- a/force_bdss/mco/multi_criteria_optimizers_plugin.py
+++ b/force_bdss/mco/multi_criteria_optimizers_plugin.py
@@ -1,18 +1,19 @@
 from envisage.plugin import Plugin
 from traits.api import List
 
-from force_bdss.mco.basic import Basic
-from force_bdss.mco.dakota import Dakota
-from force_bdss.mco.i_multi_criteria_optimizers import IMultiCriteriaOptimizer
+from .i_multi_criteria_optimizer_bundle import (
+    IMultiCriteriaOptimizerBundle)
+from .dakota_bundle import DakotaBundle
+from .basic_bundle import BasicBundle
 
 
 class MultiCriteriaOptimizersPlugin(Plugin):
-    id = "force_bdss.multi_criteria_optimizers_plugin"
+    id = "force.bdss.mco.plugins.multi_criteria_optimizers_plugin"
 
     multi_criteria_optimizers = List(
-        IMultiCriteriaOptimizer,
-        contributes_to='force_bdss.multi_criteria_optimizers'
+        IMultiCriteriaOptimizerBundle,
+        contributes_to='force.bdss.mco.bundles'
     )
 
     def _multi_criteria_optimizers_default(self):
-        return [Basic(), Dakota()]
+        return [BasicBundle(), DakotaBundle()]
-- 
GitLab