ai-station/.venv/lib/python3.12/site-packages/rustworkx/rustworkx.pyi

1637 lines
50 KiB
Python

# This code is licensed under the Apache License, Version 2.0. You may
# obtain a copy of this license in the LICENSE.txt file in the root directory
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
#
# Any modifications or derivative works of this code must retain this
# copyright notice, and modified files need to carry a notice indicating
# that they have been altered from the originals.
# This file contains only type annotations for PyO3 functions and classes
# For implementation details, see __init__.py and src/lib.rs
from .visit import BFSVisitor, DFSVisitor, DijkstraVisitor
from types import GenericAlias
from typing import (
Callable,
final,
Any,
Generic,
overload,
)
from collections.abc import (
Iterable,
Iterator,
Sequence,
ItemsView,
KeysView,
ValuesView,
Mapping,
Hashable,
)
from abc import ABC
from rustworkx import generators # noqa
import numpy as np
import numpy.typing as npt
import sys
if sys.version_info >= (3, 13):
from typing import TypeVar
else:
from typing_extensions import TypeVar
if sys.version_info >= (3, 11):
from typing import Self
else:
from typing_extensions import Self
_S = TypeVar("_S", default=Any)
_T = TypeVar("_T", default=Any)
class DAGHasCycle(Exception): ...
class DAGWouldCycle(Exception): ...
class InvalidNode(Exception): ...
class NoEdgeBetweenNodes(Exception): ...
class NoPathFound(Exception): ...
class NoSuitableNeighbors(Exception): ...
class NullGraph(Exception): ...
class NegativeCycle(Exception): ...
class JSONSerializationError(Exception): ...
class JSONDeserializationError(Exception): ...
class FailedToConverge(Exception): ...
class InvalidMapping(Exception): ...
class GraphNotBipartite(Exception): ...
@final
class ColoringStrategy:
Degree: Any
Saturation: Any
IndependentSet: Any
@final
class GraphMLDomain:
Node: GraphMLDomain
Edge: GraphMLDomain
Graph: GraphMLDomain
All: GraphMLDomain
@final
class GraphMLType:
Boolean: GraphMLType
Int: GraphMLType
Float: GraphMLType
Double: GraphMLType
String: GraphMLType
Long: GraphMLType
@final
class GraphMLKey:
id: str
domain: GraphMLDomain
name: str
ty: GraphMLType
default: Any
# Cartesian product
def digraph_cartesian_product(
first: PyDiGraph,
second: PyDiGraph,
/,
) -> tuple[PyDiGraph, ProductNodeMap]: ...
def graph_cartesian_product(
first: PyGraph,
second: PyGraph,
/,
) -> tuple[PyGraph, ProductNodeMap]: ...
# Centrality
def digraph_eigenvector_centrality(
graph: PyDiGraph[_S, _T],
/,
weight_fn: Callable[[_T], float] | None = ...,
default_weight: float = ...,
max_iter: int = ...,
tol: float = ...,
) -> CentralityMapping: ...
def graph_eigenvector_centrality(
graph: PyGraph[_S, _T],
/,
weight_fn: Callable[[_T], float] | None = ...,
default_weight: float = ...,
max_iter: int = ...,
tol: float = ...,
) -> CentralityMapping: ...
def digraph_betweenness_centrality(
graph: PyDiGraph[_S, _T],
/,
normalized: bool = ...,
endpoints: bool = ...,
parallel_threshold: int = ...,
) -> CentralityMapping: ...
def graph_betweenness_centrality(
graph: PyGraph[_S, _T],
/,
normalized: bool = ...,
endpoints: bool = ...,
parallel_threshold: int = ...,
) -> CentralityMapping: ...
def digraph_edge_betweenness_centrality(
graph: PyDiGraph[_S, _T],
/,
normalized: bool = ...,
parallel_threshold: int = ...,
) -> EdgeCentralityMapping: ...
def graph_edge_betweenness_centrality(
graph: PyGraph[_S, _T],
/,
normalized: bool = ...,
parallel_threshold: int = ...,
) -> EdgeCentralityMapping: ...
def digraph_closeness_centrality(
graph: PyDiGraph[_S, _T],
wf_improved: bool = ...,
parallel_threshold: int = ...,
) -> CentralityMapping: ...
def graph_closeness_centrality(
graph: PyGraph[_S, _T],
wf_improved: bool = ...,
parallel_threshold: int = ...,
) -> CentralityMapping: ...
def digraph_newman_weighted_closeness_centrality(
graph: PyDiGraph[_S, _T],
weight_fn: Callable[[_T], float] | None = ...,
wf_improved: bool = ...,
default_weight: float = ...,
parallel_threshold: int = ...,
) -> CentralityMapping: ...
def graph_newman_weighted_closeness_centrality(
graph: PyGraph[_S, _T],
weight_fn: Callable[[_T], float] | None = ...,
wf_improved: bool = ...,
default_weight: float = ...,
parallel_threshold: int = ...,
) -> CentralityMapping: ...
def digraph_degree_centrality(
graph: PyDiGraph[_S, _T],
/,
) -> CentralityMapping: ...
def in_degree_centrality(
graph: PyDiGraph[_S, _T],
/,
) -> CentralityMapping: ...
def out_degree_centrality(
graph: PyDiGraph[_S, _T],
/,
) -> CentralityMapping: ...
def graph_degree_centrality(
graph: PyGraph[_S, _T],
/,
) -> CentralityMapping: ...
def digraph_katz_centrality(
graph: PyDiGraph[_S, _T],
/,
alpha: float | None = ...,
beta: float | None = ...,
weight_fn: Callable[[_T], float] | None = ...,
default_weight: float | None = ...,
max_iter: int | None = ...,
tol: float | None = ...,
) -> CentralityMapping: ...
def graph_katz_centrality(
graph: PyGraph[_S, _T],
/,
alpha: float | None = ...,
beta: float | None = ...,
weight_fn: Callable[[_T], float] | None = ...,
default_weight: float | None = ...,
max_iter: int | None = ...,
tol: float | None = ...,
) -> CentralityMapping: ...
# Coloring
def graph_greedy_color(
graph: PyGraph,
/,
preset_color_fn: Callable[[int], int | None] | None = ...,
strategy: int = ...,
) -> dict[int, int]: ...
def graph_greedy_edge_color(
graph: PyGraph,
/,
preset_color_fn: Callable[[int], int | None] | None = ...,
strategy: int = ...,
) -> dict[int, int]: ...
def graph_is_bipartite(graph: PyGraph) -> bool: ...
def digraph_is_bipartite(graph: PyDiGraph) -> bool: ...
def graph_two_color(graph: PyGraph) -> dict[int, int]: ...
def digraph_two_color(graph: PyDiGraph) -> dict[int, int]: ...
def graph_misra_gries_edge_color(graph: PyGraph, /) -> dict[int, int]: ...
def graph_bipartite_edge_color(graph: PyGraph, /) -> dict[int, int]: ...
# Connectivity
def connected_components(graph: PyGraph, /) -> list[set[int]]: ...
def is_connected(graph: PyGraph, /) -> bool: ...
def is_strongly_connected(graph: PyDiGraph, /) -> bool: ...
def is_weakly_connected(graph: PyDiGraph, /) -> bool: ...
def is_semi_connected(graph: PyDiGraph, /) -> bool: ...
def number_connected_components(graph: PyGraph, /) -> int: ...
def number_strongly_connected_components(graph: PyDiGraph, /) -> int: ...
def number_weakly_connected_components(graph: PyDiGraph, /) -> int: ...
def node_connected_component(graph: PyGraph, node: int, /) -> set[int]: ...
def strongly_connected_components(graph: PyDiGraph, /) -> list[list[int]]: ...
def digraph_condensation(graph: PyDiGraph, /, sccs: list[int] | None = ...) -> PyDiGraph: ...
def graph_condensation(graph: PyDiGraph, /) -> PyGraph: ...
def weakly_connected_components(graph: PyDiGraph, /) -> list[set[int]]: ...
def digraph_adjacency_matrix(
graph: PyDiGraph[_S, _T],
/,
weight_fn: Callable[[_T], float] | None = ...,
default_weight: float = ...,
null_value: float = ...,
parallel_edge: str = ...,
) -> npt.NDArray[np.float64]: ...
def graph_adjacency_matrix(
graph: PyGraph[_S, _T],
/,
weight_fn: Callable[[_T], float] | None = ...,
default_weight: float = ...,
null_value: float = ...,
parallel_edge: str = ...,
) -> npt.NDArray[np.float64]: ...
def cycle_basis(graph: PyGraph, /, root: int | None = ...) -> list[list[int]]: ...
def articulation_points(graph: PyGraph, /) -> set[int]: ...
def bridges(graph: PyGraph, /) -> set[tuple[int]]: ...
def biconnected_components(graph: PyGraph, /) -> BiconnectedComponents: ...
def chain_decomposition(graph: PyGraph, /, source: int | None = ...) -> Chains: ...
def digraph_find_cycle(
graph: PyDiGraph[_S, _T],
/,
source: int | None = ...,
) -> EdgeList: ...
def digraph_complement(graph: PyDiGraph[_S, _T], /) -> PyDiGraph[_S, _T | None]: ...
def graph_complement(
graph: PyGraph[_S, _T],
/,
) -> PyGraph[_S, _T | None]: ...
def local_complement(
graph: PyGraph[_S, _T],
node: int,
/,
) -> PyGraph[_S, _T | None]: ...
def digraph_all_simple_paths(
graph: PyDiGraph,
origin: int,
to: int | Iterable[int],
/,
min_depth: int | None = ...,
cutoff: int | None = ...,
) -> list[list[int]]: ...
def graph_all_simple_paths(
graph: PyGraph,
origin: int,
to: int | Iterable[int],
/,
min_depth: int | None = ...,
cutoff: int | None = ...,
) -> list[list[int]]: ...
def digraph_all_pairs_all_simple_paths(
graph: PyDiGraph,
/,
min_depth: int | None = ...,
cutoff: int | None = ...,
) -> AllPairsMultiplePathMapping: ...
def graph_all_pairs_all_simple_paths(
graph: PyGraph,
/,
min_depth: int | None = ...,
cutoff: int | None = ...,
) -> AllPairsMultiplePathMapping: ...
def digraph_longest_simple_path(graph: PyDiGraph, /) -> NodeIndices | None: ...
def graph_longest_simple_path(graph: PyGraph, /) -> NodeIndices | None: ...
def digraph_core_number(
graph: PyDiGraph,
/,
) -> int: ...
def graph_core_number(
graph: PyGraph,
/,
) -> int: ...
def stoer_wagner_min_cut(
graph: PyGraph[_S, _T],
/,
weight_fn: Callable[[_T], float] | None = ...,
) -> tuple[float, NodeIndices] | None: ...
def simple_cycles(graph: PyDiGraph, /) -> Iterator[NodeIndices]: ...
def graph_isolates(graph: PyGraph) -> NodeIndices: ...
def digraph_isolates(graph: PyDiGraph) -> NodeIndices: ...
def connected_subgraphs(graph: PyGraph, k: int, /) -> list[list[int]]: ...
# DAG Algorithms
def collect_runs(
graph: PyDiGraph[_S, _T],
filter_fn: Callable[[_S], bool],
) -> list[list[_S]]: ...
def collect_bicolor_runs(
graph: PyDiGraph[_S, _T],
filter_fn: Callable[[_S], bool],
color_fn: Callable[[_T], int],
) -> list[list[_S]]: ...
def dag_longest_path(
graph: PyDiGraph[_S, _T], /, weight_fn: Callable[[int, int, _T], int] | None = ...
) -> NodeIndices: ...
def dag_longest_path_length(
graph: PyDiGraph[_S, _T], /, weight_fn: Callable[[int, int, _T], int] | None = ...
) -> int: ...
def dag_weighted_longest_path(
graph: PyDiGraph[_S, _T],
weight_fn: Callable[[int, int, _T], float],
/,
) -> NodeIndices: ...
def dag_weighted_longest_path_length(
graph: PyDiGraph[_S, _T],
weight_fn: Callable[[int, int, _T], float],
/,
) -> float: ...
def is_directed_acyclic_graph(graph: PyDiGraph, /) -> bool: ...
def topological_sort(graph: PyDiGraph, /) -> NodeIndices: ...
def topological_generations(dag: PyDiGraph, /) -> list[NodeIndices]: ...
def lexicographical_topological_sort(
dag: PyDiGraph[_S, _T],
/,
key: Callable[[_S], str],
*,
reverse: bool = ...,
initial: Iterable[int] | None = ...,
) -> list[_S]: ...
def transitive_reduction(graph: PyDiGraph, /) -> tuple[PyDiGraph, dict[int, int]]: ...
def layers(
dag: PyDiGraph[_S, _T],
first_layer: list[int],
/,
index_output: bool = ...,
) -> list[list[_S]] | list[list[int]]: ...
@final
class TopologicalSorter:
def __init__(
self,
dag: PyDiGraph,
/,
check_cycle: bool,
*,
reverse: bool = ...,
initial: Iterable[int] | None = ...,
check_args: bool = ...,
) -> None: ...
def is_active(self) -> bool: ...
def get_ready(self) -> list[int]: ...
def done(self, nodes: int | Sequence[int]) -> None: ...
# isomorphism
def digraph_is_isomorphic(
first: PyDiGraph[_S, _T],
second: PyDiGraph[_S, _T],
/,
node_matcher: Callable[[_S, _S], bool] | None = ...,
edge_matcher: Callable[[_T, _T], bool] | None = ...,
id_order: bool = ...,
call_limit: int | None = ...,
) -> bool: ...
def graph_is_isomorphic(
first: PyGraph[_S, _T],
second: PyGraph[_S, _T],
/,
node_matcher: Callable[[_S, _S], bool] | None = ...,
edge_matcher: Callable[[_T, _T], bool] | None = ...,
id_order: bool = ...,
call_limit: int | None = ...,
) -> bool: ...
def digraph_is_subgraph_isomorphic(
first: PyDiGraph[_S, _T],
second: PyDiGraph[_S, _T],
/,
node_matcher: Callable[[_S, _S], bool] | None = ...,
edge_matcher: Callable[[_T, _T], bool] | None = ...,
id_order: bool = ...,
induced: bool = ...,
call_limit: int | None = ...,
) -> bool: ...
def graph_is_subgraph_isomorphic(
first: PyGraph[_S, _T],
second: PyGraph[_S, _T],
/,
node_matcher: Callable[[_S, _S], bool] | None = ...,
edge_matcher: Callable[[_T, _T], bool] | None = ...,
id_order: bool = ...,
induced: bool = ...,
call_limit: int | None = ...,
) -> bool: ...
def digraph_vf2_mapping(
first: PyDiGraph[_S, _T],
second: PyDiGraph[_S, _T],
/,
node_matcher: Callable[[_S, _S], bool] | None = ...,
edge_matcher: Callable[[_T, _T], bool] | None = ...,
id_order: bool = ...,
subgraph: bool = ...,
induced: bool = ...,
call_limit: int | None = ...,
) -> Iterator[NodeMap]: ...
def graph_vf2_mapping(
first: PyGraph[_S, _T],
second: PyGraph[_S, _T],
/,
node_matcher: Callable[[_S, _S], bool] | None = ...,
edge_matcher: Callable[[_T, _T], bool] | None = ...,
id_order: bool = ...,
subgraph: bool = ...,
induced: bool = ...,
call_limit: int | None = ...,
) -> Iterator[NodeMap]: ...
# Layout
def digraph_bipartite_layout(
graph: PyDiGraph,
first_nodes: set[int],
/,
horizontal: bool | None = ...,
scale: float | None = ...,
center: tuple[float, float] | None = ...,
aspect_ratio: float | None = ...,
) -> Pos2DMapping: ...
def graph_bipartite_layout(
graph: PyGraph,
first_nodes: set[int],
/,
horizontal: bool | None = ...,
scale: float | None = ...,
center: tuple[float, float] | None = ...,
aspect_ratio: float | None = ...,
) -> Pos2DMapping: ...
def digraph_circular_layout(
graph: PyDiGraph,
/,
scale: float | None = ...,
center: tuple[float, float] | None = ...,
) -> Pos2DMapping: ...
def graph_circular_layout(
graph: PyGraph,
/,
scale: float | None = ...,
center: tuple[float, float] | None = ...,
) -> Pos2DMapping: ...
def digraph_random_layout(
graph: PyDiGraph,
/,
center: tuple[float, float] | None = ...,
seed: int | None = ...,
) -> Pos2DMapping: ...
def graph_random_layout(
graph: PyGraph,
/,
center: tuple[float, float] | None = ...,
seed: int | None = ...,
) -> Pos2DMapping: ...
def digraph_shell_layout(
graph: PyDiGraph,
/,
nlist: list[list[int]] | None = ...,
rotate: float | None = ...,
scale: float | None = ...,
center: tuple[float, float] | None = ...,
) -> Pos2DMapping: ...
def graph_shell_layout(
graph: PyGraph,
/,
nlist: list[list[int]] | None = ...,
rotate: float | None = ...,
scale: float | None = ...,
center: tuple[float, float] | None = ...,
) -> Pos2DMapping: ...
def digraph_spiral_layout(
graph: PyDiGraph,
/,
scale: float | None = ...,
center: tuple[float, float] | None = ...,
resolution: float | None = ...,
equidistant: bool | None = ...,
) -> Pos2DMapping: ...
def graph_spiral_layout(
graph: PyGraph,
/,
scale: float | None = ...,
center: tuple[float, float] | None = ...,
resolution: float | None = ...,
equidistant: bool | None = ...,
) -> Pos2DMapping: ...
def digraph_spring_layout(
graph: PyDiGraph[_S, _T],
pos: dict[int, tuple[float, float]] | None = ...,
fixed: set[int] | None = ...,
k: float | None = ...,
repulsive_exponent: int = ...,
adaptive_cooling: bool = ...,
num_iter: int = ...,
tol: float | None = ...,
weight_fn: Callable[[_T], float] | None = ...,
default_weight: float = ...,
scale: float = ...,
center: tuple[float, float] | None = ...,
seed: int | None = ...,
/,
) -> Pos2DMapping: ...
def graph_spring_layout(
graph: PyGraph[_S, _T],
pos: dict[int, tuple[float, float]] | None = ...,
fixed: set[int] | None = ...,
k: float | None = ...,
repulsive_exponent: int = ...,
adaptive_cooling: bool = ...,
num_iter: int = ...,
tol: float | None = ...,
weight_fn: Callable[[_T], float] | None = ...,
default_weight: float = ...,
scale: float = ...,
center: tuple[float, float] | None = ...,
seed: int | None = ...,
/,
) -> Pos2DMapping: ...
# Line graph
def graph_line_graph(graph: PyGraph, /) -> tuple[PyGraph, dict[int, int]]: ...
# Link Analysis
def hits(
graph: PyDiGraph[_S, _T],
/,
weight_fn: Callable[[_T], float] | None = ...,
nstart: dict[int, float] | None = ...,
tol: float | None = ...,
max_iter: int | None = ...,
normalized: bool | None = ...,
) -> tuple[CentralityMapping, CentralityMapping]: ...
def pagerank(
graph: PyDiGraph[_S, _T],
/,
alpha: float | None = ...,
weight_fn: Callable[[_T], float] | None = ...,
nstart: dict[int, float] | None = ...,
personalization: dict[int, float] | None = ...,
tol: float | None = ...,
max_iter: int | None = ...,
dangling: dict[int, float] | None = ...,
) -> CentralityMapping: ...
# Matching
def max_weight_matching(
graph: PyGraph[_S, _T],
/,
max_cardinality: bool = ...,
weight_fn: Callable[[_T], float] | None = ...,
default_weight: int = ...,
verify_optimum: bool = ...,
) -> set[tuple[int, int]]: ...
def is_matching(
graph: PyGraph,
matching: set[tuple[int, int]],
/,
) -> bool: ...
def is_maximal_matching(
graph: PyGraph,
matching: set[tuple[int, int]],
/,
) -> bool: ...
# Maximum Bisimulation
def digraph_maximum_bisimulation(graph: PyDiGraph) -> RelationalCoarsestPartition: ...
# Planar
def is_planar(graph: PyGraph, /) -> bool: ...
# Random Graph
def directed_gnm_random_graph(
num_nodes: int,
num_edges: int,
/,
seed: int | None = ...,
) -> PyDiGraph: ...
def undirected_gnm_random_graph(
num_nodes: int,
num_edges: int,
/,
seed: int | None = ...,
) -> PyGraph: ...
def directed_gnp_random_graph(
num_nodes: int,
probability: float,
/,
seed: int | None = ...,
) -> PyDiGraph: ...
def undirected_gnp_random_graph(
num_nodes: int,
probability: float,
/,
seed: int | None = ...,
) -> PyGraph: ...
def directed_sbm_random_graph(
sizes: list[int],
probabilities: npt.NDArray[np.float64],
loops: bool,
/,
seed: int | None = ...,
) -> PyDiGraph: ...
def undirected_sbm_random_graph(
sizes: list[int],
probabilities: npt.NDArray[np.float64],
loops: bool,
/,
seed: int | None = ...,
) -> PyGraph: ...
def random_geometric_graph(
num_nodes: int,
radius: float,
/,
dim: int = ...,
pos: list[list[float]] | None = ...,
p: float = ...,
seed: int | None = ...,
) -> PyGraph: ...
def hyperbolic_random_graph(
pos: list[list[float]],
r: float,
beta: float | None,
/,
seed: int | None = ...,
) -> PyGraph: ...
def barabasi_albert_graph(
n: int,
m: int,
seed: int | None = ...,
initial_graph: PyGraph | None = ...,
) -> PyGraph: ...
def directed_barabasi_albert_graph(
n: int,
m: int,
seed: int | None = ...,
initial_graph: PyDiGraph | None = ...,
) -> PyDiGraph: ...
def undirected_random_bipartite_graph(
num_l_nodes: int,
num_r_nodes: int,
probability: float,
/,
seed: int | None = ...,
) -> PyGraph: ...
def directed_random_bipartite_graph(
num_l_nodes: int,
num_r_nodes: int,
probability: float,
/,
seed: int | None = ...,
) -> PyDiGraph: ...
# Read Write
def read_graphml(
path: str,
/,
compression: str | None = ...,
) -> list[PyGraph | PyDiGraph]: ...
def graph_write_graphml(
graph: PyGraph,
path: str,
/,
keys: list[GraphMLKey] | None = ...,
compression: str | None = ...,
) -> None: ...
def digraph_write_graphml(
graph: PyDiGraph,
path: str,
/,
keys: list[GraphMLKey] | None = ...,
compression: str | None = ...,
) -> None: ...
def digraph_node_link_json(
graph: PyDiGraph[_S, _T],
/,
path: str | None = ...,
graph_attrs: Callable[[Any], dict[str, str]] | None = ...,
node_attrs: Callable[[_S], dict[str, str]] | None = ...,
edge_attrs: Callable[[_T], dict[str, str]] | None = ...,
) -> str | None: ...
def graph_node_link_json(
graph: PyGraph[_S, _T],
/,
path: str | None = ...,
graph_attrs: Callable[[Any], dict[str, str]] | None = ...,
node_attrs: Callable[[_S], dict[str, str]] | None = ...,
edge_attrs: Callable[[_T], dict[str, str]] | None = ...,
) -> str | None: ...
def parse_node_link_json(
data: str,
graph_attrs: Callable[[dict[str, str]], Any] | None = ...,
node_attrs: Callable[[dict[str, str]], _S] | None = ...,
edge_attrs: Callable[[dict[str, str]], _T] | None = ...,
) -> PyDiGraph[_S, _T] | PyGraph[_S, _T]: ...
def from_node_link_json_file(
path: str,
graph_attrs: Callable[[dict[str, str]], Any] | None = ...,
node_attrs: Callable[[dict[str, str]], _S] | None = ...,
edge_attrs: Callable[[dict[str, str]], _T] | None = ...,
) -> PyDiGraph[_S, _T] | PyGraph[_S, _T]: ...
# Shortest Path
def digraph_bellman_ford_shortest_paths(
graph: PyDiGraph[_S, _T],
source: int,
/,
target: int | None = ...,
weight_fn: Callable[[_T], float] | None = ...,
default_weight: float = ...,
as_undirected: bool = ...,
) -> PathMapping: ...
def graph_bellman_ford_shortest_paths(
graph: PyDiGraph[_S, _T],
source: int,
/,
target: int | None = ...,
weight_fn: Callable[[_T], float] | None = ...,
default_weight: float = ...,
) -> PathMapping: ...
def digraph_bellman_ford_shortest_path_lengths(
graph: PyDiGraph[_S, _T],
node: int,
edge_cost_fn: Callable[[_T], float] | None,
/,
goal: int | None = ...,
) -> PathLengthMapping: ...
def graph_bellman_ford_shortest_path_lengths(
graph: PyGraph[_S, _T],
node: int,
edge_cost_fn: Callable[[_T], float] | None,
/,
goal: int | None = ...,
) -> PathLengthMapping: ...
def digraph_dijkstra_shortest_paths(
graph: PyDiGraph[_S, _T],
source: int,
/,
target: int | None,
weight_fn: Callable[[_T], float] | None = ...,
default_weight: float = ...,
as_undirected: bool = ...,
) -> PathMapping: ...
def graph_dijkstra_shortest_paths(
graph: PyDiGraph[_S, _T],
source: int,
/,
target: int | None,
weight_fn: Callable[[_T], float] | None = ...,
default_weight: float = ...,
) -> PathMapping: ...
def digraph_dijkstra_shortest_path_lengths(
graph: PyDiGraph[_S, _T],
node: int,
edge_cost_fn: Callable[[_T], float] | None,
/,
goal: int | None = ...,
) -> PathLengthMapping: ...
def graph_dijkstra_shortest_path_lengths(
graph: PyGraph[_S, _T],
node: int,
edge_cost_fn: Callable[[_T], float] | None,
/,
goal: int | None = ...,
) -> PathLengthMapping: ...
def digraph_all_pairs_bellman_ford_path_lengths(
graph: PyDiGraph[_S, _T],
edge_cost: Callable[[_T], float],
/,
) -> AllPairsPathLengthMapping: ...
def graph_all_pairs_bellman_ford_path_lengths(
graph: PyGraph[_S, _T],
edge_cost: Callable[[_T], float],
/,
) -> AllPairsPathLengthMapping: ...
def digraph_all_pairs_bellman_ford_shortest_paths(
graph: PyDiGraph[_S, _T],
edge_cost: Callable[[_T], float],
/,
) -> AllPairsPathMapping: ...
def graph_all_pairs_bellman_ford_shortest_paths(
graph: PyDiGraph[_S, _T],
edge_cost: Callable[[_T], float],
/,
) -> AllPairsPathMapping: ...
def digraph_all_pairs_dijkstra_path_lengths(
graph: PyDiGraph[_S, _T],
edge_cost: Callable[[_T], float],
/,
) -> AllPairsPathLengthMapping: ...
def graph_all_pairs_dijkstra_path_lengths(
graph: PyGraph[_S, _T],
edge_cost: Callable[[_T], float],
/,
) -> AllPairsPathLengthMapping: ...
def digraph_all_pairs_dijkstra_shortest_paths(
graph: PyDiGraph[_S, _T],
edge_cost: Callable[[_T], float],
/,
) -> AllPairsPathMapping: ...
def graph_all_pairs_dijkstra_shortest_paths(
graph: PyDiGraph[_S, _T],
edge_cost: Callable[[_T], float],
/,
) -> AllPairsPathMapping: ...
def digraph_astar_shortest_path(
graph: PyDiGraph[_S, _T],
node: int,
goal_fn: Callable[[_S], bool],
edge_cost_fn: Callable[[_T], float],
estimate_cost_fn: Callable[[_S], float],
/,
) -> NodeIndices: ...
def graph_astar_shortest_path(
graph: PyGraph[_S, _T],
node: int,
goal_fn: Callable[[_S], bool],
edge_cost_fn: Callable[[_T], float],
estimate_cost_fn: Callable[[_S], float],
/,
) -> NodeIndices: ...
def digraph_k_shortest_path_lengths(
graph: PyDiGraph[_S, _T],
start: int,
k: int,
edge_cost: Callable[[_T], float],
/,
goal: int | None = ...,
) -> PathLengthMapping: ...
def graph_k_shortest_path_lengths(
graph: PyGraph[_S, _T],
start: int,
k: int,
edge_cost: Callable[[_T], float],
/,
goal: int | None = ...,
) -> PathLengthMapping: ...
def digraph_has_path(
graph: PyDiGraph,
source: int,
target: int,
/,
as_undirected: bool | None = ...,
) -> bool: ...
def graph_has_path(
graph: PyGraph,
source: int,
target: int,
) -> bool: ...
def digraph_num_shortest_paths_unweighted(
graph: PyDiGraph,
source: int,
/,
) -> NodesCountMapping: ...
def graph_num_shortest_paths_unweighted(
graph: PyGraph,
source: int,
/,
) -> NodesCountMapping: ...
def digraph_unweighted_average_shortest_path_length(
graph: PyDiGraph,
/,
parallel_threshold: int | None = ...,
as_undirected: bool | None = ...,
disconnected: bool | None = ...,
) -> float: ...
def graph_unweighted_average_shortest_path_length(
graph: PyGraph,
/,
parallel_threshold: int | None = ...,
disconnected: bool | None = ...,
) -> float: ...
def digraph_distance_matrix(
graph: PyDiGraph,
/,
parallel_threshold: int | None = ...,
as_undirected: bool | None = ...,
null_value: float | None = ...,
) -> npt.NDArray[np.float64]: ...
def graph_distance_matrix(
graph: PyGraph,
/,
parallel_threshold: int | None = ...,
null_value: float | None = ...,
) -> npt.NDArray[np.float64]: ...
def digraph_floyd_warshall(
graph: PyDiGraph[_S, _T],
/,
weight_fn: Callable[[_T], float] | None = ...,
as_undirected: bool | None = ...,
default_weight: float | None = ...,
parallel_threshold: int | None = ...,
) -> AllPairsPathLengthMapping: ...
def graph_floyd_warshall(
graph: PyGraph[_S, _T],
/,
weight_fn: Callable[[_T], float] | None = ...,
default_weight: float | None = ...,
parallel_threshold: int | None = ...,
) -> AllPairsPathLengthMapping: ...
def digraph_floyd_warshall_numpy(
graph: PyDiGraph[_S, _T],
/,
weight_fn: Callable[[_T], float] | None = ...,
as_undirected: bool | None = ...,
default_weight: float | None = ...,
parallel_threshold: int | None = ...,
) -> npt.NDArray[np.float64]: ...
def graph_floyd_warshall_numpy(
graph: PyGraph[_S, _T],
/,
weight_fn: Callable[[_T], float] | None = ...,
default_weight: float | None = ...,
parallel_threshold: int | None = ...,
) -> npt.NDArray[np.float64]: ...
def digraph_floyd_warshall_successor_and_distance(
graph: PyDiGraph[_S, _T],
/,
weight_fn: Callable[[_T], float] | None = ...,
as_undirected: bool | None = ...,
default_weight: float | None = ...,
parallel_threshold: int | None = ...,
) -> tuple[npt.NDArray[np.float64], npt.NDArray[np.float64]]: ...
def graph_floyd_warshall_successor_and_distance(
graph: PyGraph[_S, _T],
/,
weight_fn: Callable[[_T], float] | None = ...,
default_weight: float | None = ...,
parallel_threshold: int | None = ...,
) -> tuple[npt.NDArray[np.float64], npt.NDArray[np.float64]]: ...
def find_negative_cycle(
graph: PyDiGraph[_S, _T],
edge_cost_fn: Callable[[_T], float],
/,
) -> NodeIndices: ...
def negative_edge_cycle(
graph: PyDiGraph[_S, _T],
edge_cost_fn: Callable[[_T], float],
/,
) -> bool: ...
def digraph_all_shortest_paths(
graph: PyDiGraph[_S, _T],
source: int,
target: int,
/,
weight_fn: Callable[[_T], float] | None = ...,
default_weight: float = ...,
as_undirected: bool = ...,
) -> list[list[int]]: ...
def graph_all_shortest_paths(
graph: PyGraph[_S, _T],
source: int,
target: int,
/,
weight_fn: Callable[[_T], float] | None = ...,
default_weight: float = ...,
) -> list[list[int]]: ...
def graph_single_source_all_shortest_paths(
graph: PyGraph[_S, _T],
source: int,
/,
weight_fn: Callable[[_T], float] | None = ...,
default_weight: float = 1.0,
) -> dict[int, list[list[int]]]: ...
def digraph_single_source_all_shortest_paths(
graph: PyDiGraph[_S, _T],
source: int,
/,
weight_fn: Callable[[_T], float] | None = ...,
default_weight: float = 1.0,
as_undirected: bool = False,
) -> dict[int, list[list[int]]]: ...
# Tensor Product
def digraph_tensor_product(
first: PyDiGraph,
second: PyDiGraph,
/,
) -> tuple[PyDiGraph, ProductNodeMap]: ...
def graph_tensor_product(
first: PyGraph,
second: PyGraph,
/,
) -> tuple[PyGraph, ProductNodeMap]: ...
# Token Swapper
def graph_token_swapper(
graph: PyGraph,
mapping: dict[int, int],
/,
trials: int | None = ...,
seed: int | None = ...,
parallel_threshold: int | None = ...,
) -> EdgeList: ...
# Transitivity
def digraph_transitivity(graph: PyDiGraph, /) -> float: ...
def graph_transitivity(graph: PyGraph, /) -> float: ...
# Traversal
_BFSVisitor = TypeVar("_BFSVisitor", bound=BFSVisitor, default=BFSVisitor)
_DFSVisitor = TypeVar("_DFSVisitor", bound=DFSVisitor, default=DFSVisitor)
_DijkstraVisitor = TypeVar("_DijkstraVisitor", bound=DijkstraVisitor, default=DijkstraVisitor)
def digraph_bfs_search(
graph: PyDiGraph,
source: Sequence[int] | None = ...,
visitor: _BFSVisitor | None = ...,
) -> None: ...
def graph_bfs_search(
graph: PyGraph,
source: Sequence[int] | None = ...,
visitor: _BFSVisitor | None = ...,
) -> None: ...
def digraph_dfs_search(
graph: PyDiGraph,
source: Sequence[int] | None = ...,
visitor: _DFSVisitor | None = ...,
) -> None: ...
def graph_dfs_search(
graph: PyGraph,
source: Sequence[int] | None = ...,
visitor: _DFSVisitor | None = ...,
) -> None: ...
def digraph_dijkstra_search(
graph: PyDiGraph,
source: Sequence[int] | None = ...,
weight_fn: Callable[[Any], float] | None = ...,
visitor: _DijkstraVisitor | None = ...,
) -> None: ...
def graph_dijkstra_search(
graph: PyGraph,
source: Sequence[int] | None = ...,
weight_fn: Callable[[Any], float] | None = ...,
visitor: _DijkstraVisitor | None = ...,
) -> None: ...
def digraph_dfs_edges(graph: PyDiGraph[_S, _T], /, source: int | None = ...) -> EdgeList: ...
def graph_dfs_edges(graph: PyGraph[_S, _T], /, source: int | None = ...) -> EdgeList: ...
def ancestors(graph: PyDiGraph, node: int, /) -> set[int]: ...
def bfs_predecessors(graph: PyDiGraph, node: int, /) -> BFSPredecessors: ...
def bfs_successors(graph: PyDiGraph, node: int, /) -> BFSSuccessors: ...
def descendants(graph: PyDiGraph, node: int, /) -> set[int]: ...
# Tree
def minimum_spanning_edges(
graph: PyGraph[_S, _T],
weight_fn: Callable[[_T], float] | None = ...,
default_weight: float = ...,
) -> WeightedEdgeList: ...
def minimum_spanning_tree(
graph: PyGraph[_S, _T],
weight_fn: Callable[[_T], float] | None = ...,
default_weight: float = ...,
) -> PyGraph[_S, _T]: ...
def steiner_tree(
graph: PyGraph[_S, _T],
terminal_nodes: list[int],
weight_fn: Callable[[_T], float],
/,
) -> PyGraph[_S, _T]: ...
def metric_closure(
graph: PyGraph[_S, _T],
weight_fn: Callable[[_T], float],
/,
) -> PyGraph: ...
# Union
def digraph_union(
first: PyDiGraph[_S, _T],
second: PyDiGraph[_S, _T],
/,
merge_nodes: bool = ...,
merge_edges: bool = ...,
) -> PyDiGraph[_S, _T]: ...
def graph_union(
first: PyGraph[_S, _T],
second: PyGraph[_S, _T],
/,
merge_nodes: bool = ...,
merge_edges: bool = ...,
) -> PyGraph[_S, _T]: ...
# Dominance
def immediate_dominators(graph: PyDiGraph[_S, _T], start_node: int, /) -> dict[int, int]: ...
def dominance_frontiers(graph: PyDiGraph[_S, _T], start_node: int, /) -> dict[int, set[int]]: ...
# Iterators
_T_co = TypeVar("_T_co", covariant=True, default=Any)
class _RustworkxCustomVecIter(Generic[_T_co], Sequence[_T_co], ABC):
def __init__(self) -> None: ...
def __eq__(self, other: object) -> bool: ...
@overload
def __getitem__(self, index: int) -> _T_co: ...
@overload
def __getitem__(self: Self, index: slice) -> Self: ...
def __getstate__(self) -> Any: ...
def __hash__(self) -> int: ...
def __len__(self) -> int: ...
def __ne__(self, other: object) -> bool: ...
def __setstate__(self, state: Sequence[_T_co]) -> None: ...
def __array__(
self, dtype: np.dtype[Any] | None = ..., copy: bool | None = ...
) -> npt.NDArray[Any]: ...
def __iter__(self) -> Iterator[_T_co]: ...
def __reversed__(self) -> Iterator[_T_co]: ...
class _RustworkxCustomHashMapIter(Generic[_S, _T_co], Mapping[_S, _T_co], ABC):
def __init__(self) -> None: ...
def items(self) -> ItemsView[_S, _T_co]: ...
def keys(self) -> KeysView[_S]: ...
def values(self) -> ValuesView[_T_co]: ...
def __contains__(self, other: object) -> bool: ...
def __eq__(self, other: object) -> bool: ...
def __getitem__(self, index: _S) -> _T_co: ...
def __getstate__(self) -> Any: ...
def __hash__(self) -> int: ...
def __iter__(self) -> Iterator[_S]: ...
def __len__(self) -> int: ...
def __ne__(self, other: object) -> bool: ...
def __setstate__(self, state: Mapping[_S, _T_co]) -> None: ...
@final
class NodeIndices(_RustworkxCustomVecIter[int]): ...
@final
class PathLengthMapping(_RustworkxCustomHashMapIter[int, float]): ...
@final
class PathMapping(_RustworkxCustomHashMapIter[int, NodeIndices]): ...
@final
class AllPairsPathLengthMapping(_RustworkxCustomHashMapIter[int, PathLengthMapping]): ...
@final
class AllPairsPathMapping(_RustworkxCustomHashMapIter[int, PathMapping]): ...
@final
class BFSSuccessors(Generic[_T_co], _RustworkxCustomVecIter[tuple[_T_co, list[_T_co]]]): ...
@final
class BFSPredecessors(Generic[_T_co], _RustworkxCustomVecIter[tuple[_T_co, list[_T_co]]]): ...
@final
class EdgeIndexMap(Generic[_T_co], _RustworkxCustomHashMapIter[int, tuple[int, int, _T_co]]): ...
@final
class EdgeIndices(_RustworkxCustomVecIter[int]): ...
@final
class Chains(_RustworkxCustomVecIter[EdgeIndices]): ...
@final
class IndexPartitionBlock(_RustworkxCustomVecIter[int]): ...
@final
class RelationalCoarsestPartition(_RustworkxCustomVecIter[IndexPartitionBlock]): ...
@final
class EdgeList(_RustworkxCustomVecIter[tuple[int, int]]): ...
@final
class NodeMap(_RustworkxCustomHashMapIter[int, int]): ...
@final
class NodesCountMapping(_RustworkxCustomHashMapIter[int, int]): ...
@final
class Pos2DMapping(_RustworkxCustomHashMapIter[int, tuple[float, float]]): ...
@final
class WeightedEdgeList(Generic[_T_co], _RustworkxCustomVecIter[tuple[int, int, _T_co]]): ...
@final
class CentralityMapping(_RustworkxCustomHashMapIter[int, float]): ...
@final
class EdgeCentralityMapping(_RustworkxCustomHashMapIter[int, float]): ...
@final
class BiconnectedComponents(_RustworkxCustomHashMapIter[tuple[int, int], int]): ...
@final
class ProductNodeMap(_RustworkxCustomHashMapIter[tuple[int, int], int]): ...
@final
class MultiplePathMapping(_RustworkxCustomHashMapIter[int, list[list[int]]]): ...
@final
class AllPairsMultiplePathMapping(_RustworkxCustomHashMapIter[int, MultiplePathMapping]): ...
# Graph
class PyGraph(Generic[_S, _T]):
attrs: Any
multigraph: bool = ...
def __init__(
self,
/,
multigraph: bool = ...,
attrs: Any = ...,
*,
node_count_hint: int | None = ...,
edge_count_hint: int | None = ...,
) -> None: ...
def add_edge(self, node_a: int, node_b: int, edge: _T, /) -> int: ...
def add_edges_from(
self,
obj_list: Iterable[tuple[int, int, _T]],
/,
) -> list[int]: ...
def add_edges_from_no_data(
self: PyGraph[_S, _T | None], obj_list: Iterable[tuple[int, int]], /
) -> list[int]: ...
def add_node(self, obj: _S, /) -> int: ...
def add_nodes_from(self, obj_list: Iterable[_S], /) -> NodeIndices: ...
def adj(self, node: int, /) -> dict[int, _T]: ...
def clear(self) -> None: ...
def clear_edges(self) -> None: ...
def compose(
self,
other: PyGraph[_S, _T],
node_map: dict[int, tuple[int, _T]],
/,
node_map_func: Callable[[_S], int] | None = ...,
edge_map_func: Callable[[_T], int] | None = ...,
) -> dict[int, int]: ...
def contract_nodes(
self,
nodes: Sequence[int],
obj: _S,
/,
weight_combo_fn: Callable[[_T, _T], _T] | None = ...,
) -> int: ...
def copy(self) -> Self: ...
def degree(self, node: int, /) -> int: ...
def edge_index_map(self) -> EdgeIndexMap[_T]: ...
def edge_indices(self) -> EdgeIndices: ...
def edge_indices_from_endpoints(self, node_a: int, node_b: int) -> EdgeIndices: ...
def edge_list(self) -> EdgeList: ...
def edges(self) -> list[_T]: ...
def edge_subgraph(self, edge_list: Sequence[tuple[int, int]], /) -> PyGraph[_S, _T]: ...
def extend_from_edge_list(
self: PyGraph[_S | None, _T | None], edge_list: Iterable[tuple[int, int]], /
) -> None: ...
def extend_from_weighted_edge_list(
self: PyGraph[_S | None, _T],
edge_list: Iterable[tuple[int, int, _T]],
/,
) -> None: ...
def filter_edges(self, filter_function: Callable[[_T], bool]) -> EdgeIndices: ...
def filter_nodes(self, filter_function: Callable[[_S], bool]) -> NodeIndices: ...
def find_node_by_weight(
self,
obj: _S,
/,
) -> int | None: ...
@staticmethod
def from_adjacency_matrix(
matrix: npt.NDArray[np.float64], /, null_value: float = ...
) -> PyGraph[int, float]: ...
@staticmethod
def from_complex_adjacency_matrix(
matrix: npt.NDArray[np.complex64], /, null_value: complex = ...
) -> PyGraph[int, complex]: ...
def get_all_edge_data(self, node_a: int, node_b: int, /) -> list[_T]: ...
def get_edge_data(self, node_a: int, node_b: int, /) -> _T: ...
def get_edge_data_by_index(self, edge_index: int, /) -> _T: ...
def get_edge_endpoints_by_index(self, edge_index: int, /) -> tuple[int, int]: ...
def get_node_data(self, node: int, /) -> _S: ...
def has_node(self, node: int, /) -> bool: ...
def has_edge(self, node_a: int, node_b: int, /) -> bool: ...
def has_parallel_edges(self) -> bool: ...
def in_edges(self, node: int, /) -> WeightedEdgeList[_T]: ...
def incident_edge_index_map(self, node: int, /) -> EdgeIndexMap: ...
def incident_edges(self, node: int, /) -> EdgeIndices: ...
def in_edge_indices(self, node: int, /) -> EdgeIndices: ...
def neighbors(self, node: int, /) -> NodeIndices: ...
def node_indexes(self) -> NodeIndices: ...
def node_indices(self) -> NodeIndices: ...
def nodes(self) -> list[_S]: ...
def num_edges(self) -> int: ...
def num_nodes(self) -> int: ...
def out_edges(self, node: int, /) -> WeightedEdgeList[_T]: ...
def out_edge_indices(self, node: int, /) -> EdgeIndices: ...
@staticmethod
def read_edge_list(
path: str,
/,
comment: str | None = ...,
deliminator: str | None = ...,
labels: bool = ...,
) -> PyGraph: ...
def remove_edge(self, node_a: int, node_b: int, /) -> None: ...
def remove_edge_from_index(self, edge: int, /) -> None: ...
def remove_edges_from(self, index_list: Iterable[tuple[int, int]], /) -> None: ...
def remove_node(self, node: int, /) -> None: ...
def remove_nodes_from(self, index_list: Iterable[int], /) -> None: ...
def subgraph(self, nodes: Sequence[int], /, preserve_attrs: bool = ...) -> PyGraph[_S, _T]: ...
def subgraph_with_nodemap(
self, nodes: Sequence[int], /, preserve_attrs: bool = ...
) -> tuple[PyGraph[_S, _T], NodeMap]: ...
def substitute_node_with_subgraph(
self,
node: int,
other: PyGraph[_S, _T],
edge_map_fn: Callable[[int, int, _T], int | None],
/,
node_filter: Callable[[_S], bool] | None = ...,
edge_weight_map: Callable[[_T], _T] | None = ...,
) -> NodeMap: ...
@overload
def to_dot(
self,
/,
node_attr: Callable[[_S], dict[str, str]] | None = ...,
edge_attr: Callable[[_T], dict[str, str]] | None = ...,
graph_attr: dict[str, str] | None = ...,
filename: None = ...,
) -> str: ...
@overload
def to_dot(
self,
/,
node_attr: Callable[[_S], dict[str, str]] | None = ...,
edge_attr: Callable[[_T], dict[str, str]] | None = ...,
graph_attr: dict[str, str] | None = ...,
filename: str = ...,
) -> None: ...
def to_directed(self) -> PyDiGraph[_S, _T]: ...
def update_edge(
self,
source: int,
target: int,
edge: _T,
/,
) -> None: ...
def update_edge_by_index(self, edge_index: int, edge: _T, /) -> None: ...
def weighted_edge_list(self) -> WeightedEdgeList[_T]: ...
def write_edge_list(
self,
path: str,
/,
deliminator: str | None = ...,
weight_fn: Callable[[_T], str] | None = ...,
) -> None: ...
def __delitem__(self, idx: int, /) -> None: ...
def __getitem__(self, idx: int, /) -> _S: ...
@classmethod
def __class_getitem__(cls, key: Any, /) -> GenericAlias: ...
def __getnewargs_ex__(self) -> tuple[tuple[Any, ...], dict[str, Any]]: ...
def __getstate__(self) -> Any: ...
def __len__(self) -> int: ...
def __setitem__(self, idx: int, value: _S, /) -> None: ...
def __setstate__(self, state: Any, /) -> None: ...
# Digraph
class PyDiGraph(Generic[_S, _T]):
attrs: Any
check_cycle: bool = ...
multigraph: bool = ...
def __init__(
self,
/,
check_cycle: bool = ...,
multigraph: bool = ...,
attrs: Any = ...,
*,
node_count_hint: int | None = ...,
edge_count_hint: int | None = ...,
) -> None: ...
def add_child(self, parent: int, obj: _S, edge: _T, /) -> int: ...
def add_edge(self, parent: int, child: int, edge: _T, /) -> int: ...
def add_edges_from(
self,
obj_list: Iterable[tuple[int, int, _T]],
/,
) -> list[int]: ...
def add_edges_from_no_data(
self: PyDiGraph[_S, _T | None], obj_list: Iterable[tuple[int, int]], /
) -> list[int]: ...
def add_node(self, obj: _S, /) -> int: ...
def add_nodes_from(self, obj_list: Iterable[_S], /) -> NodeIndices: ...
def add_parent(self, child: int, obj: _S, edge: _T, /) -> int: ...
def adj(self, node: int, /) -> dict[int, _T]: ...
def adj_direction(self, node: int, direction: bool, /) -> dict[int, _T]: ...
def clear(self) -> None: ...
def clear_edges(self) -> None: ...
def compose(
self,
other: PyDiGraph[_S, _T],
node_map: dict[int, tuple[int, _T]],
/,
node_map_func: Callable[[_S], int] | None = ...,
edge_map_func: Callable[[_T], int] | None = ...,
) -> dict[int, int]: ...
def contract_nodes(
self,
nodes: Sequence[int],
obj: _S,
/,
check_cycle: bool | None = ...,
weight_combo_fn: Callable[[_T, _T], _T] | None = ...,
) -> int: ...
def can_contract_without_cycle(self, nodes: Sequence[int], /) -> bool: ...
def copy(self) -> Self: ...
def edge_index_map(self) -> EdgeIndexMap[_T]: ...
def edge_indices(self) -> EdgeIndices: ...
def edge_indices_from_endpoints(self, node_a: int, node_b: int) -> EdgeIndices: ...
def edge_list(self) -> EdgeList: ...
def edges(self) -> list[_T]: ...
def edge_subgraph(self, edge_list: Sequence[tuple[int, int]], /) -> PyDiGraph[_S, _T]: ...
def extend_from_edge_list(
self: PyDiGraph[_S | None, _T | None], edge_list: Iterable[tuple[int, int]], /
) -> None: ...
def extend_from_weighted_edge_list(
self: PyDiGraph[_S | None, _T],
edge_list: Iterable[tuple[int, int, _T]],
/,
) -> None: ...
def filter_edges(self, filter_function: Callable[[_T], bool]) -> EdgeIndices: ...
def filter_nodes(self, filter_function: Callable[[_S], bool]) -> NodeIndices: ...
def find_adjacent_node_by_edge(self, node: int, predicate: Callable[[_T], bool], /) -> _S: ...
def find_node_by_weight(
self,
obj: _S,
/,
) -> int | None: ...
def find_predecessors_by_edge(
self, node: int, filter_fn: Callable[[_T], bool], /
) -> list[_S]: ...
def find_predecessor_node_by_edge(
self, node: int, predicate: Callable[[_T], bool], /
) -> _S: ...
def find_successors_by_edge(
self, node: int, filter_fn: Callable[[_T], bool], /
) -> list[_S]: ...
def find_successor_node_by_edge(self, node: int, predicate: Callable[[_T], bool], /) -> _S: ...
@staticmethod
def from_adjacency_matrix(
matrix: npt.NDArray[np.float64], /, null_value: float = ...
) -> PyDiGraph[int, float]: ...
@staticmethod
def from_complex_adjacency_matrix(
matrix: npt.NDArray[np.complex64], /, null_value: complex = ...
) -> PyDiGraph[int, complex]: ...
def get_all_edge_data(self, node_a: int, node_b: int, /) -> list[_T]: ...
def get_edge_data(self, node_a: int, node_b: int, /) -> _T: ...
def get_node_data(self, node: int, /) -> _S: ...
def get_edge_data_by_index(self, edge_index: int, /) -> _T: ...
def get_edge_endpoints_by_index(self, edge_index: int, /) -> tuple[int, int]: ...
def has_node(self, node: int, /) -> bool: ...
def has_edge(self, node_a: int, node_b: int, /) -> bool: ...
def has_parallel_edges(self) -> bool: ...
def in_degree(self, node: int, /) -> int: ...
def in_edges(self, node: int, /) -> WeightedEdgeList[_T]: ...
def incident_edge_index_map(self, node: int, /, all_edges: bool = ...) -> EdgeIndexMap: ...
def incident_edges(self, node: int, /, all_edges: bool = ...) -> EdgeIndices: ...
def in_edge_indices(self, node: int, /) -> EdgeIndices: ...
def insert_node_on_in_edges(self, node: int, ref_node: int, /) -> None: ...
def insert_node_on_in_edges_multiple(self, node: int, ref_nodes: Sequence[int], /) -> None: ...
def insert_node_on_out_edges(self, node: int, ref_node: int, /) -> None: ...
def insert_node_on_out_edges_multiple(self, node: int, ref_nodes: Sequence[int], /) -> None: ...
def is_symmetric(self) -> bool: ...
def make_symmetric(self, edge_payload_fn: Callable[[_T], _T] | None = ...) -> None: ...
def merge_nodes(self, u: int, v: int, /) -> None: ...
def neighbors(self, node: int, /) -> NodeIndices: ...
def neighbors_undirected(self, node: int, /) -> NodeIndices: ...
def node_indexes(self) -> NodeIndices: ...
def node_indices(self) -> NodeIndices: ...
def nodes(self) -> list[_S]: ...
def num_edges(self) -> int: ...
def num_nodes(self) -> int: ...
def out_degree(self, node: int, /) -> int: ...
def out_edges(self, node: int, /) -> WeightedEdgeList[_T]: ...
def out_edge_indices(self, node: int, /) -> EdgeIndices: ...
def predecessor_indices(self, node: int, /) -> NodeIndices: ...
def predecessors(self, node: int, /) -> list[_S]: ...
@staticmethod
def read_edge_list(
path: str,
/,
comment: str | None = ...,
deliminator: str | None = ...,
labels: bool = ...,
) -> PyDiGraph: ...
def remove_edge(self, parent: int, child: int, /) -> None: ...
def remove_edge_from_index(self, edge: int, /) -> None: ...
def remove_edges_from(self, index_list: Iterable[tuple[int, int]], /) -> None: ...
def remove_node(self, node: int, /) -> None: ...
def remove_node_retain_edges(
self,
node: int,
/,
use_outgoing: bool = ...,
condition: Callable[[_T, _T], bool] | None = ...,
) -> None: ...
def remove_node_retain_edges_by_id(self, node: int, /) -> None: ...
def remove_node_retain_edges_by_key(
self,
node: int,
/,
key: Callable[[_T], Hashable] | None = ...,
*,
use_outgoing: bool = ...,
) -> None: ...
def remove_nodes_from(self, index_list: Iterable[int], /) -> None: ...
def subgraph(
self, nodes: Sequence[int], /, preserve_attrs: bool = ...
) -> PyDiGraph[_S, _T]: ...
def subgraph_with_nodemap(
self, nodes: Sequence[int], /, preserve_attrs: bool = ...
) -> tuple[PyDiGraph[_S, _T], NodeMap]: ...
def substitute_node_with_subgraph(
self,
node: int,
other: PyDiGraph[_S, _T],
edge_map_fn: Callable[[int, int, _T], int | None],
/,
node_filter: Callable[[_S], bool] | None = ...,
edge_weight_map: Callable[[_T], _T] | None = ...,
) -> NodeMap: ...
def successor_indices(self, node: int, /) -> NodeIndices: ...
def successors(self, node: int, /) -> list[_S]: ...
@overload
def to_dot(
self,
/,
node_attr: Callable[[_S], dict[str, str]] | None = ...,
edge_attr: Callable[[_T], dict[str, str]] | None = ...,
graph_attr: dict[str, str] | None = ...,
filename: None = ...,
) -> str: ...
@overload
def to_dot(
self,
/,
node_attr: Callable[[_S], dict[str, str]] | None = ...,
edge_attr: Callable[[_T], dict[str, str]] | None = ...,
graph_attr: dict[str, str] | None = ...,
filename: str = ...,
) -> None: ...
def to_undirected(
self,
/,
multigraph: bool = ...,
weight_combo_fn: Callable[[_T, _T], _T] | None = ...,
) -> PyGraph[_S, _T]: ...
def update_edge(
self,
source: int,
target: int,
edge: _T,
/,
) -> None: ...
def update_edge_by_index(self, edge_index: int, edge: _T, /) -> None: ...
def weighted_edge_list(self) -> WeightedEdgeList[_T]: ...
def write_edge_list(
self,
path: str,
/,
deliminator: str | None = ...,
weight_fn: Callable[[_T], str] | None = ...,
) -> None: ...
def reverse(self) -> None: ...
def __delitem__(self, idx: int, /) -> None: ...
def __getitem__(self, idx: int, /) -> _S: ...
@classmethod
def __class_getitem__(cls, key: Any, /) -> GenericAlias: ...
def __getnewargs_ex__(self) -> tuple[tuple[Any, ...], dict[str, Any]]: ...
def __getstate__(self) -> Any: ...
def __len__(self) -> int: ...
def __setitem__(self, idx: int, value: _S, /) -> None: ...
def __setstate__(self, state: Any, /) -> None: ...