pathsim 0.26.0__tar.gz → 0.27.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 (392) hide show
  1. {pathsim-0.26.0 → pathsim-0.27.0}/PKG-INFO +1 -1
  2. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/_version.py +3 -3
  3. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/dae.py +48 -11
  4. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/utils/graph.py +15 -11
  5. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim.egg-info/PKG-INFO +1 -1
  6. pathsim-0.27.0/src/pathsim.egg-info/scm_version.json +8 -0
  7. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_dae.py +16 -3
  8. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/test_simulation.py +72 -0
  9. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/utils/test_graph.py +67 -0
  10. pathsim-0.26.0/src/pathsim.egg-info/scm_version.json +0 -8
  11. {pathsim-0.26.0 → pathsim-0.27.0}/.codecov.yml +0 -0
  12. {pathsim-0.26.0 → pathsim-0.27.0}/.github/FUNDING.yml +0 -0
  13. {pathsim-0.26.0 → pathsim-0.27.0}/.github/pull_request_template.md +0 -0
  14. {pathsim-0.26.0 → pathsim-0.27.0}/.github/workflows/pypi_deployment.yml +0 -0
  15. {pathsim-0.26.0 → pathsim-0.27.0}/.github/workflows/tests_codecov.yml +0 -0
  16. {pathsim-0.26.0 → pathsim-0.27.0}/.github/workflows/urlchecker.yml +0 -0
  17. {pathsim-0.26.0 → pathsim-0.27.0}/.gitignore +0 -0
  18. {pathsim-0.26.0 → pathsim-0.27.0}/CITATION.cff +0 -0
  19. {pathsim-0.26.0 → pathsim-0.27.0}/CONTRIBUTING.md +0 -0
  20. {pathsim-0.26.0 → pathsim-0.27.0}/LICENSE.txt +0 -0
  21. {pathsim-0.26.0 → pathsim-0.27.0}/README.md +0 -0
  22. {pathsim-0.26.0 → pathsim-0.27.0}/conftest.py +0 -0
  23. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/abs_braking.ipynb +0 -0
  24. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/algebraic_loop.ipynb +0 -0
  25. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/billards.ipynb +0 -0
  26. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/bouncing_ball.ipynb +0 -0
  27. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/bouncing_pendulum.ipynb +0 -0
  28. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/cascade_controller.ipynb +0 -0
  29. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/checkpoints.ipynb +0 -0
  30. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/chemical_reactor.ipynb +0 -0
  31. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/coupled_oscillators.ipynb +0 -0
  32. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/data/BouncingBall_ME.fmu +0 -0
  33. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/data/CoupledClutches_CS_linux64.fmu +0 -0
  34. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/data/CoupledClutches_CS_win64.fmu +0 -0
  35. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/data/Dahlquist.fmu +0 -0
  36. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/data/VanDerPol_ME.fmu +0 -0
  37. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/dcmotor_control.ipynb +0 -0
  38. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/delta_sigma_adc.ipynb +0 -0
  39. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/diode_circuit.ipynb +0 -0
  40. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/elastic_pendulum.ipynb +0 -0
  41. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/algebraicloop_blockdiagram_g.png +0 -0
  42. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/billard_circle_g.png +0 -0
  43. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/bouncing_ball_blockdiagram_g.png +0 -0
  44. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/bouncing_ball_both_g.png +0 -0
  45. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/bouncing_ball_g.png +0 -0
  46. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/bouncing_ball_result_events_g.png +0 -0
  47. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/bouncing_ball_result_g.png +0 -0
  48. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/bouncing_ball_result_timesteps_g.png +0 -0
  49. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/bouncing_pendulum_blockdiagram_g.png +0 -0
  50. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/cascade_blockdiagram_g.png +0 -0
  51. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/coupled_oscillators_blockdiagram_g.png +0 -0
  52. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/coupled_oscillators_g.png +0 -0
  53. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/delta_sigma_blockdiagram_g.png +0 -0
  54. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/diode_blockdiagram_g.png +0 -0
  55. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/elastic_pendulum_g.png +0 -0
  56. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/fmcw_blockdiagram_g.png +0 -0
  57. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/fmcw_g.png +0 -0
  58. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/harmonic_oscillator_g.png +0 -0
  59. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/harmonic_oscillator_result_g.png +0 -0
  60. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/kalman_filter_blockdiagram_g.png +0 -0
  61. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/linear_feedback_blockdiagram_g.png +0 -0
  62. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/linear_feedback_result_g.png +0 -0
  63. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/linear_feedback_result_sensitivity_g.png +0 -0
  64. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/miller_frequency_divider_blockdiagram_g.png +0 -0
  65. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/nonlinear_noisy_amplifier_blockdiagram_g.png +0 -0
  66. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/ode_blockdiagram_g.png +0 -0
  67. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/pendulum_blockdiagram_g.png +0 -0
  68. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/pid_blockdiagram_g.png +0 -0
  69. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/sar_adc_blockdiagram_g.png +0 -0
  70. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/stick_slip_blockdiagram_g.png +0 -0
  71. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/stick_slip_blockdiagram_slip_g.png +0 -0
  72. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/stick_slip_blockdiagram_stick_g.png +0 -0
  73. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/stick_slip_g.png +0 -0
  74. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/thermostat_blockdiagram_g.png +0 -0
  75. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/vanderpol_blockdiagram_g.png +0 -0
  76. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/vanderpol_result_g.png +0 -0
  77. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/vanderpol_subsystem_blockdiagram_g.png +0 -0
  78. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/vanderpol_subsystem_lvl1_g.png +0 -0
  79. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/vanderpol_subsystem_lvl2_g.png +0 -0
  80. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/vanderpol_subsystem_lvl3_g.png +0 -0
  81. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/figures_g/volterralotka_blockdiagram_g.png +0 -0
  82. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/ode_blockdiagram_2.png +0 -0
  83. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/stick_slip_blockdiagram_slip.png +0 -0
  84. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/figures/stick_slip_blockdiagram_stick.png +0 -0
  85. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/fmcw_radar.ipynb +0 -0
  86. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/fmu_cosimulation.ipynb +0 -0
  87. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/fmu_model_exchange_bouncing_ball.ipynb +0 -0
  88. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/fmu_model_exchange_vanderpol.ipynb +0 -0
  89. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/harmonic_oscillator.ipynb +0 -0
  90. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/kalman_filter.ipynb +0 -0
  91. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/linear_feedback.ipynb +0 -0
  92. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/lorenz_attractor.ipynb +0 -0
  93. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/nested_subsystems.ipynb +0 -0
  94. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/noisy_amplifier.ipynb +0 -0
  95. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/pendulum.ipynb +0 -0
  96. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/pid_controller.ipynb +0 -0
  97. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/poincare_maps.ipynb +0 -0
  98. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/rf_network_oneport.ipynb +0 -0
  99. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/sar_adc.ipynb +0 -0
  100. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/spectrum_analysis.ipynb +0 -0
  101. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/stick_slip.ipynb +0 -0
  102. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/switched_bouncing_ball.ipynb +0 -0
  103. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/thermostat.ipynb +0 -0
  104. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/transfer_function.ipynb +0 -0
  105. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/examples/vanderpol.ipynb +0 -0
  106. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/logos/pathsim_icon.png +0 -0
  107. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/logos/pathsim_logo.png +0 -0
  108. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/logos/pathsim_simplistic_logo.png +0 -0
  109. {pathsim-0.26.0 → pathsim-0.27.0}/docs/source/pathsim_docs.mplstyle +0 -0
  110. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_abs_braking.py +0 -0
  111. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_adc.py +0 -0
  112. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_algebraicchain.py +0 -0
  113. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_algebraicloop.py +0 -0
  114. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_cascade.py +0 -0
  115. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_dcmotor.py +0 -0
  116. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_deltasigma.py +0 -0
  117. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_derivative.py +0 -0
  118. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_diode.py +0 -0
  119. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_dualslope.py +0 -0
  120. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_elastic_pendulum.py +0 -0
  121. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_feedback.py +0 -0
  122. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_filters.py +0 -0
  123. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_harmonic_oscillator.py +0 -0
  124. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_kalman_filter.py +0 -0
  125. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_nested_subsystems.py +0 -0
  126. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_noise.py +0 -0
  127. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_pendulum.py +0 -0
  128. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_phasenoise.py +0 -0
  129. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_pid.py +0 -0
  130. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_pid_antiwindup.py +0 -0
  131. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_pid_vs_discretePID.py +0 -0
  132. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_radar.py +0 -0
  133. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_reactor.py +0 -0
  134. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_sar.py +0 -0
  135. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_solar.py +0 -0
  136. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_solver_hotswap.py +0 -0
  137. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_spectrum.py +0 -0
  138. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_spectrum_rf_oneport.py +0 -0
  139. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_steadystate.py +0 -0
  140. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_stickslip.py +0 -0
  141. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_transferfunction.py +0 -0
  142. {pathsim-0.26.0 → pathsim-0.27.0}/examples/example_vanderpol_subsystem.py +0 -0
  143. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_event/example_billards_sphere.py +0 -0
  144. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_event/example_bouncing_pendulum.py +0 -0
  145. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_event/example_bouncingball.py +0 -0
  146. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_event/example_bouncingball_friction.py +0 -0
  147. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_event/example_bouncingball_switched.py +0 -0
  148. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_event/example_integrator_reset.py +0 -0
  149. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_event/example_pulse.py +0 -0
  150. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_event/example_stickslip_event.py +0 -0
  151. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_event/example_thermostat.py +0 -0
  152. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_event/example_volterralotka_event.py +0 -0
  153. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_odes/example_bonhoeffer_vanderpol.py +0 -0
  154. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_odes/example_brusselator.py +0 -0
  155. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_odes/example_chemical.py +0 -0
  156. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_odes/example_duffing.py +0 -0
  157. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_odes/example_fairen_velarde.py +0 -0
  158. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_odes/example_fitzhughnagumo.py +0 -0
  159. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_odes/example_flame.py +0 -0
  160. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_odes/example_glycolysis.py +0 -0
  161. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_odes/example_lorenz.py +0 -0
  162. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_odes/example_morse.py +0 -0
  163. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_odes/example_robertson.py +0 -0
  164. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_odes/example_roessler.py +0 -0
  165. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_odes/example_thomas_cyclic.py +0 -0
  166. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_odes/example_vanderpol.py +0 -0
  167. {pathsim-0.26.0 → pathsim-0.27.0}/examples/examples_odes/example_volterralotka.py +0 -0
  168. {pathsim-0.26.0 → pathsim-0.27.0}/git +0 -0
  169. {pathsim-0.26.0 → pathsim-0.27.0}/pyproject.toml +0 -0
  170. {pathsim-0.26.0 → pathsim-0.27.0}/setup.cfg +0 -0
  171. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/__init__.py +0 -0
  172. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/_constants.py +0 -0
  173. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/README.md +0 -0
  174. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/__init__.py +0 -0
  175. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/_block.py +0 -0
  176. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/adder.py +0 -0
  177. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/amplifier.py +0 -0
  178. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/bvp.py +0 -0
  179. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/comparator.py +0 -0
  180. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/constraint.py +0 -0
  181. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/converters.py +0 -0
  182. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/counter.py +0 -0
  183. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/ctrl.py +0 -0
  184. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/delay.py +0 -0
  185. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/differentiator.py +0 -0
  186. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/discrete.py +0 -0
  187. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/divider.py +0 -0
  188. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/dynsys.py +0 -0
  189. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/filters.py +0 -0
  190. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/fmu.py +0 -0
  191. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/function.py +0 -0
  192. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/integrator.py +0 -0
  193. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/kalman.py +0 -0
  194. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/logic.py +0 -0
  195. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/lti.py +0 -0
  196. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/math.py +0 -0
  197. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/multiplier.py +0 -0
  198. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/noise.py +0 -0
  199. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/ode.py +0 -0
  200. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/relay.py +0 -0
  201. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/rf.py +0 -0
  202. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/rng.py +0 -0
  203. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/scope.py +0 -0
  204. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/sources.py +0 -0
  205. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/spectrum.py +0 -0
  206. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/switch.py +0 -0
  207. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/table.py +0 -0
  208. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/blocks/wrapper.py +0 -0
  209. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/connection.py +0 -0
  210. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/events/__init__.py +0 -0
  211. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/events/_event.py +0 -0
  212. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/events/condition.py +0 -0
  213. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/events/schedule.py +0 -0
  214. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/events/zerocrossing.py +0 -0
  215. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/exceptions.py +0 -0
  216. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/optim/__init__.py +0 -0
  217. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/optim/anderson.py +0 -0
  218. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/optim/booster.py +0 -0
  219. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/optim/linearization.py +0 -0
  220. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/optim/newton.py +0 -0
  221. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/optim/numerical.py +0 -0
  222. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/optim/operator.py +0 -0
  223. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/simulation.py +0 -0
  224. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/README.md +0 -0
  225. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/__init__.py +0 -0
  226. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/_rungekutta.py +0 -0
  227. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/_solver.py +0 -0
  228. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/bdf.py +0 -0
  229. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/dirk2.py +0 -0
  230. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/dirk3.py +0 -0
  231. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/esdirk32.py +0 -0
  232. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/esdirk4.py +0 -0
  233. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/esdirk43.py +0 -0
  234. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/esdirk54.py +0 -0
  235. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/esdirk85.py +0 -0
  236. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/euler.py +0 -0
  237. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/gear.py +0 -0
  238. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/rk4.py +0 -0
  239. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/rkbs32.py +0 -0
  240. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/rkck54.py +0 -0
  241. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/rkdp54.py +0 -0
  242. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/rkdp87.py +0 -0
  243. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/rkf21.py +0 -0
  244. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/rkf45.py +0 -0
  245. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/rkf78.py +0 -0
  246. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/rkv65.py +0 -0
  247. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/ssprk22.py +0 -0
  248. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/ssprk33.py +0 -0
  249. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/ssprk34.py +0 -0
  250. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/solvers/steadystate.py +0 -0
  251. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/subsystem.py +0 -0
  252. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/utils/__init__.py +0 -0
  253. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/utils/adaptivebuffer.py +0 -0
  254. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/utils/analysis.py +0 -0
  255. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/utils/deprecation.py +0 -0
  256. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/utils/diagnostics.py +0 -0
  257. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/utils/fmuwrapper.py +0 -0
  258. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/utils/gilbert.py +0 -0
  259. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/utils/logger.py +0 -0
  260. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/utils/mutable.py +0 -0
  261. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/utils/portreference.py +0 -0
  262. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/utils/progresstracker.py +0 -0
  263. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/utils/realtimeplotter.py +0 -0
  264. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim/utils/register.py +0 -0
  265. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim.egg-info/SOURCES.txt +0 -0
  266. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim.egg-info/dependency_links.txt +0 -0
  267. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim.egg-info/requires.txt +0 -0
  268. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim.egg-info/scm_file_list.json +0 -0
  269. {pathsim-0.26.0 → pathsim-0.27.0}/src/pathsim.egg-info/top_level.txt +0 -0
  270. {pathsim-0.26.0 → pathsim-0.27.0}/tests/README.md +0 -0
  271. {pathsim-0.26.0 → pathsim-0.27.0}/tests/__init__.py +0 -0
  272. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/CoupledClutches_CS.fmu +0 -0
  273. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/__init__.py +0 -0
  274. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/conftest.py +0 -0
  275. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_algebraic_system.py +0 -0
  276. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_bouncingball_friction_event_system.py +0 -0
  277. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_bouncingball_system.py +0 -0
  278. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_brusselator_system.py +0 -0
  279. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_cosim_fmu_system.py +0 -0
  280. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_counter_comparator_system.py +0 -0
  281. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_dynamical_system_ivp.py +0 -0
  282. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_fitzhughnagumo_system.py +0 -0
  283. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_harmonic_oscillator_system.py +0 -0
  284. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_linear_feedback_system.py +0 -0
  285. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_logic_system.py +0 -0
  286. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_lorenz_system.py +0 -0
  287. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_me_analytical.py +0 -0
  288. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_model_exchange_fmu_system.py +0 -0
  289. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_pid_system.py +0 -0
  290. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_relay_thermostat_system.py +0 -0
  291. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_rescale_delay_system.py +0 -0
  292. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_robertson_system.py +0 -0
  293. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_roessler_system.py +0 -0
  294. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_signal_processing_system.py +0 -0
  295. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_steadystate_transient_system.py +0 -0
  296. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_switch_lti_system.py +0 -0
  297. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_vanderpol_system.py +0 -0
  298. {pathsim-0.26.0 → pathsim-0.27.0}/tests/evals/test_volterralotka_system.py +0 -0
  299. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/__init__.py +0 -0
  300. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/__init__.py +0 -0
  301. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/_embedding.py +0 -0
  302. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/rf/__init__.py +0 -0
  303. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/rf/ring_slot.s2p +0 -0
  304. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/rf/ring_slot_meas.s1p +0 -0
  305. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/rf/test_rf.py +0 -0
  306. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_adder.py +0 -0
  307. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_amplifier.py +0 -0
  308. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_block.py +0 -0
  309. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_bvp.py +0 -0
  310. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_comparator.py +0 -0
  311. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_constraint.py +0 -0
  312. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_converters.py +0 -0
  313. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_counter.py +0 -0
  314. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_ctrl.py +0 -0
  315. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_delay.py +0 -0
  316. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_differentiator.py +0 -0
  317. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_discrete.py +0 -0
  318. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_divider.py +0 -0
  319. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_dynsys.py +0 -0
  320. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_filters.py +0 -0
  321. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_fmu.py +0 -0
  322. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_function.py +0 -0
  323. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_integrator.py +0 -0
  324. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_kalman.py +0 -0
  325. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_logic.py +0 -0
  326. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_lti.py +0 -0
  327. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_math.py +0 -0
  328. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_multiplier.py +0 -0
  329. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_noise.py +0 -0
  330. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_ode.py +0 -0
  331. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_relay.py +0 -0
  332. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_rng.py +0 -0
  333. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_scope.py +0 -0
  334. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_sources.py +0 -0
  335. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_spectrum.py +0 -0
  336. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_switch.py +0 -0
  337. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_table.py +0 -0
  338. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/blocks/test_wrapper.py +0 -0
  339. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/events/__init__.py +0 -0
  340. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/events/test_condition.py +0 -0
  341. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/events/test_event.py +0 -0
  342. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/events/test_schedule.py +0 -0
  343. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/events/test_zerocrossing.py +0 -0
  344. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/optim/__init__.py +0 -0
  345. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/optim/test_anderson.py +0 -0
  346. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/optim/test_linearization.py +0 -0
  347. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/optim/test_newton.py +0 -0
  348. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/optim/test_numerical.py +0 -0
  349. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/optim/test_operator.py +0 -0
  350. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/__init__.py +0 -0
  351. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/_referenceproblems.py +0 -0
  352. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_bdf.py +0 -0
  353. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_dirk2.py +0 -0
  354. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_dirk3.py +0 -0
  355. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_esdirk32.py +0 -0
  356. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_esdirk4.py +0 -0
  357. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_esdirk43.py +0 -0
  358. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_esdirk54.py +0 -0
  359. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_esdirk85.py +0 -0
  360. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_euler.py +0 -0
  361. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_gear.py +0 -0
  362. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_rfk21.py +0 -0
  363. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_rk4.py +0 -0
  364. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_rkbs32.py +0 -0
  365. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_rkck54.py +0 -0
  366. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_rkdp54.py +0 -0
  367. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_rkdp87.py +0 -0
  368. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_rkf45.py +0 -0
  369. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_rkf78.py +0 -0
  370. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_rkv65.py +0 -0
  371. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_solver.py +0 -0
  372. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_ssprk22.py +0 -0
  373. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_ssprk33.py +0 -0
  374. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_ssprk34.py +0 -0
  375. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/solvers/test_steadystate.py +0 -0
  376. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/test_auto_initial_step.py +0 -0
  377. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/test_checkpoint.py +0 -0
  378. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/test_connection.py +0 -0
  379. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/test_diagnostics.py +0 -0
  380. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/test_simulation_pss.py +0 -0
  381. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/test_subsystem.py +0 -0
  382. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/utils/__init__.py +0 -0
  383. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/utils/test_adaptivebuffer.py +0 -0
  384. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/utils/test_analysis.py +0 -0
  385. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/utils/test_fmuwrapper.py +0 -0
  386. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/utils/test_gilbert.py +0 -0
  387. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/utils/test_logger.py +0 -0
  388. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/utils/test_mutable.py +0 -0
  389. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/utils/test_portreference.py +0 -0
  390. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/utils/test_progresstracker.py +0 -0
  391. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/utils/test_realtimeplotter.py +0 -0
  392. {pathsim-0.26.0 → pathsim-0.27.0}/tests/pathsim/utils/test_register.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pathsim
