记录器#
虽然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
为了解释结果,
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算法应该非常简单。