TadaoYamaokaの開発日記

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

GPS将棋(OpenShogiLib)のdf-pnの移植

dlshogiは、詰み探索にdf-pnを実装しているが、ループ局面が正しく判定できない場合があり、解けない問題がある。 実戦では、ほぼ現れないので、実用上は問題になっていない。 実戦では、35手くらいまでの詰みは数秒で解ける。 それ以上長い詰みは、時間がかかる場合があるため、探索の深さを制限している。

より長い詰みを高速で解けるように、df-pnをより完全な実装にしたいと考えている。

GPS将棋(OpenShogiLib)のdf-pn

オープンソースのdf-pnの実装では、GPS将棋(OpenShogiLib)のdf-pnがループ局面やガベージコレクトに対応した完全に実装になっている。

そこで、GPS将棋のdf-pnを、Aperyベースのdlshogiに移植することを試みる。

まず、手始めとして、GPS将棋をビルドして、デバッグできようにした。

ソース修正

ソースをダウンロードして、手順通りビルドすれば良いが、Ubuntu 22.04のg++では、コンパイルエラーになる箇所があるため、OpenShogiLibの以下の箇所の修正が必要である。

修正差分: Fix compile errors · TadaoYamaoka/osl@3528a3f · GitHub

修正したソースを、GitHubにプッシュしている。

OpenShogiLib: github.com

デバッグ環境

VSCodeで、デバッグできるようにする。

OpenShogiLibをビルドすると、dfpnstatというコマンドが生成される。

これをVSCodeで、gdbを使用してデバッグする設定を行う。

launch.jsonに、以下を記述する。

    "configurations": [
        {
            "name": "dfpnstat",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/sample/checkmate/dfpnstat",
            "args": ["-d", "-l", "11451419", "~/csa/zuko03.csa"],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}/sample/checkmate",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "Set Disassembly Flavor to Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ]
        }
    ]

argsのcsaファイルは、適当なテスト局面をcsaで与える。

例:将棋図巧第3番(zuko03.csa)

V2.2
N+
N-
P1 *  * -FU * -KI+TO *  *  * 
P2 * +FU * -FU * -FU-FU *  * 
P3-KY * +FU * -KI * +GI-RY * 
P4+FU * +KA * +FU * -TO *  * 
P5 * -FU *  *  * -KY *  *  * 
P6 * -OU+KE *  *  *  *  *  * 
P7 *  *  *  *  *  *  *  *  * 
P8 *  * +UM *  *  *  *  *  * 
P9 * -HI *  *  *  *  *  *  * 
P+00KI00GI00KE00KE00FU00FU
P-00KI00GI00GI00KE00KY00KY00FU00FU00FU00FU00FU
+

"-l"で、探索局面数上限を設定する。

makeする際に、

make debug

で、デバッグ情報ありでビルドする。

これで、VSCodeで、デバッグ実行しながらソースを調査できる。