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_percepttakes a stimulus directly (PR #862):implant = p2p.implants.ArgusII() model = p2p.models.AxonMapModel(implant) percept = model.predict_percept(stim)
New
pulse2percept.visionmodule withSceneandScotomafor 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
Encoderframework supports electrical and non-electrical stimulation. NewPRIMAEncoderimplements photovoltaic image/video encoding, whileAmplitudeEncodersupports 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), andpathlib.Pathsupport for image and video stimuli (PR #855, PR #868, PR #880).
Implants
ProsthesisSystemis renamedImplant; the old name remains as a deprecated alias until 0.12.0 (PR #876).The PRIMA family was reorganized around the published devices:
PRIMAbecomesPRIMAPivotal,PRIMA75becomesLorach2015Array, and newHo2019FlatArrayandHuang2021Arrayclasses capture other photovoltaic designs. Device geometry and pixel dimensions were corrected accordingly (PR #865).RectangleImplantis deprecated in favor ofGridImplant(PR #859).Implant and electrode APIs were cleaned up for consistency: descriptive names replace abbreviations such as
earray,vfmap,etype,r, anda;grid_typenow uses'rect'/'hex'throughout;plot3D()becomesplot3d(); and implants/electrode arrays follow normal Python container behavior (PR #880).Implantnow exposes deviceplacement,technology, andfamilymetadata 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 throughmodel.spatialandmodel.temporal(PR #879).ScoreboardSpatialcan consume normalized photovoltaic drive, andBiphasicAxonMapModelcan predict directly from still images encoded with the standard biphasic pipeline (PR #868, PR #869).find_thresholdhas been removed; threshold searches belong at the experiment level rather than in the model API (PR #862).New
location_noiseparameter displaces each electrode’s phosphene by a fixed, subject-specific offset in the visual field (dva) rather than at the location thevisual_field_mapgives it. Requires a 2D, invertible map (PR #881).
Residual vision
Plotting
New
pulse2percept.plottingmodule provides combined stimulus/percept figures and animations.pulse2percept.vizis deprecated until 0.12.0 (Issue #872).
Bug fixes
Fixed centering of single-row and single-column hexagonal
ElectrodeGridinstances (PR #859).Corrected PRIMA-family pixel dimensions and layouts (PR #865).
BiphasicAxonMapSpatialnow respectsn_grayandnoiseand 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
unitssupport 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()andplay()are substantially faster, and percept playback now supports irregular time axes (PR #809, PR #834)New
AlphaTemporaland much fasterFadingTemporaltemporal 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. Newpad()andshift()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(nowImplant) 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
reduceparameter for summarizing automatically selected output intervals.FadingTemporalnow responds only to cathodic current (PR #818)BiphasicAxonMapModelnow distinguishes physical current from threshold-relative amplitude via the newxThunit (PR #848)BiphasicAxonMapSpatialcan now be composed with temporal models using a space-time-separable approximation (PR #847)Model parameter
xystepwas renamed tostepandaxlambdatolam; 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/vmaxcontrols (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_batchedfromBiphasicAxonMapModel; theengineargument of the effect models and thepadargument ofcalc_axon_sensitivity()are deprecated, and will be removed in v0.10.0 (PR #788)Removed the
model_selectionmodule (PR #685) and support for the joblib and dask parallel backends (PR #686); theengineandschedulermodel parameters are deprecated, and will be removed in v0.10.0 (PR #788)n_jobsis now an alias forn_threads: either name sets the number of OpenMP threads, andNoneor-1uses every core (PR #788)More robust dataset downloads, with updated OSF endpoints (PR #754)
Smarter
reshape_stimfor implants (PR #680)Installation is now tested inside the real Google Colab runtime (PR #777)
v0.9.0 Cortex (2025-02-17)
Highlights:
Cortical implants:
Cortivis[Fernandez2017] (PR #525),ICVP[Troyk2003] (PR #542),Neuralink[Musk2019] (PR #597)Cortical models:
ScoreboardModel(PR #533),DynaphosModel[vanderGrinten2023] (PR #547)Cortical maps:
Polimeni2006Map(PR #509),NeuropythyMap(PR #597)Other new implants:
IMIE[Xu2021] (PR #492),EnsembleImplant(PR #537),RectangleImplant(PR #631)Torch and CUDA support (PR #633)
Python 3.11 and 3.12 support
Various bug fixes
v0.8.0 Retina (2022-05-05)
Highlights:
New implants:
BVT44[Petoe2021] (PR #465)New models:
BiphasicAxonMapModel[Granley2021] (PR #398) andThompson2003Model[Thompson2003] (PR #448)New datasets:
load_greenwald2009()[Greenwald2009] (PR #459) andload_perezfornos2012()[PerezFornos2012] (PR #457)New stimuli:
BarStimulus,GratingStimulus(PR #310)Python 3.10 support (PR #479)
Various bug fixes
v0.7.1 (2021-06-21)
Highlights:
Add
FadingTemporal, a generic phosphene fading model (PR #378)Various implant usability and speed upgrades (PR #375, PR #382, PR #383, PR #386)
Various stimulus usability and speed upgrades (PR #382, PR #383, PR #384, PR #385)
Improve documentation and usability of various
AxonMapModelmethods (PR #370)
v0.7.0 Implants (2021-04-04)
Highlights:
New electrodes:
SquareElectrode,HexElectrode,PhotovoltaicPixel(PR #188, PR #193)New stimuli:
ImageStimulusandVideoStimulus(PR #196, PR #220, PR #221, PR #356),BarStimulusandGratingStimulus(PR #323)New datasets:
load_nanduri2012(PR #250)New model selection subpackage (PR #311)
100x speedup of building
AxonMapModel(PR #331)OpenMP support (PR #260)
Python 3.9 support (PR #348)
Various usability upgrades
Various bug fixes
v0.6.0 API (2020-05-05)
Highlights:
New implants:
BVA24(PR #161)New models:
ScoreboardModel(PR #96),AxonMapModel(PR #96),Nanduri2012Model(PR #168),Horsager2009Model(PR #180)New stimuli:
BiphasicPulseTrain,AsymmetricBiphasicPulse,AsymmetricBiphasicPulseTrain(PR #178)New build process: Compile code and run tests via
Makefile(PR #96)Documentation now includes a tutorial, user guide, developer’s guide, and a gallery
Various bug fixes
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/Cythonpulse2percept.retina.Horsager2009: respectuse_jitoptionpulse2percept.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