Como a Syzygy armazena suas informações?

10

Ao ler tudo o que encontrei até agora, sei que o Syzygy usa arquivos de vitória / empate / perda e arquivos de distância até zero, mas não encontrei nenhuma informação sobre o formato interno que esses arquivos usam. Eu estou procurando a explicação detalhada de baixo nível.

Oscar Smith
fonte

Respostas:

13

Como não há uma publicação abrangente e única, isso se baseia no código de análise , no gerador e em várias explicações de Ronald de Man (o autor do gerador).


Ao investigar praticamente qualquer base de tabela (também conhecido como enorme mapa de hash compactado):

  1. A posição é normalizada ...
  2. ... mapeado para um índice inteiro.
  3. O índice é pesquisado em uma tabela que identifica a qual "bloco" ele pertence.
  4. O bloco é descompactado até que as informações do índice possam ser recuperadas.

Normalmente, existe algum código "fora" da análise, pelo menos para resolver capturas passantes.


Começando com o código externo para WDL. As tabelas Syzygy usam uma otimização com base na seguinte observação: Se uma posição possui uma captura que atinge um valor específico (por exemplo, está ganhando), então a posição em si possui pelo menos esse valor (por exemplo, está ganhando). Nesse caso, a tabela pode armazenar um valor menor arbitrário, o que for melhor para compactação, e isso pode ser facilmente corrigido verificando as subtabelas para capturas.

Para obter uma DTZ, uma sonda WDL precisa ser feita primeiro. Se a posição for desenhada, DTZ será 0 e a tabela poderá armazenar qualquer coisa, o que for melhor para compactação. Se a melhor jogada foi uma captura (que podemos lembrar do probe WDL), a DTZ é +/- 1 ou +/- 101, dependendo da WDL, e a tabela pode armazenar novamente qualquer coisa, o que for melhor para compactação.

As tabelas de penhor contêm 4 subtabelas, uma para cada arquivo do "peão ​​inicial" (após a normalização).

As (sub) tabelas WDL são bilaterais, ou seja, contêm essencialmente duas tabelas separadas para cada lado do jogo final (a menos que o material seja simétrico).

As tabelas DTZ armazenam apenas um lado para mover. Portanto, uma breve pesquisa de uma camada pode ser necessária para calcular a DTZ para o outro lado.


(1) Sobre a normalização: existem várias maneiras de fazer isso e não é fácil dizer com antecedência qual delas levará à melhor compactação. O gerador apenas tenta permutações diferentes. A ordem final das peças é armazenada no cabeçalho do arquivo da tabela.

(2) Algumas combinações. O desafio é não ter grandes lacunas para posições impossíveis. Embora seja bastante complicado, não acho que Syzygy faça algo especial aqui. Conceitualmente, as peças ou grupos de peças são colocadas no quadro na ordem especificada no cabeçalho.

(3) Os valores compactados são armazenados em blocos. O tamanho do bloco é especificado no cabeçalho da tabela. Os índices de mapeamento de tabela para blocos são escassos, portanto, permite pular muito perto do bloco correto e, em seguida, requer uma breve varredura para frente ou para trás para encontrar o bloco exato. Um bloco pode armazenar valores para no máximo 65536 posições.

(4) As tabelas Syzygy usam compactação personalizada com base em RE-PAIR . Uma característica importante é que ela realmente permite aproveitar as oportunidades de armazenar valores arbitrários que foram identificados acima. A descompressão é muito rápida e pode parar assim que o valor do índice desejado estiver disponível.

Opcionalmente, as tabelas DTZ podem exigir outra etapa f (wdl, valor armazenado) = valor real. Esse mapa DTZ extra é referenciado no cabeçalho da tabela e é uma tabela com entradas de 8 bits. (Curiosamente, isso acabou sendo insuficiente para os jogos finais de 7 peças, mesmo com peões, então agora existe outro sinalizador que permite entradas de 16 bits).

Para valores de DTZ, se o gerador determinar que todos os valores de uma tabela são menores que 100, não são necessárias contagens precisas de meio movimento para garantir o jogo perfeito. Em vez disso, define um sinalizador no cabeçalho da tabela e arredonda os movimentos intermédios para movimentos completos para economizar espaço.

Também claramente não há necessidade de armazenar o sinal, ou um deslocamento adicional de +/- 100 para jogos finais amaldiçoados, porque isso pode ser inferido a partir do valor WDL.

Como a descompressão é muito rápida, não há necessidade de um cache. Em vez disso, os mecanismos podem confiar no cache da página dos sistemas operacionais para armazenar blocos (ainda compactados).


As tabelas de 6 peças contêm informações WDL e DTZ para 3.787.154.440.416 posições únicas em 150 Gigabytes, portanto, ~ 0,3 bits por posição.

No geral, todas as tabelas Syzygy foram aprimoradas em relação aos formatos anteriores da base de tabela em pelo menos três dessas áreas, tornando-o um formato muito compacto e rápido. Surpreendentemente, o gerador também é bastante rápido.

E, é claro, usar o DTZ50 é uma escolha pragmática, porque essas informações são suficientes para progredir com segurança e permitem um jogo perfeito (resultado errado) com e sem a regra dos 50 movimentos. No entanto, com base nas alterações ao Cfish publicadas até o momento (o RdM agora está trabalhando nas tabelas do DTM), muitas das técnicas também se aplicam ao DTM.

Niklas
fonte