用 Rust 編寫的 UCI 西洋棋引擎,Proxima b、Proxima b 2.0 和 Cosette 的後繼者。該專案是在下班後編寫的,目標是達到 3000 Elo 的強度。非常適合作為其他國際象棋引擎的陪練夥伴,因為它使用非常快的遊戲進行了嚴格的測試。支援 Syzygy 表庫、MultiPV、思考和多線程。
目前強度:3000 Elo (01-11-2024)
文件:https://tearth.dev/Inanis/
版本 | 發售日期 | 埃洛 | 主要變化 |
---|---|---|---|
1.5.0 | 2024年11月1日 | 3000 | 吸入視窗、改進的效能和多線程 |
1.4.0 | 2024年3月8日 | 2950 | 檢查擴展、相對 PST、反向啟發式 |
1.3.0 | 2024年6月14日 | 2900 | 梯度下降調諧器,改進的 SEE 和評估 |
1.2.1 | 2023年4月9日 | 2850 | 直接從命令列執行命令,在 UCI 模式下執行 |
1.2.0 | 2023年1月15日 | 2850 | 改進了 Syzygy 支援、整體性能和穩定性改進 |
1.1.1 | 2022年8月14日 | 2800 | 對報告的問題進行了一系列修復,提高了穩定性 |
1.1.0 | 2022年7月31日 | 2800 | Syzygy 表庫、MultiPV、調整後的評估 |
1.0.1 | 2022年5月4日 | 2750 | 對報告的問題進行了一系列修復,提高了穩定性 |
1.0.0 | 2022年2月4日 | 2750 | 初次發布 |
每個版本都包含一組適用於各種平台的二進位檔案:Linux(x86、x86-64、ARM、AArch64)和 Windows(x86、x86-64)。 Linux x86-64 和 Windows x86-64 也使用兩個附加指令集變體進行編譯:POPCNT 和 POPCNT + BMI1 + BMI2 - 為了獲得最佳性能,請嘗試使用不同引擎的變體運行benchmark
命令,並選擇一個沒有返回錯誤並且具有最先進的說明。
非常感謝所有測試人員和他們的努力!請注意,由於不同的引擎池和測試所花費的時間控制,上面列表中的 Elo 可能與作者的估計略有不同。
Inanis 有一個官方 lichess 帳戶,您可以嘗試挑戰引擎:https://lichess.org/@/InanisBot。請注意,那裡的評級非常低調,無法與 CCRL 相比。接受帶有子彈、閃電、快速和經典時間控制的標準國際象棋。
Hash
(預設值:2 MB) - 轉置表和 pawn 雜湊表的總大小(以兆位元組為單位)Move Overhead
(預設值:10 毫秒) - 在搜尋某些意外延遲(例如 GUI 的緩慢或網路延遲)期間應保留的時間量(以毫秒為單位)MultiPV
(預設:1 個 PV 線) - 搜尋期間應顯示的 PV 線數Threads
(預設值:1 個執行緒) - 搜尋期間使用的執行緒數(應小於處理器核心數以獲得最佳效能)SyzygyPath
(預設值:<empty>) - 選用 Syzygy 表庫的位置SyzygyProbeLimit
(預設值:8 件) - 應執行表基探測的最大件數SyzygyProbeDepth
(預設值:6) - 應執行表庫探測的最小深度Ponder
(預設值: false) - 允許引擎在對手的時間進行思考Crash Files
(預設值: false) - 啟用後,將崩潰訊息保存在 ./crash 目錄中預設情況下,呼叫cargo build
或cargo build --release
將建立不支援Syzygy表庫的引擎(但仍功能齊全)。要包含它,請新增--features syzygy,bindgen
並確保在 Windows 上工作時安裝了 clang(MSVC 不支援某些 C11 元素,因此無法使用)。
Inanis 有一個內建調諧器,可以使用眾所周知的 Texel 調諧方法來優化所有評估參數。作為輸出,Rust 原始檔的生成方式允許它們直接貼到引擎的原始程式碼中。
輸入檔案範例:
r2qkr2/p1pp1ppp/1pn1pn2/2P5/3Pb3/2N1P3/PP3PPP/R1B1KB1R b KQq - c9 "0-1";
r4rk1/3bppb1/p3q1p1/1p1p3p/2pPn3/P1P1PN1P/1PB1QPPB/1R3RK1 b - - c9 "1/2-1/2";
4Q3/8/8/8/6k1/4K2p/3N4/5q2 b - - c9 "0-1";
r4rk1/1Qpbq1bp/p1n2np1/3p1p2/3P1P2/P1NBPN1P/1P1B2P1/R4RK1 b - - c9 "0-1";
運行調諧器的範例:
tuner ./input/quiet.epd ./output/ true 0.007 0.75 1
- 對quiet.epd
中儲存的位置執行單執行緒調整,從隨機值開始,縮放常數 0.007,WDL 比率 0.75 並將結果儲存在output
目錄
tuner ./input/quiet.epd ./output/ false None 1.0 4
- 使用 4 個執行緒對quiet.epd
中儲存的位置運行調整,從引擎中已設定的值開始,調整前確定縮放常數,WDL 比率 1.0並將結果保存在output
目錄中
從 1.1.0 版開始,Inanis 還具有一個命令,可以根據提供的 PGN 輸入生成具有安靜位置的 epd 檔案:
dataset ./input/games.pgn ./output/quiet.epd 16 250 50 3 0.5
- 透過解析games.pgn
並從每個遊戲中獲取 3 個隨機位置,使用 ply 忽略這些位置,生成一個新的quiet.epd
檔案小於16,評估分數大於250,評估分數與靜止搜尋分數的差異大於50。 戰略評估績效的測試可以透過使用test
指令來完成,該指令對 EPD 檔案中儲存的位置執行固定深度的搜尋。
範例測試套件檔案:
1k2r2r/1bq2p2/pn4p1/3pP3/pbpN1P1p/4QN1B/1P4PP/2RR3K b - - bm Nd7; c0 "Nd7=10, Bc5=8, Bc6=2, Be7=7"; id "STS: Knight Outposts/Repositioning/Centralization.001";
1q2bn2/6pk/2p1pr1p/2Q2p1P/1PP5/5N2/5PP1/4RBK1 w - - bm Ne5; c0 "Ne5=10, Nd4=8, Ra1=6, b5=9"; id "STS: Knight Outposts/Repositioning/Centralization.002";
1r1q1rk1/1b1n1p1p/p2b1np1/3pN3/3P1P2/P1N5/3BB1PP/1R1Q1RK1 b - - bm Ne4; c0 "Ne4=10, Bxa3=6, Nb6=6"; id "STS: Knight Outposts/Repositioning/Centralization.003";
1k2r2r/1bq2p2/pn4p1/3pP3/pbpN1P1p/4QN1B/1P4PP/2RR3K b - - bm Nd7; c0 "Nd7=10, Bc5=8, Bc6=2, Be7=7"; id "STS: Knight Outposts/Repositioning/Centralization.001";
1q2bn2/6pk/2p1pr1p/2Q2p1P/1PP5/5N2/5PP1/4RBK1 w - - bm Ne5; c0 "Ne5=10, Nd4=8, Ra1=6, b5=9"; id "STS: Knight Outposts/Repositioning/Centralization.002";
1r1q1rk1/1b1n1p1p/p2b1np1/3pN3/3P1P2/P1N5/3BB1PP/1R1Q1RK1 b - - bm Ne4; c0 "Ne4=10, Bxa3=6, Nb6=6"; id "STS: Knight Outposts/Repositioning/Centralization.003";
運行測試的範例:
testset ./input/STS1.epd 16 64 4
- 使用 64 MB 轉置表和 4 個線程,對儲存在STS1.epd
檔案中的所有位置運行固定深度(本例中為 16)搜尋。為了將測試分類為成功,最後一次迭代必須返回正確的最佳移動。 建構依賴關係
開發依賴
外部函式庫
因為 Inanis 是一個寵物項目,所以目前不接受拉取請求 - 這可能會也可能不會在未來改變,這取決於項目的發展方式。但是,請隨時提出問題或建議,我們將不勝感激。
以下列出的所有指令都可以在互動模式下執行,也可以直接從命令列執行,例如inanis.exe perft 5
。僅當引擎使用dev
功能編譯時,標記為 [DEV] 的條目才可用。
=== General ===
benchmark - run test for a set of positions
evaluate [fen] - show score for the position
uci - run Universal Chess Interface
quit - close the application
=== Development ===
[DEV] dataset [pgn] [output] [min_ply] [max_score] [max_diff] [density] - dataset generator
[DEV] magic - generate magic numbers
[DEV] testset [epd] [depth] [ttable_size] [threads_count] - run test of positions
[DEV] tuner [epd] [output] [randomize] [k] [wdl_ratio] [threads_count] - run tuning
=== Perft ===
perft [depth]
perft [depth] fen [fen]
perft [depth] moves [moves]
=== Divided Perft ===
dperft [depth]
dperft [depth] fen [fen]
dperft [depth] moves [moves]
=== Quick Perft ===
qperft [depth] [threads_count] [hashtable_size_mb]
qperft [depth] [threads_count] [hashtable_size_mb] fen [fen]
qperft [depth] [threads_count] [hashtable_size_mb] moves [moves]