KPPの差分評価メモ

3駒関係(KPP:[王][駒1][駒2])の計算部分は簡単に書くと以下のようになる。

	for ( i = 0; i < nlist; i++ )
	{
		for ( j = 0; j <= i; j++ )
		{
		  sum += PcPcOnSq(sq_bk0, list[i], list[j]);
		}
	}

listに駒種+駒位置情報を入れて2重ループを回す。
KPPの対称性から、j <= iの条件となる。

これを図で書くとこんなイメージ。

2重ループの計算が重いのと、make_moveしてもlistは1〜3個
くらいしか変わらないので、毎回、全部まともに計算する必要は
ない。そこでlistが変わった場合だけを差分計算する。

list[1]の寄与を取り除く場合は、以下の赤い部分を引けばよい。

PcPcOnSqは対称なので、上記の赤の総和は以下の部分の総和と同じ。

listを同時に二つ更新する場合も同様だけど、以下のように重なる
部分が生じる。このときは重なった部分を足してやればよい。

新しくlistを追加する場合は以下。


ボナンザは毎回listを生成しなおしているけど、
非ビットボードのsimkにとっては辛いのでlistを差分更新にした。
KKP+KPPハッシュ(局面ハッシュとは別物)との絡みもあるので
面倒だったが、なんとか動いている模様。
全体で30%くらい速くなった。