dgl.adj_sum_graph

dgl.adj_sum_graph(graphs, weight_name)[source]

创建一个加权图,其邻接矩阵是给定图的邻接矩阵之和,其中行表示源节点,列表示目标节点。

所有图形必须是简单图形,并且只能有一种边类型。 它们还必须具有相同的元图,即具有相同的源节点类型 和相同的目的节点类型。此外,每个图形的节点数量 也必须相同。

返回的图的元图将与输入图相同。

scipy不同,如果结果图中的一条边的权重为零,它不会从图中移除。

注释

此函数在CPU和GPU上均可工作。对于GPU,由于cuSPARSE的限制,节点和边的数量必须小于int32的最大值(即2 ** 31 - 1)。

此函数返回的边权重相对于输入的边权重是可微分的。

如果图形格式受到限制,两个图形都必须具有CSR可用。

Parameters:
  • graphs (list[DGLGraph]) – 图的列表。必须至少包含一个元素。

  • weight_name (str) –

    两个图的边权重的特征名称。

    对应的边特征必须是标量。

Returns:

新图。返回图的边权重将具有与weight_name相同的特征名称。

Return type:

DGLGraph

示例

以下展示了两个二分图之间的加权邻接矩阵求和。您也可以在同类图之间执行此操作。

>>> A = dgl.heterograph(
...     {('A', 'AB', 'B'): ([2, 2, 0, 2, 0, 1], [2, 1, 0, 0, 2, 2])},
...     num_nodes_dict={'A': 3, 'B': 4})
>>> B = dgl.heterograph(
...     {('A', 'AB', 'B'): ([1, 2, 0, 2, 1, 0], [0, 3, 2, 1, 3, 3])},
...     num_nodes_dict={'A': 3, 'B': 4})
>>> A.edata['w'] = torch.randn(6).requires_grad_()
>>> B.edata['w'] = torch.randn(6).requires_grad_()

如果你的图是一个多重图,首先调用dgl.to_simple()将其转换为简单图。

>>> A = dgl.to_simple(A)
>>> B = dgl.to_simple(B)

初始化可学习的边权重。

>>> A.edata['w'] = torch.randn(6).requires_grad_()
>>> B.edata['w'] = torch.randn(6).requires_grad_()

取总和。

>>> C = dgl.adj_sum_graph([A, B], 'w')
>>> C.edges()
(tensor([0, 0, 0, 1, 1, 1, 2, 2, 2, 2]),
 tensor([0, 2, 3, 2, 0, 3, 0, 1, 2, 3]))

请注意,这个函数是可微分的:

>>> C.edata['w'].sum().backward()
>>> A.edata['w'].grad
tensor([1., 1., 1., 1., 1., 1.])
>>> B.edata['w'].grad
tensor([1., 1., 1., 1., 1., 1.])