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) – 一个可选提示,将在需要扩展前分配足够的容量来存储这么多边。这不会预先填充任何边的数据,只有在事先知道图的完整大小时,才能作为潜在的性能优化。
方法
向图中添加一个新的子节点。
在2个节点之间添加一条边。
向图中添加新的边。
在没有python数据的情况下向图中添加新的边。
在图中添加一个新节点。
向图中添加新节点。
将一个新父节点添加到图中。
获取一个节点的邻居索引和数据。
获取节点的父节点或子节点的索引和数据。
检查在收缩指定节点时是否不会引入循环。
清除所有节点和边
清除所有边,保留节点不变
将该PyDiGraph对象添加到当前PyDiGraph中
使用一个新节点替换一组节点。
返回图的浅拷贝
获取边索引映射
返回所有边索引的列表.
返回指定节点间所有有向边的索引列表
获取边的列表
返回该图边诱导子图的新的PyDiGraph对象
返回所有边数据的列表。
从边列表中扩展图
从加权边列表扩展图
根据边数据负载的某些条件筛选图的边,并返回这些边的索引。
根据节点数据负载的某些条件对图的节点进行筛选,并返回这些节点的索引。
查找符合条件且通过边相连的任何相邻(后继)节点
按指定的权重在此图中查找节点
查找与满足条件的边连接的任意前驱节点
返回一个与给定节点的前驱节点相关联的数据列表,其中来自这些节点的连接边满足所提供的筛选函数。
查找所有通过满足条件的边连接的后继节点
返回一个与给定节点的后继节点相关联的数据列表,其中连接到这些节点的边满足所提供的过滤函数。
从一个邻接矩阵创建一个新的
PyDiGraph对象,该矩阵元素的类型为float从邻接矩阵创建一个新的
PyDiGraph对象,矩阵元素类型为complex返回两节点之间所有边的数据。
获取两个节点之间边的数据。
通过给定索引返回边的数据
通过指定索引返回边的端点
返回给定节点索引的节点数据
检查是否存在从
node_a到node_b的有向边。检查节点是否存在于图中。
检测图形是否具有平行边
获取节点入边度数。
返回指定节点的输入边索引列表
获取一个节点的所有父节点的索引和边数据。
返回与指定节点连边的索引映射
返回与指定节点相连的边索引列表
在参考节点与其所有前驱节点之间插入一个节点
在一系列参考节点和它们的所有前驱节点之间插入一个节点
在一个参考节点与其所有后续节点之间插入一个节点
在参考节点列表和其所有后继节点之间插入一个节点
检查图表是否对称
使图中的边对称
合并图中的两个节点。
返回一个邻近节点索引的列表(即
获取与方向无关的邻居(即
返回所有节点索引的列表。
返回所有节点索引的列表。
返回所有节点数据的列表。
返回图中边的数量
返回图中节点的数量
获取节点的出边度数。
返回指定节点的出向边索引列表
获取一个节点的所有子节点的索引和边数据。
在有向图中返回前驱节点索引的列表
返回一个有向图中所有节点前驱的数据列表
读取边列表文件并从内容创建一个新的PyDiGraph对象
移除2个节点之间的边。
移除由提供的索引标识的边
从图中移除边。
从图中移除一个节点。
从图中移除一个节点,并为所有前驱到所有后继添加边
从图中移除一个节点,并在前驱和后继之间添加边,前提是当传入和传出的边根据 Python 对象的标识具有相同的权重时。
根据智能体的权重值,从图中移除一个节点,并在传入和传出边具有相同权重的情况下添加从前任节点到后继节点的边。
从图中移除节点。
反转图中所有边的方向,原地操作。
返回该图的子图所对应的新 PyDiGraph 对象。
返回一个新的PyDiGraph对象,表示此图的一个子图,以及一个NodeMap对象,将子图的节点映射到原始图的节点。
替换一个节点为PyDigraph对象
返回有向图中后继节点的索引列表
返回有向图中所有节点后继数据的列表
从图生成dot文件
从此图中生成一个新的PyGraph对象
在原地更新边的权重/有效载荷
通过边的索引就地更新边的权重/数据载荷
获取带权重的边列表
将PyDiGraph对象的边列表写入文件
属性
- attrs#
- check_cycle#
是否对DiGraph/DAG启用了循环检查。
如果设为
True,添加可能引入循环的新边 将会引发DAGWouldCycle异常。
- multigraph#
图是否为多图(允许节点之间存在多条边)
如果设置为
False,则不允许节点之间存在多条边,并且原本会添加平行边的调用将改为更新现有边