3
- Version: 0.26.0
3
+ Version: 0.27.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
@@ -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.26.0'
22
- __version_tuple__ = version_tuple = (0, 26, 0)
21
+ __version__ = version = '0.27.0'
22
+ __version_tuple__ = version_tuple = (0, 27, 0)
23
23
 
24
- __commit_id__ = commit_id = 'g7c5a82fa9'
24
+ __commit_id__ = commit_id = 'g2cbb2f919'
@@ -474,20 +474,54 @@ class MassMatrixDAE(Block):
474
474
  )
475
475
  self._x0 = x0
476
476
 
477
- #partition into differential (nonzero row) and algebraic (zero row) states
478
- _nonzero_row = np.any(M != 0.0, axis=1)
479
- self._d = np.flatnonzero(_nonzero_row)
480
- self._a = np.flatnonzero(~_nonzero_row)
477
+ #partition into differential (nonzero column) and algebraic (zero column) states
478
+ _nonzero_column = np.any(M != 0.0, axis=0)
479
+ self._d = np.flatnonzero(_nonzero_column)
480
+ self._a = np.flatnonzero(~_nonzero_column)
481
+
482
+ #partition into differential (nonzero row) and algebraic (zero row) equations
483
+ _non_zero_rows = np.any(M != 0.0, axis=1)
484
+ self._d_equations = np.flatnonzero(_non_zero_rows)
485
+ self._a_equations = np.flatnonzero(~_non_zero_rows)
481
486
 
