pathsim 0.23.2__tar.gz → 0.25.0__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.
Files changed (490) hide show
  1. pathsim-0.25.0/.github/pull_request_template.md +22 -0
  2. pathsim-0.25.0/CONTRIBUTING.md +64 -0
  3. {pathsim-0.23.2 → pathsim-0.25.0}/PKG-INFO +2 -1
  4. {pathsim-0.23.2 → pathsim-0.25.0}/README.md +1 -0
  5. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/_version.py +3 -3
  6. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/_block.py +127 -6
  7. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/comparator.py +3 -0
  8. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/converters.py +8 -0
  9. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/counter.py +3 -0
  10. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/delay.py +4 -0
  11. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/discrete.py +28 -0
  12. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/dynsys.py +2 -1
  13. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/integrator.py +40 -0
  14. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/logic.py +4 -0
  15. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/lti.py +15 -3
  16. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/math.py +7 -3
  17. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/ode.py +38 -4
  18. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/relay.py +16 -0
  19. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/rng.py +3 -0
  20. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/scope.py +30 -35
  21. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/switch.py +3 -0
  22. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/events/schedule.py +80 -12
  23. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/exceptions.py +35 -0
  24. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/optim/anderson.py +113 -10
  25. pathsim-0.25.0/src/pathsim/optim/linearization.py +310 -0
  26. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/simulation.py +82 -1
  27. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/subsystem.py +174 -3
  28. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/fmuwrapper.py +4 -2
  29. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/register.py +7 -1
  30. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim.egg-info/PKG-INFO +2 -1
  31. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim.egg-info/SOURCES.txt +4 -0
  32. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim.egg-info/scm_file_list.json +433 -429
  33. pathsim-0.25.0/src/pathsim.egg-info/scm_version.json +8 -0
  34. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_dynsys.py +9 -0
  35. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_function.py +40 -3
  36. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_math.py +13 -0
  37. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_relay.py +14 -0
  38. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_scope.py +62 -2
  39. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_table.py +9 -8
  40. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_wrapper.py +3 -1
  41. pathsim-0.25.0/tests/pathsim/events/test_schedule.py +338 -0
  42. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/optim/test_anderson.py +75 -1
  43. pathsim-0.25.0/tests/pathsim/optim/test_linearization.py +545 -0
  44. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/test_simulation.py +94 -0
  45. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/test_subsystem.py +29 -0
  46. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/utils/test_fmuwrapper.py +14 -6
  47. pathsim-0.23.2/src/pathsim.egg-info/scm_version.json +0 -8
  48. pathsim-0.23.2/tests/pathsim/events/test_schedule.py +0 -174
  49. {pathsim-0.23.2 → pathsim-0.25.0}/.codecov.yml +0 -0
  50. {pathsim-0.23.2 → pathsim-0.25.0}/.github/FUNDING.yml +0 -0
  51. {pathsim-0.23.2 → pathsim-0.25.0}/.github/workflows/pypi_deployment.yml +0 -0
  52. {pathsim-0.23.2 → pathsim-0.25.0}/.github/workflows/tests_codecov.yml +0 -0
  53. {pathsim-0.23.2 → pathsim-0.25.0}/.github/workflows/urlchecker.yml +0 -0
  54. {pathsim-0.23.2 → pathsim-0.25.0}/.gitignore +0 -0
  55. {pathsim-0.23.2 → pathsim-0.25.0}/CITATION.cff +0 -0
  56. {pathsim-0.23.2 → pathsim-0.25.0}/LICENSE.txt +0 -0
  57. {pathsim-0.23.2 → pathsim-0.25.0}/conftest.py +0 -0
  58. {pathsim-0.23.2 → pathsim-0.25.0}/docs/.readthedocs.yaml +0 -0
  59. {pathsim-0.23.2 → pathsim-0.25.0}/docs/Makefile +0 -0
  60. {pathsim-0.23.2 → pathsim-0.25.0}/docs/requirements.txt +0 -0
  61. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/_ext/github_issues.py +0 -0
  62. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/_static/custom.css +0 -0
  63. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/_static/redirect.js +0 -0
  64. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/api.rst +0 -0
  65. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/conf.py +0 -0
  66. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/contributing.rst +0 -0
  67. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/abs_braking.ipynb +0 -0
  68. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/algebraic_loop.ipynb +0 -0
  69. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/billards.ipynb +0 -0
  70. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/bouncing_ball.ipynb +0 -0
  71. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/bouncing_pendulum.ipynb +0 -0
  72. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/cascade_controller.ipynb +0 -0
  73. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/checkpoints.ipynb +0 -0
  74. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/chemical_reactor.ipynb +0 -0
  75. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/coupled_oscillators.ipynb +0 -0
  76. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/data/BouncingBall_ME.fmu +0 -0
  77. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/data/CoupledClutches_CS_linux64.fmu +0 -0
  78. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/data/CoupledClutches_CS_win64.fmu +0 -0
  79. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/data/Dahlquist.fmu +0 -0
  80. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/data/VanDerPol_ME.fmu +0 -0
  81. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/dcmotor_control.ipynb +0 -0
  82. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/delta_sigma_adc.ipynb +0 -0
  83. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/diode_circuit.ipynb +0 -0
  84. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/elastic_pendulum.ipynb +0 -0
  85. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/algebraicloop_blockdiagram_g.png +0 -0
  86. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/billard_circle_g.png +0 -0
  87. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/bouncing_ball_blockdiagram_g.png +0 -0
  88. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/bouncing_ball_both_g.png +0 -0
  89. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/bouncing_ball_g.png +0 -0
  90. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/bouncing_ball_result_events_g.png +0 -0
  91. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/bouncing_ball_result_g.png +0 -0
  92. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/bouncing_ball_result_timesteps_g.png +0 -0
  93. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/bouncing_pendulum_blockdiagram_g.png +0 -0
  94. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/cascade_blockdiagram_g.png +0 -0
  95. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/coupled_oscillators_blockdiagram_g.png +0 -0
  96. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/coupled_oscillators_g.png +0 -0
  97. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/delta_sigma_blockdiagram_g.png +0 -0
  98. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/diode_blockdiagram_g.png +0 -0
  99. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/elastic_pendulum_g.png +0 -0
  100. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/fmcw_blockdiagram_g.png +0 -0
  101. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/fmcw_g.png +0 -0
  102. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/harmonic_oscillator_g.png +0 -0
  103. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/harmonic_oscillator_result_g.png +0 -0
  104. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/kalman_filter_blockdiagram_g.png +0 -0
  105. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/linear_feedback_blockdiagram_g.png +0 -0
  106. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/linear_feedback_result_g.png +0 -0
  107. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/linear_feedback_result_sensitivity_g.png +0 -0
  108. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/miller_frequency_divider_blockdiagram_g.png +0 -0
  109. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/nonlinear_noisy_amplifier_blockdiagram_g.png +0 -0
  110. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/ode_blockdiagram_g.png +0 -0
  111. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/pendulum_blockdiagram_g.png +0 -0
  112. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/pid_blockdiagram_g.png +0 -0
  113. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/sar_adc_blockdiagram_g.png +0 -0
  114. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/stick_slip_blockdiagram_g.png +0 -0
  115. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/stick_slip_blockdiagram_slip_g.png +0 -0
  116. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/stick_slip_blockdiagram_stick_g.png +0 -0
  117. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/stick_slip_g.png +0 -0
  118. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/thermostat_blockdiagram_g.png +0 -0
  119. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/vanderpol_blockdiagram_g.png +0 -0
  120. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/vanderpol_result_g.png +0 -0
  121. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/vanderpol_subsystem_blockdiagram_g.png +0 -0
  122. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/vanderpol_subsystem_lvl1_g.png +0 -0
  123. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/vanderpol_subsystem_lvl2_g.png +0 -0
  124. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/vanderpol_subsystem_lvl3_g.png +0 -0
  125. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/volterralotka_blockdiagram_g.png +0 -0
  126. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/ode_blockdiagram_2.png +0 -0
  127. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/stick_slip_blockdiagram_slip.png +0 -0
  128. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/stick_slip_blockdiagram_stick.png +0 -0
  129. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/fmcw_radar.ipynb +0 -0
  130. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/fmu_cosimulation.ipynb +0 -0
  131. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/fmu_model_exchange_bouncing_ball.ipynb +0 -0
  132. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/fmu_model_exchange_vanderpol.ipynb +0 -0
  133. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/harmonic_oscillator.ipynb +0 -0
  134. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/kalman_filter.ipynb +0 -0
  135. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/linear_feedback.ipynb +0 -0
  136. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/lorenz_attractor.ipynb +0 -0
  137. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/nested_subsystems.ipynb +0 -0
  138. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/noisy_amplifier.ipynb +0 -0
  139. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/pendulum.ipynb +0 -0
  140. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/pid_controller.ipynb +0 -0
  141. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/poincare_maps.ipynb +0 -0
  142. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/rf_network_oneport.ipynb +0 -0
  143. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/sar_adc.ipynb +0 -0
  144. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/spectrum_analysis.ipynb +0 -0
  145. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/stick_slip.ipynb +0 -0
  146. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/switched_bouncing_ball.ipynb +0 -0
  147. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/thermostat.ipynb +0 -0
  148. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/transfer_function.ipynb +0 -0
  149. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/vanderpol.ipynb +0 -0
  150. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples.rst +0 -0
  151. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/figures/pathsim_object_hierarchy_g.png +0 -0
  152. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/figures/pathsim_solver_hierarchy_g.png +0 -0
  153. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/figures/sin_cos_blockdiagram_g.png +0 -0
  154. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/figures/system_g.png +0 -0
  155. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/index.rst +0 -0
  156. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/logos/pathsim_icon.png +0 -0
  157. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/logos/pathsim_logo.png +0 -0
  158. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/logos/pathsim_simplistic_logo.png +0 -0
  159. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks._block.rst +0 -0
  160. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.adder.rst +0 -0
  161. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.amplifier.rst +0 -0
  162. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.comparator.rst +0 -0
  163. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.converters.rst +0 -0
  164. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.counter.rst +0 -0
  165. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.ctrl.rst +0 -0
  166. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.delay.rst +0 -0
  167. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.differentiator.rst +0 -0
  168. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.discrete.rst +0 -0
  169. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.dynsys.rst +0 -0
  170. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.filters.rst +0 -0
  171. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.fmu.rst +0 -0
  172. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.function.rst +0 -0
  173. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.integrator.rst +0 -0
  174. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.kalman.rst +0 -0
  175. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.lti.rst +0 -0
  176. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.math.rst +0 -0
  177. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.multiplier.rst +0 -0
  178. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.noise.rst +0 -0
  179. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.ode.rst +0 -0
  180. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.relay.rst +0 -0
  181. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.rf.rst +0 -0
  182. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.rng.rst +0 -0
  183. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.rst +0 -0
  184. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.scope.rst +0 -0
  185. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.sources.rst +0 -0
  186. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.spectrum.rst +0 -0
  187. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.switch.rst +0 -0
  188. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.table.rst +0 -0
  189. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.wrapper.rst +0 -0
  190. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.connection.rst +0 -0
  191. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.events._event.rst +0 -0
  192. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.events.condition.rst +0 -0
  193. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.events.rst +0 -0
  194. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.events.schedule.rst +0 -0
  195. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.events.zerocrossing.rst +0 -0
  196. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.optim.anderson.rst +0 -0
  197. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.optim.booster.rst +0 -0
  198. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.optim.numerical.rst +0 -0
  199. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.optim.operator.rst +0 -0
  200. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.optim.rst +0 -0
  201. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.simulation.rst +0 -0
  202. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers._rungekutta.rst +0 -0
  203. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers._solver.rst +0 -0
  204. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.bdf.rst +0 -0
  205. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.dirk2.rst +0 -0
  206. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.dirk3.rst +0 -0
  207. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.esdirk32.rst +0 -0
  208. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.esdirk4.rst +0 -0
  209. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.esdirk43.rst +0 -0
  210. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.esdirk54.rst +0 -0
  211. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.esdirk85.rst +0 -0
  212. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.euler.rst +0 -0
  213. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.gear.rst +0 -0
  214. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.rk4.rst +0 -0
  215. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.rkbs32.rst +0 -0
  216. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.rkck54.rst +0 -0
  217. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.rkdp54.rst +0 -0
  218. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.rkdp87.rst +0 -0
  219. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.rkf21.rst +0 -0
  220. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.rkf45.rst +0 -0
  221. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.rkf78.rst +0 -0
  222. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.rkv65.rst +0 -0
  223. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.rst +0 -0
  224. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.ssprk22.rst +0 -0
  225. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.ssprk33.rst +0 -0
  226. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.ssprk34.rst +0 -0
  227. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.steadystate.rst +0 -0
  228. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.subsystem.rst +0 -0
  229. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.utils.adaptivebuffer.rst +0 -0
  230. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.utils.analysis.rst +0 -0
  231. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.utils.gilbert.rst +0 -0
  232. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.utils.logger.rst +0 -0
  233. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.utils.portreference.rst +0 -0
  234. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.utils.progresstracker.rst +0 -0
  235. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.utils.realtimeplotter.rst +0 -0
  236. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.utils.register.rst +0 -0
  237. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.utils.rst +0 -0
  238. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/pathsim_docs.mplstyle +0 -0
  239. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/quickstart.ipynb +0 -0
  240. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/roadmap.rst +0 -0
  241. {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/roadmap_generated.rst +0 -0
  242. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_abs_braking.py +0 -0
  243. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_adc.py +0 -0
  244. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_algebraicchain.py +0 -0
  245. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_algebraicloop.py +0 -0
  246. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_cascade.py +0 -0
  247. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_dcmotor.py +0 -0
  248. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_deltasigma.py +0 -0
  249. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_derivative.py +0 -0
  250. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_diode.py +0 -0
  251. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_dualslope.py +0 -0
  252. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_elastic_pendulum.py +0 -0
  253. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_feedback.py +0 -0
  254. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_filters.py +0 -0
  255. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_harmonic_oscillator.py +0 -0
  256. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_kalman_filter.py +0 -0
  257. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_nested_subsystems.py +0 -0
  258. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_noise.py +0 -0
  259. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_pendulum.py +0 -0
  260. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_phasenoise.py +0 -0
  261. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_pid.py +0 -0
  262. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_pid_antiwindup.py +0 -0
  263. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_pid_vs_discretePID.py +0 -0
  264. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_radar.py +0 -0
  265. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_reactor.py +0 -0
  266. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_sar.py +0 -0
  267. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_solar.py +0 -0
  268. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_solver_hotswap.py +0 -0
  269. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_spectrum.py +0 -0
  270. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_spectrum_rf_oneport.py +0 -0
  271. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_steadystate.py +0 -0
  272. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_stickslip.py +0 -0
  273. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_transferfunction.py +0 -0
  274. {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_vanderpol_subsystem.py +0 -0
  275. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_event/example_billards_sphere.py +0 -0
  276. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_event/example_bouncing_pendulum.py +0 -0
  277. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_event/example_bouncingball.py +0 -0
  278. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_event/example_bouncingball_friction.py +0 -0
  279. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_event/example_bouncingball_switched.py +0 -0
  280. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_event/example_integrator_reset.py +0 -0
  281. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_event/example_pulse.py +0 -0
  282. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_event/example_stickslip_event.py +0 -0
  283. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_event/example_thermostat.py +0 -0
  284. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_event/example_volterralotka_event.py +0 -0
  285. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_bonhoeffer_vanderpol.py +0 -0
  286. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_brusselator.py +0 -0
  287. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_chemical.py +0 -0
  288. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_duffing.py +0 -0
  289. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_fairen_velarde.py +0 -0
  290. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_fitzhughnagumo.py +0 -0
  291. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_flame.py +0 -0
  292. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_glycolysis.py +0 -0
  293. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_lorenz.py +0 -0
  294. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_morse.py +0 -0
  295. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_robertson.py +0 -0
  296. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_roessler.py +0 -0
  297. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_thomas_cyclic.py +0 -0
  298. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_vanderpol.py +0 -0
  299. {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_volterralotka.py +0 -0
  300. {pathsim-0.23.2 → pathsim-0.25.0}/git +0 -0
  301. {pathsim-0.23.2 → pathsim-0.25.0}/pyproject.toml +0 -0
  302. {pathsim-0.23.2 → pathsim-0.25.0}/setup.cfg +0 -0
  303. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/__init__.py +0 -0
  304. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/_constants.py +0 -0
  305. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/README.md +0 -0
  306. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/__init__.py +0 -0
  307. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/adder.py +0 -0
  308. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/amplifier.py +0 -0
  309. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/bvp.py +0 -0
  310. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/constraint.py +0 -0
  311. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/ctrl.py +0 -0
  312. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/dae.py +0 -0
  313. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/differentiator.py +0 -0
  314. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/divider.py +0 -0
  315. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/filters.py +0 -0
  316. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/fmu.py +0 -0
  317. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/function.py +0 -0
  318. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/kalman.py +0 -0
  319. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/multiplier.py +0 -0
  320. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/noise.py +0 -0
  321. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/rf.py +0 -0
  322. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/sources.py +0 -0
  323. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/spectrum.py +0 -0
  324. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/table.py +0 -0
  325. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/wrapper.py +0 -0
  326. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/connection.py +0 -0
  327. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/events/__init__.py +0 -0
  328. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/events/_event.py +0 -0
  329. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/events/condition.py +0 -0
  330. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/events/zerocrossing.py +0 -0
  331. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/optim/__init__.py +0 -0
  332. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/optim/booster.py +0 -0
  333. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/optim/newton.py +0 -0
  334. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/optim/numerical.py +0 -0
  335. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/optim/operator.py +0 -0
  336. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/README.md +0 -0
  337. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/__init__.py +0 -0
  338. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/_rungekutta.py +0 -0
  339. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/_solver.py +0 -0
  340. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/bdf.py +0 -0
  341. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/dirk2.py +0 -0
  342. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/dirk3.py +0 -0
  343. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/esdirk32.py +0 -0
  344. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/esdirk4.py +0 -0
  345. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/esdirk43.py +0 -0
  346. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/esdirk54.py +0 -0
  347. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/esdirk85.py +0 -0
  348. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/euler.py +0 -0
  349. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/gear.py +0 -0
  350. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/rk4.py +0 -0
  351. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/rkbs32.py +0 -0
  352. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/rkck54.py +0 -0
  353. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/rkdp54.py +0 -0
  354. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/rkdp87.py +0 -0
  355. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/rkf21.py +0 -0
  356. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/rkf45.py +0 -0
  357. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/rkf78.py +0 -0
  358. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/rkv65.py +0 -0
  359. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/ssprk22.py +0 -0
  360. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/ssprk33.py +0 -0
  361. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/ssprk34.py +0 -0
  362. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/steadystate.py +0 -0
  363. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/__init__.py +0 -0
  364. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/adaptivebuffer.py +0 -0
  365. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/analysis.py +0 -0
  366. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/deprecation.py +0 -0
  367. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/diagnostics.py +0 -0
  368. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/gilbert.py +0 -0
  369. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/graph.py +0 -0
  370. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/logger.py +0 -0
  371. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/mutable.py +0 -0
  372. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/portreference.py +0 -0
  373. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/progresstracker.py +0 -0
  374. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/realtimeplotter.py +0 -0
  375. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim.egg-info/dependency_links.txt +0 -0
  376. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim.egg-info/requires.txt +0 -0
  377. {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim.egg-info/top_level.txt +0 -0
  378. {pathsim-0.23.2 → pathsim-0.25.0}/tests/README.md +0 -0
  379. {pathsim-0.23.2 → pathsim-0.25.0}/tests/__init__.py +0 -0
  380. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/CoupledClutches_CS.fmu +0 -0
  381. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/__init__.py +0 -0
  382. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/conftest.py +0 -0
  383. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_algebraic_system.py +0 -0
  384. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_bouncingball_friction_event_system.py +0 -0
  385. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_bouncingball_system.py +0 -0
  386. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_brusselator_system.py +0 -0
  387. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_cosim_fmu_system.py +0 -0
  388. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_counter_comparator_system.py +0 -0
  389. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_dynamical_system_ivp.py +0 -0
  390. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_fitzhughnagumo_system.py +0 -0
  391. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_harmonic_oscillator_system.py +0 -0
  392. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_linear_feedback_system.py +0 -0
  393. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_logic_system.py +0 -0
  394. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_lorenz_system.py +0 -0
  395. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_me_analytical.py +0 -0
  396. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_model_exchange_fmu_system.py +0 -0
  397. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_pid_system.py +0 -0
  398. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_relay_thermostat_system.py +0 -0
  399. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_rescale_delay_system.py +0 -0
  400. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_robertson_system.py +0 -0
  401. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_roessler_system.py +0 -0
  402. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_signal_processing_system.py +0 -0
  403. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_steadystate_transient_system.py +0 -0
  404. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_switch_lti_system.py +0 -0
  405. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_vanderpol_system.py +0 -0
  406. {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_volterralotka_system.py +0 -0
  407. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/__init__.py +0 -0
  408. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/__init__.py +0 -0
  409. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/_embedding.py +0 -0
  410. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/rf/__init__.py +0 -0
  411. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/rf/ring_slot.s2p +0 -0
  412. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/rf/ring_slot_meas.s1p +0 -0
  413. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/rf/test_rf.py +0 -0
  414. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_adder.py +0 -0
  415. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_amplifier.py +0 -0
  416. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_block.py +0 -0
  417. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_bvp.py +0 -0
  418. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_comparator.py +0 -0
  419. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_constraint.py +0 -0
  420. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_converters.py +0 -0
  421. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_counter.py +0 -0
  422. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_ctrl.py +0 -0
  423. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_dae.py +0 -0
  424. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_delay.py +0 -0
  425. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_differentiator.py +0 -0
  426. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_discrete.py +0 -0
  427. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_divider.py +0 -0
  428. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_filters.py +0 -0
  429. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_fmu.py +0 -0
  430. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_integrator.py +0 -0
  431. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_kalman.py +0 -0
  432. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_logic.py +0 -0
  433. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_lti.py +0 -0
  434. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_multiplier.py +0 -0
  435. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_noise.py +0 -0
  436. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_ode.py +0 -0
  437. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_rng.py +0 -0
  438. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_sources.py +0 -0
  439. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_spectrum.py +0 -0
  440. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_switch.py +0 -0
  441. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/events/__init__.py +0 -0
  442. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/events/test_condition.py +0 -0
  443. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/events/test_event.py +0 -0
  444. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/events/test_zerocrossing.py +0 -0
  445. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/optim/__init__.py +0 -0
  446. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/optim/test_newton.py +0 -0
  447. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/optim/test_numerical.py +0 -0
  448. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/optim/test_operator.py +0 -0
  449. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/__init__.py +0 -0
  450. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/_referenceproblems.py +0 -0
  451. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_bdf.py +0 -0
  452. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_dirk2.py +0 -0
  453. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_dirk3.py +0 -0
  454. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_esdirk32.py +0 -0
  455. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_esdirk4.py +0 -0
  456. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_esdirk43.py +0 -0
  457. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_esdirk54.py +0 -0
  458. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_esdirk85.py +0 -0
  459. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_euler.py +0 -0
  460. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_gear.py +0 -0
  461. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_rfk21.py +0 -0
  462. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_rk4.py +0 -0
  463. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_rkbs32.py +0 -0
  464. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_rkck54.py +0 -0
  465. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_rkdp54.py +0 -0
  466. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_rkdp87.py +0 -0
  467. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_rkf45.py +0 -0
  468. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_rkf78.py +0 -0
  469. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_rkv65.py +0 -0
  470. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_solver.py +0 -0
  471. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_ssprk22.py +0 -0
  472. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_ssprk33.py +0 -0
  473. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_ssprk34.py +0 -0
  474. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_steadystate.py +0 -0
  475. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/test_auto_initial_step.py +0 -0
  476. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/test_checkpoint.py +0 -0
  477. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/test_connection.py +0 -0
  478. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/test_diagnostics.py +0 -0
  479. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/test_simulation_pss.py +0 -0
  480. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/utils/__init__.py +0 -0
  481. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/utils/test_adaptivebuffer.py +0 -0
  482. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/utils/test_analysis.py +0 -0
  483. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/utils/test_gilbert.py +0 -0
  484. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/utils/test_graph.py +0 -0
  485. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/utils/test_logger.py +0 -0
  486. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/utils/test_mutable.py +0 -0
  487. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/utils/test_portreference.py +0 -0
  488. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/utils/test_progresstracker.py +0 -0
  489. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/utils/test_realtimeplotter.py +0 -0
  490. {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/utils/test_register.py +0 -0
@@ -0,0 +1,22 @@
1
+ ## Summary
2
+
3
+ <!-- What does this change do, and why? Keep it short and factual. -->
4
+
5
+ ## Changes
6
+
7
+ <!-- One line per file or logical change. -->
8
+
9
+ ## Test plan
10
+
11
+ <!-- What did you run, and what was the result? -->
12
+
13
+ - [ ] `pytest -m "slow or not slow"` passes
14
+ - [ ] New code is covered by tests under `tests/pathsim/`
15
+
16
+ ---
17
+
18
+ <!--
19
+ Please see CONTRIBUTING.md. In particular: submit your work under your own name,
20
+ without co-author trailers or generated-by footers for AI assistants or other
21
+ tools.
22
+ -->
@@ -0,0 +1,64 @@
1
+ # Contributing to PathSim
2
+
3
+ Thanks for your interest in PathSim. Bug reports, fixes, new blocks and
4
+ documentation improvements are all welcome.
5
+
6
+ ## Before you start
7
+
8
+ For anything beyond a bug fix, please open an issue or a
9
+ [discussion](https://github.com/orgs/pathsim/discussions) first. PathSim has a
10
+ deliberate architecture and a companion project ([fastsim](https://fastsim.dev))
11
+ that it stays aligned with, so a short conversation up front saves everyone from
12
+ building in a direction that won't be merged.
13
+
14
+ Small, focused pull requests get reviewed and merged much faster than large ones.
15
+ If you have found several unrelated things, please split them up — a bug fix that
16
+ stands on its own should not have to wait for a design discussion about a feature.
17
+
18
+ ## Development setup
19
+
20
+ ```bash
21
+ git clone https://github.com/pathsim/pathsim
22
+ cd pathsim
23
+ pip install -e ".[test]"
24
+ ```
25
+
26
+ ## Tests
27
+
28
+ ```bash
29
+ pytest # default run, excludes slow tests
30
+ pytest -m "slow or not slow" # everything
31
+ ```
32
+
33
+ New code needs tests, and they belong in `tests/pathsim/` mirroring the source
34
+ tree. `tests/evals/` is for long-running validation studies only — it is excluded
35
+ from the default run, so regular unit tests placed there will not run in CI.
36
+
37
+ ## Code style
38
+
39
+ PathSim follows a consistent style throughout. Please match the surrounding code
40
+ rather than introducing new conventions:
41
+
42
+ - NumPy-style docstrings with `Parameters` / `Returns` sections
43
+ - comments start directly after the `#`, no leading space
44
+ - section banners as used in the existing modules
45
+ - no new dependencies in the core — it stays on `numpy`, `scipy`, `matplotlib`
46
+
47
+ ## Commits and pull requests
48
+
49
+ - Keep commit messages short and factual, one line where possible.
50
+ - Describe what the change does and why. Test results and open questions are
51
+ useful; marketing is not.
52
+ - **Submit your work under your own name.** Please do not add co-author trailers,
53
+ attribution footers or generated-by signatures for AI assistants or other tools
54
+ in commit messages or pull request descriptions. Use whatever tools you like —
55
+ you are the author, and you are vouching for the code you submit.
56
+
57
+ ## Reporting bugs
58
+
59
+ Please include the PathSim version, your Python and NumPy versions, and a minimal
60
+ script that reproduces the problem.
61
+
62
+ ## License
63
+
64
+ Contributions are made under the MIT License, the same terms as PathSim itself.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pathsim
3
- Version: 0.23.2
3
+ Version: 0.25.0
4
4
  Summary: A differentiable block based hybrid system simulation framework.
5
5
  Author-email: Milan Rother <milan.rother@gmx.de>
6
6
  License: MIT
@@ -119,6 +119,7 @@ scp.plot()
119
119
  - [Documentation](https://docs.pathsim.org) — tutorials, examples, and API reference
120
120
  - [Homepage](https://pathsim.org) — overview and getting started
121
121
  - [Contributing](https://docs.pathsim.org/pathsim/latest/contributing) — how to contribute
122
+ - [Consulting & commercial support](https://milanrother.com/consulting/) — integration, custom blocks, migration from closed tools
122
123
 
123
124
  ## Citation
124
125
 
@@ -89,6 +89,7 @@ scp.plot()
89
89
  - [Documentation](https://docs.pathsim.org) — tutorials, examples, and API reference
90
90
  - [Homepage](https://pathsim.org) — overview and getting started
91
91
  - [Contributing](https://docs.pathsim.org/pathsim/latest/contributing) — how to contribute
92
+ - [Consulting & commercial support](https://milanrother.com/consulting/) — integration, custom blocks, migration from closed tools
92
93
 
93
94
  ## Citation
94
95
 
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.23.2'
22
- __version_tuple__ = version_tuple = (0, 23, 2)
21
+ __version__ = version = '0.25.0'
22
+ __version_tuple__ = version_tuple = (0, 25, 0)
23
23
 
24
- __commit_id__ = commit_id = 'g6079208a8'
24
+ __commit_id__ = commit_id = 'g405501720'
@@ -11,11 +11,15 @@
11
11
  # IMPORTS ===============================================================================
12
12
 
13
13
  import inspect
14
+ import numpy as np
15
+
14
16
  from functools import lru_cache
15
17
 
16
18
  from ..utils.deprecation import deprecated
17
19
  from ..utils.register import Register
18
20
  from ..utils.portreference import PortReference
21
+ from ..optim.operator import DynamicOperator
22
+ from ..exceptions import LinearizationError
19
23
 
20
24
 
21
25
  # HELPERS ===============================================================================
@@ -103,11 +107,18 @@ class Block:
103
107
  internal callable operator for algebraic components of block
104
108
  op_dyn : DynamicOperator | None
105
109
  internal callable operator for dynamic (ODE) components of block
110
+ linearizable : bool
111
+ class level flag that declares whether the block has a valid linear
112
+ state space model, see 'to_statespace'
106
113
  """
107
114
 
108
115
  input_port_labels = None
109
116
  output_port_labels = None
110
117
 
118
+ #blocks with a switching, discontinuous or non deterministic characteristic
119
+ #set this to 'False' and are rejected by 'to_statespace'
120
+ linearizable = True
121
+
111
122
  def __init__(self):
112
123
 
113
124
  #registers to hold input and output values, pre-sized to the declared
@@ -353,18 +364,121 @@ class Block:
353
364
  event.reset()
354
365
 
355
366
 
367
+ def to_statespace(self, t):
368
+ """Return the local linear state space model of the block in its
369
+ current operating point.
370
+
371
+ .. math::
372
+
373
+ \\begin{align}
374
+ \\delta \\dot{x} &= \\mathbf{A} \\delta x + \\mathbf{B} \\delta u\\\\
375
+ \\delta y &= \\mathbf{C} \\delta x + \\mathbf{D} \\delta u
376
+ \\end{align}
377
+
378
+
379
+ This is a pure query, the block is not modified and keeps evaluating
380
+ its original functions afterwards. The Jacobians come from the
381
+ 'jac', 'jac_x' and 'jac_u' methods of the internal operators, which
382
+ prefer analytical Jacobians and fall back to numerical differentiation.
383
+
384
+ Blocks without operators define their linear model themselves and
385
+ override this method. Blocks without a valid linear model declare
386
+ this through the 'linearizable' class attribute.
387
+
388
+ Note
389
+ ----
390
+ This is the primitive that 'linearize' and the system level
391
+ linearization build on, not the other way around.
392
+
393
+ Parameters
394
+ ----------
395
+ t : float
396
+ evaluation time
397
+
398
+ Returns
399
+ -------
400
+ A, B, C, D : np.ndarray
401
+ local state space matrices of the block, shaped
402
+ (nx,nx), (nx,nu), (ny,nx), (ny,nu)
403
+
404
+ Raises
405
+ ------
406
+ LinearizationError
407
+ if the block has no valid linear model in this operating point
408
+ """
409
+
410
+ #block declares itself as not linearizable -> fail loudly
411
+ if not self.linearizable:
412
+ raise LinearizationError(
413
+ f"Block '{self.__class__.__name__}' has no linear state space "
414
+ "model (switching, discontinuous or non deterministic)!"
415
+ )
416
+
417
+ #get current state
418
+ u, y, x = self.get_all()
419
+
420
+ nu, ny = len(u), len(y)
421
+ nx = len(np.atleast_1d(x)) if self.engine else 0
422
+
423
+ #dynamics -> A, B
424
+ if not self.engine:
425
+ A, B = np.zeros((0, 0)), np.zeros((0, nu))
426
+ elif self.op_dyn is not None:
427
+ A = np.asarray(self.op_dyn.jac_x(x, u, t)).reshape(nx, nx)
428
+ B = np.asarray(self.op_dyn.jac_u(x, u, t)).reshape(nx, nu)
429
+ else:
430
+ #state without dynamic operator -> only the block knows its dynamics
431
+ raise LinearizationError(
432
+ f"Block '{self.__class__.__name__}' is dynamic but defines no "
433
+ "'op_dyn', it must override 'to_statespace'!"
434
+ )
435
+
436
+ #output map -> C, D
437
+ if self.op_alg is None:
438
+ if nx:
439
+ #state without algebraic operator -> implicit output map,
440
+ #only the block knows it (e.g. 'ODE' with 'y = x')
441
+ raise LinearizationError(
442
+ f"Block '{self.__class__.__name__}' is dynamic but defines "
443
+ "no 'op_alg', it must override 'to_statespace'!"
444
+ )
445
+ #stateless without algebraic operator -> no input to output path
446
+ C, D = np.zeros((ny, 0)), np.zeros((ny, nu))
447
+
448
+ elif isinstance(self.op_alg, DynamicOperator):
449
+ #'DynamicOperator' is called with 'x=None' on stateless blocks
450
+ C = np.asarray(self.op_alg.jac_x(x, u, t)).reshape(ny, nx) if nx else np.zeros((ny, 0))
451
+ D = np.asarray(self.op_alg.jac_u(x if nx else None, u, t)).reshape(ny, nu)
452
+
453
+ else:
454
+ C = np.zeros((ny, nx))
455
+ D = np.asarray(self.op_alg.jac(u)).reshape(ny, nu)
456
+
457
+ return A, B, C, D
458
+
459
+
356
460
  def linearize(self, t):
357
461
  """Linearize the algebraic and dynamic components of the block.
358
462
 
359
- This is done by linearizing the internal 'Operator' and 'DynamicOperator'
360
- instances in the current system operating point. The operators create
361
- 1st order taylor approximations internally and use them on subsequent
463
+ This is done by linearizing the internal 'Operator' and 'DynamicOperator'
464
+ instances in the current system operating point. The operators create
465
+ 1st order taylor approximations internally and use them on subsequent
362
466
  calls after linearization.
363
467
 
468
+ Note
469
+ ----
470
+ Use 'to_statespace' if only the linear model is needed, it does not
471
+ switch the block over to its linear surrogate.
472
+
364
473
  Parameters
365
474
  ----------
366
- t : float
475
+ t : float
367
476
  evaluation time
477
+
478
+ Returns
479
+ -------
480
+ A, B, C, D : np.ndarray
481
+ local state space matrices of the block, see 'to_statespace'
368
482
  """
369
483
 
370
484
  #get current state
@@ -372,13 +486,20 @@ class Block:
372
486
 
373
487
  #no engine -> stateless
374
488
  if not self.engine:
375
- #linearize only algebraic operator
376
- if self.op_alg: self.op_alg.linearize(u)
489
+ #linearize only algebraic operator
490
+ if self.op_alg:
491
+ if isinstance(self.op_alg, DynamicOperator):
492
+ self.op_alg.linearize(None, u, t)
493
+ else:
494
+ self.op_alg.linearize(u)
377
495
  else:
378
496
  #linearize algebraic and dynamic operators
379
497
  if self.op_alg: self.op_alg.linearize(x, u, t)
380
498
  if self.op_dyn: self.op_dyn.linearize(x, u, t)
381
499
 
500
+ #hand back the linear model the operators just computed
501
+ return self.to_statespace(t)
502
+
382
503
 
383
504
  def delinearize(self):
384
505
  """Revert the linearization of the blocks algebraic and dynamic components.
@@ -46,6 +46,9 @@ class Comparator(Block):
46
46
  input_port_labels = {"in": 0}
47
47
  output_port_labels = {"out":0}
48
48
 
49
+ #discontinuous switching characteristic -> no linear model
50
+ linearizable = False
51
+
49
52
 
50
53
  def __init__(self, threshold=0, tolerance=1e-4, span=[-1, 1]):
51
54
  super().__init__()
@@ -64,6 +64,10 @@ class ADC(Block):
64
64
  input_port_labels = {"in": 0}
65
65
  output_port_labels = None
66
66
 
67
+ #quantization is discontinuous -> no linear model
68
+ linearizable = False
69
+
70
+
67
71
  def __init__(self, n_bits=4, span=[-1, 1], T=1, tau=0):
68
72
  super().__init__()
69
73
 
@@ -154,6 +158,10 @@ class DAC(Block):
154
158
  input_port_labels = None
155
159
  output_port_labels = {"out": 0}
156
160
 
161
+ #quantization is discontinuous -> no linear model
162
+ linearizable = False
163
+
164
+
157
165
  def __init__(self, n_bits=4, span=[-1, 1], T=1, tau=0):
158
166
  super().__init__()
159
167
 
@@ -39,6 +39,9 @@ class Counter(Block):
39
39
 
40
40
  input_port_labels = {"in": 0}
41
41
  output_port_labels = {"out": 0}
42
+
43
+ #integer valued, discontinuous output -> no linear model
44
+ linearizable = False
42
45
 
43
46
 
44
47
  def __init__(self, start=0, threshold=0.0):
@@ -89,6 +89,10 @@ class Delay(Block):
89
89
  internal ring buffer for N-sample delay (discrete mode)
90
90
  """
91
91
 
92
+ #time delay is not finite dimensional -> no linear model
93
+ linearizable = False
94
+
95
+
92
96
  def __init__(self, tau=1e-3, sampling_period=None):
93
97
  super().__init__()
94
98
 
@@ -48,6 +48,10 @@ class SampleHold(Block):
48
48
  internal scheduled event for periodic sampling
49
49
  """
50
50
 
51
+ #discrete time block -> no continuous time linear model
52
+ linearizable = False
53
+
54
+
51
55
  def __init__(self, T=1.0, tau=0.0):
52
56
  super().__init__()
53
57
 
@@ -111,6 +115,10 @@ class FirstOrderHold(Block):
111
115
  internal scheduled event for periodic sampling
112
116
  """
113
117
 
118
+ #discrete time block -> no continuous time linear model
119
+ linearizable = False
120
+
121
+
114
122
  def __init__(self, T=1.0, tau=0.0):
115
123
  super().__init__()
116
124
 
@@ -195,6 +203,10 @@ class FIR(Block):
195
203
  internal scheduled event for periodic filter evaluation
196
204
  """
197
205
 
206
+ #discrete time block -> no continuous time linear model
207
+ linearizable = False
208
+
209
+
198
210
  def __init__(self, coeffs=[1.0], T=1.0, tau=0.0):
199
211
  super().__init__()
200
212
 
@@ -293,6 +305,10 @@ class DiscreteIntegrator(Block):
293
305
  internal scheduled event for periodic update
294
306
  """
295
307
 
308
+ #discrete time block -> no continuous time linear model
309
+ linearizable = False
310
+
311
+
296
312
  def __init__(self, T=1.0, tau=0.0, initial_value=0.0):
297
313
  super().__init__()
298
314
 
@@ -353,6 +369,10 @@ class DiscreteDerivative(Block):
353
369
  internal scheduled event for periodic update
354
370
  """
355
371
 
372
+ #discrete time block -> no continuous time linear model
373
+ linearizable = False
374
+
375
+
356
376
  def __init__(self, T=1.0, tau=0.0):
357
377
  super().__init__()
358
378
 
@@ -421,6 +441,10 @@ class DiscreteStateSpace(Block):
421
441
  internal scheduled event for periodic update
422
442
  """
423
443
 
444
+ #discrete time block -> no continuous time linear model
445
+ linearizable = False
446
+
447
+
424
448
  def __init__(self, A=0.0, B=1.0, C=1.0, D=0.0, T=1.0, tau=0.0, initial_value=None):
425
449
  super().__init__()
426
450
 
@@ -548,6 +572,10 @@ class TappedDelay(Block):
548
572
 
549
573
  input_port_labels = {"in": 0}
550
574
 
575
+ #discrete time block -> no continuous time linear model
576
+ linearizable = False
577
+
578
+
551
579
  def __init__(self, N=2, T=1.0, tau=0.0):
552
580
  super().__init__()
553
581
 
@@ -93,7 +93,8 @@ class DynamicalSystem(Block):
93
93
  alg_length : int
94
94
  length of algebraic path
95
95
  """
96
- x, u = self.engine.state, self.inputs.to_array()
96
+ x = self.engine.state if self.engine else self.initial_value
97
+ u = self.inputs.to_array()
97
98
  has_passthrough = np.any(self.op_alg.jac_u(x, u, 0.0))
98
99
  return int(has_passthrough)
99
100
 
@@ -84,6 +84,46 @@ class Integrator(Block):
84
84
  self.outputs.update_from_array(self.engine.state)
85
85
 
86
86
 
87
+ def to_statespace(self, t):
88
+ """Local linear state space model of the integrator.
89
+
90
+ The integrator is already linear, so its model is exact and
91
+ independent of the operating point
92
+
93
+ .. math::
94
+
95
+ \\mathbf{A} = 0, \\quad \\mathbf{B} = \\mathbf{I}, \\quad
96
+ \\mathbf{C} = \\mathbf{I}, \\quad \\mathbf{D} = 0
97
+
98
+
99
+ Note
100
+ ----
101
+ The integrator carries no operators, so the generic implementation
102
+ of 'Block.to_statespace' cannot derive this and would reject it.
103
+
104
+ Parameters
105
+ ----------
106
+ t : float
107
+ evaluation time
108
+
109
+ Returns
110
+ -------
111
+ A, B, C, D : np.ndarray
112
+ local state space matrices of the integrator
113
+ """
114
+ #no engine assigned yet -> no state, same degradation as the base class
115
+ nx = len(np.atleast_1d(self.engine.state)) if self.engine else 0
116
+ nu = len(self.inputs.to_array())
117
+ ny = len(self.outputs.to_array())
118
+
119
+ return (
120
+ np.zeros((nx, nx)),
121
+ np.eye(nx, nu),
122
+ np.eye(ny, nx),
123
+ np.zeros((ny, nu))
124
+ )
125
+
126
+
87
127
  def derivative(self, t):
88
128
  """time derivative of the integrator state, which is just the input
89
129
 
@@ -29,6 +29,10 @@ class Logic(Block):
29
29
 
30
30
  """
31
31
 
32
+ #boolean valued, discontinuous output -> no linear model
33
+ linearizable = False
34
+
35
+
32
36
  def __len__(self):
33
37
  """Purely algebraic block"""
34
38
  return 1
@@ -72,6 +72,12 @@ class StateSpace(Block):
72
72
  real valued state space matrices
73
73
  initial_value : array_like, None
74
74
  initial state / initial condition
75
+ state_labels, input_labels, output_labels : list[str], None
76
+ optional identifiers for the states, inputs and outputs of the model.
77
+ Models assembled by 'Simulation.to_statespace' carry the block names
78
+ they were built from here. These are also exactly the 'states',
79
+ 'inputs' and 'outputs' keyword arguments of 'control.StateSpace', so
80
+ the model hands over to python-control without an adapter.
75
81
 
76
82
  Attributes
77
83
  ----------
@@ -81,11 +87,17 @@ class StateSpace(Block):
81
87
  internal algebraic operator for mapping to outputs
82
88
  """
83
89
 
84
- def __init__(self,
85
- A=-1.0, B=1.0, C=-1.0, D=1.0,
86
- initial_value=None):
90
+ def __init__(self,
91
+ A=-1.0, B=1.0, C=-1.0, D=1.0,
92
+ initial_value=None,
93
+ state_labels=None, input_labels=None, output_labels=None):
87
94
  super().__init__()
88
95
 
96
+ #optional identifiers for the rows and columns of the matrices
97
+ self.state_labels = state_labels
98
+ self.input_labels = input_labels
99
+ self.output_labels = output_labels
100
+
89
101
  #statespace matrices with input shape validation
90
102
  self.A = np.atleast_2d(A)
91
103
  self.B = np.atleast_1d(B)
@@ -601,9 +601,9 @@ class Matrix(Math):
601
601
 
602
602
  Parameters
603
603
  ----------
604
- A : np.ndarray
605
- matrix, 2d array with dim=2
606
-
604
+ A : array_like
605
+ matrix, 2d array-like (nested lists are accepted and converted)
606
+
607
607
  Attributes
608
608
  ----------
609
609
  op_alg : Operator
@@ -613,6 +613,10 @@ class Matrix(Math):
613
613
  def __init__(self, A=np.eye(1)):
614
614
  super().__init__()
615
615
 
616
+ # accept any array-like: a nested list is the natural way to write a
617
+ # small matrix inline, and every other block parameter takes one
618
+ A = np.asarray(A, dtype=float)
619
+
616
620
  # check matrix dimension and shape
617
621
  if not A.ndim == 2:
618
622
  raise ValueError("'A' must be dim 2")
@@ -113,13 +113,13 @@ class ODE(Block):
113
113
 
114
114
 
115
115
  def update(self, t):
116
- """update system equation for fixed point loop,
116
+ """update system equation for fixed point loop,
117
117
  here just setting the outputs
118
-
118
+
119
119
  Note
120
120
  ----
121
- the ODE block has no direct passthrough, so the
122
- 'update' method is optimized for this case
121
+ the ODE block has no direct passthrough, so the
122
+ 'update' method is optimized for this case
123
123
 
124
124
  Parameters
125
125
  ----------
@@ -129,6 +129,40 @@ class ODE(Block):
129
129
  self.outputs.update_from_array(self.engine.state)
130
130
 
131
131
 
132
+ def to_statespace(self, t):
133
+ """Local linear state space model of the ODE block.
134
+
135
+ The dynamics come from the Jacobians of 'op_dyn', the output map is
136
+ the implicit identity 'y = x' of this block.
137
+
138
+ Note
139
+ ----
140
+ The ODE block defines no algebraic operator, so the generic
141
+ implementation of 'Block.to_statespace' cannot derive the output map.
142
+
143
+ Parameters
144
+ ----------
145
+ t : float
146
+ evaluation time
147
+
148
+ Returns
149
+ -------
150
+ A, B, C, D : np.ndarray
151
+ local state space matrices of the ODE block
152
+ """
153
+ u, y, x = self.get_all()
154
+
155
+ nu, ny = len(u), len(y)
156
+ nx = len(np.atleast_1d(x))
157
+
158
+ return (
159
+ np.asarray(self.op_dyn.jac_x(x, u, t)).reshape(nx, nx),
160
+ np.asarray(self.op_dyn.jac_u(x, u, t)).reshape(nx, nu),
161
+ np.eye(ny, nx),
162
+ np.zeros((ny, nu))
163
+ )
164
+
165
+
132
166
  def solve(self, t, dt):
133
167
  """advance solution of implicit update equation of the solver
134
168
 
@@ -60,6 +60,9 @@ class Relay(Block):
60
60
  input_port_labels = {"in":0}
61
61
  output_port_labels = {"out":0}
62
62
 
63
+ #discontinuous switching characteristic -> no linear model
64
+ linearizable = False
65
+
63
66
  def __init__(
64
67
  self,
65
68
  threshold_up=1.0,
@@ -95,12 +98,25 @@ class Relay(Block):
95
98
  ),
96
99
  ]
97
100
 
101
+ # start in the lower relay state
102
+ self.outputs[0] = self.value_down
103
+
98
104
 
99
105
  def __len__(self):
100
106
  """This block has no direct passthrough"""
101
107
  return 0
102
108
 
103
109
 
110
+ def reset(self):
111
+ """Reset the block and return to the lower relay state.
112
+
113
+ The base reset zeroes the outputs, which is not a relay state -- the
114
+ output must land back on `value_down`, same as after construction.
115
+ """
116
+ super().reset()
117
+ self.outputs[0] = self.value_down
118
+
119
+
104
120
  def update(self, t):
105
121
  """update system equation for fixed point loop,
106
122
  here just setting the outputs
@@ -42,6 +42,9 @@ class RandomNumberGenerator(Block):
42
42
  input_port_labels = {}
43
43
  output_port_labels = {"out":0}
44
44
 
45
+ #non deterministic output -> no linear model
46
+ linearizable = False
47
+
45
48
  def __init__(self, sampling_period=None):
46
49
  super().__init__()
47
50