PyDiGraph#

class PyDiGraph(check_cycle=False, multigraph=True, attrs=None, *, node_count_hint=None, edge_count_hint=None)#

基础:object

一个用于创建有向图的类

PyDiGraph 类用于创建有向图。它可以是一个 多重图(节点间允许多条边)。每个节点和边 (虽然边很少使用)都由整数索引id标识。这些id 在图的整个生命周期中是稳定的,在节点或边 删除时,图的索引列表中可能出现空缺。 节点索引在删除后重新添加时会重复使用。例如:

import rustworkx as rx

graph = rx.PyDiGraph()
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]

此外,每一个节点和边都可以包含任意的 Python 对象作为权重/数据负载。您可以像下面这个例子一样使用索引来访问数据负载:

import rustworkx as rx

graph = rx.PyDiGraph()
data_payload = "An arbitrary Python object"
node_index = graph.add_node(data_payload)
print("Node Index: %s" % node_index)
print(graph[node_index])
Node Index: 0
An arbitrary Python object

PyDiGraph 实现了节点的 Python 映射协议,因此除了访问之外,您还可以通过以下方式更新数据载荷:

import rustworkx as rx

graph = rx.PyDiGraph()
data_payload = "An arbitrary Python object"
node_index = graph.add_node(data_payload)
graph[node_index] = "New Payload"
print("Node Index: %s" % node_index)
print(graph[node_index])
Node Index: 0
New Payload

PyDiGraph 类具有实时循环检查选项,可用于确保添加到图中的任何边不会引入循环。默认情况下,出于性能考虑,实时循环检查功能是禁用的,但您可以通过将 check_cycle 属性设置为 True 来启用它。例如:

import rustworkx as rx
dag = rx.PyDiGraph()
dag.check_cycle = True

或在对象创建时:

import rustworkx as rx
dag = rx.PyDiGraph(check_cycle=True)

当设置 check_cycle 为 true 时,任何对 PyDiGraph.add_edge() 的调用都会确保不添加循环,从而确保 PyDiGraph 类真正代表有向无环图。请注意,在 add_edge()add_edges_from()add_edges_from_no_data()extend_from_edge_list()extend_from_weighted_edge_list() 上的循环检查会带来随图增长而增加的性能损失。如果你同时添加节点和边,利用 PyDiGraph.add_child()PyDiGraph.add_parent() 可以避免这种开销。

默认情况下,PyDiGraph是一个多重图(意味着节点之间可以存在平行边),但是通过在调用PyDiGraph构造函数时将multigraph关键字参数设置为False,可以禁用此功能。例如:
import rustworkx as rx
graph = rx.PyDiGraph(multigraph=False)

这只能在PyDiGraph初始化时设置,创建后不可调整。当multigraph设置为False时,如果执行的方法调用将会添加平行边,它将转而更新现有边的权重/数据载荷。

每个 PyDiGraph 对象都有一个 attrs 属性, 用于包含图实例的附加属性/元数据。默认情况下,此属性设置为 None,但可以选择通过在构建新图时使用 attrs 关键字参数来指定:

graph = rustworkx.PyDiGraph(attrs=dict(source_path='/tmp/graph.csv'))

此属性可以设置为任何Python对象。此外,在创建对象后您可以访问和修改此属性。例如:

source_path = graph.attrs
graph.attrs = {'new_path': '/tmp/new.csv', 'old_path': source_path}

PyGraph 对象允许的最大节点和边数各为 \(2^{32} - 1\)(4,294,967,294)个。尝试添加超过此数量的节点或边将导致抛出异常。

Parameters:
  • check_cycle (bool) – 当设置为 True 时,创建的 PyDiGraph 将启用运行时循环检测。

  • multigraph (布尔类型) – 当设置为 False 时,创建的 PyDiGraph 对象将不会是多图。当为 False 时,若有方法调用试图添加平行边,则该调用中的权重值将用于更新现有边的权重。

  • attrs - 一个可选属性载荷,分配给 attrs 属性。它可以是任何 Python 对象。如果未指定,attrs 将被设置为 None

  • node_count_hint (int) – 一个可选提示,将分配足够的容量以在需要扩展前存储这么多节点。 这不会预填充任何节点数据,如果在已知图的完整大小的情况下,则仅作为潜在的性能优化。

  • edge_count_hint (int) – 一个可选提示,将在需要扩展前分配足够的容量来存储这么多边。这不会预先填充任何边的数据,只有在事先知道图的完整大小时,才能作为潜在的性能优化。

方法

add_child

向图中添加一个新的子节点。

添加边

在2个节点之间添加一条边。

add_edges_from

向图中添加新的边。

add_edges_from_no_data

在没有python数据的情况下向图中添加新的边。

add_node

在图中添加一个新节点。

add_nodes_from

向图中添加新节点。

add_parent

将一个新父节点添加到图中。

adj

获取一个节点的邻居索引和数据。

adj_direction

获取节点的父节点或子节点的索引和数据。

can_contract_without_cycle

检查在收缩指定节点时是否不会引入循环。

清除

清除所有节点和边

clear_edges

清除所有边,保留节点不变

合并

将该PyDiGraph对象添加到当前PyDiGraph中

contract_nodes

使用一个新节点替换一组节点。

副本

