Шахматный движок UCI, написанный на Rust, преемник Proxima b, Proxima b 2.0 и Cosette. Проект написан в нерабочее время, с целью достичь силы в 3000 Эло. Идеально подходит в качестве спарринг-партнера для других шахматных движков, поскольку прошел тщательное тестирование с использованием очень быстрых игр. Поддерживает базы таблиц Syzygy, MultiPV, размышление и многопоточность.
Текущая сила : 3000 Эло (11.01.2024).
Документация : https://tearth.dev/Inanis/.
Версия | Дата выпуска | Эло | Основные изменения |
---|---|---|---|
1.5.0 | 11.01.2024 | 3000 | Окна аспирации, улучшенная производительность и многопоточность |
1.4.0 | 08.03.2024 | 2950 | Проверка расширений, относительное тихоокеанское время, эвристика противодействия |
1.3.0 | 14.06.2024 | 2900 | Тюнер градиентного спуска, улучшенное SEE и оценка |
1.2.1 | 09.04.2023 | 2850 | Команды, выполняемые непосредственно из командной строки, выполняются в режиме UCI. |
1.2.0 | 15-01-2023 | 2850 | Улучшена поддержка Syzygy, улучшена общая производительность и стабильность. |
1.1.1 | 14-08-2022 | 2800 | Множество исправлений обнаруженных проблем, улучшение стабильности. |
1.1.0 | 31-07-2022 | 2800 | Табличные базы Syzygy, MultiPV, скорректированная оценка |
1.0.1 | 04.05.2022 | 2750 | Множество исправлений обнаруженных проблем, улучшение стабильности. |
1.0.0 | 04.02.2022 | 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 МБ) — общий размер (в мегабайтах) таблицы транспонирования и хэш-таблицы пешки.Move Overhead
(по умолчанию: 10 мс) — количество времени (в миллисекундах), которое следует зарезервировать при поиске некоторых неожиданных задержек (например, медленности графического интерфейса или лагов сети)MultiPV
(по умолчанию: 1 линия PV) — количество линий PV, которые должны отображаться во время поиска.Threads
(по умолчанию: 1 поток) — количество потоков, используемых во время поиска (для достижения максимальной производительности должно быть меньше количества ядер процессора).SyzygyPath
(по умолчанию: <пусто>) — расположение дополнительных табличных баз Syzygy.SyzygyProbeLimit
(по умолчанию: 8 штук) — максимальное количество штук, для которых должна быть выполнена проверка таблицы.SyzygyProbeDepth
(по умолчанию: 6) — минимальная глубина, на которой должен выполняться зонд таблицы.Ponder
(по умолчанию: false) — позволяет движку думать во время противника.Crash Files
(по умолчанию: false) — если этот параметр включен, сообщения о сбоях сохраняются в каталоге ./crash. По умолчанию вызов cargo build
или cargo build --release
соберет движок без поддержки табличных баз Syzygy (но при этом полностью функциональный). Чтобы включить его, добавьте --features syzygy,bindgen
и убедитесь, что у вас установлен clang при работе в Windows (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 также имеется команда для создания файлов epd со спокойными позициями на основе предоставленного ввода PGN:
dataset ./input/games.pgn ./output/quiet.epd 16 250 50 3 0.5
— сгенерируйте новый файл quiet.epd
, проанализировав games.pgn
и взяв 3 случайные позиции из каждой игры, игнорируя их с помощью ply меньше 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
— запустить поиск фиксированной глубины (в данном случае 16) для всех позиций, хранящихся в файле STS1.epd
, с использованием таблицы транспонирования размером 64 МБ и 4 потоков. Чтобы классифицировать тест как успешный, последняя итерация должна вернуть правильный лучший ход. Создание зависимостей
Зависимости разработчиков
Внешние библиотеки
Поскольку 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]