482
487
  #index-1 form: differential rows must not weight algebraic derivatives
483
- if self._a.size and np.any(M[np.ix_(self._d, self._a)] != 0.0):
488
+ if self._a.size and np.any(M[np.ix_(self._d_equations, self._a)] != 0.0):
484
489
  raise ValueError(
485
490
  "mass matrix is not in index-1 form: differential rows couple "
486
491
  "to the derivatives of algebraic states"
487
492
  )
488
493
 
489
- #LU factorisation of the (constant) differential mass block
490
- self._lu = lu_factor(M[np.ix_(self._d, self._d)])
494
+ #factorise the constant differential mass block when it is square; use
495
+ #the pseudoinverse for rectangular reduced systems so underdetermined
496
+ #differential blocks still admit a minimum-norm solution.
497
+ self._d_mass = M[np.ix_(self._d_equations, self._d)]
498
+ if self._d_mass.shape[0] == self._d_mass.shape[1]:
499
+ self._lu = lu_factor(self._d_mass)
500
+ self._solve_mass_rhs = lambda rhs: lu_solve(self._lu, rhs)
501
+ self._solve_mass_matrix = lambda mat: lu_solve(self._lu, mat)
502
+ else:
503
+ # Use SVD once and apply the pseudoinverse implicitly for stability
504
+ # and to avoid forming a dense pseudoinverse matrix.
505
+ U, s, Vt = np.linalg.svd(self._d_mass, full_matrices=False)
506
+ eps = np.finfo(float).eps
507
+ tol = max(self._d_mass.shape) * (s.max() if s.size else 0.0) * eps
508
+ s_inv = np.array([1.0/si if si > tol else 0.0 for si in s])
509
+
510
+ # store factors (optional) and set solver callables
511
+ self._svd_U = U
512
+ self._svd_s_inv = s_inv
513
+ self._svd_Vt = Vt
514
+
515
+ def _solve_mass_rhs(rhs):
516
+ # rhs can be vector or matrix; apply V * S_inv * (U.T @ rhs)
517
+ return (Vt.T * s_inv) @ (U.T @ rhs)
518
+
519
+ def _solve_mass_matrix(mat):
520
+ # mat: matrix of columns to be solved
521
+ return (Vt.T * s_inv) @ (U.T @ mat)
522
+
523
+ self._solve_mass_rhs = _solve_mass_rhs
524
+ self._solve_mass_matrix = _solve_mass_matrix
491
525
 
