diff --git a/examples/test_workflow.json b/examples/test_workflow.json new file mode 100644 index 0000000000000000000000000000000000000000..49c04bc38cb56197984c04d7135c53396e7bf42b --- /dev/null +++ b/examples/test_workflow.json @@ -0,0 +1,6 @@ +{ + "multi_criteria_optimization": { + "type": "simple" + } +} + diff --git a/force_bdss/application.py b/force_bdss/application.py deleted file mode 100644 index d0fef517e0b521c07420500cb6a4d245b374316c..0000000000000000000000000000000000000000 --- a/force_bdss/application.py +++ /dev/null @@ -1,25 +0,0 @@ -# Enthought library imports. -from envisage.api import Application - - -# Application entry point. -from force_bdss.multi_criteria_optimizers_plugin import \ - MultiCriteriaOptimizersPlugin -from force_bdss.workflow_plugin import WorkflowPlugin -from force_bdss.key_performance_calculators_plugin import \ - KeyPerformanceCalculatorsPlugin - - -def run(): - - application = Application( - id='force', - plugins=[ - WorkflowPlugin(), - MultiCriteriaOptimizersPlugin(), - KeyPerformanceCalculatorsPlugin(), - ] - ) - - # Run it! - application.run() diff --git a/force_bdss/basic_key_performance_calculator.py b/force_bdss/basic_key_performance_calculator.py index 30d8a7650a5945e31b2577912d2e750713bd0f6e..63fd2e4f0ca6b9ba4287e342134463fcb6644e8f 100644 --- a/force_bdss/basic_key_performance_calculator.py +++ b/force_bdss/basic_key_performance_calculator.py @@ -5,5 +5,5 @@ from force_bdss.i_key_performance_calculator import IKeyPerformanceCalculator @provides(IKeyPerformanceCalculator) class BasicKeyPerformanceCalculator(HasStrictTraits): - def run(self): - print("Computing basic key performance indicator") + def run(self, workflow): + print("Computing basic key performance indicator, {}".format(workflow)) diff --git a/force_bdss/basic_multi_criteria_optimizer.py b/force_bdss/basic_multi_criteria_optimizer.py index 740c6aa6ee6edfb8d28d9e33b36571f0464a1a44..6cac40d1e6584b56c9562e4703b656c12202bc39 100644 --- a/force_bdss/basic_multi_criteria_optimizer.py +++ b/force_bdss/basic_multi_criteria_optimizer.py @@ -5,5 +5,5 @@ from force_bdss.i_multi_criteria_optimizers import IMultiCriteriaOptimizer @provides(IMultiCriteriaOptimizer) class BasicMultiCriteriaOptimizer(HasStrictTraits): - def run(self): - print("Basic multicriteria optimizer in action") + def run(self, workflow): + print("Basic multicriteria optimizer in action, {}".format(workflow)) diff --git a/force_bdss/bdss_application.py b/force_bdss/bdss_application.py new file mode 100644 index 0000000000000000000000000000000000000000..62fd89c1bb4264642ebf9d0f179de45570c80f1a --- /dev/null +++ b/force_bdss/bdss_application.py @@ -0,0 +1,21 @@ +import json + +from envisage.api import Application +from traits.api import Unicode +from traits.trait_types import List, Bool, Instance + +from force_bdss.workspecs.workflow import Workflow + + +class BDSSApplication(Application): + id = "force_bdss.bdss_application" + + workflow_filepath = Unicode() + + workflow = Instance(Workflow) + + evaluate = Bool() + + def _workflow_default(self): + with open(self.workflow_filepath) as f: + return Workflow.from_json(json.load(f)) diff --git a/force_bdss/cli/force_bdss.py b/force_bdss/cli/force_bdss.py new file mode 100644 index 0000000000000000000000000000000000000000..20e1a6eacfc3d0d7508ca5d11f804e9aeab9d412 --- /dev/null +++ b/force_bdss/cli/force_bdss.py @@ -0,0 +1,31 @@ +import click +from envisage.core_plugin import CorePlugin +import logging + +from force_bdss.bdss_application import BDSSApplication +from force_bdss.core_mco_driver import CoreMCODriver +from force_bdss.multi_criteria_optimizers_plugin import \ + MultiCriteriaOptimizersPlugin +from force_bdss.key_performance_calculators_plugin import \ + KeyPerformanceCalculatorsPlugin + + +@click.command() +@click.option("--evaluate", is_flag=True) +@click.argument('workflow_filepath', type=click.Path(exists=True)) +def run(evaluate, workflow_filepath): + + plugins = [ + CorePlugin(), + CoreMCODriver(), + KeyPerformanceCalculatorsPlugin(), + MultiCriteriaOptimizersPlugin(), + ] + + application = BDSSApplication( + plugins=plugins, + evaluate=evaluate, + workflow_filepath=workflow_filepath + ) + + application.run() diff --git a/force_bdss/workflow_plugin.py b/force_bdss/core_mco_driver.py similarity index 61% rename from force_bdss/workflow_plugin.py rename to force_bdss/core_mco_driver.py index 75e898c1737bc49d6a5a50b516de53f380686565..8e82a17c5aff59079293f7798f71ad905938fdac 100644 --- a/force_bdss/workflow_plugin.py +++ b/force_bdss/core_mco_driver.py @@ -1,27 +1,26 @@ from envisage.extension_point import ExtensionPoint -from traits.api import List from envisage.plugin import Plugin -from traits.api import on_trait_change +from traits.has_traits import on_trait_change +from traits.trait_types import List from force_bdss.i_key_performance_calculator import IKeyPerformanceCalculator from force_bdss.i_multi_criteria_optimizers import IMultiCriteriaOptimizer -class WorkflowPlugin(Plugin): - - id = "force_bdss.workflow_plugin" +class CoreMCODriver(Plugin): + multi_criteria_optimizers = ExtensionPoint( + List(IMultiCriteriaOptimizer), + id='force_bdss.multi_criteria_optimizers') key_performance_calculators = ExtensionPoint( List(IKeyPerformanceCalculator), id='force_bdss.key_performance_calculators') - multi_criteria_optimizers = ExtensionPoint( - List(IMultiCriteriaOptimizer), - id='force_bdss.multi_criteria_optimizers') - @on_trait_change("application:started") def application_started(self): - for mco in self.multi_criteria_optimizers: - mco.run() - for kpc in self.key_performance_calculators: - kpc.run() + if self.application.evaluate: + for kpi in self.key_performance_calculators: + kpi.run(self.application.workflow) + else: + for mco in self.multi_criteria_optimizers: + mco.run(self.application.workflow) diff --git a/force_bdss/multi_criteria_optimizers_plugin.py b/force_bdss/multi_criteria_optimizers_plugin.py index a815cd1f9f3f959b6aa33f482d30c5f9a9f97be5..07a39a032f944066f86943865a28bb54f218a342 100644 --- a/force_bdss/multi_criteria_optimizers_plugin.py +++ b/force_bdss/multi_criteria_optimizers_plugin.py @@ -7,7 +7,6 @@ from force_bdss.i_multi_criteria_optimizers import IMultiCriteriaOptimizer class MultiCriteriaOptimizersPlugin(Plugin): - id = "force_bdss.multi_criteria_optimizers_plugin" multi_criteria_optimizers = List( diff --git a/force_bdss/workspecs/multi_criteria_optimization.py b/force_bdss/workspecs/multi_criteria_optimization.py new file mode 100644 index 0000000000000000000000000000000000000000..6d0a06afa17b6869986f25ea3450b0c67939aae4 --- /dev/null +++ b/force_bdss/workspecs/multi_criteria_optimization.py @@ -0,0 +1,13 @@ +from traits.api import HasStrictTraits, String + + +class MultiCriteriaOptimization(HasStrictTraits): + type = String + + @classmethod + def from_json(cls, json_data): + self = cls( + type=json_data["type"] + ) + + return self diff --git a/force_bdss/workspecs/workflow.py b/force_bdss/workspecs/workflow.py new file mode 100644 index 0000000000000000000000000000000000000000..6ff7cf74430a155d5a2d004e73e9b86d067051a6 --- /dev/null +++ b/force_bdss/workspecs/workflow.py @@ -0,0 +1,18 @@ +from traits.api import HasStrictTraits, Instance, String + +from .multi_criteria_optimization import MultiCriteriaOptimization + + +class Workflow(HasStrictTraits): + name = String() + multi_criteria_optimization = Instance(MultiCriteriaOptimization) + + @classmethod + def from_json(cls, json_data): + self = cls( + multi_criteria_optimization=MultiCriteriaOptimization.from_json( + json_data["multi_criteria_optimization"] + ) + ) + + return self diff --git a/setup.py b/setup.py index dcce0668a7ffaef86207222a820a185662067f19..49ad67ea7bea23a9d6aedb39f9dc5f5dacaedead 100644 --- a/setup.py +++ b/setup.py @@ -7,9 +7,10 @@ setup( version=VERSION, entry_points={ 'console_scripts': [ - 'force_bdss = force_bdss.application:run', + 'force_bdss = force_bdss.cli.force_bdss:run', ]}, install_requires=[ - "envisage >= 4.6.0" + "envisage >= 4.6.0", + "click >= 6.7" ] )