Nyanyan/Egaroucid

Hint Score Wrong Bug

Closed this issue · 25 comments

キャッシュ周りだと思うが、ヒント表示が狂う現象が報告された。Lazy SMP+TT周りが怪しいような気もするが、調査してみる。

Screenshot 2024-07-05 190200
Screenshot 2024-07-05 233926

ユーザ報告

20マス空きを過ぎたあたりだけで起こるという報告をもらった。20マス空きあたりで何か変なことをしていないかを見ると良さそう

若干挙動が怪しい棋譜例

c4e3f5e6f6c5c3c6d3d2e2b3e1f4f3f2f1c2b1g3g4d6g5h4h5h3h2h6h7

image
image

このバグは「以前の探索結果が残っている場合にヒント計算で起こる」という性質がある気がする。そうすると、深さd-99%とd-1-100%(などなど)での探索を考える場合

  • d-99%を計算し、間違ったスコアを得る
  • d-1-100%を計算する
  • 再度d-99%を計算するが、すでにd-99%の値はTTに登録されているので計算せずにTT参照だけで間違ったスコアを提示してしまう

というのが起こりそうな気がする

いや、これはなんか違いそう

c4e3f5e6f6c5c3c6d3d2e2b3e1f4f3f2f1c2b1g3g4d6g5h4h5h3h2h6h7g6b4a3b5g2f7f8
image
image

c4e3f5e6f6c5c3c6d3d2e2b3e1f4f3f2f1c2b1g3g4d6g5h4h5h3h2h6

この棋譜がかなりバグを再現する。低めの探索確率での読み切りから始めて自己対戦させるとこのバグが起こるらしい。
image

TTでdepthをmpc_levelよりも優先しているのは、良くないかもしれない。

first_negascoutでのTT登録をなくしたらぱっと見バグが直ったように見える

GUI側の問題な可能性もあるので、チェックすべき。

tree_search_legal後に6手分くらいのTTを削除すると、Egaroucid for Consoleでもこの棋譜でバグが再現した。

c4e3f5e6f6c5c3c6d3d2e2b3e1f4f3f2f1c2b1g3g4d6g5h4h5h3h2h6

この棋譜がかなりバグを再現する。低めの探索確率での読み切りから始めて自己対戦させるとこのバグが起こるらしい。 image

TTを全消去するとバグは起きない(TTを根近くの数手分だけ消すと起きる)ので、普通にどこか探索をミスるバグがありそう。

nega_alpha_end_nwsを使わずに探索しても同様のバグが発生するので、中盤探索に問題がありそう

nega_scoutからlast4を呼ぶときになぜか-last4(-beta,-alpha)と呼んでいたので修正

nega_scout関数のみ(つまり、中盤探索の有window探索のみ)でバグがとても再現するので、ここにバグがあると見てよさそう
image

追記: nega_scout内YBWCを使ったままだったので、これをオフにして実験したが、結局バグるのでnega_scoutと見て良さそう

NegascoutでのNWSをなくし(つまりαβとして実行する)、YBWCを外した(つまり、純粋αβになる)らバグが再現しなかった(たまたまかも?)

NWSの扱いで何かバグっている可能性がある。とりあえずNegascoutでのNWSをなくしたまま、YBWCでのNWSをNegascout(というかαβ)に置き換えて実験してみると良さそう

1スレッドでバグが発生する棋譜を見つけた

c4e3f5e6f6c5c3c6d3d2e2b3e1f4f3f2f1c2b1g3g4d6g5h4h5h3h2h6h7g6b4a3b5g2f7f8c7a5b6d7e8c8g8a6e7b2h1g1d1c1a1a2d8

image

c4e3f5e6f6c5c3c6d3d2e2b3e1f4f3f2f1c2b1g3g4d6g5h4h5h3h2h6h7g6b4a3b5g2f7f8c7a5b6d7e8c8g8a6e7b2h1g1d1c1a1a2d8h8a4

も再現する

このバグはlast4の呼び方に依存するものだった。
#276 (comment)

NegascoutのYBWCを切るとこのケースがバグらないので、やはりNegascoutでのYBWCかなぁ
#276 (comment)

lll3.txt
これはこの問題に関係していますか?
level 20にしてhintを2回打つと必ずf8からe7に変わります
level 22以上だと起きないかもしれません
複数スレッドで起動すると一回目からe7になるときがあります
これは7.1.0でやってますが最新のでも同じようです

@acepck おそらく同じ問題だと思われます。

@acepck ごめんなさい、これは違う原因のようです。
コンソール版のhintコマンドでは、指定されたヒント数が少ないときは良さそうな手にあたりをつけて探索するので、それが外れるとこのような挙動になります。
これはこれで良くないような気がするので、改善しようと思います。
#276 (comment)

分かりました

nega_scout内でeldest moveを無条件にvとして扱うのがだめらしい。
g=nega_scout(eldest move)
if (v < g) ...
としないとだめみたい(こうしたらバグが消えたように見える)

バグ修正完了!!