我正在尝试将Halide用于强力描述符(例如SIFT)匹配。我想在时间表中尝试rfactor,但我似乎无法得到关联性证明。到目前为止,我有以下内容:
Var c("c"), i("i");
Func diff("diff"), diffSq("diffSq"), dotp("dotp"), out("out"),
inp1("inp1"), inp2("inp2"), minVal("minVal");
inp1(c,x) = input1(c,x);
inp2(c,y) = input2(c,y);
diff(x,y,c) = inp1(c, x) - inp2(c, y);
diffSq(x,y,c) = diff(x,y,c) * diff(x,y,c);
RDom rc(0,128);
dotp(x, y) = 0.f;
dotp(x, y) += diffSq(x, y, rc);
// Argmin, see https://github.com/halide/Halide/blob/master/test/correctness/rfactor.cpp#L804
RDom ry(0, input2.height(), "ry");
minVal(x) = {-1, std::numeric_limits<float>::max()};
minVal(x) = {
select(minVal(x)[1] < dotp(x, ry)
,minVal(x)[0]
,ry),
min(minVal(x)[1], dotp(x, ry))
};
out(x) = minVal(x)[0];
// Schedule
RVar ryo("ryo"), ryi("ryi");
Var yy("yy");
Func intermediate("inter");
dotp.compute_root();
minVal.update(0).split(ry, ryo, ryi, 16);
//intermediate = minVal.update(0).rfactor(ryo, yy);
最后一条未注释的行遗憾地失败了:
|| Failed to call rfactor() on minVal.update(0) since it can't prove associativity of the operator
感谢关于如何解决这个问题的任何指示!
答案 0 :(得分:0)
快速回答:只有一个元组元素的顺序匹配。翻转它们应该允许rfactor。列表中将有一个更完整的答案,我们将看一下概括匹配器。 (回答确保SO方面不会被遗忘。)