492
526
  #the engine integrates only the differential states
493
527
  self.initial_value = x0[self._d]
@@ -503,7 +537,9 @@ class MassMatrixDAE(Block):
503
537
  #when 'jac' is given, otherwise the operator falls back to finite differences
504
538
  _jac_x = None
505
539
  if self._a.size == 0 and jac is not None:
506
- _jac_x = lambda x, u, t: lu_solve(self._lu, np.atleast_2d(jac(x, u, t)))
540
+ def _jac_x(x, u, t):
541
+ J = np.atleast_2d(jac(x, u, t))[np.ix_(self._d_equations, self._d)]
542
+ return self._solve_mass_matrix(J)
507
543
  self.op_dyn = DynamicOperator(func=self._rhs, jac_x=_jac_x)
508
544
 
509
545
  #pre-size the output register to the full state
@@ -609,7 +645,7 @@ class MassMatrixDAE(Block):
609
645
  xa = self._solve_xa(x_d, u, t)
610
646
  x = np.empty(self.mass.shape[0])
611
647
  x[self._d], x[self._a] = x_d, xa
612
- return lu_solve(self._lu, self.func(x, u, t)[self._d])
648
+ return self._solve_mass_rhs(self.func(x, u, t)[self._d_equations])
613
649
 
614
650
 
