Skip to content

test(gfql): viz-filter-pipeline acceptance suite + regression benchmark (L3)#1681

Closed
lmeyerov wants to merge 0 commit into
feat/gfql-search-anyfrom
test/gfql-viz-pipeline-acceptance
Closed

test(gfql): viz-filter-pipeline acceptance suite + regression benchmark (L3)#1681
lmeyerov wants to merge 0 commit into
feat/gfql-search-anyfrom
test/gfql-viz-pipeline-acceptance

Conversation

@lmeyerov

@lmeyerov lmeyerov commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

The viz-filter-pipeline ACCEPTANCE SUITE + REGRESSION BENCHMARK (viz-filter L3) — the proveout layer over the whole stack (#1675#1677#1679#1680). Frozen semantics: plans/viz-filter-pipeline/research/panel-algebra.md (v1-FINAL). Stacked on #1680.

graphistry/tests/compute/gfql/test_viz_pipeline_conformance.py

  • Curated full-panel pipelines (9, each: hand-derived oracle pin + an independent plain-pandas second oracle + assert_parity_or_nie across pandas/cuDF/polars/polars-gpu): node+edge filters, exclusion-dominates composition (AND NOT (...) with three-valued null semantics pinned), (pred OR IS NULL) keep-null leaves, both EXISTS prune-isolated flavors, searchAny composed with filters, deterministic ORDER BY/SKIP/LIMIT paging ascending AND descending — the fixture's row order is deterministically shuffled so an engine that silently drops the sort fails on membership, and the ASC+DESC pins are jointly seed-independent (review wave-3 proof).
  • Graph-state prune shapes: exact node and edge pins for GRAPH { MATCH (a)-[e]-(b) } (keep-self: self-loop-only node kept with its edge, mutual pair keeps both directed edges, isolated dropped) + the drop-self variant, on a formula-derived fixture (self-loops, parallel edges, isolated + self-loop-only discriminator nodes, unicode/metachar/null name cells, a Categorical column).
  • 40-seed panel-state fuzzer: random panel states → generated single cypher query → pandas result vs an independently computed plain-pandas expectation (zero pandas declines allowed), then 4-engine parity-or-NIE; out-of-dialect combos must decline with clear errors (crash classes fail).
  • Case/regex/unicode trick matrix (17 rows): (?i) vs case-sensitive =~, ß/İ full-case-mapping pins, literal-vs-regex metachars through searchAny, anchored =~ vs CONTAINS, null cells, Categorical (decline ok, silent-wrong not).

benchmarks/gfql/viz_filter_pipeline.py

Six streamgl-viz panel scenarios (filters+excludes+ORDER/LIMIT, keep-self GRAPH prune, EXISTS prune, node search, edge search, combined) × --scale {100k,1m,10m} × engines with native-frame-per-engine fairness (one-time conversion excluded from timing; both result frames touched inside the clock), warmup+timed medians, an NIE-tolerant never-crash matrix, --est for safe-run budgeting, upfront output-path validation, and JSON receipts. The ~350ms@800K interactive reference is printed as a comparison column, not asserted.

Review + verification

4 adversarial findings-mode waves to convergence (waves 3+4 consecutive clean; artifacts plans/viz-filter-pipeline/waves/pr1681/) — every curated pin and all 17 trick rows independently recomputed by hand in review; oracle-independence and bench fairness adversarially confirmed. dgx GB10 (--gpus all): suite 31 passed at the converged tip on the final stack; CI green.

Receipts (dgx GB10 — plans/viz-filter-pipeline/receipts/)

  • 100k ×4 engines: polars 2–5× pandas across panel scenarios; everything within the interactive reference except pandas combined (1.55×).
  • 1m ×4 engines: prune/exists/combined at 1.15–2.3× the 350ms reference on polars/cudf/polars-gpu (pandas 3.4–15.7×); search sub-budget on all engines (cudf search_nodes 36ms).
  • 10m ×4 engines: receipt in receipts/ (25M edges; run under the memory-safety harness).

Findings surfaced by this layer (pinned + tracked, exactly its job)

  • The same-path WHERE route dedupes parallel edges (one per unordered endpoint pair — a mutual pair may collapse to one direction) — diverges from the panel algebra's E₂ edge multiplicity; pinned at exactly that tolerance with the prune-correctness facts still asserted; repo-debt filed.
  • Edge-alias searchAny(e, ...) declines on polars (honest NIE) — gap tracked; explicit non-string/int/bool searchAny columns decline on polars + cuDF (float repr divergence, dgx-probed in feat(gfql/cypher): searchAny cross-column search predicate — inspector semantics, native on 4 engines #1680).
  • Pre-existing (inherited notes): cuDF same-path TypeError on the drop-self GRAPH form; bare pattern predicates inside GRAPH bodies silently drop (row_pre_filters unwired in the graph compiler).

🤖 Generated with Claude Code

@lmeyerov lmeyerov force-pushed the feat/gfql-search-any branch from dc9983b to b246e72 Compare July 5, 2026 16:44
@lmeyerov lmeyerov force-pushed the test/gfql-viz-pipeline-acceptance branch 3 times, most recently from 4b4501f to 9e79849 Compare July 5, 2026 17:33
@lmeyerov lmeyerov force-pushed the feat/gfql-search-any branch from ec19d78 to c0634f1 Compare July 5, 2026 21:07
@lmeyerov lmeyerov force-pushed the test/gfql-viz-pipeline-acceptance branch from 9e79849 to a8bb8dd Compare July 5, 2026 21:07
@lmeyerov lmeyerov force-pushed the feat/gfql-search-any branch from c0634f1 to 9af5808 Compare July 5, 2026 22:11
@lmeyerov lmeyerov force-pushed the test/gfql-viz-pipeline-acceptance branch from a8bb8dd to 87b94da Compare July 5, 2026 22:11
@lmeyerov lmeyerov force-pushed the feat/gfql-search-any branch from 9af5808 to dbf67ae Compare July 5, 2026 22:28
@lmeyerov lmeyerov force-pushed the test/gfql-viz-pipeline-acceptance branch from 87b94da to db96812 Compare July 5, 2026 22:28
@lmeyerov lmeyerov force-pushed the feat/gfql-search-any branch from dbf67ae to 5b692fe Compare July 5, 2026 22:39
@lmeyerov lmeyerov closed this Jul 5, 2026
@lmeyerov lmeyerov force-pushed the test/gfql-viz-pipeline-acceptance branch from db96812 to 5b692fe Compare July 5, 2026 22:39
@lmeyerov

lmeyerov commented Jul 6, 2026

Copy link
Copy Markdown
Contributor Author

Superseded by #1696 (same branch, rebased onto master, base=master). This PR was auto-closed when its base branch #1680 merged+deleted, and GitHub won't reopen a closed PR with a deleted base — so the L3 acceptance content lives on in #1696. Ignore this one.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant