Skip to content
Draft
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
99 changes: 14 additions & 85 deletions OMPython/ModelicaSystem.py
Original file line number Diff line number Diff line change
Expand Up @@ -1300,49 +1300,13 @@ def getSolutions(

@staticmethod
def _prepare_input_data(
input_args: Any,
input_kwargs: dict[str, Any],
) -> dict[str, str]:
"""
Convert raw input to a structured dictionary {'key1': 'value1', 'key2': 'value2'}.
"""

def prepare_str(str_in: str) -> dict[str, str]:
str_in = str_in.replace(" ", "")
key_val_list: list[str] = str_in.split("=")
if len(key_val_list) != 2:
raise ModelicaSystemError(f"Invalid 'key=value' pair: {str_in}")

input_data_from_str: dict[str, str] = {key_val_list[0]: key_val_list[1]}

return input_data_from_str

input_data: dict[str, str] = {}

for input_arg in input_args:
if isinstance(input_arg, str):
warnings.warn(message="The definition of values to set should use a dictionary, "
"i.e. {'key1': 'val1', 'key2': 'val2', ...}. Please convert all cases which "
"use a string ('key=val') or list ['key1=val1', 'key2=val2', ...]",
category=DeprecationWarning,
stacklevel=3)
input_data = input_data | prepare_str(input_arg)
elif isinstance(input_arg, list):
warnings.warn(message="The definition of values to set should use a dictionary, "
"i.e. {'key1': 'val1', 'key2': 'val2', ...}. Please convert all cases which "
"use a string ('key=val') or list ['key1=val1', 'key2=val2', ...]",
category=DeprecationWarning,
stacklevel=3)

for item in input_arg:
if not isinstance(item, str):
raise ModelicaSystemError(f"Invalid input data type for set*() function: {type(item)}!")
input_data = input_data | prepare_str(item)
elif isinstance(input_arg, dict):
input_data = input_data | input_arg
else:
raise ModelicaSystemError(f"Invalid input data type for set*() function: {type(input_arg)}!")

if len(input_kwargs):
for key, val in input_kwargs.items():
# ensure all values are strings to align it on one type: dict[str, str]
Expand Down Expand Up @@ -1420,21 +1384,15 @@ def isParameterChangeable(

def setContinuous(
self,
*args: Any,
**kwargs: dict[str, Any],
) -> bool:
"""
This method is used to set continuous values. It can be called:
with a sequence of continuous name and assigning corresponding values as arguments as show in the example below:
usage
>>> setContinuous("Name=value") # depreciated
>>> setContinuous(["Name1=value1","Name2=value2"]) # depreciated

This method is used to set continuous values.
>>> setContinuous(Name1="value1", Name2="value2")
>>> param = {"Name1": "value1", "Name2": "value2"}
>>> setContinuous(**param)
"""
inputdata = self._prepare_input_data(input_args=args, input_kwargs=kwargs)
inputdata = self._prepare_input_data(input_kwargs=kwargs)

return self._set_method_helper(
inputdata=inputdata,
Expand All @@ -1444,21 +1402,15 @@ def setContinuous(

def setParameters(
self,
*args: Any,
**kwargs: dict[str, Any],
) -> bool:
"""
This method is used to set parameter values. It can be called:
with a sequence of parameter name and assigning corresponding value as arguments as show in the example below:
usage
>>> setParameters("Name=value") # depreciated
>>> setParameters(["Name1=value1","Name2=value2"]) # depreciated

This method is used to set parameter values.
>>> setParameters(Name1="value1", Name2="value2")
>>> param = {"Name1": "value1", "Name2": "value2"}
>>> setParameters(**param)
"""
inputdata = self._prepare_input_data(input_args=args, input_kwargs=kwargs)
inputdata = self._prepare_input_data(input_kwargs=kwargs)

return self._set_method_helper(
inputdata=inputdata,
Expand All @@ -1468,22 +1420,15 @@ def setParameters(

def setSimulationOptions(
self,
*args: Any,
**kwargs: dict[str, Any],
) -> bool:
"""
This method is used to set simulation options. It can be called:
with a sequence of simulation options name and assigning corresponding values as arguments as show in the
example below:
usage
>>> setSimulationOptions("Name=value") # depreciated
>>> setSimulationOptions(["Name1=value1","Name2=value2"]) # depreciated

This method is used to set simulation options.
>>> setSimulationOptions(Name1="value1", Name2="value2")
>>> param = {"Name1": "value1", "Name2": "value2"}
>>> setSimulationOptions(**param)
"""
inputdata = self._prepare_input_data(input_args=args, input_kwargs=kwargs)
inputdata = self._prepare_input_data(input_kwargs=kwargs)

return self._set_method_helper(
inputdata=inputdata,
Expand All @@ -1493,22 +1438,15 @@ def setSimulationOptions(

def setLinearizationOptions(
self,
*args: Any,
**kwargs: dict[str, Any],
) -> bool:
"""
This method is used to set linearization options. It can be called:
with a sequence of linearization options name and assigning corresponding value as arguments as show in the
example below
usage
>>> setLinearizationOptions("Name=value") # depreciated
>>> setLinearizationOptions(["Name1=value1","Name2=value2"]) # depreciated

This method is used to set linearization options.
>>> setLinearizationOptions(Name1="value1", Name2="value2")
>>> param = {"Name1": "value1", "Name2": "value2"}
>>> setLinearizationOptions(**param)
"""
inputdata = self._prepare_input_data(input_args=args, input_kwargs=kwargs)
inputdata = self._prepare_input_data(input_kwargs=kwargs)

return self._set_method_helper(
inputdata=inputdata,
Expand All @@ -1518,22 +1456,18 @@ def setLinearizationOptions(

def setOptimizationOptions(
self,
*args: Any,
**kwargs: dict[str, Any],
) -> bool:
"""
This method is used to set optimization options. It can be called:
with a sequence of optimization options name and assigning corresponding values as arguments as show in the
example below:
usage
>>> setOptimizationOptions("Name=value") # depreciated
>>> setOptimizationOptions(["Name1=value1","Name2=value2"]) # depreciated

>>> setOptimizationOptions(Name1="value1", Name2="value2")
>>> param = {"Name1": "value1", "Name2": "value2"}
>>> setOptimizationOptions(**param)
"""
inputdata = self._prepare_input_data(input_args=args, input_kwargs=kwargs)
inputdata = self._prepare_input_data(input_kwargs=kwargs)

return self._set_method_helper(
inputdata=inputdata,
Expand All @@ -1543,23 +1477,18 @@ def setOptimizationOptions(

def setInputs(
self,
*args: Any,
**kwargs: dict[str, Any],
) -> bool:
"""
This method is used to set input values. It can be called with a sequence of input name and assigning
corresponding values as arguments as show in the example below. Compared to other set*() methods this is a
special case as value could be a list of tuples - these are converted to a string in _prepare_input_data()
and restored here via ast.literal_eval().

>>> setInputs("Name=value") # depreciated
>>> setInputs(["Name1=value1","Name2=value2"]) # depreciated
This method is used to set input values.

Compared to other set*() methods this is a special case as value could be a list of tuples - these are
converted to a string in _prepare_input_data() and restored here via ast.literal_eval().
>>> setInputs(Name1="value1", Name2="value2")
>>> param = {"Name1": "value1", "Name2": "value2"}
>>> setInputs(**param)
"""
inputdata = self._prepare_input_data(input_args=args, input_kwargs=kwargs)
inputdata = self._prepare_input_data(input_kwargs=kwargs)

for key, val in inputdata.items():
if key not in self._inputs:
Expand Down Expand Up @@ -2099,7 +2028,7 @@ def prepare(self) -> int:
}
)

self._mod.setParameters(sim_param_non_structural)
self._mod.setParameters(**sim_param_non_structural)
mscmd = self._mod.simulate_cmd(
result_file=resultfile,
)
Expand Down
8 changes: 4 additions & 4 deletions tests/test_ModelicaSystem.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,9 @@ def test_setParameters():
model_name="BouncingBall",
)

# method 1 (test depreciated variants)
mod.setParameters("e=1.234")
mod.setParameters(["g=321.0"])
# method 1 (as kwarg)
mod.setParameters(e=1.234)
mod.setParameters(g=321.0)
assert mod.getParameters("e") == ["1.234"]
assert mod.getParameters("g") == ["321.0"]
assert mod.getParameters() == {
Expand All @@ -74,7 +74,7 @@ def test_setParameters():
with pytest.raises(KeyError):
mod.getParameters("thisParameterDoesNotExist")

# method 2 (new style)
# method 2 (as **kwarg)
pvals = {"e": 21.3, "g": 0.12}
mod.setParameters(**pvals)
assert mod.getParameters() == {
Expand Down
Loading