Full Code of milanofthe/pathsim for AI

master a4b415d98d0d cached
413 files
6.9 MB
1.8M tokens
2359 symbols
1 requests
Download .txt
Showing preview only (7,302K chars total). Download the full file or copy to clipboard to get everything.
Repository: milanofthe/pathsim
Branch: master
Commit: a4b415d98d0d
Files: 413
Total size: 6.9 MB

Directory structure:
gitextract_8xwsjhq7/

├── .codecov.yml
├── .github/
│   ├── FUNDING.yml
│   └── workflows/
│       ├── pypi_deployment.yml
│       ├── tests_codecov.yml
│       └── urlchecker.yml
├── .gitignore
├── CITATION.cff
├── LICENSE.txt
├── README.md
├── conftest.py
├── docs/
│   ├── .readthedocs.yaml
│   ├── Makefile
│   ├── requirements.txt
│   └── source/
│       ├── _ext/
│       │   └── github_issues.py
│       ├── _static/
│       │   ├── custom.css
│       │   └── redirect.js
│       ├── api.rst
│       ├── conf.py
│       ├── contributing.rst
│       ├── examples/
│       │   ├── abs_braking.ipynb
│       │   ├── algebraic_loop.ipynb
│       │   ├── billards.ipynb
│       │   ├── bouncing_ball.ipynb
│       │   ├── bouncing_pendulum.ipynb
│       │   ├── cascade_controller.ipynb
│       │   ├── checkpoints.ipynb
│       │   ├── chemical_reactor.ipynb
│       │   ├── coupled_oscillators.ipynb
│       │   ├── data/
│       │   │   ├── BouncingBall_ME.fmu
│       │   │   ├── CoupledClutches_CS_linux64.fmu
│       │   │   ├── CoupledClutches_CS_win64.fmu
│       │   │   ├── Dahlquist.fmu
│       │   │   └── VanDerPol_ME.fmu
│       │   ├── dcmotor_control.ipynb
│       │   ├── delta_sigma_adc.ipynb
│       │   ├── diode_circuit.ipynb
│       │   ├── elastic_pendulum.ipynb
│       │   ├── fmcw_radar.ipynb
│       │   ├── fmu_cosimulation.ipynb
│       │   ├── fmu_model_exchange_bouncing_ball.ipynb
│       │   ├── fmu_model_exchange_vanderpol.ipynb
│       │   ├── harmonic_oscillator.ipynb
│       │   ├── kalman_filter.ipynb
│       │   ├── linear_feedback.ipynb
│       │   ├── lorenz_attractor.ipynb
│       │   ├── nested_subsystems.ipynb
│       │   ├── noisy_amplifier.ipynb
│       │   ├── pendulum.ipynb
│       │   ├── pid_controller.ipynb
│       │   ├── poincare_maps.ipynb
│       │   ├── rf_network_oneport.ipynb
│       │   ├── sar_adc.ipynb
│       │   ├── spectrum_analysis.ipynb
│       │   ├── stick_slip.ipynb
│       │   ├── switched_bouncing_ball.ipynb
│       │   ├── thermostat.ipynb
│       │   ├── transfer_function.ipynb
│       │   └── vanderpol.ipynb
│       ├── examples.rst
│       ├── index.rst
│       ├── modules/
│       │   ├── pathsim.blocks._block.rst
│       │   ├── pathsim.blocks.adder.rst
│       │   ├── pathsim.blocks.amplifier.rst
│       │   ├── pathsim.blocks.comparator.rst
│       │   ├── pathsim.blocks.converters.rst
│       │   ├── pathsim.blocks.counter.rst
│       │   ├── pathsim.blocks.ctrl.rst
│       │   ├── pathsim.blocks.delay.rst
│       │   ├── pathsim.blocks.differentiator.rst
│       │   ├── pathsim.blocks.discrete.rst
│       │   ├── pathsim.blocks.dynsys.rst
│       │   ├── pathsim.blocks.filters.rst
│       │   ├── pathsim.blocks.fmu.rst
│       │   ├── pathsim.blocks.function.rst
│       │   ├── pathsim.blocks.integrator.rst
│       │   ├── pathsim.blocks.kalman.rst
│       │   ├── pathsim.blocks.lti.rst
│       │   ├── pathsim.blocks.math.rst
│       │   ├── pathsim.blocks.multiplier.rst
│       │   ├── pathsim.blocks.noise.rst
│       │   ├── pathsim.blocks.ode.rst
│       │   ├── pathsim.blocks.relay.rst
│       │   ├── pathsim.blocks.rf.rst
│       │   ├── pathsim.blocks.rng.rst
│       │   ├── pathsim.blocks.rst
│       │   ├── pathsim.blocks.scope.rst
│       │   ├── pathsim.blocks.sources.rst
│       │   ├── pathsim.blocks.spectrum.rst
│       │   ├── pathsim.blocks.switch.rst
│       │   ├── pathsim.blocks.table.rst
│       │   ├── pathsim.blocks.wrapper.rst
│       │   ├── pathsim.connection.rst
│       │   ├── pathsim.events._event.rst
│       │   ├── pathsim.events.condition.rst
│       │   ├── pathsim.events.rst
│       │   ├── pathsim.events.schedule.rst
│       │   ├── pathsim.events.zerocrossing.rst
│       │   ├── pathsim.optim.anderson.rst
│       │   ├── pathsim.optim.booster.rst
│       │   ├── pathsim.optim.numerical.rst
│       │   ├── pathsim.optim.operator.rst
│       │   ├── pathsim.optim.rst
│       │   ├── pathsim.simulation.rst
│       │   ├── pathsim.solvers._rungekutta.rst
│       │   ├── pathsim.solvers._solver.rst
│       │   ├── pathsim.solvers.bdf.rst
│       │   ├── pathsim.solvers.dirk2.rst
│       │   ├── pathsim.solvers.dirk3.rst
│       │   ├── pathsim.solvers.esdirk32.rst
│       │   ├── pathsim.solvers.esdirk4.rst
│       │   ├── pathsim.solvers.esdirk43.rst
│       │   ├── pathsim.solvers.esdirk54.rst
│       │   ├── pathsim.solvers.esdirk85.rst
│       │   ├── pathsim.solvers.euler.rst
│       │   ├── pathsim.solvers.gear.rst
│       │   ├── pathsim.solvers.rk4.rst
│       │   ├── pathsim.solvers.rkbs32.rst
│       │   ├── pathsim.solvers.rkck54.rst
│       │   ├── pathsim.solvers.rkdp54.rst
│       │   ├── pathsim.solvers.rkdp87.rst
│       │   ├── pathsim.solvers.rkf21.rst
│       │   ├── pathsim.solvers.rkf45.rst
│       │   ├── pathsim.solvers.rkf78.rst
│       │   ├── pathsim.solvers.rkv65.rst
│       │   ├── pathsim.solvers.rst
│       │   ├── pathsim.solvers.ssprk22.rst
│       │   ├── pathsim.solvers.ssprk33.rst
│       │   ├── pathsim.solvers.ssprk34.rst
│       │   ├── pathsim.solvers.steadystate.rst
│       │   ├── pathsim.subsystem.rst
│       │   ├── pathsim.utils.adaptivebuffer.rst
│       │   ├── pathsim.utils.analysis.rst
│       │   ├── pathsim.utils.gilbert.rst
│       │   ├── pathsim.utils.logger.rst
│       │   ├── pathsim.utils.portreference.rst
│       │   ├── pathsim.utils.progresstracker.rst
│       │   ├── pathsim.utils.realtimeplotter.rst
│       │   ├── pathsim.utils.register.rst
│       │   └── pathsim.utils.rst
│       ├── pathsim_docs.mplstyle
│       ├── quickstart.ipynb
│       ├── roadmap.rst
│       └── roadmap_generated.rst
├── examples/
│   ├── example_abs_braking.py
│   ├── example_adc.py
│   ├── example_algebraicchain.py
│   ├── example_algebraicloop.py
│   ├── example_cascade.py
│   ├── example_dcmotor.py
│   ├── example_deltasigma.py
│   ├── example_derivative.py
│   ├── example_diode.py
│   ├── example_dualslope.py
│   ├── example_elastic_pendulum.py
│   ├── example_feedback.py
│   ├── example_filters.py
│   ├── example_harmonic_oscillator.py
│   ├── example_kalman_filter.py
│   ├── example_nested_subsystems.py
│   ├── example_noise.py
│   ├── example_pendulum.py
│   ├── example_phasenoise.py
│   ├── example_pid.py
│   ├── example_pid_antiwindup.py
│   ├── example_pid_vs_discretePID.py
│   ├── example_radar.py
│   ├── example_reactor.py
│   ├── example_sar.py
│   ├── example_solar.py
│   ├── example_solver_hotswap.py
│   ├── example_spectrum.py
│   ├── example_spectrum_rf_oneport.py
│   ├── example_steadystate.py
│   ├── example_stickslip.py
│   ├── example_transferfunction.py
│   ├── example_vanderpol_subsystem.py
│   ├── examples_event/
│   │   ├── example_billards_sphere.py
│   │   ├── example_bouncing_pendulum.py
│   │   ├── example_bouncingball.py
│   │   ├── example_bouncingball_friction.py
│   │   ├── example_bouncingball_switched.py
│   │   ├── example_integrator_reset.py
│   │   ├── example_pulse.py
│   │   ├── example_stickslip_event.py
│   │   ├── example_thermostat.py
│   │   └── example_volterralotka_event.py
│   └── examples_odes/
│       ├── example_bonhoeffer_vanderpol.py
│       ├── example_brusselator.py
│       ├── example_chemical.py
│       ├── example_duffing.py
│       ├── example_fairen_velarde.py
│       ├── example_fitzhughnagumo.py
│       ├── example_flame.py
│       ├── example_glycolysis.py
│       ├── example_lorenz.py
│       ├── example_morse.py
│       ├── example_robertson.py
│       ├── example_roessler.py
│       ├── example_thomas_cyclic.py
│       ├── example_vanderpol.py
│       └── example_volterralotka.py
├── git
├── pyproject.toml
├── src/
│   └── pathsim/
│       ├── __init__.py
│       ├── _constants.py
│       ├── blocks/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── _block.py
│       │   ├── adder.py
│       │   ├── amplifier.py
│       │   ├── comparator.py
│       │   ├── converters.py
│       │   ├── counter.py
│       │   ├── ctrl.py
│       │   ├── delay.py
│       │   ├── differentiator.py
│       │   ├── discrete.py
│       │   ├── divider.py
│       │   ├── dynsys.py
│       │   ├── filters.py
│       │   ├── fmu.py
│       │   ├── function.py
│       │   ├── integrator.py
│       │   ├── kalman.py
│       │   ├── logic.py
│       │   ├── lti.py
│       │   ├── math.py
│       │   ├── multiplier.py
│       │   ├── noise.py
│       │   ├── ode.py
│       │   ├── relay.py
│       │   ├── rf.py
│       │   ├── rng.py
│       │   ├── scope.py
│       │   ├── sources.py
│       │   ├── spectrum.py
│       │   ├── switch.py
│       │   ├── table.py
│       │   └── wrapper.py
│       ├── connection.py
│       ├── events/
│       │   ├── __init__.py
│       │   ├── _event.py
│       │   ├── condition.py
│       │   ├── schedule.py
│       │   └── zerocrossing.py
│       ├── exceptions.py
│       ├── optim/
│       │   ├── __init__.py
│       │   ├── anderson.py
│       │   ├── booster.py
│       │   ├── numerical.py
│       │   └── operator.py
│       ├── simulation.py
│       ├── solvers/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── _rungekutta.py
│       │   ├── _solver.py
│       │   ├── bdf.py
│       │   ├── dirk2.py
│       │   ├── dirk3.py
│       │   ├── esdirk32.py
│       │   ├── esdirk4.py
│       │   ├── esdirk43.py
│       │   ├── esdirk54.py
│       │   ├── esdirk85.py
│       │   ├── euler.py
│       │   ├── gear.py
│       │   ├── rk4.py
│       │   ├── rkbs32.py
│       │   ├── rkck54.py
│       │   ├── rkdp54.py
│       │   ├── rkdp87.py
│       │   ├── rkf21.py
│       │   ├── rkf45.py
│       │   ├── rkf78.py
│       │   ├── rkv65.py
│       │   ├── ssprk22.py
│       │   ├── ssprk33.py
│       │   ├── ssprk34.py
│       │   └── steadystate.py
│       ├── subsystem.py
│       └── utils/
│           ├── __init__.py
│           ├── adaptivebuffer.py
│           ├── analysis.py
│           ├── deprecation.py
│           ├── diagnostics.py
│           ├── fmuwrapper.py
│           ├── gilbert.py
│           ├── graph.py
│           ├── logger.py
│           ├── mutable.py
│           ├── portreference.py
│           ├── progresstracker.py
│           ├── realtimeplotter.py
│           └── register.py
└── tests/
    ├── README.md
    ├── __init__.py
    ├── evals/
    │   ├── CoupledClutches_CS.fmu
    │   ├── __init__.py
    │   ├── conftest.py
    │   ├── test_algebraic_system.py
    │   ├── test_bouncingball_friction_event_system.py
    │   ├── test_bouncingball_system.py
    │   ├── test_brusselator_system.py
    │   ├── test_cosim_fmu_system.py
    │   ├── test_counter_comparator_system.py
    │   ├── test_dynamical_system_ivp.py
    │   ├── test_fitzhughnagumo_system.py
    │   ├── test_harmonic_oscillator_system.py
    │   ├── test_linear_feedback_system.py
    │   ├── test_logic_system.py
    │   ├── test_lorenz_system.py
    │   ├── test_me_analytical.py
    │   ├── test_model_exchange_fmu_system.py
    │   ├── test_pid_system.py
    │   ├── test_relay_thermostat_system.py
    │   ├── test_rescale_delay_system.py
    │   ├── test_robertson_system.py
    │   ├── test_roessler_system.py
    │   ├── test_signal_processing_system.py
    │   ├── test_steadystate_transient_system.py
    │   ├── test_switch_lti_system.py
    │   ├── test_vanderpol_system.py
    │   └── test_volterralotka_system.py
    └── pathsim/
        ├── __init__.py
        ├── blocks/
        │   ├── __init__.py
        │   ├── _embedding.py
        │   ├── rf/
        │   │   ├── __init__.py
        │   │   ├── ring_slot.s2p
        │   │   ├── ring_slot_meas.s1p
        │   │   └── test_rf.py
        │   ├── test_adder.py
        │   ├── test_amplifier.py
        │   ├── test_block.py
        │   ├── test_comparator.py
        │   ├── test_converters.py
        │   ├── test_counter.py
        │   ├── test_ctrl.py
        │   ├── test_delay.py
        │   ├── test_differentiator.py
        │   ├── test_discrete.py
        │   ├── test_divider.py
        │   ├── test_dynsys.py
        │   ├── test_filters.py
        │   ├── test_fmu.py
        │   ├── test_function.py
        │   ├── test_integrator.py
        │   ├── test_kalman.py
        │   ├── test_logic.py
        │   ├── test_lti.py
        │   ├── test_math.py
        │   ├── test_multiplier.py
        │   ├── test_noise.py
        │   ├── test_ode.py
        │   ├── test_relay.py
        │   ├── test_rng.py
        │   ├── test_scope.py
        │   ├── test_sources.py
        │   ├── test_spectrum.py
        │   ├── test_switch.py
        │   ├── test_table.py
        │   └── test_wrapper.py
        ├── events/
        │   ├── __init__.py
        │   ├── test_condition.py
        │   ├── test_event.py
        │   ├── test_schedule.py
        │   └── test_zerocrossing.py
        ├── optim/
        │   ├── __init__.py
        │   ├── test_anderson.py
        │   ├── test_numerical.py
        │   └── test_operator.py
        ├── solvers/
        │   ├── __init__.py
        │   ├── _referenceproblems.py
        │   ├── test_bdf.py
        │   ├── test_dirk2.py
        │   ├── test_dirk3.py
        │   ├── test_esdirk32.py
        │   ├── test_esdirk4.py
        │   ├── test_esdirk43.py
        │   ├── test_esdirk54.py
        │   ├── test_esdirk85.py
        │   ├── test_euler.py
        │   ├── test_gear.py
        │   ├── test_rfk21.py
        │   ├── test_rk4.py
        │   ├── test_rkbs32.py
        │   ├── test_rkck54.py
        │   ├── test_rkdp54.py
        │   ├── test_rkdp87.py
        │   ├── test_rkf45.py
        │   ├── test_rkf78.py
        │   ├── test_rkv65.py
        │   ├── test_solver.py
        │   ├── test_ssprk22.py
        │   ├── test_ssprk33.py
        │   ├── test_ssprk34.py
        │   └── test_steadystate.py
        ├── test_checkpoint.py
        ├── test_connection.py
        ├── test_diagnostics.py
        ├── test_simulation.py
        ├── test_subsystem.py
        └── utils/
            ├── __init__.py
            ├── test_adaptivebuffer.py
            ├── test_analysis.py
            ├── test_fmuwrapper.py
            ├── test_gilbert.py
            ├── test_graph.py
            ├── test_logger.py
            ├── test_mutable.py
            ├── test_portreference.py
            ├── test_progresstracker.py
            ├── test_realtimeplotter.py
            └── test_register.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .codecov.yml
================================================
codecov:
  require_ci_to_pass: yes

coverage:
  precision: 2
  round: down
  range: "70...100"

================================================
FILE: .github/FUNDING.yml
================================================
github: milanofthe


================================================
FILE: .github/workflows/pypi_deployment.yml
================================================
name: Publish PathSim to PyPI

on:
  release:
    types: [published] 
  workflow_dispatch: 

permissions:
  contents: read

jobs:
  deploy:
    runs-on: ubuntu-latest  
    steps:
    - uses: actions/checkout@v6
      with:
        fetch-depth: 0 
    
    - name: Set up Python
      uses: actions/setup-python@v6
      with:
        python-version: '3.x'
    
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install build wheel setuptools
    
    - name: Build package
      run: python -m build
    
    - name: Publish package
      uses: pypa/gh-action-pypi-publish@27b31702a0e7fc50959f5ad993c78deac1bdfc29
      with:
        user: __token__
        password: ${{ secrets.PYPI_API_TOKEN }}


================================================
FILE: .github/workflows/tests_codecov.yml
================================================
name: Run tests and upload coverage
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Set up Python
        uses: actions/setup-python@v6
        with:
          python-version: '3.x'
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -e .[test,rf]
      - name: Test with pytest and generate coverage
        run: |
          pytest --cov=./src/pathsim --cov-report=xml
      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v5
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          slug: pathsim/pathsim
          fail_ci_if_error: true
          files: ./coverage.xml

================================================
FILE: .github/workflows/urlchecker.yml
================================================
# https://github.com/marketplace/actions/urlchecker-action
name: Check URLs

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v6
    - name: urls-checker
      uses: urlstechie/urlchecker-action@master
      with:
        # A comma-separated list of file types to cover in the URL checks
        file_types: .md,.py,.rst

        # Choose whether to include file with no URLs in the prints.
        print_all: false

        # The timeout seconds to provide to requests, defaults to 5 seconds
        timeout: 5

        # How many times to retry a failed request (each is logged, defaults to 1)
        retry_count: 3

        # A comma separated links to exclude during URL checks
        exclude_urls:

        # A comma separated patterns to exclude during URL checks
        exclude_patterns:

        # choose if the force pass or not
        force_pass : true


================================================
FILE: .gitignore
================================================
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Notebooks (except documentation notebooks)
*.ipynb
!docs/**/*.ipynb

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
*.pypirc

# PyInstaller
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
coverage.json
*.cover
.hypothesis/
test_reports/
*.pyc
__pycache__/
.pytest_cache/

# Jupyter Notebook
.ipynb_checkpoints

# pyenv
.python-version

# Environment
.env
.venv
env/
venv/
ENV/

# Shell
*.bat

# IDEs
.vscode/
.idea/

# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

# Claude
.claude
CLAUDE.MD
claude.md
CLAUDE.md


*_version.py

================================================
FILE: CITATION.cff
================================================
cff-version: "1.2.0"
authors:
- family-names: Rother
  given-names: Milan
  orcid: "https://orcid.org/0009-0006-5964-6115"
doi: 10.5281/zenodo.15367933
message: If you use this software, please cite our article in the
  Journal of Open Source Software.
preferred-citation:
  authors:
  - family-names: Rother
    given-names: Milan
    orcid: "https://orcid.org/0009-0006-5964-6115"
  date-published: 2025-05-13
  doi: 10.21105/joss.08158
  issn: 2475-9066
  issue: 109
  journal: Journal of Open Source Software
  publisher:
    name: Open Journals
  start: 8158
  title: PathSim - A System Simulation Framework
  type: article
  url: "https://joss.theoj.org/papers/10.21105/joss.08158"
  volume: 10
title: PathSim - A System Simulation Framework


================================================
FILE: LICENSE.txt
================================================
MIT License

Copyright (c) 2024 Milan Rother

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

================================================
FILE: README.md
================================================
<p align="center">
  <img src="https://raw.githubusercontent.com/pathsim/pathsim/master/docs/source/logos/pathsim_logo.png" width="300" alt="PathSim Logo" />
</p>

<p align="center">
  <strong>A block-based time-domain system simulation framework in Python</strong>
</p>

<p align="center">
  <a href="https://doi.org/10.21105/joss.08158"><img src="https://joss.theoj.org/papers/10.21105/joss.08158/status.svg" alt="DOI"></a>
  <a href="https://pysimhub.io/projects/pathsim"><img src="https://pysimhub.io/badge.svg" alt="PySimHub"></a>
  <a href="https://pypi.org/project/pathsim/"><img src="https://img.shields.io/pypi/v/pathsim" alt="PyPI"></a>
  <a href="https://anaconda.org/conda-forge/pathsim"><img src="https://img.shields.io/conda/vn/conda-forge/pathsim" alt="Conda"></a>
  <img src="https://img.shields.io/github/license/pathsim/pathsim" alt="License">
  <img src="https://img.shields.io/github/v/release/pathsim/pathsim" alt="Release">
  <img src="https://img.shields.io/pypi/dw/pathsim" alt="Downloads">
  <a href="https://codecov.io/gh/pathsim/pathsim"><img src="https://codecov.io/gh/pathsim/pathsim/branch/master/graph/badge.svg" alt="Coverage"></a>
</p>

<p align="center">
  <a href="https://pathsim.org">Homepage</a> &bull;
  <a href="https://docs.pathsim.org">Documentation</a> &bull;
  <a href="https://view.pathsim.org">PathView Editor</a> &bull;
  <a href="https://github.com/sponsors/milanofthe">Sponsor</a>
</p>

---

PathSim lets you model and simulate complex dynamical systems using an intuitive block diagram approach. Connect sources, integrators, functions, and scopes to build continuous-time, discrete-time, or hybrid systems.

Minimal dependencies: just `numpy`, `scipy`, and `matplotlib`.

## Features

- **Hot-swappable** — modify blocks and solvers during simulation
- **Stiff solvers** — implicit methods (BDF, ESDIRK) for challenging systems
- **Event handling** — zero-crossing detection for hybrid systems
- **Hierarchical** — nest subsystems for modular designs
- **Extensible** — subclass `Block` to create custom components

## Install

```bash
pip install pathsim
```

or with conda:

```bash
conda install conda-forge::pathsim
```

## Quick Example

```python
from pathsim import Simulation, Connection
from pathsim.blocks import Integrator, Amplifier, Adder, Scope

# Damped harmonic oscillator: x'' + 0.5x' + 2x = 0
int_v = Integrator(5)       # velocity, v0=5
int_x = Integrator(2)       # position, x0=2
amp_c = Amplifier(-0.5)     # damping
amp_k = Amplifier(-2)       # spring
add = Adder()
scp = Scope()

sim = Simulation(
    blocks=[int_v, int_x, amp_c, amp_k, add, scp],
    connections=[
        Connection(int_v, int_x, amp_c),
        Connection(int_x, amp_k, scp),
        Connection(amp_c, add),
        Connection(amp_k, add[1]),
        Connection(add, int_v),
    ],
    dt=0.05
)

sim.run(30)
scp.plot()
```

## PathView

