Version 2.7.7
Release Date: March 12, 2026
This release migrates to the new brainevent binary backend API, fixes numerous bugs across neuron models, synapse dynamics, ODE integrators, and object transforms, and raises the minimum Python version to 3.11.
Breaking Changes
Python Version Requirement
- Raised: Minimum Python version from 3.10 to 3.11
- Dropped Python 3.10 support from classifiers and build metadata
brainevent API Migration (#817)
- Updated: Event-driven operations to use the new
braineventbinary backendEventArrayreplaced byBinaryArrayin all event CSR and jitconn operationsJITCHomoRreplaced byJITCScalarRfor homogeneous JIT connectivity- STDP weight update functions renamed:
dense_on_pre/dense_on_post→update_dense_on_binary_pre/update_dense_on_binary_postcsr_on_pre/csr2csc_on_post→update_csr_on_binary_pre/update_csr_on_binary_post
- Affected layers:
Dense,AllToAll,MaskedLinear, and all CSR-based layers
Bug Fixes
Neuron Models
- Fixed: All LIF-family neuron models (
LifLTC,LifRefLTC,ExpIFLTC,ExpIFRefLTC,AdExIFLTC,AdExIFRefLTC,QuaIFLTC,QuaIFRefLTC,AdQuaIFLTC,AdQuaIFRefLTC,GifLTC,GifRefLTC) now raise descriptiveValueErrormessages for invalidspk_resetmodes instead of bareValueError
Synapse Models
- Fixed: Synaptic variable updates in
DualExpon,Alpha, andNMDAmodels- Replaced in-place
+=operator with explicit.valueassignment to prevent tracing issues under JAX transformations
- Replaced in-place
ODE Integrators
- Fixed:
BogackiShampineadaptive Runge-Kutta coefficient typo — corrected'4/0'to'4/9'in the Butcher tableau - Fixed:
set_default_odeintwas incorrectly assigning to_DEFAULT_ODE_METHODinstead of_DEFAULT_DDE_METHOD
Object Transforms
- Fixed:
Variable.varshapeusedself.batch_sizeinstead ofself.batch_axiswhen computing non-batch shape dimensions - Fixed:
NodeDict.update()andVarDict.update()referencedargs[1]instead ofarg[1]when updating from tuple arguments - Fixed:
NodeDict.__setitem__duplicate key error message incorrectly displayed the new value instead of the existing one
Training
- Fixed:
BPTrainerdid not raiseNoLongerSupportErrorwhenseedparameter was passed (missingraisekeyword) - Fixed:
BPTrainermetric aggregation switched fromjnp.mean(bm.as_jax(...))tonp.mean(np.asarray(...))to avoid unnecessary JAX tracing overhead
Core
- Fixed:
ShardedArray.valuesetter used_check_tracer()instead of direct_valueaccess - Fixed:
_slice_to_numdid not handle negative step values and raised no error on zero step - Fixed:
load_statecrashed withKeyErrorwhen state dict contained missing keys; now correctly reports them as missing
Code Quality
- Improved: Narrowed bare
exceptclauses to specific exception types (ValueError,TypeError,ImportError,ModuleNotFoundError) in convolution layers and Flax interoperation module
Dependencies
- Updated:
braineventfrom>=0.0.4to>=0.0.7 - Updated:
braintoolsversion spec corrected to>=0.0.9 - Updated:
numpyminimum version set to>=1.15 - Updated:
brainpy_statefrom>=0.0.2to>=0.0.3
CI/CD
- Updated:
actions/upload-artifactfrom v6 to v7 (#815) - Updated:
actions/download-artifactfrom v7 to v8 (#816)
What's Changed
- chore(ci)(deps): bump actions/upload-artifact from 6 to 7 by @dependabot[bot] in #815
- chore(ci)(deps): bump actions/download-artifact from 7 to 8 by @dependabot[bot] in #816
- Refactor STDP and event ops for new brainevent binary backend by @chaoming0625 in #817
Full Changelog: V2.7.6...V2.7.7