2017-10-25 9 views
1

私は、ブルートフォースディスクリプタ(例:SIFT)のマッチングにHalideを使用しようとしています。スケジュールでrfactorを試してみたいですが、私は、連想性証明者に義務を負うことはできません。これまでのところ私には、以下の持っている:私はこれを解決する可能性がどのようになどの任意のポインタのためのrfactorディスクリプタマッチングのスケジュール

|| Failed to call rfactor() on minVal.update(0) since it can't prove associativity of the operator 

ありがとう:最後、コメントのない行は、悲しいことに失敗した

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); 

+0

これを[email protected]に投稿してもよろしいですか?回答に最も適格な人物は現在スタックオーバーフローに参加していません。私はあなたが好きなら質問を送ることもできますが、もしあなたが自分でそれをしたら、あなたが会話をする方が簡単かもしれないと考えました。これがあなたのために働かないなら、私は明日答えを得ようとします。 (質問へのリンクを投稿するのはもちろん大丈夫です。) –

+0

あなたの迅速な返信ありがとうございますZalman!あなたが提案してメーリングリストに投稿したとき、私はやったことがあります。 –

答えて

0

クイック回答:タプル要素の1つの順序だけが一致します。それらを反転させると、rfactorが許可されるはずです。リスト上でより完全な答えが得られるでしょう、そして、私たちはmatcherを一般化することを見ます。 (SO側が忘れられていないことを確認する答え)

+0

これは、私が持っていた主な問題を解決しました。他の問題は、私がHalideの5月リリースを使用していることに関連していました。現在の夜間ビルドに切り替えると、それらが解決されました(rfactorによる混合型int/floatの削減のサポート)。ありがとうZalmanと@ psuriana! –

関連する問題