615
651
  def update(self, t):
@@ -646,7 +682,8 @@ class MassMatrixDAE(Block):
646
682
 
647
683
  #commit the warm-start at the current state, then linearize around it
648
684
  self._xa = self._solve_xa(x_d, u, t)
649
- f = lu_solve(self._lu, self.func(self._full(x_d), u, t)[self._d])
685
+ f = self._solve_mass_rhs(self.func(self._full(x_d), u, t)[self._d_equations])
686
+
650
687
  J = self.op_dyn.jac_x(x_d, u, t)
651
688
 
652
689
  return self.engine.solve(f, J, dt)
@@ -673,7 +710,7 @@ class MassMatrixDAE(Block):
673
710
  """
674
711
  x_d, u = self.engine.state, self.inputs.to_array()
675
712
  self._xa = self._solve_xa(x_d, u, t)
676
- f = lu_solve(self._lu, self.func(self._full(x_d), u, t)[self._d])
713
+ f = self._solve_mass_rhs(self.func(self._full(x_d), u, t)[self._d_equations])
677
714
  return self.engine.step(f, dt)
678
715
 
679
716
 
@@ -331,19 +331,22 @@ class Graph:
331
331
  """Optimized loop processing with minimal overhead.
332
332
 
333
333
  Finds strongly connected components (SCCs) within the loop blocks, determines
