From de107c24461c3bafa0a87a551ac14c04e0f689e5 Mon Sep 17 00:00:00 2001 From: Matias Senger Date: Sat, 9 Aug 2025 10:26:23 +0200 Subject: [PATCH 1/3] Made assertion messages visible in error messages and added example --- OMPython/ModelicaSystem.py | 2 +- examples/parameters_validation/main.py | 42 +++++++++++++++++++++++++ examples/parameters_validation/model.mo | 10 ++++++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 examples/parameters_validation/main.py create mode 100644 examples/parameters_validation/model.mo diff --git a/OMPython/ModelicaSystem.py b/OMPython/ModelicaSystem.py index d0178cf24..951d1932d 100644 --- a/OMPython/ModelicaSystem.py +++ b/OMPython/ModelicaSystem.py @@ -250,7 +250,7 @@ def run(self) -> int: except subprocess.TimeoutExpired as ex: raise ModelicaSystemError(f"Timeout running command {repr(cmdl)}") from ex except subprocess.CalledProcessError as ex: - raise ModelicaSystemError(f"Error running command {repr(cmdl)}") from ex + raise ModelicaSystemError(f"Error running command {repr(cmdl)}\n{ex.stdout}") from ex return returncode diff --git a/examples/parameters_validation/main.py b/examples/parameters_validation/main.py new file mode 100644 index 000000000..0a1b423b7 --- /dev/null +++ b/examples/parameters_validation/main.py @@ -0,0 +1,42 @@ +from OMPython import ModelicaSystem +from pathlib import Path + +def main(file=None): + """Run a simple parameters validation model.""" + model = ModelicaSystem( + str(Path(__file__).parent/'model.mo'), # Path to file where modelica code is. + 'ParametersValidation', # Name of model from that file. + ) + # Run the model with different parameters values and print the results: + for positive_number in [-1,1,.1]: + for negative_number in [-1,1,-.1]: + model.setParameters( + [ + f'positive_number={positive_number}', + f'negative_number={negative_number}', + ], + ) + print('--------------------------------------', file=file) + print('Simulating with:', file=file) + print(f'\tpositive_number = {positive_number}', file=file) + print(f'\tnegative_number = {negative_number}', file=file) + try: + model.simulate() # Parameters values are validated here. + except Exception as e: + print(e, file=file) + +def test_passing()->bool: + """Function to use for automatic testing. If returns `True` it means this example is working.""" + class PrintSilencer: + def write(s:str): + pass + test_passing = False + try: + main(file=PrintSilencer()) + test_passing = True + except Exception as e: + test_passing = False + return test_passing + +if __name__ == '__main__': + main() diff --git a/examples/parameters_validation/model.mo b/examples/parameters_validation/model.mo new file mode 100644 index 000000000..69a402b7b --- /dev/null +++ b/examples/parameters_validation/model.mo @@ -0,0 +1,10 @@ +model ParametersValidation "A dummy model to show how to validate parameters" + parameter Real positive_number = 1; + parameter Real negative_number = -1; + + initial algorithm + assert(positive_number>0, "`positive_number` must be > 0"); + assert(negative_number<0, "`negative_number` must be < 0"); + assert(positive_number-negative_number > 1, "`positive_number - negative_number` must be > 1"); + +end ParametersValidation; From bbd870c62aed140d7fd131ca9bc195d88de83751 Mon Sep 17 00:00:00 2001 From: Matias Senger Date: Sat, 9 Aug 2025 10:47:57 +0200 Subject: [PATCH 2/3] Better example implementation --- examples/parameters_validation/main.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/parameters_validation/main.py b/examples/parameters_validation/main.py index 0a1b423b7..e0877a0e4 100644 --- a/examples/parameters_validation/main.py +++ b/examples/parameters_validation/main.py @@ -17,11 +17,11 @@ def main(file=None): ], ) print('--------------------------------------', file=file) - print('Simulating with:', file=file) - print(f'\tpositive_number = {positive_number}', file=file) - print(f'\tnegative_number = {negative_number}', file=file) + print(f'model parameters: {model.getParameters()}', file=file) try: model.simulate() # Parameters values are validated here. + print('No errors') + continue except Exception as e: print(e, file=file) From ef6de0104041394779a2fb425bb50eb643db20d9 Mon Sep 17 00:00:00 2001 From: Matias Senger Date: Fri, 22 Aug 2025 18:45:38 +0200 Subject: [PATCH 3/3] Fix missing `self` in class definition --- examples/parameters_validation/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/parameters_validation/main.py b/examples/parameters_validation/main.py index e0877a0e4..50b7efada 100644 --- a/examples/parameters_validation/main.py +++ b/examples/parameters_validation/main.py @@ -28,7 +28,7 @@ def main(file=None): def test_passing()->bool: """Function to use for automatic testing. If returns `True` it means this example is working.""" class PrintSilencer: - def write(s:str): + def write(self, s:str): pass test_passing = False try: