AddSelfLoop

class dgl.transforms.AddSelfLoop(allow_duplicate=False, new_etypes=False, edge_feat_names=None, fill_data=1.0)[source]

基类: BaseTransform

为图中的每个节点添加自环,并返回一个新的图。

对于异构图,自环仅添加到源节点和目标节点类型相同的边类型。

参数:
  • allow_duplicate (bool, 可选) – 如果为 False,则会先移除自环以防止重复的自环。

  • new_etypes (bool, 可选) – 如果为 True,则会为每个节点类型添加一个名为 'self' 的边类型,用于存储自环。

  • edge_feat_names (list[str], 可选) – 要应用 fill_data 的自环特征名称。如果为 None,则会应用 fill_data 到所有自环特征。默认值: None。

  • fill_data (int, floatstr, 可选) –

    用于填充自环特征的值。默认值: 1.0。

    • 如果 fill_dataintfloat,则自环特征将直接由 fill_data 给出。

    • 如果 fill_datastr,则自环特征将通过聚合对应节点的传入边特征生成。支持的聚合类型有: 'mean', 'sum', 'max', 'min'

示例

>>> import dgl
>>> from dgl import AddSelfLoop

示例 1: 为同构图添加自环

>>> transform = AddSelfLoop(fill_data='sum')
>>> g = dgl.graph(([0, 0, 2], [2, 1, 0]))
>>> g.edata['he'] = torch.arange(3).float().reshape(-1, 1)
>>> new_g = transform(g)
>>> print(new_g.edges())
(tensor([0, 0, 2, 0, 1, 2]), tensor([2, 1, 0, 0, 1, 2]))
>>> print(new_g.edata('he'))
tensor([[0.],
        [1.],
        [2.],
        [2.],
        [1.],
        [0.]])

示例 2: 为异构图添加自环

>>> transform = AddSelfLoop(fill_data='sum')
>>> g = dgl.heterograph({
...     ('user', 'follows', 'user'): (torch.tensor([1, 2]),
...                                   torch.tensor([0, 1])),
...     ('user', 'plays', 'game'): (torch.tensor([0, 1]),
...                                 torch.tensor([0, 1]))})
>>> g.edata['feat'] = {('user', 'follows', 'user'): torch.randn(2, 5),
...                    ('user', 'plays', 'game'): torch.randn(2, 5)}
>>> g.edata['feat1'] = {('user', 'follows', 'user'): torch.randn(2, 15),
...                     ('user', 'plays', 'game'): torch.randn(2, 15)}
>>> new_g = transform(g)
>>> print(new_g.edges(etype='plays'))
(tensor([0, 1]), tensor([0, 1]))
>>> print(new_g.edges(etype='follows'))
(tensor([1, 2, 0, 1, 2]), tensor([0, 1, 0, 1, 2]))
>>> print(new_g.edata['feat'][('user', 'follows', 'user')].shape)
torch.Size([5, 5])

示例 3: 为异构图添加自环边类型

>>> transform = AddSelfLoop(new_etypes=True)
>>> new_g = transform(g)
>>> print(new_g.edges(etype='follows'))
(tensor([1, 2, 0, 1, 2]), tensor([0, 1, 0, 1, 2]))
>>> print(new_g.edges(etype=('game', 'self', 'game')))
(tensor([0, 1]), tensor([0, 1]))