[PathView](https://view.pathsim.org) is the graphical editor for PathSim — design systems visually and export to Python.

## Learn More

- [Documentation](https://docs.pathsim.org) — tutorials, examples, and API reference
- [Homepage](https://pathsim.org) — overview and getting started
- [Contributing](https://docs.pathsim.org/pathsim/latest/contributing) — how to contribute

## Citation

If you use PathSim in research, please cite:

```bibtex
@article{Rother2025,
  author = {Rother, Milan},
  title = {PathSim - A System Simulation Framework},
  journal = {Journal of Open Source Software},
  year = {2025},
  volume = {10},
  number = {109},
  pages = {8158},
  doi = {10.21105/joss.08158}
}
```

## License

MIT


================================================
FILE: conftest.py
================================================
def pytest_addoption(parser):
    parser.addoption(
        "--run-all",
        action="store_true",
        default=False,
        help="Run all tests including slow eval tests.",
    )


def pytest_configure(config):
    if config.getoption("--run-all"):
        # Override the default marker filter
        config.option.markexpr = ""


================================================
FILE: docs/.readthedocs.yaml
================================================
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details

# Required
version: 2

# Set the OS, Python version, and other tools you might need
build:
  os: ubuntu-24.04
  tools:
    python: "3.13"

# Build documentation in the "docs/source/" directory with Sphinx
sphinx:
   configuration: docs/source/conf.py

# Optionally, but recommended,
# declare the Python requirements required to build your documentation
# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
python:
  install:
  - requirements: docs/requirements.txt
  - method: pip
    path: . 
        

================================================
FILE: docs/Makefile
================================================
# Minimal makefile for Sphinx documentation
#

# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS    ?=
SPHINXBUILD   ?= sphinx-build
SOURCEDIR     = docs
BUILDDIR      = build

# Put it first so that "make" without argument is like "make help".
help:
	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

.PHONY: help Makefile

# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)


================================================
FILE: docs/requirements.txt
================================================
numpy>=1.15,<2
matplotlib>=3.1
requests>=2.28.0
scipy>=1.2
sphinx
furo
myst-parser
sphinx-autoapi
sphinx-copybutton
sphinx-design
nbsphinx
jupyter
ipykernel
pandoc
fmpy
scikit-rf


================================================
FILE: docs/source/_ext/github_issues.py
================================================
import requests
import os
from datetime import datetime

def fetch_github_issues(app, config):
    """Fetch GitHub issues and generate RST file"""
    
    # Configure these
    repo = "milanofthe/pathsim" 
    token = os.environ.get('GITHUB_TOKEN')
    
    # API request
    url = f"https://api.github.com/repos/{repo}/issues"
    headers = {'Authorization': f'token {token}'} if token else {}
    params = {
        'state': 'all',
        'sort': 'created',
        'direction': 'desc',
        'per_page': 100
    }
    
    try:
        response = requests.get(url, headers=headers, params=params)
        response.raise_for_status()
        issues = response.json()
        
        # Filter out pull requests
        issues = [i for i in issues if 'pull_request' not in i]
        
        # Generate RST file
        output_path = os.path.join(app.srcdir, 'roadmap_generated.rst')
        
        with open(output_path, 'w', encoding='utf-8') as f:
            f.write(".. raw:: html\n\n")
            f.write("   <div class='github-issues-container'>\n")
            f.write(f"   <p class='issues-updated'>Last updated: {datetime.now().strftime('%Y-%m-%d %H:%M UTC')}</p>\n\n")
            
            # Group by state
            open_issues = [i for i in issues if i['state'] == 'open']
            
            if open_issues:
                for issue in open_issues:
                    # Write only 'roadmap' labeled issues
                    if any(label['name'] == 'roadmap' for label in issue.get('labels', [])):
                        write_issue_html(f, issue)
            else:
                f.write("   <p class='no-issues'>No roadmap items found.</p>\n")
            
            f.write("   </div>\n\n")
        
        print(f"Generated roadmap from {len(issues)} GitHub issues")
        
    except Exception as e:
        print(f"Warning: Could not fetch GitHub issues: {e}")
        output_path = os.path.join(app.srcdir, 'roadmap_generated.rst')
        with open(output_path, 'w', encoding='utf-8') as f:
            f.write(".. raw:: html\n\n")
            f.write("   <div class='github-issues-container'>\n")
            f.write("   <p class='issues-error'>⚠️ Could not fetch issues from GitHub</p>\n")
            f.write("   </div>\n\n")

def write_issue_html(f, issue):
    """Write a single issue in HTML format for better styling"""
    labels = issue.get('labels', [])
    body = issue.get('body', '').strip()
    
    # Truncate body
    if len(body) > 400:
        body = body[:400] + "..."
    
    # Escape HTML characters
    body = body.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;')
    body = body.replace('\n', '<br>')
    
    f.write("   <div class='github-issue-card'>\n")
    f.write("      <div class='issue-header'>\n")
    f.write(f"         <span class='issue-number'>#{issue['number']}</span>\n")
    f.write(f"         <h3 class='issue-title'>{issue['title']}</h3>\n")
    f.write("      </div>\n")
    
    if labels:
        f.write("      <div class='issue-labels'>\n")
        for label in labels:
            f.write(f"         <span class='issue-label'>{label['name']}</span>\n")
        f.write("      </div>\n")
    
    if body:
        f.write("      <div class='issue-body'>\n")
        f.write(f"         <p>{body}</p>\n")
        f.write("      </div>\n")
    
    f.write("      <div class='issue-footer'>\n")
    created_date = datetime.strptime(issue['created_at'], '%Y-%m-%dT%H:%M:%SZ').strftime('%b %d, %Y')
    f.write(f"         <span class='issue-date'>Created: {created_date}</span>\n")
    f.write(f"         <a href='{issue['html_url']}' class='issue-link' target='_blank'>View on GitHub →</a>\n")
    f.write("      </div>\n")
    f.write("   </div>\n\n")

def setup(app):
    """Sphinx extension setup"""
    app.connect('config-inited', fetch_github_issues)
    
    return {
        'version': '0.1',
        'parallel_read_safe': True,
        'parallel_write_safe': True,
    }

================================================
FILE: docs/source/_static/custom.css
================================================
/* Custom CSS for PathSim Documentation */





/* GitHub Issues Styling */
.github-issues-container {
    margin: 2rem 0;
}

.issues-updated {
    font-size: 0.875rem;
    color: var(--color-foreground-secondary);
    margin-bottom: 1.5rem;
    font-style: italic;
}

.issues-error {
    padding: 1rem;
    background-color: var(--color-background-secondary);
    border-left: 4px solid #e74c3c;
    border-radius: 4px;
    color: var(--color-foreground-primary);
}

.no-issues {
    padding: 2rem;
    text-align: center;
    color: var(--color-foreground-secondary);
    background-color: var(--color-background-secondary);
    border-radius: 8px;
}

.github-issue-card {
    background-color: var(--color-card-background);
    border: 1px solid var(--color-card-border);
    border-radius: 8px;
    padding: 1.5rem;
    margin-bottom: 1.5rem;
}

.issue-header {
    display: flex;
    align-items: flex-start;
    gap: 0.75rem;
    margin-bottom: 1rem;
}

.issue-number {
    background-color: var(--color-background-secondary);
    color: var(--color-brand-primary);
    padding: 0.25rem 0.5rem;
    border-radius: 4px;
    font-size: 0.875rem;
    font-weight: 600;
    flex-shrink: 0;
}

.issue-title {
    margin: 0;
    font-size: 1.25rem;
    font-weight: 600;
    color: var(--color-foreground-primary);
    line-height: 1.4;
}

.issue-labels {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    margin-bottom: 1rem;
}

.issue-label {
    background-color: var(--color-background-secondary);
    color: var(--color-foreground-secondary);
    padding: 0.25rem 0.75rem;
    border-radius: 12px;
    font-size: 0.75rem;
    font-weight: 500;
    display: inline-block;
}

.issue-body {
    margin: 1rem 0;
    color: var(--color-foreground-secondary);
    line-height: 1.6;
}

.issue-body p {
    margin: 0;
}

.issue-footer {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-top: 1rem;
    padding-top: 1rem;
    border-top: 1px solid var(--color-background-border);
}

.issue-date {
    font-size: 0.875rem;
    color: var(--color-foreground-secondary);
}

.issue-link {
    color: var(--color-link);
    text-decoration: none;
    font-weight: 500;
    font-size: 0.875rem;
}

.issue-link:hover {
    color: var(--color-link--hover);
    text-decoration: none;
}

/* Responsive adjustments */
@media (max-width: 768px) {
    .github-issue-card {
        padding: 1rem;
    }
    
    .issue-header {
        flex-direction: column;
        gap: 0.5rem;
    }
    
    .issue-footer {
        flex-direction: column;
        gap: 0.5rem;
        align-items: flex-start;
    }
}

/* Fix link preview card backgrounds for light/dark mode */
.sd-card {
    background-color: var(--color-card-background) !important;
}

.sd-card-header {
    background-color: var(--color-card-marginals-background) !important;
}

.sd-card-footer {
    background-color: var(--color-card-marginals-background) !important;
}

/* Ensure link preview text is readable in both modes */
.sd-card-text {
    color: var(--color-foreground-primary) !important;
}

.sd-card-title {
    color: var(--color-foreground-primary) !important;
}

/* Fix any link cards created by MyST linkify */
a.reference.external .sd-card {
    background-color: var(--color-card-background) !important;
    border-color: var(--color-card-border) !important;
}

/* Main tooltip container */
.tooltip {
    background-color: var(--color-background-primary) !important;
    border: 1px solid var(--color-background-border) !important;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15) !important;
}

/* Dark mode specific adjustments */
body[data-theme="dark"] .tooltip {
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.5) !important;
}

/* Tooltip content text */
.tooltip .highlight,
.tooltip pre,
.tooltip code {
    background-color: var(--color-code-background) !important;
    color: var(--color-code-foreground) !important;
}

/* Tooltip general text */
.tooltip,
.tooltip * {
    color: var(--color-foreground-primary) !important;
}

/* Tooltip links */
.tooltip a {
    color: var(--color-link) !important;
}

.tooltip a:hover {
    color: var(--color-link--hover) !important;
}

================================================
FILE: docs/source/_static/redirect.js
================================================
// Redirect visitors from RTD to docs.pathsim.org after a brief delay.
// The banner is shown immediately; redirect fires after 3 seconds
// so users understand what's happening. Click the link to go immediately.
(function () {
    if (window.location.hostname.indexOf('readthedocs') === -1) return;
    var target = 'https://docs.pathsim.org';
    setTimeout(function () { window.location.replace(target); }, 3000);
})();


================================================
FILE: docs/source/api.rst
================================================

API Reference
=============

Core Components
---------------

The following modules form the core of PathSim's system definition and simulation capabilities.

.. grid:: 2
   :gutter: 3

   .. grid-item-card:: 🎯 Simulation
      :link: modules/pathsim.simulation
      :link-type: doc

      Main simulation engine that orchestrates system execution, manages blocks, connections, and events.

   .. grid-item-card:: 🔌 Connection
      :link: modules/pathsim.connection
      :link-type: doc

      Defines signal flow between blocks, enabling data transfer and system interconnection.

   .. grid-item-card:: 📦 Subsystem
      :link: modules/pathsim.subsystem
      :link-type: doc

      Enables hierarchical modeling by encapsulating blocks and connections into reusable components.

   .. grid-item-card:: 🧱 Block Library
      :link: modules/pathsim.blocks
      :link-type: doc

      Comprehensive library of pre-built blocks for sources, operations, controllers, and more.

.. toctree::
   :hidden:
   :maxdepth: 3

   modules/pathsim.simulation
   modules/pathsim.subsystem
   modules/pathsim.connection
   modules/pathsim.blocks

----

Event System
------------

PathSim's event handling mechanism enables discrete event detection and system state modifications.

.. grid:: 1
   :gutter: 3

   .. grid-item-card:: ⚡ Event Library
      :link: modules/pathsim.events
      :link-type: doc

      Zero-crossing detection, scheduled events, and condition-based triggers for hybrid system simulation.

.. toctree::
   :hidden:
   :maxdepth: 5

   modules/pathsim.events

----

Numerical Solvers
-----------------

PathSim provides a wide range of ODE solvers with different characteristics and performance profiles.

.. image:: figures/pathsim_solver_hierarchy_g.png
   :width: 700
   :align: center
   :alt: hierarchy of PathSim numerical integrators

.. grid:: 1
   :gutter: 3

   .. grid-item-card:: 🔢 Solver Library
      :link: modules/pathsim.solvers
      :link-type: doc

      Explicit and implicit Runge-Kutta methods, BDF, Gear, and adaptive solvers for stiff and non-stiff problems.

.. toctree::
   :hidden:
   :maxdepth: 4

   modules/pathsim.solvers

----

Optimization & Differentiation
------------------------------

Advanced features for optimization and nonlinear solving.

.. grid:: 1
   :gutter: 3

   .. grid-item-card:: 🎓 Optimization Module
      :link: modules/pathsim.optim
      :link-type: doc

      Nonlinear solvers and optimizers.

.. toctree::
   :hidden:
   :maxdepth: 4

   modules/pathsim.optim

----

Utilities
---------

Helper functions and utility classes for analysis, plotting, and system management.

.. grid:: 1
   :gutter: 3

   .. grid-item-card:: 🛠️ Utility Functions
      :link: modules/pathsim.utils
      :link-type: doc

      Analysis tools, real-time plotting, serialization, adaptive buffers, and more.

.. toctree::
   :hidden:
   :maxdepth: 4

   modules/pathsim.utils


================================================
FILE: docs/source/conf.py
================================================
import os
import sys

sys.path.insert(0, os.path.abspath(os.path.join('..', '..')))


from pathsim import __version__ 

# -- Project information -----------------------------------------------------

project = 'pathsim'
copyright = '2025, Milan Rother' 
author = 'Milan Rother'
version = __version__
release = __version__

# -- General configuration ---------------------------------------------------

sys.path.insert(0, os.path.abspath('./_ext'))

extensions = [
    'sphinx.ext.autodoc',  # Core Sphinx library for auto doc generation
    'sphinx.ext.napoleon', # Support for NumPy and Google style docstrings
    'sphinx.ext.viewcode',  # Add links to source code
    'sphinx.ext.mathjax', # Render math
    'myst_parser',          # Support for MyST Markdown (optional, but recommended)
	'sphinx.ext.autosummary', # Create neat summary tables,
    'sphinx.ext.intersphinx',
    'sphinx_copybutton',
    'sphinx_design',  # Modern design components (cards, tabs, grids)
    'nbsphinx',  # Jupyter notebook support
    'github_issues', # Automatic roadmap generation from active github issues
]

# -- Options for HTML output -------------------------------------------------

html_theme = 'furo'
html_static_path = ['_static']
html_logo = 'logos/pathsim_logo.png'
html_favicon = "logos/pathsim_icon.png"
html_title = "PathSim Documentation"
html_css_files = ['custom.css']  # Add custom CSS for link previews and styling
html_js_files = ['redirect.js']  # Auto-redirect RTD visitors to docs.pathsim.org
html_baseurl = 'https://docs.pathsim.org/'  # Canonical URL for SEO

html_theme_options = {
    "light_css_variables": {
        # PathSim brand colors - using blue from the palette
        "color-brand-primary": "#377eb8",  # PathSim blue
        "color-brand-content": "#377eb8",  # PathSim blue for links

        # Accent colors for various elements using PathSim palette
        "color-api-keyword": "#377eb8",  # PathSim blue for keywords
        "color-highlight-on-target": "#fff3cd",  # Soft yellow highlight

        # Font stacks
        "font-stack": "system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif",
        "font-stack--monospace": "SFMono-Regular, Menlo, Consolas, Monaco, Liberation Mono, Lucida Console, monospace",
    },
    "dark_css_variables": {
        # PathSim brand colors for dark mode - slightly lighter for better contrast
        "color-brand-primary": "#377eb8",  # PathSim blue
        "color-brand-content": "#377eb8",  # PathSim blue

        # Accent colors for dark mode
        "color-api-keyword": "#377eb8",  # PathSim blue
    },
    "sidebar_hide_name": True,  # Hide project name, show logo only
    "navigation_with_keys": True,  # Allow keyboard navigation
    "top_of_page_button": "edit",
    "source_repository": "https://github.com/milanofthe/pathsim",
    "source_branch": "master",
    "source_directory": "docs/source/",
}

# -- Options for autodoc -----------------------------------------------------

autodoc_default_options = {
    'members': True,       # Document all members (functions, classes, methods)
    'member-order': 'bysource', # Order members as they appear in the source code
    'undoc-members': True,  # Include members that don't have docstrings
    'show-inheritance': True, # Show base classes
}
autosummary_generate = True  # Turn on sphinx.ext.autosummary

# -- Options for MyST Parser -----------------------------------------------

source_suffix = {
    '.rst': 'restructuredtext',
    '.md': 'markdown',
}

myst_update_mathjax = False
myst_heading_anchors = 3  
myst_url_schemes = ("http", "https") 
myst_enable_extensions = [
    "colon_fence",
    "deflist",
    "linkify",
]

# Add support to link variables in other projects, used in the docstrings
intersphinx_mapping = {
    "python": ("https://docs.python.org/3/", None),
    "numpy": ("https://numpy.org/doc/stable/", None),
    "scipy": ("https://docs.scipy.org/doc/scipy/reference/", None),
    "matplotlib": ("https://matplotlib.org/stable/", None),
}

# -- Options for nbsphinx -----------------------------------------------

# Execute notebooks before conversion
nbsphinx_execute = 'always'  # 'always', 'never', or 'auto' (only if no output)

# Timeout for notebook execution (in seconds)
nbsphinx_timeout = 180

# Allow errors in notebooks (useful during development)
nbsphinx_allow_errors = True

# Kernel to use for notebook execution
nbsphinx_kernel_name = 'python3'

# Custom CSS for notebooks in Furo theme
nbsphinx_prolog = """
.. raw:: html

    <style>
        /* Make notebook outputs fit better with Furo theme */
        .nboutput .output_area pre {
            background-color: var(--color-background-secondary);
            border: 1px solid var(--color-background-border);
            border-radius: 0.25rem;
            padding: 0.5rem;
        }

        /* Transparent figure backgrounds */
        .nboutput img {
            background-color: transparent !important;
        }

        /* Better styling for stderr/logging output - adapts to light/dark mode */
        .nboutput .stderr {
            background-color: transparent !important;
            color: var(--color-foreground-secondary) !important;
            border-left: 3px solid var(--color-brand-primary);
            opacity: 0.85;
        }
    </style>
"""

# Exclude certain notebook patterns from execution
nbsphinx_execute_arguments = [
    "--InlineBackend.figure_formats={'svg', 'png'}",
    "--InlineBackend.rc={'figure.dpi': 200}",
]


================================================
FILE: docs/source/contributing.rst
================================================
.. _ref-contributing:

Contributing
============
Contributions to PathSim's development are very welcome! Here are some ways to help:

* Improving documentation, for example with examples and explanations
* Finding and reporting or even fixing bugs
* Features and enhancements
* Writing tests and validations to improve coverage

For more specific ideas and inspirations, check out the :ref:`ref-roadmap`!

Reporting Bugs
--------------
Bugs and issues can be reported in the issue tracker using the `bug report form <https://github.com/milanofthe/pathsim/issues/new>`_. Please check the bug has not already been reported or even resolved in a newer release by 
`searching the issue tracker <https://github.com/milanofthe/pathsim/issues>`_ before submitting a new issue!

Feature Requests
----------------
Feature requests can be made in the issue tracker using the `feature report form <https://github.com/milanofthe/pathsim/issues/new>`_, or by starting a `discussion <https://github.com/milanofthe/pathsim/discussions/new/choose>`_.

General Support
---------------
If you are having difficulties using PathSim or any related questions, check out the `QA section <https://github.com/milanofthe/pathsim/discussions/categories/q-a>`_ to see if your question has already been answered. If not, feel free to start a new `discussion <https://github.com/milanofthe/pathsim/discussions/new?category=q-a>`_ in the Q&A section, so everyone can benefit from the answers to your question!


================================================
FILE: docs/source/examples/abs_braking.ipynb
================================================
{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "cell-0",
   "metadata": {},
   "source": [
    "# Anti-lock Braking System (ABS)\n",
    "\n",
    "This example demonstrates an anti-lock braking system (ABS) using nonlinear tire dynamics and event-driven slip control. The system prevents wheel lockup during braking by modulating brake torque to maintain optimal tire-road friction.\n",
    "\n",
    "You can also find this example as a single file in the [GitHub repository](https://github.com/milanofthe/pathsim/blob/master/examples/example_abs_braking.py)."
   ]
  },
  {
   "cell_type": "raw",
   "id": "cell-1",
   "metadata": {
    "editable": true,
    "raw_mimetype": "text/restructuredtext",
    "slideshow": {
     "slide_type": ""
    },
    "tags": []
   },
   "source": [
    "The ABS control system features:\n",
    "\n",
    "- **Pacejka tire model**: Realistic nonlinear friction coefficient vs. slip ratio characteristic\n",
    "- **Multi-body dynamics**: Separate vehicle and wheel rotational dynamics\n",
    "- **Event-driven control**: Zero-crossing events detect slip threshold crossings for precise brake modulation\n",
    "- **Physical constraints**: Prevents unphysical negative wheel speeds"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-2",
   "metadata": {},
   "source": [
    "## System Dynamics\n",
    "\n",
    "The ABS system consists of coupled vehicle and wheel dynamics. The vehicle longitudinal motion is governed by:\n",
    "\n",
    "$$M \\frac{dv}{dt} = -F_x$$\n",
    "\n",
    "where $M$ is the vehicle mass, $v$ is the vehicle velocity, and $F_x$ is the tire friction force.\n",
    "\n",
    "The wheel rotational dynamics are described by:\n",
    "\n",
    "$$J_w \\frac{d\\omega}{dt} = -T_{brake} + R \\cdot F_x$$\n",
    "\n",
    "where $J_w$ is the wheel inertia, $\\omega$ is the wheel angular velocity, $T_{brake}$ is the brake torque, and $R$ is the wheel radius."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-3",
   "metadata": {},
   "source": [
    "## Tire Friction Model\n",
    "\n",
    "The tire friction force depends on the slip ratio $\\lambda$, defined as:\n",
    "\n",
    "$$\\lambda = \\frac{v - R\\omega}{v}$$\n",
    "\n",
    "where $\\lambda = 0$ represents free rolling (no slip) and $\\lambda = 1$ represents locked wheels.\n",
    "\n",
    "We use the Pacejka \"Magic Formula\" to model the friction coefficient:\n",
    "\n",
    "$$\\mu(\\lambda) = D \\sin\\left(C \\arctan(B\\lambda)\\right)$$\n",
    "\n",
    "The friction force is then:\n",
    "\n",
    "$$F_x = \\mu(\\lambda) \\cdot F_z$$\n",
    "\n",
    "where $F_z$ is the normal force on the tire. The Pacejka model exhibits a characteristic peak at an optimal slip ratio (typically around 15%), after which friction decreases for higher slip values."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-4",
   "metadata": {},
   "source": [
    "## ABS Control Strategy\n",
    "\n",
    "The ABS controller uses a bang-bang control strategy with zero-crossing events:\n",
    "\n",
    "- **Event 1**: When $\\lambda > \\lambda_{opt} + \\delta$, release brake ($T_{brake} = 0$)\n",
    "- **Event 2**: When $\\lambda < \\lambda_{opt} - \\delta$, apply brake ($T_{brake} = T_{max}$)\n",
    "\n",
    "where $\\lambda_{opt} = 0.15$ is the optimal slip ratio and $\\delta = 0.02$ is the control deadband."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-5",
   "metadata": {},
   "source": [
    "## Import and Setup\n",
    "\n",
    "First let's import the required classes and blocks:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "cell-6",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# Apply PathSim docs matplotlib style\n",
    "plt.style.use('../pathsim_docs.mplstyle')\n",
    "\n",
    "from pathsim import Simulation, Connection\n",
    "from pathsim.blocks import Integrator, Amplifier, Adder, Function, Scope, Clip, Constant\n",
    "from pathsim.solvers import RKCK54\n",
    "from pathsim.events import ZeroCrossing"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-7",
   "metadata": {},
   "source": [
    "## Vehicle and Tire Parameters"
   ]
  },
  {
   "cell_type": "raw",
   "id": "cell-8",
   "metadata": {
    "editable": true,
    "raw_mimetype": "text/restructuredtext",
    "slideshow": {
     "slide_type": ""
    },
    "tags": []
   },
   "source": [
    "We define realistic parameters for a mid-size vehicle with Pacejka tire model coefficients:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "cell-9",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Vehicle parameters\n",
    "M = 1500         # Vehicle mass [kg]\n",
    "R = 0.3          # Wheel radius [m]\n",
    "J_w = 1.0        # Wheel rotational inertia [kg·m²]\n",
    "F_z = M * 9.81 / 4  # Normal force per wheel [N]\n",
    "\n",
    "# Tire friction model (Pacejka \"Magic Formula\")\n",
    "B_coef = 10.0    # Stiffness factor\n",
    "C_coef = 1.9     # Shape factor\n",
    "D_coef = 1.0     # Peak friction coefficient\n",
    "\n",
    "# ABS control parameters\n",
    "lambda_opt = 0.15      # Optimal slip ratio\n",
    "abs_threshold = 0.02   # Control band around optimal\n",
    "\n",
    "# Brake torque\n",
    "T_brake = 2000   # Maximum brake torque [N·m]\n",
    "\n",
    "# Initial conditions\n",
    "v0 = 30          # Initial vehicle speed [m/s]\n",
    "omega0 = v0 / R  # Initial wheel angular velocity [rad/s]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-10",
   "metadata": {},
   "source": [
    "## Friction and Slip Models"
   ]
  },
  {
   "cell_type": "raw",
   "id": "cell-11",
   "metadata": {
    "editable": true,
    "raw_mimetype": "text/restructuredtext",
    "slideshow": {
     "slide_type": ""
    },
    "tags": []
   },
   "source": [
    "Define the tire friction characteristic and slip calculation functions:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "cell-12",
   "metadata": {},
   "outputs": [],
   "source": [
    "def friction_coefficient(slip):\n",
    "    \"\"\"Pacejka tire friction model\"\"\"\n",
    "    return D_coef * np.sin(C_coef * np.arctan(B_coef * slip))\n",
    "\n",
    "def calculate_slip(v, omega):\n",
    "    \"\"\"Calculate slip ratio: lambda = (v - R*omega) / v\"\"\"\n",
    "    omega_actual = max(0, omega)\n",
    "    if v < 0.1:\n",
    "        return 0.0\n",
    "    slip = (v - R * omega_actual) / v\n",
    "    return np.clip(slip, 0, 1)\n",
    "\n",
    "def friction_force(slip_ratio):\n",
    "    \"\"\"Tire friction force\"\"\"\n",
    "    return friction_coefficient(slip_ratio) * F_z"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-13",
   "metadata": {},
   "source": [
    "## System Definition with ABS\n",
    "\n",
    "Now we construct the vehicle braking system with ABS control:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "cell-14",
   "metadata": {},
   "outputs": [],
   "source": [
    "# ABS control state\n",
    "abs_state = {'apply_brake': True}\n",
    "\n",
    "# Wheel dynamics: J_w * domega/dt = -T_brake + R * F_x\n",
    "omg_raw = Integrator(omega0)\n",
    "omg_clp = Clip(min_val=0, max_val=1000)\n",
    "omg_acc = Amplifier(1/J_w)\n",
    "\n",
    "# Vehicle dynamics: M * dv/dt = -F_x\n",
    "vel = Integrator(v0)\n",
    "vel_acc = Amplifier(-1/M)\n",
    "\n",
    "# Slip and friction\n",
    "slp = Function(calculate_slip)\n",
    "frc = Function(friction_force)\n",
    "frc_cof = Function(friction_coefficient)\n",
    "\n",
    "# ABS control\n",
    "brk = Constant(T_brake)  # Will be modulated by events\n",
    "brk_neg = Amplifier(-1)\n",
    "\n",
    "# Torque summation\n",
    "whl_trq = Amplifier(R)\n",
    "trq_sum = Adder(\"++\")\n",
    "\n",
    "# Measurement\n",
    "whl_vel = Amplifier(R)\n",
    "sco1 = Scope(labels=[\"Vehicle Speed [m/s]\", \"Wheel Speed [m/s]\"])\n",
    "sco2 = Scope(labels=[\"Slip Ratio\", \"Friction Coeff\"])\n",
    "\n",
    "blocks = [\n",
    "    omg_raw, omg_clp, omg_acc, vel, vel_acc,\n",
    "    slp, frc, frc_cof, brk, brk_neg,\n",
    "    whl_trq, trq_sum, whl_vel, sco1, sco2\n",
    "]"
   ]
  },
  {
   "cell_type": "raw",
   "id": "cell-15",
   "metadata": {
    "editable": true,
    "raw_mimetype": "text/restructuredtext",
    "slideshow": {
     "slide_type": ""
    },
    "tags": []
   },
   "source": [
    "The connections implement the coupled vehicle-wheel dynamics with :class:`.Constant` brake torque modulated by events:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "cell-16",
   "metadata": {},
   "outputs": [],
   "source": [
    "connections = [\n",
    "    # Wheel dynamics\n",
    "    Connection(omg_acc, omg_raw),\n",
    "    Connection(omg_raw, omg_clp),\n",
    "    Connection(omg_clp, whl_vel),\n",
    "    Connection(trq_sum, omg_acc),\n",
    "\n",
    "    # Vehicle dynamics\n",
    "    Connection(vel_acc, vel),\n",
    "    Connection(vel, sco1[0]),\n",
    "\n",
    "    # Slip calculation\n",
    "    Connection(vel, slp[0]),\n",
    "    Connection(omg_clp, slp[1]),\n",
    "    Connection(slp, sco2[0]),\n",
    "\n",
    "    # Friction\n",
    "    Connection(slp, frc),\n",
    "    Connection(frc, whl_trq, vel_acc),\n",
    "    Connection(slp, frc_cof),\n",
    "    Connection(frc_cof, sco2[1]),\n",
    "\n",
    "    # Brake control (ABS with events)\n",
    "    Connection(brk, brk_neg),\n",
    "    Connection(brk_neg, trq_sum[1]),\n",
    "\n",
    "    # Torque balance\n",
    "    Connection(whl_trq, trq_sum[0]),\n",
    "    Connection(whl_vel, sco1[1]),\n",
    "]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-17",
   "metadata": {},
   "source": [
    "## ABS Control Events"
   ]
  },
  {
   "cell_type": "raw",
   "id": "cell-18",
   "metadata": {
    "editable": true,
    "raw_mimetype": "text/restructuredtext",
    "slideshow": {
     "slide_type": ""
    },
    "tags": []
   },
   "source": [
    "The ABS controller uses :class:`.ZeroCrossing` events to detect when the slip ratio exceeds the control thresholds and modulates brake torque accordingly:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "cell-19",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Event: slip too high -> release brake\n",
    "def evt_slip_high(t):\n",
    "    \"\"\"Detects when slip exceeds upper threshold\"\"\"\n",
    "    slip_val = slp.outputs[0]\n",
    "    return slip_val - (lambda_opt + abs_threshold)\n",
    "\n",
    "def act_release_brake(t):\n",
    "    \"\"\"Release brake when slip is too high\"\"\"\n",
    "    abs_state['apply_brake'] = False\n",
    "    brk.value = 0\n",
    "\n",
    "evt_high = ZeroCrossing(func_evt=evt_slip_high, func_act=act_release_brake, tolerance=1e-4)\n",
    "\n",
    "# Event: slip too low -> apply brake\n",
    "def evt_slip_low(t):\n",
    "    \"\"\"Detects when slip falls below lower threshold\"\"\"\n",
    "    slip_val = slp.outputs[0]\n",
    "    return (lambda_opt - abs_threshold) - slip_val\n",
    "\n",
    "def act_apply_brake(t):\n",
    "    \"\"\"Apply brake when slip is too low\"\"\"\n",
    "    abs_state['apply_brake'] = True\n",
    "    brk.value = T_brake\n",
    "\n",
    "evt_low = ZeroCrossing(func_evt=evt_slip_low, func_act=act_apply_brake, tolerance=1e-4)\n",
    "\n",
    "events = [evt_high, evt_low]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-20",
   "metadata": {},
   "source": [
    "## Simulation with ABS"
   ]
  },
  {
   "cell_type": "raw",
   "id": "cell-21",
   "metadata": {
    "editable": true,
    "raw_mimetype": "text/restructuredtext",
    "slideshow": {
     "slide_type": ""
    },
    "tags": []
   },
   "source": [
    "We initialize the simulation with the :class:`.RKCK54` solver and :class:`.ZeroCrossing` events for accurate slip control:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "id": "cell-22",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025-11-02 15:48:23,422 - INFO - LOGGING (log: True)\n",
      "2025-11-02 15:48:23,422 - INFO - BLOCK (type: Integrator, dynamic: True, events: 0)\n",
      "2025-11-02 15:48:23,422 - INFO - BLOCK (type: Clip, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:23,423 - INFO - BLOCK (type: Amplifier, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:23,423 - INFO - BLOCK (type: Integrator, dynamic: True, events: 0)\n",
      "2025-11-02 15:48:23,423 - INFO - BLOCK (type: Amplifier, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:23,423 - INFO - BLOCK (type: Function, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:23,424 - INFO - BLOCK (type: Function, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:23,424 - INFO - BLOCK (type: Function, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:23,424 - INFO - BLOCK (type: Constant, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:23,425 - INFO - BLOCK (type: Amplifier, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:23,425 - INFO - BLOCK (type: Amplifier, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:23,426 - INFO - BLOCK (type: Adder, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:23,426 - INFO - BLOCK (type: Amplifier, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:23,426 - INFO - BLOCK (type: Scope, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:23,427 - INFO - BLOCK (type: Scope, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:23,427 - INFO - GRAPH (size: 15, alg. depth: 7, loop depth: 0, runtime: 0.128ms)\n",
      "2025-11-02 15:48:23,430 - INFO - STARTING -> TRANSIENT (Duration: 5.00s)\n",
      "2025-11-02 15:48:23,431 - INFO - TRANSIENT:   0% | elapsed: 00:00:00 (eta: --:--:--) | 0 steps (N/A steps/s)\n",
      "2025-11-02 15:48:24,431 - INFO - TRANSIENT:  17% | elapsed: 00:00:01 (eta: 00:00:04) | 2846 steps (2845.4 steps/s)\n",
      "2025-11-02 15:48:24,591 - INFO - TRANSIENT:  20% | elapsed: 00:00:01 (eta: 00:00:04) | 3294 steps (2810.6 steps/s)\n",
      "2025-11-02 15:48:25,591 - INFO - TRANSIENT:  36% | elapsed: 00:00:02 (eta: 00:00:03) | 6131 steps (2836.1 steps/s)\n",
      "2025-11-02 15:48:25,871 - INFO - TRANSIENT:  40% | elapsed: 00:00:02 (eta: 00:00:03) | 6934 steps (2865.7 steps/s)\n",
      "2025-11-02 15:48:26,872 - INFO - TRANSIENT:  55% | elapsed: 00:00:03 (eta: 00:00:02) | 9809 steps (2874.4 steps/s)\n",
      "2025-11-02 15:48:27,246 - INFO - TRANSIENT:  60% | elapsed: 00:00:03 (eta: 00:00:02) | 10888 steps (2875.2 steps/s)\n",
      "2025-11-02 15:48:28,247 - INFO - TRANSIENT:  73% | elapsed: 00:00:04 (eta: 00:00:01) | 13756 steps (2866.8 steps/s)\n",
      "2025-11-02 15:48:28,781 - INFO - TRANSIENT:  80% | elapsed: 00:00:05 (eta: 00:00:01) | 15227 steps (2754.1 steps/s)\n",
      "2025-11-02 15:48:29,781 - INFO - TRANSIENT:  92% | elapsed: 00:00:06 (eta: 00:00:00) | 18059 steps (2831.2 steps/s)\n",
      "2025-11-02 15:48:30,487 - INFO - TRANSIENT: 100% | elapsed: 00:00:07 (eta: 00:00:00) | 20077 steps (2860.4 steps/s)\n",
      "2025-11-02 15:48:30,488 - INFO - TRANSIENT: 100% | elapsed: 00:00:07 (eta: 00:00:00) | 20077 steps (2844.9 avg steps/s)\n",
      "2025-11-02 15:48:30,488 - INFO - FINISHED -> TRANSIENT (total steps: 20077, successful: 13028, runtime: 7057.17 ms)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'total_steps': 20077,\n",
       " 'successful_steps': 13028,\n",
       " 'runtime_ms': 7057.173200009856}"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Simulation initialization\n",
    "Sim_ABS = Simulation(blocks, connections, events, Solver=RKCK54)\n",
    "\n",
    "# Run simulation for 5 seconds\n",
    "Sim_ABS.run(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-23",
   "metadata": {},
   "source": [
    "## Comparison: System without ABS\n",
    "\n",
    "To demonstrate the effectiveness of ABS, let's simulate the same scenario without ABS control (constant maximum braking):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "cell-24",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025-11-02 15:48:37,690 - INFO - LOGGING (log: True)\n",
      "2025-11-02 15:48:37,691 - INFO - BLOCK (type: Integrator, dynamic: True, events: 0)\n",
      "2025-11-02 15:48:37,691 - INFO - BLOCK (type: Clip, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:37,691 - INFO - BLOCK (type: Amplifier, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:37,692 - INFO - BLOCK (type: Integrator, dynamic: True, events: 0)\n",
      "2025-11-02 15:48:37,692 - INFO - BLOCK (type: Amplifier, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:37,692 - INFO - BLOCK (type: Function, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:37,692 - INFO - BLOCK (type: Function, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:37,693 - INFO - BLOCK (type: Function, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:37,693 - INFO - BLOCK (type: Constant, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:37,694 - INFO - BLOCK (type: Amplifier, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:37,694 - INFO - BLOCK (type: Amplifier, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:37,694 - INFO - BLOCK (type: Adder, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:37,694 - INFO - BLOCK (type: Amplifier, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:37,695 - INFO - BLOCK (type: Scope, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:37,695 - INFO - BLOCK (type: Scope, dynamic: False, events: 0)\n",
      "2025-11-02 15:48:37,696 - INFO - GRAPH (size: 15, alg. depth: 7, loop depth: 0, runtime: 0.186ms)\n",
      "2025-11-02 15:48:37,697 - INFO - STARTING -> TRANSIENT (Duration: 5.00s)\n",
      "2025-11-02 15:48:37,698 - INFO - TRANSIENT:   0% | elapsed: 00:00:00 (eta: --:--:--) | 0 steps (N/A steps/s)\n",
      "2025-11-02 15:48:37,708 - INFO - TRANSIENT: 100% | elapsed: 00:00:00 (eta: --:--:--) | 31 steps (2809.8 steps/s)\n",
      "2025-11-02 15:48:37,710 - INFO - TRANSIENT: 100% | elapsed: 00:00:00 (eta: --:--:--) | 31 steps (2542.9 avg steps/s)\n",
      "2025-11-02 15:48:37,710 - INFO - FINISHED -> TRANSIENT (total steps: 31, successful: 15, runtime: 12.19 ms)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'total_steps': 31, 'successful_steps': 15, 'runtime_ms': 12.189600005513057}"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# System without ABS - constant brake torque\n",
    "omg_raw_noabs = Integrator(omega0)\n",
    "omg_clp_noabs = Clip(min_val=0, max_val=1000)\n",
    "omg_acc_noabs = Amplifier(1/J_w)\n",
    "\n",
    "vel_noabs = Integrator(v0)\n",
    "vel_acc_noabs = Amplifier(-1/M)\n",
    "\n",
    "slp_noabs = Function(calculate_slip)\n",
    "frc_noabs = Function(friction_force)\n",
    "frc_cof_noabs = Function(friction_coefficient)\n",
    "\n",
    "brk_noabs = Constant(T_brake)  # Constant brake torque (no ABS)\n",
    "brk_neg_noabs = Amplifier(-1)\n",
    "\n",
    "whl_trq_noabs = Amplifier(R)\n",
    "trq_sum_noabs = Adder(\"++\")\n",
    "whl_vel_noabs = Amplifier(R)\n",
    "\n",
    "sco1_noabs = Scope(labels=[\"Vehicle Speed [m/s]\", \"Wheel Speed [m/s]\"])\n",
    "sco2_noabs = Scope(labels=[\"Slip Ratio\", \"Friction Coeff\"])\n",
    "\n",
    "blocks_noabs = [\n",
    "    omg_raw_noabs, omg_clp_noabs, omg_acc_noabs, vel_noabs, vel_acc_noabs,\n",
    "    slp_noabs, frc_noabs, frc_cof_noabs, brk_noabs, brk_neg_noabs,\n",
    "    whl_trq_noabs, trq_sum_noabs, whl_vel_noabs, sco1_noabs, sco2_noabs\n",
    "]\n",
    "\n",
    "connections_noabs = [\n",
    "    Connection(omg_acc_noabs, omg_raw_noabs),\n",
    "    Connection(omg_raw_noabs, omg_clp_noabs),\n",
    "    Connection(omg_clp_noabs, whl_vel_noabs),\n",
    "    Connection(trq_sum_noabs, omg_acc_noabs),\n",
    "    Connection(vel_acc_noabs, vel_noabs),\n",
    "    Connection(vel_noabs, sco1_noabs[0]),\n",
    "    Connection(vel_noabs, slp_noabs[0]),\n",
    "    Connection(omg_clp_noabs, slp_noabs[1]),\n",
    "    Connection(slp_noabs, sco2_noabs[0]),\n",
    "    Connection(slp_noabs, frc_noabs),\n",
    "    Connection(frc_noabs, whl_trq_noabs, vel_acc_noabs),\n",
    "    Connection(slp_noabs, frc_cof_noabs),\n",
    "    Connection(frc_cof_noabs, sco2_noabs[1]),\n",
    "    Connection(brk_noabs, brk_neg_noabs),\n",
    "    Connection(brk_neg_noabs, trq_sum_noabs[1]),\n",
    "    Connection(whl_trq_noabs, trq_sum_noabs[0]),\n",
    "    Connection(whl_vel_noabs, sco1_noabs[1]),\n",
    "]\n",
    "\n",
    "# Simulation without ABS\n",
    "Sim_NoABS = Simulation(blocks_noabs, connections_noabs, Solver=RKCK54, dt=0.001)\n",
    "Sim_NoABS.run(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-25",
   "metadata": {},
   "source": [
    "## Results and Comparison\n",
    "\n",
    "Let's plot and compare both scenarios:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "id": "cell-26",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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
Download .txt
gitextract_8xwsjhq7/

├── .codecov.yml
├── .github/
│   ├── FUNDING.yml
│   └── workflows/
│       ├── pypi_deployment.yml
│       ├── tests_codecov.yml
│       └── urlchecker.yml
├── .gitignore
├── CITATION.cff
├── LICENSE.txt
├── README.md
├── conftest.py
├── docs/
│   ├── .readthedocs.yaml
│   ├── Makefile
│   ├── requirements.txt
│   └── source/
│       ├── _ext/
│       │   └── github_issues.py
│       ├── _static/
│       │   ├── custom.css
│       │   └── redirect.js
│       ├── api.rst
│       ├── conf.py
│       ├── contributing.rst
│       ├── examples/
│       │   ├── abs_braking.ipynb
│       │   ├── algebraic_loop.ipynb
│       │   ├── billards.ipynb
│       │   ├── bouncing_ball.ipynb
│       │   ├── bouncing_pendulum.ipynb
│       │   ├── cascade_controller.ipynb
│       │   ├── checkpoints.ipynb
│       │   ├── chemical_reactor.ipynb
│       │   ├── coupled_oscillators.ipynb
│       │   ├── data/
│       │   │   ├── BouncingBall_ME.fmu
│       │   │   ├── CoupledClutches_CS_linux64.fmu
│       │   │   ├── CoupledClutches_CS_win64.fmu
│       │   │   ├── Dahlquist.fmu
│       │   │   └── VanDerPol_ME.fmu
│       │   ├── dcmotor_control.ipynb
│       │   ├── delta_sigma_adc.ipynb
│       │   ├── diode_circuit.ipynb
│       │   ├── elastic_pendulum.ipynb
│       │   ├── fmcw_radar.ipynb
│       │   ├── fmu_cosimulation.ipynb
│       │   ├── fmu_model_exchange_bouncing_ball.ipynb
│       │   ├── fmu_model_exchange_vanderpol.ipynb
│       │   ├── harmonic_oscillator.ipynb
│       │   ├── kalman_filter.ipynb
│       │   ├── linear_feedback.ipynb
│       │   ├── lorenz_attractor.ipynb
│       │   ├── nested_subsystems.ipynb
│       │   ├── noisy_amplifier.ipynb
│       │   ├── pendulum.ipynb
│       │   ├── pid_controller.ipynb
│       │   ├── poincare_maps.ipynb
│       │   ├── rf_network_oneport.ipynb
│       │   ├── sar_adc.ipynb
│       │   ├── spectrum_analysis.ipynb
│       │   ├── stick_slip.ipynb
│       │   ├── switched_bouncing_ball.ipynb
│       │   ├── thermostat.ipynb
│       │   ├── transfer_function.ipynb
│       │   └── vanderpol.ipynb
│       ├── examples.rst
│       ├── index.rst
│       ├── modules/
│       │   ├── pathsim.blocks._block.rst
│       │   ├── pathsim.blocks.adder.rst
│       │   ├── pathsim.blocks.amplifier.rst
│       │   ├── pathsim.blocks.comparator.rst
│       │   ├── pathsim.blocks.converters.rst
│       │   ├── pathsim.blocks.counter.rst
│       │   ├── pathsim.blocks.ctrl.rst
│       │   ├── pathsim.blocks.delay.rst
│       │   ├── pathsim.blocks.differentiator.rst
│       │   ├── pathsim.blocks.discrete.rst
│       │   ├── pathsim.blocks.dynsys.rst
│       │   ├── pathsim.blocks.filters.rst
│       │   ├── pathsim.blocks.fmu.rst
│       │   ├── pathsim.blocks.function.rst
│       │   ├── pathsim.blocks.integrator.rst
│       │   ├── pathsim.blocks.kalman.rst
│       │   ├── pathsim.blocks.lti.rst
│       │   ├── pathsim.blocks.math.rst
│       │   ├── pathsim.blocks.multiplier.rst
│       │   ├── pathsim.blocks.noise.rst
│       │   ├── pathsim.blocks.ode.rst
│       │   ├── pathsim.blocks.relay.rst
│       │   ├── pathsim.blocks.rf.rst
│       │   ├── pathsim.blocks.rng.rst
│       │   ├── pathsim.blocks.rst
│       │   ├── pathsim.blocks.scope.rst
│       │   ├── pathsim.blocks.sources.rst
│       │   ├── pathsim.blocks.spectrum.rst
│       │   ├── pathsim.blocks.switch.rst
│       │   ├── pathsim.blocks.table.rst
│       │   ├── pathsim.blocks.wrapper.rst
│       │   ├── pathsim.connection.rst
│       │   ├── pathsim.events._event.rst
│       │   ├── pathsim.events.condition.rst
│       │   ├── pathsim.events.rst
│       │   ├── pathsim.events.schedule.rst
│       │   ├── pathsim.events.zerocrossing.rst
│       │   ├── pathsim.optim.anderson.rst
│       │   ├── pathsim.optim.booster.rst
│       │   ├── pathsim.optim.numerical.rst
│       │   ├── pathsim.optim.operator.rst
│       │   ├── pathsim.optim.rst
│       │   ├── pathsim.simulation.rst
│       │   ├── pathsim.solvers._rungekutta.rst
│       │   ├── pathsim.solvers._solver.rst
│       │   ├── pathsim.solvers.bdf.rst
│       │   ├── pathsim.solvers.dirk2.rst
│       │   ├── pathsim.solvers.dirk3.rst
│       │   ├── pathsim.solvers.esdirk32.rst
│       │   ├── pathsim.solvers.esdirk4.rst
│       │   ├── pathsim.solvers.esdirk43.rst
│       │   ├── pathsim.solvers.esdirk54.rst
│       │   ├── pathsim.solvers.esdirk85.rst
│       │   ├── pathsim.solvers.euler.rst
│       │   ├── pathsim.solvers.gear.rst
│       │   ├── pathsim.solvers.rk4.rst
│       │   ├── pathsim.solvers.rkbs32.rst
│       │   ├── pathsim.solvers.rkck54.rst
│       │   ├── pathsim.solvers.rkdp54.rst
│       │   ├── pathsim.solvers.rkdp87.rst
│       │   ├── pathsim.solvers.rkf21.rst
│       │   ├── pathsim.solvers.rkf45.rst
│       │   ├── pathsim.solvers.rkf78.rst
│       │   ├── pathsim.solvers.rkv65.rst
│       │   ├── pathsim.solvers.rst
│       │   ├── pathsim.solvers.ssprk22.rst
│       │   ├── pathsim.solvers.ssprk33.rst
│       │   ├── pathsim.solvers.ssprk34.rst
│       │   ├── pathsim.solvers.steadystate.rst
│       │   ├── pathsim.subsystem.rst
│       │   ├── pathsim.utils.adaptivebuffer.rst
│       │   ├── pathsim.utils.analysis.rst
│       │   ├── pathsim.utils.gilbert.rst
│       │   ├── pathsim.utils.logger.rst
│       │   ├── pathsim.utils.portreference.rst
│       │   ├── pathsim.utils.progresstracker.rst
│       │   ├── pathsim.utils.realtimeplotter.rst
│       │   ├── pathsim.utils.register.rst
│       │   └── pathsim.utils.rst
│       ├── pathsim_docs.mplstyle
│       ├── quickstart.ipynb
│       ├── roadmap.rst
│       └── roadmap_generated.rst
├── examples/
│   ├── example_abs_braking.py
│   ├── example_adc.py
│   ├── example_algebraicchain.py
│   ├── example_algebraicloop.py
│   ├── example_cascade.py
│   ├── example_dcmotor.py
│   ├── example_deltasigma.py
│   ├── example_derivative.py
│   ├── example_diode.py
│   ├── example_dualslope.py
│   ├── example_elastic_pendulum.py
│   ├── example_feedback.py
│   ├── example_filters.py
│   ├── example_harmonic_oscillator.py
│   ├── example_kalman_filter.py
│   ├── example_nested_subsystems.py
│   ├── example_noise.py
│   ├── example_pendulum.py
│   ├── example_phasenoise.py
│   ├── example_pid.py
│   ├── example_pid_antiwindup.py
│   ├── example_pid_vs_discretePID.py
│   ├── example_radar.py
│   ├── example_reactor.py
│   ├── example_sar.py
│   ├── example_solar.py
│   ├── example_solver_hotswap.py
│   ├── example_spectrum.py
│   ├── example_spectrum_rf_oneport.py
│   ├── example_steadystate.py
│   ├── example_stickslip.py
│   ├── example_transferfunction.py
│   ├── example_vanderpol_subsystem.py
│   ├── examples_event/
│   │   ├── example_billards_sphere.py
│   │   ├── example_bouncing_pendulum.py
│   │   ├── example_bouncingball.py
│   │   ├── example_bouncingball_friction.py
│   │   ├── example_bouncingball_switched.py
│   │   ├── example_integrator_reset.py
│   │   ├── example_pulse.py
│   │   ├── example_stickslip_event.py
│   │   ├── example_thermostat.py
│   │   └── example_volterralotka_event.py
│   └── examples_odes/
│       ├── example_bonhoeffer_vanderpol.py
│       ├── example_brusselator.py
│       ├── example_chemical.py
│       ├── example_duffing.py
│       ├── example_fairen_velarde.py
│       ├── example_fitzhughnagumo.py
│       ├── example_flame.py
│       ├── example_glycolysis.py
│       ├── example_lorenz.py
│       ├── example_morse.py
│       ├── example_robertson.py
│       ├── example_roessler.py
│       ├── example_thomas_cyclic.py
│       ├── example_vanderpol.py
│       └── example_volterralotka.py
├── git
├── pyproject.toml
├── src/
│   └── pathsim/
│       ├── __init__.py
│       ├── _constants.py
│       ├── blocks/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── _block.py
│       │   ├── adder.py
│       │   ├── amplifier.py
│       │   ├── comparator.py
│       │   ├── converters.py
│       │   ├── counter.py
│       │   ├── ctrl.py
│       │   ├── delay.py
│       │   ├── differentiator.py
│       │   ├── discrete.py
│       │   ├── divider.py
│       │   ├── dynsys.py
│       │   ├── filters.py
│       │   ├── fmu.py
│       │   ├── function.py
│       │   ├── integrator.py
│       │   ├── kalman.py
│       │   ├── logic.py
│       │   ├── lti.py
│       │   ├── math.py
│       │   ├── multiplier.py
│       │   ├── noise.py
│       │   ├── ode.py
│       │   ├── relay.py
│       │   ├── rf.py
│       │   ├── rng.py
│       │   ├── scope.py
│       │   ├── sources.py
│       │   ├── spectrum.py
│       │   ├── switch.py
│       │   ├── table.py
│       │   └── wrapper.py
│       ├── connection.py
│       ├── events/
│       │   ├── __init__.py
│       │   ├── _event.py
│       │   ├── condition.py
│       │   ├── schedule.py
│       │   └── zerocrossing.py
│       ├── exceptions.py
│       ├── optim/
│       │   ├── __init__.py
│       │   ├── anderson.py
│       │   ├── booster.py
│       │   ├── numerical.py
│       │   └── operator.py
│       ├── simulation.py
│       ├── solvers/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── _rungekutta.py
│       │   ├── _solver.py
│       │   ├── bdf.py
│       │   ├── dirk2.py
│       │   ├── dirk3.py
│       │   ├── esdirk32.py
│       │   ├── esdirk4.py
│       │   ├── esdirk43.py
│       │   ├── esdirk54.py
│       │   ├── esdirk85.py
│       │   ├── euler.py
│       │   ├── gear.py
│       │   ├── rk4.py
│       │   ├── rkbs32.py
│       │   ├── rkck54.py
│       │   ├── rkdp54.py
│       │   ├── rkdp87.py
│       │   ├── rkf21.py
│       │   ├── rkf45.py
│       │   ├── rkf78.py
│       │   ├── rkv65.py
│       │   ├── ssprk22.py
│       │   ├── ssprk33.py
│       │   ├── ssprk34.py
│       │   └── steadystate.py
│       ├── subsystem.py
│       └── utils/
│           ├── __init__.py
│           ├── adaptivebuffer.py
│           ├── analysis.py
│           ├── deprecation.py
│           ├── diagnostics.py
│           ├── fmuwrapper.py
│           ├── gilbert.py
│           ├── graph.py
│           ├── logger.py
│           ├── mutable.py
│           ├── portreference.py
│           ├── progresstracker.py
│           ├── realtimeplotter.py
│           └── register.py
└── tests/
    ├── README.md
    ├── __init__.py
    ├── evals/
    │   ├── CoupledClutches_CS.fmu
    │   ├── __init__.py
    │   ├── conftest.py
    │   ├── test_algebraic_system.py
    │   ├── test_bouncingball_friction_event_system.py
    │   ├── test_bouncingball_system.py
    │   ├── test_brusselator_system.py
    │   ├── test_cosim_fmu_system.py
    │   ├── test_counter_comparator_system.py
    │   ├── test_dynamical_system_ivp.py
    │   ├── test_fitzhughnagumo_system.py
    │   ├── test_harmonic_oscillator_system.py
    │   ├── test_linear_feedback_system.py
    │   ├── test_logic_system.py
    │   ├── test_lorenz_system.py
    │   ├── test_me_analytical.py
    │   ├── test_model_exchange_fmu_system.py
    │   ├── test_pid_system.py
    │   ├── test_relay_thermostat_system.py
    │   ├── test_rescale_delay_system.py
    │   ├── test_robertson_system.py
    │   ├── test_roessler_system.py
    │   ├── test_signal_processing_system.py
    │   ├── test_steadystate_transient_system.py
    │   ├── test_switch_lti_system.py
    │   ├── test_vanderpol_system.py
    │   └── test_volterralotka_system.py
    └── pathsim/
        ├── __init__.py
        ├── blocks/
        │   ├── __init__.py
        │   ├── _embedding.py
        │   ├── rf/
        │   │   ├── __init__.py
        │   │   ├── ring_slot.s2p
        │   │   ├── ring_slot_meas.s1p
        │   │   └── test_rf.py
        │   ├── test_adder.py
        │   ├── test_amplifier.py
        │   ├── test_block.py
        │   ├── test_comparator.py
        │   ├── test_converters.py
        │   ├── test_counter.py
        │   ├── test_ctrl.py
        │   ├── test_delay.py
        │   ├── test_differentiator.py
        │   ├── test_discrete.py
        │   ├── test_divider.py
        │   ├── test_dynsys.py
        │   ├── test_filters.py
        │   ├── test_fmu.py
        │   ├── test_function.py
        │   ├── test_integrator.py
        │   ├── test_kalman.py
        │   ├── test_logic.py
        │   ├── test_lti.py
        │   ├── test_math.py
        │   ├── test_multiplier.py
        │   ├── test_noise.py
        │   ├── test_ode.py
        │   ├── test_relay.py
        │   ├── test_rng.py
        │   ├── test_scope.py
        │   ├── test_sources.py
        │   ├── test_spectrum.py
        │   ├── test_switch.py
        │   ├── test_table.py
        │   └── test_wrapper.py
        ├── events/
        │   ├── __init__.py
        │   ├── test_condition.py
        │   ├── test_event.py
        │   ├── test_schedule.py
        │   └── test_zerocrossing.py
        ├── optim/
        │   ├── __init__.py
        │   ├── test_anderson.py
        │   ├── test_numerical.py
        │   └── test_operator.py
        ├── solvers/
        │   ├── __init__.py
        │   ├── _referenceproblems.py
        │   ├── test_bdf.py
        │   ├── test_dirk2.py
        │   ├── test_dirk3.py
        │   ├── test_esdirk32.py
        │   ├── test_esdirk4.py
        │   ├── test_esdirk43.py
        │   ├── test_esdirk54.py
        │   ├── test_esdirk85.py
        │   ├── test_euler.py
        │   ├── test_gear.py
        │   ├── test_rfk21.py
        │   ├── test_rk4.py
        │   ├── test_rkbs32.py
        │   ├── test_rkck54.py
        │   ├── test_rkdp54.py
        │   ├── test_rkdp87.py
        │   ├── test_rkf45.py
        │   ├── test_rkf78.py
        │   ├── test_rkv65.py
        │   ├── test_solver.py
        │   ├── test_ssprk22.py
        │   ├── test_ssprk33.py
        │   ├── test_ssprk34.py
        │   └── test_steadystate.py
        ├── test_checkpoint.py
        ├── test_connection.py
        ├── test_diagnostics.py
        ├── test_simulation.py
        ├── test_subsystem.py
        └── utils/
            ├── __init__.py
            ├── test_adaptivebuffer.py
            ├── test_analysis.py
            ├── test_fmuwrapper.py
            ├── test_gilbert.py
            ├── test_graph.py
            ├── test_logger.py
            ├── test_mutable.py
            ├── test_portreference.py
            ├── test_progresstracker.py
            ├── test_realtimeplotter.py
            └── test_register.py
Download .txt
SYMBOL INDEX (2359 symbols across 221 files)

FILE: conftest.py
  function pytest_addoption (line 1) | def pytest_addoption(parser):
  function pytest_configure (line 10) | def pytest_configure(config):

FILE: docs/source/_ext/github_issues.py
  function fetch_github_issues (line 5) | def fetch_github_issues(app, config):
  function write_issue_html (line 62) | def write_issue_html(f, issue):
  function setup (line 99) | def setup(app):

FILE: examples/example_abs_braking.py
  function friction_coefficient (line 45) | def friction_coefficient(slip):
  function calculate_slip (line 49) | def calculate_slip(v, omega):
  function friction_force (line 57) | def friction_force(slip_ratio):
  function abs_control (line 64) | def abs_control():
  function evt_slip_high (line 142) | def evt_slip_high(t):
  function act_release_brake (line 147) | def act_release_brake(t):
  function evt_slip_low (line 155) | def evt_slip_low(t):
  function act_apply_brake (line 160) | def act_apply_brake(t):

FILE: examples/example_cascade.py
  function f_s (line 50) | def f_s(t):

FILE: examples/example_diode.py
  function diode_current (line 32) | def diode_current(v_diode):
  function voltage_source (line 38) | def voltage_source(t):

FILE: examples/example_elastic_pendulum.py
  function rad_ode (line 34) | def rad_ode(x, u, t):
  function ang_ode (line 50) | def ang_ode(x, u, t):
  function crt (line 70) | def crt(r, phi):

FILE: examples/example_pid.py
  function f_s (line 26) | def f_s(t):

FILE: examples/example_pid_antiwindup.py
  function f_s (line 30) | def f_s(t):

FILE: examples/example_pid_vs_discretePID.py
  class DiscretePID (line 17) | class DiscretePID(Wrapper):
    method __init__ (line 49) | def __init__(self, T=1, tau=0, Kp=1, Ki=1, Kd=1):
    method func (line 58) | def func(self, error):
  function f_s (line 90) | def f_s(t):

FILE: examples/example_reactor.py
  function reaction_rates (line 46) | def reaction_rates(x, u, t):

FILE: examples/example_sar.py
  class SAR (line 28) | class SAR(Block):
    method __init__ (line 30) | def __init__(self, n_bits=4, T=1, tau=0):
    method __len__ (line 69) | def __len__(self):

FILE: examples/example_solar.py
  class Body (line 28) | class Body:
    method __init__ (line 30) | def __init__(self, name, mass, pos, vel):
    method acceleration (line 38) | def acceleration(self, others):
    method set_state (line 46) | def set_state(self, x):
  function solar_system_ode (line 86) | def solar_system_ode(x, u, t):

FILE: examples/example_solver_hotswap.py
  function func (line 25) | def func(x, u, t):
  function jac (line 29) | def jac(x, u, t):

FILE: examples/example_spectrum.py
  function H (line 75) | def H(s):

FILE: examples/example_stickslip.py
  function v_belt (line 30) | def v_belt(t):
  function _f (line 34) | def _f(x, u, t):

FILE: examples/examples_event/example_billards_sphere.py
  function bounce_detect (line 35) | def bounce_detect(_):
  function bounce_act (line 39) | def bounce_act(_):

FILE: examples/examples_event/example_bouncing_pendulum.py
  function func_evt (line 56) | def func_evt(t):
  function func_act (line 61) | def func_act(t):

FILE: examples/examples_event/example_bouncingball.py
  function func_evt (line 49) | def func_evt(t):
  function func_act (line 54) | def func_act(t):

FILE: examples/examples_event/example_bouncingball_friction.py
  function fric (line 37) | def fric(v):
  function func_evt (line 61) | def func_evt(t):
  function func_act (line 66) | def func_act(t):

FILE: examples/examples_event/example_bouncingball_switched.py
  function fric (line 37) | def fric(v):
  function func_evt_1 (line 62) | def func_evt_1(t):
  function func_act_1 (line 66) | def func_act_1(t):
  function func_evt_2 (line 79) | def func_evt_2(t):
  function func_act_2 (line 83) | def func_act_2(t):

FILE: examples/examples_event/example_integrator_reset.py
  function func_evt (line 35) | def func_evt(t):
  function func_act (line 39) | def func_act(t):

FILE: examples/examples_event/example_stickslip_event.py
  function v_belt (line 46) | def v_belt(t):
  function f_coulomb (line 52) | def f_coulomb(v, vb):
  function slip_to_stick_evt (line 102) | def slip_to_stick_evt(t):
  function slip_to_stick_act (line 109) | def slip_to_stick_act(t):
  function stick_to_slip_evt (line 127) | def stick_to_slip_evt(t):
  function stick_to_slip_act (line 131) | def stick_to_slip_act(t):

FILE: examples/examples_event/example_thermostat.py
  function func_evt_up (line 50) | def func_evt_up(t):
  function func_act_up (line 54) | def func_act_up(t):
  function func_act_down (line 63) | def func_act_down(t):
  function func_evt_down (line 66) | def func_evt_down(t):

FILE: examples/examples_event/example_volterralotka_event.py
  function _f (line 30) | def _f(x, u, t):
  function func_evt_1 (line 51) | def func_evt_1(t):
  function func_evt_2 (line 55) | def func_evt_2(t):

FILE: examples/examples_odes/example_bonhoeffer_vanderpol.py
  function f_bhf (line 23) | def f_bhf(_x, u, t):
  function s_bhf (line 29) | def s_bhf(t):

FILE: examples/examples_odes/example_brusselator.py
  function f_bru (line 22) | def f_bru(_x, u, t):

FILE: examples/examples_odes/example_chemical.py
  function f_che (line 23) | def f_che(_x, u, t):

FILE: examples/examples_odes/example_fairen_velarde.py
  function f_bac (line 22) | def f_bac(_x, u, t):

FILE: examples/examples_odes/example_glycolysis.py
  function f_gly (line 23) | def f_gly(_x, u, t):

FILE: examples/examples_odes/example_morse.py
  function f_mrs (line 23) | def f_mrs(x, u, t):
  function s_mrs (line 29) | def s_mrs(t):

FILE: examples/examples_odes/example_robertson.py
  function func (line 25) | def func(x, u, t):

FILE: examples/examples_odes/example_thomas_cyclic.py
  function f_tcs (line 22) | def f_tcs(_x, u, t):

FILE: examples/examples_odes/example_vanderpol.py
  function func (line 25) | def func(x, u, t):
  function jac (line 29) | def jac(x, u, t):

FILE: src/pathsim/blocks/_block.py
  class Block (line 23) | class Block:
    method __init__ (line 85) | def __init__(self):
    method __len__ (line 109) | def __len__(self):
    method __getitem__ (line 128) | def __getitem__(self, key):
    method __call__ (line 181) | def __call__(self):
    method __bool__ (line 186) | def __bool__(self):
    method size (line 193) | def size(self):
    method shape (line 208) | def shape(self):
    method info (line 221) | def info(cls):
    method plot (line 268) | def plot(self, *args, **kwargs):
    method on (line 287) | def on(self):
    method off (line 296) | def off(self):
    method reset (line 306) | def reset(self):
    method linearize (line 327) | def linearize(self, t):
    method delinearize (line 354) | def delinearize(self):
    method set_solver (line 368) | def set_solver(self, Solver, parent, **solver_args):
    method revert (line 398) | def revert(self):
    method buffer (line 408) | def buffer(self, dt):
    method sample (line 425) | def sample(self, t, dt):
    method read (line 444) | def read(self):
    method collect (line 456) | def collect(self):
    method get_all (line 470) | def get_all(self):
    method state (line 493) | def state(self):
    method state (line 511) | def state(self, val):
    method to_checkpoint (line 529) | def to_checkpoint(self, prefix, recordings=False):
    method load_checkpoint (line 575) | def load_checkpoint(self, prefix, json_data, npz):
    method update (line 616) | def update(self, t):
    method solve (line 654) | def solve(self, t, dt):
    method step (line 681) | def step(self, t, dt):

FILE: src/pathsim/blocks/adder.py
  class Adder (line 21) | class Adder(Block):
    method __init__ (line 81) | def __init__(self, operations=None):
    method __len__ (line 124) | def __len__(self):
    method update (line 129) | def update(self, t):

FILE: src/pathsim/blocks/amplifier.py
  class Amplifier (line 18) | class Amplifier(Block):
    method __init__ (line 57) | def __init__(self, gain=1.0):
    method update (line 67) | def update(self, t):

FILE: src/pathsim/blocks/comparator.py
  class Comparator (line 19) | class Comparator(Block):
    method __init__ (line 50) | def __init__(self, threshold=0, tolerance=1e-4, span=[-1, 1]):
    method update (line 70) | def update(self, t):

FILE: src/pathsim/blocks/converters.py
  class ADC (line 21) | class ADC(Block):
    method __init__ (line 67) | def __init__(self, n_bits=4, span=[-1, 1], T=1, tau=0):
    method __len__ (line 104) | def __len__(self):
  class DAC (line 110) | class DAC(Block):
    method __init__ (line 157) | def __init__(self, n_bits=4, span=[-1, 1], T=1, tau=0):
    method __len__ (line 187) | def __len__(self):

FILE: src/pathsim/blocks/counter.py
  class Counter (line 19) | class Counter(Block):
    method __init__ (line 44) | def __init__(self, start=0, threshold=0.0):
    method __len__ (line 59) | def __len__(self):
    method update (line 64) | def update(self, t):
  class CounterUp (line 83) | class CounterUp(Counter):
    method __init__ (line 106) | def __init__(self, start=0, threshold=0.0):
  class CounterDown (line 118) | class CounterDown(Counter):
    method __init__ (line 141) | def __init__(self, start=0, threshold=0.0):

FILE: src/pathsim/blocks/ctrl.py
  class PT1 (line 23) | class PT1(StateSpace):
    method __init__ (line 55) | def __init__(self, K=1.0, T=1.0):
  class PT2 (line 71) | class PT2(StateSpace):
    method __init__ (line 114) | def __init__(self, K=1.0, T=1.0, d=1.0):
  class LeadLag (line 131) | class LeadLag(StateSpace):
    method __init__ (line 171) | def __init__(self, K=1.0, T1=1.0, T2=1.0):
  class PID (line 188) | class PID(StateSpace):
    method __init__ (line 238) | def __init__(self, Kp=0, Ki=0, Kd=0, f_max=100):
  class AntiWindupPID (line 262) | class AntiWindupPID(PID):
    method __init__ (line 330) | def __init__(self, Kp=0, Ki=0, Kd=0, f_max=100, Ks=10, limits=[-10, 10]):
  class RateLimiter (line 357) | class RateLimiter(DynamicalSystem):
    method __init__ (line 399) | def __init__(self, rate=1.0, f_max=100):
    method __len__ (line 412) | def __len__(self):
  class Backlash (line 416) | class Backlash(DynamicalSystem):
    method __init__ (line 453) | def __init__(self, width=1.0, f_max=100):
    method __len__ (line 471) | def __len__(self):
  class Deadband (line 477) | class Deadband(Block):
    method __init__ (line 515) | def __init__(self, lower=-1.0, upper=1.0):

FILE: src/pathsim/blocks/delay.py
  class Delay (line 24) | class Delay(Block):
    method __init__ (line 92) | def __init__(self, tau=1e-3, sampling_period=None):
    method __len__ (line 128) | def __len__(self):
    method reset (line 133) | def reset(self):
    method to_checkpoint (line 145) | def to_checkpoint(self, prefix, recordings=False):
    method load_checkpoint (line 162) | def load_checkpoint(self, prefix, json_data, npz):
    method update (line 178) | def update(self, t):
    method sample (line 197) | def sample(self, t, dt):

FILE: src/pathsim/blocks/differentiator.py
  class Differentiator (line 19) | class Differentiator(Block):
    method __init__ (line 65) | def __init__(self, f_max=1e2):
    method __len__ (line 84) | def __len__(self):
    method update (line 88) | def update(self, t):
    method solve (line 102) | def solve(self, t, dt):
    method step (line 122) | def step(self, t, dt):

FILE: src/pathsim/blocks/discrete.py
  class SampleHold (line 27) | class SampleHold(Block):
    method __init__ (line 51) | def __init__(self, T=1.0, tau=0.0):
    method __len__ (line 69) | def __len__(self):
  class FirstOrderHold (line 80) | class FirstOrderHold(Block):
    method __init__ (line 114) | def __init__(self, T=1.0, tau=0.0):
    method __len__ (line 141) | def __len__(self):
    method reset (line 145) | def reset(self):
    method update (line 153) | def update(self, t):
  class FIR (line 165) | class FIR(Block):
    method __init__ (line 198) | def __init__(self, coeffs=[1.0], T=1.0, tau=0.0):
    method __len__ (line 223) | def __len__(self):
    method reset (line 227) | def reset(self):
    method to_checkpoint (line 233) | def to_checkpoint(self, prefix, recordings=False):
    method load_checkpoint (line 245) | def load_checkpoint(self, prefix, json_data, npz):
  class DiscreteIntegrator (line 266) | class DiscreteIntegrator(Block):
    method __init__ (line 296) | def __init__(self, T=1.0, tau=0.0, initial_value=0.0):
    method __len__ (line 319) | def __len__(self):
    method reset (line 323) | def reset(self):
  class DiscreteDerivative (line 332) | class DiscreteDerivative(Block):
    method __init__ (line 356) | def __init__(self, T=1.0, tau=0.0):
    method __len__ (line 378) | def __len__(self):
    method reset (line 382) | def reset(self):
  class DiscreteStateSpace (line 390) | class DiscreteStateSpace(Block):
    method __init__ (line 424) | def __init__(self, A=0.0, B=1.0, C=1.0, D=0.0, T=1.0, tau=0.0, initial...
    method __len__ (line 477) | def __len__(self):
    method reset (line 481) | def reset(self):
  class DiscreteTransferFunction (line 489) | class DiscreteTransferFunction(DiscreteStateSpace):
    method __init__ (line 514) | def __init__(self, Num=[1.0], Den=[1.0, 0.0], T=1.0, tau=0.0):
  class TappedDelay (line 524) | class TappedDelay(Block):
    method __init__ (line 551) | def __init__(self, N=2, T=1.0, tau=0.0):
    method __len__ (line 577) | def __len__(self):
    method reset (line 581) | def reset(self):

FILE: src/pathsim/blocks/divider.py
  class Divider (line 27) | class Divider(Block):
    method __init__ (line 113) | def __init__(self, operations="*/", zero_div="warn"):
    method __len__ (line 204) | def __len__(self):
    method update (line 209) | def update(self, t):

FILE: src/pathsim/blocks/dynsys.py
  class DynamicalSystem (line 19) | class DynamicalSystem(Block):
    method __init__ (line 54) | def __init__(
    method __len__ (line 84) | def __len__(self):
    method update (line 101) | def update(self, t):
    method solve (line 114) | def solve(self, t, dt):
    method step (line 134) | def step(self, t, dt):

FILE: src/pathsim/blocks/filters.py
  class ButterworthLowpassFilter (line 23) | class ButterworthLowpassFilter(StateSpace):
    method __init__ (line 42) | def __init__(self, Fc=100, n=2):
  class ButterworthHighpassFilter (line 58) | class ButterworthHighpassFilter(StateSpace):
    method __init__ (line 76) | def __init__(self, Fc=100, n=2):
  class ButterworthBandpassFilter (line 92) | class ButterworthBandpassFilter(StateSpace):
    method __init__ (line 110) | def __init__(self, Fc=[50, 100], n=2):
  class ButterworthBandstopFilter (line 127) | class ButterworthBandstopFilter(StateSpace):
    method __init__ (line 145) | def __init__(self, Fc=[50, 100], n=2):
  class AllpassFilter (line 162) | class AllpassFilter(StateSpace):
    method __init__ (line 182) | def __init__(self, fs=100, n=1):

FILE: src/pathsim/blocks/fmu.py
  class CoSimulationFMU (line 22) | class CoSimulationFMU(Block):
    method __init__ (line 50) | def __init__(self, fmu_path, instance_name="fmu_instance", start_value...
    method _step_fmu (line 80) | def _step_fmu(self, t):
    method reset (line 95) | def reset(self):
    method __len__ (line 103) | def __len__(self):
  class ModelExchangeFMU (line 108) | class ModelExchangeFMU(DynamicalSystem):
    method __init__ (line 138) | def __init__(self, fmu_path, instance_name="fmu_instance", start_value...
    method _get_derivatives (line 194) | def _get_derivatives(self, x, u, t):
    method _get_jacobian (line 206) | def _get_jacobian(self, x, u, t):
    method _get_outputs (line 215) | def _get_outputs(self, x, u, t):
    method _get_event_indicator (line 224) | def _get_event_indicator(self, idx):
    method _handle_event (line 229) | def _handle_event(self, t):
    method _update_time_events (line 262) | def _update_time_events(self, next_time):
    method sample (line 275) | def sample(self, t, dt):
    method reset (line 291) | def reset(self):

FILE: src/pathsim/blocks/function.py
  class Function (line 19) | class Function(Block):
    method __init__ (line 116) | def __init__(self, func=lambda x: x):
    method update (line 128) | def update(self, t):
  class DynamicalFunction (line 144) | class DynamicalFunction(Block):
    method __init__ (line 213) | def __init__(self, func=lambda u, t: u):
    method update (line 225) | def update(self, t):

FILE: src/pathsim/blocks/integrator.py
  class Integrator (line 21) | class Integrator(Block):
    method __init__ (line 60) | def __init__(self, initial_value=0.0):
    method __len__ (line 67) | def __len__(self):
    method update (line 71) | def update(self, t):
    method solve (line 87) | def solve(self, t, dt):
    method step (line 106) | def step(self, t, dt):

FILE: src/pathsim/blocks/kalman.py
  class KalmanFilter (line 19) | class KalmanFilter(Block):
    method __init__ (line 106) | def __init__(self, F, H, Q, R, B=None, x0=None, P0=None, dt=None):
    method __len__ (line 141) | def __len__(self):
    method to_checkpoint (line 146) | def to_checkpoint(self, prefix, recordings=False):
    method load_checkpoint (line 154) | def load_checkpoint(self, prefix, json_data, npz):
    method _kf_update (line 163) | def _kf_update(self):
    method sample (line 189) | def sample(self, t, dt):

FILE: src/pathsim/blocks/logic.py
  class Logic (line 21) | class Logic(Block):
    method __len__ (line 32) | def __len__(self):
    method update (line 37) | def update(self, t):
  class GreaterThan (line 52) | class GreaterThan(Logic):
    method __init__ (line 74) | def __init__(self):
  class LessThan (line 83) | class LessThan(Logic):
    method __init__ (line 105) | def __init__(self):
  class Equal (line 114) | class Equal(Logic):
    method __init__ (line 141) | def __init__(self, tolerance=1e-12):
  class LogicAnd (line 154) | class LogicAnd(Logic):
    method __init__ (line 172) | def __init__(self):
  class LogicOr (line 181) | class LogicOr(Logic):
    method __init__ (line 199) | def __init__(self):
  class LogicNot (line 208) | class LogicNot(Logic):
    method __init__ (line 223) | def __init__(self):

FILE: src/pathsim/blocks/lti.py
  class StateSpace (line 30) | class StateSpace(Block):
    method __init__ (line 84) | def __init__(self,
    method __len__ (line 125) | def __len__(self):
    method solve (line 129) | def solve(self, t, dt):
    method step (line 149) | def step(self, t, dt):
  class TransferFunctionPRC (line 174) | class TransferFunctionPRC(StateSpace):
    method __init__ (line 214) | def __init__(self, Poles=[], Residues=[], Const=0.0):
  class TransferFunction (line 227) | class TransferFunction(TransferFunctionPRC):
  class TransferFunctionZPG (line 233) | class TransferFunctionZPG(StateSpace):
    method __init__ (line 275) | def __init__(self, Zeros=[], Poles=[-1], Gain=1.0):
  class TransferFunctionNumDen (line 288) | class TransferFunctionNumDen(StateSpace):
    method __init__ (line 327) | def __init__(self, Num=[1], Den=[1, 1]):

FILE: src/pathsim/blocks/math.py
  class Math (line 23) | class Math(Block):
    method __len__ (line 34) | def __len__(self):
    method update (line 39) | def update(self, t):
  class Sin (line 54) | class Sin(Math):
    method __init__ (line 70) | def __init__(self):
  class Cos (line 80) | class Cos(Math):
    method __init__ (line 95) | def __init__(self):
  class Sqrt (line 105) | class Sqrt(Math):
    method __init__ (line 120) | def __init__(self):
  class Abs (line 130) | class Abs(Math):
    method __init__ (line 145) | def __init__(self):
  class Pow (line 155) | class Pow(Math):
    method __init__ (line 175) | def __init__(self, exponent=2):
  class PowProd (line 187) | class PowProd(Math):
    method __init__ (line 208) | def __init__(self, exponents=2):
  class Polynomial (line 239) | class Polynomial(Math):
    method __init__ (line 272) | def __init__(self, coeffs=[1.0, 0.0]):
  class Exp (line 291) | class Exp(Math):
    method __init__ (line 306) | def __init__(self):
  class Log (line 316) | class Log(Math):
    method __init__ (line 331) | def __init__(self):
  class Log10 (line 341) | class Log10(Math):
    method __init__ (line 356) | def __init__(self):
  class Tan (line 366) | class Tan(Math):
    method __init__ (line 381) | def __init__(self):
  class Sinh (line 391) | class Sinh(Math):
    method __init__ (line 406) | def __init__(self):
  class Cosh (line 416) | class Cosh(Math):
    method __init__ (line 431) | def __init__(self):
  class Tanh (line 441) | class Tanh(Math):
    method __init__ (line 456) | def __init__(self):
  class Atan (line 466) | class Atan(Math):
    method __init__ (line 481) | def __init__(self):
  class Norm (line 491) | class Norm(Math):
    method __init__ (line 506) | def __init__(self):
  class Mod (line 516) | class Mod(Math):
    method __init__ (line 541) | def __init__(self, modulus=1.0):
  class Clip (line 553) | class Clip(Math):
    method __init__ (line 575) | def __init__(self, min_val=-1.0, max_val=1.0):
  class Matrix (line 593) | class Matrix(Math):
    method __init__ (line 613) | def __init__(self, A=np.eye(1)):
  class Atan2 (line 634) | class Atan2(Block):
    method __init__ (line 658) | def __init__(self):
    method __len__ (line 674) | def __len__(self):
    method update (line 679) | def update(self, t):
  class Rescale (line 693) | class Rescale(Math):
    method __init__ (line 724) | def __init__(self, i0=0.0, i1=1.0, o0=0.0, o1=1.0, saturate=False):
  class Alias (line 757) | class Alias(Math):
    method __init__ (line 775) | def __init__(self):

FILE: src/pathsim/blocks/multiplier.py
  class Multiplier (line 22) | class Multiplier(Block):
    method __init__ (line 45) | def __init__(self):
    method update (line 56) | def update(self, t):

FILE: src/pathsim/blocks/noise.py
  class WhiteNoise (line 18) | class WhiteNoise(Block):
    method __init__ (line 50) | def __init__(self, standard_deviation=1.0, spectral_density=None,
    method __len__ (line 86) | def __len__(self):
    method _generate_sample (line 90) | def _generate_sample(self, dt):
    method sample (line 106) | def sample(self, t, dt):
    method update (line 123) | def update(self, t):
    method to_checkpoint (line 127) | def to_checkpoint(self, prefix, recordings=False):
    method load_checkpoint (line 134) | def load_checkpoint(self, prefix, json_data, npz):
  class PinkNoise (line 140) | class PinkNoise(Block):
    method __init__ (line 175) | def __init__(self, standard_deviation=1.0, spectral_density=None,
    method __len__ (line 216) | def __len__(self):
    method reset (line 220) | def reset(self):
    method _generate_sample (line 231) | def _generate_sample(self, dt):
    method sample (line 266) | def sample(self, t, dt):
    method update (line 283) | def update(self, t):
    method to_checkpoint (line 287) | def to_checkpoint(self, prefix, recordings=False):
    method load_checkpoint (line 296) | def load_checkpoint(self, prefix, json_data, npz):

FILE: src/pathsim/blocks/ode.py
  class ODE (line 21) | class ODE(Block):
    method __init__ (line 86) | def __init__(
    method __len__ (line 111) | def __len__(self):
    method update (line 115) | def update(self, t):
    method solve (line 132) | def solve(self, t, dt):
    method step (line 152) | def step(self, t, dt):

FILE: src/pathsim/blocks/relay.py
  class Relay (line 19) | class Relay(Block):
    method __init__ (line 63) | def __init__(
    method __len__ (line 99) | def __len__(self):
    method update (line 104) | def update(self, t):

FILE: src/pathsim/blocks/rf.py
  class RFNetwork (line 47) | class RFNetwork(StateSpace):
    method __init__ (line 76) | def __init__(self, ntwk: NetworkType | str | Path, auto_fit: bool = Tr...
    method s (line 102) | def s(self, freqs: np.ndarray) -> np.ndarray:

FILE: src/pathsim/blocks/rng.py
  class RandomNumberGenerator (line 20) | class RandomNumberGenerator(Block):
    method __init__ (line 45) | def __init__(self, sampling_period=None):
    method update (line 71) | def update(self, t):
    method sample (line 84) | def sample(self, t, dt):
    method to_checkpoint (line 99) | def to_checkpoint(self, prefix, recordings=False):
    method load_checkpoint (line 107) | def load_checkpoint(self, prefix, json_data, npz):
    method __len__ (line 114) | def __len__(self):
  class RNG (line 120) | class RNG(RandomNumberGenerator):

FILE: src/pathsim/blocks/scope.py
  class Scope (line 28) | class Scope(Block):
    method __init__ (line 67) | def __init__(self, sampling_period=None, t_wait=0.0, labels=None):
    method __len__ (line 105) | def __len__(self):
    method reset (line 109) | def reset(self):
    method read (line 120) | def read(self, incremental=False):
    method collect (line 157) | def collect(self):
    method sample (line 174) | def sample(self, t, dt):
    method plot (line 206) | def plot(self, *args, **kwargs):
    method plot2D (line 280) | def plot2D(self, *args, axes=(0, 1), **kwargs):
    method plot3D (line 347) | def plot3D(self, *args, axes=(0, 1, 2), **kwargs):
    method save (line 417) | def save(self, path="scope.csv"):
    method to_checkpoint (line 451) | def to_checkpoint(self, prefix, recordings=False):
    method load_checkpoint (line 466) | def load_checkpoint(self, prefix, json_data, npz):
    method update (line 482) | def update(self, t):
  class RealtimeScope (line 508) | class RealtimeScope(Scope):
    method __init__ (line 537) | def __init__(self, sampling_period=None, t_wait=0.0, labels=[], max_sa...
    method sample (line 550) | def sample(self, t, dt):

FILE: src/pathsim/blocks/sources.py
  class Constant (line 24) | class Constant(Block):
    method __init__ (line 41) | def __init__(self, value=1):
    method __len__ (line 47) | def __len__(self):
    method update (line 52) | def update(self, t):
  class Source (line 70) | class Source(Block):
    method __init__ (line 140) | def __init__(self, func=lambda t: 1):
    method __len__ (line 149) | def __len__(self):
    method update (line 154) | def update(self, t):
  class TriangleWaveSource (line 174) | class TriangleWaveSource(Source):
    method __init__ (line 187) | def __init__(self, frequency=1, amplitude=1, phase=0):
    method _triangle_wave (line 201) | def _triangle_wave(self, t, f):
  class SinusoidalSource (line 220) | class SinusoidalSource(Source):
    method __init__ (line 233) | def __init__(self, frequency=1, amplitude=1, phase=0):
  class GaussianPulseSource (line 248) | class GaussianPulseSource(Source):
    method __init__ (line 261) | def __init__(self, amplitude=1, f_max=1e3, tau=0.0):
    method _gaussian (line 276) | def _gaussian(self, t, f_max):
  class SinusoidalPhaseNoiseSource (line 296) | class SinusoidalPhaseNoiseSource(Block):
    method __init__ (line 346) | def __init__(
    method __len__ (line 394) | def __len__(self):
    method reset (line 398) | def reset(self):
    method update (line 407) | def update(self, t):
    method sample (line 423) | def sample(self, t, dt):
    method solve (line 440) | def solve(self, t, dt):
    method step (line 461) | def step(self, t, dt):
  class ChirpPhaseNoiseSource (line 484) | class ChirpPhaseNoiseSource(Block):
    method __init__ (line 544) | def __init__(
    method __len__ (line 594) | def __len__(self):
    method _triangle_wave (line 598) | def _triangle_wave(self, t, f):
    method reset (line 616) | def reset(self):
    method sample (line 625) | def sample(self, t, dt):
    method update (line 643) | def update(self, t):
    method solve (line 655) | def solve(self, t, dt):
    method step (line 678) | def step(self, t, dt):
  class ChirpSource (line 702) | class ChirpSource(ChirpPhaseNoiseSource):
  class PulseSource (line 711) | class PulseSource(Block):
    method __init__ (line 748) | def __init__(
    method reset (line 845) | def reset(self, t: float=None):
    method update (line 883) | def update(self, t):
    method __len__ (line 906) | def __len__(self):
  class Pulse (line 912) | class Pulse(PulseSource):
  class ClockSource (line 918) | class ClockSource(Block):
    method __init__ (line 940) | def __init__(self, T=1, tau=0):
    method __len__ (line 967) | def __len__(self):
  class Clock (line 973) | class Clock(ClockSource):
  class SquareWaveSource (line 980) | class SquareWaveSource(Block):
    method __init__ (line 1004) | def __init__(self, amplitude=1, frequency=1, phase=0):
    method __len__ (line 1032) | def __len__(self):
  class StepSource (line 1037) | class StepSource(Block):
    method __init__ (line 1104) | def __init__(self, amplitude=1, tau=0.0):
    method __len__ (line 1131) | def __len__(self):
  class Step (line 1137) | class Step(StepSource):

FILE: src/pathsim/blocks/spectrum.py
  class Spectrum (line 26) | class Spectrum(Block):
    method __init__ (line 107) | def __init__(self, freq=[], t_wait=0.0, alpha=0.0, labels=[]):
    method __len__ (line 133) | def __len__(self):
    method _kernel (line 137) | def _kernel(self, x, u, t):
    method reset (line 145) | def reset(self):
    method read (line 152) | def read(self):
    method collect (line 209) | def collect(self):
    method solve (line 226) | def solve(self, t, dt):
    method step (line 254) | def step(self, t, dt):
    method to_checkpoint (line 286) | def to_checkpoint(self, prefix, recordings=False):
    method load_checkpoint (line 296) | def load_checkpoint(self, prefix, json_data, npz):
    method sample (line 304) | def sample(self, t, dt):
    method plot (line 318) | def plot(self, *args, **kwargs):
    method save (line 395) | def save(self, path="spectrum.csv"):
    method update (line 437) | def update(self, t):
  class RealtimeSpectrum (line 455) | class RealtimeSpectrum(Spectrum):
    method __init__ (line 478) | def __init__(self, freq=[], t_wait=0.0, alpha=0.0, labels=[]):
    method step (line 490) | def step(self, t, dt):

FILE: src/pathsim/blocks/switch.py
  class Switch (line 15) | class Switch(Block):
    method __init__ (line 57) | def __init__(self, switch_state=None):
    method __len__ (line 63) | def __len__(self):
    method select (line 68) | def select(self, switch_state=0):
    method to_checkpoint (line 85) | def to_checkpoint(self, prefix, recordings=False):
    method load_checkpoint (line 91) | def load_checkpoint(self, prefix, json_data, npz):
    method update (line 95) | def update(self, t):

FILE: src/pathsim/blocks/table.py
  class LUT (line 17) | class LUT(Function):
    method __init__ (line 56) | def __init__(self, points=None, values=None):
  class LUT1D (line 65) | class LUT1D(Function):
    method __init__ (line 109) | def __init__(self, points=None, values=None, fill_value="extrapolate"):

FILE: src/pathsim/blocks/wrapper.py
  class Wrapper (line 16) | class Wrapper(Block):
    method __init__ (line 74) | def __init__(self, func=None, T=1, tau=0):
    method update (line 103) | def update(self, t):
    method tau (line 121) | def tau(self):
    method tau (line 133) | def tau(self, value):
    method T (line 148) | def T(self):
    method T (line 160) | def T(self, value):
    method dec (line 174) | def dec(cls, T=1, tau=0):

FILE: src/pathsim/connection.py
  class Connection (line 18) | class Connection:
    method __init__ (line 146) | def __init__(self, source, *targets):
    method __str__ (line 164) | def __str__(self):
    method __len__ (line 171) | def __len__(self):
    method __bool__ (line 176) | def __bool__(self):
    method __contains__ (line 180) | def __contains__(self, other):
    method _validate_dimensions (line 198) | def _validate_dimensions(self):
    method _validate_ports (line 208) | def _validate_ports(self):
    method get_blocks (line 220) | def get_blocks(self):
    method on (line 236) | def on(self):
    method off (line 240) | def off(self):
    method update (line 244) | def update(self):
    method resolve_ports (line 252) | def resolve_ports(self):
  class Duplex (line 277) | class Duplex(Connection):
    method __init__ (line 286) | def __init__(self, source, target):
    method update (line 298) | def update(self):

FILE: src/pathsim/events/_event.py
  class Event (line 19) | class Event:
    method __init__ (line 60) | def __init__(
    method __len__ (line 86) | def __len__(self):
    method __iter__ (line 99) | def __iter__(self):
    method __bool__ (line 107) | def __bool__(self):
    method on (line 113) | def on(self): self._active = True
    method off (line 114) | def off(self): self._active = False
    method reset (line 117) | def reset(self):
    method buffer (line 127) | def buffer(self, t):
    method estimate (line 140) | def estimate(self, t):
    method detect (line 159) | def detect(self, t):
    method resolve (line 186) | def resolve(self, t):
    method to_checkpoint (line 209) | def to_checkpoint(self, prefix):
    method load_checkpoint (line 243) | def load_checkpoint(self, prefix, json_data, npz):

FILE: src/pathsim/events/condition.py
  class Condition (line 19) | class Condition(Event):
    method detect (line 65) | def detect(self, t):
    method resolve (line 103) | def resolve(self, t):

FILE: src/pathsim/events/schedule.py
  class Schedule (line 19) | class Schedule(Event):
    method __init__ (line 62) | def __init__(
    method _next (line 78) | def _next(self):
    method estimate (line 85) | def estimate(self, t):
    method buffer (line 101) | def buffer(self, t):
    method detect (line 112) | def detect(self, t):
  class ScheduleList (line 160) | class ScheduleList(Schedule):
    method __init__ (line 198) | def __init__(
    method _next (line 214) | def _next(self):
    method detect (line 222) | def detect(self, t):

FILE: src/pathsim/events/zerocrossing.py
  class ZeroCrossing (line 21) | class ZeroCrossing(Event):
    method detect (line 70) | def detect(self, t):
  class ZeroCrossingUp (line 122) | class ZeroCrossingUp(Event):
    method detect (line 128) | def detect(self, t):
  class ZeroCrossingDown (line 180) | class ZeroCrossingDown(Event):
    method detect (line 186) | def detect(self, t):

FILE: src/pathsim/exceptions.py
  class StopSimulation (line 11) | class StopSimulation(Exception):

FILE: src/pathsim/optim/anderson.py
  class Anderson (line 23) | class Anderson:
    method __init__ (line 64) | def __init__(self, m=OPT_HISTORY, restart=OPT_RESTART):
    method __bool__ (line 81) | def __bool__(self):
    method __len__ (line 85) | def __len__(self):
    method solve (line 89) | def solve(self, func, x0, iterations_max=100, tolerance=1e-6):
    method reset (line 128) | def reset(self):
    method step (line 140) | def step(self, x, g):
  class NewtonAnderson (line 220) | class NewtonAnderson(Anderson):
    method solve (line 252) | def solve(self, func, x0, jac=None, iterations_max=100, tolerance=1e-6):
    method _newton (line 293) | def _newton(self, x, g, jac):
    method step (line 332) | def step(self, x, g, jac=None):

FILE: src/pathsim/optim/booster.py
  class ConnectionBooster (line 20) | class ConnectionBooster:
    method __init__ (line 39) | def __init__(self, connection):
    method __bool__ (line 47) | def __bool__(self):
    method get (line 51) | def get(self):
    method set (line 63) | def set(self, val):
    method reset (line 77) | def reset(self):
    method update (line 85) | def update(self):

FILE: src/pathsim/optim/numerical.py
  function num_jac (line 19) | def num_jac(func, x, r=1e-3, tol=TOLERANCE):
  function num_autojac (line 57) | def num_autojac(func):

FILE: src/pathsim/optim/operator.py
  class Operator (line 19) | class Operator(object):
    method __init__ (line 90) | def __init__(self, func, jac=None):
    method __bool__ (line 98) | def __bool__(self):
    method __call__ (line 102) | def __call__(self, x):
    method jac (line 131) | def jac(self, x):
    method linearize (line 157) | def linearize(self, x):
    method reset (line 172) | def reset(self):
  class DynamicOperator (line 181) | class DynamicOperator(object):
    method __init__ (line 261) | def __init__(self, func, jac_x=None, jac_u=None):
    method __bool__ (line 275) | def __bool__(self):
    method __call__ (line 279) | def __call__(self, x, u, t):
    method jac_x (line 320) | def jac_x(self, x, u, t):
    method jac_u (line 353) | def jac_u(self, x, u, t):
    method linearize (line 386) | def linearize(self, x, u, t):
    method reset (line 409) | def reset(self):

FILE: src/pathsim/simulation.py
  class Simulation (line 55) | class Simulation:
    method __init__ (line 169) | def __init__(
    method __contains__ (line 275) | def __contains__(self, other):
    method __bool__ (line 295) | def __bool__(self):
    method size (line 309) | def size(self):
    method plot (line 329) | def plot(self, *args, **kwargs):
    method _checkpoint_key (line 354) | def _checkpoint_key(type_name, type_counts):
    method save_checkpoint (line 375) | def save_checkpoint(self, path, recordings=True):
    method load_checkpoint (line 438) | def load_checkpoint(self, path):
    method add_block (line 518) | def add_block(self, block):
    method remove_block (line 555) | def remove_block(self, block):
    method add_connection (line 589) | def add_connection(self, connection):
    method remove_connection (line 615) | def remove_connection(self, connection):
    method add_event (line 641) | def add_event(self, event):
    method remove_event (line 662) | def remove_event(self, event):
    method _assemble_graph (line 685) | def _assemble_graph(self):
    method _check_blocks_are_managed (line 729) | def _check_blocks_are_managed(self):
    method _set_solver (line 752) | def _set_solver(self, Solver=None, **solver_kwargs):
    method reset (line 799) | def reset(self, time=0.0):
    method linearize (line 852) | def linearize(self):
    method delinearize (line 875) | def delinearize(self):
    method _get_active_events (line 885) | def _get_active_events(self):
    method _estimate_events (line 898) | def _estimate_events(self, t):
    method _detected_events (line 931) | def _detected_events(self, t):
    method _update (line 963) | def _update(self, t):
    method _dag (line 1007) | def _dag(self, t):
    method _loops (line 1028) | def _loops(self, t):
    method _solve (line 1076) | def _solve(self, t, dt):
    method steadystate (line 1130) | def steadystate(self, reset=False):
    method _revert (line 1204) | def _revert(self, t):
    method _sample (line 1226) | def _sample(self, t, dt):
    method _buffer (line 1240) | def _buffer(self, t, dt):
    method _step (line 1272) | def _step(self, t, dt):
    method timestep_fixed_explicit (line 1317) | def timestep_fixed_explicit(self, dt=None):
    method timestep_fixed_implicit (line 1342) | def timestep_fixed_implicit(self, dt=None):
    method timestep_adaptive_explicit (line 1367) | def timestep_adaptive_explicit(self, dt=None):
    method timestep_adaptive_implicit (line 1392) | def timestep_adaptive_implicit(self, dt=None):
    method timestep (line 1416) | def timestep(self, dt=None, adaptive=True):
    method step (line 1555) | def step(self, dt=None, adaptive=True):
    method collect (line 1566) | def collect(self):
    method stop (line 1586) | def stop(self):
    method _run_loop (line 1594) | def _run_loop(self, duration, reset, adaptive, tracker=None):
    method run (line 1706) | def run(self, duration=10, reset=False, adaptive=True):
    method run_streaming (line 1749) | def run_streaming(self, duration=10, reset=False, adaptive=True, tickr...
    method run_realtime (line 1809) | def run_realtime(self, duration=10, reset=False, adaptive=True, tickra...

FILE: src/pathsim/solvers/_rungekutta.py
  class ExplicitRungeKutta (line 24) | class ExplicitRungeKutta(ExplicitSolver):
    method __init__ (line 53) | def __init__(self, *solver_args, **solver_kwargs):
    method error_controller (line 76) | def error_controller(self, dt):
    method step (line 123) | def step(self, f, dt):
  class DiagonallyImplicitRungeKutta (line 164) | class DiagonallyImplicitRungeKutta(ImplicitSolver):
    method __init__ (line 199) | def __init__(self, *solver_args, **solver_kwargs):
    method error_controller (line 225) | def error_controller(self, dt):
    method solve (line 272) | def solve(self, f, J, dt):
    method step (line 322) | def step(self, f, dt):

FILE: src/pathsim/solvers/_solver.py
  class Solver (line 33) | class Solver:
    method __init__ (line 67) | def __init__(
    method __str__ (line 108) | def __str__(self):
    method __len__ (line 112) | def __len__(self):
    method __bool__ (line 123) | def __bool__(self):
    method stage (line 128) | def stage(self):
    method stage (line 142) | def stage(self, val):
    method is_first_stage (line 154) | def is_first_stage(self):
    method is_last_stage (line 158) | def is_last_stage(self):
    method stages (line 162) | def stages(self, t, dt):
    method get (line 178) | def get(self):
    method set (line 189) | def set(self, x):
    method state (line 206) | def state(self):
    method state (line 218) | def state(self, value):
    method reset (line 229) | def reset(self, initial_value=None):
    method buffer (line 248) | def buffer(self, dt):
    method cast (line 269) | def cast(cls, other, parent, **solver_kwargs):
    method create (line 315) | def create(cls, initial_value, parent=None, from_engine=None, **solver...
    method to_checkpoint (line 358) | def to_checkpoint(self, prefix):
    method load_checkpoint (line 392) | def load_checkpoint(self, json_data, npz, prefix):
    method error_controller (line 423) | def error_controller(self):
    method revert (line 439) | def revert(self):
    method step (line 453) | def step(self, f, dt):
    method interpolate (line 481) | def interpolate(self, r, dt):
  class ExplicitSolver (line 507) | class ExplicitSolver(Solver):
    method __init__ (line 527) | def __init__(self, *solver_args, **solver_kwargs):
    method integrate_singlestep (line 540) | def integrate_singlestep(self, func, time=0.0, dt=SIM_TIMESTEP):
    method integrate (line 574) | def integrate(
  class ImplicitSolver (line 672) | class ImplicitSolver(Solver):
    method __init__ (line 695) | def __init__(self, *solver_args, **solver_kwargs):
    method buffer (line 709) | def buffer(self, dt):
    method solve (line 733) | def solve(self, j, J, dt):
    method integrate_singlestep (line 757) | def integrate_singlestep(
    method integrate (line 821) | def integrate(

FILE: src/pathsim/solvers/bdf.py
  class BDF (line 20) | class BDF(ImplicitSolver):
    method __init__ (line 52) | def __init__(self, *solver_args, **solver_kwargs):
    method cast (line 75) | def cast(cls, other, parent, **solver_kwargs):
    method create (line 99) | def create(cls, initial_value, parent=None, from_engine=None, **solver...
    method stages (line 141) | def stages(self, t, dt):
    method reset (line 162) | def reset(self, initial_value=None):
    method buffer (line 186) | def buffer(self, dt):
    method solve (line 209) | def solve(self, f, J, dt):
    method step (line 252) | def step(self, f, dt):
  class BDF2 (line 287) | class BDF2(BDF):
    method __init__ (line 322) | def __init__(self, *solver_args, **solver_kwargs):
  class BDF3 (line 332) | class BDF3(BDF):
    method __init__ (line 362) | def __init__(self, *solver_args, **solver_kwargs):
  class BDF4 (line 372) | class BDF4(BDF):
    method __init__ (line 403) | def __init__(self, *solver_args, **solver_kwargs):
  class BDF5 (line 413) | class BDF5(BDF):
    method __init__ (line 444) | def __init__(self, *solver_args, **solver_kwargs):
  class BDF6 (line 454) | class BDF6(BDF):
    method __init__ (line 485) | def __init__(self, *solver_args, **solver_kwargs):

FILE: src/pathsim/solvers/dirk2.py
  class DIRK2 (line 17) | class DIRK2(DiagonallyImplicitRungeKutta):
    method __init__ (line 48) | def __init__(self, *solver_args, **solver_kwargs):

FILE: src/pathsim/solvers/dirk3.py
  class DIRK3 (line 17) | class DIRK3(DiagonallyImplicitRungeKutta):
    method __init__ (line 52) | def __init__(self, *solver_args, **solver_kwargs):

FILE: src/pathsim/solvers/esdirk32.py
  class ESDIRK32 (line 17) | class ESDIRK32(DiagonallyImplicitRungeKutta):
    method __init__ (line 54) | def __init__(self, *solver_args, **solver_kwargs):

FILE: src/pathsim/solvers/esdirk4.py
  class ESDIRK4 (line 17) | class ESDIRK4(DiagonallyImplicitRungeKutta):
    method __init__ (line 52) | def __init__(self, *solver_args, **solver_kwargs):

FILE: src/pathsim/solvers/esdirk43.py
  class ESDIRK43 (line 19) | class ESDIRK43(DiagonallyImplicitRungeKutta):
    method __init__ (line 55) | def __init__(self, *solver_args, **solver_kwargs):

FILE: src/pathsim/solvers/esdirk54.py
  class ESDIRK54 (line 17) | class ESDIRK54(DiagonallyImplicitRungeKutta):
    method __init__ (line 51) | def __init__(self, *solver_args, **solver_kwargs):

FILE: src/pathsim/solvers/esdirk85.py
  class ESDIRK85 (line 17) | class ESDIRK85(DiagonallyImplicitRungeKutta):
    method __init__ (line 52) | def __init__(self, *solver_args, **solver_kwargs):

FILE: src/pathsim/solvers/euler.py
  class EUF (line 15) | class EUF(ExplicitSolver):
    method step (line 50) | def step(self, f, dt):
  class EUB (line 81) | class EUB(ImplicitSolver):
    method solve (line 119) | def solve(self, f, J, dt):

FILE: src/pathsim/solvers/gear.py
  function compute_bdf_coefficients (line 27) | def compute_bdf_coefficients(order, timesteps):
  class GEAR (line 84) | class GEAR(ImplicitSolver):
    method __init__ (line 125) | def __init__(self, *solver_args, **solver_kwargs):
    method cast (line 147) | def cast(cls, other, parent, **solver_kwargs):
    method create (line 171) | def create(cls, initial_value, parent=None, from_engine=None, **solver...
    method to_checkpoint (line 213) | def to_checkpoint(self, prefix):
    method load_checkpoint (line 233) | def load_checkpoint(self, json_data, npz, prefix):
    method stages (line 257) | def stages(self, t, dt):
    method reset (line 278) | def reset(self, initial_value=None):
    method buffer (line 303) | def buffer(self, dt):
    method revert (line 336) | def revert(self):
    method error_controller (line 354) | def error_controller(self, tr):
    method solve (line 398) | def solve(self, f, J, dt):
    method step (line 442) | def step(self, f, dt):
  class GEAR21 (line 481) | class GEAR21(GEAR):
    method __init__ (line 513) | def __init__(self, *solver_args, **solver_kwargs):
  class GEAR32 (line 525) | class GEAR32(GEAR):
    method __init__ (line 556) | def __init__(self, *solver_args, **solver_kwargs):
  class GEAR43 (line 568) | class GEAR43(GEAR):
    method __init__ (line 599) | def __init__(self, *solver_args, **solver_kwargs):
  class GEAR54 (line 611) | class GEAR54(GEAR):
    method __init__ (line 642) | def __init__(self, *solver_args, **solver_kwargs):
  class GEAR52A (line 654) | class GEAR52A(GEAR):
    method __init__ (line 692) | def __init__(self, *solver_args, **solver_kwargs):
    method buffer (line 706) | def buffer(self, dt):
    method error_controller (line 739) | def error_controller(self, tr_m, tr_p):
    method solve (line 799) | def solve(self, f, J, dt):
    method step (line 843) | def step(self, f, dt):

FILE: src/pathsim/solvers/rk4.py
  class RK4 (line 17) | class RK4(ExplicitRungeKutta):
    method __init__ (line 57) | def __init__(self, *solver_args, **solver_kwargs):
    method interpolate (line 78) | def interpolate(self, r, dt):

FILE: src/pathsim/solvers/rkbs32.py
  class RKBS32 (line 17) | class RKBS32(ExplicitRungeKutta):
    method __init__ (line 49) | def __init__(self, *solver_args, **solver_kwargs):

FILE: src/pathsim/solvers/rkck54.py
  class RKCK54 (line 17) | class RKCK54(ExplicitRungeKutta):
    method __init__ (line 50) | def __init__(self, *solver_args, **solver_kwargs):

FILE: src/pathsim/solvers/rkdp54.py
  class RKDP54 (line 17) | class RKDP54(ExplicitRungeKutta):
    method __init__ (line 53) | def __init__(self, *solver_args, **solver_kwargs):

FILE: src/pathsim/solvers/rkdp87.py
  class RKDP87 (line 17) | class RKDP87(ExplicitRungeKutta):
    method __init__ (line 54) | def __init__(self, *solver_args, **solver_kwargs):

FILE: src/pathsim/solvers/rkf21.py
  class RKF21 (line 17) | class RKF21(ExplicitRungeKutta):
    method __init__ (line 48) | def __init__(self, *solver_args, **solver_kwargs):

FILE: src/pathsim/solvers/rkf45.py
  class RKF45 (line 17) | class RKF45(ExplicitRungeKutta):
    method __init__ (line 50) | def __init__(self, *solver_args, **solver_kwargs):

FILE: src/pathsim/solvers/rkf78.py
  class RKF78 (line 17) | class RKF78(ExplicitRungeKutta):
    method __init__ (line 46) | def __init__(self, *solver_args, **solver_kwargs):

FILE: src/pathsim/solvers/rkv65.py
  class RKV65 (line 17) | class RKV65(ExplicitRungeKutta):
    method __init__ (line 48) | def __init__(self, *solver_args, **solver_kwargs):

FILE: src/pathsim/solvers/ssprk22.py
  class SSPRK22 (line 17) | class SSPRK22(ExplicitRungeKutta):
    method __init__ (line 52) | def __init__(self, *solver_args, **solver_kwargs):
    method interpolate (line 71) | def interpolate(self, r, dt):

FILE: src/pathsim/solvers/ssprk33.py
  class SSPRK33 (line 17) | class SSPRK33(ExplicitRungeKutta):
    method __init__ (line 55) | def __init__(self, *solver_args, **solver_kwargs):
    method interpolate (line 74) | def interpolate(self, r, dt):

FILE: src/pathsim/solvers/ssprk34.py
  class SSPRK34 (line 17) | class SSPRK34(ExplicitRungeKutta):
    method __init__ (line 50) | def __init__(self, *solver_args, **solver_kwargs):

FILE: src/pathsim/solvers/steadystate.py
  class SteadyState (line 19) | class SteadyState(ImplicitSolver):
    method solve (line 41) | def solve(self, f, J, dt):

FILE: src/pathsim/subsystem.py
  class Interface (line 35) | class Interface(Block):
    method __len__ (line 49) | def __len__(self):
    method register_port_map (line 53) | def register_port_map(self, port_map_in, port_map_out):
  class Subsystem (line 73) | class Subsystem(Block):
    method __init__ (line 153) | def __init__(self,
    method __len__ (line 216) | def __len__(self):
    method __call__ (line 224) | def __call__(self):
    method __contains__ (line 241) | def __contains__(self, other):
    method add_block (line 258) | def add_block(self, block):
    method remove_block (line 283) | def remove_block(self, block):
    method add_connection (line 306) | def add_connection(self, connection):
    method remove_connection (line 325) | def remove_connection(self, connection):
    method add_event (line 344) | def add_event(self, event):
    method remove_event (line 360) | def remove_event(self, event):
    method _assemble_graph (line 378) | def _assemble_graph(self):
    method size (line 400) | def size(self):
    method plot (line 420) | def plot(self, *args, **kwargs):
    method collect (line 439) | def collect(self):
    method reset (line 447) | def reset(self):
    method _checkpoint_key (line 459) | def _checkpoint_key(type_name, type_counts):
    method to_checkpoint (line 468) | def to_checkpoint(self, prefix, recordings=False):
    method load_checkpoint (line 519) | def load_checkpoint(self, prefix, json_data, npz):
    method on (line 558) | def on(self):
    method off (line 567) | def off(self):
    method linearize (line 577) | def linearize(self, t):
    method delinearize (line 597) | def delinearize(self):
    method events (line 606) | def events(self):
    method inputs (line 620) | def inputs(self):
    method outputs (line 624) | def outputs(self):
    method sample (line 630) | def sample(self, t, dt):
    method update (line 649) | def update(self, t):
    method _dag (line 671) | def _dag(self, t):
    method _loops (line 696) | def _loops(self, t):
    method solve (line 744) | def solve(self, t, dt):
    method step (line 769) | def step(self, t, dt):
    method set_solver (line 822) | def set_solver(self, Solver, parent, **solver_args):
    method revert (line 859) | def revert(self):
    method buffer (line 867) | def buffer(self, dt):

FILE: src/pathsim/utils/adaptivebuffer.py
  class AdaptiveBuffer (line 21) | class AdaptiveBuffer:
    method __init__ (line 42) | def __init__(self, delay):
    method __len__ (line 53) | def __len__(self):
    method add (line 57) | def add(self, t, value):
    method interp (line 79) | def interp(self, t):
    method get (line 110) | def get(self, t):
    method clear (line 122) | def clear(self):
    method to_checkpoint (line 128) | def to_checkpoint(self, prefix):
    method load_checkpoint (line 148) | def load_checkpoint(self, npz, prefix):

FILE: src/pathsim/utils/analysis.py
  class Timer (line 27) | class Timer(ContextDecorator):
    method __init__ (line 49) | def __init__(self, verbose=True):
    method __float__ (line 55) | def __float__(self):
    method __repr__ (line 59) | def __repr__(self):
    method __enter__ (line 64) | def __enter__(self):
    method __exit__ (line 69) | def __exit__(self, type, value, traceback):
  function timer (line 75) | def timer(func):
  class Profiler (line 96) | class Profiler(ContextDecorator):
    method __init__ (line 117) | def __init__(self, top_n=50, sort_by="cumulative"):
    method __enter__ (line 126) | def __enter__(self):
    method __exit__ (line 131) | def __exit__(self, *exc):

FILE: src/pathsim/utils/deprecation.py
  function deprecated (line 18) | def deprecated(version=None, replacement=None, reason=None):
  function _prepend_deprecation_notice (line 105) | def _prepend_deprecation_notice(docstring, notice):

FILE: src/pathsim/utils/diagnostics.py
  class ConvergenceTracker (line 18) | class ConvergenceTracker:
    method __init__ (line 36) | def __init__(self):
    method reset (line 42) | def reset(self):
    method begin_iteration (line 49) | def begin_iteration(self):
    method record (line 55) | def record(self, obj, error):
    method converged (line 62) | def converged(self, tolerance):
    method details (line 67) | def details(self, label_fn):
  class StepTracker (line 85) | class StepTracker:
    method __init__ (line 105) | def __init__(self):
    method reset (line 112) | def reset(self):
    method record (line 120) | def record(self, block, success, err_norm, scale):
    method scale (line 133) | def scale(self):
  class Diagnostics (line 141) | class Diagnostics:
    method _label (line 172) | def _label(obj):
    method worst_block (line 179) | def worst_block(self):
    method worst_booster (line 202) | def worst_booster(self):
    method summary (line 217) | def summary(self):

FILE: src/pathsim/utils/fmuwrapper.py
  class EventInfo (line 21) | class EventInfo:
  class StepResult (line 48) | class StepResult:
  class _FMI2Ops (line 70) | class _FMI2Ops:
    method set_real (line 74) | def set_real(fmu, refs, values):
    method get_real (line 78) | def get_real(fmu, refs):
    method set_integer (line 82) | def set_integer(fmu, refs, values):
    method get_integer (line 86) | def get_integer(fmu, refs):
    method do_step (line 90) | def do_step(fmu, current_time, step_size):
    method get_derivatives (line 95) | def get_derivatives(fmu, n_states):
    method update_discrete_states (line 103) | def update_discrete_states(fmu):
    method setup_experiment (line 115) | def setup_experiment(fmu, tolerance, start_time, stop_time):
    method enter_initialization_mode (line 119) | def enter_initialization_mode(fmu, tolerance, start_time, stop_time):
    method exit_initialization_mode (line 123) | def exit_initialization_mode(fmu, mode):
  class _FMI3Ops (line 129) | class _FMI3Ops:
    method set_real (line 133) | def set_real(fmu, refs, values):
    method get_real (line 137) | def get_real(fmu, refs):
    method set_integer (line 141) | def set_integer(fmu, refs, values):
    method get_integer (line 145) | def get_integer(fmu, refs):
    method do_step (line 149) | def do_step(fmu, current_time, step_size):
    method get_derivatives (line 159) | def get_derivatives(fmu, n_states):
    method update_discrete_states (line 167) | def update_discrete_states(fmu):
    method setup_experiment (line 179) | def setup_experiment(fmu, tolerance, start_time, stop_time):
    method enter_initialization_mode (line 184) | def enter_initialization_mode(fmu, tolerance, start_time, stop_time):
    method exit_initialization_mode (line 188) | def exit_initialization_mode(fmu, mode):
  class FMUWrapper (line 205) | class FMUWrapper:
    method __init__ (line 245) | def __init__(self, fmu_path, instance_name="fmu_instance", mode="cosim...
    method _create_fmu_instance (line 289) | def _create_fmu_instance(self, FMU2Slave, FMU2Model, FMU3Slave, FMU3Mo...
    method _build_variable_maps (line 326) | def _build_variable_maps(self):
    method _build_state_derivative_maps (line 338) | def _build_state_derivative_maps(self):
    method create_port_registers (line 358) | def create_port_registers(self) -> Tuple[Register, Register]:
    method initialize (line 376) | def initialize(self, start_values=None, start_time=0.0, stop_time=None,
    method default_step_size (line 410) | def default_step_size(self) -> Optional[float]:
    method default_tolerance (line 418) | def default_tolerance(self) -> Optional[float]:
    method needs_completed_integrator_step (line 426) | def needs_completed_integrator_step(self) -> bool:
    method provides_jacobian (line 434) | def provides_jacobian(self) -> bool:
    method get_state_jacobian (line 444) | def get_state_jacobian(self):
    method instantiate (line 484) | def instantiate(self, visible=False, logging_on=False):
    method setup_experiment (line 488) | def setup_experiment(self, tolerance=None, start_time=0.0, stop_time=N...
    method enter_initialization_mode (line 495) | def enter_initialization_mode(self):
    method exit_initialization_mode (line 501) | def exit_initialization_mode(self) -> Optional[EventInfo]:
    method reset (line 505) | def reset(self):
    method terminate (line 509) | def terminate(self):
    method free_instance (line 513) | def free_instance(self):
    method set_real (line 521) | def set_real(self, refs, values):
    method get_real (line 526) | def get_real(self, refs):
    method set_variable (line 530) | def set_variable(self, name, value):
    method set_inputs_from_array (line 548) | def set_inputs_from_array(self, values):
    method get_outputs_as_array (line 554) | def get_outputs_as_array(self):
    method do_step (line 565) | def do_step(self, current_time, step_size) -> StepResult:
    method set_time (line 575) | def set_time(self, time):
    method set_continuous_states (line 581) | def set_continuous_states(self, states):
    method get_continuous_states (line 591) | def get_continuous_states(self):
    method get_derivatives (line 601) | def get_derivatives(self):
    method get_event_indicators (line 607) | def get_event_indicators(self):
    method enter_event_mode (line 617) | def enter_event_mode(self):
    method enter_continuous_time_mode (line 623) | def enter_continuous_time_mode(self):
    method update_discrete_states (line 629) | def update_discrete_states(self) -> EventInfo:
    method completed_integrator_step (line 635) | def completed_integrator_step(self) -> Tuple[bool, bool]:
    method __del__ (line 649) | def __del__(self):

FILE: src/pathsim/utils/gilbert.py
  function gilbert_realization (line 17) | def gilbert_realization(Poles=[], Residues=[], Const=0.0, tolerance=1e-9):

FILE: src/pathsim/utils/graph.py
  class Graph (line 14) | class Graph:
    method __init__ (line 51) | def __init__(self, blocks=None, connections=None):
    method __bool__ (line 79) | def __bool__(self):
    method __len__ (line 83) | def __len__(self):
    method size (line 88) | def size(self):
    method depth (line 100) | def depth(self):
    method _validate_connections (line 115) | def _validate_connections(self):
    method _build_all_maps (line 135) | def _build_all_maps(self):
    method _assemble (line 166) | def _assemble(self):
    method _compute_depths_iterative (line 221) | def _compute_depths_iterative(self):
    method _process_loops (line 330) | def _process_loops(self, blocks_loop):
    method _find_strongly_connected_components (line 433) | def _find_strongly_connected_components(self, blocks):
    method is_algebraic_path (line 542) | def is_algebraic_path(self, start_block, end_block):
    method _has_algebraic_self_loop (line 606) | def _has_algebraic_self_loop(self, block):
    method outgoing_connections (line 660) | def outgoing_connections(self, block):
    method dag (line 676) | def dag(self):
    method loop (line 691) | def loop(self):
    method loop_closing_connections (line 706) | def loop_closing_connections(self):

FILE: src/pathsim/utils/logger.py
  class LoggerManager (line 19) | class LoggerManager:
    method __new__ (line 79) | def __new__(cls, enabled=False, output=None, level=logging.INFO,
    method __init__ (line 87) | def __init__(self, enabled=False, output=None, level=logging.INFO,
    method _setup_root_logger (line 124) | def _setup_root_logger(self):
    method configure (line 152) | def configure(self, enabled=True, output=None, level=logging.INFO,
    method get_logger (line 243) | def get_logger(self, name):
    method set_level (line 291) | def set_level(self, level, module=None):
    method is_enabled (line 337) | def is_enabled(self):
    method get_effective_level (line 349) | def get_effective_level(self, module=None):

FILE: src/pathsim/utils/mutable.py
  function _do_reinit (line 22) | def _do_reinit(block):
  function mutable (line 73) | def mutable(cls):

FILE: src/pathsim/utils/portreference.py
  class PortReference (line 15) | class PortReference:
    method __init__ (line 33) | def __init__(self, block=None, ports=None):
    method __len__ (line 67) | def __len__(self):
    method _get_input_indices (line 72) | def _get_input_indices(self):
    method _get_output_indices (line 90) | def _get_output_indices(self):
    method _validate_input_ports (line 108) | def _validate_input_ports(self):
    method _validate_output_ports (line 117) | def _validate_output_ports(self):
    method to (line 126) | def to(self, other):
    method get_inputs (line 146) | def get_inputs(self):
    method set_inputs (line 158) | def set_inputs(self, vals):
    method get_outputs (line 172) | def get_outputs(self):
    method set_outputs (line 184) | def set_outputs(self, vals):
    method to_dict (line 198) | def to_dict(self):

FILE: src/pathsim/utils/progresstracker.py
  class ProgressTracker (line 22) | class ProgressTracker:
    method __init__ (line 50) | def __init__(
    method current_progress (line 107) | def current_progress(self):
    method current_progress (line 113) | def current_progress(self, value):
    method __enter__ (line 120) | def __enter__(self):
    method __exit__ (line 126) | def __exit__(self, exc_type, exc_value, traceback):
    method __iter__ (line 134) | def __iter__(self):
    method start (line 145) | def start(self):
    method update (line 156) | def update(self, progress, success=True, **kwargs):
    method interrupt (line 211) | def interrupt(self):
    method close (line 216) | def close(self):
    method _log_progress (line 238) | def _log_progress(self):
    method _render_bar (line 283) | def _render_bar(self, progress):
    method _format_time (line 290) | def _format_time(self, seconds):
    method _format_rate (line 306) | def _format_rate(self, rate):

FILE: src/pathsim/utils/realtimeplotter.py
  class RealtimePlotter (line 27) | class RealtimePlotter:
    method __init__ (line 52) | def __init__(self, max_samples=None, update_interval=1, labels=[], x_l...
    method update_all (line 97) | def update_all(self, x, y):
    method update (line 143) | def update(self, x, y):
    method _update_plot (line 220) | def _update_plot(self):
    method show (line 235) | def show(self):
    method on_close (line 239) | def on_close(self, event):
    method _setup_legend_picking (line 243) | def _setup_legend_picking(self):

FILE: src/pathsim/utils/register.py
  class Register (line 15) | class Register:
    method __init__ (line 42) | def __init__(self, size=None, mapping=None, dtype=np.float64):
    method _map (line 47) | def _map(self, key):
    method _get_max_index (line 63) | def _get_max_index(self, key):
    method __len__ (line 74) | def __len__(self):
    method __iter__ (line 78) | def __iter__(self):
    method __getitem__ (line 83) | def __getitem__(self, key):
    method __setitem__ (line 110) | def __setitem__(self, key, value):
    method resize (line 131) | def resize(self, size):
    method reset (line 149) | def reset(self):
    method to_array (line 154) | def to_array(self):
    method update_from_array (line 165) | def update_from_array(self, arr):
    method __contains__ (line 182) | def __contains__(self, key):

FILE: tests/evals/conftest.py
  function pytest_collection_modifyitems (line 3) | def pytest_collection_modifyitems(items):

FILE: tests/evals/test_algebraic_system.py
  class TestAlgebraicSystem (line 18) | class TestAlgebraicSystem(unittest.TestCase):
    method setUp (line 20) | def setUp(self):
    method test_graph (line 54) | def test_graph(self):
    method test_eval (line 65) | def test_eval(self):

FILE: tests/evals/test_bouncingball_friction_event_system.py
  class TestBouncingBallFrictionEventSystem (line 24) | class TestBouncingBallFrictionEventSystem(unittest.TestCase):
    method setUp (line 26) | def setUp(self):
    method test_eval_explicit_solvers (line 96) | def test_eval_explicit_solvers(self):

FILE: tests/evals/test_bouncingball_system.py
  class TestBouncingBallSystem (line 24) | class TestBouncingBallSystem(unittest.TestCase):
    method setUp (line 26) | def setUp(self):
    method test_eval_explicit_solvers (line 82) | def test_eval_explicit_solvers(self):

FILE: tests/evals/test_brusselator_system.py
  class TestBrusselatorSystem (line 25) | class TestBrusselatorSystem(unittest.TestCase):
    method setUp (line 28) | def setUp(self):
    method test_eval_solvers (line 69) | def test_eval_solvers(self):

FILE: tests/evals/test_cosim_fmu_system.py
  class TestCoSimFMUSystem (line 24) | class TestCoSimFMUSystem(unittest.TestCase):
    method setUp (line 26) | def setUp(self):
    method test_eval (line 50) | def test_eval(self):

FILE: tests/evals/test_counter_comparator_system.py
  class TestCounterSystem (line 31) | class TestCounterSystem(unittest.TestCase):
    method setUp (line 41) | def setUp(self):
    method test_counter_total_crossings (line 71) | def test_counter_total_crossings(self):
    method test_counter_up_counts_rising (line 86) | def test_counter_up_counts_rising(self):
    method test_counter_down_counts_falling (line 100) | def test_counter_down_counts_falling(self):
    method test_counter_with_adaptive_solver (line 114) | def test_counter_with_adaptive_solver(self):
  class TestComparatorSystem (line 141) | class TestComparatorSystem(unittest.TestCase):
    method setUp (line 149) | def setUp(self):
    method test_comparator_output_values (line 172) | def test_comparator_output_values(self):
    method test_comparator_frequency_preserved (line 190) | def test_comparator_frequency_preserved(self):
  class TestCounterWithCustomThreshold (line 213) | class TestCounterWithCustomThreshold(unittest.TestCase):
    method test_threshold_crossing_count (line 216) | def test_threshold_crossing_count(self):

FILE: tests/evals/test_dynamical_system_ivp.py
  class TestDynamicalSystemDecay (line 26) | class TestDynamicalSystemDecay(unittest.TestCase):
    method setUp (line 34) | def setUp(self):
    method _reference (line 54) | def _reference(self, t):
    method test_eval_explicit_solvers (line 58) | def test_eval_explicit_solvers(self):
    method test_eval_implicit_solvers (line 76) | def test_eval_implicit_solvers(self):
  class TestDynamicalSystemDriven (line 94) | class TestDynamicalSystemDriven(unittest.TestCase):
    method setUp (line 102) | def setUp(self):
    method test_step_response (line 124) | def test_step_response(self):
  class TestODEBlockInSimulation (line 143) | class TestODEBlockInSimulation(unittest.TestCase):
    method setUp (line 152) | def setUp(self):
    method test_sinusoidal_response (line 173) | def test_sinusoidal_response(self):
  class TestDynamicalSystemFeedback (line 190) | class TestDynamicalSystemFeedback(unittest.TestCase):
    method test_coupled_system (line 198) | def test_coupled_system(self):

FILE: tests/evals/test_fitzhughnagumo_system.py
  class TestFitzHughNagumoSystem (line 33) | class TestFitzHughNagumoSystem(unittest.TestCase):
    method setUp (line 36) | def setUp(self):
    method test_eval_solvers (line 89) | def test_eval_solvers(self):
  class TestFitzHughNagumoODE (line 115) | class TestFitzHughNagumoODE(unittest.TestCase):
    method setUp (line 118) | def setUp(self):
    method test_eval_solvers (line 154) | def test_eval_solvers(self):

FILE: tests/evals/test_harmonic_oscillator_system.py
  class TestHarmonicOscillatorSystem (line 23) | class TestHarmonicOscillatorSystem(unittest.TestCase):
    method setUp (line 25) | def setUp(self):
    method _reference (line 66) | def _reference(self, t):
    method test_eval_explicit_solvers (line 84) | def test_eval_explicit_solvers(self):
    method test_eval_implicit_solvers (line 110) | def test_eval_implicit_solvers(self):

FILE: tests/evals/test_linear_feedback_system.py
  class TestLinearFeedbackSystem (line 29) | class TestLinearFeedbackSystem(unittest.TestCase):
    method setUp (line 31) | def setUp(self):
    method _reference (line 62) | def _reference(self, t):
    method test_eval_explicit_solvers (line 67) | def test_eval_explicit_solvers(self):
    method test_eval_implicit_solvers (line 93) | def test_eval_implicit_solvers(self):

FILE: tests/evals/test_logic_system.py
  class TestComparisonSystem (line 34) | class TestComparisonSystem(unittest.TestCase):
    method setUp (line 45) | def setUp(self):
    method test_gt_lt_complementary (line 72) | def test_gt_lt_complementary(self):
    method test_gt_matches_positive (line 87) | def test_gt_matches_positive(self):
  class TestLogicGateSystem (line 103) | class TestLogicGateSystem(unittest.TestCase):
    method setUp (line 113) | def setUp(self):
    method test_and_gate (line 151) | def test_and_gate(self):
    method test_or_gate (line 169) | def test_or_gate(self):
    method test_not_gate (line 187) | def test_not_gate(self):
  class TestEqualSystem (line 199) | class TestEqualSystem(unittest.TestCase):
    method test_equal_detects_match (line 206) | def test_equal_detects_match(self):
    method test_equal_detects_mismatch (line 234) | def test_equal_detects_mismatch(self):

FILE: tests/evals/test_lorenz_system.py
  class TestLorenzSystem (line 33) | class TestLorenzSystem(unittest.TestCase):
    method setUp (line 36) | def setUp(self):
    method test_eval_solvers (line 117) | def test_eval_solvers(self):
  class TestLorenzODE (line 143) | class TestLorenzODE(unittest.TestCase):
    method setUp (line 146) | def setUp(self):
    method test_eval_solvers (line 179) | def test_eval_solvers(self):

FILE: tests/evals/test_me_analytical.py
  class TestModelExchangeFMUAnalytical (line 19) | class TestModelExchangeFMUAnalytical(unittest.TestCase):
    method test_structure (line 21) | def test_structure(self):
    method test_dynamical_system_integration (line 44) | def test_dynamical_system_integration(self):

FILE: tests/evals/test_model_exchange_fmu_system.py
  class TestModelExchangeFMUBouncingBall (line 26) | class TestModelExchangeFMUBouncingBall(unittest.TestCase):
    method setUpClass (line 30) | def setUpClass(cls):
    method setUp (line 36) | def setUp(self):
    method test_fmu_wrapper_accessible (line 61) | def test_fmu_wrapper_accessible(self):
    method test_fmu_states (line 66) | def test_fmu_states(self):
    method test_fmu_event_indicators (line 70) | def test_fmu_event_indicators(self):
    method test_simulation_runs (line 74) | def test_simulation_runs(self):
    method test_bouncing_behavior (line 82) | def test_bouncing_behavior(self):
    method test_events_detected (line 95) | def test_events_detected(self):
    method test_energy_dissipation (line 103) | def test_energy_dissipation(self):
    method test_reset (line 120) | def test_reset(self):
  class TestModelExchangeFMUVanDerPol (line 139) | class TestModelExchangeFMUVanDerPol(unittest.TestCase):
    method setUpClass (line 143) | def setUpClass(cls):
    method setUp (line 149) | def setUp(self):
    method test_fmu_states (line 178) | def test_fmu_states(self):
    method test_no_event_indicators (line 182) | def test_no_event_indicators(self):
    method test_simulation_runs (line 186) | def test_simulation_runs(self):
    method test_oscillation (line 193) | def test_oscillation(self):
    method test_limit_cycle (line 207) | def test_limit_cycle(self):
    method test_reset (line 221) | def test_reset(self):
  class TestModelExchangeFMUBlockAPI (line 240) | class TestModelExchangeFMUBlockAPI(unittest.TestCase):
    method setUpClass (line 244) | def setUpClass(cls):
    method test_fmu_wrapper_model_description (line 250) | def test_fmu_wrapper_model_description(self):
    method test_fmu_wrapper_fmi_version (line 262) | def test_fmu_wrapper_fmi_version(self):
    method test_fmu_wrapper_n_states (line 273) | def test_fmu_wrapper_n_states(self):
    method test_fmu_wrapper_n_event_indicators (line 283) | def test_fmu_wrapper_n_event_indicators(self):
    method test_fmu_wrapper_output_refs (line 293) | def test_fmu_wrapper_output_refs(self):
    method test_events_list_created (line 303) | def test_events_list_created(self):
    method test_verbose_mode (line 314) | def test_verbose_mode(self):

FILE: tests/evals/test_pid_system.py
  class TestPIDSystem (line 23) | class TestPIDSystem(unittest.TestCase):
    method setUp (line 25) | def setUp(self):
    method _reference_response (line 68) | def _reference_response(self):
    method test_eval_explicit_solvers (line 74) | def test_eval_explicit_solvers(self):
    method test_eval_implicit_solvers (line 101) | def test_eval_implicit_solvers(self):

FILE: tests/evals/test_relay_thermostat_system.py
  class TestRelayThermostatSystem (line 26) | class TestRelayThermostatSystem(unittest.TestCase):
    method setUp (line 41) | def setUp(self):
    method test_thermostat_oscillation (line 87) | def test_thermostat_oscillation(self):
    method test_thermostat_with_adaptive_solvers (line 110) | def test_thermostat_with_adaptive_solvers(self):
    method test_thermostat_with_implicit_solvers (line 129) | def test_thermostat_with_implicit_solvers(self):

FILE: tests/evals/test_rescale_delay_system.py
  class TestRescaleSystem (line 28) | class TestRescaleSystem(unittest.TestCase):
    method setUp (line 36) | def setUp(self):
    method test_rescale_range (line 58) | def test_rescale_range(self):
    method test_rescale_linearity (line 70) | def test_rescale_linearity(self):
  class TestRescaleSaturationSystem (line 84) | class TestRescaleSaturationSystem(unittest.TestCase):
    method test_saturation_clamps_output (line 92) | def test_saturation_clamps_output(self):
  class TestAtan2System (line 125) | class TestAtan2System(unittest.TestCase):
    method setUp (line 133) | def setUp(self):
    method test_atan2_recovers_angle (line 157) | def test_atan2_recovers_angle(self):
  class TestAliasSystem (line 174) | class TestAliasSystem(unittest.TestCase):
    method test_alias_transparent (line 182) | def test_alias_transparent(self):
  class TestDiscreteDelaySystem (line 206) | class TestDiscreteDelaySystem(unittest.TestCase):
    method setUp (line 214) | def setUp(self):
    method test_discrete_delay_offset (line 238) | def test_discrete_delay_offset(self):
    method test_discrete_delay_zero_initial (line 259) | def test_discrete_delay_zero_initial(self):

FILE: tests/evals/test_robertson_system.py
  class TestRobertsonSystem (line 25) | class TestRobertsonSystem(unittest.TestCase):
    method setUp (line 28) | def setUp(self):
    method test_eval_implicit_solvers (line 78) | def test_eval_implicit_solvers(self):

FILE: tests/evals/test_roessler_system.py
  class TestRoesslerSystem (line 33) | class TestRoesslerSystem(unittest.TestCase):
    method setUp (line 36) | def setUp(self):
    method test_eval_solvers (line 116) | def test_eval_solvers(self):
  class TestRoesslerODE (line 142) | class TestRoesslerODE(unittest.TestCase):
    method setUp (line 145) | def setUp(self):
    method test_eval_solvers (line 178) | def test_eval_solvers(self):

FILE: tests/evals/test_signal_processing_system.py
  class TestDelaySystem (line 29) | class TestDelaySystem(unittest.TestCase):
    method setUp (line 37) | def setUp(self):
    method test_delay_matches_shifted_signal (line 61) | def test_delay_matches_shifted_signal(self):
  class TestSampleHoldSystem (line 82) | class TestSampleHoldSystem(unittest.TestCase):
    method setUp (line 90) | def setUp(self):
    method test_sample_hold_piecewise_constant (line 113) | def test_sample_hold_piecewise_constant(self):
    method test_sample_hold_captures_correct_value (line 136) | def test_sample_hold_captures_correct_value(self):
  class TestDelayAdaptive (line 155) | class TestDelayAdaptive(unittest.TestCase):
    method test_delay_with_adaptive_solver (line 158) | def test_delay_with_adaptive_solver(self):

FILE: tests/evals/test_steadystate_transient_system.py
  class TestSteadyStateTransient (line 32) | class TestSteadyStateTransient(unittest.TestCase):
    method test_steady_state_then_step (line 43) | def test_steady_state_then_step(self):
    method test_steady_state_then_transient (line 72) | def test_steady_state_then_transient(self):
  class TestLinearizeAndRun (line 110) | class TestLinearizeAndRun(unittest.TestCase):
    method test_linearize_nonlinear_system (line 119) | def test_linearize_nonlinear_system(self):
  class TestResetAndContinue (line 165) | class TestResetAndContinue(unittest.TestCase):
    method test_run_reset_run (line 170) | def test_run_reset_run(self):
    method test_continuation_from_midpoint (line 204) | def test_continuation_from_midpoint(self):
  class TestMultipleSolverSwitch (line 261) | class TestMultipleSolverSwitch(unittest.TestCase):
    method test_solver_switch_during_simulation (line 267) | def test_solver_switch_during_simulation(self):

FILE: tests/evals/test_switch_lti_system.py
  class TestSwitchRoutingSystem (line 35) | class TestSwitchRoutingSystem(unittest.TestCase):
    method test_switch_between_sources (line 43) | def test_switch_between_sources(self):
    method test_switch_with_none_state (line 92) | def test_switch_with_none_state(self):
  class TestStateSpaceSystem (line 117) | class TestStateSpaceSystem(unittest.TestCase):
    method setUp (line 126) | def setUp(self):
    method test_step_response_explicit (line 150) | def test_step_response_explicit(self):
    method test_step_response_implicit (line 164) | def test_step_response_implicit(self):
  class TestTransferFunctionSystem (line 178) | class TestTransferFunctionSystem(unittest.TestCase):
    method test_tf_step_response (line 186) | def test_tf_step_response(self):
    method test_tf_in_feedback (line 217) | def test_tf_in_feedback(self):

FILE: tests/evals/test_vanderpol_system.py
  class TestVanDerPolSystem (line 25) | class TestVanDerPolSystem(unittest.TestCase):
    method setUp (line 28) | def setUp(self):
    method test_eval_solvers (line 89) | def test_eval_solvers(self):

FILE: tests/evals/test_volterralotka_system.py
  class TestVolterraLotkaSystem (line 26) | class TestVolterraLotkaSystem(unittest.TestCase):
    method setUp (line 29) | def setUp(self):
    method test_eval_solvers (line 92) | def test_eval_solvers(self):

FILE: tests/pathsim/blocks/_embedding.py
  class Embedding (line 10) | class Embedding:
    method __init__ (line 16) | def __init__(self, block, source, expected):
    method check_SISO (line 22) | def check_SISO(self, t, dt=1.0):
    method check_MIMO (line 33) | def check_MIMO(self, t, dt=1.0):

FILE: tests/pathsim/blocks/rf/test_rf.py
  function is_equal (line 19) | def is_equal(ss1, ss2):
  class TestSkrf (line 40) | class TestSkrf(unittest.TestCase):
    method test_vf (line 45) | def test_vf(self):
  class TestOnePort (line 56) | class TestOnePort(unittest.TestCase):
    method test_init (line 57) | def test_init(self):
    method test_ABCD (line 68) | def test_ABCD(self):
    method test_s_parameters (line 84) | def test_s_parameters(self):
  class TestTwoPort (line 95) | class TestTwoPort(unittest.TestCase):
    method test_init (line 96) | def test_init(self):
    method test_s_parameters (line 107) | def test_s_parameters(self):

FILE: tests/pathsim/blocks/test_adder.py
  class TestAdder (line 22) | class TestAdder(unittest.TestCase):
    method test_init (line 27) | def test_init(self):
    method test_embedding (line 43) | def test_embedding(self):
    method test_linearization (line 74) | def test_linearization(self):
    method test_update_single (line 135) | def test_update_single(self):
    method test_update_multi (line 149) | def test_update_multi(self):

FILE: tests/pathsim/blocks/test_amplifier.py
  class TestAmplifier (line 22) | class TestAmplifier(unittest.TestCase):
    method test_init (line 27) | def test_init(self):
    method test_len (line 34) | def test_len(self):
    method test_embedding (line 41) | def test_embedding(self):
    method test_linearization (line 57) | def test_linearization(self):
    method test_update (line 89) | def test_update(self):

FILE: tests/pathsim/blocks/test_block.py
  class TestBlock (line 23) | class TestBlock(unittest.TestCase):
    method test_init (line 28) | def test_init(self):
    method test_len (line 53) | def test_len(self):
    method test_on_off_bool (line 61) | def test_on_off_bool(self):
    method test_getitem (line 77) | def test_getitem(self):
    method test_getitem_slice (line 99) | def test_getitem_slice(self):
    method test_reset (line 143) | def test_reset(self):
    method test_update (line 171) | def test_update(self):
    method test_solve (line 179) | def test_solve(self):
    method test_step (line 187) | def test_step(self):
    method test_info_base_block (line 195) | def test_info_base_block(self):
    method test_info_with_parameters (line 218) | def test_info_with_parameters(self):
    method test_info_caching (line 238) | def test_info_caching(self):

FILE: tests/pathsim/blocks/test_comparator.py
  class TestComparator (line 21) | class TestComparator(unittest.TestCase):
    method test_init (line 26) | def test_init(self):
    method test_len (line 44) | def test_len(self):
    method test_update_above_threshold (line 51) | def test_update_above_threshold(self):
    method test_update_below_threshold (line 67) | def test_update_below_threshold(self):
    method test_custom_threshold (line 78) | def test_custom_threshold(self):
    method test_custom_span (line 92) | def test_custom_span(self):
    method test_event_function (line 108) | def test_event_function(self):
    method test_asymmetric_span (line 123) | def test_asymmetric_span(self):

FILE: tests/pathsim/blocks/test_converters.py
  class TestADC (line 21) | class TestADC(unittest.TestCase):
    method test_init (line 26) | def test_init(self):
    method test_len (line 46) | def test_len(self):
    method test_output_ports (line 54) | def test_output_ports(self):
    method test_sample_midrange (line 66) | def test_sample_midrange(self):
    method test_sample_minimum (line 88) | def test_sample_minimum(self):
    method test_sample_maximum (line 105) | def test_sample_maximum(self):
    method test_clipping_above (line 122) | def test_clipping_above(self):
    method test_clipping_below (line 138) | def test_clipping_below(self):
    method test_different_span (line 154) | def test_different_span(self):
  class TestDAC (line 170) | class TestDAC(unittest.TestCase):
    method test_init (line 175) | def test_init(self):
    method test_len (line 195) | def test_len(self):
    method test_input_ports (line 203) | def test_input_ports(self):
    method test_sample_zero (line 217) | def test_sample_zero(self):
    method test_sample_maximum (line 233) | def test_sample_maximum(self):
    method test_sample_midrange (line 249) | def test_sample_midrange(self):
    method test_different_span (line 271) | def test_different_span(self):
    method test_single_bit_dac (line 290) | def test_single_bit_dac(self):

FILE: tests/pathsim/blocks/test_counter.py
  class TestCounter (line 21) | class TestCounter(unittest.TestCase):
    method test_init (line 26) | def test_init(self):
    method test_len (line 43) | def test_len(self):
    method test_update_initial (line 50) | def test_update_initial(self):
    method test_output_formula (line 61) | def test_output_formula(self):
    method test_custom_start_values (line 74) | def test_custom_start_values(self):
    method test_threshold (line 84) | def test_threshold(self):
  class TestCounterUp (line 98) | class TestCounterUp(unittest.TestCase):
    method test_init (line 103) | def test_init(self):
    method test_len (line 113) | def test_len(self):
    method test_update (line 120) | def test_update(self):
  class TestCounterDown (line 130) | class TestCounterDown(unittest.TestCase):
    method test_init (line 135) | def test_init(self):
    method test_len (line 145) | def test_len(self):
    method test_update (line 152) | def test_update(self):

FILE: tests/pathsim/blocks/test_ctrl.py
  class TestPT1 (line 32) | class TestPT1(unittest.TestCase):
    method test_init (line 35) | def test_init(self):
    method test_len (line 51) | def test_len(self):
    method test_shape (line 58) | def test_shape(self):
    method test_set_solver (line 64) | def test_set_solver(self):
    method test_embedding (line 71) | def test_embedding(self):
  class TestPT2 (line 84) | class TestPT2(unittest.TestCase):
    method test_init (line 87) | def test_init(self):
    method test_len (line 105) | def test_len(self):
    method test_shape (line 112) | def test_shape(self):
    method test_damping_cases (line 118) | def test_damping_cases(self):
  class TestLeadLag (line 133) | class TestLeadLag(unittest.TestCase):
    method test_init (line 136) | def test_init(self):
    method test_len (line 153) | def test_len(self):
    method test_shape (line 168) | def test_shape(self):
    method test_pure_gain (line 174) | def test_pure_gain(self):
    method test_dc_gain (line 182) | def test_dc_gain(self):
  class TestPID (line 192) | class TestPID(unittest.TestCase):
    method test_init (line 195) | def test_init(self):
    method test_len (line 217) | def test_len(self):
    method test_shape (line 231) | def test_shape(self):
    method test_set_solver (line 237) | def test_set_solver(self):
    method test_embedding (line 244) | def test_embedding(self):
  class TestAntiWindupPID (line 257) | class TestAntiWindupPID(unittest.TestCase):
    method test_init (line 260) | def test_init(self):
    method test_len (line 269) | def test_len(self):
    method test_shape (line 275) | def test_shape(self):
    method test_set_solver (line 281) | def test_set_solver(self):
    method test_dynamics_within_limits (line 288) | def test_dynamics_within_limits(self):
    method test_dynamics_outside_limits (line 305) | def test_dynamics_outside_limits(self):
  class TestRateLimiter (line 323) | class TestRateLimiter(unittest.TestCase):
    method test_init (line 326) | def test_init(self):
    method test_len (line 335) | def test_len(self):
    method test_shape (line 342) | def test_shape(self):
    method test_set_solver (line 348) | def test_set_solver(self):
    method test_update (line 355) | def test_update(self):
  class TestBacklash (line 365) | class TestBacklash(unittest.TestCase):
    method test_init (line 368) | def test_init(self):
    method test_len (line 376) | def test_len(self):
    method test_shape (line 383) | def test_shape(self):
    method test_set_solver (line 389) | def test_set_solver(self):
    method test_update (line 396) | def test_update(self):
    method test_dynamics_inside_deadzone (line 406) | def test_dynamics_inside_deadzone(self):
    method test_dynamics_outside_deadzone (line 417) | def test_dynamics_outside_deadzone(self):
  class TestDeadband (line 434) | class TestDeadband(unittest.TestCase):
    method test_init (line 437) | def test_init(self):
    method test_len (line 445) | def test_len(self):
    method test_shape (line 452) | def test_shape(self):
    method test_embedding_inside (line 458) | def test_embedding_inside(self):
    method test_embedding_above (line 470) | def test_embedding_above(self):
    method test_embedding_below (line 482) | def test_embedding_below(self):

FILE: tests/pathsim/blocks/test_delay.py
  class TestDelay (line 23) | class TestDelay(unittest.TestCase):
    method test_init (line 28) | def test_init(self):
    method test_embedding (line 37) | def test_embedding(self):
    method test_len (line 44) | def test_len(self):
    method test_reset (line 52) | def test_reset(self):
    method test_sample (line 67) | def test_sample(self):
    method test_update (line 79) | def test_update(self):
  class TestDelayDiscrete (line 108) | class TestDelayDiscrete(unittest.TestCase):
    method test_init_discrete (line 113) | def test_init_discrete(self):
    method test_n_computation (line 123) | def test_n_computation(self):
    method test_len (line 138) | def test_len(self):
    method test_reset (line 146) | def test_reset(self):
    method test_discrete_delay (line 162) | def test_discrete_delay(self):
    method test_no_sample_without_flag (line 187) | def test_no_sample_without_flag(self):

FILE: tests/pathsim/blocks/test_differentiator.py
  class TestDifferentiator (line 23) | class TestDifferentiator(unittest.TestCase):
    method test_init (line 28) | def test_init(self):
    method test_len (line 40) | def test_len(self):
    method test_set_solver (line 48) | def test_set_solver(self):
    method test_update (line 69) | def test_update(self):

FILE: tests/pathsim/blocks/test_discrete.py
  class TestSampleHold (line 29) | class TestSampleHold(unittest.TestCase):
    method test_init (line 31) | def test_init(self):
    method test_len (line 43) | def test_len(self):
    method test_event_scheduling (line 47) | def test_event_scheduling(self):
    method test_sample_and_hold (line 53) | def test_sample_and_hold(self):
    method test_zero_order_hold_alias (line 68) | def test_zero_order_hold_alias(self):
    method test_vector_input (line 72) | def test_vector_input(self):
  class TestFirstOrderHold (line 89) | class TestFirstOrderHold(unittest.TestCase):
    method test_init (line 91) | def test_init(self):
    method test_len (line 98) | def test_len(self):
    method test_hold_during_first_interval (line 102) | def test_hold_during_first_interval(self):
    method test_linear_extrapolation (line 111) | def test_linear_extrapolation(self):
    method test_reset (line 128) | def test_reset(self):
    method test_vector_input (line 138) | def test_vector_input(self):
  class TestFIR (line 154) | class TestFIR(unittest.TestCase):
    method test_init (line 156) | def test_init(self):
    method test_len (line 168) | def test_len(self):
    method test_passthrough (line 172) | def test_passthrough(self):
    method test_moving_average (line 179) | def test_moving_average(self):
    method test_difference_filter (line 187) | def test_difference_filter(self):
    method test_reset (line 195) | def test_reset(self):
    method test_vector_input (line 204) | def test_vector_input(self):
  class TestDiscreteIntegrator (line 222) | class TestDiscreteIntegrator(unittest.TestCase):
    method test_init (line 224) | def test_init(self):
    method test_len (line 231) | def test_len(self):
    method test_forward_euler (line 235) | def test_forward_euler(self):
    method test_initial_value (line 255) | def test_initial_value(self):
    method test_reset (line 264) | def test_reset(self):
    method test_vector_input (line 273) | def test_vector_input(self):
  class TestDiscreteDerivative (line 292) | class TestDiscreteDerivative(unittest.TestCase):
    method test_backward_difference (line 294) | def test_backward_difference(self):
    method test_len (line 311) | def test_len(self):
    method test_reset (line 315) | def test_reset(self):
    method test_vector_input (line 325) | def test_vector_input(self):
  class TestDiscreteStateSpace (line 341) | class TestDiscreteStateSpace(unittest.TestCase):
    method test_scalar_init (line 343) | def test_scalar_init(self):
    method test_scalar_dynamics (line 349) | def test_scalar_dynamics(self):
    method test_direct_feedthrough (line 367) | def test_direct_feedthrough(self):
    method test_mimo (line 376) | def test_mimo(self):
    method test_reset (line 397) | def test_reset(self):
  class TestDiscreteTransferFunction (line 409) | class TestDiscreteTransferFunction(unittest.TestCase):
    method test_init (line 411) | def test_init(self):
    method test_first_order (line 416) | def test_first_order(self):
  class TestTappedDelay (line 440) | class TestTappedDelay(unittest.TestCase):
    method test_init (line 442) | def test_init(self):
    method test_len (line 448) | def test_len(self):
    method test_shifts (line 452) | def test_shifts(self):
    method test_reset (line 472) | def test_reset(self):

FILE: tests/pathsim/blocks/test_divider.py
  class TestDivider (line 20) | class TestDivider(unittest.TestCase):
    method test_init (line 25) | def test_init(self):
    method test_embedding (line 47) | def test_embedding(self):
    method test_linearization (line 97) | def test_linearization(self):
    method test_update_single (line 136) | def test_update_single(self):
    method test_update_multi (line 146) | def test_update_multi(self):
    method test_update_ops (line 159) | def test_update_ops(self):
    method test_jacobian (line 193) | def test_jacobian(self):
    method test_zero_div (line 253) | def test_zero_div(self):

FILE: tests/pathsim/blocks/test_dynsys.py
  class TestDynamicalSystem (line 24) | class TestDynamicalSystem(unittest.TestCase):
    method test_init (line 29) | def test_init(self):
    method test_len_passthrough (line 58) | def test_len_passthrough(self):
    method test_set_solver (line 89) | def test_set_solver(self):
    method test_update (line 115) | def test_update(self):
    method test_jacobian_usage (line 136) | def test_jacobian_usage(self):
    method test_state_space_equivalence (line 158) | def test_state_space_equivalence(self):
    method test_time_varying_system (line 179) | def test_time_varying_system(self):
    method test_nonlinear_dynamics (line 201) | def test_nonlinear_dynamics(self):
    method test_solve (line 217) | def test_solve(self):
    method test_step (line 237) | def test_step(self):

FILE: tests/pathsim/blocks/test_filters.py
  class TestButterworthLowpassFilter (line 22) | class TestButterworthLowpassFilter(unittest.TestCase):
    method test_init (line 27) | def test_init(self):
  class TestButterworthHighpassFilter (line 34) | class TestButterworthHighpassFilter(unittest.TestCase):
    method test_init (line 39) | def test_init(self):
  class TestButterworthBandpassFilter (line 46) | class TestButterworthBandpassFilter(unittest.TestCase):
    method test_init (line 51) | def test_init(self):
  class TestAllpassFilter (line 61) | class TestAllpassFilter(unittest.TestCase):
    method test_init (line 66) | def test_init(self):

FILE: tests/pathsim/blocks/test_fmu.py
  class TestCoSimulationFMU (line 20) | class TestCoSimulationFMU(unittest.TestCase):
    method test_import_error_without_fmpy (line 28) | def test_import_error_without_fmpy(self):
  class TestModelExchangeFMU (line 48) | class TestModelExchangeFMU(unittest.TestCase):
    method test_import_error_without_fmpy (line 56) | def test_import_error_without_fmpy(self):

FILE: tests/pathsim/blocks/test_function.py
  class TestFunction (line 20) | class TestFunction(unittest.TestCase):
    method test_init (line 25) | def test_init(self):
    method test_embedding_siso (line 42) | def test_embedding_siso(self):
    method test_embedding_miso (line 63) | def test_embedding_miso(self):
    method test_linearization_miso (line 78) | def test_linearization_miso(self):
    method test_update_siso (line 105) | def test_update_siso(self):
    method test_update_miso (line 122) | def test_update_miso(self):
    method test_update_simo (line 141) | def test_update_simo(self):
    method test_update_mimo (line 160) | def test_update_mimo(self):
  class TestDynamicalFunction (line 181) | class TestDynamicalFunction(unittest.TestCase):
    method test_init (line 186) | def test_init(self):
    method test_embedding_siso (line 204) | def test_embedding_siso(self):
    method test_embedding_miso (line 226) | def test_embedding_miso(self):

FILE: tests/pathsim/blocks/test_integrator.py
  class TestIntegrator (line 23) | class TestIntegrator(unittest.TestCase):
    method test_init (line 28) | def test_init(self):
    method test_len (line 40) | def test_len(self):
    method test_set_solver (line 48) | def test_set_solver(self):
    method test_update (line 69) | def test_update(self):

FILE: tests/pathsim/blocks/test_kalman.py
  class TestKalmanFilter (line 18) | class TestKalmanFilter(unittest.TestCase):
    method test_init_basic (line 23) | def test_init_basic(self):
    method test_init_with_initial_conditions (line 55) | def test_init_with_initial_conditions(self):
    method test_init_with_control_input (line 71) | def test_init_with_control_input(self):
    method test_init_with_dt (line 94) | def test_init_with_dt(self):
    method test_len (line 109) | def test_len(self):
    method test_constant_position_estimation (line 123) | def test_constant_position_estimation(self):
    method test_constant_velocity_estimation (line 153) | def test_constant_velocity_estimation(self):
    method test_with_control_input (line 194) | def test_with_control_input(self):
    method test_sample_method_without_dt (line 236) | def test_sample_method_without_dt(self):
    method test_output_update (line 263) | def test_output_update(self):
    method test_multidimensional_measurement (line 284) | def test_multidimensional_measurement(self):

FILE: tests/pathsim/blocks/test_logic.py
  class TestGreaterThan (line 27) | class TestGreaterThan(unittest.TestCase):
    method test_embedding (line 32) | def test_embedding(self):
    method test_equal_values (line 44) | def test_equal_values(self):
    method test_less_than (line 53) | def test_less_than(self):
  class TestLessThan (line 63) | class TestLessThan(unittest.TestCase):
    method test_embedding (line 68) | def test_embedding(self):
    method test_equal_values (line 80) | def test_equal_values(self):
  class TestEqual (line 90) | class TestEqual(unittest.TestCase):
    method test_equal (line 95) | def test_equal(self):
    method test_not_equal (line 104) | def test_not_equal(self):
    method test_tolerance (line 113) | def test_tolerance(self):
  class TestLogicAnd (line 127) | class TestLogicAnd(unittest.TestCase):
    method test_truth_table (line 132) | def test_truth_table(self):
    method test_nonzero_is_true (line 150) | def test_nonzero_is_true(self):
  class TestLogicOr (line 160) | class TestLogicOr(unittest.TestCase):
    method test_truth_table (line 165) | def test_truth_table(self):
  class TestLogicNot (line 184) | class TestLogicNot(unittest.TestCase):
    method test_true_to_false (line 189) | def test_true_to_false(self):
    method test_false_to_true (line 197) | def test_false_to_true(self):
    method test_nonzero_is_true (line 205) | def test_nonzero_is_true(self):

FILE: tests/pathsim/blocks/test_lti.py
  class TestStateSpace (line 30) | class TestStateSpace(unittest.TestCase):
    method test_init (line 36) | def test_init(self):
    method test_len (line 73) | def test_len(self):
    method test_set_solver (line 92) | def test_set_solver(self):
    method test_update (line 116) | def test_update(self):
    method test_embedding_siso (line 131) | def test_embedding_siso(self):
    method test_embedding_mimo (line 149) | def test_embedding_mimo(self):
  class TestTransferFunctionPRC (line 169) | class TestTransferFunctionPRC(unittest.TestCase):
    method test_init (line 177) | def test_init(self):
  class TestTransferFunctionZPG (line 202) | class TestTransferFunctionZPG (unittest.TestCase):
    method test_init (line 210) | def test_init(self):
  class TestTransferFunctionNumDen (line 238) | class TestTransferFunctionNumDen (unittest.TestCase):
    method test_init (line 246) | def test_init(self):

FILE: tests/pathsim/blocks/test_math.py
  class TestSin (line 16) | class TestSin(unittest.TestCase):
    method test_embedding (line 21) | def test_embedding(self):
  class TestCos (line 41) | class TestCos(unittest.TestCase):
    method test_embedding (line 46) | def test_embedding(self):
  class TestSqrt (line 66) | class TestSqrt(unittest.TestCase):
    method test_embedding (line 71) | def test_embedding(self):
  class TestAbs (line 91) | class TestAbs(unittest.TestCase):
    method test_embedding (line 96) | def test_embedding(self):
  class TestPow (line 116) | class TestPow(unittest.TestCase):
    method test_embedding (line 121) | def test_embedding(self):
  class TestPowProd (line 141) | class TestPowProd(unittest.TestCase):
    method test_embedding (line 146) | def test_embedding(self):
  class TestPolynomial (line 180) | class TestPolynomial(unittest.TestCase):
    method test_embedding (line 185) | def test_embedding(self):
    method test_constant (line 207) | def test_constant(self):
  class TestExp (line 215) | class TestExp(unittest.TestCase):
    method test_embedding (line 220) | def test_embedding(self):
  class TestLog (line 240) | class TestLog(unittest.TestCase):
    method test_embedding (line 244) | def test_embedding(self):
  class TestLog10 (line 264) | class TestLog10(unittest.TestCase):
    method test_embedding (line 269) | def test_embedding(self):
  class TestTan (line 289) | class TestTan(unittest.TestCase):
    method test_embedding (line 294) | def test_embedding(self):
  class TestSinh (line 314) | class TestSinh(unittest.TestCase):
    method test_embedding (line 319) | def test_embedding(self):
  class TestCosh (line 339) | class TestCosh(unittest.TestCase):
    method test_embedding (line 344) | def test_embedding(self):
  class TestTanh (line 364) | class TestTanh(unittest.TestCase):
    method test_embedding (line 369) | def test_embedding(self):
  class TestAtan (line 389) | class TestAtan(unittest.TestCase):
    method test_embedding (line 394) | def test_embedding(self):
  class TestNorm (line 414) | class TestNorm(unittest.TestCase):
    method test_embedding (line 419) | def test_embedding(self):
  class TestMod (line 439) | class TestMod(unittest.TestCase):
    method test_embedding (line 444) | def test_embedding(self):
  class TestClip (line 464) | class TestClip(unittest.TestCase):
    method test_embedding (line 469) | def test_embedding(self):
  class TestMatrix (line 490) | class TestMatrix(unittest.TestCase):
    method test_init_default (line 495) | def test_init_default(self):
    method test_init_custom_square (line 502) | def test_init_custom_square(self):
    method test_init_custom_rectangular (line 510) | def test_init_custom_rectangular(self):
    method test_init_invalid_dimension (line 517) | def test_init_invalid_dimension(self):
    method test_init_invalid_dimension_3d (line 522) | def test_init_invalid_dimension_3d(self):
    method test_embedding_identity (line 527) | def test_embedding_identity(self):
    method test_embedding_square_matrix (line 538) | def test_embedding_square_matrix(self):
    method test_embedding_rectangular_matrix (line 552) | def test_embedding_rectangular_matrix(self):
    method test_embedding_single_output (line 566) | def test_embedding_single_output(self):
  class TestAtan2 (line 582) | class TestAtan2(unittest.TestCase):
    method test_embedding (line 587) | def test_embedding(self):
    method test_quadrants (line 598) | def test_quadrants(self):
  class TestRescale (line 617) | class TestRescale(unittest.TestCase):
    method test_default_identity (line 622) | def test_default_identity(self):
    method test_custom_mapping (line 633) | def test_custom_mapping(self):
    method test_saturate (line 644) | def test_saturate(self):
    method test_no_saturate (line 659) | def test_no_saturate(self):
    method test_vector_input (line 668) | def test_vector_input(self):
  class TestAlias (line 680) | class TestAlias(unittest.TestCase):
    method test_passthrough_siso (line 685) | def test_passthrough_siso(self):
    method test_passthrough_mimo (line 696) | def test_passthrough_mimo(self):

FILE: tests/pathsim/blocks/test_multiplier.py
  class TestMultiplier (line 22) | class TestMultiplier(unittest.TestCase):
    method test_embedding (line 28) | def test_embedding(self):
    method test_linearization (line 50) | def test_linearization(self):
    method test_update_single (line 75) | def test_update_single(self):
    method test_update_multi (line 89) | def test_update_multi(self):

FILE: tests/pathsim/blocks/test_noise.py
  class TestWhiteNoise (line 20) | class TestWhiteNoise(unittest.TestCase):
    method test_init_default (line 25) | def test_init_default(self):
    method test_init_standard_deviation (line 35) | def test_init_standard_deviation(self):
    method test_init_spectral_density (line 44) | def test_init_spectral_density(self):
    method test_init_with_seed (line 53) | def test_init_with_seed(self):
    method test_len (line 66) | def test_len(self):
    method test_sample_continuous_mode (line 73) | def test_sample_continuous_mode(self):
    method test_sample_discrete_mode (line 91) | def test_sample_discrete_mode(self):
    method test_spectral_density_scaling (line 111) | def test_spectral_density_scaling(self):
    method test_standard_deviation_constant_amplitude (line 130) | def test_standard_deviation_constant_amplitude(self):
    method test_update (line 145) | def test_update(self):
    method test_reset (line 155) | def test_reset(self):
  class TestPinkNoise (line 171) | class TestPinkNoise(unittest.TestCase):
    method test_init_default (line 176) | def test_init_default(self):
    method test_init_standard_deviation (line 189) | def test_init_standard_deviation(self):
    method test_init_spectral_density (line 200) | def test_init_spectral_density(self):
    method test_init_with_seed (line 210) | def test_init_with_seed(self):
    method test_len (line 226) | def test_len(self):
    method test_sample_continuous_mode (line 233) | def test_sample_continuous_mode(self):
    method test_sample_discrete_mode (line 251) | def test_sample_discrete_mode(self):
    method test_octave_update_algorithm (line 270) | def test_octave_update_algorithm(self):
    method test_update (line 285) | def test_update(self):
    method test_reset (line 295) | def test_reset(self):

FILE: tests/pathsim/blocks/test_ode.py
  class TestODE (line 24) | class TestODE(unittest.TestCase):
    method test_init (line 29) | def test_init(self):
    method test_len (line 59) | def test_len(self):
    method test_set_solver (line 67) | def test_set_solver(self):
    method test_operators (line 93) | def test_operators(self):
    method test_update (line 115) | def test_update(self):
    method test_solve (line 126) | def test_solve(self):
    method test_step (line 147) | def test_step(self):

FILE: tests/pathsim/blocks/test_relay.py
  class TestRelay (line 19) | class TestRelay(unittest.TestCase):
    method test_init_default (line 24) | def test_init_default(self):
    method test_init_custom (line 39) | def test_init_custom(self):
    method test_len (line 54) | def test_len(self):
    method test_update (line 60) | def test_update(self):
    method test_event_functions (line 71) | def test_event_functions(self):
    method test_event_actions (line 94) | def test_event_actions(self):
    method test_thermostat_scenario (line 112) | def test_thermostat_scenario(self):
    method test_port_labels (line 131) | def test_port_labels(self):

FILE: tests/pathsim/blocks/test_rng.py
  class TestRandomNumberGenerator (line 18) | class TestRandomNumberGenerator(unittest.TestCase):
    method test_init (line 23) | def test_init(self):
    method test_len (line 36) | def test_len(self):
    method test_reset (line 44) | def test_reset(self):
    method test_sample (line 57) | def test_sample(self):

FILE: tests/pathsim/blocks/test_scope.py
  class TestScope (line 25) | class TestScope(unittest.TestCase):
    method test_init (line 30) | def test_init(self):
    method test_inputs_default (line 48) | def test_inputs_default(self):
    method test_len (line 57) | def test_len(self):
    method test_reset (line 65) | def test_reset(self):
    method test_sample (line 84) | def test_sample(self):
    method test_read (line 113) | def test_read(self):
    method test_sampling_period (line 152) | def test_sampling_period(self):
    method test_t_wait (line 157) | def test_t_wait(self):
    method test_read_empty (line 178) | def test_read_empty(self):
    method test_plot_empty (line 188) | def test_plot_empty(self):
    method test_plot_with_data (line 205) | def test_plot_with_data(self):
    method test_plot2D_empty (line 230) | def test_plot2D_empty(self):
    method test_plot2D_insufficient_channels (line 246) | def test_plot2D_insufficient_channels(self):
    method test_plot2D_with_data (line 268) | def test_plot2D_with_data(self):
    method test_plot2D_invalid_axes (line 291) | def test_plot2D_invalid_axes(self):
    method test_plot3D_empty (line 313) | def test_plot3D_empty(self):
    method test_plot3D_insufficient_channels (line 329) | def test_plot3D_insufficient_channels(self):
    method test_plot3D_with_data (line 352) | def test_plot3D_with_data(self):
    method test_plot3D_invalid_axes (line 372) | def test_plot3D_invalid_axes(self):
    method test_save (line 395) | def test_save(self):
    method test_save_without_csv_extension (line 431) | def test_save_without_csv_extension(self):
  class TestRealtimeScope (line 454) | class TestRealtimeScope(unittest.TestCase):
    method test_init (line 459) | def test_init(self):
    method test_sample_with_realtime_plotter (line 475) | def test_sample_with_realtime_plotter(self):
    method test_sample_with_sampling_period (line 492) | def test_sample_with_sampling_period(self):

FILE: tests/pathsim/blocks/test_sources.py
  class TestConstant (line 26) | class TestConstant(unittest.TestCase):
    method test_init (line 29) | def test_init(self):
    method test_update (line 34) | def test_update(self):
    method test_reset (line 42) | def test_reset(self):
    method test_len (line 50) | def test_len(self):
  class TestSource (line 55) | class TestSource(unittest.TestCase):
    method test_init (line 58) | def test_init(self):
    method test_update (line 71) | def test_update(self):
    method test_decorator_usage (line 82) | def test_decorator_usage(self):
    method test_len (line 93) | def test_len(self):
  class TestTriangleWaveSource (line 98) | class TestTriangleWaveSource(unittest.TestCase):
    method test_init (line 101) | def test_init(self):
    method test_update (line 114) | def test_update(self):
    method test_len (line 121) | def test_len(self):
  class TestSinusoidalSource (line 126) | class TestSinusoidalSource(unittest.TestCase):
    method test_init (line 129) | def test_init(self):
    method test_update (line 142) | def test_update(self):
    method test_len (line 158) | def test_len(self):
  class TestGaussianPulseSource (line 163) | class TestGaussianPulseSource(unittest.TestCase):
    method test_init (line 166) | def test_init(self):
    method test_update (line 179) | def test_update(self):
    method test_len (line 191) | def test_len(self):
  class TestSinusoidalPhaseNoiseSource (line 196) | class TestSinusoidalPhaseNoiseSource(unittest.TestCase):
    method test_init (line 199) | def test_init(self):
    method test_set_solver (line 216) | def test_set_solver(self):
    method test_update_and_sample (line 225) | def test_update_and_sample(self):
    method test_reset (line 247) | def test_reset(self):
    method test_len (line 258) | def test_len(self):
    method test_continuous_sampling (line 262) | def test_continuous_sampling(self):
    method test_solve (line 278) | def test_solve(self):
    method test_step (line 286) | def test_step(self):
  class TestChirpPhaseNoiseSource (line 297) | class TestChirpPhaseNoiseSource(unittest.TestCase):
    method test_init (line 300) | def test_init(self):
    method test_set_solver (line 317) | def test_set_solver(self):
    method test_triangle_wave (line 325) | def test_triangle_wave(self):
    method test_update (line 332) | def test_update(self):
    method test_len (line 344) | def test_len(self):
    method test_reset (line 348) | def test_reset(self):
    method test_continuous_sampling (line 356) | def test_continuous_sampling(self):
    method test_solve (line 363) | def test_solve(self):
    method test_step (line 370) | def test_step(self):
  class TestChirpSource (line 380) | class TestChirpSource(unittest.TestCase):
    method test_deprecation_warning (line 383) | def test_deprecation_warning(self):
  class TestPulseSource (line 391) | class TestPulseSource(unittest.TestCase):
    method test_init_default (line 394) | def test_init_default(self):
    method test_init_validation (line 401) | def test_init_validation(self):
    method test_update_phases (line 422) | def test_update_phases(self):
    method test_events (line 447) | def test_events(self):
    method test_reset (line 457) | def test_reset(self):
    method test_len (line 467) | def test_len(self):
    method test_reset_with_time (line 471) | def test_reset_with_time(self):
  class TestPulse (line 490) | class TestPulse(unittest.TestCase):
    method test_deprecation_warning (line 493) | def test_deprecation_warning(self):
  class TestClockSource (line 501) | class TestClockSource(unittest.TestCase):
    method test_init (line 504) | def test_init(self):
    method test_events (line 515) | def test_events(self):
    method test_len (line 527) | def test_len(self):
  class TestClock (line 532) | class TestClock(unittest.TestCase):
    method test_deprecation_warning (line 535) | def test_deprecation_warning(self):
  class TestSquareWaveSource (line 543) | class TestSquareWaveSource(unittest.TestCase):
    method test_init (line 546) | def test_init(self):
    method test_events (line 559) | def test_events(self):
    method test_len (line 571) | def test_len(self):
  class TestStepSource (line 576) | class TestStepSource(unittest.TestCase):
    method test_init (line 579) | def test_init(self):
    method test_event (line 610) | def test_event(self):
    method test_len (line 618) | def test_len(self):
  class TestStep (line 623) | class TestStep(unittest.TestCase):
    method test_deprecation_warning (line 626) | def test_deprecation_warning(self):

FILE: tests/pathsim/blocks/test_spectrum.py
  class TestSpectrum (line 28) | class TestSpectrum(unittest.TestCase):
    method test_init (line 33) | def test_init(self):
    method test_len (line 55) | def test_len(self):
    method test_set_solver (line 63) | def test_set_solver(self):
    method test_read (line 85) | def test_read(self):
    method test_reset (line 115) | def test_reset(self):
    method test_kernel_no_alpha (line 133) | def test_kernel_no_alpha(self):
    method test_kernel_with_alpha (line 151) | def test_kernel_with_alpha(self):
    method test_sample (line 168) | def test_sample(self):
    method test_solve_before_wait (line 182) | def test_solve_before_wait(self):
    method test_solve_after_wait (line 199) | def test_solve_after_wait(self):
    method test_step_before_wait (line 218) | def test_step_before_wait(self):
    method test_step_after_wait (line 236) | def test_step_after_wait(self):
    method test_update (line 258) | def test_update(self):
    method test_read_with_state (line 269) | def test_read_with_state(self):
    method test_read_with_alpha (line 292) | def test_read_with_alpha(self):
    method test_plot_no_engine (line 316) | def test_plot_no_engine(self):
    method test_plot_with_data (line 327) | def test_plot_with_data(self):
    method test_save (line 351) | def test_save(self):
    method test_save_without_csv_extension (line 391) | def test_save_without_csv_extension(self):
    method test_save_multiple_channels (line 414) | def test_save_multiple_channels(self):
  class TestRealtimeSpectrum (line 447) | class TestRealtimeSpectrum(unittest.TestCase):
    method test_init (line 453) | def test_init(self):
    method test_step_early_time (line 481) | def test_step_early_time(self):
    method test_step_after_wait (line 504) | def test_step_after_wait(self):

FILE: tests/pathsim/blocks/test_switch.py
  class TestSwitch (line 20) | class TestSwitch(unittest.TestCase):
    method test_init (line 25) | def test_init(self):
    method test_len (line 39) | def test_len(self):
    method test_select (line 50) | def test_select(self):
    method test_update (line 66) | def test_update(self):

FILE: tests/pathsim/blocks/test_table.py
  class TestLUT (line 9) | class TestLUT(unittest.TestCase):
    method test_init (line 14) | def test_init(self):
    method test_update_2d_mimo (line 27) | def test_update_2d_mimo(self):
  class TestLUT1D (line 47) | class TestLUT1D(unittest.TestCase):
    method test_init (line 52) | def test_init(self):
    method test_embedding_siso (line 71) | def test_embedding_siso(self):
    method test_embedding_simo (line 91) | def test_embedding_simo(self):
    method test_linearization_siso (line 112) | def test_linearization_siso(self):
    method test_sensitivity (line 145) | def test_sensitivity(self):
    method test_update_siso (line 171) | def test_update_siso(self):
    method test_update_simo (line 188) | def test_update_simo(self):
    method test_extrapolation_behavior (line 206) | def test_extrapolation_behavior(self):
    method test_init_1d_single_output (line 229) | def test_init_1d_single_output(self):
    method test_init_1d_multiple_outputs (line 242) | def test_init_1d_multiple_outputs(self):
    method test_interpolation_1d_multiple_outputs (line 255) | def test_interpolation_1d_multiple_outputs(self):
    method test_update_functionality_multiple_outputs (line 275) | def test_update_functionality_multiple_outputs(self):
    method test_inheritance_from_function (line 295) | def test_inheritance_from_function(self):
  class TestLUT1D (line 224) | class TestLUT1D(unittest.TestCase):
    method test_init (line 52) | def test_init(self):
    method test_embedding_siso (line 71) | def test_embedding_siso(self):
    method test_embedding_simo (line 91) | def test_embedding_simo(self):
    method test_linearization_siso (line 112) | def test_linearization_siso(self):
    method test_sensitivity (line 145) | def test_sensitivity(self):
    method test_update_siso (line 171) | def test_update_siso(self):
    method test_update_simo (line 188) | def test_update_simo(self):
    method test_extrapolation_behavior (line 206) | def test_extrapolation_behavior(self):
    method test_init_1d_single_output (line 229) | def test_init_1d_single_output(self):
    method test_init_1d_multiple_outputs (line 242) | def test_init_1d_multiple_outputs(self):
    method test_interpolation_1d_multiple_outputs (line 255) | def test_interpolation_1d_multiple_outputs(self):
    method test_update_functionality_multiple_outputs (line 275) | def test_update_functionality_multiple_outputs(self):
    method test_inheritance_from_function (line 295) | def test_inheritance_from_function(self):

FILE: tests/pathsim/blocks/test_wrapper.py
  class TestWrapper (line 18) | class TestWrapper(unittest.TestCase):
    method test_init (line 23) | def test_init(self):
    method test_init_with_dec (line 26) | def test_init_with_dec(self):
    method test_init_with_func (line 34) | def test_init_with_func(self):
    method test_init_with_func_as_class (line 42) | def test_init_with_func_as_class(self):
    method test_raise_not_overcharged (line 51) | def test_raise_not_overcharged(self):
    method test_overcharge (line 56) | def test_overcharge(self):
    method test_wrapped_func (line 62) | def test_wrapped_func(self):
    method test_trigger_event_error (line 72) | def test_trigger_event_error(self):
    method test_assert_update_event_tau (line 79) | def test_assert_update_event_tau(self):
    method test_assert_update_event_period (line 87) | def test_assert_update_event_period(self):
    method test_wrong_tau (line 95) | def test_wrong_tau(self):
    method test_wrong_period (line 100) | def test_wrong_period(self):
    method test_trigger_event (line 106) | def test_trigger_event(self):

FILE: tests/pathsim/events/test_condition.py
  class TestCondition (line 20) | class TestCondition(unittest.TestCase):
    method test_detect_false_condition (line 25) | def test_detect_false_condition(self):
    method test_detect_true_condition_not_close (line 40) | def test_detect_true_condition_not_close(self):
    method test_detect_true_condition_close (line 55) | def test_detect_true_condition_close(self):
    method test_resolve_without_action (line 70) | def test_resolve_without_action(self):
    method test_resolve_with_action (line 89) | def test_resolve_with_action(self):
    method test_bisection_behavior (line 113) | def test_bisection_behavior(self):
    method test_len (line 133) | def test_len(self):

FILE: tests/pathsim/events/test_event.py
  class TestEvent (line 22) | class TestEvent(unittest.TestCase):
    method test_init (line 27) | def test_init(self):
    method test_on_off (line 49) | def test_on_off(self):
    method test_bool (line 63) | def test_bool(self):
    method test_len (line 77) | def test_len(self):
    method test_iter (line 86) | def test_iter(self):
    method test_detect (line 95) | def test_detect(self):
    method test_resolve (line 105) | def test_resolve(self):

FILE: tests/pathsim/events/test_schedule.py
  class TestSchedule (line 21) | class TestSchedule(unittest.TestCase):
    method test_init (line 26) | def test_init(self):
    method test_next (line 39) | def test_next(self):
    method test_estimate (line 53) | def test_estimate(self):
    method test_detect (line 69) | def test_detect(self):
  class TestScheduleList (line 90) | class TestScheduleList(unittest.TestCase):
    method test_init (line 95) | def test_init(self):
    method test_next (line 108) | def test_next(self):
    method test_estimate (line 125) | def test_estimate(self):
    method test_detect (line 140) | def test_detect(self):
    method test_func_act_is_not_none (line 159) | def test_func_act_is_not_none(self):

FILE: tests/pathsim/events/test_zerocrossing.py
  class TestZeroCrossing (line 24) | class TestZeroCrossing(unittest.TestCase):
    method test_detect_up (line 29) | def test_detect_up(self):
    method test_detect_down (line 62) | def test_detect_down(self):
  class TestZeroCrossingUp (line 95) | class TestZeroCrossingUp(unittest.TestCase):
    method test_detect_up (line 100) | def test_detect_up(self):
    method test_detect_down (line 133) | def test_detect_down(self):
  class TestZeroCrossingDown (line 153) | class TestZeroCrossingDown(unittest.TestCase):
    method test_detect_up (line 158) | def test_detect_up(self):
    method test_detect_down (line 191) | def test_detect_down(self):

FILE: tests/pathsim/optim/test_anderson.py
  class TestAnderson (line 21) | class TestAnderson(unittest.TestCase):
    method test_init (line 26) | def test_init(self):
    method test_reset (line 36) | def test_reset(self):
    method test_step_scalar (line 49) | def test_step_scalar(self):
    method test_step_vector (line 56) | def test_step_vector(self):
    method test_solve_converge_scalar (line 64) | def test_solve_converge_scalar(self):
    method test_solve_converge_vector (line 73) | def test_solve_converge_vector(self):
    method test_restart_behavior (line 84) | def test_restart_behavior(self):
  class TestNewtonAnderson (line 99) | class TestNewtonAnderson(unittest.TestCase):
    method test_init (line 104) | def test_init(self):
    method test_step_no_jacobian (line 112) | def test_step_no_jacobian(self):
    method test_step_with_jacobian_scalar (line 121) | def test_step_with_jacobian_scalar(self):
    method test_step_with_jacobian_vector (line 134) | def test_step_with_jacobian_vector(self):
    method test_solve_scalar_equation (line 144) | def test_solve_scalar_equation(self):

FILE: tests/pathsim/optim/test_numerical.py
  class TestNumericalJacobian (line 17) | class TestNumericalJacobian(unittest.TestCase):
    method test_num_jac_scalar (line 22) | def test_num_jac_scalar(self):
    method test_num_jac_vec (line 32) | def test_num_jac_vec(self):
    method test_num_autojac_scalar (line 40) | def test_num_autojac_scalar(self):
    method test_num_autojac_vec (line 51) | def test_num_autojac_vec(self):

FILE: tests/pathsim/optim/test_operator.py
  class TestOperator (line 20) | class TestOperator(unittest.TestCase):
    method test_init (line 25) | def test_init(self):
    method test_bool_cast (line 49) | def test_bool_cast(self):
    method test_call_direct (line 57) | def test_call_direct(self):
    method test_call_linearized (line 69) | def test_call_linearized(self):
    method test_jac_analytical (line 94) | def test_jac_analytical(self):
    method test_linearize (line 110) | def test_linearize(self):
    method test_reset (line 128) | def test_reset(self):
    method test_multi_input_output (line 150) | def test_multi_input_output(self):
  class TestDynamicOperator (line 184) | class TestDynamicOperator(unittest.TestCase):
    method test_init (line 189) | def test_init(self):
    method test_bool_cast (line 222) | def test_bool_cast(self):
    method test_call_direct (line 230) | def test_call_direct(self):
    method test_call_linearized (line 244) | def test_call_linearized(self):
    method test_jac_x_analytical (line 278) | def test_jac_x_analytical(self):
    method test_jac_u_analytical (line 296) | def test_jac_u_analytical(self):
    method test_jac_x_automatic (line 314) | def test_jac_x_automatic(self):
    method test_jac_u_automatic (line 329) | def test_jac_u_automatic(self):
    method test_linearize (line 344) | def test_linearize(self):
    method test_reset (line 369) | def test_reset(self):
    method test_multi_input_output (line 397) | def test_multi_input_output(self):

FILE: tests/pathsim/solvers/_referenceproblems.py
  class Problem (line 16) | class Problem:
    method __init__ (line 17) | def __init__(self, name, func, jac, x0, solution, t_span=(0, 10)):

FILE: tests/pathsim/solvers/test_bdf.py
  class TestBDF2 (line 24) | class TestBDF2(unittest.TestCase):
    method test_init (line 29) | def test_init(self):
    method test_buffer (line 53) | def test_buffer(self):
    method test_step (line 72) | def test_step(self):
    method test_integrate_fixed (line 86) | def test_integrate_fixed(self):
  class TestBDF3 (line 139) | class TestBDF3(unittest.TestCase):
    method test_init (line 144) | def test_init(self):
    method test_buffer (line 168) | def test_buffer(self):
    method test_step (line 187) | def test_step(self):
    method test_integrate_fixed (line 201) | def test_integrate_fixed(self):
  class TestBDF4 (line 253) | class TestBDF4(unittest.TestCase):
    method test_init (line 258) | def test_init(self):
    method test_buffer (line 282) | def test_buffer(self):
    method test_step (line 301) | def test_step(self):
    method test_integrate_fixed (line 315) | def test_integrate_fixed(self):
  class TestBDF5 (line 367) | class TestBDF5(unittest.TestCase):
    method test_init (line 372) | def test_init(self):
    method test_buffer (line 396) | def test_buffer(self):
    method test_step (line 415) | def test_step(self):
    method test_integrate_fixed (line 429) | def test_integrate_fixed(self):
  class TestBDF6 (line 480) | class TestBDF6(unittest.TestCase):
    method test_init (line 485) | def test_init(self):
    method test_buffer (line 509) | def test_buffer(self):
    method test_step (line 528) | def test_step(self):
    method test_integrate_fixed (line 542) | def test_integrate_fixed(self):

FILE: tests/pathsim/solvers/test_dirk2.py
  class TestDIRK2 (line 22) | class TestDIRK2(unittest.TestCase):
    method test_init (line 27) | def test_init(self):
    method test_stages (line 51) | def test_stages(self):
    method test_step (line 61) | def test_step(self):
    method test_integrate_fixed (line 81) | def test_integrate_fixed(self):

FILE: tests/pathsim/solvers/test_dirk3.py
  class TestDIRK3 (line 22) | class TestDIRK3(unittest.TestCase):
    method test_init (line 27) | def test_init(self):
    method test_stages (line 51) | def test_stages(self):
    method test_step (line 61) | def test_step(self):
    method test_integrate_fixed (line 81) | def test_integrate_fixed(self):

FILE: tests/pathsim/solvers/test_esdirk32.py
  class TestESDIRK32 (line 22) | class TestESDIRK32(unittest.TestCase):
    method test_init (line 27) | def test_init(self):
    method test_stages (line 52) | def test_stages(self):
    method test_step (line 62) | def test_step(self):
    method test_integrate_fixed (line 87) | def test_integrate_fixed(self):
    method test_integrate_adaptive (line 124) | def test_integrate_adaptive(self):

FILE: tests/pathsim/solvers/test_esdirk4.py
  class TestESDIRK4 (line 22) | class TestESDIRK4(unittest.TestCase):
    method test_init (line 27) | def test_init(self):
    method test_stages (line 51) | def test_stages(self):
    method test_step (line 61) | def test_step(self):
    method test_integrate_fixed (line 81) | def test_integrate_fixed(self):

FILE: tests/pathsim/solvers/test_esdirk43.py
  class TestESDIRK43 (line 22) | class TestESDIRK43(unittest.TestCase):
    method test_init (line 27) | def test_init(self):
    method test_stages (line 51) | def test_stages(self):
    method test_step (line 61) | def test_step(self):
    method test_integrate_fixed (line 86) | def test_integrate_fixed(self):
    method test_integrate_adaptive (line 123) | def test_integrate_adaptive(self):

FILE: tests/pathsim/solvers/test_esdirk54.py
  class TestESDIRK54 (line 22) | class TestESDIRK54(unittest.TestCase):
    method test_init (line 27) | def test_init(self):
    method test_stages (line 51) | def test_stages(self):
    method test_step (line 61) | def test_step(self):
    method test_integrate_fixed (line 86) | def test_integrate_fixed(self):
    method test_integrate_adaptive (line 123) | def test_integrate_adaptive(self):

FILE: tests/pathsim/solvers/test_esdirk85.py
  class TestESDIRK85 (line 24) | class TestESDIRK85(unittest.TestCase):
    method test_init (line 29) | def test_init(self):
    method test_stages (line 54) | def test_stages(self):
    method test_step (line 64) | def test_step(self):
    method test_integrate_fixed (line 89) | def test_integrate_fixed(self):
    method test_integrate_adaptive (line 145) | def test_integrate_adaptive(self):

FILE: tests/pathsim/solvers/test_euler.py
  class TestEUF (line 22) | class TestEUF(unittest.TestCase):
    method test_init (line 27) | def test_init(self):
    method test_stages (line 51) | def test_stages(self):
    method test_step (line 61) | def test_step(self):
    method test_integrate_fixed (line 80) | def test_integrate_fixed(self):
  class TestEUB (line 119) | class TestEUB(unittest.TestCase):
    method test_init (line 124) | def test_init(self):
    method test_stages (line 148) | def test_stages(self):
    method test_step (line 158) | def test_step(self):
    method test_integrate_fixed (line 177) | def test_integrate_fixed(self):

FILE: tests/pathsim/solvers/test_gear.py
  class TestComputeBDFCoefficients (line 24) | class TestComputeBDFCoefficients(unittest.TestCase):
    method test_order_1 (line 29) | def test_order_1(self):
    method test_order_2 (line 43) | def test_order_2(self):
    method test_order_3 (line 57) | def test_order_3(self):
    method test_order_4 (line 71) | def test_order_4(self):
    method test_order_5 (line 85) | def test_order_5(self):
    method test_order_6 (line 99) | def test_order_6(self):
  class TestGEAR21 (line 116) | class TestGEAR21(unittest.TestCase):
    method test_init (line 121) | def test_init(self):
    method test_buffer (line 143) | def test_buffer(self):
    method test_integrate_fixed (line 158) | def test_integrate_fixed(self):
    method test_integrate_adaptive (line 212) | def test_integrate_adaptive(self):
  class TestGEAR32 (line 241) | class TestGEAR32(unittest.TestCase):
    method test_init (line 246) | def test_init(self):
    method test_buffer (line 268) | def test_buffer(self):
    method test_integrate_fixed (line 283) | def test_integrate_fixed(self):
    method test_integrate_adaptive (line 338) | def test_integrate_adaptive(self):
  class TestGEAR43 (line 368) | class TestGEAR43(unittest.TestCase):
    method test_init (line 373) | def test_init(self):
    method test_buffer (line 395) | def test_buffer(self):
    method test_integrate_fixed (line 410) | def test_integrate_fixed(self):
    method test_integrate_adaptive (line 464) | def test_integrate_adaptive(self):
  class TestGEAR54 (line 493) | class TestGEAR54(unittest.TestCase):
    method test_init (line 498) | def test_init(self):
    method test_buffer (line 520) | def test_buffer(self):
    method test_integrate_fixed (line 535) | def test_integrate_fixed(self):
    method test_integrate_adaptive (line 589) | def test_integrate_adaptive(self):
  class TestGEAR52A (line 619) | class TestGEAR52A(unittest.TestCase):
    method test_init (line 624) | def test_init(self):
    method test_integrate_fixed (line 646) | def test_integrate_fixed(self):
    method test_integrate_adaptive (line 697) | def test_integrate_adaptive(self):

FILE: tests/pathsim/solvers/test_rfk21.py
  class TestRKF21 (line 22) | class TestRKF21(unittest.TestCase):
    method test_init (line 27) | def test_init(self):
    method test_stages (line 51) | def test_stages(self):
    method test_step (line 61) | def test_step(self):
    method test_integrate_fixed (line 85) | def test_integrate_fixed(self):
    method test_integrate_adaptive (line 124) | def test_integrate_adaptive(self):

FILE: tests/pathsim/solvers/test_rk4.py
  class TestRK4 (line 22) | class TestRK4(unittest.TestCase):
    method test_init (line 27) | def test_init(self):
    method test_stages (line 49) | def test_stages(self):
    method test_step (line 59) | def test_step(self):
    method test_integrate_fixed (line 78) | def test_integrate_fixed(self):

FILE: tests/pathsim/solvers/test_rkbs32.py
  class TestRKBS32 (line 22) | class TestRKBS32(unittest.TestCase):
    method test_init (line 27) | def test_init(self):
    method test_stages (line 51) | def test_stages(self):
    method test_step (line 61) | def test_step(self):
    method test_integrate_fixed (line 85) | def test_integrate_fixed(self):
    method test_integrate_adaptive (line 124) | def test_integrate_adaptive(self):

FILE: tests/pathsim/solvers/test_rkck54.py
  class TestRKCK54 (line 22) | class TestRKCK54(unittest.TestCase):
    method test_init (line 27) | def test_init(self):
    method test_stages (line 51) | def test_stages(self):
    method test_step (line 61) | def test_step(self):
    method test_integrate_fixed (line 85) | def test_integrate_fixed(self):
    method test_integrate_adaptive (line 121) | def test_integrate_adaptive(self):

FILE: tests/pathsim/solvers/test_rkdp54.py
  class TestRKDP54 (line 22) | class TestRKDP54(unittest.TestCase):
    method test_init (line 27) | def test_init(self):
    method test_stages (line 51) | def test_stages(self):
    method test_step (line 61) | def test_step(self):
    method test_integrate_fixed (line 85) | def test_integrate_fixed(self):
    method test_integrate_adaptive (line 121) | def test_integrate_adaptive(self):

FILE: tests/pathsim/solvers/test_rkdp87.py
  class TestRKDP87 (line 24) | class TestRKDP87(unittest.TestCase):
    method test_init (line 29) | def test_init(self):
    method test_stages (line 53) | def test_stages(self):
    method test_step (line 63) | def test_step(self):
    method test_integrate_fixed (line 87) | def test_integrate_fixed(self):
    method test_integrate_adaptive (line 137) | def test_integrate_adaptive(self):

FILE: tests/pathsim/solvers/test_rkf45.py
  class TestRKF45 (line 24) | class TestRKF45(unittest.TestCase):
    method test_init (line 29) | def test_init(self):
    method test_stages (line 53) | def test_stages(self):
    method test_step (line 63) | def test_step(self):
    method test_integrate_fixed (line 87) | def test_integrate_fixed(self):
    method test_integrate_adaptive (line 140) | def test_integrate_adaptive(self):

FILE: tests/pathsim/solvers/test_rkf78.py
  class TestRKF78 (line 24) | class TestRKF78(unittest.TestCase):
    method test_init (line 29) | def test_init(self):
    method test_stages (line 53) | def test_stages(self):
    method test_step (line 63) | def test_step(self):
    method test_integrate_fixed (line 87) | def test_integrate_fixed(self):
    method test_integrate_adaptive (line 137) | def test_integrate_adaptive(self):

FILE: tests/pathsim/solvers/test_rkv65.py
  class TestRKV65 (line 24) | class TestRKV65(unittest.TestCase):
    method test_init (line 29) | def test_init(self):
    method test_stages (line 53) | def test_stages(self):
    method test_step (line 63) | def test_step(self):
    method test_integrate_fixed (line 87) | def test_integrate_fixed(self):
    method test_integrate_adaptive (line 137) | def test_integrate_adaptive(self):

FILE: tests/pathsim/solvers/test_solver.py
  class TestBaseSolver (line 24) | class TestBaseSolver(unittest.TestCase):
    method setUp (line 29) | def setUp(self):
    method test_init (line 32) | def test_init(self):
    method test_str (line 37) | def test_str(self):
    method test_stages (line 40) | def test_stages(self):
    method test_get_set (line 44) | def test_get_set(self):
    method test_reset (line 48) | def test_reset(self):
    method test_buffer (line 53) | def test_buffer(self):
    method test_cast (line 58) | def test_cast(self):
  class ExplicitSolverTest (line 64) | class ExplicitSolverTest(unittest.TestCase):
    method setUp (line 68) | def setUp(self):
    method test_init (line 71) | def test_init(self):
    method test_integrate_singlestep (line 75) | def test_integrate_singlestep(self):
    method test_integrate (line 83) | def test_integrate(self):
  class ImplicitSolverTest (line 92) | class ImplicitSolverTest(unittest.TestCase):
    method setUp (line 97) | def setUp(self):
    method test_init (line 100) | def test_init(self):
    method test_solve (line 104) | def test_solve(self):

FILE: tests/pathsim/solvers/test_ssprk22.py
  class TestSSPRK22 (line 24) | class TestSSPRK22(unittest.TestCase):
    method test_init (line 29) | def test_init(self):
    method test_stages (line 51) | def test_stages(self):
    method test_step (line 61) | def test_step(self):
    method test_integrate_fixed (line 80) | def test_integrate_fixed(self):

FILE: tests/pathsim/solvers/test_ssprk33.py
  class TestSSPRK33 (line 27) | class TestSSPRK33(unittest.TestCase):
    method test_init (line 32) | def test_init(self):
    method test_stages (line 54) | def test_stages(self):
    method test_step (line 64) | def test_step(self):
    method test_integrate_fixed (line 83) | def test_integrate_fixed(self):

FILE: tests/pathsim/solvers/test_ssprk34.py
  class TestSSPRK34 (line 24) | class TestSSPRK34(unittest.TestCase):
    method test_init (line 29) | def test_init(self):
    method test_stages (line 51) | def test_stages(self):
    method test_step (line 61) | def test_step(self):
    method test_integrate_fixed (line 80) | def test_integrate_fixed(self):

FILE: tests/pathsim/solvers/test_steadystate.py
  class TestSteadyState (line 20) | class TestSteadyState(unittest.TestCase):
    method test_init (line 25) | def test_init(self):
    method test_solve_without_jacobian (line 47) | def test_solve_without_jacobian(self):
    method test_solve_with_jacobian (line 65) | def test_solve_with_jacobian(self):
    method test_fixed_point_equation (line 86) | def test_fixed_point_equation(self):
    method test_jacobian_transformation (line 107) | def test_jacobian_transformation(self):
    method test_solve_simple_steady_state_problem (line 131) | def test_solve_simple_steady_state_problem(self):

FILE: tests/pathsim/test_checkpoint.py
  class TestBlockCheckpoint (line 22) | class TestBlockCheckpoint:
    method test_basic_block_to_checkpoint (line 25) | def test_basic_block_to_checkpoint(self):
    method test_block_checkpoint_roundtrip (line 37) | def test_block_checkpoint_roundtrip(self):
    method test_block_type_mismatch_raises (line 55) | def test_block_type_mismatch_raises(self):
  class TestEventCheckpoint (line 66) | class TestEventCheckpoint:
    method test_event_checkpoint_roundtrip (line 69) | def test_event_checkpoint_roundtrip(self):
  class TestSwitchCheckpoint (line 89) | class TestSwitchCheckpoint:
    method test_switch_state_preserved (line 92) | def test_switch_state_preserved(self):
  class TestSimulationCheckpoint (line 104) | class TestSimulationCheckpoint:
    method test_save_load_simple (line 107) | def test_save_load_simple(self):
    method test_continue_after_load (line 149) | def test_continue_after_load(self):
    method test_scope_recordings (line 181) | def test_scope_recordings(self):
    method test_delay_continuous_checkpoint (line 207) | def test_delay_continuous_checkpoint(self):
    method test_delay_discrete_checkpoint (line 234) | def test_delay_discrete_checkpoint(self):
    method test_cross_instance_load (line 254) | def test_cross_instance_load(self):
    method test_scope_recordings_preserved_without_flag (line 284) | def test_scope_recordings_preserved_without_flag(self):
    method test_multiple_same_type_blocks (line 307) | def test_multiple_same_type_blocks(self):
  class TestFIRCheckpoint (line 335) | class TestFIRCheckpoint:
    method test_fir_buffer_preserved (line 338) | def test_fir_buffer_preserved(self):
  class TestKalmanFilterCheckpoint (line 357) | class TestKalmanFilterCheckpoint:
    method test_kalman_state_preserved (line 360) | def test_kalman_state_preserved(self):
  class TestNoiseCheckpoint (line 384) | class TestNoiseCheckpoint:
    method test_white_noise_sample_preserved (line 387) | def test_white_noise_sample_preserved(self):
    method test_pink_noise_state_preserved (line 399) | def test_pink_noise_state_preserved(self):
  class TestRNGCheckpoint (line 422) | class TestRNGCheckpoint:
    method test_rng_sample_preserved (line 425) | def test_rng_sample_preserved(self):
  class TestSubsystemCheckpoint (line 438) | class TestSubsystemCheckpoint:
    method test_subsystem_roundtrip (line 441) | def test_subsystem_roundtrip(self):
    method test_subsystem_cross_instance (line 485) | def test_subsystem_cross_instance(self):
  class TestGEARCheckpoint (line 523) | class TestGEARCheckpoint:
    method test_gear_solver_roundtrip (line 526) | def test_gear_solver_roundtrip(self):
    method test_gear_continue_after_load (line 556) | def test_gear_continue_after_load(self):
  class TestSpectrumCheckpoint (line 592) | class TestSpectrumCheckpoint:
    method test_spectrum_roundtrip (line 595) | def test_spectrum_roundtrip(self):
  class TestScopeCheckpointExtended (line 623) | class TestScopeCheckpointExtended:
    method test_scope_with_sampling_period (line 626) | def test_scope_with_sampling_period(self):
    method test_scope_recordings_roundtrip (line 646) | def test_scope_recordings_roundtrip(self):
    method test_scope_recordings_included_by_default (line 672) | def test_scope_recordings_included_by_default(self):
  class TestSimulationCheckpointExtended (line 699) | class TestSimulationCheckpointExtended:
    method test_save_load_with_extension (line 702) | def test_save_load_with_extension(self):
    method test_checkpoint_with_events (line 723) | def test_checkpoint_with_events(self):
    method test_event_numpy_history (line 756) | def test_event_numpy_history(self):

FILE: tests/pathsim/test_connection.py
  class TestConnection (line 22) | class TestConnection(unittest.TestCase):
    method test_init_none (line 27) | def test_init_none(self):
    method test_init_single (line 34) | def test_init_single(self):
    method test_init_multi (line 65) | def test_init_multi(self):
    method test_update_single (line 99) | def test_update_single(self):
    method test_update_multi (line 119) | def test_update_multi(self):
    method test_on_off_bool (line 143) | def test_on_off_bool(self):
    method test_resolve_ports_grows_input_register (line 162) | def test_resolve_ports_grows_input_register(self):
    method test_resolve_ports_is_idempotent (line 188) | def test_resolve_ports_is_idempotent(self):
    method test_resolve_ports_multi_target (line 206) | def test_resolve_ports_multi_target(self):
  class TestDuplex (line 219) | class TestDuplex(unittest.TestCase):
    method test_init_none (line 224) | def test_init_none(self):
    method test_init_mixed (line 231) | def test_init_mixed(self):
    method test_update (line 276) | def test_update(self):

FILE: tests/pathsim/test_diagnostics.py
  class TestDiagnosticsOff (line 11) | class TestDiagnosticsOff(unittest.TestCase):
    method test_diagnostics_none_by_default (line 14) | def test_diagnostics_none_by_default(self):
  class TestDiagnosticsExplicitSolver (line 27) | class TestDiagnosticsExplicitSolver(unittest.TestCase):
    method test_snapshot_after_run (line 30) | def test_snapshot_after_run(self):
    method test_worst_block (line 54) | def test_worst_block(self):
    method test_summary_string (line 71) | def test_summary_string(self):
    method test_reset_clears_diagnostics (line 86) | def test_reset_clears_diagnostics(self):
  class TestDiagnosticsAdaptiveSolver (line 102) | class TestDiagnosticsAdaptiveSolver(unittest.TestCase):
    method test_adaptive_step_errors (line 105) | def test_adaptive_step_errors(self):
  class TestDiagnosticsImplicitSolver (line 126) | class TestDiagnosticsImplicitSolver(unittest.TestCase):
    method test_implicit_solve_residuals (line 129) | def test_implicit_solve_residuals(self):
  class TestDiagnosticsAlgebraicLoop (line 157) | class TestDiagnosticsAlgebraicLoop(unittest.TestCase):
    method test_algebraic_loop_residuals (line 160) | def test_algebraic_loop_residuals(self):
  class TestDiagnosticsHistory (line 191) | class TestDiagnosticsHistory(unittest.TestCase):
    method test_no_history_by_default (line 194) | def test_no_history_by_default(self):
    method test_history_enabled (line 208) | def test_history_enabled(self):
    method test_history_reset (line 226) | def test_history_reset(self):
  class TestDiagnosticsUnit (line 242) | class TestDiagnosticsUnit(unittest.TestCase):
    method test_defaults (line 245) | def test_defaults(self):
    method test_worst_block_from_step_errors (line 251) | def test_worst_block_from_step_errors(self):
    method test_worst_block_from_solve_residuals (line 262) | def test_worst_block_from_solve_residuals(self):
    method test_summary_with_all_data (line 273) | def test_summary_with_all_data(self):
  class TestConvergenceTrackerUnit (line 302) | class TestConvergenceTrackerUnit(unittest.TestCase):
    method test_record_and_converge (line 305) | def test_record_and_converge(self):
    method test_begin_iteration_clears (line 313) | def test_begin_iteration_clears(self):
    method test_details (line 320) | def test_details(self):
  class TestStepTrackerUnit (line 329) | class TestStepTrackerUnit(unittest.TestCase):
    method test_record_aggregation (line 332) | def test_record_aggregation(self):
    method test_scale_default (line 342) | def test_scale_default(self):
    method test_reset (line 347) | def test_reset(self):

FILE: tests/pathsim/test_simulation.py
  class TestSimulation (line 47) | class TestSimulation(unittest.TestCase):
    method test_init_default (line 54) | def test_init_default(self):
    method test_init_sepecific (line 70) | def test_init_sepecific(self):
    method test_contains (line 111) | def test_contains(self):
    method test_add_block (line 132) | def test_add_block(self):
    method test_add_connection (line 148) | def test_add_connection(self):
    method test_set_solver (line 172) | def test_set_solver(self):
    method test_size (line 208) | def test_size(self):
    method test_update (line 239) | def test_update(self):
    method test_step (line 254) | def test_step(self):
    method test_stop (line 288) | def test_stop(self):
    method test_run (line 310) | def test_run(self):
  class TestSimulationIVP (line 336) | class TestSimulationIVP(unittest.TestCase):
    method setUp (line 342) | def setUp(self):
    method test_init (line 363) | def test_init(self):
    method test_set_solver (line 382) | def test_set_solver(self):
    method test_step (line 404) | def test_step(self):
    method test_run (line 438) | def test_run(self):
  class TestSimulationEvents (line 483) | class TestSimulationEvents(unittest.TestCase):
    method test_add_event (line 486) | def test_add_event(self):
    method test_contains_event (line 501) | def test_contains_event(self):
    method test_run_with_schedule_event (line 520) | def test_run_with_schedule_event(self):
    method test_run_with_relay_block (line 553) | def test_run_with_relay_block(self):
    method test_reset_with_events (line 575) | def test_reset_with_events(self):
  class TestSimulationAdvanced (line 593) | class TestSimulationAdvanced(unittest.TestCase):
    method setUp (line 596) | def setUp(self):
    method test_linearize_delinearize (line 613) | def test_linearize_delinearize(self):
    method test_steadystate (line 632) | def test_steadystate(self):
    method test_run_adaptive (line 644) | def test_run_adaptive(self):
    method test_run_adaptive_with_events (line 662) | def test_run_adaptive_with_events(self):
    method test_run_adaptive_implicit (line 678) | def test_run_adaptive_implicit(self):
    method test_run_streaming (line 690) | def test_run_streaming(self):
    method test_run_streaming_no_callback (line 711) | def test_run_streaming_no_callback(self):
    method test_collect (line 729) | def test_collect(self):
    method test_stop_interrupts_run (line 745) | def test_stop_interrupts_run(self):
    method test_stop_simulation_exception_stops_run (line 760) | def test_stop_simulation_exception_stops_run(self):
    method test_stop_simulation_at_first_step (line 781) | def test_stop_simulation_at_first_step(self):
    method test_stop_simulation_exception_stops_run_streaming (line 801) | def test_stop_simulation_exception_stops_run_streaming(self):
    method test_stop_simulation_no_exception_normal_run (line 827) | def test_stop_simulation_no_exception_normal_run(self):
    method test_deprecated_timestep_methods (line 836) | def test_deprecated_timestep_methods(self):
    method test_run_realtime (line 858) | def test_run_realtime(self):
  class TestSimulationRuntimeMutation (line 878) | class TestSimulationRuntimeMutation(unittest.TestCase):
    method setUp (line 882) | def setUp(self):
    method test_graph_dirty_after_add_block (line 898) | def test_graph_dirty_after_add_block(self):
    method test_graph_dirty_after_remove_block (line 908) | def test_graph_dirty_after_remove_block(self):
    method test_graph_dirty_after_add_connection (line 921) | def test_graph_dirty_after_add_connection(self):
    method test_graph_dirty_after_remove_connection (line 934) | def test_graph_dirty_after_remove_connection(self):
    method test_lazy_rebuild_on_update (line 943) | def test_lazy_rebuild_on_update(self):
    method test_remove_block_error (line 953) | def test_remove_block_error(self):
    method test_remove_connection_error (line 959) | def test_remove_connection_error(self):
    method test_remove_connection_zeroes_inputs (line 966) | def test_remove_connection_zeroes_inputs(self):
    method test_remove_event (line 983) | def test_remove_event(self):
    method test_remove_event_error (line 992) | def test_remove_event_error(self):
    method test_add_block_during_run (line 998) | def test_add_block_during_run(self):
    method test_remove_block_during_run (line 1013) | def test_remove_block_during_run(self):
    method test_add_connection_during_run (line 1026) | def test_add_connection_during_run(self):
    method test_remove_connection_during_run (line 1043) | def test_remove_connection_during_run(self):
    method test_multiple_mutations_single_rebuild (line 1052) | def test_multiple_mutations_single_rebuild(self):
    method test_dynamic_block_tracking (line 1068) | def test_dynamic_block_tracking(self):
    method test_remove_dynamic_block_tracking (line 1077) | def test_remove_dynamic_block_tracking(self):
    method test_streaming_with_mutations (line 1086) | def test_streaming_with_mutations(self):
    method test_parameter_mutation_during_run (line 1110) | def test_parameter_mutation_during_run(self):
  class TestSimulationAlgebraicLoop (line 1127) | class TestSimulationAlgebraicLoop(unittest.TestCase):
    method test_function_in_algebraic_loop_runs (line 1138) | def test_function_in_algebraic_loop_runs(self):
    method test_assemble_graph_resolves_all_connections (line 1162) | def test_assemble_graph_resolves_all_connections(self):

FILE: tests/pathsim/test_subsystem.py
  class TestInterface (line 24) | class TestInterface(unittest.TestCase):
    method test_len (line 32) | def test_len(self):
  class TestSubsystem (line 38) | class TestSubsystem(unittest.TestCase):
    method test_init (line 43) | def test_init(self):
    method test_check_connections (line 72) | def test_check_connections(self):
    method test_inputs_property (line 84) | def test_inputs_property(self):
    method test_outputs_property (line 103) | def test_outputs_property(self):
    method test_update (line 119) | def test_update(self):
    method test_contains (line 129) | def test_contains(self):
    method test_size (line 148) | def test_size(self):
    method test_len (line 187) | def test_len(self):
    method test_call (line 202) | def test_call(self):
    method test_on_off (line 219) | def test_on_off(self):
    method test_call_with_dynamic_blocks (line 245) | def test_call_with_dynamic_blocks(self):
    method test_algebraic_loop_with_boosters (line 267) | def test_algebraic_loop_with_boosters(self):
    method test_plot_method (line 296) | def test_plot_method(self):
    method test_linearize_delinearize (line 309) | def test_linearize_delinearize(self):
    method test_events_property (line 325) | def test_events_property(self):
    method test_sample_method (line 340) | def test_sample_method(self):
    method test_reset_method (line 353) | def test_reset_method(self):
    method test_solve_step_revert_buffer (line 370) | def test_solve_step_revert_buffer(self):
    method test_len_with_algebraic_passthrough (line 396) | def test_len_with_algebraic_passthrough(self):
    method test_graph (line 410) | def test_graph(self): pass
    method test_nesting (line 411) | def test_nesting(self): pass
  class TestSubsystemRuntimeMutation (line 414) | class TestSubsystemRuntimeMutation(unittest.TestCase):
    method setUp (line 418) | def setUp(self):
    method test_graph_dirty_after_add_block (line 432) | def test_graph_dirty_after_add_block(self):
    method test_graph_dirty_after_remove_block (line 442) | def test_graph_dirty_after_remove_block(self):
    method test_graph_dirty_after_add_connection (line 452) | def test_graph_dirty_after_add_connection(self):
    method test_graph_dirty_after_remove_connection (line 463) | def test_graph_dirty_after_remove_connection(self):
    method test_lazy_rebuild_on_update (line 472) | def test_lazy_rebuild_on_update(self):
    method test_remove_block_error (line 481) | def test_remove_block_error(self):
    method test_remove_connection_error (line 487) | def test_remove_connection_error(self):
    method test_add_remove_event (line 494) | def test_add_remove_event(self):
    method test_add_event_duplicate_error (line 505) | def test_add_event_duplicate_error(self):
    method test_remove_event_error (line 515) | def test_remove_event_error(self):
    method test_multiple_mutations_single_rebuild (line 523) | def test_multiple_mutations_single_rebuild(self):
    method test_dynamic_block_with_solver (line 539) | def test_dynamic_block_with_solver(self):
    method test_remove_dynamic_block_tracking (line 553) | def test_remove_dynamic_block_tracking(self):
    method test_mutation_in_simulation_context (line 567) | def test_mutation_in_simulation_context(self):

FILE: tests/pathsim/utils/test_adaptivebuffer.py
  class TestAdaptiveBuffer (line 22) | class TestAdaptiveBuffer(unittest.TestCase):
    method test_init (line 27) | def test_init(self):
    method test_add (line 39) | def test_add(self):
    method test_get_empty (line 55) | def test_get_empty(self):
    method test_get (line 65) | def test_get(self):
    method test_get_too_large (line 79) | def test_get_too_large(self):
    method test_clear (line 93) | def test_clear(self):

FILE: tests/pathsim/utils/test_analysis.py
  class TestTimer (line 22) | class TestTimer(unittest.TestCase):
    method setUp (line 27) | def setUp(self):
    method test_timer_context_manager_verbose (line 36) | def test_timer_context_manager_verbose(self):
    method test_timer_context_manager_non_verbose (line 57) | def test_timer_context_manager_non_verbose(self):
    method test_timer_repr_before_execution (line 67) | def test_timer_repr_before_execution(self):
    method test_timer_as_decorator (line 75) | def test_timer_as_decorator(self):
    method test_timer_measures_correctly (line 88) | def test_timer_measures_correctly(self):
  class TestTimerDecorator (line 98) | class TestTimerDecorator(unittest.TestCase):
    method setUp (line 103) | def setUp(self):
    method test_timer_decorator_basic (line 111) | def test_timer_decorator_basic(self):
    method test_timer_decorator_with_sleep (line 123) | def test_timer_decorator_with_sleep(self):
    method test_timer_decorator_preserves_function_name (line 136) | def test_timer_decorator_preserves_function_name(self):
    method test_timer_decorator_with_args_kwargs (line 150) | def test_timer_decorator_with_args_kwargs(self):
    method test_timer_decorator_with_exception (line 160) | def test_timer_decorator_with_exception(self):

FILE: tests/pathsim/utils/test_fmuwrapper.py
  function fmpy_available (line 22) | def fmpy_available():
  class TestFMUWrapperImport (line 32) | class TestFMUWrapperImport(unittest.TestCase):
    method test_import_error_without_fmpy (line 35) | def test_import_error_without_fmpy(self):
  class TestFMUWrapperCoSimulation (line 50) | class TestFMUWrapperCoSimulation(unittest.TestCase):
    method setUpClass (line 54) | def setUpClass(cls):
    method setUp (line 63) | def setUp(self):
    method test_init_cosimulation (line 67) | def test_init_cosimulation(self):
    method test_invalid_mode (line 75) | def test_invalid_mode(self):
    method test_fmi_version_detection (line 82) | def test_fmi_version_detection(self):
    method test_variable_maps (line 89) | def test_variable_maps(self):
    method test_create_port_registers (line 97) | def test_create_port_registers(self):
    method test_initialize_and_step (line 107) | def test_initialize_and_step(self):
    method test_default_step_size (line 117) | def test_default_step_size(self):
    method test_reset (line 125) | def test_reset(self):
  class TestFMUWrapperModelExchange (line 145) | class TestFMUWrapperModelExchange(unittest.TestCase):
    method setUpClass (line 149) | def setUpClass(cls):
    method setUp (line 155) | def setUp(self):
    method test_init_model_exchange (line 159) | def test_init_model_exchange(self):
    method test_n_states (line 167) | def test_n_states(self):
    method test_n_event_indicators (line 174) | def test_n_event_indicators(self):
    method test_initialize_model_exchange (line 181) | def test_initialize_model_exchange(self):
    method test_enter_continuous_time_mode (line 190) | def test_enter_continuous_time_mode(self):
    method test_get_continuous_states (line 198) | def test_get_continuous_states(self):
    method test_set_continuous_states (line 209) | def test_set_continuous_states(self):
    method test_get_derivatives (line 221) | def test_get_derivatives(self):
    method test_get_event_indicators (line 233) | def test_get_event_indicators(self):
    method test_event_mode_cycle (line 245) | def test_event_mode_cycle(self):
    method test_completed_integrator_step (line 262) | def test_completed_integrator_step(self):
    method test_needs_completed_integrator_step (line 275) | def test_needs_completed_integrator_step(self):
    method test_provides_jacobian (line 282) | def test_provides_jacobian(self):
    method test_model_exchange_mode_errors_on_cosim_methods (line 289) | def test_model_exchange_mode_errors_on_cosim_methods(self):
    method test_set_variable (line 297) | def test_set_variable(self):
  class TestEventInfo (line 306) | class TestEventInfo(unittest.TestCase):
    method test_event_info_defaults (line 309) | def test_event_info_defaults(self):
    method test_event_info_custom_values (line 322) | def test_event_info_custom_values(self):
  class TestStepResult (line 343) | class TestStepResult(unittest.TestCase):
    method test_step_result_defaults (line 346) | def test_step_result_defaults(self):
    method test_step_result_custom_values (line 357) | def test_step_result_custom_values(self):

FILE: tests/pathsim/utils/test_gilbert.py
  function evaluate_statespace (line 19) | def evaluate_statespace(s, A, B, C, D):
  function evaluate_poleresidue (line 23) | def evaluate_poleresidue(s, Poles, Residues, Const):
  class TestGilbertRealization (line 29) | class TestGilbertRealization(unittest.TestCase):
    method assertArrayAlmostEqual (line 34) | def assertArrayAlmostEqual(self, first, second, places=7, msg=None):
    method test_helpers (line 37) | def test_helpers(self):
    method test_siso_real_poles (line 46) | def test_siso_real_poles(self):
    method test_siso_complex_poles (line 57) | def test_siso_complex_poles(self):
    method test_siso_complex_poles_with_missing_conjugate (line 68) | def test_siso_complex_poles_with_missing_conjugate(self):
    method test_mimo_2x2 (line 83) | def test_mimo_2x2(self):
    method test_mimo_3x2 (line 96) | def test_mimo_3x2(self):
    method test_input_validation (line 109) | def test_input_validation(self):

FILE: tests/pathsim/utils/test_graph.py
  class TestGraph (line 22) | class TestGraph(unittest.TestCase):
    method setUp (line 25) | def setUp(self):
    method test_init_empty (line 63) | def test_init_empty(self):
    method test_init_with_mixed_nodes_edges_acyclic (line 75) | def test_init_with_mixed_nodes_edges_acyclic(self):
    method test_init_with_dynamic_loop (line 83) | def test_init_with_dynamic_loop(self):
    method test_init_with_algebraic_loop (line 91) | def test_init_with_algebraic_loop(self):
    method test_has_loops_mixed_false (line 98) | def test_has_loops_mixed_false(self):
    method test_has_loops_mixed_true_algebraic (line 104) | def test_has_loops_mixed_true_algebraic(self):
    method test_has_loops_mixed_true_via_integrator (line 113) | def test_has_loops_mixed_true_via_integrator(self):
    method test_depth_acyclic_mixed (line 129) | def test_depth_acyclic_mixed(self):
    method test_depth_algebraic_loop (line 141) | def test_depth_algebraic_loop(self):
    method test_depth_dynamic_loop (line 153) | def test_depth_dynamic_loop(self):
    method test_size_property (line 167) | def test_size_property(self):
    method test_size_property_empty (line 177) | def test_size_property_empty(self):
    method test_bool_operator (line 187) | def test_bool_operator(self):
    method test_outgoing_connections (line 197) | def test_outgoing_connections(self):
    method test_is_algebraic_path_simple (line 218) | def test_is_algebraic_path_simple(self):
    method test_is_algebraic_path_self_loop (line 238) | def test_is_algebraic_path_self_loop(self):
    method test_is_algebraic_path_no_connection (line 250) | def test_is_algebraic_path_no_connection(self):
    method test_loop_traversal (line 263) | def test_loop_traversal(self):
    method test_loop_closing_connections (line 282) | def test_loop_closing_connections(self):
    method test_loop_closing_connections_acyclic (line 298) | def test_loop_closing_connections_acyclic(self):
    method test_init_with_none_arguments (line 309) | def test_init_with_none_arguments(self):
    method test_single_algebraic_block (line 319) | def test_single_algebraic_block(self):
    method test_single_dynamic_block (line 334) | def test_single_dynamic_block(self):
    method test_self_connection_algebraic (line 348) | def test_self_connection_algebraic(self):
    method test_complex_mixed_graph (line 360) | def test_complex_mixed_graph(self):
    method test_linear_chain (line 391) | def test_linear_chain(self):
    method test_multiple_sccs (line 417) | def test_multiple_sccs(self):
    method test_dag_empty_when_only_loops (line 442) | def test_dag_empty_when_only_loops(self):
    method test_loop_empty_when_acyclic (line 453) | def test_loop_empty_when_acyclic(self):
    method test_parallel_branches (line 464) | def test_parallel_branches(self):
    method test_disconnected_components (line 490) | def test_disconnected_components(self):
    method test_is_algebraic_path_through_multiple_blocks (line 505) | def test_is_algebraic_path_through_multiple_blocks(self):

FILE: tests/pathsim/utils/test_logger.py
  class TestLoggerManager (line 22) | class TestLoggerManager(unittest.TestCase):
    method setUp (line 27) | def setUp(self):
    method test_singleton_pattern (line 39) | def test_singleton_pattern(self):
    method test_default_initialization (line 48) | def test_default_initialization(self):
    method test_configure_stdout (line 63) | def test_configure_stdout(self):
    method test_configure_file (line 82) | def test_configure_file(self):
    method test_configure_disabled (line 124) | def test_configure_disabled(self):
    method test_configure_custom_format (line 145) | def test_configure_custom_format(self):
    method test_reconfigure (line 169) | def test_reconfigure(self):
    method test_get_logger (line 192) | def test_get_logger(self):
    method test_get_logger_reuse (line 211) | def test_get_logger_reuse(self):
    method test_set_level_global (line 222) | def test_set_level_global(self):
    method test_set_level_module (line 235) | def test_set_level_module(self):
    method test_get_effective_level_module (line 250) | def test_get_effective_level_module(self):
    method test_logging_hierarchy (line 267) | def test_logging_hierarchy(self):
    method test_warnings_captured (line 283) | def test_warnings_captured(self):
    method test_init_with_enabled (line 292) | def test_init_with_enabled(self):
    method test_init_with_file_output (line 306) | def test_init_with_file_output(self):
    method test_init_disabled_by_default (line 335) | def test_init_disabled_by_default(self):
    method test_singleton_ignores_subsequent_params (line 343) | def test_singleton_ignores_subsequent_params(self):

FILE: tests/pathsim/utils/test_mutable.py
  class TestMutableDecorator (line 27) | class TestMutableDecorator(unittest.TestCase):
    method test_basic_construction (line 30) | def test_basic_construction(self):
    method test_param_mutation_triggers_reinit (line 38) | def test_param_mutation_triggers_reinit(self):
    method test_batched_set (line 52) | def test_batched_set(self):
    method test_mutable_params_introspection (line 61) | def test_mutable_params_introspection(self):
    method test_mutable_params_inherited (line 67) | def test_mutable_params_inherited(self):
    method test_no_reinit_during_construction (line 78) | def test_no_reinit_during_construction(self):
  class TestEnginePreservation (line 87) | class TestEnginePreservation(unittest.TestCase):
    method test_engine_preserved_same_dimension (line 90) | def test_engine_preserved_same_dimension(self):
    method test_engine_recreated_on_dimension_change (line 105) | def test_engine_recreated_on_dimension_change(self):
  class TestInheritance (line 125) | class TestInheritance(unittest.TestCase):
    method test_antiwinduppid_construction (line 128) | def test_antiwinduppid_construction(self):
    method test_antiwinduppid_parent_param_mutation (line 134) | def test_antiwinduppid_parent_param_mutation(self):
    method test_antiwinduppid_own_param_mutation (line 148) | def test_antiwinduppid_own_param_mutation(self):
  class TestSpecificBlocks (line 157) | class TestSpecificBlocks(unittest.TestCase):
    method test_pt2 (line 160) | def test_pt2(self):
    method test_leadlag (line 167) | def test_leadlag(self):
    method test_transfer_function_numden (line 174) | def test_transfer_function_numden(self):
    method test_transfer_function_dimension_change (line 180) | def test_transfer_function_dimension_change(self):
    method test_sinusoidal_source (line 187) | def test_sinusoidal_source(self):
    method test_delay (line 193) | def test_delay(self):
    method test_clock_source (line 199) | def test_clock_source(self):
    method test_fir (line 205) | def test_fir(self):
    method test_samplehold (line 212) | def test_samplehold(self):
    method test_butterworth_filter_mutation (line 217) | def test_butterworth_filter_mutation(self):
    method test_butterworth_filter_order_change (line 224) | def test_butterworth_filter_order_change(self):
  class TestMutableInSimulation (line 233) | class TestMutableInSimulation(unittest.TestCase):
    method test_pt1_mutation_mid_simulation (line 236) | def test_pt1_mutation_mid_simulation(self):

FILE: tests/pathsim/utils/test_portreference.py
  class TestPortReference (line 21) | class TestPortReference(unittest.TestCase):
    method test_init (line 26) | def test_init(self):
    method test_len (line 55) | def test_len(self):
    method test_to (line 74) | def test_to(self):
    method test_get_inputs (line 110) | def test_get_inputs(self):
    method test_get_outputs (line 127) | def test_get_outputs(self):
    method test_set_inputs (line 144) | def test_set_inputs(self):
    method test_set_outputs (line 161) | def test_set_outputs(self):

FILE: tests/pathsim/utils/test_progresstracker.py
  class TestProgressTracker (line 21) | class TestProgressTracker(unittest.TestCase):
    method _get_test_logger (line 27) | def _get_test_logger(self, name):
    method test_iter_successful_5_percent (line 39) | def test_iter_successful_5_percent(self):
    method test_iter_successful_10_percent (line 79) | def test_iter_successful_10_percent(self):
    method test_iter_mixed_success_5_percent (line 111) | def test_iter_mixed_success_5_percent(self):
    method test_iter_mixed_success_10_percent (line 147) | def test_iter_mixed_success_10_percent(self):
    method test_interrupt_early (line 182) | def test_interrupt_early(self):
    method test_normal_completion_not_interrupted (line 218) | def test_normal_completion_not_interrupted(self):
    method test_interrupt_with_mixed_success (line 245) | def test_interrupt_with_mixed_success(self):
    method test_invalid_total_duration (line 277) | def test_invalid_total_duration(self):
    method test_invalid_update_log_every (line 290) | def test_invalid_update_log_every(self):
    method test_invalid_min_log_interval (line 307) | def test_invalid_min_log_interval(self):
    method test_progress_clamping (line 315) | def test_progress_clamping(self):
    method test_update_before_start_warning (line 330) | def test_update_before_start_warning(self):
    method test_update_after_close_warning (line 343) | def test_update_after_close_warning(self):
    method test_iterator_without_start_warning (line 355) | def test_iterator_without_start_warning(self):
    method test_close_multiple_times (line 366) | def test_close_multiple_times(self):
    method test_logging_disabled (line 379) | def test_logging_disabled(self):
    method test_format_time_edge_cases (line 393) | def test_format_time_edge_cases(self):
    method test_format_rate_edge_cases (line 421) | def test_format_rate_edge_cases(self):
    method test_render_bar (line 448) | def test_render_bar(self):
    method test_ema_alpha_clamping (line 466) | def test_ema_alpha_clamping(self):
    method test_stats_tracking (line 483) | def test_stats_tracking(self):

FILE: tests/pathsim/utils/test_realtimeplotter.py
  class TestRealtimePlotter (line 21) | class TestRealtimePlotter(unittest.TestCase):
    method setUp (line 26) | def setUp(self):
    method test_init (line 34) | def test_init(self, mock_plt):
    method test_update_all (line 60) | def test_update_all(self, mock_time, mock_plt):
    method test_update (line 81) | def test_update(self, mock_time, mock_plt):
    method test_on_close (line 99) | def test_on_close(self, mock_plt):
    method test_show (line 109) | def test_show(self, mock_plt):

FILE: tests/pathsim/utils/test_register.py
  class TestRegister (line 20) | class TestRegister(unittest.TestCase):
    method test_init (line 25) | def test_init(self):
    method test_len (line 46) | def test_len(self):
    method test_iter (line 61) | def test_iter(self):
    method test_reset (line 78) | def test_reset(self):
    method test_to_array (line 105) | def test_to_array(self):
    method test_update_from_array (line 134) | def test_update_from_array(self):
    method test_setitem (line 164) | def test_setitem(self):
    method test_getitem (line 184) | def test_getitem(self):
Condensed preview — 413 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (7,364K chars).
[
  {
    "path": ".codecov.yml",
    "chars": 94,
    "preview": "codecov:\n  require_ci_to_pass: yes\n\ncoverage:\n  precision: 2\n  round: down\n  range: \"70...100\""
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 19,
    "preview": "github: milanofthe\n"
  },
  {
    "path": ".github/workflows/pypi_deployment.yml",
    "chars": 751,
    "preview": "name: Publish PathSim to PyPI\n\non:\n  release:\n    types: [published] \n  workflow_dispatch: \n\npermissions:\n  contents: re"
  },
  {
    "path": ".github/workflows/tests_codecov.yml",
    "chars": 750,
    "preview": "name: Run tests and upload coverage\non: [push, pull_request]\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      -"
  },
  {
    "path": ".github/workflows/urlchecker.yml",
    "chars": 913,
    "preview": "# https://github.com/marketplace/actions/urlchecker-action\nname: Check URLs\n\non: [push]\n\njobs:\n  build:\n    runs-on: ubu"
  },
  {
    "path": ".gitignore",
    "chars": 914,
    "preview": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Notebooks (except docu"
  },
  {
    "path": "CITATION.cff",
    "chars": 748,
    "preview": "cff-version: \"1.2.0\"\nauthors:\n- family-names: Rother\n  given-names: Milan\n  orcid: \"https://orcid.org/0009-0006-5964-611"
  },
  {
    "path": "LICENSE.txt",
    "chars": 1068,
    "preview": "MIT License\n\nCopyright (c) 2024 Milan Rother\n\nPermission is hereby granted, free of charge, to any person obtaining a co"
  },
  {
    "path": "README.md",
    "chars": 3605,
    "preview": "<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/pathsim/pathsim/master/docs/source/logos/pathsim_logo.p"
  },
  {
    "path": "conftest.py",
    "chars": 339,
    "preview": "def pytest_addoption(parser):\n    parser.addoption(\n        \"--run-all\",\n        action=\"store_true\",\n        default=Fa"
  },
  {
    "path": "docs/.readthedocs.yaml",
    "chars": 638,
    "preview": "# Read the Docs configuration file\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details\n\n# Requir"
  },
  {
    "path": "docs/Makefile",
    "chars": 636,
    "preview": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line, and also\n# from the "
  },
  {
    "path": "docs/requirements.txt",
    "chars": 179,
    "preview": "numpy>=1.15,<2\nmatplotlib>=3.1\nrequests>=2.28.0\nscipy>=1.2\nsphinx\nfuro\nmyst-parser\nsphinx-autoapi\nsphinx-copybutton\nsphi"
  },
  {
    "path": "docs/source/_ext/github_issues.py",
    "chars": 3990,
    "preview": "import requests\nimport os\nfrom datetime import datetime\n\ndef fetch_github_issues(app, config):\n    \"\"\"Fetch GitHub issue"
  },
  {
    "path": "docs/source/_static/custom.css",
    "chars": 4188,
    "preview": "/* Custom CSS for PathSim Documentation */\n\n\n\n\n\n/* GitHub Issues Styling */\n.github-issues-container {\n    margin: 2rem "
  },
  {
    "path": "docs/source/_static/redirect.js",
    "chars": 423,
    "preview": "// Redirect visitors from RTD to docs.pathsim.org after a brief delay.\n// The banner is shown immediately; redirect fire"
  },
  {
    "path": "docs/source/api.rst",
    "chars": 2932,
    "preview": "\nAPI Reference\n=============\n\nCore Components\n---------------\n\nThe following modules form the core of PathSim's system d"
  },
  {
    "path": "docs/source/conf.py",
    "chars": 5519,
    "preview": "import os\nimport sys\n\nsys.path.insert(0, os.path.abspath(os.path.join('..', '..')))\n\n\nfrom pathsim import __version__ \n\n"
  },
  {
    "path": "docs/source/contributing.rst",
    "chars": 1481,
    "preview": ".. _ref-contributing:\n\nContributing\n============\nContributions to PathSim's development are very welcome! Here are some "
  },
  {
    "path": "docs/source/examples/abs_braking.ipynb",
    "chars": 475042,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"cell-0\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Anti-lock Brak"
  },
  {
    "path": "docs/source/examples/algebraic_loop.ipynb",
    "chars": 121044,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": \"# Algebraic Loop\\n\\nDemonstration of Path"
  },
  {
    "path": "docs/source/examples/billards.ipynb",
    "chars": 292240,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"6bcc6085-7b13-4882-b356-c58c117558a1\",\n   \"metadata\": {\n    \"edi"
  },
  {
    "path": "docs/source/examples/bouncing_ball.ipynb",
    "chars": 202129,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\":"
  },
  {
    "path": "docs/source/examples/bouncing_pendulum.ipynb",
    "chars": 92040,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Bouncing Pendulum\\n\",\n    \"\\n\",\n "
  },
  {
    "path": "docs/source/examples/cascade_controller.ipynb",
    "chars": 162654,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": \"# Cascade Controller\\n\\nDemonstration of "
  },
  {
    "path": "docs/source/examples/checkpoints.ipynb",
    "chars": 9149,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Checkpoints\\n\",\n    \"\\n\",\n    \"Pa"
  },
  {
    "path": "docs/source/examples/chemical_reactor.ipynb",
    "chars": 122065,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": \"# Chemical Reactor \\n\\nSimulation of a co"
  },
  {
    "path": "docs/source/examples/coupled_oscillators.ipynb",
    "chars": 213656,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"0\",\n   \"metadata\": {},\n   \"source\": \"# Coupled Oscillators\\n\\nSi"
  },
  {
    "path": "docs/source/examples/dcmotor_control.ipynb",
    "chars": 106596,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"cell-0\",\n   \"metadata\": {},\n   \"source\": [\n    \"# DC Motor Speed"
  },
  {
    "path": "docs/source/examples/delta_sigma_adc.ipynb",
    "chars": 228146,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": \"# Delta-Sigma ADC\\n\\nSimulation of a firs"
  },
  {
    "path": "docs/source/examples/diode_circuit.ipynb",
    "chars": 359392,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"editable\": true,\n    \"slideshow\": {\n     \"slide_type"
  },
  {
    "path": "docs/source/examples/elastic_pendulum.ipynb",
    "chars": 335412,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"bfdc651c-44f7-4a38-a8ba-e8fdfcd665fe\",\n   \"metadata\": {\n    \"edi"
  },
  {
    "path": "docs/source/examples/fmcw_radar.ipynb",
    "chars": 434847,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"0\",\n   \"metadata\": {},\n   \"source\": [\n    \"# FMCW Radar\\n\",\n    "
  },
  {
    "path": "docs/source/examples/fmu_cosimulation.ipynb",
    "chars": 226192,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"cell-0\",\n   \"metadata\": {\n    \"editable\": true,\n    \"slideshow\":"
  },
  {
    "path": "docs/source/examples/fmu_model_exchange_bouncing_ball.ipynb",
    "chars": 7292,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\":"
  },
  {
    "path": "docs/source/examples/fmu_model_exchange_vanderpol.ipynb",
    "chars": 8453,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\":"
  },
  {
    "path": "docs/source/examples/harmonic_oscillator.ipynb",
    "chars": 5849,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": \"# Harmonic Oscillator\\n\\nSimulation of a "
  },
  {
    "path": "docs/source/examples/kalman_filter.ipynb",
    "chars": 11530,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"0\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Kalman Filter\\n\",\n "
  },
  {
    "path": "docs/source/examples/linear_feedback.ipynb",
    "chars": 5802,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"0\",\n   \"metadata\": {},\n   \"source\": \"# Linear Feedback System\\n\\"
  },
  {
    "path": "docs/source/examples/lorenz_attractor.ipynb",
    "chars": 646905,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": \"# Lorenz Attractor \\n\\nSimulation of the "
  },
  {
    "path": "docs/source/examples/nested_subsystems.ipynb",
    "chars": 60180,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"editable\": true,\n    \"raw_mimetype\": \"text/restructuredte"
  },
  {
    "path": "docs/source/examples/noisy_amplifier.ipynb",
    "chars": 314042,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"cd5067cc-646d-4572-9ef7-d64e95ae3102\",\n   \"metadata\": {\n    \"edi"
  },
  {
    "path": "docs/source/examples/pendulum.ipynb",
    "chars": 6309,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"0\",\n   \"metadata\": {},\n   \"source\": \"# Pendulum\\n\\nSimulation of"
  },
  {
    "path": "docs/source/examples/pid_controller.ipynb",
    "chars": 57702,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": \"# PID Controller\\n\\nSimulation of a PID c"
  },
  {
    "path": "docs/source/examples/poincare_maps.ipynb",
    "chars": 433320,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"e5fd6834-1ba7-467d-83be-939b3b5d7e41\",\n   \"metadata\": {},\n   \"so"
  },
  {
    "path": "docs/source/examples/rf_network_oneport.ipynb",
    "chars": 9099,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"34829d58-0d57-4e51-a072-85ba31ddae69\",\n   \"metadata\": {\n    \"edi"
  },
  {
    "path": "docs/source/examples/sar_adc.ipynb",
    "chars": 153017,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"editable\": true,\n    \"slideshow\": {\n     \"slide_type"
  },
  {
    "path": "docs/source/examples/spectrum_analysis.ipynb",
    "chars": 170559,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Spectrum Analysis\\n\",\n    \"\\n\",\n "
  },
  {
    "path": "docs/source/examples/stick_slip.ipynb",
    "chars": 12324,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"0\",\n   \"metadata\": {},\n   \"source\": \"# Stick Slip\\n\\nSimulation "
  },
  {
    "path": "docs/source/examples/switched_bouncing_ball.ipynb",
    "chars": 66329,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Switched Bouncing Ball\\n\",\n    \"\\"
  },
  {
    "path": "docs/source/examples/thermostat.ipynb",
    "chars": 99663,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"0\",\n   \"metadata\": {},\n   \"source\": \"# Thermostat\\n\\nSimulation "
  },
  {
    "path": "docs/source/examples/transfer_function.ipynb",
    "chars": 59329,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Transfer Function\\n\",\n    \"\\n\",\n "
  },
  {
    "path": "docs/source/examples/vanderpol.ipynb",
    "chars": 42357,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"0\",\n   \"metadata\": {},\n   \"source\": \"# Van der Pol\\n\\nSimulation"
  },
  {
    "path": "docs/source/examples.rst",
    "chars": 9397,
    "preview": ".. _ref-examples:\n\nExamples\n========\n\nHere we show a range of examples utilizing `PathSim` to simulate different dynamic"
  },
  {
    "path": "docs/source/index.rst",
    "chars": 5475,
    "preview": ".. pathsim documentation master file\n\n========================================\nPathSim\n================================="
  },
  {
    "path": "docs/source/modules/pathsim.blocks._block.rst",
    "chars": 115,
    "preview": "Block Base\n==========\n\n.. automodule:: pathsim.blocks._block\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.adder.rst",
    "chars": 104,
    "preview": "Adder\n=====\n\n.. automodule:: pathsim.blocks.adder\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.amplifier.rst",
    "chars": 116,
    "preview": "Amplifier\n=========\n\n.. automodule:: pathsim.blocks.amplifier\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.comparator.rst",
    "chars": 119,
    "preview": "Comparator\n==========\n\n.. automodule:: pathsim.blocks.comparator\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.converters.rst",
    "chars": 119,
    "preview": "Converters\n==========\n\n.. automodule:: pathsim.blocks.converters\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.counter.rst",
    "chars": 110,
    "preview": "Counter\n=======\n\n.. automodule:: pathsim.blocks.counter\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.ctrl.rst",
    "chars": 107,
    "preview": "Control\n=======\n\n.. automodule:: pathsim.blocks.ctrl\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.delay.rst",
    "chars": 104,
    "preview": "Delay\n=====\n\n.. automodule:: pathsim.blocks.delay\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.differentiator.rst",
    "chars": 131,
    "preview": "Differentiator\n==============\n\n.. automodule:: pathsim.blocks.differentiator\n   :members:\n   :show-inheritance:\n   :undo"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.discrete.rst",
    "chars": 123,
    "preview": "Discrete-Time\n=============\n\n.. automodule:: pathsim.blocks.discrete\n   :members:\n   :show-inheritance:\n   :undoc-member"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.dynsys.rst",
    "chars": 127,
    "preview": "Dynamical System\n================\n\n.. automodule:: pathsim.blocks.dynsys\n   :members:\n   :show-inheritance:\n   :undoc-me"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.filters.rst",
    "chars": 110,
    "preview": "Filters\n=======\n\n.. automodule:: pathsim.blocks.filters\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.fmu.rst",
    "chars": 98,
    "preview": "FMU\n===\n\n.. automodule:: pathsim.blocks.fmu\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.function.rst",
    "chars": 113,
    "preview": "Function\n========\n\n.. automodule:: pathsim.blocks.function\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.integrator.rst",
    "chars": 119,
    "preview": "Integrator\n==========\n\n.. automodule:: pathsim.blocks.integrator\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.kalman.rst",
    "chars": 121,
    "preview": "Kalman Filter\n=============\n\n.. automodule:: pathsim.blocks.kalman\n   :members:\n   :show-inheritance:\n   :undoc-members:"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.lti.rst",
    "chars": 98,
    "preview": "LTI\n===\n\n.. automodule:: pathsim.blocks.lti\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.math.rst",
    "chars": 101,
    "preview": "Math\n====\n\n.. automodule:: pathsim.blocks.math\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.multiplier.rst",
    "chars": 119,
    "preview": "Multiplier\n==========\n\n.. automodule:: pathsim.blocks.multiplier\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.noise.rst",
    "chars": 104,
    "preview": "Noise\n=====\n\n.. automodule:: pathsim.blocks.noise\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.ode.rst",
    "chars": 98,
    "preview": "ODE\n===\n\n.. automodule:: pathsim.blocks.ode\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.relay.rst",
    "chars": 104,
    "preview": "Relay\n=====\n\n.. automodule:: pathsim.blocks.relay\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.rf.rst",
    "chars": 95,
    "preview": "RF\n==\n\n.. automodule:: pathsim.blocks.rf\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.rng.rst",
    "chars": 98,
    "preview": "RNG\n===\n\n.. automodule:: pathsim.blocks.rng\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.rst",
    "chars": 6864,
    "preview": "Block Library\n=============\n\nPathSim provides a comprehensive library of simulation blocks for building complex dynamica"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.scope.rst",
    "chars": 104,
    "preview": "Scope\n=====\n\n.. automodule:: pathsim.blocks.scope\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.sources.rst",
    "chars": 110,
    "preview": "Sources\n=======\n\n.. automodule:: pathsim.blocks.sources\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.spectrum.rst",
    "chars": 113,
    "preview": "Spectrum\n========\n\n.. automodule:: pathsim.blocks.spectrum\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.switch.rst",
    "chars": 107,
    "preview": "Switch\n======\n\n.. automodule:: pathsim.blocks.switch\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.table.rst",
    "chars": 104,
    "preview": "Table\n=====\n\n.. automodule:: pathsim.blocks.table\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.blocks.wrapper.rst",
    "chars": 110,
    "preview": "Wrapper\n=======\n\n.. automodule:: pathsim.blocks.wrapper\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.connection.rst",
    "chars": 112,
    "preview": "Connection\n==========\n\n.. automodule:: pathsim.connection\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.events._event.rst",
    "chars": 115,
    "preview": "Event Base\n==========\n\n.. automodule:: pathsim.events._event\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.events.condition.rst",
    "chars": 130,
    "preview": "Condition Events\n================\n\n.. automodule:: pathsim.events.condition\n   :members:\n   :show-inheritance:\n   :undoc"
  },
  {
    "path": "docs/source/modules/pathsim.events.rst",
    "chars": 1108,
    "preview": "Event Library\n=============\n\nPathSim's event system enables detection and handling of discrete events in hybrid dynamica"
  },
  {
    "path": "docs/source/modules/pathsim.events.schedule.rst",
    "chars": 129,
    "preview": "Scheduled Events\n================\n\n.. automodule:: pathsim.events.schedule\n   :members:\n   :show-inheritance:\n   :undoc-"
  },
  {
    "path": "docs/source/modules/pathsim.events.zerocrossing.rst",
    "chars": 141,
    "preview": "Zero-Crossing Events\n====================\n\n.. automodule:: pathsim.events.zerocrossing\n   :members:\n   :show-inheritance"
  },
  {
    "path": "docs/source/modules/pathsim.optim.anderson.rst",
    "chars": 138,
    "preview": "Anderson Acceleration\n=====================\n\n.. automodule:: pathsim.optim.anderson\n   :members:\n   :show-inheritance:\n "
  },
  {
    "path": "docs/source/modules/pathsim.optim.booster.rst",
    "chars": 131,
    "preview": "Connection Booster\n==================\n\n.. automodule:: pathsim.optim.booster\n   :members:\n   :show-inheritance:\n   :undo"
  },
  {
    "path": "docs/source/modules/pathsim.optim.numerical.rst",
    "chars": 147,
    "preview": "Numerical Differentiation\n=========================\n\n.. automodule:: pathsim.optim.numerical\n   :members:\n   :show-inher"
  },
  {
    "path": "docs/source/modules/pathsim.optim.operator.rst",
    "chars": 112,
    "preview": "Operator\n========\n\n.. automodule:: pathsim.optim.operator\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.optim.rst",
    "chars": 1096,
    "preview": "Optimization Module\n===================\n\nNumerical optimization and nonlinear solving capabilities for algebraic loops a"
  },
  {
    "path": "docs/source/modules/pathsim.simulation.rst",
    "chars": 112,
    "preview": "Simulation\n==========\n\n.. automodule:: pathsim.simulation\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.solvers._rungekutta.rst",
    "chars": 133,
    "preview": "Runge-Kutta Base\n================\n\n.. automodule:: pathsim.solvers._rungekutta\n   :members:\n   :show-inheritance:\n   :un"
  },
  {
    "path": "docs/source/modules/pathsim.solvers._solver.rst",
    "chars": 119,
    "preview": "Solver Base\n===========\n\n.. automodule:: pathsim.solvers._solver\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.bdf.rst",
    "chars": 99,
    "preview": "BDF\n===\n\n.. automodule:: pathsim.solvers.bdf\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.dirk2.rst",
    "chars": 105,
    "preview": "DIRK2\n=====\n\n.. automodule:: pathsim.solvers.dirk2\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.dirk3.rst",
    "chars": 105,
    "preview": "DIRK3\n=====\n\n.. automodule:: pathsim.solvers.dirk3\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.esdirk32.rst",
    "chars": 114,
    "preview": "ESDIRK32\n========\n\n.. automodule:: pathsim.solvers.esdirk32\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.esdirk4.rst",
    "chars": 111,
    "preview": "ESDIRK4\n=======\n\n.. automodule:: pathsim.solvers.esdirk4\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.esdirk43.rst",
    "chars": 114,
    "preview": "ESDIRK43\n========\n\n.. automodule:: pathsim.solvers.esdirk43\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.esdirk54.rst",
    "chars": 114,
    "preview": "ESDIRK54\n========\n\n.. automodule:: pathsim.solvers.esdirk54\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.esdirk85.rst",
    "chars": 114,
    "preview": "ESDIRK85\n========\n\n.. automodule:: pathsim.solvers.esdirk85\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.euler.rst",
    "chars": 105,
    "preview": "Euler\n=====\n\n.. automodule:: pathsim.solvers.euler\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.gear.rst",
    "chars": 102,
    "preview": "Gear\n====\n\n.. automodule:: pathsim.solvers.gear\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.rk4.rst",
    "chars": 99,
    "preview": "RK4\n===\n\n.. automodule:: pathsim.solvers.rk4\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.rkbs32.rst",
    "chars": 146,
    "preview": "RKBS32 (Bogacki-Shampine)\n=========================\n\n.. automodule:: pathsim.solvers.rkbs32\n   :members:\n   :show-inheri"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.rkck54.rst",
    "chars": 132,
    "preview": "RKCK54 (Cash-Karp)\n==================\n\n.. automodule:: pathsim.solvers.rkck54\n   :members:\n   :show-inheritance:\n   :und"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.rkdp54.rst",
    "chars": 142,
    "preview": "RKDP54 (Dormand-Prince)\n=======================\n\n.. automodule:: pathsim.solvers.rkdp54\n   :members:\n   :show-inheritanc"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.rkdp87.rst",
    "chars": 142,
    "preview": "RKDP87 (Dormand-Prince)\n=======================\n\n.. automodule:: pathsim.solvers.rkdp87\n   :members:\n   :show-inheritanc"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.rkf21.rst",
    "chars": 127,
    "preview": "RKF21 (Fehlberg)\n================\n\n.. automodule:: pathsim.solvers.rkf21\n   :members:\n   :show-inheritance:\n   :undoc-me"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.rkf45.rst",
    "chars": 127,
    "preview": "RKF45 (Fehlberg)\n================\n\n.. automodule:: pathsim.solvers.rkf45\n   :members:\n   :show-inheritance:\n   :undoc-me"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.rkf78.rst",
    "chars": 127,
    "preview": "RKF78 (Fehlberg)\n================\n\n.. automodule:: pathsim.solvers.rkf78\n   :members:\n   :show-inheritance:\n   :undoc-me"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.rkv65.rst",
    "chars": 123,
    "preview": "RKV65 (Verner)\n==============\n\n.. automodule:: pathsim.solvers.rkv65\n   :members:\n   :show-inheritance:\n   :undoc-member"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.rst",
    "chars": 5709,
    "preview": "Solver Library\n==============\n\nPathSim provides a comprehensive suite of numerical integrators for solving ordinary diff"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.ssprk22.rst",
    "chars": 111,
    "preview": "SSPRK22\n=======\n\n.. automodule:: pathsim.solvers.ssprk22\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.ssprk33.rst",
    "chars": 111,
    "preview": "SSPRK33\n=======\n\n.. automodule:: pathsim.solvers.ssprk33\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.ssprk34.rst",
    "chars": 111,
    "preview": "SSPRK34\n=======\n\n.. automodule:: pathsim.solvers.ssprk34\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.solvers.steadystate.rst",
    "chars": 125,
    "preview": "Steady State\n============\n\n.. automodule:: pathsim.solvers.steadystate\n   :members:\n   :show-inheritance:\n   :undoc-memb"
  },
  {
    "path": "docs/source/modules/pathsim.subsystem.rst",
    "chars": 109,
    "preview": "Subsystem\n=========\n\n.. automodule:: pathsim.subsystem\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.utils.adaptivebuffer.rst",
    "chars": 132,
    "preview": "Adaptive Buffer\n===============\n\n.. automodule:: pathsim.utils.adaptivebuffer\n   :members:\n   :show-inheritance:\n   :und"
  },
  {
    "path": "docs/source/modules/pathsim.utils.analysis.rst",
    "chars": 112,
    "preview": "Analysis\n========\n\n.. automodule:: pathsim.utils.analysis\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.utils.gilbert.rst",
    "chars": 133,
    "preview": "Gilbert Realization\n===================\n\n.. automodule:: pathsim.utils.gilbert\n   :members:\n   :show-inheritance:\n   :un"
  },
  {
    "path": "docs/source/modules/pathsim.utils.logger.rst",
    "chars": 106,
    "preview": "Logger\n======\n\n.. automodule:: pathsim.utils.logger\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.utils.portreference.rst",
    "chars": 131,
    "preview": "Port Reference\n==============\n\n.. automodule:: pathsim.utils.portreference\n   :members:\n   :show-inheritance:\n   :undoc-"
  },
  {
    "path": "docs/source/modules/pathsim.utils.progresstracker.rst",
    "chars": 135,
    "preview": "Progress Tracker\n================\n\n.. automodule:: pathsim.utils.progresstracker\n   :members:\n   :show-inheritance:\n   :"
  },
  {
    "path": "docs/source/modules/pathsim.utils.realtimeplotter.rst",
    "chars": 137,
    "preview": "Real-time Plotter\n=================\n\n.. automodule:: pathsim.utils.realtimeplotter\n   :members:\n   :show-inheritance:\n  "
  },
  {
    "path": "docs/source/modules/pathsim.utils.register.rst",
    "chars": 112,
    "preview": "Register\n========\n\n.. automodule:: pathsim.utils.register\n   :members:\n   :show-inheritance:\n   :undoc-members:\n"
  },
  {
    "path": "docs/source/modules/pathsim.utils.rst",
    "chars": 1843,
    "preview": "Utility Functions\n=================\n\nHelper tools and utility classes for analysis, visualization, and system management"
  },
  {
    "path": "docs/source/pathsim_docs.mplstyle",
    "chars": 1537,
    "preview": "# PathSim documentation matplotlib style\n# Optimized for light/dark mode compatibility with transparent backgrounds\n\n# F"
  },
  {
    "path": "docs/source/quickstart.ipynb",
    "chars": 3800,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"raw\",\n   \"metadata\": {\n    \"raw_mimetype\": \"text/restructuredtext\"\n   },\n   \"source\":"
  },
  {
    "path": "docs/source/roadmap.rst",
    "chars": 291,
    "preview": ".. _ref-roadmap:\n\nRoadmap\n=======\n\nPathSim's development, features, bugfixes and enhancements are all tracked through `G"
  },
  {
    "path": "docs/source/roadmap_generated.rst",
    "chars": 11771,
    "preview": ".. raw:: html\n\n   <div class='github-issues-container'>\n   <p class='issues-updated'>Last updated: 2025-11-20 23:01 UTC<"
  },
  {
    "path": "examples/example_abs_braking.py",
    "chars": 5180,
    "preview": "#########################################################################################\n##\n##                      Pat"
  },
  {
    "path": "examples/example_adc.py",
    "chars": 1614,
    "preview": "#########################################################################################\n##\n##                         "
  },
  {
    "path": "examples/example_algebraicchain.py",
    "chars": 1450,
    "preview": "#########################################################################################\n##\n##                 PathSim "
  },
  {
    "path": "examples/example_algebraicloop.py",
    "chars": 1423,
    "preview": "#########################################################################################\n##\n##                         "
  },
  {
    "path": "examples/example_cascade.py",
    "chars": 2551,
    "preview": "#########################################################################################\n##\n##                         "
  },
  {
    "path": "examples/example_dcmotor.py",
    "chars": 3801,
    "preview": "#########################################################################################\n##\n##                         "
  },
  {
    "path": "examples/example_deltasigma.py",
    "chars": 1918,
    "preview": "#########################################################################################\n##\n##                         "
  },
  {
    "path": "examples/example_derivative.py",
    "chars": 1791,
    "preview": "#########################################################################################\n##\n##                    PathS"
  },
  {
    "path": "examples/example_diode.py",
    "chars": 2399,
    "preview": "#########################################################################################\n##\n##                        P"
  },
  {
    "path": "examples/example_dualslope.py",
    "chars": 2205,
    "preview": "#########################################################################################\n##\n##                         "
  },
  {
    "path": "examples/example_elastic_pendulum.py",
    "chars": 3076,
    "preview": "#########################################################################################\n##\n##                PathSim e"
  },
  {
    "path": "examples/example_feedback.py",
    "chars": 1401,
    "preview": "#########################################################################################\n##\n##                    PathS"
  },
  {
    "path": "examples/example_filters.py",
    "chars": 1423,
    "preview": "#########################################################################################\n##\n##                    PathS"
  },
  {
    "path": "examples/example_harmonic_oscillator.py",
    "chars": 1714,
    "preview": "#########################################################################################\n##\n##                   PathSi"
  },
  {
    "path": "examples/example_kalman_filter.py",
    "chars": 3779,
    "preview": "#########################################################################################\n##\n##                    PathS"
  },
  {
    "path": "examples/example_nested_subsystems.py",
    "chars": 2587,
    "preview": "#########################################################################################\n##\n##                         "
  },
  {
    "path": "examples/example_noise.py",
    "chars": 2127,
    "preview": "#########################################################################################\n##\n##               PathSim Ex"
  },
  {
    "path": "examples/example_pendulum.py",
    "chars": 1998,
    "preview": "#########################################################################################\n##\n##                         "
  },
  {
    "path": "examples/example_phasenoise.py",
    "chars": 1626,
    "preview": "#########################################################################################\n##\n##                PathSim E"
  },
  {
    "path": "examples/example_pid.py",
    "chars": 1490,
    "preview": "#########################################################################################\n##\n##                         "
  },
  {
    "path": "examples/example_pid_antiwindup.py",
    "chars": 1740,
    "preview": "#########################################################################################\n##\n##                         "
  },
  {
    "path": "examples/example_pid_vs_discretePID.py",
    "chars": 3364,
    "preview": "#########################################################################################\n##\n##                PathSim E"
  },
  {
    "path": "examples/example_radar.py",
    "chars": 2127,
    "preview": "#########################################################################################\n##\n##                   PathSi"
  },
  {
    "path": "examples/example_reactor.py",
    "chars": 2738,
    "preview": "#########################################################################################\n##\n##                         "
  },
  {
    "path": "examples/example_sar.py",
    "chars": 3287,
    "preview": "#########################################################################################\n##\n##                         "
  },
  {
    "path": "examples/example_solar.py",
    "chars": 6223,
    "preview": "#########################################################################################\n##\n##                  PathSim"
  },
  {
    "path": "examples/example_solver_hotswap.py",
    "chars": 1780,
    "preview": "#########################################################################################\n##\n##              PathSim Van"
  },
  {
    "path": "examples/example_spectrum.py",
    "chars": 2561,
    "preview": "#########################################################################################\n##\n##                     Path"
  },
  {
    "path": "examples/example_spectrum_rf_oneport.py",
    "chars": 2482,
    "preview": "#########################################################################################\n##\n##                     Path"
  },
  {
    "path": "examples/example_steadystate.py",
    "chars": 1592,
    "preview": "#########################################################################################\n##\n##           example of a s"
  },
  {
    "path": "examples/example_stickslip.py",
    "chars": 2029,
    "preview": "#########################################################################################\n##\n##                   PathSi"
  },
  {
    "path": "examples/example_transferfunction.py",
    "chars": 1454,
    "preview": "#########################################################################################\n##\n##                        P"
  },
  {
    "path": "examples/example_vanderpol_subsystem.py",
    "chars": 2035,
    "preview": "#########################################################################################\n##\n##                         "
  },
  {
    "path": "examples/examples_event/example_billards_sphere.py",
    "chars": 1844,
    "preview": "#########################################################################################\n##\n##                PathSim E"
  },
  {
    "path": "examples/examples_event/example_bouncing_pendulum.py",
    "chars": 2219,
    "preview": "#########################################################################################\n##\n##                       Pa"
  },
  {
    "path": "examples/examples_event/example_bouncingball.py",
    "chars": 2562,
    "preview": "#########################################################################################\n##\n##                    PathS"
  },
  {
    "path": "examples/examples_event/example_bouncingball_friction.py",
    "chars": 2838,
    "preview": "#########################################################################################\n##\n##                    PathS"
  },
  {
    "path": "examples/examples_event/example_bouncingball_switched.py",
    "chars": 2843,
    "preview": "#########################################################################################\n##\n##                    PathS"
  },
  {
    "path": "examples/examples_event/example_integrator_reset.py",
    "chars": 1536,
    "preview": "#########################################################################################\n##\n##                         "
  },
  {
    "path": "examples/examples_event/example_pulse.py",
    "chars": 1687,
    "preview": "#########################################################################################\n##\n##        PathSim example f"
  },
  {
    "path": "examples/examples_event/example_stickslip_event.py",
    "chars": 4255,
    "preview": "#########################################################################################\n##\n##            PathSim examp"
  },
  {
    "path": "examples/examples_event/example_thermostat.py",
    "chars": 2256,
    "preview": "#########################################################################################\n##\n##                  PathSim"
  },
  {
    "path": "examples/examples_event/example_volterralotka_event.py",
    "chars": 2406,
    "preview": "#########################################################################################\n##\n##                     Path"
  },
  {
    "path": "examples/examples_odes/example_bonhoeffer_vanderpol.py",
    "chars": 1498,
    "preview": "#########################################################################################\n##\n##      Pathsim Example of "
  },
  {
    "path": "examples/examples_odes/example_brusselator.py",
    "chars": 1347,
    "preview": "#########################################################################################\n##\n##                         "
  },
  {
    "path": "examples/examples_odes/example_chemical.py",
    "chars": 1369,
    "preview": "#########################################################################################\n##\n##     Example of Chemical "
  },
  {
    "path": "examples/examples_odes/example_duffing.py",
    "chars": 2079,
    "preview": "#########################################################################################\n##\n##                   PathSi"
  },
  {
    "path": "examples/examples_odes/example_fairen_velarde.py",
    "chars": 1438,
    "preview": "#########################################################################################\n##\n##           PathSim Exampl"
  },
  {
    "path": "examples/examples_odes/example_fitzhughnagumo.py",
    "chars": 1679,
    "preview": "#########################################################################################\n##\n##                     Path"
  },
  {
    "path": "examples/examples_odes/example_flame.py",
    "chars": 1358,
    "preview": "#########################################################################################\n##\n##                        P"
  },
  {
    "path": "examples/examples_odes/example_glycolysis.py",
    "chars": 1336,
    "preview": "#########################################################################################\n##\n##                      Pat"
  },
  {
    "path": "examples/examples_odes/example_lorenz.py",
    "chars": 3222,
    "preview": "#########################################################################################\n##\n##                         "
  },
  {
    "path": "examples/examples_odes/example_morse.py",
    "chars": 1496,
    "preview": "#########################################################################################\n##\n##                         "
  },
  {
    "path": "examples/examples_odes/example_robertson.py",
    "chars": 1554,
    "preview": "#########################################################################################\n##\n##                        P"
  },
  {
    "path": "examples/examples_odes/example_roessler.py",
    "chars": 2895,
    "preview": "#########################################################################################\n##\n##                     Path"
  },
  {
    "path": "examples/examples_odes/example_thomas_cyclic.py",
    "chars": 1371,
    "preview": "#########################################################################################\n##\n##              PathSim Exa"
  },
  {
    "path": "examples/examples_odes/example_vanderpol.py",
    "chars": 1691,
    "preview": "#########################################################################################\n##\n##                        P"
  },
  {
    "path": "examples/examples_odes/example_volterralotka.py",
    "chars": 1932,
    "preview": "#########################################################################################\n##\n##                     Path"
  },
  {
    "path": "git",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "pyproject.toml",
    "chars": 1160,
    "preview": "[build-system]\nrequires = [\"setuptools\", \"wheel\", \"setuptools-scm[toml] >= 7.0.5\"]\nbuild-backend = \"setuptools.build_met"
  },
  {
    "path": "src/pathsim/__init__.py",
    "chars": 331,
    "preview": "from importlib import metadata\n\ntry:\n    __version__ = metadata.version(\"pathsim\")\nexcept Exception:\n    __version__ = \""
  },
  {
    "path": "src/pathsim/_constants.py",
    "chars": 2502,
    "preview": "##################################################################################\n##\n##                  GLOBAL CONSTAN"
  }
]

// ... and 213 more files (download for full content)

About this extraction

This page contains the full source code of the milanofthe/pathsim GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 413 files (6.9 MB), approximately 1.8M tokens, and a symbol index with 2359 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!