AddReverse

class dgl.transforms.AddReverse(copy_edata=False, sym_new_etype=False)[source]

Bases: BaseTransform

对于输入图中的每条边 \((j,i)\),添加一条反向边 \((i,j)\) 并返回一个新图。

对于异构图,它为每种边类型添加一个“反向”边类型来存放反向边。例如,对于规范边类型 (‘A’, ‘r’, ‘B’),它会添加规范边类型 (‘B’, ‘rev_r’, ‘A’)。

参数:
  • copy_edata (bool, optional) – 如果为 True,则反向边的特征将与原始边相同。

  • sym_new_etype (bool, optional) – 如果为 False,则如果规范边类型中的源节点和目标节点类型相同,它将不会添加反向边类型。相反,它会将边直接添加到原始边类型中。

示例

以下示例使用 PyTorch 后端。

>>> import dgl
>>> import torch
>>> from dgl import AddReverse

情况1:为同构图添加反向边

>>> transform = AddReverse()
>>> g = dgl.graph(([0], [1]))
>>> g.edata['w'] = torch.ones(1, 2)
>>> new_g = transform(g)
>>> print(new_g.edges())
(tensor([0, 1]), tensor([1, 0]))
>>> print(new_g.edata['w'])
tensor([[1., 1.],
        [0., 0.]])

情况2:为同构图添加反向边并复制边数据

>>> transform = AddReverse(copy_edata=True)
>>> new_g = transform(g)
>>> print(new_g.edata['w'])
tensor([[1., 1.],
        [1., 1.]])

情况3:为异构图添加反向边

>>> g = dgl.heterograph({
...     ('user', 'plays', 'game'): ([0, 1], [1, 1]),
...     ('user', 'follows', 'user'): ([1, 2], [2, 2])
... })
>>> new_g = transform(g)
>>> print(new_g.canonical_etypes)
[('game', 'rev_plays', 'user'), ('user', 'follows', 'user'), ('user', 'plays', 'game')]
>>> print(new_g.edges(etype='rev_plays'))
(tensor([1, 1]), tensor([0, 1]))
>>> print(new_g.edges(etype='follows'))
(tensor([1, 2, 2, 2]), tensor([2, 2, 1, 2]))