dgl.adj_sum_graph
- dgl.adj_sum_graph(graphs, weight_name)[source]
创建一个加权图,其邻接矩阵是给定图的邻接矩阵之和,其中行表示源节点,列表示目标节点。
所有图必须是简单图,且必须只有一种边类型。它们还必须具有相同的元图,即具有相同的源节点类型和目标节点类型。此外,每个图的节点数量也必须相同。
返回图的元图将与输入图相同。
与
scipy
不同,如果结果图中的边权重为零,它不会从图中移除。注释
此函数支持 CPU 和 GPU。对于 GPU,由于 cuSPARSE 的限制,节点和边的数量必须小于
int32
的最大值(即2 ** 31 - 1
)。此函数返回的边权重相对于输入边权重是可微分的。
如果图格式受限,则两个图都必须支持 CSR 格式。
- 参数:
- 返回值:
新图。返回图的边权重将具有与
weight_name
相同的特征名称。- 返回类型:
示例
下面展示了两个二分图之间的加权邻接矩阵求和。您也可以在同质图之间执行此操作。
>>> 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.])