Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CSVMixin: Enable support for ensembles with one member #1653

Merged
merged 1 commit into from
Feb 25, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/rtctools/optimization/csv_mixin.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,9 @@ def check_initial_state_array(initial_state):
names=True,
encoding=None,
)
if len(self.__ensemble.shape) == 0:
# If there is only one ensemble member, the array is 0-dimensional.
self.__ensemble = np.expand_dims(self.__ensemble, 0)

logger.debug("CSVMixin: Read ensemble description")

Expand Down
2 changes: 2 additions & 0 deletions tests/optimization/data/one-member-ensemble/ensemble.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
name,probability
member0,1.0
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
timeseries_export.xml
timeseries_export.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
x
1.02
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
k
1.01
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
Time,u_Min,u_Max,constant_input
2013-05-19 22:00:00,-2.0,2.0,1.0
2013-05-19 23:00:00,-2.0,2.0,1.0
2013-05-20 00:00:00,-2.0,2.0,1.0
2013-05-20 01:00:00,-2.0,2.0,1.0
2013-05-20 02:00:00,-2.0,2.0,1.0
2013-05-20 03:00:00,-2.0,2.0,1.0
2013-05-20 04:00:00,-2.0,2.0,1.0
2013-05-20 05:00:00,-2.0,2.0,1.0
2013-05-20 06:00:00,-2.0,2.0,1.0
2013-05-20 07:00:00,-2.0,2.0,1.0
2013-05-20 08:00:00,-2.0,2.0,1.0
2013-05-20 09:00:00,-2.0,2.0,1.0
2013-05-20 10:00:00,-2.0,2.0,1.0
2013-05-20 11:00:00,-2.0,2.0,1.0
2013-05-20 12:00:00,-2.0,2.0,1.0
2013-05-20 13:00:00,-2.0,2.0,1.0
2013-05-20 14:00:00,-2.0,2.0,1.0
2013-05-20 15:00:00,-2.0,2.0,1.0
2013-05-20 16:00:00,-2.0,2.0,1.0
2013-05-20 17:00:00,-2.0,2.0,1.0
2013-05-20 18:00:00,-2.0,2.0,1.0
2013-05-20 19:00:00,-2.0,2.0,1.0
26 changes: 19 additions & 7 deletions tests/optimization/test_csv_mixin.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import logging
import os

import numpy as np
from rtctools.optimization.collocated_integrated_optimization_problem import (
Expand All @@ -17,9 +18,9 @@
class Model(CSVMixin, ModelicaMixin, CollocatedIntegratedOptimizationProblem):
def __init__(self, **kwargs):
kwargs["model_name"] = kwargs.get("model_name", "Model")
kwargs["input_folder"] = data_path()
kwargs["output_folder"] = data_path()
kwargs["model_folder"] = data_path()
kwargs["input_folder"] = kwargs.get("input_folder", data_path())
kwargs["output_folder"] = kwargs.get("output_folder", data_path())
kwargs["model_folder"] = kwargs.get("model_folder", data_path())
super().__init__(**kwargs)

def objective(self, ensemble_member):
Expand All @@ -42,10 +43,10 @@ def compiler_options(self):
class ModelEnsemble(Model):
csv_ensemble_mode = True

def __init__(self):
def __init__(self, io_folder):
super().__init__(
input_folder=data_path(),
output_folder=data_path(),
input_folder=io_folder,
output_folder=io_folder,
model_name="Model",
model_folder=data_path(),
lookup_tables=[],
Expand Down Expand Up @@ -105,7 +106,18 @@ def test_interpolate(self):

class TestCSVMixinEnsemble(TestCase):
def setUp(self):
self.problem = ModelEnsemble()
self.problem = ModelEnsemble(data_path())
self.problem.optimize()
self.tolerance = 1e-6

def test_objective_value(self):
objective_value_tol = 1e-6
self.assertTrue(abs(self.problem.objective_value) < objective_value_tol)


class TestCSVMixinOneMemberEnsemble(TestCase):
def setUp(self):
self.problem = ModelEnsemble(os.path.join(data_path(), "one-member-ensemble"))
self.problem.optimize()
self.tolerance = 1e-6

Expand Down