From e69e3b0d87803e4ff6b992dc640823e2b20c56cc Mon Sep 17 00:00:00 2001 From: Milan Rother Date: Wed, 28 Jan 2026 15:54:52 +0100 Subject: [PATCH 1/4] update logos with new brand colors --- docs/source/logos/pathsim_icon.png | Bin 14730 -> 18548 bytes docs/source/logos/pathsim_logo.png | Bin 19684 -> 19877 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/source/logos/pathsim_icon.png b/docs/source/logos/pathsim_icon.png index 2c39d27945470607caf31b2db24c81c415ad248a..c786aa0805466071025133c8ddd3ca633146f27c 100644 GIT binary patch literal 18548 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 diff --git a/docs/source/logos/pathsim_logo.png b/docs/source/logos/pathsim_logo.png index 8ee02f135c97731a89eef55e3f1f04425152b143..64528d72c40fec18310da2af3e6c962fe98a9a1a 100644 GIT binary patch literal 19877 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 Date: Thu, 29 Jan 2026 11:24:11 +0100 Subject: [PATCH 2/4] Add migration banner to legacy RTD docs --- docs/source/index.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/source/index.rst b/docs/source/index.rst index 993ec87b..129aa25c 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -6,6 +6,16 @@ PathSim .. raw:: html + +

A scalable block-based time-domain system simulation framework in Python with hierarchical modeling and event handling! From 5d249cb9f70cfe2c9f2989affe89e298991a7b62 Mon Sep 17 00:00:00 2001 From: Milan Rother Date: Thu, 29 Jan 2026 11:38:59 +0100 Subject: [PATCH 3/4] Redesign README for new docs and homepage --- README.md | 353 ++++++++++++------------------------------------------ 1 file changed, 76 insertions(+), 277 deletions(-) diff --git a/README.md b/README.md index a67764b9..0c25ee5f 100644 --- a/README.md +++ b/README.md @@ -1,313 +1,112 @@ - -

PathSim Logo

------------- - - -# PathSim - A System Simulation Framework -[![DOI](https://joss.theoj.org/papers/10.21105/joss.08158/status.svg)](https://doi.org/10.21105/joss.08158) -[![PySimHub](https://pysimhub.io/badge.svg)](https://pysimhub.io/projects/pathsim) -![GitHub License](https://img.shields.io/github/license/pathsim/pathsim) -![GitHub Release](https://img.shields.io/github/v/release/pathsim/pathsim) -[![Documentation Status](https://readthedocs.org/projects/pathsim/badge/?version=latest)](https://pathsim.readthedocs.io/en/latest/?badge=latest) -![PyPI - Downloads](https://img.shields.io/pypi/dw/pathsim) -[![codecov](https://codecov.io/gh/pathsim/pathsim/branch/master/graph/badge.svg)](https://codecov.io/gh/pathsim/pathsim) - - -## Overview - -**PathSim** is a flexible block-based time-domain system simulation framework in Python! It provides a variety of classes that enable modeling and simulation of complex interconnected dynamical systems through Python scripting in the block diagram paradigm. - -All of that with minimal dependencies, only `numpy`, `scipy` and `matplotlib`! - -Key Features: - -- **Dynamic system modification** at simulation runtime, i.e. triggered through events -- Automatic block- and system-level **linearization** at runtime -- Wide range of **numerical integrators** (implicit, explicit, high order, adaptive), able to handle [stiff systems](#stiff-systems) -- **Modular and hierarchical** modeling with (nested) subsystems -- [Event handling](#event-detection) system to detect and resolve **discrete events** (zero-crossing detection) -- **Extensibility** by subclassing the base `Block` class and implementing just a handful of methods - - -For the full **documentation**, tutorials and API-reference visit [Read the Docs](https://pathsim.readthedocs.io/en/latest/)! - -The source code can be found in the [GitHub repository](https://github.com/pathsim/pathsim) and is fully open source under **MIT license**. Consider starring PathSim to support its development. - +

+ A block-based time-domain system simulation framework in Python +

-## Contributing and Future +

+ DOI + PySimHub + PyPI + Conda + License + Release + Downloads + Coverage +

