dgl.to_bidirected

dgl.to_bidirected(g, copy_ndata=False, readonly=None)[source]

将图转换为双向简单图并返回。

对于输入图 G,返回一个新的图 G,使得边 (u,v)G 存在的充要条件是存在边 (v,u)G。结果图 G 是一个简单图,意味着没有平行边。

此操作仅适用于两个端点属于相同节点类型的边。如果输入图是异构图且包含端点类型不同的边,DGL 将抛出错误。

参数:
  • g (DGLGraph) – 输入图。

  • copy_ndata (bool, optional) – 如果为 True,则双向图的节点特征将从原始图复制。如果为 False,则双向图将不包含任何节点特征。(默认值: False)

  • readonly (bool) – 已废弃

返回值:

双向图

返回类型:

DGLGraph

注意事项

如果 copy_ndata 为 True,则结果图将与输入图共享节点特征张量。因此,用户应尽量避免会同时影响两个图的原位操作。

此函数会丢弃批次信息。请在转换后的图上使用 dgl.DGLGraph.set_batch_num_nodes()dgl.DGLGraph.set_batch_num_edges() 来保留该信息。

示例

以下示例使用 PyTorch 后端。

>>> import dgl
>>> import torch as th
>>> g = dgl.graph((th.tensor([0, 1, 2]), th.tensor([1, 2, 0])))
>>> bg1 = dgl.to_bidirected(g)
>>> bg1.edges()
(tensor([0, 1, 2, 1, 2, 0]), tensor([1, 2, 0, 0, 1, 2]))

图已经包含 i->j 和 j->i

>>> g = dgl.graph((th.tensor([0, 1, 2, 0]), th.tensor([1, 2, 0, 2])))
>>> bg1 = dgl.to_bidirected(g)
>>> bg1.edges()
(tensor([0, 1, 2, 1, 2, 0]), tensor([1, 2, 0, 0, 1, 2]))

具有多种边类型的异构图

>>> g = dgl.heterograph({
...     ('user', 'wins', 'user'): (th.tensor([0, 2, 0, 2]), th.tensor([1, 1, 2, 0])),
...     ('user', 'follows', 'user'): (th.tensor([1, 2, 1]), th.tensor([2, 1, 1]))
... })
>>> bg1 = dgl.to_bidirected(g)
>>> bg1.edges(etype='wins')
(tensor([0, 0, 1, 1, 2, 2]), tensor([1, 2, 0, 2, 0, 1]))
>>> bg1.edges(etype='follows')
(tensor([1, 1, 2]), tensor([1, 2, 1]))