dgl.reverse

dgl.reverse(g, copy_ndata=True, copy_edata=False, *, share_ndata=None, share_edata=None)[源码]

返回一个新图,其中每条边都是输入图中的反向边。

一个图的逆(也称为反向图、转置图)是指一个新图,其中类型为 (U, E, V) 的边 \((i_1, j_1), (i_2, j_2), \cdots\) 在新图中变为类型为 (V, E, U) 的边 \((j_1, i_1), (j_2, i_2), \cdots\)

返回的图与原始图共享数据结构,即 dgl.reverse 不会为反向图创建额外的存储空间。

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

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

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

返回值:

反向图。

返回值类型:

DGLGraph

注意事项

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

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

示例

同构图

创建一个要反向的图。

>>> import dgl
>>> import torch as th
>>> g = dgl.graph((th.tensor([0, 1, 2]), th.tensor([1, 2, 0])))
>>> g.ndata['h'] = th.tensor([[0.], [1.], [2.]])
>>> g.edata['h'] = th.tensor([[3.], [4.], [5.]])

反向图。

>>> rg = dgl.reverse(g, copy_edata=True)
>>> rg.ndata['h']
tensor([[0.],
        [1.],
        [2.]])

反向图中的第 i 条边对应于原始图中的第 i 条边。当 copy_edata 为 True 时,它们具有相同的特征。

>>> rg.edges()
(tensor([1, 2, 0]), tensor([0, 1, 2]))
>>> rg.edata['h']
tensor([[3.],
        [4.],
        [5.]])

异构图

>>> g = dgl.heterograph({
...     ('user', 'follows', 'user'): (th.tensor([0, 2]), th.tensor([1, 2])),
...     ('user', 'plays', 'game'): (th.tensor([1, 2, 1]), th.tensor([2, 1, 1]))
... })
>>> g.nodes['game'].data['hv'] = th.ones(3, 1)
>>> g.edges['plays'].data['he'] = th.zeros(3, 1)

结果图将包含边类型 ('user', 'follows', 'user)('game', 'plays', 'user')

>>> rg = dgl.reverse(g, copy_ndata=True)
>>> rg
Graph(num_nodes={'game': 3, 'user': 3},
      num_edges={('user', 'follows', 'user'): 2, ('game', 'plays', 'user'): 3},
      metagraph=[('user', 'user'), ('game', 'user')])
>>> rg.edges(etype='follows')
(tensor([1, 2]), tensor([0, 2]))
>>> rg.edges(etype='plays')
(tensor([2, 1, 1]), tensor([1, 2, 1]))
>>> rg.nodes['game'].data['hv']
tensor([[1.],
        [1.],
        [1.]])
>>> rg.edges['plays'].data
{}