Skip to content

Commit 4d1fc7a

Browse files
authored
Merge pull request #118 from RWTH-EBC/117-typeerror-is-wrongfully-raised [PYPI-RELEASE]
117 typeerror is wrongfully raised
2 parents 74c40f6 + ba6e53e commit 4d1fc7a

File tree

5 files changed

+64
-40
lines changed

5 files changed

+64
-40
lines changed

ebcpy/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@
88
from .optimization import Optimizer
99

1010

11-
__version__ = '0.3.11'
11+
__version__ = '0.3.12'

ebcpy/simulationapi/__init__.py

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -292,32 +292,44 @@ def simulate(self,
292292
parameters = [{}]
293293
if isinstance(parameters, dict):
294294
parameters = [parameters]
295+
296+
if return_option not in ["time_series", "savepath", "last_point"]:
297+
raise ValueError(f"Given return option '{return_option}' is not supported.")
298+
295299
new_kwargs = {}
296300
kwargs["return_option"] = return_option # Update with arg
301+
n_simulations = len(parameters)
297302
# Handle special case for saving files:
298-
if return_option == "savepath" and len(parameters) > 1:
303+
if return_option == "savepath" and n_simulations > 1:
299304
savepath = kwargs.get("savepath", [])
300305
if isinstance(savepath, (str, os.PathLike)):
301-
savepath = [savepath] * len(parameters)
306+
savepath = [savepath] * n_simulations
302307
result_file_name = kwargs.get("result_file_name", [])
303-
if (len(set(savepath)) != len(parameters) and
304-
len(set(result_file_name)) != len(parameters)):
305-
raise TypeError(
308+
if isinstance(result_file_name, str):
309+
result_file_name = [result_file_name] * n_simulations
310+
if len(savepath) != len(result_file_name):
311+
raise ValueError("Given savepath and result_file_name "
312+
"have not the same lenght.")
313+
joined_save_paths = []
314+
for _single_save_path, _single_result_name in zip(savepath, result_file_name):
315+
joined_save_paths.append(os.path.join(_single_save_path, _single_result_name))
316+
if len(set(joined_save_paths)) != n_simulations:
317+
raise ValueError(
306318
"Simulating multiple parameter set's on "
307-
"the same savepath will overwrite old "
308-
"results or even cause errors. "
309-
"Specify a result_file_name or savepath for each "
310-
"parameter combination"
319+
"the same combination of savepath and result_file_name "
320+
"will override results or even cause errors. "
321+
"Specify a unqiue result_file_name-savepath combination "
322+
"for each parameter combination"
311323
)
312324
for key, value in kwargs.items():
313325
if isinstance(value, list):
314-
if len(value) != len(parameters):
326+
if len(value) != n_simulations:
315327
raise ValueError(f"Mismatch in multiprocessing of "
316-
f"given parameters ({len(parameters)}) "
328+
f"given parameters ({n_simulations}) "
317329
f"and given {key} ({len(value)})")
318330
new_kwargs[key] = value
319331
else:
320-
new_kwargs[key] = [value] * len(parameters)
332+
new_kwargs[key] = [value] * n_simulations
321333
kwargs = []
322334
for _idx, _parameters in enumerate(parameters):
323335
kwargs.append(
@@ -354,7 +366,7 @@ def simulate(self,
354366
"return_option": _single_kwargs["return_option"],
355367
**_single_kwargs
356368
}) for _single_kwargs in kwargs]
357-
self.logger.info(f"Finished {len(parameters)} simulations on {self.n_cpu} processes in "
369+
self.logger.info(f"Finished {n_simulations} simulations on {self.n_cpu} processes in "
358370
f"{timedelta(seconds=int(time.time() - t_sim_start))}")
359371
if len(results) == 1:
360372
return results[0]

ebcpy/simulationapi/dymola_api.py

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -327,15 +327,24 @@ def simulate(self,
327327

328328
def _single_simulation(self, kwargs):
329329
# Unpack kwargs
330-
show_eventlog = kwargs.get("show_eventlog", False)
331-
squeeze = kwargs.get("squeeze", True)
332-
result_file_name = kwargs.get("result_file_name", 'resultFile')
333-
parameters = kwargs.get("parameters")
334-
return_option = kwargs.get("return_option")
335-
model_names = kwargs.get("model_names")
336-
inputs = kwargs.get("inputs", None)
337-
fail_on_error = kwargs.get("fail_on_error", True)
338-
structural_parameters = kwargs.get("structural_parameters", [])
330+
show_eventlog = kwargs.pop("show_eventlog", False)
331+
squeeze = kwargs.pop("squeeze", True)
332+
result_file_name = kwargs.pop("result_file_name", 'resultFile')
333+
parameters = kwargs.pop("parameters")
334+
return_option = kwargs.pop("return_option")
335+
model_names = kwargs.pop("model_names", None)
336+
inputs = kwargs.pop("inputs", None)
337+
fail_on_error = kwargs.pop("fail_on_error", True)
338+
structural_parameters = kwargs.pop("structural_parameters", [])
339+
table_name = kwargs.pop("table_name", None)
340+
file_name = kwargs.pop("file_name", None)
341+
savepath = kwargs.pop("savepath", None)
342+
if kwargs:
343+
self.logger.error(
344+
"You passed the following kwargs which "
345+
"are not part of the supported kwargs and "
346+
"have thus no effect: %s.", " ,".join(list(kwargs.keys())))
347+
339348

340349
# Handle multiprocessing
341350
if self.use_mp:
@@ -422,10 +431,7 @@ def _single_simulation(self, kwargs):
422431
# Handle inputs
423432
if inputs is not None:
424433
# Unpack additional kwargs
425-
try:
426-
table_name = kwargs["table_name"]
427-
file_name = kwargs["file_name"]
428-
except KeyError as err:
434+
if table_name is None or file_name is None:
429435
raise KeyError("For inputs to be used by DymolaAPI.simulate, you "
430436
"have to specify the 'table_name' and the 'file_name' "
431437
"as keyword arguments of the function. These must match"
@@ -529,15 +535,17 @@ def _single_simulation(self, kwargs):
529535

530536
if return_option == "savepath":
531537
_save_name_dsres = f"{result_file_name}.mat"
532-
savepath = kwargs.pop("savepath", None)
533538
# Get the cd of the current dymola instance
534539
self.dymola.cd()
535540
# Get the value and convert it to a 100 % fitting str-path
536541
dymola_cd = str(pathlib.Path(self.dymola.getLastErrorLog().replace("\n", "")))
537542
if savepath is None or str(savepath) == dymola_cd:
538543
return os.path.join(dymola_cd, _save_name_dsres)
539544
os.makedirs(savepath, exist_ok=True)
540-
for filename in [_save_name_dsres, "dslog.txt", "dsfinal.txt"]:
545+
for filename in [_save_name_dsres]:
546+
# Copying dslogs and dsfinals can lead to errors,
547+
# as the names are not unique
548+
# for filename in [_save_name_dsres, "dslog.txt", "dsfinal.txt"]:
541549
# Delete existing files
542550
try:
543551
os.remove(os.path.join(savepath, filename))
@@ -1028,7 +1036,7 @@ def get_dymola_path(dymola_install_dir, dymola_name=None):
10281036
"""
10291037
if dymola_name is None:
10301038
if "linux" in sys.platform:
1031-
dymola_name = "dymola.sh"
1039+
dymola_name = "dymola"
10321040
elif "win" in sys.platform:
10331041
dymola_name = "Dymola.exe"
10341042
else:

ebcpy/simulationapi/fmu.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,17 @@ def _single_simulation(self, kwargs):
186186
# Unpack kwargs:
187187
parameters = kwargs.pop("parameters", None)
188188
return_option = kwargs.pop("return_option", "time_series")
189-
inputs = kwargs.get("inputs", None)
190-
fail_on_error = kwargs.get("fail_on_error", True)
189+
inputs = kwargs.pop("inputs", None)
190+
fail_on_error = kwargs.pop("fail_on_error", True)
191+
result_file_name = kwargs.pop("result_file_name", "resultFile")
192+
result_file_suffix = kwargs.pop("result_file_suffix", "csv")
193+
parquet_engine = kwargs.pop('parquet_engine', 'pyarrow')
194+
savepath = kwargs.pop("savepath", None)
195+
if kwargs:
196+
self.logger.error(
197+
"You passed the following kwargs which "
198+
"are not part of the supported kwargs and "
199+
"have thus no effect: %s.", " ,".join(list(kwargs.keys())))
191200

192201
if self.use_mp:
193202
if self._fmu_instance is None:
@@ -255,11 +264,6 @@ def _single_simulation(self, kwargs):
255264
str(self.sim_setup.output_interval)[::-1].find('.'))
256265

257266
if return_option == "savepath":
258-
result_file_name = kwargs.get("result_file_name", "resultFile")
259-
result_file_suffix = kwargs.get("result_file_suffix", "csv")
260-
parquet_engine = kwargs.get('parquet_engine', 'pyarrow')
261-
savepath = kwargs.get("savepath", None)
262-
263267
if savepath is None:
264268
savepath = self.cd
265269

tests/test_simulationapi.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,10 @@ def test_savepath_handling(self):
9494
_some_par = list(self.sim_api.parameters.keys())[0]
9595
pars = {_some_par: self.sim_api.parameters[_some_par].value}
9696
parameters = [pars for i in range(2)]
97-
with self.assertRaises(TypeError):
97+
with self.assertRaises(ValueError):
9898
res = self.sim_api.simulate(parameters=parameters,
9999
return_option='savepath')
100-
with self.assertRaises(TypeError):
100+
with self.assertRaises(ValueError):
101101
res = self.sim_api.simulate(parameters=parameters,
102102
return_option='savepath',
103103
result_file_name=["t", "t"],
@@ -183,7 +183,7 @@ def setUp(self) -> None:
183183

184184
# Just for tests in the gitlab-ci:
185185
if "linux" in sys.platform:
186-
dymola_exe_path = "/usr/local/bin64/dymola"
186+
dymola_exe_path = "/usr/local/bin/dymola"
187187
else:
188188
dymola_exe_path = None
189189
try:

0 commit comments

Comments
 (0)