diff --git a/force_bdss/core_plugins/dummy/__init__.py b/force_bdss/core_plugins/dummy/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/force_bdss/core_plugins/dummy/dummy_dakota/__init__.py b/force_bdss/core_plugins/dummy/dummy_dakota/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/force_bdss/core_plugins/dummy/dummy_dakota/dakota_bundle.py b/force_bdss/core_plugins/dummy/dummy_dakota/dakota_bundle.py new file mode 100644 index 0000000000000000000000000000000000000000..3d3bfacb035c7a978e5d331d790f5f37499dddcb --- /dev/null +++ b/force_bdss/core_plugins/dummy/dummy_dakota/dakota_bundle.py @@ -0,0 +1,23 @@ +from traits.api import String +from force_bdss.api import bundle_id, BaseMultiCriteriaOptimizerBundle + +from .dakota_communicator import DummyDakotaCommunicator +from .dakota_model import DummyDakotaModel +from .dakota_optimizer import DummyDakotaOptimizer + + +class DummyDakotaBundle(BaseMultiCriteriaOptimizerBundle): + id = String(bundle_id("enthought", "dummy_dakota")) + + name = "Dummy Dakota" + + def create_model(self, model_data=None): + if model_data is None: + model_data = {} + return DummyDakotaModel(self, **model_data) + + def create_optimizer(self, application, model): + return DummyDakotaOptimizer(self, application, model) + + def create_communicator(self, application, model): + return DummyDakotaCommunicator(self, application, model) diff --git a/force_bdss/core_plugins/dummy/dummy_dakota/dakota_communicator.py b/force_bdss/core_plugins/dummy/dummy_dakota/dakota_communicator.py new file mode 100644 index 0000000000000000000000000000000000000000..dfcc11349ec3a2db0093958f096267340f619966 --- /dev/null +++ b/force_bdss/core_plugins/dummy/dummy_dakota/dakota_communicator.py @@ -0,0 +1,20 @@ +import sys +import numpy + +from force_bdss.api import DataSourceParameters, BaseMCOCommunicator + + +class DummyDakotaCommunicator(BaseMCOCommunicator): + def receive_from_mco(self): + data = sys.stdin.read() + values = list(map(float, data.split())) + return DataSourceParameters( + value_types=["DUMMY"]*len(values), + values=numpy.array(values) + ) + + def send_to_mco(self, kpi_results): + data = " ".join( + [" ".join(list(map(str, r.values.tolist()))) for r in kpi_results] + ) + sys.stdout.write(data) diff --git a/force_bdss/core_plugins/dummy/dummy_dakota/dakota_model.py b/force_bdss/core_plugins/dummy/dummy_dakota/dakota_model.py new file mode 100644 index 0000000000000000000000000000000000000000..65150979e82bf7dfe79074baf5f978053a23ef1b --- /dev/null +++ b/force_bdss/core_plugins/dummy/dummy_dakota/dakota_model.py @@ -0,0 +1,5 @@ +from force_bdss.api import BaseMCOModel + + +class DummyDakotaModel(BaseMCOModel): + pass diff --git a/force_bdss/core_plugins/dummy/dummy_dakota/dakota_optimizer.py b/force_bdss/core_plugins/dummy/dummy_dakota/dakota_optimizer.py new file mode 100644 index 0000000000000000000000000000000000000000..e91edb5b3146f94c3b30cc2eb79ac0f7d70c3ba5 --- /dev/null +++ b/force_bdss/core_plugins/dummy/dummy_dakota/dakota_optimizer.py @@ -0,0 +1,20 @@ +import subprocess + +import sys + +from force_bdss.api import BaseMultiCriteriaOptimizer + + +class DummyDakotaOptimizer(BaseMultiCriteriaOptimizer): + def run(self): + print("Running dakota optimizer") + for initial_value in range(10): + ps = subprocess.Popen( + [sys.argv[0], + "--evaluate", + self.application.workflow_filepath], + stdout=subprocess.PIPE, + stdin=subprocess.PIPE) + + out = ps.communicate("{}".format(initial_value).encode("utf-8")) + print("{}: {}".format(initial_value, out[0].decode("utf-8"))) diff --git a/force_bdss/core_plugins/dummy/dummy_data_source/dummy_data_source.py b/force_bdss/core_plugins/dummy/dummy_data_source/dummy_data_source.py new file mode 100644 index 0000000000000000000000000000000000000000..20004b3a933fd6eba0da31a6069277d930aa36ea --- /dev/null +++ b/force_bdss/core_plugins/dummy/dummy_data_source/dummy_data_source.py @@ -0,0 +1,11 @@ +from force_bdss.api import BaseDataSource, DataSourceResult + + +class DummyDataSource(BaseDataSource): + def run(self, parameters): + print(parameters) + return DataSourceResult( + originator=self, + value_types=parameters.value_types, + values=parameters.values.reshape( + parameters.values.shape + (1,))) diff --git a/force_bdss/core_plugins/dummy/dummy_data_source/dummy_data_source_bundle.py b/force_bdss/core_plugins/dummy/dummy_data_source/dummy_data_source_bundle.py new file mode 100644 index 0000000000000000000000000000000000000000..ebebc00c4ad9e6b9b8278cbfa6978c849e68cc78 --- /dev/null +++ b/force_bdss/core_plugins/dummy/dummy_data_source/dummy_data_source_bundle.py @@ -0,0 +1,16 @@ +from force_bdss.api import BaseDataSourceBundle, bundle_id +from .dummy_data_source_model import DummyDataSourceModel +from .dummy_data_source import DummyDataSource + + +class DummyDataSourceBundle(BaseDataSourceBundle): + id = bundle_id("enthought", "dummy_data_source") + + def create_model(self, model_data=None): + if model_data is None: + model_data = {} + + return DummyDataSourceModel(self, **model_data) + + def create_data_source(self, application, model): + return DummyDataSource(self, application, model) diff --git a/force_bdss/core_plugins/dummy/dummy_data_source/dummy_data_source_model.py b/force_bdss/core_plugins/dummy/dummy_data_source/dummy_data_source_model.py new file mode 100644 index 0000000000000000000000000000000000000000..a79145f9bd9966a4834edb8ede4e89aa5500cebc --- /dev/null +++ b/force_bdss/core_plugins/dummy/dummy_data_source/dummy_data_source_model.py @@ -0,0 +1,5 @@ +from force_bdss.api import BaseDataSourceModel + + +class DummyDataSourceModel(BaseDataSourceModel): + pass diff --git a/force_bdss/core_plugins/dummy/dummy_kpi_calculator/__init__.py b/force_bdss/core_plugins/dummy/dummy_kpi_calculator/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/force_bdss/core_plugins/dummy/dummy_kpi_calculator/dummy_kpi_calculator.py b/force_bdss/core_plugins/dummy/dummy_kpi_calculator/dummy_kpi_calculator.py new file mode 100644 index 0000000000000000000000000000000000000000..aeee46827562c20ecb61ca87f7cd5ef2cac9fc05 --- /dev/null +++ b/force_bdss/core_plugins/dummy/dummy_kpi_calculator/dummy_kpi_calculator.py @@ -0,0 +1,12 @@ +from force_bdss.api import BaseKPICalculator, KPICalculatorResult, bundle_id + + +class DummyKPICalculator(BaseKPICalculator): + id = bundle_id("enthought", "dummy_kpi_calculator") + + def run(self, data_source_results): + return KPICalculatorResult( + originator=self, + value_types=data_source_results[0].value_types, + values=data_source_results[0].values.reshape( + data_source_results[0].values.shape[:-1])) diff --git a/force_bdss/core_plugins/dummy/dummy_kpi_calculator/dummy_kpi_calculator_bundle.py b/force_bdss/core_plugins/dummy/dummy_kpi_calculator/dummy_kpi_calculator_bundle.py new file mode 100644 index 0000000000000000000000000000000000000000..b2c567bc6852c7779a6799b2c026b2cda2995756 --- /dev/null +++ b/force_bdss/core_plugins/dummy/dummy_kpi_calculator/dummy_kpi_calculator_bundle.py @@ -0,0 +1,19 @@ +from traits.api import String +from force_bdss.api import bundle_id, BaseKPICalculatorBundle +from .dummy_kpi_calculator import DummyKPICalculator +from .dummy_kpi_calculator_model import DummyKPICalculatorModel + + +class DummyKPICalculatorBundle(BaseKPICalculatorBundle): + id = String(bundle_id("enthought", "dummy_kpi_calculator")) + + name = String("Dummy KPI") + + def create_model(self, model_data=None): + if model_data is None: + model_data = {} + + return DummyKPICalculatorModel(self, **model_data) + + def create_kpi_calculator(self, application, model): + return DummyKPICalculator(self, application, model) diff --git a/force_bdss/core_plugins/dummy/dummy_kpi_calculator/dummy_kpi_calculator_model.py b/force_bdss/core_plugins/dummy/dummy_kpi_calculator/dummy_kpi_calculator_model.py new file mode 100644 index 0000000000000000000000000000000000000000..d72ee3f4556297d5ce718fbfaf6b8e555e018d8d --- /dev/null +++ b/force_bdss/core_plugins/dummy/dummy_kpi_calculator/dummy_kpi_calculator_model.py @@ -0,0 +1,5 @@ +from force_bdss.api import BaseKPICalculatorModel + + +class DummyKPICalculatorModel(BaseKPICalculatorModel): + pass diff --git a/force_bdss/core_plugins/dummy/dummy_plugin.py b/force_bdss/core_plugins/dummy/dummy_plugin.py new file mode 100644 index 0000000000000000000000000000000000000000..01850726513c44d0f888bbb610b5b0da3a991ff4 --- /dev/null +++ b/force_bdss/core_plugins/dummy/dummy_plugin.py @@ -0,0 +1,17 @@ +from force_bdss.api import BaseExtensionPlugin +from .dummy_dakota.dakota_bundle import DummyDakotaBundle +from .dummy_data_source.dummy_data_source_bundle import DummyDataSourceBundle +from .dummy_kpi_calculator.dummy_kpi_calculator_bundle import ( + DummyKPICalculatorBundle +) + + +class DummyPlugin(BaseExtensionPlugin): + def _data_source_bundles_default(self): + return [DummyDataSourceBundle()] + + def _mco_bundles_default(self): + return [DummyDakotaBundle()] + + def _kpi_calculator_bundles_default(self): + return [DummyKPICalculatorBundle()] diff --git a/force_bdss/data_sources/data_source_parameters.py b/force_bdss/data_sources/data_source_parameters.py index 6e33d16c1ef6760b55a913903cc5b19444471862..47041cdc318c150478b266097adf2254402d6925 100644 --- a/force_bdss/data_sources/data_source_parameters.py +++ b/force_bdss/data_sources/data_source_parameters.py @@ -5,3 +5,12 @@ class DataSourceParameters(HasStrictTraits): value_names = List(String) value_types = List(String) values = Array(shape=(None,)) + + def __str__(self): + return """ + DataSourceParameters + value_types: + {} + values: + {} + """.format(str(self.value_types), str(self.values)) diff --git a/force_bdss/data_sources/data_source_result.py b/force_bdss/data_sources/data_source_result.py index b1208aec5ca1dc9217667c9009021344fd4be8c4..fd19c48a45ffdc22d105cd3852d97beeb52df8a2 100644 --- a/force_bdss/data_sources/data_source_result.py +++ b/force_bdss/data_sources/data_source_result.py @@ -17,3 +17,28 @@ class DataSourceResult(HasTraits): values = Array(shape=(None, None)) accuracy = ArrayOrNone(shape=(None, None)) quality = ArrayOrNone(shape=(None, None)) + + def __str__(self): + return """ + DataSourceResults + + originator: + {} + + value_types: + {} + + values: + {} + + Accuracy: + {} + + Quality: + {} + """.format( + self.originator, + self.value_types, + self.values, + self.accuracy, + self.quality) diff --git a/setup.py b/setup.py index 19b2c6aa22c8b83e91c3d48dfa550c0c6900726b..28dc7d9729bb3de994b6abf8c9a12636082b1080 100644 --- a/setup.py +++ b/setup.py @@ -16,6 +16,7 @@ setup( ".csv_extractor_plugin:CSVExtractorPlugin", "kpi_adder = force_bdss.core_plugins.dummy_kpi" ".dummy_kpi_calculator_plugin:DummyKPICalculatorPlugin", + "dummy = force_bdss.core_plugins.dummy.dummy_plugin:DummyPlugin", ] }, packages=find_packages(),