返回图的浅拷贝

edge_index_map

获取边索引映射

edge_indices

返回所有边索引的列表.

edge_indices_from_endpoints

返回指定节点间所有有向边的索引列表

edge_list

获取边的列表

edge_subgraph

返回该图边诱导子图的新的PyDiGraph对象

返回所有边数据的列表。

extend_from_edge_list

从边列表中扩展图

extend_from_weighted_edge_list

从加权边列表扩展图

filter_edges

根据边数据负载的某些条件筛选图的边,并返回这些边的索引。

filter_nodes

根据节点数据负载的某些条件对图的节点进行筛选,并返回这些节点的索引。

find_adjacent_node_by_edge

查找符合条件且通过边相连的任何相邻(后继)节点

find_node_by_weight

按指定的权重在此图中查找节点

find_predecessor_node_by_edge

查找与满足条件的边连接的任意前驱节点

find_predecessors_by_edge

返回一个与给定节点的前驱节点相关联的数据列表,其中来自这些节点的连接边满足所提供的筛选函数。

find_successor_node_by_edge

查找所有通过满足条件的边连接的后继节点

find_successors_by_edge

返回一个与给定节点的后继节点相关联的数据列表,其中连接到这些节点的边满足所提供的过滤函数。

from_adjacency_matrix

从一个邻接矩阵创建一个新的PyDiGraph对象,该矩阵元素的类型为float

from_complex_adjacency_matrix

从邻接矩阵创建一个新的PyDiGraph对象,矩阵元素类型为complex

get_all_edge_data

返回两节点之间所有边的数据。

get_edge_data

获取两个节点之间边的数据。

get_edge_data_by_index

通过给定索引返回边的数据

get_edge_endpoints_by_index

通过指定索引返回边的端点

get_node_data

返回给定节点索引的节点数据

has_edge

检查是否存在从node_anode_b的有向边。

has_node

检查节点是否存在于图中。

has_parallel_edges

检测图形是否具有平行边

in_degree

获取节点入边度数。

in_edge_indices

返回指定节点的输入边索引列表

in_edges

获取一个节点的所有父节点的索引和边数据。

incident_edge_index_map

返回与指定节点连边的索引映射

incident_edges

返回与指定节点相连的边索引列表

insert_node_on_in_edges

在参考节点与其所有前驱节点之间插入一个节点

insert_node_on_in_edges_multiple

在一系列参考节点和它们的所有前驱节点之间插入一个节点

insert_node_on_out_edges

在一个参考节点与其所有后续节点之间插入一个节点

insert_node_on_out_edges_multiple

在参考节点列表和其所有后继节点之间插入一个节点

is_symmetric

检查图表是否对称

make_symmetric

使图中的边对称

merge_nodes

合并图中的两个节点。

邻居

返回一个邻近节点索引的列表(即

neighbors_undirected

获取与方向无关的邻居(即

node_indexes

返回所有节点索引的列表。

node_indices

返回所有节点索引的列表。

节点

返回所有节点数据的列表。

num_edges

返回图中边的数量

num_nodes

返回图中节点的数量

出度

获取节点的出边度数。

out_edge_indices

返回指定节点的出向边索引列表

out_edges

获取一个节点的所有子节点的索引和边数据。

predecessor_indices

在有向图中返回前驱节点索引的列表

前任

返回一个有向图中所有节点前驱的数据列表

read_edge_list

读取边列表文件并从内容创建一个新的PyDiGraph对象

remove_edge

移除2个节点之间的边。

remove_edge_from_index

移除由提供的索引标识的边

remove_edges_from

从图中移除边。

remove_node

从图中移除一个节点。

remove_node_retain_edges

从图中移除一个节点,并为所有前驱到所有后继添加边

remove_node_retain_edges_by_id

从图中移除一个节点,并在前驱和后继之间添加边,前提是当传入和传出的边根据 Python 对象的标识具有相同的权重时。

remove_node_retain_edges_by_key

根据智能体的权重值,从图中移除一个节点,并在传入和传出边具有相同权重的情况下添加从前任节点到后继节点的边。

remove_nodes_from

从图中移除节点。

反转

反转图中所有边的方向,原地操作。

子图

返回该图的子图所对应的新 PyDiGraph 对象。

subgraph_with_nodemap

返回一个新的PyDiGraph对象,表示此图的一个子图,以及一个NodeMap对象,将子图的节点映射到原始图的节点。

substitute_node_with_subgraph

替换一个节点为PyDigraph对象

successor_indices

返回有向图中后继节点的索引列表

继承者

返回有向图中所有节点后继数据的列表

to_dot

从图生成dot文件

to_undirected

从此图中生成一个新的PyGraph对象

update_edge

在原地更新边的权重/有效载荷

update_edge_by_index

通过边的索引就地更新边的权重/数据载荷

weighted_edge_list

获取带权重的边列表

write_edge_list

将PyDiGraph对象的边列表写入文件

属性

attrs#
check_cycle#

是否对DiGraph/DAG启用了循环检查。

如果设为True,添加可能引入循环的新边 将会引发DAGWouldCycle异常。

multigraph#

图是否为多图(允许节点之间存在多条边)

如果设置为 False,则不允许节点之间存在多条边,并且原本会添加平行边的调用将改为更新现有边