以前に、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を使用したコードに修正することで、ビルドできるようになった。
まとめ
GPS将棋(OpenShogiLib)のdf-pnを単体のUSI詰みエンジンとして移植した。
Codexを活用して必要なソース抽出・Windows対応・USI実装を行い、ビルド・実行することができた。
GitHubでWindows向けバイナリを公開した。