Background
pygraphistry#1614 added explicit local Cypher graphistry.nx.* CALL parity for 8 NetworkX algorithms (degree/closeness/eigenvector/katz/connected/strongly-connected/core_number/hits). pygraphistry#1618 (PR #1623) then formalized NetworkX/SciPy optional dependency policy via networkx + networkx-scipy extras, graphistry.plugins.networkx.policy, and graphistry/plugins/networkx/DEVELOP.md.
The same pattern is worth applying to the other two graph backends pygraphistry ships against: igraph and cugraph. Both currently lag the NetworkX baseline on algorithm-collection completeness, optional-dependency version policy, and plugin-local maintainer documentation.
Current state inventory
igraph
- Surface:
to_igraph, from_igraph, compute_igraph, layout_igraph (graphistry/plugins/igraph.py)
- Algorithms: 28 in
compute_algs; commented-out candidates biconnected_components, bipartite_projection, community_leading_eigenvector_naive, modularity
- GFQL CALL surface: monolithic
compute_igraph(alg=...) dispatch via call/validation.py:599 safelist entry; no graphistry.ig.* local-Cypher CALL routes
- Version policy:
setup.py extras has 'igraph': ['igraph'] — no upper-bound, no lower-bound pin
- Version detection: bare
import igraph; no igraph.__version__ check or structured missing-feature guard
- Maintainer docs: none (no
graphistry/plugins/igraph/DEVELOP.md)
cugraph
- Surface:
to_cugraph, from_cugraph, compute_cugraph, compute_cugraph_core, layout_cugraph (graphistry/plugins/cugraph.py)
- Algorithms:
node_compute_algs_to_attr (betweenness/katz/louvain/pagerank/etc), edge_compute_algs_to_attr (edge betweenness etc), graph_compute_algs; has _coerce_and_retry_cugraph fallback
- GFQL CALL surface: monolithic
compute_cugraph(alg=...) dispatch via call/validation.py:584 safelist entry; no graphistry.cu.* local-Cypher CALL routes
- Version policy:
cugraph-cu12==24.12.* pinned inside the rapids extra; no standalone cugraph extras_require entry; no cugraph-cu11 / version-flexible alternative
- Version detection: bare
import cugraph; no cugraph.__version__ check or structured missing-feature guard; current saturation watch in pygraphistry#1058 plan calls RAPIDS 25.02 + 26.02 the supported smoke versions, which setup.py's rapids extra does not yet reflect
- Maintainer docs: none
Proposed scope
Mirroring the NetworkX precedent, deliver two coordinated tracks (can split into separate PRs if cleaner):
Track A — igraph
-
Algorithm collection updates:
- Audit the 4 commented-out algorithms; re-enable any that have stable igraph support in the supported version window
- Audit modern igraph (≥0.10) for newly-available algorithms worth surfacing (
global_efficiency, local_efficiency, assortativity_*, transitivity_*, etc); add the most commonly-requested ones
- Decide whether to add explicit
graphistry.ig.* local-Cypher CALL routes (analog of graphistry.nx.* from #1614) or keep the monolithic compute_igraph(alg=...) dispatch as the canonical interface — recommend the explicit-route pattern for discoverability, but verify it fits the existing surface
-
Version policy:
- Pin
igraph extra with explicit lower + upper bounds based on the supported algorithms (suggest igraph>=0.10,<1 — verify against current code)
- Add
graphistry.plugins.igraph.policy analog of graphistry.plugins.networkx.policy
- Add runtime version detection with structured missing-feature errors (fail-fast on unsupported version combos)
-
Plugin-local docs:
- Add
graphistry/plugins/igraph/DEVELOP.md with maintainer guidance for the algorithm/version surface
Track B — cugraph
-
Algorithm collection updates:
- Audit cugraph 24.12 and the supported smoke versions (RAPIDS 25.02 + 26.02) for algorithms not yet in
compute_cugraph's node_compute_algs_to_attr/edge_compute_algs_to_attr/graph_compute_algs maps
- Decide whether to add explicit
graphistry.cu.* local-Cypher CALL routes or keep monolithic dispatch (same call as Track A)
- Verify
_coerce_and_retry_cugraph graceful-fallback path still applies to new algorithms
-
Version policy:
- Add a standalone
cugraph extras_require entry (currently only ships via rapids) with explicit version-range support across CUDA stacks
- Update
rapids extra to reflect the supported RAPIDS 25.02 + 26.02 smoke versions per pygraphistry#1058 saturation watch
- Add
graphistry.plugins.cugraph.policy analog
- Add runtime version detection with structured missing-feature errors
-
Plugin-local docs:
- Add
graphistry/plugins/cugraph/DEVELOP.md with maintainer guidance for the algorithm/CUDA-version surface
Non-scope
- No changes to
compute_igraph(alg=...)/compute_cugraph(alg=...) public API shape — extensions only
- No changes to NetworkX surface from
#1614/#1618
- No GFQL implementation shrink (this is feature-parity work)
- No new graph backend additions (focused on existing igraph + cugraph surfaces)
- No removal of monolithic dispatch in favor of explicit routes — both can coexist
Acceptance
- igraph CALL surface gains algorithm-collection updates per Track A
- cugraph CALL surface gains algorithm-collection updates per Track B
- Both gain explicit version-policy extras with structured version-detection
- Both gain plugin-local
DEVELOP.md
- CI matrix validates both supported version bounds for each backend
- Compiler-plan surface untouched
- For cugraph track: DGX RAPIDS 25.02 + 26.02 cuDF smoke green pre-merge
- Anchored regression tests per new algorithm (mirror
#1614 test pattern)
Cross-refs
- NetworkX precedent:
pygraphistry#1614 (CALL parity), pygraphistry#1618/PR #1623 (version policy)
- Follow-on candidates that block on this:
pygraphistry#1619 (compute_networkx(...) regular Python API parity may want analogous compute_igraph(...)/compute_cugraph(...) API normalization)
- Metaissue:
pygraphistry#1058
- Coordination: tck-gfql may want to add scenario coverage for the new
graphistry.ig.*/graphistry.cu.* routes (analog of tck-gfql#183/#187 NetworkX smoke scenarios) — file separate tck-gfql follow-on after this lands
Background
pygraphistry#1614added explicit local Cyphergraphistry.nx.*CALL parity for 8 NetworkX algorithms (degree/closeness/eigenvector/katz/connected/strongly-connected/core_number/hits).pygraphistry#1618(PR #1623) then formalized NetworkX/SciPy optional dependency policy vianetworkx+networkx-scipyextras,graphistry.plugins.networkx.policy, andgraphistry/plugins/networkx/DEVELOP.md.The same pattern is worth applying to the other two graph backends pygraphistry ships against: igraph and cugraph. Both currently lag the NetworkX baseline on algorithm-collection completeness, optional-dependency version policy, and plugin-local maintainer documentation.
Current state inventory
igraph
to_igraph,from_igraph,compute_igraph,layout_igraph(graphistry/plugins/igraph.py)compute_algs; commented-out candidatesbiconnected_components,bipartite_projection,community_leading_eigenvector_naive,modularitycompute_igraph(alg=...)dispatch viacall/validation.py:599safelist entry; nographistry.ig.*local-Cypher CALL routessetup.pyextras has'igraph': ['igraph']— no upper-bound, no lower-bound pinimport igraph; noigraph.__version__check or structured missing-feature guardgraphistry/plugins/igraph/DEVELOP.md)cugraph
to_cugraph,from_cugraph,compute_cugraph,compute_cugraph_core,layout_cugraph(graphistry/plugins/cugraph.py)node_compute_algs_to_attr(betweenness/katz/louvain/pagerank/etc),edge_compute_algs_to_attr(edge betweenness etc),graph_compute_algs; has_coerce_and_retry_cugraphfallbackcompute_cugraph(alg=...)dispatch viacall/validation.py:584safelist entry; nographistry.cu.*local-Cypher CALL routescugraph-cu12==24.12.*pinned inside therapidsextra; no standalonecugraphextras_require entry; nocugraph-cu11/ version-flexible alternativeimport cugraph; nocugraph.__version__check or structured missing-feature guard; current saturation watch inpygraphistry#1058plan calls RAPIDS 25.02 + 26.02 the supported smoke versions, whichsetup.py'srapidsextra does not yet reflectProposed scope
Mirroring the NetworkX precedent, deliver two coordinated tracks (can split into separate PRs if cleaner):
Track A — igraph
Algorithm collection updates:
global_efficiency,local_efficiency,assortativity_*,transitivity_*, etc); add the most commonly-requested onesgraphistry.ig.*local-Cypher CALL routes (analog ofgraphistry.nx.*from#1614) or keep the monolithiccompute_igraph(alg=...)dispatch as the canonical interface — recommend the explicit-route pattern for discoverability, but verify it fits the existing surfaceVersion policy:
igraphextra with explicit lower + upper bounds based on the supported algorithms (suggestigraph>=0.10,<1— verify against current code)graphistry.plugins.igraph.policyanalog ofgraphistry.plugins.networkx.policyPlugin-local docs:
graphistry/plugins/igraph/DEVELOP.mdwith maintainer guidance for the algorithm/version surfaceTrack B — cugraph
Algorithm collection updates:
compute_cugraph'snode_compute_algs_to_attr/edge_compute_algs_to_attr/graph_compute_algsmapsgraphistry.cu.*local-Cypher CALL routes or keep monolithic dispatch (same call as Track A)_coerce_and_retry_cugraphgraceful-fallback path still applies to new algorithmsVersion policy:
cugraphextras_require entry (currently only ships viarapids) with explicit version-range support across CUDA stacksrapidsextra to reflect the supported RAPIDS 25.02 + 26.02 smoke versions perpygraphistry#1058saturation watchgraphistry.plugins.cugraph.policyanalogPlugin-local docs:
graphistry/plugins/cugraph/DEVELOP.mdwith maintainer guidance for the algorithm/CUDA-version surfaceNon-scope
compute_igraph(alg=...)/compute_cugraph(alg=...)public API shape — extensions only#1614/#1618Acceptance
DEVELOP.md#1614test pattern)Cross-refs
pygraphistry#1614(CALL parity),pygraphistry#1618/PR#1623(version policy)pygraphistry#1619(compute_networkx(...)regular Python API parity may want analogouscompute_igraph(...)/compute_cugraph(...)API normalization)pygraphistry#1058graphistry.ig.*/graphistry.cu.*routes (analog oftck-gfql#183/#187NetworkX smoke scenarios) — file separate tck-gfql follow-on after this lands