参考:https://docs.dgl.ai/en/latest/api/python/traversal.html
dgl.traversal
图遍历方法模块。
图遍历算法作为python生成器实现,它在每次迭代时返回访问过的一组节点或边。命名约定为<algorithm>_[nodes|edges]_generator
。
用法示例如下。
g = ... # some DGLGraph
for nodes in dgl.bfs_nodes_generator(g, 0):
do_something(nodes)
bfs_nodes_generator (graph, source[, reverse]) | 使用广度优先搜索的节点边界生成器。 |
bfs_edges_generator (graph, source[, reverse]) | 使用广度优先搜索来生成边界前沿生成器。 |
topological_nodes_generator (graph[, reverse]) | 使用拓扑遍历来生成节点边界生成器。 |
dfs_edges_generator (graph, source[, reverse]) | 使用深度优先搜索(DFS)的边缘边界生成器。 |
dfs_labeled_edges_generator (graph, source[, …]) | 在按类型标记的深度优先搜索(DFS)中生成边缘. |
dgl.traversal.bfs_nodes_generator
dgl.traversal.bfs_nodes_generator(graph,source,reverse = False)
使用广度优先搜索的节点边界生成器。
参数: | |
---|---|
返回值: | 每个节点边界都是节点ID或张量的列表。 |
返回类型: | 节点边界列表 |
例子
给定一个图(有向的,边是从小节点id到大节点的id):
2 - 4 / \ 0 - 1 - 3 - 5
>>> g = dgl.DGLGraph([(0, 1), (1, 2), (1, 3), (2, 3), (2, 4), (3, 5)])
>>> list(dgl.bfs_nodes_generator(g, 0))
[tensor([0]), tensor([1]), tensor([2, 3]), tensor([4, 5])]
dgl.traversal.bfs_edges_generator
dgl.traversal.bfs_edges_generator(graph,source,reverse = False)
使用广度优先搜索来生成边界前沿生成器。
参数: | |
---|---|
返回值: | 每个边缘边界都是边缘ID或张量的列表。 |
返回类型: | 边缘列表 |
例子
给定一个图(有向的,从小节点id指向大节点id的有向边,按源-目的节点id元组的字典顺序排序。):
2 - 4
/ \
0 - 1 - 3 - 5
>>> g = dgl.DGLGraph([(0, 1), (1, 2), (1, 3), (2, 3), (2, 4), (3, 5)])
>>> list(dgl.bfs_edges_generator(g, 0))
[tensor([0]), tensor([1, 2]), tensor([4, 5])]
dgl.traversal.topological_nodes_generator
dgl.traversal.topological_nodes_generator(graph,reverse = False)
使用拓扑遍历的节点边界生成器。
参数: | |
---|---|
返回值: | 每个节点边界都是节点ID或张量的列表。 |
返回类型: | 节点边界列表 |
例子
给定一个图(从小节点id到大节点的有向边):
2 - 4 / \ 0 - 1 - 3 - 5
>>> g = dgl.DGLGraph([(0, 1), (1, 2), (1, 3), (2, 3), (2, 4), (3, 5)])
>>> list(dgl.topological_nodes_generator(g))
[tensor([0]), tensor([1]), tensor([2]), tensor([3, 4]), tensor([5])]
dgl.traversal.dfs_edges_generator
dgl.traversal.dfs_edges_generator(graph,source,reverse = False
使用深度优先搜索(DFS)的边缘边界生成器。
可以指定多个源节点来启动DFS遍历。需要确保每个源节点都属于不同的连接组件,这样就可以方便地合并边界。否则,行为是未定义的。
参数: | |
---|---|
返回值: | 每个边缘边界都是边缘ID或张量的列表。 |
返回类型: | 边缘列表 |
例子
给定一个图(从小节点id到大节点的有向边):
2 - 4
/ \
0 - 1 - 3 - 5
边添加顺序[(0,1),(1,2),(1,3),(2,3),(2,4),(3,5)]
>>> g = dgl.DGLGraph([(0, 1), (1, 2), (1, 3), (2, 3), (2, 4), (3, 5)])
>>> list(dgl.dfs_edges_generator(g, 0))
[tensor([0]), tensor([1]), tensor([3]), tensor([5]), tensor([4])]
PS:这里为啥2没了??????
dgl.traversal.dfs_labeled_edges_generator
dgl.traversal.dfs_labeled_edges_generator(graph,source,reverse = False,has_reverse_edge = False,has_nontree_edge = False,return_labels = True)
在按类型标记的深度优先搜索(DFS)中产生边。
有三个标签:FORWARD(0),REVERSE(1),NONTREE(2)
前向边是其中u已被访问但v没有被访问的边。REVERSE边缘是u和v都已被访问并且该边缘在DFS树中的边缘。NONTREE边是u和v 都已被访问但该边不在DFS树中的边。
有关 详细信息,请参见networkx
的dfs_labeled_edges
。
可以指定多个源节点来启动DFS遍历。需要确保每个源节点都属于不同的连接组件,以便可以轻松合并边界。否则,行为是不确定的。
参数: | |
---|---|
返回值: |
|
例子
给定一个图(从小节点id到大节点的有向边):
2 - 4 / \ 0 - 1 - 3 - 5
边添加顺序[(0,1),(1,2),(1,3),(2,3),(2,4),(3,5)]
>>> g = dgl.DGLGraph([(0, 1), (1, 2), (1, 3), (2, 3), (2, 4), (3, 5)])
>>> list(dgl.dfs_labeled_edges_generator(g, 0, has_nontree_edge=True))
(tensor([0]), tensor([1]), tensor([3]), tensor([5]), tensor([4]), tensor([2])),
(tensor([0]), tensor([0]), tensor([0]), tensor([0]), tensor([0]), tensor([2]))