rtc-tools 2.8.0a0__tar.gz → 2.8.0a2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of rtc-tools might be problematic. Click here for more details.

Files changed (407) hide show
  1. rtc_tools-2.8.0a2/.github/actions/setup-python/action.yml +52 -0
  2. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/.github/workflows/rtc-tools.yml +15 -6
  3. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/AUTHORS +3 -0
  4. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/PKG-INFO +6 -8
  5. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/README.md +2 -4
  6. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/optimization/modelica_models.rst +1 -1
  7. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/pyproject.toml +3 -3
  8. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/_internal/casadi_helpers.py +22 -4
  9. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/optimization/collocated_integrated_optimization_problem.py +47 -5
  10. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/optimization/optimization_problem.py +2 -2
  11. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/ModelSymbolicParameters.mo +4 -1
  12. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_delay_expressions.py +29 -2
  13. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_modelica_mixin.py +52 -1
  14. rtc_tools-2.8.0a0/.github/actions/setup-python/action.yml +0 -33
  15. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/.codecov.yml +0 -0
  16. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/.coveragerc +0 -0
  17. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/.git-blame-ignore-revs +0 -0
  18. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/.gitignore +0 -0
  19. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/.pre-commit-config.yaml +0 -0
  20. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/.readthedocs.yaml +0 -0
  21. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/CONTRIBUTING.md +0 -0
  22. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/COPYING +0 -0
  23. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/COPYING.LESSER +0 -0
  24. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/.gitignore +0 -0
  25. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/Makefile +0 -0
  26. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/_static/theme_overrides.css +0 -0
  27. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/conf.py +0 -0
  28. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/optimization/basic.rst +0 -0
  29. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/optimization/cascading_channels.rst +0 -0
  30. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/optimization/channel_pulse.rst +0 -0
  31. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/optimization/channel_wave_damping.rst +0 -0
  32. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/optimization/debugging.rst +0 -0
  33. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/optimization/ensemble.rst +0 -0
  34. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/optimization/goal_programming.rst +0 -0
  35. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/optimization/integrator_delay.rst +0 -0
  36. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/optimization/lookup_table.rst +0 -0
  37. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/optimization/mixed_integer.rst +0 -0
  38. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/optimization/pumped_hydropower_system.rst +0 -0
  39. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/optimization.rst +0 -0
  40. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/pyplots/basic_results.py +0 -0
  41. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/pyplots/cascading_channels_results.py +0 -0
  42. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/pyplots/channel_pulse_results.py +0 -0
  43. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/pyplots/channel_wave_damping.py +0 -0
  44. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/pyplots/ensemble_results.py +0 -0
  45. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/pyplots/goal_programming_results.py +0 -0
  46. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/pyplots/integrator_delay.py +0 -0
  47. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/pyplots/lookup_table_results.py +0 -0
  48. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/pyplots/mixed_integer_results.py +0 -0
  49. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/pyplots/pumped_hydropower_system_results.py +0 -0
  50. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/pyplots/simulation_results.py +0 -0
  51. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/simulation/custom_equation.rst +0 -0
  52. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/simulation/setpoint.rst +0 -0
  53. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples/simulation.rst +0 -0
  54. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/examples.rst +0 -0
  55. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/getting-started.rst +0 -0
  56. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/images/Lake-Hartwell-24012016.jpg +0 -0
  57. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/images/PumpedStoragePlant_openmodelica.png +0 -0
  58. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/images/Woudagemaal.jpg +0 -0
  59. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/images/basic_example_console.png +0 -0
  60. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/images/cascading_channels_omedit.png +0 -0
  61. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/images/channel_impulse_xs.png +0 -0
  62. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/images/channel_wave_damping_omedit.png +0 -0
  63. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/images/graig-coch-2117306_640.jpg +0 -0
  64. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/images/integrator_delay_modelica.png +0 -0
  65. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/images/lavant-2976738_1280.jpg +0 -0
  66. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/images/logo.png +0 -0
  67. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/images/orifice_vs_pump_openmodelica.png +0 -0
  68. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/images/pont-du-gard-1742029_1280.jpg +0 -0
  69. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/images/simple_storage_openmodelica.png +0 -0
  70. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/images/single_channel.png +0 -0
  71. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/images/single_channel_hec-ras.png +0 -0
  72. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/index.rst +0 -0
  73. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/make.bat +0 -0
  74. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/optimization/basics.rst +0 -0
  75. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/optimization/csv_io.rst +0 -0
  76. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/optimization/fews_io.rst +0 -0
  77. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/optimization/forecast_uncertainty.rst +0 -0
  78. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/optimization/goal_programming/converting_goals_to_constraints.rst +0 -0
  79. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/optimization/goal_programming/goals.rst +0 -0
  80. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/optimization/goal_programming/linearized_order.rst +0 -0
  81. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/optimization/goal_programming/main_idea.rst +0 -0
  82. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/optimization/goal_programming/minimize_absolute_value.rst +0 -0
  83. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/optimization/homotopy.rst +0 -0
  84. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/optimization/initial_state_estimation.rst +0 -0
  85. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/optimization/linearization.rst +0 -0
  86. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/optimization/lookup_tables.rst +0 -0
  87. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/optimization/multi_objective.rst +0 -0
  88. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/optimization/time_discretization.rst +0 -0
  89. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/optimization.rst +0 -0
  90. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/simulation/basics.rst +0 -0
  91. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/simulation/csv_io.rst +0 -0
  92. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/simulation/fews_io.rst +0 -0
  93. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/doc/simulation.rst +0 -0
  94. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/basic/input/initial_state.csv +0 -0
  95. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/basic/input/timeseries_import.csv +0 -0
  96. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/basic/model/Example.mo +0 -0
  97. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/basic/output/.gitignore +0 -0
  98. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/basic/reference_output/timeseries_export.csv +0 -0
  99. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/basic/src/example.py +0 -0
  100. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/cascading_channels/input/initial_state.csv +0 -0
  101. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/cascading_channels/input/timeseries_import.csv +0 -0
  102. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/cascading_channels/model/.gitignore +0 -0
  103. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/cascading_channels/model/Example.mo +0 -0
  104. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/cascading_channels/output/.gitignore +0 -0
  105. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/cascading_channels/reference_output/timeseries_export.csv +0 -0
  106. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/cascading_channels/src/example.py +0 -0
  107. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/channel_pulse/HEC-RAS.zip +0 -0
  108. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/channel_pulse/input/timeseries_import.csv +0 -0
  109. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/channel_pulse/model/Example.mo +0 -0
  110. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/channel_pulse/output/.gitignore +0 -0
  111. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/channel_pulse/reference_output/HEC-RAS_export.csv +0 -0
  112. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/channel_pulse/reference_output/timeseries_export.csv +0 -0
  113. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/channel_pulse/reference_output/timeseries_export_inertial_wave.csv +0 -0
  114. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/channel_pulse/reference_output/timeseries_export_inertial_wave_semi_implicit.csv +0 -0
  115. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/channel_pulse/reference_output/timeseries_export_saint_venant.csv +0 -0
  116. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/channel_pulse/reference_output/timeseries_export_saint_venant_upwind.csv +0 -0
  117. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/channel_pulse/src/example.py +0 -0
  118. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/channel_wave_damping/input/timeseries_import.csv +0 -0
  119. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/channel_wave_damping/model/Example.mo +0 -0
  120. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/channel_wave_damping/model/ExampleLocalControl.mo +0 -0
  121. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/channel_wave_damping/model/ExampleOptimization.mo +0 -0
  122. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/channel_wave_damping/model/PIDController.mo +0 -0
  123. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/channel_wave_damping/output/.gitignore +0 -0
  124. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/channel_wave_damping/reference_output/timeseries_export.csv +0 -0
  125. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/channel_wave_damping/reference_output/timeseries_export_local_control.csv +0 -0
  126. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/channel_wave_damping/src/example_local_control.py +0 -0
  127. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/channel_wave_damping/src/example_optimization.py +0 -0
  128. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/channel_wave_damping/src/steady_state_initialization_mixin.py +0 -0
  129. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/channel_wave_damping/src/step_size_parameter_mixin.py +0 -0
  130. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/ensemble/input/.gitignore +0 -0
  131. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/ensemble/input/ensemble.csv +0 -0
  132. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/ensemble/input/forecast1/.gitignore +0 -0
  133. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/ensemble/input/forecast1/initial_state.csv +0 -0
  134. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/ensemble/input/forecast1/timeseries_import.csv +0 -0
  135. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/ensemble/input/forecast2/.gitignore +0 -0
  136. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/ensemble/input/forecast2/initial_state.csv +0 -0
  137. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/ensemble/input/forecast2/timeseries_import.csv +0 -0
  138. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/ensemble/input/lookup_tables/.gitignore +0 -0
  139. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/ensemble/input/lookup_tables/curvefit_options.ini +0 -0
  140. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/ensemble/input/lookup_tables/storage_V.csv +0 -0
  141. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/ensemble/model/Example.mo +0 -0
  142. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/ensemble/output/forecast1/.gitignore +0 -0
  143. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/ensemble/output/forecast2/.gitignore +0 -0
  144. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/ensemble/reference_output/forecast1/timeseries_export.csv +0 -0
  145. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/ensemble/reference_output/forecast2/timeseries_export.csv +0 -0
  146. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/ensemble/src/example.py +0 -0
  147. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/goal_programming/input/initial_state.csv +0 -0
  148. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/goal_programming/input/timeseries_import.csv +0 -0
  149. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/goal_programming/model/Example.mo +0 -0
  150. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/goal_programming/output/.gitignore +0 -0
  151. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/goal_programming/reference_output/timeseries_export.csv +0 -0
  152. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/goal_programming/src/example.py +0 -0
  153. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/integrator_delay/input/initial_state.csv +0 -0
  154. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/integrator_delay/input/timeseries_import.csv +0 -0
  155. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/integrator_delay/input/timeseries_import_simulation.csv +0 -0
  156. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/integrator_delay/model/Example.mo +0 -0
  157. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/integrator_delay/src/example.py +0 -0
  158. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/lookup_table/input/.gitignore +0 -0
  159. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/lookup_table/input/initial_state.csv +0 -0
  160. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/lookup_table/input/lookup_tables/.gitignore +0 -0
  161. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/lookup_table/input/lookup_tables/curvefit_options.ini +0 -0
  162. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/lookup_table/input/lookup_tables/storage_V.csv +0 -0
  163. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/lookup_table/input/timeseries_import.csv +0 -0
  164. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/lookup_table/model/Example.mo +0 -0
  165. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/lookup_table/output/.gitignore +0 -0
  166. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/lookup_table/reference_output/timeseries_export.csv +0 -0
  167. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/lookup_table/src/example.py +0 -0
  168. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/mixed_integer/input/initial_state.csv +0 -0
  169. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/mixed_integer/input/timeseries_import.csv +0 -0
  170. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/mixed_integer/model/Example.mo +0 -0
  171. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/mixed_integer/output/.gitignore +0 -0
  172. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/mixed_integer/reference_output/timeseries_export.csv +0 -0
  173. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/mixed_integer/src/example.py +0 -0
  174. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/pumped_hydropower_system/input/initial_state.csv +0 -0
  175. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/pumped_hydropower_system/input/timeseries_import.csv +0 -0
  176. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/pumped_hydropower_system/model/PumpedStoragePlant.mo +0 -0
  177. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/pumped_hydropower_system/output/.gitignore +0 -0
  178. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/pumped_hydropower_system/reference_output/timeseries_export.csv +0 -0
  179. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/pumped_hydropower_system/src/example.py +0 -0
  180. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/simulation/input/parameters.csv +0 -0
  181. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/simulation/input/timeseries_import.csv +0 -0
  182. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/simulation/model/Example.mo +0 -0
  183. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/simulation/output/.gitignore +0 -0
  184. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/simulation/reference_output/timeseries_export.csv +0 -0
  185. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/simulation/src/example.py +0 -0
  186. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/simulation_with_custom_equations/input/initial_state.csv +0 -0
  187. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/simulation_with_custom_equations/input/timeseries_import.csv +0 -0
  188. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/simulation_with_custom_equations/model/SimpleModel.mo +0 -0
  189. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/simulation_with_custom_equations/output/.gitignore +0 -0
  190. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/simulation_with_custom_equations/reference_output/timeseries_export.csv +0 -0
  191. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/simulation_with_custom_equations/src/simple_model.py +0 -0
  192. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/single_reservoir/input/initial_state.csv +0 -0
  193. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/single_reservoir/input/timeseries_import.csv +0 -0
  194. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/single_reservoir/model/single_reservoir.mo +0 -0
  195. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/single_reservoir/output/.gitignore +0 -0
  196. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/single_reservoir/reference_output/timeseries_export.csv +0 -0
  197. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/examples/single_reservoir/src/single_reservoir.py +0 -0
  198. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/sonar-project.properties +0 -0
  199. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/__init__.py +0 -0
  200. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/_internal/__init__.py +0 -0
  201. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/_internal/alias_tools.py +0 -0
  202. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/_internal/caching.py +0 -0
  203. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/_internal/debug_check_helpers.py +0 -0
  204. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/_internal/ensemble_bounds_decorator.py +0 -0
  205. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/data/__init__.py +0 -0
  206. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/data/csv.py +0 -0
  207. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/data/interpolation/__init__.py +0 -0
  208. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/data/interpolation/bspline.py +0 -0
  209. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/data/interpolation/bspline1d.py +0 -0
  210. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/data/interpolation/bspline2d.py +0 -0
  211. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/data/netcdf.py +0 -0
  212. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/data/pi.py +0 -0
  213. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/data/rtc.py +0 -0
  214. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/data/storage.py +0 -0
  215. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/optimization/__init__.py +0 -0
  216. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/optimization/control_tree_mixin.py +0 -0
  217. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/optimization/csv_lookup_table_mixin.py +0 -0
  218. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/optimization/csv_mixin.py +0 -0
  219. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/optimization/goal_programming_mixin.py +0 -0
  220. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/optimization/goal_programming_mixin_base.py +0 -0
  221. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/optimization/homotopy_mixin.py +0 -0
  222. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/optimization/initial_state_estimation_mixin.py +0 -0
  223. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/optimization/io_mixin.py +0 -0
  224. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/optimization/linearization_mixin.py +0 -0
  225. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/optimization/linearized_order_goal_programming_mixin.py +0 -0
  226. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/optimization/min_abs_goal_programming_mixin.py +0 -0
  227. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/optimization/modelica_mixin.py +0 -0
  228. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/optimization/netcdf_mixin.py +0 -0
  229. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/optimization/pi_mixin.py +0 -0
  230. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/optimization/planning_mixin.py +0 -0
  231. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/optimization/single_pass_goal_programming_mixin.py +0 -0
  232. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/optimization/timeseries.py +0 -0
  233. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/rtctoolsapp.py +0 -0
  234. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/simulation/__init__.py +0 -0
  235. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/simulation/csv_mixin.py +0 -0
  236. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/simulation/io_mixin.py +0 -0
  237. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/simulation/pi_mixin.py +0 -0
  238. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/simulation/simulation_problem.py +0 -0
  239. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/util.py +0 -0
  240. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/src/rtctools/version.py +0 -0
  241. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/__init__.py +0 -0
  242. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/__init__.py +0 -0
  243. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data/.gitignore +0 -0
  244. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data/curve.dat +0 -0
  245. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data/diag.xml +0 -0
  246. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data/initial_state_0.csv +0 -0
  247. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data/initial_state_1.csv +0 -0
  248. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data/look_up_table_0.csv +0 -0
  249. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data/look_up_table_1.csv +0 -0
  250. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data/look_up_table_2.csv +0 -0
  251. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data/pi_run.xml +0 -0
  252. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data/rtcDataConfig.xml +0 -0
  253. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data/rtcParameterConfig.xml +0 -0
  254. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data/surface.dat +0 -0
  255. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data/timeseries_export.xml +0 -0
  256. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data/timeseries_import.bin +0 -0
  257. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data/timeseries_import.xml +0 -0
  258. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data/timeseries_import_0.csv +0 -0
  259. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data/timeseries_import_1.csv +0 -0
  260. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data/timeseries_import_2.csv +0 -0
  261. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data/timeseries_import_ensemble.nc +0 -0
  262. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data/timeseries_import_ensemble.xml +0 -0
  263. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data/timeseries_import_ensemblesize1_noRealization.nc +0 -0
  264. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data/timeseries_import_ensemblesize1_withRealization.nc +0 -0
  265. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data/timeseries_import_neq.xml +0 -0
  266. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/data_path.py +0 -0
  267. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/test_csv.py +0 -0
  268. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/test_data.py +0 -0
  269. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/test_diag.py +0 -0
  270. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/test_interpolate.py +0 -0
  271. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/test_netcdf.py +0 -0
  272. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data/test_storage.py +0 -0
  273. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/data_path.py +0 -0
  274. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/examples/__init__.py +0 -0
  275. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/examples/test_examples.py +0 -0
  276. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/internal/__init__.py +0 -0
  277. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/internal/test_alias_tools.py +0 -0
  278. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/__init__.py +0 -0
  279. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/.gitignore +0 -0
  280. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/Model.mo +0 -0
  281. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/ModelAlgebraic.mo +0 -0
  282. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/ModelDebugChecks.mo +0 -0
  283. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/ModelDelay.mo +0 -0
  284. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/ModelMixedInteger.mo +0 -0
  285. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/ModelWithInitial.mo +0 -0
  286. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/ModelWithInitialLinear.mo +0 -0
  287. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/ModelWithLookupTable.mo +0 -0
  288. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/SingleShootingModel.mo +0 -0
  289. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/ensemble.csv +0 -0
  290. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/initial_state.csv +0 -0
  291. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/lookup_tables/.gitignore +0 -0
  292. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/lookup_tables/curvefit_options.ini +0 -0
  293. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/lookup_tables/x_prime.csv +0 -0
  294. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/member0/.gitignore +0 -0
  295. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/member0/initial_state.csv +0 -0
  296. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/member0/parameters.csv +0 -0
  297. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/member0/timeseries_import.csv +0 -0
  298. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/member1/.gitignore +0 -0
  299. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/member1/initial_state.csv +0 -0
  300. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/member1/parameters.csv +0 -0
  301. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/member1/timeseries_import.csv +0 -0
  302. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/.gitignore +0 -0
  303. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/Model.mo +0 -0
  304. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_ensemble_sizes/ensemble.csv +0 -0
  305. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_ensemble_sizes/member0/timeseries_import.csv +0 -0
  306. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_ensemble_sizes/member1/timeseries_import.csv +0 -0
  307. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_ensemble_sizes/member2/timeseries_import.csv +0 -0
  308. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_ensemble_sizes/member3/timeseries_import.csv +0 -0
  309. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_ensemble_sizes/rtcDataConfig.xml +0 -0
  310. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_ensemble_sizes/rtcParameterConfig.xml +0 -0
  311. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_ensemble_sizes/timeseries_import.nc +0 -0
  312. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_ensemble_sizes/timeseries_import.xml +0 -0
  313. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_initial_date/ensemble.csv +0 -0
  314. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_initial_date/member0/timeseries_import.csv +0 -0
  315. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_initial_date/member1/timeseries_import.csv +0 -0
  316. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_initial_date/rtcDataConfig.xml +0 -0
  317. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_initial_date/rtcParameterConfig.xml +0 -0
  318. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_initial_date/timeseries_import.nc +0 -0
  319. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_initial_date/timeseries_import.xml +0 -0
  320. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_timestep/ensemble.csv +0 -0
  321. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_timestep/member0/timeseries_import.csv +0 -0
  322. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_timestep/member1/timeseries_import.csv +0 -0
  323. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_timestep/rtcDataConfig.xml +0 -0
  324. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_timestep/rtcParameterConfig.xml +0 -0
  325. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_timestep/timeseries_import.nc +0 -0
  326. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_timestep/timeseries_import.xml +0 -0
  327. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_values/ensemble.csv +0 -0
  328. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_values/member0/parameters.csv +0 -0
  329. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_values/member0/timeseries_import.csv +0 -0
  330. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_values/member1/parameters.csv +0 -0
  331. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_values/member1/timeseries_import.csv +0 -0
  332. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_values/rtcDataConfig.xml +0 -0
  333. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_values/rtcParameterConfig.xml +0 -0
  334. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_values/timeseries_import.nc +0 -0
  335. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/multiple_io_mixins/different_values/timeseries_import.xml +0 -0
  336. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/one-member-ensemble/ensemble.csv +0 -0
  337. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/one-member-ensemble/member0/.gitignore +0 -0
  338. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/one-member-ensemble/member0/initial_state.csv +0 -0
  339. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/one-member-ensemble/member0/parameters.csv +0 -0
  340. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/one-member-ensemble/member0/timeseries_import.csv +0 -0
  341. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/parameters.csv +0 -0
  342. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/rtcDataConfig.xml +0 -0
  343. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/rtcParameterConfig.xml +0 -0
  344. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/rtcParameterConfig_extra.xml +0 -0
  345. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/timeseries_import.csv +0 -0
  346. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/timeseries_import.nc +0 -0
  347. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data/timeseries_import.xml +0 -0
  348. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/data_path.py +0 -0
  349. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_control_tree_mixin.py +0 -0
  350. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_csv_lookuptable_mixin.py +0 -0
  351. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_csv_mixin.py +0 -0
  352. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_debug_checks.py +0 -0
  353. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_goal_programming.py +0 -0
  354. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_integration.py +0 -0
  355. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_interpolation.py +0 -0
  356. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_io_mixin.py +0 -0
  357. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_linearized_order_goal_programming_mixin.py +0 -0
  358. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_min_abs_goal_programming.py +0 -0
  359. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_multiple_io_mixins.py +0 -0
  360. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_netcdf_mixin.py +0 -0
  361. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_optimization_problem.py +0 -0
  362. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_path_extra_variables.py +0 -0
  363. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_pi_mixin.py +0 -0
  364. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_planning_and_control_tree_mixin.py +0 -0
  365. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_planning_mixin.py +0 -0
  366. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_problem_class_check.py +0 -0
  367. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_single_pass_goal_programming.py +0 -0
  368. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_solvers.py +0 -0
  369. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_timeseries.py +0 -0
  370. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_vector_constraints_variables.py +0 -0
  371. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/optimization/test_vector_goals.py +0 -0
  372. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/__init__.py +0 -0
  373. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data/.gitignore +0 -0
  374. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data/Model.mo +0 -0
  375. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data/ModelCustomEquation.mo +0 -0
  376. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data/Model_base.mo +0 -0
  377. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data/Model_delay.mo +0 -0
  378. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data/Model_nominal.mo +0 -0
  379. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data/infeasible_initial_value/initial_state.csv +0 -0
  380. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data/infeasible_initial_value/model_infeasible.mo +0 -0
  381. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data/infeasible_initial_value/model_out_of_bounds.mo +0 -0
  382. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data/infeasible_initial_value/model_out_of_sym_bounds.mo +0 -0
  383. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data/infeasible_initial_value/model_with_bounds.mo +0 -0
  384. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data/infeasible_initial_value/model_with_input_series.mo +0 -0
  385. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data/infeasible_initial_value/model_with_sym_ystart.mo +0 -0
  386. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data/infeasible_initial_value/model_with_xstart.mo +0 -0
  387. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data/infeasible_initial_value/model_with_zero_xstart.mo +0 -0
  388. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data/infeasible_initial_value/timeseries_import.csv +0 -0
  389. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data/infeasible_initial_value/timeseries_import_with_x.csv +0 -0
  390. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data/initial_state.csv +0 -0
  391. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data/parameters.csv +0 -0
  392. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data/rtcDataConfig.xml +0 -0
  393. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data/rtcParameterConfig.xml +0 -0
  394. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data/timeseries_import.csv +0 -0
  395. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data/timeseries_import.xml +0 -0
  396. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/data_path.py +0 -0
  397. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/test_csv_mixin.py +0 -0
  398. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/test_io_mixin.py +0 -0
  399. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/test_pi_mixin.py +0 -0
  400. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/test_problem_class_check.py +0 -0
  401. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/simulation/test_simulation.py +0 -0
  402. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tests/test_case.py +0 -0
  403. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tox-teamcity.ini +0 -0
  404. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/tox.ini +0 -0
  405. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/uv.lock +0 -0
  406. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/xsd/rtcDataConfig.xsd +0 -0
  407. {rtc_tools-2.8.0a0 → rtc_tools-2.8.0a2}/xsd/rtcSharedTypes.xsd +0 -0