334
- entry points for each SCC, and performs BFS to assign local depths. Identifies
334
+ entry points for each SCC, and performs BFS to assign local depths. Includes
335
+ acyclic descendants in dependency order alongside cycles. Identifies
335
336
  loop-closing connections (back edges) that need special handling.
336
337
 
337
338
  Parameters
338
339
  ----------
339
340
  blocks_loop : set
340
- set of blocks that are part of algebraic loops
341
+ set of blocks that are part of or depend on algebraic loops
341
342
  """
342
343
  if not blocks_loop:
343
344
  return
344
345
 
345
- # Find SCCs (already optimized)
346
- sccs = self._find_strongly_connected_components(blocks_loop)
346
+ # Tarjan emits downstream components before their upstream dependencies.
347
+ # Reverse that order so each component receives updated upstream outputs
348
+ # before it is evaluated in the same loop-solver iteration.
349
+ sccs = reversed(self._find_strongly_connected_components(blocks_loop))
347
350
 
348
351
  current_depth = 0
349
352
 
@@ -433,7 +436,7 @@ class Graph:
433
436
  def _find_strongly_connected_components(self, blocks):
434
437
  """Iterative Tarjan's algorithm using cleaner state machine.
435
438
 
436
- Finds strongly connected components (cycles) within the given blocks using
439
+ Finds all strongly connected components within the given blocks using
437
440
  an iterative implementation of Tarjan's algorithm. Avoids recursion limits
438
441
  that can occur with deep graphs.
439
442
 
@@ -445,7 +448,7 @@ class Graph:
445
448
  Returns
446
449
  -------
447
450
  list
