Release Notes

v0.11.0 Residual Vision (unreleased)

Highlights

  • New backwards-incompatible model API: models are now bound to their implant and built automatically; predict_percept takes a stimulus directly (PR #862):

    implant = p2p.implants.ArgusII()
    model = p2p.models.AxonMapModel(implant)
    percept = model.predict_percept(stim)
    
  • New pulse2percept.vision module with Scene and Scotoma for gaze-aware simulation of residual vision and retinal prostheses (PR #854, PR #871, PR #883).

  • New photovoltaic stimulation pipeline for PRIMAPivotal, from image encoding to irradiance-based model input (PR #868).

API changes and improvements

Stimuli and encoding

  • New Encoder framework supports electrical and non-electrical stimulation. New PRIMAEncoder implements photovoltaic image/video encoding, while AmplitudeEncoder supports threshold-based amplitude ranges such as (0 * xTh, 3 * xTh) (PR #868, PR #869).

  • Added optical power units (W, mW, uW), proper geometric-angle units (deg, rad), and pathlib.Path support for image and video stimuli (PR #855, PR #868, PR #880).

Implants

  • ProsthesisSystem is renamed Implant; the old name remains as a deprecated alias until 0.12.0 (PR #876).

  • The PRIMA family was reorganized around the published devices: PRIMA becomes PRIMAPivotal, PRIMA75 becomes Lorach2015Array, and new Ho2019FlatArray and Huang2021Array classes capture other photovoltaic designs. Device geometry and pixel dimensions were corrected accordingly (PR #865).

  • RectangleImplant is deprecated in favor of GridImplant (PR #859).

  • Implant and electrode APIs were cleaned up for consistency: descriptive names replace abbreviations such as earray, vfmap, etype, r, and a; grid_type now uses 'rect'/'hex' throughout; plot3D() becomes plot3d(); and implants/electrode arrays follow normal Python container behavior (PR #880).

  • Implant now exposes device placement, technology, and family metadata and supports per-electrode thresholds (PR #865, PR #869).

Models

  • Model constructors now expose their supported parameters explicitly instead of accepting arbitrary **params. Composite models no longer forward component attributes: spatial and temporal parameters are accessed through model.spatial and model.temporal (PR #879).

  • ScoreboardSpatial can consume normalized photovoltaic drive, and BiphasicAxonMapModel can predict directly from still images encoded with the standard biphasic pipeline (PR #868, PR #869).

  • find_threshold has been removed; threshold searches belong at the experiment level rather than in the model API (PR #862).

  • New location_noise parameter displaces each electrode’s phosphene by a fixed, subject-specific offset in the visual field (dva) rather than at the location the visual_field_map gives it. Requires a 2D, invertible map (PR #881).

Residual vision

  • Scene adds softened scotoma boundaries, optional inpainting, configurable backgrounds, and eccentricity rings in both static and animated views (PR #871).

Plotting

Bug fixes

  • Fixed centering of single-row and single-column hexagonal ElectrodeGrid instances (PR #859).

  • Corrected PRIMA-family pixel dimensions and layouts (PR #865).

  • BiphasicAxonMapSpatial now respects n_gray and noise and preserves the full stimulus in percept metadata (PR #869).

v0.10.0 Encoders (2026-08-23)

Highlights:

  • New stimulus encoders support amplitude and frequency modulation of images and videos, with implant-specific raster strategies for multiplexed stimulation (PR #810, PR #820, PR #833)

  • Stimuli now retain structured pulse and encoder representations and generate waveform samples lazily, substantially reducing construction time and memory use (PR #842)

  • New units support for dimension-checked physical quantities throughout the public API (PR #828)

  • Major performance improvements for stimulus handling, spatial models, temporal models, and large-array simulations (PR #800, PR #805, PR #808, PR #821, PR #850)

  • play() and play() are substantially faster, and percept playback now supports irregular time axes (PR #809, PR #834)

  • New AlphaTemporal and much faster FadingTemporal temporal models (PR #849)

  • New load() reads percepts from image and video files (PR #835)

  • Python 3.14 is supported. Python 3.11 and NumPy 2 are now required (PR #790)

API changes:

  • Stimulus.data, time, electrodes, and pulse parameters are now read-only. New pad() and shift() methods provide explicit time-axis transformations (PR #837, PR #842)

  • Image and video stimuli now use grid-style electrode names such as 'A1' and 'C12_G' instead of integer pixel indices (PR #805)

  • ProsthesisSystem (now Implant) supports stimulus encoders, raster strategies, and maximum-current limits. Dimensionless image/video stimuli can be encoded automatically when assigned to an implant (PR #810, PR #833)

  • Temporal models gained a reduce parameter for summarizing automatically selected output intervals. FadingTemporal now responds only to cathodic current (PR #818)

  • BiphasicAxonMapModel now distinguishes physical current from threshold-relative amplitude via the new xTh unit (PR #848)

  • BiphasicAxonMapSpatial can now be composed with temporal models using a space-time-separable approximation (PR #847)

  • Model parameter xystep was renamed to step and axlambda to lam; the old names are deprecated until v0.11 (PR #824, PR #830)

  • Axon-map and cortical scoreboard models can smooth predictions across visual-field meridians (PR #838)

  • Multi-electrode stimuli now plot as electrode-by-time heatmaps by default; percept playback and saving gained vmin/vmax controls (PR #835, PR #841)

Bug fixes:

  • Fixed stimulus timing, metadata propagation, pulse scheduling, and structured stimulus handling across implants and models (PR #804, PR #810, PR #818, PR #825, PR #846)

  • Fixed several image and video issues, including argument forwarding, centering, single-frame playback, irregular timing, and efficient partial video loading (PR #815, PR #822, PR #834, PR #844)

  • Fixed several Neuropythy and cortical-map issues involving shapes, NaNs, scalar inputs, mesh vertices, subject IDs, and coordinate units (PR #826, PR #836, PR #845)

  • Various smaller correctness fixes (PR #814)

v0.9.1 (2026-08-06)

Highlights:

  • Python 3.13 support; the minimum supported Python is now 3.10 (PR #649)

  • NumPy 2.x support: wheels import under both NumPy 1.x and 2.x, so installing pulse2percept no longer downgrades NumPy in environments that ship it, such as Google Colab (PR #635, PR #736)

  • Removed the jax engine and predict_percept_batched from BiphasicAxonMapModel; the engine argument of the effect models and the pad argument of calc_axon_sensitivity() are deprecated, and will be removed in v0.10.0 (PR #788)

  • Removed the model_selection module (PR #685) and support for the joblib and dask parallel backends (PR #686); the engine and scheduler model parameters are deprecated, and will be removed in v0.10.0 (PR #788)

  • n_jobs is now an alias for n_threads: either name sets the number of OpenMP threads, and None or -1 uses every core (PR #788)

  • More robust dataset downloads, with updated OSF endpoints (PR #754)

  • Smarter reshape_stim for implants (PR #680)

  • Installation is now tested inside the real Google Colab runtime (PR #777)

  • Various bug fixes (PR #682, PR #700, PR #732, PR #776)

v0.9.0 Cortex (2025-02-17)

Highlights:

v0.8.0 Retina (2022-05-05)

Highlights:

v0.7.1 (2021-06-21)

Highlights:

v0.7.0 Implants (2021-04-04)

Highlights:

v0.6.0 API (2020-05-05)

Highlights:

v0.5.2 (2020-02-25)

Bug fix:

  • pulse2percept.retina.Nanduri2012: improved Cython implementation

v0.5.1 (2020-02-05)

Bug fixes:

  • pulse2percept.retina.Nanduri2012: allow switch between FFT/Cython

  • pulse2percept.retina.Horsager2009: respect use_jit option

  • pulse2percept.utils.center_vector: “cannot determine Numba type”

v0.5.0 Community (2019-11-29)

v0.4.3 Cython (2018-05-21)

Highlights:

  • Cython integration:

    • The model described in Nanduri et al. (2012) now uses a finite difference method implemented in Cython as opposed to FFT-based convolutions (PR #83)

    • Single-core benchmarks show a 200x speedup over a pure-Python implementation.

v0.3.0 Baby Steps (2018-02-20)

  • New, faster axon map calculation

  • Better plotting

  • Support for left/right eye