Repository navigation
gfql cuDF 26.02 (real GPU): chain default route and policy-forced full path disagree on prune_to_endpoints hops and duplicate node ids; tests use the removed cudf.DataFrame.from_pandas #2043
Description
Activity
Product code has the same removed spelling at 4 sites (
graphistry/ai_utils.py:504,506,graphistry/umap_utils.py:619,1125), so the AI/UMAP cuDF paths raise on cuDF 26.2 as well.cudf.from_pandasis accepted by both cuDF lines; PR to follow for the tests and these sites.Real-GPU update (dgx-spark, cudf 26.02.01 image): at the #2060 head the duplicate-id hop pin
test_chain.py::test_fast_path_dedups_duplicate_node_ids_on_hop[cudf]now passes (strict XPASS against this issue's marker), while master 86de0f5 in the same image still xfails it; #2060 drops that marker. Theprune_endpoints_fwd/revhalf still diverges on master and on every open head, andcudf.DataFrame.from_pandasis shimmed since #2044. Remaining scope: the prune_to_endpoints fast-vs-full disagreement on cuDF 26.02.Prune half, narrowed on the real GPU (26.02 image, master 86de0f5 and the #2062 stack head): with
[n(), e_forward(hops=1, prune_to_endpoints=True), n()]on cuDF, the default execution returns the whole graph ([0,1,2,3,4], 5 edges) while the policy-forced run (policy={'preload': ...}) prunes to the arrival side ([1,2,3,4], 3 edges) and its node frame still carries__gfql_output_node_hop__. Declining every hot path through the route switch (native-fast, polars-seeded, polars-plain, index-hop, indexed-kernel, cypher-fast, all off) leaves the default answer unchanged, so this is not a lane: the two executions of the SAME general path differ only by the policy wrapper, on cuDF 26.02 only (25.10 agrees). Lead:ASTEdge.executeprunes only insideif edge_hop_col is not None and edge_hop_col in out_g._edges.columns and ...(ast.py ~654) and skips silently otherwise; on 26.02 the default path appears to lose the auto hop-label column before that check while the policy path keeps it (its output frame shows the label). Next: assert instead of skip whenprune_to_endpointsis set and the label column is missing, then find why the label is dropped on cuDF 26.02 without a policy. Reproducer:/tmp/gputest/probe_2043b.pyon dgx via safe_run.- added a commit that references this issue
on Sep 6, 2026 Real-GPU update on the restacked release stack (cudf 26.02.01 image): the
prune_endpoints_fwd/revcuDF pins now PASS (strict XPASS against this issue's marker) at the stack head that contains #2062, whose endpoint-closure change appends only endpoints missing from the node frame; the duplicate-id pin passes at the #2060 head. With #2060 and #2062 landed, every item on this issue is resolved (thefrom_pandasspelling via #2044's shim); #2062 drops the prune marker, #2060 the dedup one. Closes once both merge.- added 8 commits that reference this issue
on Sep 6, 2026 Closing: all three parts are on master — the fixture half (
cudf.DataFrame.from_pandasremoval) in #2044 (70efbd3), and the two divergence halves verified on the real GPU: the duplicate-id hop pin in #2056 (f45469c) and theprune_to_endpointspins in #2062 (1a41079); both strict markers were dropped there. Reopen if a cuDF 26.02 run at current master disagrees between the default route and the policy-forced full path.
Found by the cross-platform bar on dgx-spark (image
graphistry/test-rapids-official:26.02-gfql-polars, cudf 26.02.01, cupy 13.6.0) while auditing stack B (#2035/#2037/#2038/#2040); reproduced on master bff7c32 in the same image. Local dev boxes on cudf 25.10 pass, so CI and local runs never see it.graphistry/tests/compute/test_chain.py::test_fast_path_differential_parity_vs_full_path[prune_endpoints_fwd-cudf],[prune_endpoints_rev-cudf]andtest_fast_path_dedups_duplicate_node_ids_on_hop[cudf]:g.gfql(ops)(default route) andg.gfql(ops, policy=...)(policy-forced full BFS) return different node sets on cuDF —[0,1,2,3,4]vs[1,2,3,4]for the forward prune,[0,1,2,3]vs[0,1,2,3,4]-style for reverse, and[0,0,1,2]vs[0,1,2]for the duplicate-id hop. Same shapes agree on pandas and on cudf 25.10. Related: gfql: rows(table=nodes, source=alias) multiplies rows for duplicate node ids and joins null ids to each other #2034 (duplicate/null ids on the full path).cudf.DataFrame.from_pandas(...), which cuDF 26.2 removed (cudf.from_pandasis the surviving spelling): with a-kselection the fixtures raiseAttributeErrorbefore any assertion, so most cuDF differential tests silently do not run on the current image.Expected: one answer per shape on every engine; the fixture spelling accepted by both cuDF lines.