记录器#

虽然python-graphblas在后端调度到GraphBLAS C API调用,但许多设计决策使得编写和阅读python-graphblas代码变得更加容易。因此,python-graphblas代码与后端调用之间的关系可能并不总是显而易见。

存在一个Recorder对象,它记录每个后端调用,使得更容易查看对后端实现进行了哪些调用以及进行了多少次调用。这可以用于调试,也可以在需要时将python-graphblas算法轻松移植到C中。

以下示例展示了Python中的单源最短路径算法。 由于存在Python的while循环,记录器将被插入循环内部,以避免查看每次循环迭代的调用(这并不十分有用)。 相反,只有最后一次迭代的调用将被返回。

from graphblas import op, semiring, Matrix, Vector, Recorder

# Create the graph and starting vector
start_node = 0
G = Matrix.from_coo(
    [0, 0, 1, 1, 2],
    [1, 2, 2, 3, 3],
    [2.0, 5.0, 1.5, 4.25, 0.5],
    nrows=4,
    ncols=4
)
v = Vector.from_coo([start_node], [0.0], size=4)

# Compute SSSP
while True:
    # Place the recorder inside to loop to only get one-loop worth of calls
    with Recorder() as r:
        w = v.dup()
        v(op.min) << semiring.min_plus(v @ G)
        if v.isequal(w):
            break
../_images/Recorder-output.png

为了解释结果,

  • v.dup() 变成了一个单一的 GrB_Vector_dup 调用

  • min_plus 矩阵乘法变成了一个单一的 GrB_vxm 调用

  • isequal 是一个配方,并变成了3行后端调用

    • GrB_Vector_new 用于创建一个临时对象

    • GrB_Vector_eWiseMult_BinaryOp 使用 EQ 操作符

    • GrB_Vector_reduce_BOOL 使用 LAND(逻辑与)操作符进行归约

几个对象的名称(v_70, v66, s_14)显然是随机的,但通过这些行,使用C语言的while循环和C API调用编写一个等效的SSSP算法应该非常简单。