@@ -0,0 +1,52 @@
1
+ name: "Setup Python Environment"
2
+ description: "Sets up Python environment with uv package manager"
3
+
4
+ inputs:
5
+ uv-version:
6
+ description: "Version of uv to install"
7
+ required: false
8
+ default: "0.7.9"
9
+ dependency-groups:
10
+ description: "Space-separated list of dependency groups to install (e.g. 'deploy tests')"
11
+ required: false
12
+ default: ""
13
+ resolution-mode:
14
+ description: "Dependency resolution mode: 'frozen' (use uv.lock), 'lowest' (lowest-direct), 'highest' (upgrade to newest)."
15
+ required: false
16
+ default: "frozen"
17
+
18
+ runs:
19
+ using: "composite"
20
+ steps:
21
+ - name: Install uv
22
+ uses: astral-sh/setup-uv@v5
23
+ with:
24
+ version: ${{ inputs.uv-version }}
25
+ enable-cache: true
26
+ cache-dependency-glob: "uv.lock"
27
+
28
+ - name: Install dependencies
29
+ shell: bash
30
+ run: |
31
+ CMD_PARTS=("uv" "sync")
32
+
33
+ if [[ "${{ inputs.resolution-mode }}" == "lowest" ]]; then
34
+ CMD_PARTS+=("--resolution" "lowest-direct")
35
+ elif [[ "${{ inputs.resolution-mode }}" == "highest" ]]; then
36
+ CMD_PARTS+=("--upgrade")
37
+ else # Default to "frozen"
38
+ CMD_PARTS+=("--frozen")
39
+ fi
40
+
41
+ # Always exclude the default 'dev' group unless specific groups are requested that might include dev ones by intent.
42
+ # uv sync --no-dev is the default to exclude [tool.uv.dev-dependencies] or [dependency-groups.dev]
43
+ CMD_PARTS+=("--no-dev")
44
+
45
+ if [[ -n "${{ inputs.dependency-groups }}" ]]; then
46
+ for group in ${{ inputs.dependency-groups }}; do
47
+ CMD_PARTS+=("--group" "$group")
48
+ done
49
+ fi
50
+
51
+ echo "Executing: ${CMD_PARTS[*]}"
52
+ "${CMD_PARTS[@]}"
@@ -42,6 +42,7 @@ jobs:
42
42
  path: dist/
