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.
- pathsim-0.25.0/.github/pull_request_template.md +22 -0
- pathsim-0.25.0/CONTRIBUTING.md +64 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/PKG-INFO +2 -1
- {pathsim-0.23.2 → pathsim-0.25.0}/README.md +1 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/_version.py +3 -3
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/_block.py +127 -6
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/comparator.py +3 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/converters.py +8 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/counter.py +3 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/delay.py +4 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/discrete.py +28 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/dynsys.py +2 -1
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/integrator.py +40 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/logic.py +4 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/lti.py +15 -3
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/math.py +7 -3
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/ode.py +38 -4
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/relay.py +16 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/rng.py +3 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/scope.py +30 -35
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/switch.py +3 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/events/schedule.py +80 -12
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/exceptions.py +35 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/optim/anderson.py +113 -10
- pathsim-0.25.0/src/pathsim/optim/linearization.py +310 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/simulation.py +82 -1
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/subsystem.py +174 -3
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/fmuwrapper.py +4 -2
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/register.py +7 -1
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim.egg-info/PKG-INFO +2 -1
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim.egg-info/SOURCES.txt +4 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim.egg-info/scm_file_list.json +433 -429
- pathsim-0.25.0/src/pathsim.egg-info/scm_version.json +8 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_dynsys.py +9 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_function.py +40 -3
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_math.py +13 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_relay.py +14 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_scope.py +62 -2
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_table.py +9 -8
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_wrapper.py +3 -1
- pathsim-0.25.0/tests/pathsim/events/test_schedule.py +338 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/optim/test_anderson.py +75 -1
- pathsim-0.25.0/tests/pathsim/optim/test_linearization.py +545 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/test_simulation.py +94 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/test_subsystem.py +29 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/utils/test_fmuwrapper.py +14 -6
- pathsim-0.23.2/src/pathsim.egg-info/scm_version.json +0 -8
- pathsim-0.23.2/tests/pathsim/events/test_schedule.py +0 -174
- {pathsim-0.23.2 → pathsim-0.25.0}/.codecov.yml +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/.github/FUNDING.yml +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/.github/workflows/pypi_deployment.yml +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/.github/workflows/tests_codecov.yml +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/.github/workflows/urlchecker.yml +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/.gitignore +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/CITATION.cff +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/LICENSE.txt +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/conftest.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/.readthedocs.yaml +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/Makefile +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/requirements.txt +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/_ext/github_issues.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/_static/custom.css +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/_static/redirect.js +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/api.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/conf.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/contributing.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/abs_braking.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/algebraic_loop.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/billards.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/bouncing_ball.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/bouncing_pendulum.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/cascade_controller.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/checkpoints.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/chemical_reactor.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/coupled_oscillators.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/data/BouncingBall_ME.fmu +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/data/CoupledClutches_CS_linux64.fmu +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/data/CoupledClutches_CS_win64.fmu +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/data/Dahlquist.fmu +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/data/VanDerPol_ME.fmu +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/dcmotor_control.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/delta_sigma_adc.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/diode_circuit.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/elastic_pendulum.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/algebraicloop_blockdiagram_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/billard_circle_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/bouncing_ball_blockdiagram_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/bouncing_ball_both_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/bouncing_ball_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/bouncing_ball_result_events_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/bouncing_ball_result_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/bouncing_ball_result_timesteps_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/bouncing_pendulum_blockdiagram_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/cascade_blockdiagram_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/coupled_oscillators_blockdiagram_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/coupled_oscillators_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/delta_sigma_blockdiagram_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/diode_blockdiagram_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/elastic_pendulum_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/fmcw_blockdiagram_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/fmcw_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/harmonic_oscillator_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/harmonic_oscillator_result_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/kalman_filter_blockdiagram_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/linear_feedback_blockdiagram_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/linear_feedback_result_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/linear_feedback_result_sensitivity_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/miller_frequency_divider_blockdiagram_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/nonlinear_noisy_amplifier_blockdiagram_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/ode_blockdiagram_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/pendulum_blockdiagram_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/pid_blockdiagram_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/sar_adc_blockdiagram_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/stick_slip_blockdiagram_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/stick_slip_blockdiagram_slip_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/stick_slip_blockdiagram_stick_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/stick_slip_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/thermostat_blockdiagram_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/vanderpol_blockdiagram_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/vanderpol_result_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/vanderpol_subsystem_blockdiagram_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/vanderpol_subsystem_lvl1_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/vanderpol_subsystem_lvl2_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/vanderpol_subsystem_lvl3_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/figures_g/volterralotka_blockdiagram_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/ode_blockdiagram_2.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/stick_slip_blockdiagram_slip.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/figures/stick_slip_blockdiagram_stick.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/fmcw_radar.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/fmu_cosimulation.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/fmu_model_exchange_bouncing_ball.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/fmu_model_exchange_vanderpol.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/harmonic_oscillator.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/kalman_filter.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/linear_feedback.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/lorenz_attractor.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/nested_subsystems.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/noisy_amplifier.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/pendulum.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/pid_controller.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/poincare_maps.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/rf_network_oneport.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/sar_adc.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/spectrum_analysis.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/stick_slip.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/switched_bouncing_ball.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/thermostat.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/transfer_function.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples/vanderpol.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/examples.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/figures/pathsim_object_hierarchy_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/figures/pathsim_solver_hierarchy_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/figures/sin_cos_blockdiagram_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/figures/system_g.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/index.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/logos/pathsim_icon.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/logos/pathsim_logo.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/logos/pathsim_simplistic_logo.png +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks._block.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.adder.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.amplifier.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.comparator.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.converters.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.counter.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.ctrl.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.delay.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.differentiator.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.discrete.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.dynsys.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.filters.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.fmu.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.function.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.integrator.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.kalman.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.lti.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.math.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.multiplier.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.noise.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.ode.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.relay.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.rf.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.rng.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.scope.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.sources.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.spectrum.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.switch.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.table.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.blocks.wrapper.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.connection.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.events._event.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.events.condition.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.events.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.events.schedule.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.events.zerocrossing.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.optim.anderson.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.optim.booster.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.optim.numerical.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.optim.operator.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.optim.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.simulation.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers._rungekutta.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers._solver.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.bdf.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.dirk2.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.dirk3.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.esdirk32.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.esdirk4.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.esdirk43.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.esdirk54.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.esdirk85.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.euler.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.gear.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.rk4.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.rkbs32.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.rkck54.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.rkdp54.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.rkdp87.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.rkf21.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.rkf45.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.rkf78.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.rkv65.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.ssprk22.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.ssprk33.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.ssprk34.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.solvers.steadystate.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.subsystem.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.utils.adaptivebuffer.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.utils.analysis.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.utils.gilbert.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.utils.logger.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.utils.portreference.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.utils.progresstracker.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.utils.realtimeplotter.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.utils.register.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/modules/pathsim.utils.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/pathsim_docs.mplstyle +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/quickstart.ipynb +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/roadmap.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/docs/source/roadmap_generated.rst +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_abs_braking.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_adc.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_algebraicchain.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_algebraicloop.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_cascade.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_dcmotor.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_deltasigma.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_derivative.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_diode.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_dualslope.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_elastic_pendulum.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_feedback.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_filters.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_harmonic_oscillator.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_kalman_filter.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_nested_subsystems.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_noise.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_pendulum.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_phasenoise.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_pid.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_pid_antiwindup.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_pid_vs_discretePID.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_radar.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_reactor.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_sar.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_solar.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_solver_hotswap.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_spectrum.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_spectrum_rf_oneport.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_steadystate.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_stickslip.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_transferfunction.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/example_vanderpol_subsystem.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_event/example_billards_sphere.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_event/example_bouncing_pendulum.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_event/example_bouncingball.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_event/example_bouncingball_friction.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_event/example_bouncingball_switched.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_event/example_integrator_reset.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_event/example_pulse.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_event/example_stickslip_event.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_event/example_thermostat.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_event/example_volterralotka_event.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_bonhoeffer_vanderpol.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_brusselator.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_chemical.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_duffing.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_fairen_velarde.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_fitzhughnagumo.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_flame.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_glycolysis.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_lorenz.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_morse.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_robertson.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_roessler.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_thomas_cyclic.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_vanderpol.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/examples/examples_odes/example_volterralotka.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/git +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/pyproject.toml +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/setup.cfg +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/__init__.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/_constants.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/README.md +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/__init__.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/adder.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/amplifier.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/bvp.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/constraint.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/ctrl.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/dae.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/differentiator.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/divider.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/filters.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/fmu.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/function.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/kalman.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/multiplier.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/noise.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/rf.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/sources.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/spectrum.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/table.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/blocks/wrapper.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/connection.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/events/__init__.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/events/_event.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/events/condition.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/events/zerocrossing.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/optim/__init__.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/optim/booster.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/optim/newton.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/optim/numerical.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/optim/operator.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/README.md +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/__init__.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/_rungekutta.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/_solver.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/bdf.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/dirk2.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/dirk3.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/esdirk32.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/esdirk4.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/esdirk43.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/esdirk54.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/esdirk85.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/euler.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/gear.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/rk4.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/rkbs32.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/rkck54.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/rkdp54.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/rkdp87.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/rkf21.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/rkf45.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/rkf78.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/rkv65.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/ssprk22.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/ssprk33.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/ssprk34.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/solvers/steadystate.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/__init__.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/adaptivebuffer.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/analysis.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/deprecation.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/diagnostics.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/gilbert.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/graph.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/logger.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/mutable.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/portreference.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/progresstracker.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim/utils/realtimeplotter.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim.egg-info/dependency_links.txt +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim.egg-info/requires.txt +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/src/pathsim.egg-info/top_level.txt +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/README.md +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/__init__.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/CoupledClutches_CS.fmu +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/__init__.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/conftest.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_algebraic_system.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_bouncingball_friction_event_system.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_bouncingball_system.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_brusselator_system.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_cosim_fmu_system.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_counter_comparator_system.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_dynamical_system_ivp.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_fitzhughnagumo_system.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_harmonic_oscillator_system.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_linear_feedback_system.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_logic_system.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_lorenz_system.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_me_analytical.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_model_exchange_fmu_system.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_pid_system.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_relay_thermostat_system.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_rescale_delay_system.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_robertson_system.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_roessler_system.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_signal_processing_system.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_steadystate_transient_system.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_switch_lti_system.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_vanderpol_system.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/evals/test_volterralotka_system.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/__init__.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/__init__.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/_embedding.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/rf/__init__.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/rf/ring_slot.s2p +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/rf/ring_slot_meas.s1p +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/rf/test_rf.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_adder.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_amplifier.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_block.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_bvp.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_comparator.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_constraint.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_converters.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_counter.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_ctrl.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_dae.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_delay.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_differentiator.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_discrete.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_divider.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_filters.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_fmu.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_integrator.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_kalman.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_logic.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_lti.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_multiplier.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_noise.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_ode.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_rng.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_sources.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_spectrum.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/blocks/test_switch.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/events/__init__.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/events/test_condition.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/events/test_event.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/events/test_zerocrossing.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/optim/__init__.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/optim/test_newton.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/optim/test_numerical.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/optim/test_operator.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/__init__.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/_referenceproblems.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_bdf.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_dirk2.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_dirk3.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_esdirk32.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_esdirk4.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_esdirk43.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_esdirk54.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_esdirk85.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_euler.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_gear.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_rfk21.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_rk4.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_rkbs32.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_rkck54.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_rkdp54.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_rkdp87.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_rkf45.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_rkf78.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_rkv65.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_solver.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_ssprk22.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_ssprk33.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_ssprk34.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/solvers/test_steadystate.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/test_auto_initial_step.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/test_checkpoint.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/test_connection.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/test_diagnostics.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/test_simulation_pss.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/utils/__init__.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/utils/test_adaptivebuffer.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/utils/test_analysis.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/utils/test_gilbert.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/utils/test_graph.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/utils/test_logger.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/utils/test_mutable.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/utils/test_portreference.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/utils/test_progresstracker.py +0 -0
- {pathsim-0.23.2 → pathsim-0.25.0}/tests/pathsim/utils/test_realtimeplotter.py +0 -0
- {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.
|
|
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.
|
|
22
|
-
__version_tuple__ = version_tuple = (0,
|
|
21
|
+
__version__ = version = '0.25.0'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 25, 0)
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
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:
|
|
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
|
|
|
@@ -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
|
|
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
|
|
|
@@ -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 :
|
|
605
|
-
matrix, 2d array
|
|
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
|