dgl.create_block

dgl.create_block(data_dict, num_src_nodes=None, num_dst_nodes=None, idtype=None, device=None, node_count_check=True)[source]

创建消息流图 (MFG) 作为 DGLBlock 对象。

参数:
  • data_dict (图数据) –

    用于构建 MFG 的字典数据。键是字符串三元组 (src_type, edge_type, dst_type) 的形式,指定源节点类型、边类型和目标节点类型。值是 \((U, V)\) 形式的图数据,其中 \((U[i], V[i])\) 形成 ID 为 \(i\) 的边。允许的图数据格式有:

    • (Tensor, Tensor):每个张量必须是包含节点 ID 的一维张量。DGL 将此格式称为“节点张量元组”。张量必须具有相同的数据类型,即 int32 或 int64。它们还应具有相同的设备上下文(参见下方对 idtypedevice 的描述)。

    • ('coo', (Tensor, Tensor)):与 (Tensor, Tensor) 相同。

    • ('csr', (Tensor, Tensor, Tensor)):这三个张量构成了图的邻接矩阵的 CSR 表示。第一个是行索引指针。第二个是列索引。第三个是边 ID,可以为空表示从 0 开始的连续整数 ID。

    • ('csc', (Tensor, Tensor, Tensor)):这三个张量构成了图的邻接矩阵的 CSC 表示。第一个是列索引指针。第二个是行索引。第三个是边 ID,可以为空表示从 0 开始的连续整数 ID。

    张量可以替换为任何整数可迭代对象(例如 list、tuple、numpy.ndarray)。

    如果您想创建只有一个源节点类型、一个目标节点类型和一个边类型的 MFG,则可以直接传入图数据,而无需将其包装成字典。

  • num_src_nodes (dict[str, int] 或 int, 可选) –

    每种源节点类型的节点数,这是一个将节点类型 \(T\) 映射到 \(T\) 类型源节点数量的字典。

    如果未给定节点类型 \(T\) 的值,DGL 会找到源节点类型为 \(T\)每个图数据中出现的最大 ID,并将节点数设置为该 ID 加一。如果给定值且小于或等于某些源节点类型的最大 ID,DGL 将引发错误。默认情况下,DGL 会推断所有源节点类型的节点数。

    如果您想创建只有一个源节点类型、一个目标节点类型和一个边类型的 MFG,则可以传入一个整数直接表示源节点数。

  • num_dst_nodes (dict[str, int] 或 int, 可选) –

    每种目标节点类型的节点数,这是一个将节点类型 \(T\) 映射到 \(T\) 类型目标节点数量的字典。

    如果未给定节点类型 \(T\) 的值,DGL 会找到目标节点类型为 \(T\)每个图数据中出现的最大 ID,并将节点数设置为该 ID 加一。如果给定值且小于或等于某些目标节点类型的最大 ID,DGL 将引发错误。默认情况下,DGL 会推断所有目标节点类型的节点数。

    如果您想创建只有一个源节点类型、一个目标节点类型和一个边类型的 MFG,则可以传入一个整数直接表示目标节点数。

  • idtype (int32int64, 可选) – 用于存储与结构相关的图信息(如节点和边 ID)的数据类型。它应该是一个框架特定的数据类型对象(例如 torch.int32)。如果为 None(默认),DGL 会从 data_dict 参数推断 ID 类型。

  • device (设备上下文, 可选) – 返回图的设备,应该是一个框架特定的设备对象(例如 torch.device)。如果为 None(默认),DGL 会使用 data 参数中张量的设备。如果 data 不是节点张量元组,则返回的图在 CPU 上。如果指定的 device 与提供的张量设备不同,它会先将给定的张量转换为指定的设备。

  • node_count_check (bool, 可选) – 当传入 num_src_nodes 和 num_dst_nodes 时,是否执行健全性检查以确保它们有效。

返回:

创建的 MFG。

返回类型:

DGLBlock

说明

  1. 如果未给定 idtype 参数,则

    • 在节点张量元组格式的情况下,DGL 使用给定 ID 张量的数据类型。

    • 在序列元组格式的情况下,DGL 使用 int64。

    图创建后,可以使用 dgl.DGLGraph.long()dgl.DGLGraph.int() 更改数据类型。

    如果指定的 idtype 参数与提供的张量数据类型不同,它会先将给定的张量转换为指定的数据类型。

  2. 最有效的构建方法是提供节点张量元组,而不指定 idtypedevice。这是因为在这种情况下,返回的图与输入的节点张量共享存储空间。

  3. DGL 内部以不同的稀疏格式维护图结构的多个副本,并根据调用的计算选择最有效的格式。如果大图的内存使用成为问题,请使用 dgl.DGLGraph.formats() 限制允许的格式。

  4. DGL 内部为同一组节点类型和规范边类型确定了确定性顺序,该顺序不一定遵循 data_dict 中的顺序。

示例

以下示例使用 PyTorch 后端。

>>> import dgl
>>> block = dgl.create_block(([0, 1, 2], [1, 2, 3]), num_src_nodes=3, num_dst_nodes=4)
>>> block
Block(num_src_nodes=3, num_dst_nodes=4, num_edges=3)
>>> block = dgl.create_block({
...     ('A', 'AB', 'B'): ([1, 2, 3], [2, 1, 0]),
...     ('B', 'BA', 'A'): ([2, 1], [2, 3])},
...     num_src_nodes={'A': 6, 'B': 5},
...     num_dst_nodes={'A': 4, 'B': 3})
>>> block
Block(num_src_nodes={'A': 6, 'B': 5},
      num_dst_nodes={'A': 4, 'B': 3},
      num_edges={('A', 'AB', 'B'): 3, ('B', 'BA', 'A'): 2},
      metagraph=[('A', 'B', 'AB'), ('B', 'A', 'BA')])

另请参阅

to_block