43
43
 
44
44
  test-linux:
45
+ name: Test Linux (Python ${{ matrix.version }}${{ matrix.label }})
45
46
  needs: build
46
47
  runs-on: ubuntu-latest
47
48
  container:
@@ -51,17 +52,25 @@ jobs:
51
52
  TOXENV: py
52
53
  strategy:
53
54
  matrix:
54
- version: # Also update sonar-project.properties when updating the python versions.
55
- - '3.9'
56
- - '3.10'
57
- - '3.11'
58
- - '3.12'
59
- - '3.13'
55
+ include:
56
+ - version: '3.9' # Also update sonar-project.properties when updating the python versions.
57
+ - version: '3.10'
58
+ - version: '3.11'
59
+ - version: '3.12'
60
+ - version: '3.13'
61
+ # Lowest and highest resolution modes to test oldest and newest dependencies.
62
+ - version: '3.9'
63
+ resolution_mode: 'lowest'
64
+ label: ' (Oldest Dependencies)'
65
+ - version: '3.13'
66
+ resolution_mode: 'highest'
67
+ label: ' (Newest Dependencies)'
60
68
  steps:
61
69
  - uses: actions/checkout@v4
62
70
  - uses: ./.github/actions/setup-python
63
71
  with:
64
72
  dependency-groups: "tests"
