Fishtest — это распределенная краудсорсинговая сеть тестирования, которая является главным секретом силы Stockfish. Любое изменение в коде движка (будь то новая формула LMR, изменение маржи для шахов или веса в нейросети NNUE) принимается только после того, как докажет свою эффективность на Fishtest.
💻 Как устроена сеть Fishtest?
- Волонтеры: Обычные пользователи со всего мира скачивают специальную клиентскую программу (скрипт на Python). Она работает в фоновом режиме и использует свободные ядра процессора для симуляции шахматных партий.
- Сервер-координатор: Центральный сервер Fishtest хранит базу задач (тестов), раздает код волонтерам, собирает результаты сыгранных партий и ведет статистику.
- Разработчики: Когда программист хочет улучшить формулу (например, изменить коэффициент редукции ходов), он отправляет свой измененный код (пулл-реквест) на Fishtest.
⚔️ Процесс тестирования: Сражение версий
- Master (Базовая) — текущая официальная версия Stockfish.
- Test (Модифицированная) — версия автора с измененным кодом.
- Партии играются с очень коротким контролем времени (например, 10 секунд на партию + 0.1 секунды на ход). Это позволяет играть миллионы партий в сутки.
- Чтобы партии были разнообразными, они всегда начинаются из специально подобранных случайных позиций (из дебютных книг). Каждая позиция играется дважды, со сменой цвета фигур, чтобы исключить фактор везения за белых.
📊 Математика отбора: Алгоритм SPRT
- H0 (Гипотеза «Мусор»): Изменение ухудшает движок или ничего не меняет. Если график результатов пробивает нижнюю границу, тест мгновенно останавливается (Fail), код отклоняется. Это экономит кучу машинного времени.
- H1 (Гипотеза «Прогресс»): Изменение делает движок сильнее хотя бы на 0.5–2 пункта рейтинга Эло. Если график пробивает верхнюю границу, тест останавливается с успехом (Pass), и код вливается в основную ветку Stockfish.
🏎️ Уровни тестирования
- STC (Короткий контроль): Первый этап. Скоростные партии для отсева явного брака.
- LTC (Длинный контроль): Если STC пройден, запускается тест на длинном контроле (например, 60 секунд + 0.6 секунды на ход). Это критически важно для формул LMR и шахов, так как некоторые идеи работают на быстрой глубине, но начинают «мазать» на глубоком просчете.
- SMP (Многопоточность): Проверка того, не ломает ли новая формула логику распределения задач между несколькими ядрами процессора (Lazy SMP).
📚 Как авторы подбирают дебютные книги для Fishtest?
1. Несбалансированные дебюты (UHO — Unbalanced Human Openings)
- Как они создаются: Компьютер берет реальные человеческие дебюты (из гроссмейстерских баз) длиной в 6–8 ходов (12–16 полуходов), но фильтрует их по строгой оценке. [5, 6]
- Критерий: Позиция на выходе из книги должна давать одной из сторон (обычно белым) небольшой, но ощутимый перевес — в диапазоне от +0.50 до +1.00 пешки (50–100 сантипешек). [6]
- Зачем это нужно: В такой острой и слегка «сломанной» позиции движки не могут просто засушить игру. Им приходится либо яростно защищаться, либо реализовывать преимущество. Процент ничьих падает с 95% до 45–55%, благодаря чему разница в силе кода становится видна очень быстро. [6]
2. Обязательный зеркальный матч (Смена цвета)
- В первой партии Версия А играет белыми, а Версия Б — черными.
- Во второй партии они меняются цветами в этой же самой позиции.
- Если позиция изначально была плохой для черных, и обе версии проиграли за черных, то счет в паре будет 1:1. Но если новая формула LMR или Singular Extensions помогла движку удержать ничью или победить в худшей позиции, модифицированная версия вырывается вперед по очкам.
3. Рандомизация и длина линий (Ply)
Позиции внутри книги перемешиваются случайным образом. Это гарантирует, что движок тестируется во всех типах миттельшпиля — от закрытых староиндийских структур до сверхострых вариантов сицилианской защиты. [5]
book: UHO_4060_v3.epd). [6]