Note
This is the documentation for the current state of the development branch of rustworkx. The documentation or APIs here can change prior to being released.
PyDAG#
- class PyDAG(check_cycle=False, multigraph=True, attrs=None, *, node_count_hint=None, edge_count_hint=None)[source]#
Bases:
PyDiGraph
A class for creating direct acyclic graphs.
PyDAG is just an alias of the PyDiGraph class and behaves identically to the
PyDiGraph
class and can be used interchangeably withPyDiGraph
. It currently exists solely as a backwards compatibility alias for users of rustworkx from prior to the 0.4.0 release when there was no PyDiGraph class.The PyDAG class is used to create a directed graph. It can be a multigraph (have multiple edges between nodes). Each node and edge (although rarely used for edges) is indexed by an integer id. These ids are stable for the lifetime of the graph object and on node or edge deletions you can have holes in the list of indices for the graph. Node indices will be reused on additions after removal. For example:
import rustworkx as rx graph = rx.PyDAG() graph.add_nodes_from(list(range(5))) graph.add_nodes_from(list(range(2))) graph.remove_node(2) print("After deletion:", graph.node_indices()) res_manual = graph.add_parent(6, None, None) print("After adding a new node:", graph.node_indices())
After deletion: NodeIndices[0, 1, 3, 4, 5, 6] After adding a new node: NodeIndices[0, 1, 2, 3, 4, 5, 6]
Additionally, each node and edge contains an arbitrary Python object as a weight/data payload.
You can use the index for access to the data payload as in the following example:
import rustworkx as rx graph = rx.PyDAG() data_payload = "An arbitrary Python object" node_index = graph.add_node(data_payload) print(f"Node Index: {node_index}") print(graph[node_index])
Node Index: 0 An arbitrary Python object
The PyDAG class implements the Python mapping protocol for nodes so in addition to access you can also update the data payload with:
import rustworkx as rx graph = rx.PyDAG() data_payload = "An arbitrary Python object" node_index = graph.add_node(data_payload) graph[node_index] = "New Payload" print(f"Node Index: {node_index}") print(graph[node_index])
Node Index: 0 New Payload
The PyDAG class has an option for real time cycle checking which can be used to ensure any edges added to the graph does not introduce a cycle. By default the real time cycle checking feature is disabled for performance, however you can enable it by setting the
check_cycle
attribute to True. For example:import rustworkx as rx dag = rx.PyDAG() dag.check_cycle = True
or at object creation:
import rustworkx as rx dag = rx.PyDAG(check_cycle=True)
With check_cycle set to true any calls to
PyDAG.add_edge()
will ensure that no cycles are added, ensuring that the PyDAG class truly represents a directed acyclic graph. Do note that this cycle checking onadd_edge()
,add_edges_from()
,add_edges_from_no_data()
,extend_from_edge_list()
, andextend_from_weighted_edge_list()
comes with a performance penalty that grows as the graph does. If you’re adding a node and edge at the same time, leveragingPyDAG.add_child()
orPyDAG.add_parent()
will avoid this overhead.By default a
PyDAG
is a multigraph (meaning there can be parallel edges between nodes) however this can be disabled by setting themultigraph
kwarg toFalse
when calling thePyDAG
constructor. For example:import rustworkx as rx dag = rx.PyDAG(multigraph=False)
This can only be set at
PyDiGraph
initialization and not adjusted after creation. Whenmultigraph
is set toFalse
if a method call is made that would add a parallel edge it will instead update the existing edge’s weight/data payload.The maximum number of nodes and edges allowed on a
PyGraph
object is (4,294,967,294) each. Attempting to add more nodes or edges than this will result in an exception being raised.- Parameters:
check_cycle (bool) – When this is set to
True
the createdPyDAG
has runtime cycle detection enabled.multigraph (bool) – When this is set to
False
the createdPyDAG
object will not be a multigraph. WhenFalse
if a method call is made that would add parallel edges the weight/weight from that method call will be used to update the existing edge in place.
Methods
Add a new child node to the graph.
Add an edge between 2 nodes.
Add new edges to the graph.
Add new edges to the graph without python data.
Add a new node to the graph.
Add new nodes to the graph.
Add a new parent node to the graph.
Get the index and data for the neighbors of a node.
Get the index and data for either the parents or children of a node.
Clear all nodes and edges
Clears all edges, leaves nodes intact
Add another PyDiGraph object into this PyDiGraph
Substitute a set of nodes with a single new node.
Return a shallow copy of the graph
Get an edge index map
Return a list of all edge indices.
Return a list of indices of all directed edges between specified nodes
Get edge list
Return a new PyDiGraph object for an edge induced subgraph of this graph
Return a list of all edge data.
Extend graph from an edge list
Extend graph from a weighted edge list
Filters a graph's edges by some criteria conditioned on a edge's data payload and returns those edges' indices.
Filters a graph's nodes by some criteria conditioned on a node's data payload and returns those nodes' indices.
Find any adjacent (successor) node connected with an edge that matches the condition
Find node within this graph given a specific weight
Find any predecessor node connected with an edge that matches the condition
Return a list of data associated with the predecessors of the given node, where the edges connecting from those nodes satisfy the provided filter function.
Find any successor node connected with an edge that matches the condition
Return a list of data associated with the successors of the given node, where the edges connecting to those nodes satisfy the provided filter function.
Create a new
PyDiGraph
object from an adjacency matrix with matrix elements of typefloat
Create a new
PyDiGraph
object from an adjacency matrix with matrix elements of typecomplex
Return the edge data for all the edges between 2 nodes.
Return the edge data for an edge between 2 nodes.
Return the edge data for the edge by its given index
Return the edge endpoints for the edge by its given index
Return the node data for a given node index
Check if there is a directed edge from
node_a
tonode_b
.Check if the node exists in the graph.
Detect if the graph has parallel edges or not
Get the degree of a node for inbound edges.
Return the list of incoming edge indices to a provided node
Get the index and edge data for all parents of a node.
Return the index map of edges incident to a provided node
Return the list of edge indices incident to a provided node
Insert a node between a reference node and all its predecessor nodes
Insert a node between a list of reference nodes and all their predecessors
Insert a node between a reference node and all its successor nodes
Insert a node between a list of reference nodes and all their successors
Check if the graph is symmetric
Make edges in graph symmetric
Merge two nodes in the graph.
Return a list of node indices of neighbors (i.e.
Get the direction-agnostic neighbors (i.e.
Return a list of all node indices.
Return a list of all node indices.
Return a list of all node data.
Return the number of edges in the graph
Return the number of nodes in the graph
Get the degree of a node for outbound edges.
Return the list of outgoing edge indices from a provided node
Get the index and edge data for all children of a node.
Return a list of predecessor node indices in a directed graph
Return a list of data of all node predecessors in a directed graph
Read an edge list file and create a new PyDiGraph object from the contents
Remove an edge between 2 nodes.
Remove an edge identified by the provided index
Remove edges from the graph.
Remove a node from the graph.
Remove a node from the graph and add edges from all predecessors to all successors
Remove a node from the graph and add edges from predecessors to successors in cases where an incoming and outgoing edge have the same weight by Python object identity.
Remove a node from the graph and add edges from predecessors to successors in cases where an incoming and outgoing edge have the same weight by Python object equality.
Remove nodes from the graph.
Reverse the direction of all edges in the graph, in place.
Return a new PyDiGraph object for a subgraph of this graph
Substitute a node with a PyDigraph object
Return a list of successor node indices in a directed graph
Return a list of data of all node successors in a directed graph
Generate a dot file from the graph
Generate a new PyGraph object from this graph
Update an edge's weight/payload in place
Update an edge's weight/data payload in place by the edge index
Get edge list with weights
Write an edge list file from the PyDiGraph object
Attributes
- attrs#
- check_cycle#
Whether cycle checking is enabled for the DiGraph/DAG.
If set to
True
adding new edges that would introduce a cycle will raise aDAGWouldCycle
exception.
- multigraph#
Whether the graph is a multigraph (allows multiple edges between nodes) or not
If set to
False
multiple edges between nodes are not allowed and calls that would add a parallel edge will instead update the existing edge