¿Cómo almacena Syzygy su información?

10

Al leer todo lo que he encontrado hasta ahora, sé que Syzygy utiliza archivos de ganancia / empate / pérdida y archivos de distancia a cero, pero no he encontrado ninguna información sobre el formato de archivo interno que utilizan estos archivos. Estoy buscando la explicación arenosa de bajo nivel.

Oscar Smith
fuente

Respuestas:

13

Dado que no existe una publicación completa única, esto se basa en el código de prueba , el generador y varias explicaciones de Ronald de Man (el autor del generador).


Al sondear casi cualquier base de tabla (también conocido como gran mapa hash comprimido):

  1. La posición está normalizada ...
  2. ... mapeado a un índice entero.
  3. El índice se busca en una tabla que identifica a qué "bloque" pertenece.
  4. El bloque se descomprime hasta que se pueda recuperar la información del índice.

Luego, por lo general, hay algún código "fuera" del sondeo, al menos para resolver capturas pasantes.


Comenzando con el código externo para WDL. Las tablas de Syzygy utilizan una optimización basada en la siguiente observación: si una posición tiene una captura que logra un valor particular (por ejemplo, está ganando), entonces la posición en sí tiene al menos ese valor (por ejemplo, está ganando). En este caso, la tabla puede almacenar un valor inferior arbitrario, lo que sea mejor para la compresión, y esto puede corregirse fácilmente comprobando las subtablas para capturas.

Para obtener una DTZ, primero se debe hacer una sonda WDL. Si se dibuja la posición, DTZ es 0 y la tabla puede almacenar cualquier cosa, lo que sea mejor para la compresión. Si el mejor movimiento fue una captura (que podemos recordar de la sonda WDL), entonces el DTZ es +/- 1 o +/- 101 dependiendo del WDL, y la tabla puede almacenar cualquier cosa, lo que sea mejor para la compresión.

Las tablas de peones contienen 4 subtablas, una para cada archivo del "peón principal" (después de la normalización).

Las (sub) tablas WDL son de dos lados, es decir, esencialmente contienen dos tablas separadas para cada lado del final del juego (a menos que el material sea simétrico).

Las mesas DTZ almacenan solo un lado para moverse. Por lo tanto, puede ser necesaria una breve búsqueda de 1 capa para calcular la DTZ para el otro lado.


(1) Acerca de la normalización: hay varias formas de hacer esto y no es fácil saber de antemano cuál conducirá a la mejor compresión. El generador solo intenta diferentes permutaciones. El orden final de las piezas se almacena en el encabezado del archivo de la tabla.

(2) Algunos combinatorios. El desafío no es tener grandes espacios para posiciones imposibles. Aunque es bastante complicado, no creo que Syzygy haga nada especial aquí. Conceptualmente, las piezas o grupos de piezas se colocan en el tablero en el orden especificado en el encabezado.

(3) Los valores comprimidos se almacenan en bloques. El tamaño del bloque se especifica en el encabezado de la tabla. Los índices de mapeo de la tabla a los bloques son escasos, por lo que permite saltar muy cerca del bloque correcto y luego requiere una breve exploración hacia adelante o hacia atrás para encontrar el bloque exacto. Un bloque puede almacenar valores para un máximo de 65536 posiciones.

(4) Las tablas Syzygy usan compresión personalizada basada en RE-PAIR . Una característica importante es que en realidad permite aprovechar las oportunidades para almacenar valores arbitrarios que se identificaron anteriormente. La descompresión es muy rápida y puede detenerse tan pronto como esté disponible el valor para el índice deseado.

Opcionalmente, las tablas DTZ pueden requerir otro paso f (wdl, valor almacenado) = valor real. Este mapa DTZ adicional se referencia en el encabezado de la tabla y es en sí mismo una tabla con entradas de 8 bits. (Interesantemente, esto resultó ser insuficiente para los finales de 7 piezas, incluso con peones, por lo que ahora hay otra bandera que permite entradas de 16 bits).

Para los valores de DTZ, si el generador determinó que todos los valores de una mesa son inferiores a 100, no se requieren recuentos precisos de medio movimiento para garantizar un juego perfecto. En su lugar, establece una bandera en el encabezado de la tabla y redondea los movimientos medios a movimientos completos para ahorrar espacio.

También claramente no hay necesidad de almacenar el signo, o un desplazamiento adicional de +/- 100 para los finales malditos porque esto se puede inferir del valor WDL.

Como la descompresión es muy rápida, no es necesario un caché. En cambio, los motores pueden confiar en la memoria caché de la página de sistemas operativos para almacenar bloques (aún comprimidos).


Las tablas de 6 piezas contienen información de WDL y DTZ para 3,787,154,440,416 posiciones únicas en 150 Gigabytes, por lo que ~ 0.3 bits por posición.

En general, las tablas de Syzygy mejoraron en formatos de base de tabla anteriores en al menos 3 de estas áreas, por lo que es un formato muy compacto y rápido. Sorprendentemente, el generador también es bastante rápido.

Y, por supuesto, usar DTZ50 es una opción pragmática, porque esta es solo información suficiente para avanzar de manera confiable y permite un juego perfecto (wrt. Resultado) con y sin la regla de 50 movimientos. Sin embargo, en función de los cambios en Cfish que se han publicado hasta ahora (RdM ahora está trabajando en tablas DTM), muchas de las técnicas se aplicarán también a DTM.

Niklas
fuente