TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

GPS将棋(OpenShogiLib)のdf-pn(詰将棋)をUSI mateエンジンとして移植

以前に、GPS将棋(OpenShogiLib)のdf-pnをdlshogiのAperyベースに移植することを試みたが、変更が多すぎて途中で挫折した。

Aperyベースにするのは一旦保留して、単体のUSI mateエンジンとして移植することにした。

Windows向けの移植

元のOpenShogiLibは、古いLinux向けのソースになっているため、そのままだとWindows向けにビルドできない。
以前に手動で対応しようとしたが、df-pnに関連するソースを抜き出すだけでも大変なため断念した。

Codexを使えば、自動でdf-pnに関連するソースを抽出して、Windowsでビルドエラーを解消もできそうだと思い、移植を試みた。

Codexで移植

元のOpenShogiLibから、まずdf-pnに関連する処理の解説を作成し、その解説を参考資料として、移植を実施した。
USI エンジンとして実行できるようにするため、USIの仕様も与えた。

oslのソースを元に、Df-pnアルゴリズムによるUSI mateエンジンを実装してください。

- oslmateフォルダにあるWindowsのコマンドラインプロジェクトに実装する
- oslのソースからDf-pnに関連するソースのみを移植する
- oslとソースフォルダ階層、ソースファイル名は合わせる
- oslのソースはnamespaceも含め、基本的に変更しない
- oslは、古いC++で記述されているため、Windowsのコマンドラインプロジェクトでコンパイルエラーになる箇所は修正する
- oslには、USIプロトコルは実装されていないため、新規に実装が必要。USIプロトコルの仕様はreferences/usi.mdにある。usi,setoption,isready,isready,go mate,stop,quitのみ実装する。
- ビルドコマンド: msbuild oslmate.slnx /t:Build /p:Configuration=Debug /p:Platform=x64

### 参考
oslフォルダ: oslのソース(Df-pnに無関係のソースも含む)
references/gpsshogi-dfpn.md: oslのDf-pnに関連するソースの解説
references/usi.md: USIプロトコルの仕様

ビルドエラーが解消され、実行できるバイナリが生成された。

assert対応

探索を実行すると、assertでエラーになったため、Visual StudioのGitHub Copilotで原因分析したところ、16 バイト整列のエラーだったため、alignas(16) を追加して解消した。

その1か所修正したことで、実行できるようになった。

position sfen lnsgk1snl/1r4g2/p1pppp1pp/6pP1/1p7/2P6/PPGPPPP1P/6SR1/LN+b1KG1NL w bs 11
go mate
checkmate B*6h 5i5h 6h5g+ 5h5i 7i6h

SSE2対応

OpenShogiLibはSSEに対応しているが、古いC++用のコードになっているため、OSL_USE_SSEマクロを有効にしてもビルドできない。

Codexで、SSE2に対応したintrinsicを使用したコードに修正することで、ビルドできるようになった。

Windows向けバイナリ公開

ShogiGUIなどに詰将棋エンジンとして登録して使用できるように、GitHubでWindowsバイナリを公開した。

こちらからダウンロードできる。

github.com

まとめ

GPS将棋(OpenShogiLib)のdf-pnを単体のUSI詰みエンジンとして移植した。
Codexを活用して必要なソース抽出・Windows対応・USI実装を行い、ビルド・実行することができた。
GitHubでWindows向けバイナリを公開した。