All notable changes to the packages in this monorepo are documented in this file, as a single timeline (most recent first). The repository hosts four independently versioned packages — GNNGraphs.jl, GNNlib.jl, GraphNeuralNetworks.jl (Flux frontend), and GNNLux.jl (Lux frontend) — and each release below is tagged with the package it belongs to.
The format is based on Keep a Changelog, and the packages adhere to Semantic Versioning. Entries link to the pull request that introduced them.
Added
- Added a
Mooncakepackage extension, so that Mooncake can differentiate on CUDA throughadd_self_loopsand through adjacency-matrix graphs. Float edge weights of adjacency-matrix graphs stay differentiable (#704).
Fixed
- Added an
EnzymeCorepackage extension markingscaled_laplacianinactive for Enzyme, matching its existing@non_differentiableChainRules declaration. Enzyme previously differentiated the Krylov eigensolve inside it and failed; this unblocksChebConv,GConvGRUCellandGConvLSTMCell(#706). - Enzyme can now differentiate through the adjacency-matrix → COO graph conversion: a new internal keyword-free helper
_to_coo_graphavoids the union-typed keyword handling of theGNNGraph(g; graph_type)constructor and ofto_coo, which Enzyme's type analysis cannot compile. Together with upstream fixes in Enzyme ≥ 0.13.197 this removes theEnzymeInternalErrorcrash on:dense/:sparsegraphs (#703).
Added
- Added pooling layers (
GlobalPool,GlobalAttentionPool,TopKPool) (#576). TGCNnow supports non-linear activation functions (#596).- Rewrote the recurrent temporal layers following the Flux frontend's design (#560): added the
GNNRecurrencewrapper and split every temporal layer into a*Celland a full-sequence layer, exporting both —TGCNCell/TGCN,GConvGRUCell/GConvGRU,GConvLSTMCell/GConvLSTM,DCGRUCell/DCGRU,EvolveGCNOCell/EvolveGCNO. A layer now consumes a whole sequence at once (anin × timesteps × num_nodesarray on aGNNGraph, or a vector of snapshots on aTemporalSnapshotsGNNGraph) and returns the full output sequence (#696).
Changed
- Bumped the NNlib, OneHotArrays, StableRNGs, and DocumenterInterLinks compat bounds (#687, #686, #684, #685).
- The temporal cells now share their forward-pass math with the Flux frontend via new
GNNlibfunctions, and several formulas were corrected in the process (e.g. theGConvGRUcandidate state, previouslytanhof the wrong term, and theGConvLSTMpeephole connections) (#696).
Removed
- Removed the
A3TGCNlayer, mirroring its removal from the Flux frontend (#696).
Fixed
- Fixed
Enzyme.gradientfailing when differentiatingGCNConv,SGConvandTAGConvon:dense/:sparseadjacency graphs: their adjacency-matrix fallbacks now convert via the Enzyme-differentiableGNNGraphs._to_coo_graphinstead of the keywordGNNGraphconstructor. Requires GNNGraphs ≥ 1.5.2 and, for Enzyme, Enzyme ≥ 0.13.197 (#703).
Changed
GNNRecurrencenow hands each cell an indexed time slice instead of aneachsliceview, matching the Lux frontend. Enzyme's type analysis fails onSubArraycell inputs, so this unblocksDCGRU,EvolveGCNO,GConvGRUandGConvLSTMunder Enzyme (#707).- The recurrent temporal cells now delegate their forward-pass math to shared
GNNlibfunctions (requires GNNlib ≥ 1.4); the layer behaviour is unchanged (#696).
Added
- Added framework-agnostic forward passes for the recurrent temporal cells —
tgcn,gconv_gru,gconv_lstm,dcgru— shared by the Flux and Lux frontends (#696).
Fixed
- Worked around a Julia 1.12 code-generation segfault that crashed
CGConvandGMMConvgradients: the layers'@warn(in the residual branch) is now wrapped inignore_derivativesto keep the logging macro out of the AD-differentiated code path. Root cause reported upstream as FluxML/Zygote.jl#1662; re-enables the previously disabledCGConv/GMMConvgradient tests (#695).
Changed
- Relaxed the
CUDAcompat bound to"5, 6", adding support for CUDA.jl v6 (#690). - Bumped the NNlib and KrylovKit compat bounds (#687, #680).
Fixed
- Fixed
remove_edgestriggering scalar indexing on GPU graphs (#672, #691). - Fixed
getgraphfailing on GPU graphs (#691). - Fixed
remove_self_loopsmutating the input for adjacency-matrix graphs (#659). - Fixed
unbatchfor COO batches containing zero-edge graphs (#652). - Fixed
sample_nbrswhen sampling without replacement (#648).
Added
- Added Mooncake rules for the
propagatecopy_xj,e_mul_xj, andw_mul_xjfast paths (#677, #678, #679).
Changed
- Relaxed the
CUDAcompat bound to"5, 6", adding support for CUDA.jl v6 (#690). - Bumped the NNlib compat bound (#687).
Fixed
- Fixed the
d_conv(DConv) forward pass, which did not compute the diffusion convolution from the paper: the degree normalization was inverted (multiplying by degree instead ofD_O⁻¹/D_I⁻¹), one weight slice was applied twice, and a spurious Chebyshev2T − T₀recurrence was used in place of the paper's bidirectional random-walk power series. Isolated nodes are now handled without producingNaN(#592).
Changed
- Bumped the DataStructures compat bound (#670).
Fixed
- Fixed the
gmm_conv(GMMConv) implementation (#645).
Added
- Added support for reducing nodes over heterogeneous graphs (#634).
Fixed
- Fixed empty-edge handling in
softmax_edge_neighbors(#636).
Added
- Added
coalesceandis_coalescedto sort and merge duplicate edges of COO graphs, and to query coalesced state (#613, #624, #625). - Added SpMM-based message passing with CUDA support for coalesced COO graphs (#617).
- Added a
fmtkeyword toadjacency_matrixto select the output format, plus acopy_xjpropagatefast path for Metal (#619). - Added CUDA support for the
binarize()operation on sparse matrices (#601).
Changed
- The monorepo now uses Julia workspaces for development (#630).
Fixed
- Fixed the NNlib CUDA extension (#621).
Added
- Added SpMM-based message passing with CUDA support for coalesced COO graphs (#617).
- Added CUDA sparse support for the
propagatecopy_xjandw_mul_xjfast paths via matrix multiplication (#605, #610). - Added a
fmtkeyword toadjacency_matrixand acopy_xjpropagatefast path for Metal (#619).
Changed
- Refactored
propagatesignatures to accept COO subtypes for thecopy_xjandw_mul_xjfast paths (#611).
Fixed
- Fixed the NNlib CUDA extension (#621).
Added
TGCNnow supports non-linear activation functions (#596).
Fixed
- Fixed a Zygote differentiation error (#579).
Changed
Fixed
Maintenance release: internal fixes and test-infrastructure updates, no user-facing API changes.
Changed
- Removed the constraint requiring an equal number of features across node/edge types in the
gdataof heterographs (#570).
Added
- Added
broadcast,iterate, andsetindex!support forTemporalSnapshotsGNNGraph(#563).
Changed
- Updated for compatibility with Flux v0.15 (#550).
Fixed
- Fixed
showfor graphs whose features are not arrays (#564).
First stable release of GNNlib.jl.
Changed
- Rewrote the recurrent temporal layers for Flux v0.16 (#560).
- Updated for compatibility with Flux v0.15 (#550).
First stable release of the Flux frontend.
Changed
- Rewrote the recurrent temporal layers for Flux v0.16 (#560).
- Updated for compatibility with Flux v0.15 (#550).
Documentation release: added the "Hands On" tutorial, a version selector, and general docs improvements (#549, #543, #542, #539). No API changes.
Initial release of the Lux-based frontend for GraphNeuralNetworks.jl, providing
Lux implementations of the graph convolutional, pooling, and temporal layers
(e.g. GCNConv, GraphConv, SAGEConv, GATConv, GMMConv, NNConv,
ResGatedGraphConv, and the temporal layers TGCN, GConvGRU, GConvLSTM,
DCGRU, EvolveGCNO) that share the message-passing implementations in GNNlib.