-If you want to contribute to **PathSim**s development, check out the [community guidelines](https://pathsim.readthedocs.io/en/latest/contributing.html). If you are curious about what the future holds for **PathSim**, check out the [roadmap](https://pathsim.readthedocs.io/en/latest/roadmap.html)! +

+ Homepage • + Documentation • + PathView Editor • + Sponsor +

+--- -## Graphical Interface +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. -As of Jan 2026, after a massive rewrite, [PathView](https://github.com/pathsim/pathview) is now the official graphical user interface for PathSim. +Minimal dependencies: just `numpy`, `scipy`, and `matplotlib`. +## Features -## Installation +- **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 -The latest release version of PathSim is available on [PyPi](https://pypi.org/project/pathsim/) and installable via pip: +## Install -```console +```bash pip install pathsim ``` -Additionally, PathSim is available on [conda-forge](https://anaconda.org/channels/conda-forge/packages/pathsim/overview) and installable via conda: +or with conda: -```console +```bash conda install conda-forge::pathsim ``` - -## Example - Harmonic Oscillator - -There are lots of [examples](https://github.com/pathsim/pathsim/tree/master/examples) of dynamical system simulations in the GitHub repository that showcase PathSim's capabilities. - -But first, lets have a look at how we can simulate the harmonic oscillator (a spring mass damper 2nd order system) using PathSim. The system and its corresponding equivalent block diagram are shown in the figure below: - - -![png](https://raw.githubusercontent.com/pathsim/pathsim/master/docs/source/examples/figures/figures_g/harmonic_oscillator_g.png) - - -The equation of motion that defines the harmonic oscillator it is give by - -$$ -\ddot{x} + \frac{c}{m} \dot{x} + \frac{k}{m} x = 0 -$$ - -where $c$ is the damping, $k$ the spring constant and $m$ the mass together with the initial conditions $x_0$ and $v_0$ for position and velocity. - -The topology of the block diagram above can be directly defined as blocks and connections in the PathSim framework. First we initialize the blocks needed to represent the dynamical systems with their respective arguments such as initial conditions and gain values, then the blocks are connected using `Connection` objects, forming two feedback loops. - -The `Simulation` instance manages the blocks and connections and advances the system in time with the timestep (`dt`). The `log` flag for logging the simulation progress is also set. Finally, we run the simulation for some number of seconds and plot the results using the `plot()` method of the scope block. - +## Quick Example ```python from pathsim import Simulation, Connection - -# import the blocks we need for the harmonic oscillator from pathsim.blocks import Integrator, Amplifier, Adder, Scope -# initial position and velocity -x0, v0 = 2, 5 - -# parameters (mass, damping, spring constant) -m, c, k = 0.8, 0.2, 1.5 - -# define the blocks -I1 = Integrator(v0) # integrator for velocity -I2 = Integrator(x0) # integrator for position -A1 = Amplifier(-c/m) -A2 = Amplifier(-k/m) -P1 = Adder() -Sc = Scope(labels=["v(t)", "x(t)"]) - -blocks = [I1, I2, A1, A2, P1, Sc] - -# define the connections between the blocks -connections = [ - Connection(I1, I2, A1, Sc), # one to many connection - Connection(I2, A2, Sc[1]), - Connection(A1, P1), # default connection to port 0 - Connection(A2, P1[1]), # specific connection to port 1 - Connection(P1, I1), - ] - -# create a simulation instance from the blocks and connections -Sim = Simulation(blocks, connections, dt=0.05) - -# run the simulation for 30 seconds -Sim.run(duration=30.0) - -# plot the results directly from the scope -Sc.plot() - -# read the results from the scope for further processing -time, data = Sc.read() +# 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() ``` -![png](https://raw.githubusercontent.com/pathsim/pathsim/master/docs/source/examples/figures/figures_g/harmonic_oscillator_result_g.png) - - -## Stiff Systems - -PathSim implements a large variety of implicit integrators such as diagonally implicit runge-kutta (`DIRK2`, `ESDIRK43`, etc.) and multistep (`BDF2`, `GEAR52A`, etc.) methods. This enables the simulation of very stiff systems where the timestep is limited by stability and not accuracy of the method. - -A common example for a stiff system is the Van der Pol oscillator where the parameter $\mu$ "controls" the severity of the stiffness. It is defined by the following second order ODE: - -$$ -\ddot{x} + \mu (1 - x^2) \dot{x} + x = 0 -$$ - -The Van der Pol ODE can be translated into a block diagram like the one below, where the two states are handled by two distinct integrators. - - -![png](https://raw.githubusercontent.com/pathsim/pathsim/master/docs/source/examples/figures/figures_g/vanderpol_blockdiagram_g.png) - +## PathView -Lets translate it to PathSim using two `Integrator` blocks and a `Function` block. The parameter is set to $\mu = 1000$ which means severe stiffness. - - -```python -from pathsim import Simulation, Connection -from pathsim.blocks import Integrator, Scope, Function - -# implicit adaptive timestep solver -from pathsim.solvers import ESDIRK54 - -# initial conditions -x1, x2 = 2, 0 - -# van der Pol parameter (1000 is very stiff) -mu = 1000 - -# blocks that define the system -Sc = Scope(labels=["$x_1(t)$"]) -I1 = Integrator(x1) -I2 = Integrator(x2) -Fn = Function(lambda x1, x2: mu*(1 - x1**2)*x2 - x1) - -blocks = [I1, I2, Fn, Sc] - -# the connections between the blocks -connections = [ - Connection(I2, I1, Fn[1]), - Connection(I1, Fn, Sc), - Connection(Fn, I2) - ] - -# initialize simulation with the blocks, connections, timestep and logging enabled -Sim = Simulation( - blocks, - connections, - dt=0.05, - Solver=ESDIRK54, - tolerance_lte_abs=1e-5, - tolerance_lte_rel=1e-3, - ) - -# run simulation for some number of seconds -Sim.run(3*mu) - -# plot the results directly (steps highlighted) -Sc.plot(".-") -``` - -![png](https://raw.githubusercontent.com/pathsim/pathsim/master/docs/source/examples/figures/figures_g/vanderpol_result_g.png) - - -## Event Detection - -PathSim has an event handling system that monitors the simulation state and can find and locate discrete events by evaluating an event function and trigger callbacks or state transformations. Multiple event types are supported such as `ZeroCrossing` or `Schedule`. - -This enables the simulation of hybrid continuous time systems with discrete events. - - -![png](https://raw.githubusercontent.com/pathsim/pathsim/master/docs/source/examples/figures/figures_g/bouncing_ball_g.png) - - -Probably the most popular example for this is the bouncing ball (see figure above) where discrete events occur whenever the ball touches the floor. The event in this case is a zero-crossing. - -The dynamics of this system can be translated into a block diagramm in the following way: - - -![png](https://raw.githubusercontent.com/pathsim/pathsim/master/docs/source/examples/figures/figures_g/bouncing_ball_blockdiagram_g.png) - - -And built and simulated with `PathSim` like this: - -```python -from pathsim import Simulation, Connection -from pathsim.blocks import Integrator, Constant, Scope -from pathsim.solvers import RKBS32 - -# event library -from pathsim.events import ZeroCrossing - -# initial values -x0, v0 = 1, 10 - -# blocks that define the system -Ix = Integrator(x0) # v -> x -Iv = Integrator(v0) # a -> v -Cn = Constant(-9.81) # gravitational acceleration -Sc = Scope(labels=["x", "v"]) - -blocks = [Ix, Iv, Cn, Sc] - -# the connections between the blocks -connections = [ - Connection(Cn, Iv), - Connection(Iv, Ix), - Connection(Ix, Sc) - ] - -# event function for zero crossing detection -def func_evt(t): - i, o, s = Ix() # get block inputs, outputs and states - return s - -# action function for state transformation -def func_act(t): - i1, o1, s1 = Ix() - i2, o2, s2 = Iv() - Ix.engine.set(abs(s1)) - Iv.engine.set(-0.9*s2) - -# event (zero-crossing) -> ball makes contact -E1 = ZeroCrossing( - func_evt=func_evt, - func_act=func_act, - tolerance=1e-4, - ) - -events = [E1] - -# initialize simulation with the blocks, connections, timestep -Sim = Simulation( - blocks, - connections, - events, - dt=0.1, - Solver=RKBS32, - dt_max=0.1, - ) - -# run the simulation -Sim.run(20) - -# plot the recordings from the scope -Sc.plot() -``` - -![png](https://raw.githubusercontent.com/pathsim/pathsim/master/docs/source/examples/figures/figures_g/bouncing_ball_result_g.png) - -During the event handling, the simulator approaches the event until the specified tolerance is met. You can see this by analyzing the timesteps taken by the adaptive integrator `RKBS32`. - - -```python -import numpy as np -import matplotlib.pyplot as plt +[PathView](https://view.pathsim.org) is the graphical editor for PathSim — design systems visually and export to Python. -fig, ax = plt.subplots(figsize=(8,4), tight_layout=True, dpi=120) +## Learn More -time, _ = Sc.read() +- [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 -# add detected events -for t in E1: ax.axvline(t, ls="--", c="k") +## Citation -# plot the timesteps -ax.plot(time[:-1], np.diff(time)) +If you use PathSim in research, please cite: -ax.set_yscale("log") -ax.set_ylabel("dt [s]") -ax.set_xlabel("time [s]") -ax.grid(True) +```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 -![png](https://raw.githubusercontent.com/pathsim/pathsim/master/docs/source/examples/figures/figures_g/bouncing_ball_result_timesteps_g.png) +MIT From 5d2c5e24c31e6e225e59062e6ddad3f7628e7428 Mon Sep 17 00:00:00 2001 From: Milan Rother Date: Tue, 10 Feb 2026 13:49:54 +0100 Subject: [PATCH 4/4] Add get_params() method to Block base class --- src/pathsim/blocks/_block.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/pathsim/blocks/_block.py b/src/pathsim/blocks/_block.py index c291cae8..947d113a 100644 --- a/src/pathsim/blocks/_block.py +++ b/src/pathsim/blocks/_block.py @@ -261,6 +261,26 @@ def info(cls): } + def get_params(self): + """Return constructor parameters as a dict with actual instance values. + + Inspects the ``__init__`` signature and retrieves the corresponding + attributes from the instance, skipping ``self``, ``name``, ``*args`` + and ``**kwargs``. + + Returns + ------- + params : dict + mapping of parameter names to their current values + """ + sig = inspect.signature(self.__init__) + return { + name: getattr(self, name) + for name, param in sig.parameters.items() + if name not in ("self", "kwargs", "args", "name") and hasattr(self, name) + } + + # methods for visualization --------------------------------------------------------- def plot(self, *args, **kwargs):