Generate spike trains (Poisson, gamma and inverse-Gaussian renewal, regular, Bernoulli, inhomogeneous) in pure Python with zero dependencies.
Project description
spikegen
Generate spike trains in pure Python with zero dependencies. Poisson, gamma and inverse-Gaussian renewal, regular, Bernoulli, and inhomogeneous processes, returned as plain sorted lists of spike times, with explicit seeds for reproducibility.
Install
pip install spikegen
30-second example
from spikegen import homogeneous_poisson, regular, gamma_renewal, with_refractory
homogeneous_poisson(rate=50.0, duration=2.0, seed=0) # Poisson spikes in [0, 2)
regular(rate=10.0, duration=1.0) # [0.0, 0.1, 0.2, ...]
gamma_renewal(rate=20.0, shape=2.0, duration=1.0, seed=0) # more regular than Poisson
from spikegen import inverse_gaussian_renewal
# Inverse-Gaussian (Wald) renewal: ISIs ~ IG(mu, lam); the LIF first-passage law.
inverse_gaussian_renewal(mu=0.05, lam=0.2, duration=1.0, seed=0)
spikes = homogeneous_poisson(rate=80.0, duration=1.0, seed=0)
with_refractory(spikes, refractory=0.002) # enforce a 2 ms refractory period
from spikegen import population
population(lambda s: homogeneous_poisson(rate=50.0, duration=2.0, seed=s), units=10, seed=0)
from spikegen import bernoulli, jitter
# Discrete-time Bernoulli process: 1 ms bins, 50 Hz rate over 1 second
bernoulli(rate=50.0, duration=1.0, dt=0.001, seed=0)
# Jitter: add Gaussian noise (sigma=2 ms) to each spike time, useful for surrogate data
spikes = homogeneous_poisson(rate=40.0, duration=1.0, seed=0)
jitter(spikes, sigma=0.002, seed=1)
Times are in the same units as 1 / rate (seconds if rate is in Hz). Seeded processes are
reproducible: the same seed gives the same train.
Optional NumPy fast path
The core package has zero runtime dependencies. For long, high-rate Poisson trains there is
an optional vectorized generator behind the [fast] extra:
pip install spikegen[fast]
from spikegen import homogeneous_poisson_numpy
# Same homogeneous Poisson process as homogeneous_poisson, but vectorized with NumPy.
homogeneous_poisson_numpy(rate=1000.0, duration=10.0, seed=0)
homogeneous_poisson_numpy(rate, duration, seed) draws exponential inter-spike intervals in
batches and takes their cumulative sum with NumPy instead of looping in Python, which is much
faster for long, high-rate trains. NumPy is imported lazily only inside this function, so the
pure-Python homogeneous_poisson stays the default and the package still imports with no
dependencies; calling homogeneous_poisson_numpy without [fast] installed raises an
ImportError.
The fast path is reproducible for a fixed seed but is not bit-identical to
homogeneous_poisson for the same seed: it uses NumPy's Generator (PCG64), a different
random stream from the pure path's random.Random (Mersenne Twister). The two are
statistically equivalent: both produce a homogeneous Poisson process with the same rate, so
their spike counts, mean rate, and inter-spike-interval distribution agree.
Why this exists
Generating synthetic spike trains is a daily need, but the generators live inside heavy
frameworks: elephant requires neo and quantities, pyspike is NumPy-based, and other
options are old or partial. spikegen is a small, dependency-free generator that returns
plain lists of floats, so reproducible spike trains are one import away. It pairs with
spikedist: generate trains, then measure the
distance between them.
Processes
regular(rate, duration): evenly spaced spikes. Deterministic.homogeneous_poisson(rate, duration, seed): constant-rate Poisson process.inhomogeneous_poisson(rate_fn, max_rate, duration, seed): time-varying rate by thinning.gamma_renewal(rate, shape, duration, seed): gamma inter-spike intervals; shape 1 is Poisson, larger shape is more regular.inverse_gaussian_renewal(mu, lam, duration, seed): inverse-Gaussian (Wald) inter-spike intervalsIG(mu, lam)with meanmuand variancemu**3 / lam, so the squared coefficient of variation ismu / lam. Largelamgives regular spiking, smalllamgives irregular spiking. This is the first-passage-time distribution of a drift-diffusion (perfect integrate-and-fire) neuron, a principled companion togamma_renewal. Intervals are sampled with the Michael-Schucany-Haas algorithm (Michael, Schucany, Haas 1976).bernoulli(rate, duration, dt, seed): discrete-time Bernoulli process. Time is divided into bins of width dt; each bin fires at its start time with probabilityrate * dt. RaisesValueErrorwhenrate * dt > 1.with_refractory(times, refractory): drop spikes within a minimum interval.jitter(times, sigma, seed): add independent Gaussian jitter (standard deviation sigma) to each spike time and return sorted results. Useful for surrogate or null datasets that destroy precise timing while preserving spike count.sigma = 0sorts without change.population(make, units, seed): build a population of trains by callingmake(seed)once per unit with independent, reproducible child seeds derived from the base seed.
All parameters after the first are keyword-only and explicit.
Testing
pip install -e ".[dev]"
pytest
Tests cover exact values for the deterministic generators, seeded reproducibility, the rate-bound and ordering invariants, and the validation paths, with property tests via Hypothesis.
Contributing
Issues and pull requests are welcome. See CONTRIBUTING.md.
License
MIT. See LICENSE.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file spikegen-0.5.0.tar.gz.
File metadata
- Download URL: spikegen-0.5.0.tar.gz
- Upload date:
- Size: 867.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a8231b2d4ca0754d8f804e1f0d8d9e15de8fd9a4468718d4cb43af970f2691ba
|
|
| MD5 |
b88c470b82a75cf33756b3040e4cee27
|
|
| BLAKE2b-256 |
555724a6d156dfe5e6c8e05d567ffede87c74250998caf050d91916f78f1dc1a
|
File details
Details for the file spikegen-0.5.0-py3-none-any.whl.
File metadata
- Download URL: spikegen-0.5.0-py3-none-any.whl
- Upload date:
- Size: 11.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
db336c90587c712a9238fa4b64271c8e0b09f15d307d358595c5d539cad7f5c4
|
|
| MD5 |
2db2499eb5d163b255755b47bb033b80
|
|
| BLAKE2b-256 |
8c27b86d57805d9fcaa1ba6b1e772979df737854664cfc869707bef5cb753e01
|