Как Syzygy хранит информацию?

10

Прочитав все, что я нашел до сих пор, я знаю, что Syzygy использует как файлы win / draw / loss, так и файлы расстояния до нуля, но я не нашел никакой информации о внутреннем формате файлов, который эти файлы используют. Я ищу низкоуровневое объяснение.

Оскар Смит
источник

Ответы:

13

Поскольку не существует единой всеобъемлющей публикации, она основана на коде исследования , генераторе и различных объяснениях Рональда де Мана (автора генератора).


При поиске практически любой табличной базы (она же огромная сжатая хеш-карта):

  1. Положение нормализовано ...
  2. ... сопоставлен с целочисленным индексом.
  3. Индекс ищется в таблице, которая определяет, к какому «блоку» он принадлежит.
  4. Блок распаковывается до тех пор, пока не будет получена информация для индекса.

Тогда обычно есть некоторый код «вне» исследования, по крайней мере, для разрешения перехвата.


Начиная с внешнего кода для WDL. Таблицы Syzygy используют оптимизацию, основанную на следующем наблюдении: если у позиции есть захват, который достигает определенного значения (например, выигрыш), то у самой позиции есть по крайней мере это значение (например, выигрыш). В этом случае таблица может хранить произвольное более низкое значение, в зависимости от того, что лучше для сжатия, и это можно легко исправить, проверив подтаблицы для перехватов.

Чтобы получить DTZ, сначала необходимо выполнить WDL-зонд. Если позиция нарисована, то DTZ равен 0, и таблица может хранить все, что лучше для сжатия. Если лучшим ходом был захват (который мы можем вспомнить из исследования WDL), то DTZ равен +/- 1 или +/- 101 в зависимости от WDL, и таблица может снова хранить что угодно, в зависимости от того, что лучше для сжатия.

Таблицы пешек содержат 4 подтаблицы, по одной на каждый файл «ведущей пешки» (после нормализации).

Таблицы WDL (под) являются двусторонними, то есть, по существу, они содержат две отдельные таблицы для каждой стороны эндшпиля (если материал не симметричен).

Таблицы DTZ хранят только одну сторону для перемещения. Таким образом, может потребоваться краткий однослойный поиск для вычисления DTZ для другой стороны.


(1) О нормализации: Есть несколько способов сделать это, и нелегко заранее сказать, какой из них приведет к наилучшему сжатию. Генератор просто пробует разные перестановки. Окончательный порядок кусков хранится в заголовке файла таблицы.

(2) немного комбинаторики. Задача состоит не в том, чтобы иметь большие пробелы для невозможных позиций. Хотя это довольно сложно, я не думаю, что Сизигий делает здесь что-то особенное. Концептуально фигуры или группы фигур размещаются на доске в порядке, указанном в заголовке.

(3) Сжатые значения хранятся в блоках. Размер блока указывается в заголовке таблицы. Индексы сопоставления таблиц с блоками редки, поэтому они позволяют прыгать очень близко к правильному блоку, а затем требуется короткое сканирование вперед или назад, чтобы найти точный блок. Блок может хранить значения не более 65536 позиций.

(4) Таблицы Syzygy используют пользовательское сжатие на основе RE-PAIR . Важной особенностью является то, что она фактически позволяет использовать возможности для хранения произвольных значений, которые были определены выше. Декомпрессия очень быстрая и может остановиться, как только будет доступно значение для нужного индекса.

При желании для таблиц DTZ может потребоваться еще один шаг f (wdl, сохраненное значение) = реальное значение. Эта дополнительная карта DTZ указана в заголовке таблицы и сама является таблицей с 8-битными записями. (Интересно, что этого оказалось недостаточно для 7-конечных эндшпилей, даже с пешками, так что теперь есть еще один флаг, который разрешает 16-битные записи).

Для значений DTZ, если генератор определил, что все значения для таблицы меньше, чем 100, точные отсчеты на половину хода не требуются для обеспечения идеальной игры. Вместо этого он устанавливает флаг в заголовке таблицы и округляет половину хода до полного хода, чтобы сэкономить место.

Также очевидно, что нет необходимости хранить знак или дополнительное смещение +/- 100 для проклятых финальных игр, потому что это может быть выведено из значения WDL.

Поскольку декомпрессия очень быстрая, нет необходимости в кеше. Вместо этого движки могут полагаться на кеш страниц операционной системы для хранения (все еще сжатых) блоков.


Таблицы из 6 частей содержат информацию WDL и DTZ для 3 787 154 440 416 уникальных позиций в 150 гигабайтах, то есть ~ 0,3 бита на позицию.

В целом таблицы Syzygy улучшены по сравнению с предыдущими форматами таблиц по крайней мере в 3 из этих областей, что делает их очень компактным и быстрым форматом. Удивительно, но генератор довольно быстрый.

И, конечно, использование DTZ50 - прагматичный выбор, потому что этой информации достаточно, чтобы надежно продвигаться вперед и обеспечить идеальную игру (по сравнению с исходом) как с правилом 50 ходов, так и без него. Однако, основываясь на изменениях в Cfish, которые опубликованы до сих пор (RdM сейчас работает над таблицами DTM), многие из методов будут применяться и к DTM.

Никлас
источник