興味深いドキュメントをご紹介頂きました。
開発環境が VS なのでアレなんですが、Linux で動くのだったかどうか。とりあえず空き稼動を使って読み始めることにしました。
ドキュメント見つつで確認が必要なナニを以下に列挙してみます。
- pext 命令、popcnt 命令
- engine 配下のソース確認
- エンジンは標準入出力経由で、とのこと
- 手番を表現する Color な enum は shogi.h にて定義 (別途掘削
- 筋は File で段は Rank
- 盤上の升目も enum で表現されてて右上 (11) が 0 で左下 (99) が 80
- | な operator 定義していた (別途確認
- class や struct ではなく enum を使う
- 筋、段、升目、指し手も enum
- 升目 (square) は 7bit 必要なのか (81 升)
- ほとんどすべての enum について is_ok という手続きを用意
- 指し手 16bit で評価値が 16bit
- ループ内における shift の最適化な話が出てます
- 指し手から情報を落とすことによる高速な指し手生成
- Piece という enum は先後の区別を持っていて変数名は pc
- 先後の区別の無いものも Piece を使い、変数名は pt
- pr は Raw Piece (成っていない駒)
Piece について
- Piece のアイデアは Apery のものとのこと
- MoveList が指し手生成器で LEGAL が合法手の種別
- 指し手種別は色々あるので別途確認 (shogi.h にて enum 定義)
- EVASIONS は王手回避の指し手種別
- NON_EVASIONS と王手回避のあたり、再度確認
- 合法手であるかどうかをチェックする手続きあり (legal 手続き)
Position について
- 指し手は Move という enum
- do_move 手続きに渡す StateInfo というものは何か
- undo_move という手続き
- その局面で捕獲した駒の情報を保持
- do_move 一回につき、StateInfo のインスタンスが一つ必要
- 探索は再帰手続きとして書くのでスタックに置いときゃ良い
- undo する時のために previous というポインタも保持
局面の Hash 値
- Position#state() が StateInfo の参照を戻すのでそのオブジェクトの key() を呼び出すことで hash が取得できる
- hash は辞書の鍵にする模様 (この辞書を置換表と呼んでいる模様
- あら? これ系のソレって何って呼んでたっけ (ナチュラル
- Zobrist Hash については別途確認
- tt て置換表のことだろうな (TranspositionTable か
- 置換表は実装によって異なっている模様