Wie speichert Syzygy seine Informationen?

10

Nachdem ich alles gelesen habe, was ich bisher gefunden habe, weiß ich, dass Syzygy sowohl Win / Draw / Loss-Dateien als auch Distance-to-Zero-Dateien verwendet, aber ich habe keine Informationen zum internen Dateiformat gefunden, das diese Dateien verwenden. Ich bin auf der Suche nach einer einfachen Erklärung.

Oscar Smith
quelle

Antworten:

13

Da es keine einzige umfassende Veröffentlichung gibt, basiert diese auf dem Prüfcode , dem Generator und verschiedenen Erklärungen von Ronald de Man (dem Autor des Generators).


Wenn Sie so ziemlich jede Tabellenbasis untersuchen (auch bekannt als riesige komprimierte Hash-Map):

  1. Die Position ist normalisiert ...
  2. ... einem ganzzahligen Index zugeordnet.
  3. Der Index wird in einer Tabelle nachgeschlagen, die angibt, zu welchem ​​"Block" er gehört.
  4. Der Block wird dekomprimiert, bis die Informationen für den Index abgerufen werden können.

Dann gibt es normalerweise einen Code "außerhalb" der Prüfung, zumindest um en passant Captures aufzulösen.


Beginnend mit dem externen Code für WDL. Syzygy-Tabellen verwenden eine Optimierung, die auf der folgenden Beobachtung basiert: Wenn eine Position eine Erfassung hat, die einen bestimmten Wert erreicht (z. B. gewinnt), hat die Position selbst mindestens diesen Wert (z. B. gewinnt). In diesem Fall kann die Tabelle einen beliebigen niedrigeren Wert speichern, je nachdem, welcher Wert für die Komprimierung am besten geeignet ist. Dies kann leicht korrigiert werden, indem die Untertabellen auf Captures überprüft werden.

Um eine DTZ zu erhalten, muss zuerst eine WDL-Sonde durchgeführt werden. Wenn die Position gezeichnet ist, ist DTZ 0 und die Tabelle kann alles speichern, je nachdem, was für die Komprimierung am besten geeignet ist. Wenn der beste Zug eine Erfassung war (an die wir uns von der WDL-Sonde erinnern können), beträgt die DTZ je nach WDL +/- 1 oder +/- 101, und in der Tabelle kann wieder alles gespeichert werden, je nachdem, was für die Komprimierung am besten geeignet ist.

Bauerntabellen enthalten 4 Untertabellen, eine für jede Datei des "führenden Bauern" (nach Normalisierung).

WDL (Sub) -Tabellen sind zweiseitig, dh sie enthalten im Wesentlichen zwei separate Tabellen für jede Seite des Endspiels (es sei denn, das Material ist symmetrisch).

DTZ-Tabellen speichern nur eine Seite zum Verschieben. Daher kann eine kurze einlagige Suche erforderlich sein, um die DTZ für die andere Seite zu berechnen.


(1) Über die Normalisierung: Es gibt mehrere Möglichkeiten, dies zu tun, und es ist nicht einfach, im Voraus zu sagen, welche zur besten Komprimierung führt. Der Generator versucht nur verschiedene Permutationen. Die endgültige Reihenfolge der Teile wird im Header der Tabellendatei gespeichert.

(2) Einige Kombinatoren. Die Herausforderung besteht darin, keine großen Lücken für unmögliche Positionen zu haben. Obwohl es ziemlich knifflig ist, denke ich nicht, dass Syzygy hier etwas Besonderes macht. Konzeptionell werden Teile oder Gruppen von Teilen in der in der Kopfzeile angegebenen Reihenfolge auf der Tafel platziert.

(3) Komprimierte Werte werden in Blöcken gespeichert. Die Blockgröße wird im Tabellenkopf angegeben. Die Tabellenzuordnungsindizes für Blöcke sind spärlich, sodass Sie sehr nahe an den richtigen Block springen können und dann einen kurzen Vorwärts- oder Rückwärtsscan benötigen, um den genauen Block zu finden. Ein Block kann Werte für höchstens 65536 Positionen speichern.

(4) Syzygy-Tabellen verwenden eine benutzerdefinierte Komprimierung basierend auf RE-PAIR . Ein wichtiges Merkmal ist, dass es tatsächlich ermöglicht, die oben identifizierten Möglichkeiten zum Speichern beliebiger Werte zu nutzen. Die Dekomprimierung ist sehr schnell und kann beendet werden, sobald der Wert für den gewünschten Index verfügbar ist.

Optional können DTZ-Tabellen einen weiteren Schritt f (wdl, gespeicherter Wert) = Realwert erfordern. Diese zusätzliche DTZ-Zuordnung wird im Tabellenkopf referenziert und ist selbst eine Tabelle mit 8-Bit-Einträgen. (Interessanterweise stellte sich heraus, dass dies für 7-teilige Endspiele selbst mit Bauern nicht ausreicht, sodass es jetzt ein weiteres Flag gibt, das 16-Bit-Einträge ermöglicht.)

Wenn der Generator bei DTZ-Werten feststellt, dass alle Werte für einen Tisch kleiner als 100 sind, sind keine genauen Halbbewegungszählungen erforderlich, um ein perfektes Spiel zu gewährleisten. Stattdessen setzt es ein Flag in der Tabellenüberschrift und rundet halbe Züge auf volle Züge, um Platz zu sparen.

Es ist auch klar, dass das Zeichen oder ein zusätzlicher Versatz von +/- 100 für verfluchte Endspiele nicht gespeichert werden muss, da dies aus dem WDL-Wert abgeleitet werden kann.

Da die Dekomprimierung sehr schnell erfolgt, ist kein Cache erforderlich. Stattdessen können sich Engines auf den Seiten-Cache des Betriebssystems verlassen, um (noch komprimierte) Blöcke zu speichern.


Die 6-teiligen Tabellen enthalten WDL- und DTZ-Informationen für 3.787.154.440.416 eindeutige Positionen in 150 Gigabyte, also ~ 0,3 Bit pro Position.

Insgesamt wurden Syzygy-Tabellen in mindestens drei dieser Bereiche gegenüber früheren Tabellenbasisformaten verbessert, was sie zu einem sehr kompakten und schnellen Format macht. Erstaunlicherweise ist der Generator auch ziemlich schnell.

Und natürlich ist die Verwendung von DTZ50 eine pragmatische Wahl, da dies gerade genug Informationen sind, um zuverlässig Fortschritte zu erzielen, und ein perfektes Spiel (mit Ergebnis) sowohl mit als auch ohne die 50-Züge-Regel ermöglicht. Basierend auf den Änderungen an Cfish, die bisher veröffentlicht wurden (RdM arbeitet jetzt an DTM-Tabellen), werden viele der Techniken auch für DTM gelten.

Niklas
quelle