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

とすれば先手後手の対応は合ってるかな?