448
- list of SCCs, where each SCC is a list of blocks forming a cycle
451
+ list of SCCs in reverse topological order, including acyclic singletons
449
452
  """
450
453
  if not blocks:
451
454
  return []
@@ -508,11 +511,12 @@ class Graph:
508
511
  if w == node:
509
512
  break
510
513
 
511
- # Keep only actual cycles
512
- if len(scc) > 1:
513
- result.append(scc)
514
- elif scc[0] in successors_cache[scc[0]]:
515
- result.append(scc)
514
+ # A block downstream of a loop can form a singleton SCC
515
+ # without being part of a cycle. Its loop dependency keeps
516
+ # it out of the ordinary DAG schedule, so discarding it here
517
+ # would leave it unevaluated. Keep it in the loop schedule;
518
+ # only actual cycle-closing connections receive acceleration.
519
+ result.append(scc)
516
520
 
517
521
  # Update parent's lowlink if there is a parent
518
522
  if work_stack:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pathsim
3
- Version: 0.26.0
3
+ Version: 0.27.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
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.27.0",
3
+ "distance": 0,
4
+ "node": "g2cbb2f9191f0a2aeaa2154b3a54601c2ca92ea6b",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-10-04"
8
+ }
@@ -272,9 +272,6 @@ class TestMassMatrixDAE(unittest.TestCase):
272
272
  MassMatrixDAE(func, np.ones((2, 3)), initial_value=[0.0, 0.0])
273
273
  with self.assertRaises(ValueError):
274
274
  MassMatrixDAE(func, np.eye(2), initial_value=[0.0])
275
- M_bad = np.array([[1.0, 1.0], [0.0, 0.0]])
276
- with self.assertRaises(ValueError):
277
- MassMatrixDAE(func, M_bad, initial_value=[0.0, 0.0])
278
275
 
279
276
  def test_passthrough(self):
280
277
  dae_ns = MassMatrixDAE(lambda x, u, t: -x, np.eye(2), [1.0, 1.0])
@@ -293,6 +290,7 @@ class TestMassMatrixDAE(unittest.TestCase):
293
290
  dae.reset()
294
291
  np.testing.assert_array_equal(dae._xa, dae._x0[dae._a])
295
292
 
293
+
296
294
  def test_info(self):
297
295
  info = MassMatrixDAE.info()
298
296
  self.assertEqual(info["type"], "MassMatrixDAE")
@@ -348,6 +346,21 @@ class TestMassMatrixDAE(unittest.TestCase):
348
346
  sim.run(1.0)
349
347
  self.assertAlmostEqual(float(dae.engine.state[0]), np.exp(-0.5), places=4)
350
348
 
349
+ def test_nonsymmetric_singular(self):
350
+ from pathsim import Simulation, Connection
351
+ from pathsim.blocks import Constant, Scope
352
+ M = np.array([[1.0, 1.0], [0.0, 0.0]])
353
+ func = lambda x, u, t: np.array([1., x[0] - x[1]])
354
+ dae = MassMatrixDAE(func, M, initial_value=[0.0, 0.0])
355
+ sco = Scope()
356
+ sim = Simulation(
357
+ blocks=[dae, sco],
358
+ connections=[Connection(dae[0], sco[0])],
359
+ dt=0.01, Solver=ESDIRK43, log=False
360
+ )
361
+ sim.run(1.0)
362
+ np.testing.assert_allclose(dae.outputs.to_array(), [0.5, 0.5], atol=1e-3)
363
+
351
364
  def test_simulation_singular_with_input(self):
352
365
  #x0' = -x0 + x1, 0 = x0 + x1 - u => steady state x -> u/2
353
366
  from pathsim import Simulation, Connection
@@ -51,6 +51,78 @@ class TestSimulation(unittest.TestCase):
51
51
  only very minimal functonality
52
52
  """
53
53
 
54
+ def test_algebraic_loop_downstream_chain(self):
55
+ """Evaluate acyclic descendants of a converged algebraic loop."""
56
+ a = Function(lambda b: 0.5 * b + 1)
57
+ b = Function(lambda a: 0.5 * a)
58
+ c = Function(lambda a: a + 10)
59
+ d = Function(lambda c: 2 * c)
60
+ simulation = Simulation(
61
+ blocks=[d, c, b, a],
62
+ connections=[
63
+ Connection(a, b), Connection(b, a),
64
+ Connection(a, c), Connection(c, d),
65
+ ],
66
+ log=False,
67
+ )
68
+ simulation.run(0.01)
69
+
70
+ self.assertAlmostEqual(a.outputs[0], 4 / 3)
71
+ self.assertAlmostEqual(b.outputs[0], 2 / 3)
72
+ self.assertAlmostEqual(c.outputs[0], 4 / 3 + 10)
73
+ self.assertAlmostEqual(d.outputs[0], 2 * (4 / 3 + 10))
74
+
75
+
76
+ def test_algebraic_loop_downstream_merge(self):
77
+ """Propagate both branches before evaluating their merged output."""
78
+ a = Function(lambda a: 0.5 * a + 1)
79
+ short = Function(lambda a: a + 10)
80
+ long = Function(lambda a: 3 * a)
81
+ end = Function(lambda value: value + 20)
82
+ merge = Adder()
83
+ simulation = Simulation(
84
+ blocks=[merge, end, long, short, a],
85
+ connections=[
86
+ Connection(a, a), Connection(a, short), Connection(a, long),
87
+ Connection(long, end),
88
+ Connection(short, merge[0]), Connection(end, merge[1]),
89
+ ],
90
+ log=False,
91
+ )
92
+ simulation.run(0.01)
93
+
94
+ self.assertAlmostEqual(a.outputs[0], 2)
95
+ self.assertAlmostEqual(short.outputs[0], 12)
96
+ self.assertAlmostEqual(end.outputs[0], 26)
97
+ self.assertAlmostEqual(merge.outputs[0], 38)
98
+
99
+
100
+ def test_connected_algebraic_loops_with_downstream_blocks(self):
101
+ """Evaluate a second feedback loop after its upstream loop and bridge."""
102
+ a = Function(lambda b: 0.5 * b + 1)
103
+ b = Function(lambda a: 0.5 * a)
104
+ bridge = Function(lambda a: a)
105
+ c = Function(lambda upstream, d: upstream + 0.5 * d)
106
+ d = Function(lambda c: 0.5 * c)
107
+ tail = Function(lambda c: c + 10)
108
+ simulation = Simulation(
109
+ blocks=[tail, d, c, bridge, b, a],
110
+ connections=[
111
+ Connection(a, b), Connection(b, a), Connection(a, bridge),
112
+ Connection(bridge, c[0]), Connection(c, d), Connection(d, c[1]),
113
+ Connection(c, tail),
114
+ ],
115
+ log=False,
116
+ )
117
+ simulation.run(0.01)
118
+
119
+ self.assertAlmostEqual(a.outputs[0], 4 / 3)
120
+ self.assertAlmostEqual(bridge.outputs[0], 4 / 3)
121
+ self.assertAlmostEqual(c.outputs[0], 16 / 9)
122
+ self.assertAlmostEqual(d.outputs[0], 8 / 9)
123
+ self.assertAlmostEqual(tail.outputs[0], 16 / 9 + 10)
124
+
125
+
54
126
  def test_init_default(self):