73
+ resolution-mode: ${{ matrix.resolution_mode }}
65
74
  - run: uv run tox -vv
66
75
 
67
76
  coverage:
@@ -1,10 +1,13 @@
1
+ Farid Alavi
1
2
  Jorn Baayen
2
3
  Joris Bentvelsen
3
4
  Olav van Duin
4
5
  Sjoerd Geevers
6
+ Joris Gillis
5
7
  Klaudia Horváth
6
8
  Ailbhe Mitchell
7
9
  Teresa Piovesan
10
+ Jesús A. Rodríguez
8
11
  Matthijs den Toom
9
12
  Jesse VanderWees
10
13
  Tjerk Vreeken
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rtc-tools
3
- Version: 2.8.0a0
3
+ Version: 2.8.0a2
4
4
  Summary: Toolbox for control and optimization of water systems.
5
5
  Project-URL: Homepage, https://oss.deltares.nl/web/rtc-tools/home
6
6
  Project-URL: Download, http://github.com/deltares/rtc-tools/
@@ -188,13 +188,13 @@ Classifier: Topic :: Scientific/Engineering :: GIS
188
188
  Classifier: Topic :: Scientific/Engineering :: Mathematics
189
189
  Classifier: Topic :: Scientific/Engineering :: Physics
190
190
  Requires-Python: >=3.9
