Skip to content

Track: Track1; Team name: PushparajD; Model: Generalized PageRank GNN#352

Open
Pdevadiga45 wants to merge 8 commits into
geometric-intelligence:mainfrom
Pdevadiga45:track1-gprgnn
Open

Track: Track1; Team name: PushparajD; Model: Generalized PageRank GNN#352
Pdevadiga45 wants to merge 8 commits into
geometric-intelligence:mainfrom
Pdevadiga45:track1-gprgnn

Conversation

@Pdevadiga45

@Pdevadiga45 Pdevadiga45 commented Jun 13, 2026

Copy link
Copy Markdown

Checklist

  • My pull request has a clear and explanatory title.
  • My pull request passes the Linting test.
  • I added appropriate unit tests and I made sure the code passes all unit tests.
  • My PR follows PEP8 guidelines.
  • My code is properly documented, using numpy docs conventions, and I made sure the documentation renders properly.
  • I linked to issues and PRs that are relevant to this PR.

Description

Adds GPR-GNN (Generalized PageRank GNN) as a Track 1 graph backbone.

● Chien, Peng, Li, Milenkovic. Adaptive Universal Generalized PageRank Graph Neural Network, ICLR 2021 arXiv:2006.07988
● code: jianhao2016/GPRGNN.

GPR-GNN keeps feature learning and propagation separate. An MLP encodes the node features; a propagation step then takes a weighted sum over K hops of the symmetric-normalised adjacency, with the per-hop weights γ₀…γ_K learned jointly with the rest of the model. Those weights are unconstrained in sign, so the effective filter can land anywhere from low-pass to high-pass. Which is why one architecture copes with both homophilic and heterophilic graphs, the axis GraphUniverse sweeps.

Files in this PR

  • topobench/nn/backbones/graph/gprgnn.py : the propagation layer GPRProp (a MessagePassing module) and the GPRGNN model. PPR / NPPR / Random / SGC / WS initialisations are all supported, and the docstrings point back to the paper's equations.
  • configs/model/graph/gprgnn.yaml : Hydra config built on GNNWrapper + NoReadOut; one config covers both the node task (community detection) and the graph task (triangle counting).
  • test/nn/backbones/graph/test_gprgnn.py : 13 tests, 100% coverage of the backbone. As well as shapes and gradients, they pin down model invariants: K=0 is the identity, SGC init is a single-hop filter, the output is permutation-equivariant, and the γ weights actually receive gradient. As an external reference check, PPR-initialised propagation is asserted to match PyG's official APPNP bit-for-bit (APPNP is exactly the PPR special case of GPR's weights), validating the normalisation, hop recursion, and aggregation against a trusted implementation.
  • test/pipeline/test_pipeline.py : registers graph/gprgnn for the CI MUTAG integration test.
  • 2026_tdl_challenge/outputs/.../results.json : GraphUniverse grid output

Adaptations Made for TopoBench

  • The backbone returns node embeddings, not class scores, the readout is the classifier - so I dropped the reference model's final log_softmax.
  • forward(x, edge_index, edge_weight=None, **kwargs) swallows the extra arguments GNNWrapper passes, and the hidden width is kept equal to the encoder width so the wrapper's residual add is well-formed.
  • The config points at the fully-qualified class path. The backbone loader executes each file under a generated module name, which trips PyG's MessagePassing signature inspector unless the class resolves to its real module. GPR-GNN is the first message-passing backbone in the repo, so this only shows up now.

Cost. Propagation is K sparse products on the normalised adjacency - O(K·E·d) time, O(N·d) memory. Plus the MLP, with only K+1 extra scalars. At the benchmarked size (width 64, K=10, α=0.1, PPR init) the backbone is ~8.3K parameters.

How results.json was produced

The shipped evaluation notebook can't run as-is. Its guard cell compares a stored hash (f87b2cf…) against the hash of its own remaining cells (3c1d784…), they differ, and it raises ValueError before doing anything. Rather than touch the notebook or utils.py, I called the two functions it wraps, run_challenge_grid and save_challenge_artifacts, which run the same grid and emit the same JSON.

Issue

Submission to the TDL Challenge 2026, Track 1 (GNNs).

Additional context

Tested with the project environment (Python 3.11, torch 2.3.0). ruff (lint + format), numpydoc validation, and the 12 backbone unit tests (100% coverage) all pass locally; the MUTAG pipeline test passes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant