用 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。平均游戏阶段0.5意味着仓位将平衡(> 0.5 = 接近开盘,< 0.5 = 接近结束) 战略评估绩效的测试可以通过使用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]