191
- Requires-Dist: casadi!=3.6.6,<=3.7,>=3.6.3
191
+ Requires-Dist: casadi!=3.6.6,<3.8,>=3.6.3
192
192
  Requires-Dist: defusedxml>=0.7.0
193
193
  Requires-Dist: importlib-metadata>=5.0.0; python_version < '3.10'
194
- Requires-Dist: numpy>=1.16.0
194
+ Requires-Dist: numpy>=1.20.0
195
195
  Requires-Dist: pymoca==0.9.*,>=0.9.1
196
196
  Requires-Dist: rtc-tools-channel-flow>=1.2.0
197
- Requires-Dist: scipy>=1.0.0
197
+ Requires-Dist: scipy>=1.6.0
198
198
  Provides-Extra: all
199
199
  Requires-Dist: netcdf4; extra == 'all'
200
200
  Provides-Extra: netcdf
@@ -219,13 +219,11 @@ RTC-Tools offers the following functionalities:
219
219
 
220
220
  - **Model building using extensible libraries**: Build complex system models using extensible libraries of model components. Modelers can also implement their custom modeling components, for instance, using the [Modelica language](https://modelica.org/language/) or Python script.
221
221
 
222
- RTC-Tools can be used with the following libraries and packages for specific applications:
222
+ RTC-Tools can be used with the following libraries and packages for specific applications. Please note that this list is not exhaustive. Users can also create libraries for other types of applications.
223
223
  - [rtc-tools-channel-flow](https://gitlab.com/deltares/rtc-tools-channel-flow): water system models
224
224
  - [rtc-tools-hydraulic-structures](https://gitlab.com/deltares/rtc-tools-channel-flow): hydraulic assets, such as weirs and pumps
225
225
  - [rtc-tools-heat-network](https://github.com/Nieuwe-Warmte-Nu/rtc-tools-heat-network): heat networks
226
-
227
- Please note that this list is not exhaustive. Users can also create libraries for other types of applications.
228
-
226
+
229
227
  - **Running simulations**: Simulate a given model.
230
228
 
231
229
  - **Specifying and solving optimization problems**: Define optimization goals, constraints and decision variables to specify the optimization problem for a given model. RTC-Tools supports both open-source solvers (CBC, HiGHS, Ipopt) and commercial solvers (Gurobi, CPLEX) for solving several types of optimization problems:
@@ -16,13 +16,11 @@ RTC-Tools offers the following functionalities:
16
16
 
17
17
  - **Model building using extensible libraries**: Build complex system models using extensible libraries of model components. Modelers can also implement their custom modeling components, for instance, using the [Modelica language](https://modelica.org/language/) or Python script.
18
18
 
19
- RTC-Tools can be used with the following libraries and packages for specific applications:
19
+ RTC-Tools can be used with the following libraries and packages for specific applications. Please note that this list is not exhaustive. Users can also create libraries for other types of applications.
20
20
  - [rtc-tools-channel-flow](https://gitlab.com/deltares/rtc-tools-channel-flow): water system models
21
21
  - [rtc-tools-hydraulic-structures](https://gitlab.com/deltares/rtc-tools-channel-flow): hydraulic assets, such as weirs and pumps
22
22
  - [rtc-tools-heat-network](https://github.com/Nieuwe-Warmte-Nu/rtc-tools-heat-network): heat networks
23
-
24
- Please note that this list is not exhaustive. Users can also create libraries for other types of applications.
25
-
23
+
26
24
  - **Running simulations**: Simulate a given model.
27
25
 
28
26
  - **Specifying and solving optimization problems**: Define optimization goals, constraints and decision variables to specify the optimization problem for a given model. RTC-Tools supports both open-source solvers (CBC, HiGHS, Ipopt) and commercial solvers (Gurobi, CPLEX) for solving several types of optimization problems:
@@ -1,7 +1,7 @@
1
1
  Modelica models
2
2
  ===============
3
3
 
4
- To learn the basics of modelling with Modelica, please refer to the online book `Modelica by Example <http://book.xogeny.com/>`_.
4
+ To learn the basics of modelling with Modelica, please refer to the online book `Modelica by Example <https://mbe.modelica.university/>`_.
5
5
 
6
6
  .. autoclass:: rtctools.optimization.modelica_mixin.ModelicaMixin
7
7
  :members: compiler_options
@@ -31,9 +31,9 @@ classifiers = [
31
31
  "Operating System :: MacOS"
32
32
  ]
33
33
  dependencies = [
34
- "casadi >= 3.6.3, <= 3.7, !=3.6.6",
35
- "numpy >= 1.16.0",
36
- "scipy >= 1.0.0",
34
+ "casadi >= 3.6.3, < 3.8, !=3.6.6",
35
+ "numpy >= 1.20.0",
36
+ "scipy >= 1.6.0",
37
37
  "pymoca >= 0.9.1, == 0.9.*",
38
38
  "rtc-tools-channel-flow >= 1.2.0",
39
39
  "defusedxml >= 0.7.0",
@@ -1,9 +1,15 @@
1
1
  import logging
2
+ from typing import Union
2
3
 
3
4
  import casadi as ca
4
5
 
5
6
  logger = logging.getLogger("rtctools")
6
7
 
8
+ # Limit the number of times we try to substitute in external functions, e.g. in
9
+ # case of infinite recursion. Generally unlikely that we will hit this limit for
10
+ # any reasonable use case.
11
+ MAX_SUBSTITUTE_DEPTH = 10
12
+
7
13
 
8
14
  def is_affine(expr, symbols):
9
15
  try:
@@ -37,12 +43,24 @@ def reduce_matvec(e, v):
37
43
  return ca.reshape(ca.mtimes(A, v), e.shape)
38
44
 
39
45
 
40
- def substitute_in_external(expr, symbols, values):
41
- if len(symbols) == 0 or all(isinstance(x, ca.DM) for x in expr):
46
+ def substitute_in_external(
47
+ expr: list[ca.MX], symbols: list[ca.MX], values: list[Union[ca.MX, ca.DM, float]]
48
+ ):
49
+ # We expect expr to be a list of (at most) length 1
50
+ assert len(expr) <= 1
51
+
52
+ if not expr or len(symbols) == 0 or all(isinstance(x, ca.DM) for x in expr):
42
53
  return expr
54
+ elif not expr:
55
+ return []
43
56
  else:
44
- f = ca.Function("f", symbols, expr)
45
- return f.call(values, True, False)
57
+ for _ in range(MAX_SUBSTITUTE_DEPTH):
58
+ f = ca.Function("f", symbols, expr).expand()
59
+ expr = f.call(values, True, False)
60
+ if expr[0].is_constant():
61
+ break
62
+
63
+ return expr
46
64
 
47
65
 
48
66
  def interpolate(ts, xs, t, equidistant, mode=0):
@@ -45,11 +45,17 @@ class CollocatedIntegratedOptimizationProblem(OptimizationProblem, metaclass=ABC
45
45
 
46
46
  :cvar check_collocation_linearity:
47
47
  If ``True``, check whether collocation constraints are linear. Default is ``True``.
48
+ :cvar inline_delay_expressions:
49
+ If ``True``, delay expressions are inlined into constraints and objectives instead of
50
+ being added as separate equality constraints. Default is ``False``.
48
51
  """
49
52
 
50
53
  #: Check whether the collocation constraints are linear
51
54
  check_collocation_linearity = True
52
55
 
56
+ #: Inline delay expressions instead of adding them as separate equality constraints
57
+ inline_delay_expressions = False
58
+
53
59
  #: Whether or not the collocation constraints are linear (affine)
54
60
  linear_collocation = None
55
61
 
@@ -386,7 +392,9 @@ class CollocatedIntegratedOptimizationProblem(OptimizationProblem, metaclass=ABC
386
392
  ):
387
393
  parameter_values = nullvertcat(*parameter_values)
388
394
  [parameter_values] = substitute_in_external(
389
- [parameter_values], self.dae_variables["parameters"], parameter_values
395
+ [parameter_values],
396
+ self.dae_variables["parameters"],
397
+ ca.vertsplit(parameter_values),
390
398
  )
391
399
  else:
392
400
  parameter_values = nullvertcat(*parameter_values)
@@ -1789,6 +1797,12 @@ class CollocatedIntegratedOptimizationProblem(OptimizationProblem, metaclass=ABC
1789
1797
  + [constant_inputs[v.name()] for v in self.dae_variables["constant_inputs"]]
1790
1798
  )
1791
1799
 
1800
+ # If inlining delay expressions, prepare for the single call to ca.substitute()
1801
+ # at the end
1802
+ if self.inline_delay_expressions:
1803
+ delayed_feedback_variable_replacement = ca.MX.zeros(X.numel())
1804
+ delayed_feedback_variable_replacement[:] = X
1805
+
1792
1806
  for i in range(len(delayed_feedback_expressions)):
1793
1807
  in_variable_name = delayed_feedback_states[i]
1794
1808
  expression = delayed_feedback_expressions[i]
@@ -1855,10 +1869,38 @@ class CollocatedIntegratedOptimizationProblem(OptimizationProblem, metaclass=ABC
1855
1869
 
1856
1870
  nominal = nominal_delayed_feedback[i]
1857
1871
 
1858
- g.append((x_in - x_out_delayed) / nominal)
1859
- zeros = np.zeros(n_collocation_times)
1860
- lbg.extend(zeros)
1861
- ubg.extend(zeros)
1872
+ if self.inline_delay_expressions:
1873
+ # Get the indices for the delayed feedback variable in the optimization
1874
+ # vector
1875
+ indices = self.__indices[ensemble_member][in_canonical]
1876
+
1877
+ # Insert replacement values into appropriate slot
1878
+ delayed_feedback_variable_replacement[indices] = (
1879
+ x_out_delayed / in_nominal / in_sign
1880
+ )
1881
+
1882
+ # Equate delayed feedback variable to zero so that the numerical solver can
1883
+ # remove it from the problem.
1884
+ #
1885
+ # Note: The alternative approach would be to shrink self.solver_input=X,
1886
+ # self.__indices, and any other variables that directly or indirectly
1887
+ # depend on the size and order of 'X'. This would be a complex operation,
1888
+ # which would however be redundant for solvers that (like Ipopt) already
1889
+ # automatically detect and remove variables where lbx==ubx.
1890
+ lbx[indices] = 0.0
1891
+ ubx[indices] = 0.0
1892
+ else:
1893
+ # Default behavior: add delay expressions as equality constraints
1894
+ g.append((x_in - x_out_delayed) / nominal)
1895
+ zeros = np.zeros(n_collocation_times)
1896
+ lbg.extend(zeros)
1897
+ ubg.extend(zeros)
1898
+
1899
+ # If inlining delay expressions, carry out the single call to ca.substitute()
1900
+ # A single call is more efficient as it constructs a single ca.Function internally,
1901
+ # rather than one for each element of the list.
1902
+ if self.inline_delay_expressions:
1903
+ g = [ca.substitute(ca.vertcat(*g), X, delayed_feedback_variable_replacement)]
1862
1904
 
1863
1905
  # Objective
1864
1906
  f_member = self.objective(ensemble_member)
@@ -203,12 +203,12 @@ class OptimizationProblem(DataStoreAccessor, metaclass=ABCMeta):
203
203
  log_level = logging.INFO
204
204
  logger.log(
205
205
  log_level,
206
- "Solver succeeded with status {} ({}).".format(return_status, wall_clock_time),
206
+ "Solver failed with status {} ({}).".format(return_status, wall_clock_time),
207
207
  )
208
208
  except (AttributeError, ValueError):
209
209
  logger.log(
210
210
  log_level,
211
- "Solver succeeded with status {} ({}).".format(return_status, wall_clock_time),
211
+ "Solver failed with status {} ({}).".format(return_status, wall_clock_time),
212
212
  )
213
213
 
214
214
  # Do any postprocessing
@@ -7,8 +7,11 @@ model ModelSymbolicParameters
7
7
 
8
8
  parameter Real k = 1.0;
9
9
 
10
+ parameter Real a = -1.0;
11
+ parameter Real b = 2.0;
12
+ parameter Real u_min = a * b;
10
13
  parameter Real u_max;
11
- input Real u(fixed=false, min = -2, max = u_max);
14
+ input Real u(fixed=false, min = u_min, max = u_max);
12
15
  equation
13
16
  der(x) = k * x + u;
14
17
  der(w) = x;
@@ -17,13 +17,14 @@ logger.setLevel(logging.DEBUG)
17
17
 
18
18
 
19
19
  class Model(ModelicaMixin, CollocatedIntegratedOptimizationProblem):
20
- def __init__(self):
20
+ def __init__(self, inline_delay_expressions=False):
21
21
  super().__init__(
22
22
  input_folder=data_path(),
23
23
  output_folder=data_path(),
24
24
  model_name="ModelDelay",
25
25
  model_folder=data_path(),
26
26
  )
27
+ self.inline_delay_expressions = inline_delay_expressions
27
28
 
28
29
  def times(self, variable=None):
29
30
  # Collocation points
@@ -63,7 +64,8 @@ class ModelCompleteHistory(Model):
63
64
 
64
65
  class TestDelayHistoryWarnings(TestCase, unittest.TestCase):
65
66
  def test_no_history(self):
66
- problem = ModelNoHistory()
67
+ # Test default mode
68
+ problem = ModelNoHistory(inline_delay_expressions=False)
67
69
  with self.assertLogs(logger, level="WARN") as cm:
68
70
  problem.optimize()
69
71
  self.assertEqual(
@@ -75,6 +77,31 @@ class TestDelayHistoryWarnings(TestCase, unittest.TestCase):
75
77
  "Extrapolating t0 value backwards in time.",
76
78
  ],
77
79
  )
80
+ results = problem.extract_results()
81
+
82
+ # Test inline mode
83
+ problem_inline = ModelNoHistory(inline_delay_expressions=True)
84
+ with self.assertLogs(logger, level="WARN") as cm:
85
+ problem_inline.optimize()
86
+ self.assertEqual(
87
+ cm.output,
88
+ [
89
+ "WARNING:rtctools:Incomplete history for delayed expression x. "
90
+ "Extrapolating t0 value backwards in time.",
91
+ "WARNING:rtctools:Incomplete history for delayed expression w. "
92
+ "Extrapolating t0 value backwards in time.",
93
+ ],
94
+ )
95
+ results_inline = problem_inline.extract_results()
96
+
97
+ # Check that the results align
98
+ self.assertAlmostEqual(results["x"], results_inline["x"], 1e-6)
99
+ self.assertAlmostEqual(results["w"], results_inline["w"], 1e-6)
100
+
101
+ # Check that the inline results has fewer constraints
102
+ self.assertLess(
103
+ len(problem_inline.transcribed_problem["lbg"]), len(problem.transcribed_problem["lbg"])
104
+ )
78
105
 
79
106
  def test_partial_history(self):
80
107
  problem = ModelPartialHistory()
@@ -266,7 +266,10 @@ class ModelHistory(Model):
266
266
 
267
267
 
268
268
  class ModelSymbolicParameters(ModelicaMixin, CollocatedIntegratedOptimizationProblem):
269
- def __init__(self):
269
+ def __init__(self, resolve_parameters=True, override_u_min=True):
270
+ self.__resolve_parameters = resolve_parameters
271
+ self.__override_u_min = override_u_min
272
+
270
273
  super().__init__(
271
274
  input_folder=data_path(),
272
275
  output_folder=data_path(),
@@ -283,6 +286,10 @@ class ModelSymbolicParameters(ModelicaMixin, CollocatedIntegratedOptimizationPro
283
286
  parameters["u_max"] = 2.0
284
287
  parameters["x_initial"] = 1.1
285
288
  parameters["w_seed"] = 0.2
289
+ parameters["a"] = -2.0
290
+
291
+ if self.__override_u_min:
292
+ parameters["u_min"] = -1.5
286
293
  return parameters
287
294
 
288
295
  def objective(self, ensemble_member):
@@ -294,6 +301,11 @@ class ModelSymbolicParameters(ModelicaMixin, CollocatedIntegratedOptimizationPro
294
301
  compiler_options = super().compiler_options()
295
302
  compiler_options["cache"] = False
296
303
  compiler_options["library_folders"] = []
304
+
305
+ if not self.__resolve_parameters:
306
+ compiler_options["replace_parameter_expressions"] = False
307
+ compiler_options["resolve_parameter_values"] = False
308
+
297
309
  return compiler_options
298
310
 
299
311
 
@@ -621,6 +633,45 @@ class TestModelicaMixinSymbolicParameters(TestCase, unittest.TestCase):
621
633
  self.assertAlmostEqual(self.problem.extract_results()["x"][0], 1.1, self.tolerance)
622
634
 
623
635
 
636
+ class TestModelicaMixinSymbolicParametersResolve(TestCase, unittest.TestCase):
637
+ def test_parameters_resolve_or_not(self):
638
+ """
639
+ We set a 'default' value of u_min = a * b in the Pymoca model. If we
640
+ tell pymoca to replace parameter expressions (default behavior), we can
641
+ no longer override 'u_min' via the parameters() method. If we tell
642
+ Pymoca to _not_ inline, we expect to be able to override 'u_min', but
643
+ for it to also still have the default value of a * b.
644
+ """
645
+ problem = ModelSymbolicParameters()
646
+ problem.optimize()
647
+ parameters = problem.parameters(0)
648
+ bounds = problem.bounds()
649
+
650
+ # Check that overriding "u_min" has no effect if parameters are resolved
651
+ self.assertNotEqual(bounds["u"][0], parameters["u_min"])
652
+
653
+ # Check that overriding "u_min" has effect if parameters are not resolved
654
+ problem_no_resolved = ModelSymbolicParameters(resolve_parameters=False)
655
+ problem_no_resolved.optimize()
656
+ parameters_no_resolved = problem_no_resolved.parameters(0)
657
+ bounds_no_resolved = problem_no_resolved.bounds()
658
+
659
+ self.assertEqual(bounds_no_resolved["u"][0], parameters_no_resolved["u_min"])
660
+
661
+ # Check that if we do not override "u_min", it takes the default value a
662
+ # * b, and that overriding the value of 'a' works.
663
+ problem_no_override = ModelSymbolicParameters(
664
+ resolve_parameters=False, override_u_min=False
665
+ )
666
+ problem_no_override.optimize()
667
+ parameters_no_override = problem_no_override.parameters(0)
668
+ bounds_no_override = problem_no_override.bounds()
669
+
670
+ self.assertEqual(
671
+ bounds_no_override["u"][0], parameters_no_override["a"] * parameters_no_override["b"]
672
+ )
673
+
674
+
624
675
  class ModelAliasBounds(Model):
625
676
  def bounds(self):
626
677
  bounds = super().bounds()
@@ -1,33 +0,0 @@
1
- name: "Setup Python Environment"
2
- description: "Sets up Python environment with uv package manager"
3
-
4
- inputs:
5
- uv-version:
6
- description: "Version of uv to install"
7
- required: false
8
- default: "0.7.9"
9
- dependency-groups:
10
- description: "Space-separated list of dependency groups to install (e.g. 'deploy tests')"
11
- required: false
12
- default: ""
13
-
14
- runs:
15
- using: "composite"
16
- steps:
17
- - name: Install uv
18
- uses: astral-sh/setup-uv@v5
19
- with:
20
- version: ${{ inputs.uv-version }}
21
- enable-cache: true
22
- cache-dependency-glob: "uv.lock"
23
-
24
- - name: Install dependencies
25
- shell: bash
26
- run: |
27
- CMD="uv sync --frozen --no-dev"
28
- if [[ -n "${{ inputs.dependency-groups }}" ]]; then
29
- for group in ${{ inputs.dependency-groups }}; do
30
- CMD="$CMD --group $group"
31
- done
32
- fi
33
- $CMD
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes