Track: Track2; Team name: One Ring to Lift Them All; Model: DiffLift-SMCN - #406
Open
JorgeLuizFranco wants to merge 3 commits into
Open
Track: Track2; Team name: One Ring to Lift Them All; Model: DiffLift-SMCN#406JorgeLuizFranco wants to merge 3 commits into
JorgeLuizFranco wants to merge 3 commits into
Conversation
JorgeLuizFranco
force-pushed
the
difflift-smcn
branch
from
July 30, 2026 23:55
540e29e to
1530279
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Checklist
Description
Team: One Ring to Lift Them All — Jorge Luiz Franco.
This PR adds DiffLift (Differentiable Lifting for Topological Neural Networks) and SMCN (Scalable Multi-Cellular Networks) for Track 2 as
model=cell/smcn, plus a variant where the 2-cells of the SMCN are selected by a learned lifting (model=cell/smcn_difflift), based on our DiffLift work.DiffLift in one picture: a GNN embeds the nodes, candidate cells are accepted or rejected by small set functions with straight-through gradients, and the accepted cells form the complex the TNN consumes. In this PR it selects the 2-cells for SMCN.
References:
Implementation notes:
topobench/nn/backbones/cell/smcn.pyfollows the model the SMCN authors run on graph benchmarks: CIN blocks, then a bag of (node, edge) pairs — one marked copy of the node set per edge, where the marking is the hop distance from the node to the edge, capped at 10 — updated by a stack of SCL layers (the instantiation the paper points out recreates GNN-SSWL+ on the augmented Hasse graph), sum-pooled back into the node and edge features, and a final reduced CIN block.smcn_utils/structures.py). This way the standardgraph2cellcycle lifting is used as-is, with no custom transforms or data classes.nx.cycle_basis, max length 10) rather than the paper's enumeration of all simple cycles up to length 18. The subcomplex machinery only involves nodes and edges, so it is unaffected by this, and it keeps the comparison with the other cell models on the leaderboard under the same lifting.topobench/nn/liftings/— the learnable, in-model counterpart oftopobench/transforms/liftings, since a learned lifting has parameters and cannot run as a preprocessing transform. It follows our DiffLift preprint, and any backbone — cell or hypergraph — can import it independently of SMCN:DiffLiftEncoder(node embeddings),CellScorer(accept/reject over candidate cells given node-to-cell membership, with straight-through gradients; both the paper's Bernoulli sampling and its deterministic thresholded variant — it is not tied to the cell domain, one of the tests uses it to select hyperedges),EdgeSampler(the D=1 step: kNN candidate edges with per-node neighborhood sizes sampled via Gumbel-softmax, added on top of the observed edges), andDiffLift(the full D_max=2 recipe: learned 1-cells, then cycle-basis candidates of the augmented graph gated as 2-cells, with scaled-sum feature lifting).cell/smcn_difflift(same backbone,learned_lifting: true) plugs the general module into SMCN: the encoder and scorer select among the candidate 2-cells of the standard cycle lifting. I deliberately do not sample edges here: SMCN's markings are hop distances on the observed graph, so learned edges would be invisible to them. The fullDiffLiftwith edge learning is there for models that consume the learned complex directly. Rejected cells contribute exact zeros to every 2-cell-mediated message, and each graph always keeps at least one cell.test/nn/backbones/cell/test_smcn.py, plus the wrapper test intest/nn/wrappers/cell/test_cell_wrappers.py) and cover the bag layout and markings against hand-computed values, batch-offset equivalence, the distance buckets, both variants forward and backward, graphs with no 2-cells, the scorer rescue path, and the error paths.test/pipeline/test_pipeline.pyruns both configs ongraph/MUTAG.results.json(the full 72-run grid: 12 GraphUniverse settings × 3 seeds × both tasks, produced with the official evaluation utilities) is at2026_tdl_challenge/outputs/2026-07-27_05-00-00/results.json, with the generated heatmaps committed alongside:Issue
Submission to the TDL Challenge 2026 (Track 2 — TNNs). Please add the
track-2-tnnlabel.Related issues and PRs:
results.jsonhere is produced with the official evaluation utilities from2026_tdl_challenge/utils.py.