Observation (pyg-bench filter→PageRank→filter lane, PyGraphistry 0.59.0 @ 3fb216d, dgx-spark)
Same pipeline, same degree cutoff (stage 2: 73,010 nodes / 11,755,106 edges), same PageRank cutoff quantile (0.9995) on the 30M-edge SNAP GPlus graph:
| arm |
PageRank |
selected nodes (core + 1-hop) |
engine='pandas' |
igraph PRPACK, {directed: false, params: {damping: 0.85}} |
56,725 |
engine='cudf' |
cuGraph, {directed: false, params: {alpha: 0.85, max_iter: 100, tol: 1e-6}} |
56,930 |
Jaccard of the two selected sets is 0.9106, below the lane's 0.95 comparability gate. Tightening cuGraph (max_iter 500, tol 1e-8, fail_on_nonconvergence: false) reproduces the identical cuGraph selection (Jaccard 1.0 against the default cuGraph run), so cuGraph is converged: the two solvers rank the extreme tail differently. On Twitter (2.4M edges, 0.99 quantile) the same two arms agree at 0.987, and the igraph arm matches Neo4j GDS at 0.9999. A benchmark-only iterative Polars solver (per-vertex tol 1e-10) matches igraph exactly on GPlus, which points at cuGraph's handling of the undirected projection / dangling mass rather than at igraph.
Effect: the GPlus GPU pipeline time is published only as a diagnostic (non-comparable) on gfql/benchmark_filter_pagerank until the two backends agree on this tail.
Receipts (private pyg-bench): results/filter-pagerank-059-20260904/summary.json and the strict probe under results/runs/.
🤖 Generated with Claude Code
https://claude.ai/code/session_01WwMmVFo44ADiRRj5cxh7i1
Observation (pyg-bench filter→PageRank→filter lane, PyGraphistry 0.59.0 @ 3fb216d, dgx-spark)
Same pipeline, same degree cutoff (stage 2: 73,010 nodes / 11,755,106 edges), same PageRank cutoff quantile (0.9995) on the 30M-edge SNAP GPlus graph:
engine='pandas'{directed: false, params: {damping: 0.85}}engine='cudf'{directed: false, params: {alpha: 0.85, max_iter: 100, tol: 1e-6}}Jaccard of the two selected sets is 0.9106, below the lane's 0.95 comparability gate. Tightening cuGraph (max_iter 500, tol 1e-8,
fail_on_nonconvergence: false) reproduces the identical cuGraph selection (Jaccard 1.0 against the default cuGraph run), so cuGraph is converged: the two solvers rank the extreme tail differently. On Twitter (2.4M edges, 0.99 quantile) the same two arms agree at 0.987, and the igraph arm matches Neo4j GDS at 0.9999. A benchmark-only iterative Polars solver (per-vertex tol 1e-10) matches igraph exactly on GPlus, which points at cuGraph's handling of the undirected projection / dangling mass rather than at igraph.Effect: the GPlus GPU pipeline time is published only as a diagnostic (non-comparable) on
gfql/benchmark_filter_pagerankuntil the two backends agree on this tail.Receipts (private pyg-bench):
results/filter-pagerank-059-20260904/summary.jsonand the strict probe underresults/runs/.🤖 Generated with Claude Code
https://claude.ai/code/session_01WwMmVFo44ADiRRj5cxh7i1