Each node i carries a feature vector hi (here 3 numbers, rendered as its RGB color). One round of message passing replaces every node's vector with an aggregate of its neighbors' vectors — this is the core operation inside every Graph Neural Network layer (GCN, GraphSAGE, message-passing NNs):
h_i(t+1) = AGGREGATE( { h_j(t) : j ∈ N(i) } ∪ { h_i(t) } )
With self-loop weight α, the neighborhood of i is weighted by α·I + A. This simulator implements three real aggregation rules used in practice:
Sum: h_i' = α·h_i + Σ_j h_j
Mean: h_i' = (α·h_i + Σ_j h_j) / (α + deg_i)
Sym-norm: h_i' = (α/D_i)·h_i + Σ_j h_j / √(D_i·D_j) [Kipf & Welling GCN, D_i = α + deg_i]
Stacking k rounds lets information travel k hops across the graph — a node's receptive field grows with depth, exactly like a k-layer GNN. But repeated neighbor-averaging is also a low-pass filter: as t grows, every node's vector converges toward the same graph-wide average and nodes become indistinguishable. This is over-smoothing, a well-documented failure mode of deep GNNs (Li et al. 2018). The panel tracks it two ways: the Dirichlet energy Σ(i,j)∈E ‖h_i − h_j‖² (how different connected nodes still are) and the embedding variance across all nodes — both decay toward zero as smoothing progresses.
- Step — apply one round of message passing; small pulses travel along the edges to show information flowing from neighbors into each node.
- Aggregation rule — switch between sum, mean and the symmetric-normalized rule GCN uses; sum tends to blow up node magnitudes, mean and sym-norm stay bounded.
- Self-loop weight α — how strongly a node retains its own previous state versus its neighbors' messages; α=0 removes self-information entirely and accelerates over-smoothing, large α slows it down.
- tanh nonlinearity — toggles a squashing activation after aggregation, as a real GNN layer applies between linear steps.