SSブログ

Aperyのdebug無しビルドでbenchが通らない その2 [コンピュータ将棋]

前のエントリの続き

・Position::isOKで文句が出るのはKingが消える

というところからたどっていったところ以下のようになった

・そもそもKingが取られていた
 前のやつにログを追記しておいたが、片方のKingが消えているのがisOKで問題有りとされる理由だった
 そしてKingが消えたのは相手の効きのある場所に突っ込んでいっていた

・なぜ突っ込んでいくか
 benchコマンドではスレッド数1なのでSplitなど並列関係の不具合ではない
 最適化オプションを全部はずしたので最適化も関係ない

 >問題のある手を無効化できていないはず

・inCheck
 探索の中で王手がかかっている場合はinCheck状態になっている
 そこから移動するときはEvasionの指し手生成が行われる
 指し手生成では非合法手も生成されているので、その手がちゃんとした手かチェックしてダメな場合はその手は破棄する

 ここで、問題の手が破棄されていなかったのを発見した

・合法手の判定
 Kingのときだけ特殊処理が入っていて、相手の駒の効きが働いていないときだけ移動できる
 (Kingではない場合は、一応捨てる手もありうるので合法手)
 このときに効きがあるかどうかをビットボードで判定している

・問題点
 ビットボードの中身を確認すると、本来立っていないといけないはずのビットが立っていなかった

・ビットを立てるタイミング
 幾つかのテーブルはコンパイル時に決定されているはずだが、その値が0であることがわかった。

(gdb) p PawnAttack
$3 = {{{p_ = {0, 0}} }, {{p_ = {0, 0}} }}
(gdb) p InFrontMask
$4 = {{{p_ = {0, 0}}, {p_ = {0, 0}}, {p_ = {0, 0}}, {p_ = {0, 0}}, {p_ = {0,
        0}}, {p_ = {0, 0}}, {p_ = {0, 0}}, {p_ = {0, 0}}, {p_ = {0, 0}}}, {{
      p_ = {0, 0}}, {p_ = {0, 0}}, {p_ = {0, 0}}, {p_ = {0, 0}}, {p_ = {0,
        0}}, {p_ = {0, 0}}, {p_ = {0, 0}}, {p_ = {0, 0}}, {p_ = {0, 0}}}}


 このため、銀、歩などの正面の効きが無くなっていた。

 念のためUbuntuとかVisutal Studioのclangでも確認してみたが、ちゃんと値が入っていたので、mingwコンパイラのバグの可能性が高い。

 テンプレートで定数を作る時の何かが起きてると思うのだが、テストコード書いてみたけど特に問題ないようでさっぱりわからなかった。

 というわけでどうにもならなさそうなのでAperyいじりはしばらくお休み。
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。