概要
USI プロトコルの Ponder をサポートする。
USI Ponder の仕様
Ponder を使用する条件
bestmove <move1> ponder <move2>
の形式でエンジンが予想手を送ってくること
Ponder で使用されるコマンド
エンジンから以下の順でコマンドが送られる。
- position
- go ponder
- 予想的中 => ponderhit / 予想ハズレ => stop
予想が外れたにも関わらず、エンジンは stop 受信後に bestmove を送らなければならない。
エンジンの予想手が外れた場合
この場合、GUIはエンジンにstopを送ります。
>stop
エンジンはこれに対し、思考中ならすぐに思考を打ち切って、現時点で最善と考えている手をbestmoveで返します。既に思考が終わっていたなら、探索済みの指し手をbestmoveで返します。(bestmoveのあとにponderで相手の予想手を追加しても構いませんが、いずれにしろ無視されます。)
何のためにあるのか何度読み返してもわからない。
なお、 Sunfish は bestmove resign
を送っている。(どうせ無視されるので局面に応じで変わる値を送るのが面倒)
エンジンが予想手を 1 つに絞らない場合
なお、先読みをする時に、予想手を一つではなく複数考えたいということがあるかもしれません。そのような場合は、USIの本来の使い方からは外れますが、bestmove ponder ではなく、単にbestmove だけを返し、相手の手番中に勝手に先読みするようにして下さい。
エンジンが bestmove に ponder を付けてこなかった場合、 info で送られてきた pv は現在の局面からのものと解釈し、 ponder を付けてきた場合には予想手を指したあとの局面からのものと解釈するのが正しいと思われる。
USI_Ponder 設定
setoption コマンド
USI_Ponder オプションはエンジン側が使用していなくても、将棋所では常に設定画面に表示され、エンジンに値が送られるとされている。
なお、 USI_Hash も同様である。
将棋所はもともと対局開始のダイアログの中に USI_Ponder と USI_Hash の設定を表示していた。
しかし、現在はエンジンの設定画面の中に追いやっている。
USI_PonderとUSI_Hashに関しては、将棋所4.0.2までは対局ダイアログ内に設定項目がありましたが、将棋所4.1.0からは、エンジン設定ダイアログを開いた時に上部に表示される「相手の手番中に先読み(USI_Ponder)」と「ハッシュメモリ(USI_Hash)」で設定するようになりました。
この二つに関しては、エンジンが起動時にoptionコマンドで返さなくても、将棋所で対局を開始するときに必ず送るようにしてあります。
おそらく、以前との互換性のために必ず送るようにしているのだと思う。
2022/6/14 現在、 USI_Ponder と USI_Hash を明示的していないが送られてきたら使うというエンジンは発見できていない。
したがって、将棋所と同じ実装を Electron 将棋がする必要性は無いと思う。
ただ、 USI_Ponder と USI_Hash が無ければ追加するというのは簡単に実装できるのでやっても良いかもしれない。
go ponder コマンドの有無
USI_Ponder が false の場合に将棋所は go ponder コマンドを送らない。
つまり、 go ponder
が送られるのは、 USI_Ponder が true でありなおかつ bestmove で ponder が指定された場合だけである。
USI Ponder の利用状況
- 使用するエンジン
- やねうら王
- Apery
- Sunfish4(予想手を送っているが内部では使わずに前の局面で置換表を溜め込んでいる。 info も送っていない。)
Stochastic Ponder
やねうら王系は Stochastic Ponder 設定を有効にすると予想手を送った上で前の局面から思考しているらしい。
https://yaneuraou.yaneu.com/2021/05/04/the-function-of-stochastic-ponder-in-shogi-ai/
ただ、この場合は PV の表示や評価値の表示に問題が出る。
一方で白ビールは予想手自体を送っていない。