diff --git a/force_bdss/core_plugins/dummy_mco/dakota/dakota_communicator.py b/force_bdss/core_plugins/dummy_mco/dakota/dakota_communicator.py index ee349e806571d776d49a0dfc533bd53224931322..1b816841c7a719d2e1c566cc3afacaa7a0d245b3 100644 --- a/force_bdss/core_plugins/dummy_mco/dakota/dakota_communicator.py +++ b/force_bdss/core_plugins/dummy_mco/dakota/dakota_communicator.py @@ -8,13 +8,20 @@ class DakotaCommunicator(BaseMCOCommunicator): def receive_from_mco(self): data = sys.stdin.read() values = list(map(float, data.split())) - value_types = self.model.value_types - if len(values) != len(value_types): - raise ValueError("Length of provided data differs from the number " - "of expected types. {} {}".format(values, - value_types)) + parameters = self.model.parameters + + if len(values) != len(parameters): + raise ValueError( + "The passed information length is {}, but the model " + "specifies {} values.".format( + len(values), len(parameters) + )) + + value_types = [p.type for p in parameters] + value_names = [p.name for p in parameters] return DataSourceParameters( + value_names=value_names, value_types=value_types, values=numpy.array(values) ) diff --git a/force_bdss/core_plugins/dummy_mco/dakota/dakota_model.py b/force_bdss/core_plugins/dummy_mco/dakota/dakota_model.py index b4c081a6b38bd5478f4287624411c5ce185cd01d..3c0d14a4dffbc438c267eb32121010b8fd1437f4 100644 --- a/force_bdss/core_plugins/dummy_mco/dakota/dakota_model.py +++ b/force_bdss/core_plugins/dummy_mco/dakota/dakota_model.py @@ -1,7 +1,5 @@ -from traits.api import List, String - from force_bdss.api import BaseMCOModel class DakotaModel(BaseMCOModel): - value_types = List(String) + pass diff --git a/force_bdss/core_plugins/dummy_mco/dakota/dakota_optimizer.py b/force_bdss/core_plugins/dummy_mco/dakota/dakota_optimizer.py index 6b607cfce35432d286642465e36e90387f5a6c34..485a3d6531432c6fa89c34e47c6dc065903717d1 100644 --- a/force_bdss/core_plugins/dummy_mco/dakota/dakota_optimizer.py +++ b/force_bdss/core_plugins/dummy_mco/dakota/dakota_optimizer.py @@ -1,14 +1,34 @@ import subprocess - import sys +import itertools +import collections from force_bdss.api import BaseMultiCriteriaOptimizer +def rotated_range(start, stop, starting_value): + r = list(range(start, stop)) + start_idx = r.index(starting_value) + d = collections.deque(r) + d.rotate(-start_idx) + return list(d) + + class DakotaOptimizer(BaseMultiCriteriaOptimizer): def run(self): - print("Running dakota optimizer") - for initial_value in range(10): + parameters = self.model.parameters + + values = [] + for p in parameters: + values.append( + rotated_range(p.lower_bound, + p.upper_bound, + p.initial_value) + ) + + value_iterator = itertools.product(*values) + + for value in value_iterator: ps = subprocess.Popen( [sys.argv[0], "--evaluate", @@ -16,5 +36,7 @@ class DakotaOptimizer(BaseMultiCriteriaOptimizer): stdout=subprocess.PIPE, stdin=subprocess.PIPE) - out = ps.communicate("{}".format(initial_value).encode("utf-8")) - print("{}: {}".format(initial_value, out[0].decode("utf-8"))) + out = ps.communicate( + " ".join([str(v) for v in value]).encode("utf-8")) + print("{}: {}".format(" ".join([str(v) for v in value]), + out[0].decode("utf-8"))) diff --git a/force_bdss/data_sources/data_source_parameters.py b/force_bdss/data_sources/data_source_parameters.py index c45915dd1f056873e96e9e957753a90409c3d215..6e33d16c1ef6760b55a913903cc5b19444471862 100644 --- a/force_bdss/data_sources/data_source_parameters.py +++ b/force_bdss/data_sources/data_source_parameters.py @@ -2,5 +2,6 @@ from traits.api import HasStrictTraits, Array, List, String class DataSourceParameters(HasStrictTraits): + value_names = List(String) value_types = List(String) values = Array(shape=(None,)) diff --git a/force_bdss/mco/base_mco_model.py b/force_bdss/mco/base_mco_model.py index e7466353e63a32edc862d744b643752f6c2f88cb..acdebfbb0ce74b0315c2056889153cad21278bd5 100644 --- a/force_bdss/mco/base_mco_model.py +++ b/force_bdss/mco/base_mco_model.py @@ -1,5 +1,6 @@ -from traits.api import ABCHasStrictTraits, Instance +from traits.api import ABCHasStrictTraits, Instance, List +from ..workspecs.mco_parameters import MCOParameter from .i_multi_criteria_optimizer_bundle import IMultiCriteriaOptimizerBundle @@ -17,6 +18,8 @@ class BaseMCOModel(ABCHasStrictTraits): visible=False, transient=True) + parameters = List(MCOParameter) + def __init__(self, bundle, *args, **kwargs): self.bundle = bundle super(BaseMCOModel, self).__init__(*args, **kwargs) diff --git a/force_bdss/tests/fixtures/test_csv.json b/force_bdss/tests/fixtures/test_csv.json index 1c15b0f07f2bdeee497b41ea655e31fb64b19dff..f061c1092201a1cb409595a1d002ea3a85d57166 100644 --- a/force_bdss/tests/fixtures/test_csv.json +++ b/force_bdss/tests/fixtures/test_csv.json @@ -4,7 +4,6 @@ "multi_criteria_optimizer": { "id": "force.bdss.bundles.enthought.dakota", "model_data": { - "value_types": ["DUMMY"] } }, "data_sources": [ diff --git a/force_bdss/workspecs/mco_parameters.py b/force_bdss/workspecs/mco_parameters.py new file mode 100644 index 0000000000000000000000000000000000000000..5020117e19a8bc7d8d45d70fe2b60aa9ef77cdee --- /dev/null +++ b/force_bdss/workspecs/mco_parameters.py @@ -0,0 +1,13 @@ +from traits.api import HasStrictTraits, String, Float + + +class MCOParameter(HasStrictTraits): + pass + + +class RangedMCOParameter(MCOParameter): + name = String() + value_type = String() + initial_value = Float() + upper_bound = Float() + lower_bound = Float()