mappy-ds
Poincaré maps, periodic points and bifurcations of hybrid (smooth / non-smooth) dynamical systems.
mappy_ds implements the mode concept: a dynamical system is split into smooth
primitive pieces — modes — connected by transition rules. From the modes the
package automatically builds the Poincaré map of the system as a composite
diffeomorphism together with its Jacobian matrix and Hessian tensor, which
feed periodic-point search, local bifurcation analysis and parameter continuation.
Y. Miino, "Mode concept to construct diffeomorphisms representing smooth/non-smooth dynamical systems", Nonlinear Theory and Its Applications, IEICE, 15(2), 284–298, 2024. doi:10.1587/nolta.15.284
Installation
pip install mappy-ds
Add the plot extra for the interactive matplotlib viewer:
pip install "mappy-ds[plot]"
Requires Python 3.11 or newer.
Quick start
The Izhikevich neuron model fires (jumps) when the membrane potential reaches
v = 30. Describe the ODE, the border, the jump and the Poincaré section as modes
and let the package build the map:
import numpy as np
from mappy_ds import (
ContinuousMode,
DiscreteMode,
PoincareMap,
border,
mapping,
vector_field,
)
@vector_field(dim=2)
def izhikevich(y, p):
v, u = y
return np.array([0.04 * v**2 + 5 * v + 140 - u + p["I"], p["a"] * (p["b"] * v - u)])
@border(dim=2)
def fire(y, _):
return y[0] - 30
@mapping(2)
def firing(y, p):
return y + np.array([p["c"] - 30, p["d"]])
@mapping(2, 1)
def reduce(y, _): # section (v = 30) -> u
return np.array([0, 1]) @ y
@mapping(1, 2)
def revert(u, _): # u -> section (v = 30)
return u * np.array([0, 1]) + np.array([30, 0])
pmap = PoincareMap(
[
ContinuousMode("A", izhikevich, borders=[fire]),
DiscreteMode("B", firing),
DiscreteMode("P", reduce),
DiscreteMode("Pinv", revert),
],
{"A": ["P"], "B": "A", "P": "Pinv", "Pinv": "B"},
initial_mode="Pinv",
)
params = {"a": 0.2, "b": 0.2, "c": -50.0, "d": 2.0, "I": 10.0}
res = pmap.image_detail(-3.0, params, hessian=True)
print(res.y, res.jac, res.hes) # [-3.47838] [[0.27080]] [[[-0.19326]]]
print(res.mode_history) # ['Pinv', 'B', 'A', 'P', 'Pinv']
Find a fixed point and follow it while a parameter changes:
from mappy_ds.root import find_cycle, trace_cycle
fp = find_cycle(pmap, -4.5, {**params, "I": 8.0})
print(fp.y, fp.eigvals) # [-4.64542] [0.22196+0.j]
branch = trace_cycle(
pmap, fp.y, {**params, "I": 8.0}, "I", end_value=4.5, resolution=50
)
Smooth systems are a special case: a discrete map is a single mode
(Diffeomorphism), and a periodically forced oscillator becomes autonomous by
adding time as a state and resetting it on a section — see examples/.
Features
- Modes:
ContinuousMode(ODE integrated with SciPy until a border is hit) andDiscreteMode(a map), freely composed through transition rules. - Derivatives for free: system functions are traced once with SymPy; the Jacobian and Hessian of every mode map — including the correction for the state-dependent hitting time at a border — and of their composition are computed automatically.
mappy_ds.root: periodic points (find_cycle), local bifurcation points — tangent, period-doubling and Neimark–Sacker — (find_local_bf), and their parameter continuation (trace_cycle,trace_local_bf).mappy_ds.plot: an interactive matplotlib viewer of trajectories and return maps with mouse / keyboard control of the initial state and parameters.
Documentation
https://yuu-miino.github.io/doc.mappy/latest/
Development
git clone https://github.com/Yuu-Miino/mappy.git
cd mappy
uv sync
uv run pytest
See CONTRIBUTING.md.
License
MIT — see LICENSE.
Metadata
Release files for mappy-ds 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| mappy_ds-0.2.0.tar.gz | 65.9 kB | With provenance | Details for mappy_ds-0.2.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| mappy_ds-0.2.0-py3-none-any.whl | Python 3 | none | any | Details for mappy_ds-0.2.0-py3-none-any.whl |
Total release size: 109.1 kB
Release files / mappy_ds-0.2.0.tar.gz
| Download URL | mappy_ds-0.2.0.tar.gz |
|---|---|
| Size | 65.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c7f4c7346978724a90467f20253230cffe7b68048a8e0e33e21cb540457cb91b
|
|
BLAKE2b-256 checksum How to use checksums |
9f08e8cdaec47243760bb721a7a6193f2f8b3c71386e846deb2ed59c7cdcbfda
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.
Transparency logRelease files / mappy_ds-0.2.0-py3-none-any.whl
| Download URL | mappy_ds-0.2.0-py3-none-any.whl |
|---|---|
| Size | 43.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
cf3ace9a93f25f3b9a2358f35832fce735c3fa7452eee9d69a01cc80006a25bb
|
|
BLAKE2b-256 checksum How to use checksums |
1c6912fc8786363004f319bedba2097fde0be8208fab29db7b8ae2e2933a3abe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.
Transparency logSecurity for mappy-ds 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for mappy_ds-0.2.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.