55
127
 
56
128
  #test default initialization
@@ -478,6 +478,73 @@ class TestGraph(unittest.TestCase):
478
478
  self.assertEqual(len(g), 4)
479
479
 
480
480
 
481
+ def test_loop_downstream_chain(self):
482
+ """Schedule every loop-dependent block after its upstream component."""
483
+ a, b, c, d = [Amplifier(0.5) for _ in range(4)]
484
+ connections = [
485
+ Connection(a, b), Connection(b, a),
486
+ Connection(a, c), Connection(c, d),
487
+ ]
488
+ graph = Graph([d, c, b, a], connections)
489
+ levels = {block: depth for depth, blocks, _ in graph.loop() for block in blocks}
490
+
491
+ self.assertEqual(set(levels), {a, b, c, d})
492
+ self.assertGreater(levels[c], max(levels[a], levels[b]))
493
+ self.assertGreater(levels[d], levels[c])
494
+ self.assertEqual(len(graph.loop_closing_connections()), 1)
495
+
496
+
497
+ def test_loop_downstream_merge(self):
498
+ """Merged branches wait for both of their loop-dependent inputs."""
499
+ a, b, c, d, e = [Amplifier(0.5) for _ in range(5)]
500
+ merge = Adder()
501
+ connections = [
502
+ Connection(a, b), Connection(b, a),
503
+ Connection(a, c), Connection(a, d), Connection(d, e),
504
+ Connection(c, merge[0]), Connection(e, merge[1]),
505
+ ]
506
+ blocks = [merge, e, d, c, b, a]
507
+ graph = Graph(blocks, connections)
508
+ levels = {block: depth for depth, nodes, _ in graph.loop() for block in nodes}
509
+
510
+ self.assertEqual(set(levels), set(blocks))
511
+ self.assertGreater(levels[merge], max(levels[c], levels[e]))
512
+ self.assertGreater(levels[e], levels[d])
513
+ self.assertEqual(len(graph.loop_closing_connections()), 1)
514
+
515
+
516
+ def test_connected_loops_with_downstream_blocks(self):
517
+ """Order connected cycles and the acyclic blocks between them."""
518
+ a, b, bridge, c, d, tail = [Adder() for _ in range(6)]
519
+ connections = [
520
+ Connection(a, b), Connection(b, a), Connection(a, bridge),
521
+ Connection(bridge, c[0]), Connection(c, d), Connection(d, c[1]),
522
+ Connection(c, tail),
523
+ ]
524
+ blocks = [tail, d, c, bridge, b, a]
525
+ graph = Graph(blocks, connections)
526
+ levels = {block: depth for depth, nodes, _ in graph.loop() for block in nodes}
527
+
528
+ self.assertEqual(set(levels), set(blocks))
529
+ self.assertGreater(levels[bridge], max(levels[a], levels[b]))
530
+ self.assertGreater(min(levels[c], levels[d]), levels[bridge])
531
+ self.assertGreater(levels[tail], max(levels[c], levels[d]))
532
+ self.assertEqual(len(graph.loop_closing_connections()), 2)
533
+
534
+
535
+ def test_self_loop_with_downstream_block(self):
536
+ """Keep a self-loop's accelerator without treating its tail as a cycle."""
537
+ a, tail = Amplifier(0.5), Amplifier(2)
538
+ feedback = Connection(a, a)
539
+ downstream = Connection(a, tail)
540
+ graph = Graph([tail, a], [feedback, downstream])
541
+ levels = {block: depth for depth, nodes, _ in graph.loop() for block in nodes}
542
+
543
+ self.assertEqual(set(levels), {a, tail})
544
+ self.assertGreater(levels[tail], levels[a])
545
+ self.assertEqual(graph.loop_closing_connections(), [feedback])
546
+
547
+
481
548
  def test_dag_empty_when_only_loops(self):
482
549
  """Test that DAG is empty when graph only contains loops."""
483
550
 
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "0.26.0",
3
- "distance": 0,
4
- "node": "g7c5a82fa9c55230285135deccbf851ad602818fe",
5
- "dirty": false,
6
- "branch": "HEAD",
7
- "node_date": "2026-09-30"
8
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes