Skip to content

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

@lmeyerov

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.

  1. graphistry/tests/compute/test_chain.py::test_fast_path_differential_parity_vs_full_path[prune_endpoints_fwd-cudf], [prune_endpoints_rev-cudf] and test_fast_path_dedups_duplicate_node_ids_on_hop[cudf]: g.gfql(ops) (default route) and g.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).
  2. 18 test sites call cudf.DataFrame.from_pandas(...), which cuDF 26.2 removed (cudf.from_pandas is the surviving spelling): with a -k selection the fixtures raise AttributeError before 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.

Activity

  1. lmeyerov commented on Sep 5, 2026

    @lmeyerov
    ContributorAuthor

    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_pandas is accepted by both cuDF lines; PR to follow for the tests and these sites.

  2. lmeyerov commented on Sep 6, 2026

    @lmeyerov
    ContributorAuthor

    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. The prune_endpoints_fwd/rev half still diverges on master and on every open head, and cudf.DataFrame.from_pandas is shimmed since #2044. Remaining scope: the prune_to_endpoints fast-vs-full disagreement on cuDF 26.02.

  3. lmeyerov commented on Sep 6, 2026

    @lmeyerov
    ContributorAuthor

    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.execute prunes only inside if 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 when prune_to_endpoints is 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.py on dgx via safe_run.

  4. lmeyerov commented on Sep 6, 2026

    @lmeyerov
    ContributorAuthor

    Real-GPU update on the restacked release stack (cudf 26.02.01 image): the prune_endpoints_fwd/rev cuDF 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 (the from_pandas spelling via #2044's shim); #2062 drops the prune marker, #2060 the dedup one. Closes once both merge.

  5. lmeyerov commented on Oct 3, 2026

    @lmeyerov
    ContributorAuthor

    Closing: all three parts are on master — the fixture half (cudf.DataFrame.from_pandas removal) in #2044 (70efbd3), and the two divergence halves verified on the real GPU: the duplicate-id hop pin in #2056 (f45469c) and the prune_to_endpoints pins 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.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions