bona4の評価関数を移植中
とりあえず移植完了
evalute関数は短いし、make_listも置換を駆使すればそんなに時間はかかりませんでした。
あとはpc_on_sqとかの配列を定義して、f_pawnとかのenum定義もコピペして、
最後にload_fv関数(ini.cの中にあります)をコピペすれば完成。
あと、VC++的にエラーになったのがrestrict。これは無いみたい?
restrict C99で導入された型修飾子。 C++ではサポートされていない。 restrict 型修飾子は、restrict で修飾されたポインターがアドレスしたメモリーが変更された場合に、 他のポインターがその同じメモリーにアクセスしないようにする、コンパイラーへの指示です。
ふーん。とりあえず除去しておこう。
make_listはbitboard系の関数名が違うので
n2 = 0; bb.CopyBB( bb_efu); while ( bb.isNZ() ) { sq = bb.FirstOneBB(); bb.ClearBB( sq ); list0[nlist] = f_pawn + sq; list2[n2] = e_pawn + Inv(sq); score += kkp[sq_bk0][sq_wk0][ kkp_pawn + sq ]; nlist += 1; n2 += 1; }
こんな感じに置換
で、さっそく動かしてみると
sum = 0; for ( i = 0; i < nlist; i++ ) { k0 = list0[i]; k1 = list1[i]; for ( j = 0; j <= i; j++ ) { l0 = list0[j]; l1 = list1[j]; assert( k0 >= l0 && k1 >= l1 ); sum += PcPcOnSq( sq_bk, k0, l0 ); sum -= PcPcOnSq( sq_wk, k1, l1 ); } }
のassertにひっかかる。make_listがまだおかしいらしい。
ところで、chessの場合はwhiteが先手で、blackが後手ですよね?
うちの場合、souが16x13座標系の先手王位置で、bitboard用にposTransマクロが9x9座標系に変換するんですけど
sq_bk = SQ_BKING; sq_wk = Inv( SQ_WKING );
を
sq_bk=posTrans(eou); sq_wk=Inv(posTrans(sou));
とすれば先手後手の対応は合ってるかな?