diff --git a/examples/test_workflow.json b/examples/test_workflow.json index 4def5bb1b362d313cef03d6ccf073f532bbef306..1bbd3661e3c989d1f278022b08b73b7c639b0c41 100644 --- a/examples/test_workflow.json +++ b/examples/test_workflow.json @@ -1,6 +1,9 @@ { "multi_criteria_optimization": { "name": "basic" - } + }, + "key_performance_indicators": [ + "viscosity", "price" + ] } diff --git a/force_bdss/core_mco_driver.py b/force_bdss/core_mco_driver.py index c3625fc4ce8e064ab2f21e5b17c66b24e1d97e88..652aa5800fc78832bdf2dfb22399d7f3ab0609d1 100644 --- a/force_bdss/core_mco_driver.py +++ b/force_bdss/core_mco_driver.py @@ -31,9 +31,34 @@ class CoreMCODriver(Plugin): @on_trait_change("application:started") def application_started(self): + workflow = self.application.workflow if self.application.evaluate: - for kpi in self.key_performance_calculators: - kpi.run(self.application) + for kpi in workflow.key_performance_indicators: + kpc = self._find_kpc_by_computes(kpi) + if kpc: + kpc.run(self.application) + else: + raise Exception("Requested KPI {} but don't know how" + "to compute it.".format(kpi)) else: - for mco in self.multi_criteria_optimizers: + mco_name = workflow.multi_criteria_optimization.name + mco = self._find_mco_by_name(mco_name) + if mco: mco.run(self.application) + else: + raise Exception("Requested MCO {} but it's not available" + "to compute it.".format(mco_name)) + + def _find_kpc_by_computes(self, computes): + for kpc in self.key_performance_calculators: + if kpc.computes == computes: + return kpc + + return None + + def _find_mco_by_name(self, name): + for mco in self.multi_criteria_optimizers: + if mco.name == name: + return mco + + return None diff --git a/force_bdss/kpi/basic_key_performance_calculator.py b/force_bdss/kpi/basic.py similarity index 66% rename from force_bdss/kpi/basic_key_performance_calculator.py rename to force_bdss/kpi/basic.py index 3b7533ebfb8bfa042f3647df11a7e4635b6d9100..6e0254aef71db6d75de3ee5b15e6b75f0b97bb00 100644 --- a/force_bdss/kpi/basic_key_performance_calculator.py +++ b/force_bdss/kpi/basic.py @@ -1,9 +1,11 @@ -from traits.api import provides, HasStrictTraits +from traits.api import provides, HasStrictTraits, String from force_bdss.kpi.i_key_performance_calculator import IKeyPerformanceCalculator @provides(IKeyPerformanceCalculator) -class BasicKeyPerformanceCalculator(HasStrictTraits): +class Basic(HasStrictTraits): + computes = String("basic") + def run(self, workflow): print("Computing basic key performance indicator, {}".format(workflow)) diff --git a/force_bdss/kpi/i_key_performance_calculator.py b/force_bdss/kpi/i_key_performance_calculator.py index 8ad12ca9a6ac879a19d56791e79f5b4a60087645..56b7205c466180837c4ad7b80a89393fc8f2cdb0 100644 --- a/force_bdss/kpi/i_key_performance_calculator.py +++ b/force_bdss/kpi/i_key_performance_calculator.py @@ -1,6 +1,8 @@ -from traits.api import Interface +from traits.api import Interface, String class IKeyPerformanceCalculator(Interface): + computes = String() + def run(self): pass diff --git a/force_bdss/kpi/key_performance_calculators_plugin.py b/force_bdss/kpi/key_performance_calculators_plugin.py index 8122c806ddab542736b6b8d8a01cf9a49411a1d6..a3b8f372d74381e5f9855cbc1e03e90401c732db 100644 --- a/force_bdss/kpi/key_performance_calculators_plugin.py +++ b/force_bdss/kpi/key_performance_calculators_plugin.py @@ -1,10 +1,14 @@ from envisage.plugin import Plugin from traits.api import List -from force_bdss.kpi.basic_key_performance_calculator import \ - BasicKeyPerformanceCalculator +from force_bdss.kpi.basic import \ + Basic from force_bdss.kpi.i_key_performance_calculator import IKeyPerformanceCalculator +from force_bdss.kpi.price import Price + +from force_bdss.kpi.viscosity import Viscosity + class KeyPerformanceCalculatorsPlugin(Plugin): @@ -16,4 +20,4 @@ class KeyPerformanceCalculatorsPlugin(Plugin): ) def _key_performance_calculators_default(self): - return [BasicKeyPerformanceCalculator()] + return [Basic(), Viscosity(), Price()] diff --git a/force_bdss/kpi/price.py b/force_bdss/kpi/price.py new file mode 100644 index 0000000000000000000000000000000000000000..86ebf36180c425c46aa40394dd9eca707ec9ee19 --- /dev/null +++ b/force_bdss/kpi/price.py @@ -0,0 +1,11 @@ +from traits.api import provides, HasStrictTraits, String + +from force_bdss.kpi.i_key_performance_calculator import IKeyPerformanceCalculator + + +@provides(IKeyPerformanceCalculator) +class Price(HasStrictTraits): + computes = String("price") + + def run(self, workflow): + print("Computing price") diff --git a/force_bdss/kpi/viscosity.py b/force_bdss/kpi/viscosity.py new file mode 100644 index 0000000000000000000000000000000000000000..3c1fcb92c048b4f80c7707e7f116252b54394ca2 --- /dev/null +++ b/force_bdss/kpi/viscosity.py @@ -0,0 +1,11 @@ +from traits.api import provides, HasStrictTraits, String + +from force_bdss.kpi.i_key_performance_calculator import IKeyPerformanceCalculator + + +@provides(IKeyPerformanceCalculator) +class Viscosity(HasStrictTraits): + computes = String("viscosity") + + def run(self, workflow): + print("Computing viscosity") diff --git a/force_bdss/mco/basic_multi_criteria_optimizer.py b/force_bdss/mco/basic.py similarity index 62% rename from force_bdss/mco/basic_multi_criteria_optimizer.py rename to force_bdss/mco/basic.py index 2fc3a351002f3895a680e99fc56b6debfee896d0..2e29c3bc233236dd41de6edad6f3e605c372b893 100644 --- a/force_bdss/mco/basic_multi_criteria_optimizer.py +++ b/force_bdss/mco/basic.py @@ -1,16 +1,16 @@ import subprocess import sys -from traits.api import provides, HasStrictTraits +from traits.api import provides, HasStrictTraits, String from force_bdss.mco.i_multi_criteria_optimizers import IMultiCriteriaOptimizer @provides(IMultiCriteriaOptimizer) -class BasicMultiCriteriaOptimizer(HasStrictTraits): - name = "basic" +class Basic(HasStrictTraits): + name = String("basic") def run(self, application): - print("Basic multicriteria optimizer in action") + print("Running Basic optimizer") subprocess.check_call([sys.argv[0], "--evaluate", application.workflow_filepath]) diff --git a/force_bdss/mco/dakota.py b/force_bdss/mco/dakota.py new file mode 100644 index 0000000000000000000000000000000000000000..b046b11f3cd407015593c92dc6e187695bee9b39 --- /dev/null +++ b/force_bdss/mco/dakota.py @@ -0,0 +1,17 @@ +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/multi_criteria_optimizers_plugin.py b/force_bdss/mco/multi_criteria_optimizers_plugin.py index 42d633316fcc1b6fd90d32b80e7d265939ce1635..79e3f3066fc1d589543de3ac384d221c2b7b0dba 100644 --- a/force_bdss/mco/multi_criteria_optimizers_plugin.py +++ b/force_bdss/mco/multi_criteria_optimizers_plugin.py @@ -1,8 +1,8 @@ from envisage.plugin import Plugin from traits.api import List -from force_bdss.mco.basic_multi_criteria_optimizer import \ - BasicMultiCriteriaOptimizer +from force_bdss.mco.basic import Basic +from force_bdss.mco.dakota import Dakota from force_bdss.mco.i_multi_criteria_optimizers import IMultiCriteriaOptimizer @@ -15,4 +15,4 @@ class MultiCriteriaOptimizersPlugin(Plugin): ) def _multi_criteria_optimizers_default(self): - return [BasicMultiCriteriaOptimizer()] + return [Basic(), Dakota()] diff --git a/force_bdss/workspecs/multi_criteria_optimization.py b/force_bdss/workspecs/multi_criteria_optimization.py index 3433730a8a5d99086732092da4798e398d0ab096..9e5e3152e68a168d0de2d2e5f0ff8d2031c1b25d 100644 --- a/force_bdss/workspecs/multi_criteria_optimization.py +++ b/force_bdss/workspecs/multi_criteria_optimization.py @@ -2,7 +2,7 @@ from traits.api import HasStrictTraits, String class MultiCriteriaOptimization(HasStrictTraits): - type = String + name = String() @classmethod def from_json(cls, json_data): diff --git a/force_bdss/workspecs/workflow.py b/force_bdss/workspecs/workflow.py index 6ff7cf74430a155d5a2d004e73e9b86d067051a6..934c7781d36daf2c80d3f680f1616573223b9c3e 100644 --- a/force_bdss/workspecs/workflow.py +++ b/force_bdss/workspecs/workflow.py @@ -1,4 +1,4 @@ -from traits.api import HasStrictTraits, Instance, String +from traits.api import HasStrictTraits, Instance, String, List from .multi_criteria_optimization import MultiCriteriaOptimization @@ -6,13 +6,15 @@ from .multi_criteria_optimization import MultiCriteriaOptimization class Workflow(HasStrictTraits): name = String() multi_criteria_optimization = Instance(MultiCriteriaOptimization) + key_performance_indicators = List(String) @classmethod def from_json(cls, json_data): self = cls( multi_criteria_optimization=MultiCriteriaOptimization.from_json( json_data["multi_criteria_optimization"] - ) + ), + key_performance_indicators=json_data["key_performance_indicators"] ) return self