NAME
Chess::Plisco::Tablebase::Syzygy - Perl interface to Syzygy endgame table bases
SYNOPSIS
$tb = Chess::Plisco::Tablebase::Syzygy->new("./3-4-5");
DESCRIPTION
The module Chess::Plisco::Tablebase::Syzygy allows access to end-game table bases in Syzygy format.
This module has been added in version 7.0.0.
Syzygy endgame tables have been developed by Ronald de Man. They store the outcome of every possible game of chess with up to 7 pieces. They allow probing for a win/draw/loss (WDL) or for the "distance to zero" (DTZ) for a particular position.
WDL (win/draw/loss)
These probes should be done during search. They simply give the information whether a mate can be forced in a particular position or not.
A probe only makes sense if the half move counter is 0, in other words after a pawn move or a capture. Rationale: If the WDL probe reports a win but that win happens to take exactly fifty moves, the position is really a draw, when the fifty move counter is not 0.
For an engine, this should normally not matter if it probes all positions wherer possible. But it can be a problem if because of missing tables one or more non-optimal quiet moves have been made.
Cursed Wins and Blessed Losses
While generating the tables, it turned out that there are quite a few positions with 7 pieces or less where a mate can be forced but not within 50 moves. A position where the side to move can force a mate but in more than 50 moves, is called a cursed win. A position where checkmate can be delivered to the side to move but even with optimal play from both sides but not within 50 moves is called a blessed loss.
Under normal circumstances such positions should be considered a draw because the side that is on loss can claim a draw.
For cursed wins and blessed losses, the results of DTZ probes may be off by one. In order to save space the least significant bit of the DTZ value is discarded. This should normally not matter because the positions are a draw under the 50-move-rule.
DTZ (distance to zero)
This gives the number of half moves that the side to move needs to force a reset of the half move clock to 0. This is not the distance to mate (DTM)!
The half move clock is reset to 0 when a pawn moves, a piece is captured, or one side loses castling rights by moving a king or rook from its initial position. Keep in mind, however, that positions with castling rights are not contained in the database!
Minimizing a positive DTZ will sooner or later force a mate but not necessarily in the most elegant manner. Minimizing a negative DTZ will result in optimal play.
To understand the difference, imagine end endgame king, queen, and rook against a lone king. Minimizing DTZ will ultimately lead to a move of one of these types:
The last two options may not look too smart but once one of the not strictly necessary pieces has left the board, the next zero point will be checkmate.
If two engines play against each other, this is perfectly alright because there are no extra points for a mate with fewer moves. Trying to find it is a waste of CPU circles.
If, however, an engine is used for game analysis, it should only follow the DTZ strategy if the mate cannot be found in the time given.
Castling
The tablebase files do not contain positions where castling is possible. With a maximum of 7 pieces on the board such positions are relatively rare anyhow.
En Passant
The tablebase files so also not contain positions where en passant is possible. However, the library works around this limitation. If a position is probed where en passant is possible, the probed value is not returned immediately. Instead, all en passant captures are tried out and the resulting positions are probed as well. Depending on the outcome of these additional probes, the result is corrected accordingly.
Example 1: The initial probe reports a draw. But if a pawn can be captured en passant, the position may turn into a win.
Example 2: The initial probe reports a draw because of a stalemate. But it could happen that an en passant capture is possible. That means that the position is actually not a stalemate. Since the capture is the only legal move, it has to be done and the resulting game may be a loss.
CONSTRUCTOR
- new PATH[, OPTIONS]
-
Initialize the database located at PATH.
Throws an exception in case of an error.
You may pass additional options as a hash reference OPTIONS:
- load_wdl
-
Whether to load WDL files, default true.
- load_dtz
-
Whether to load DTZ files, default true.
- max_fds
-
Maximum number of open file descriptors, default 128.
- recursive
-
Whether search recursively for files.
METHODS
- probeWdl POSITION
-
Does a WDL probe for the Chess::Plisco object POSITION. Returns +2 for a forced win, -2 for a forced loss, 0 for a draw. All results take the 50 move rule into account. A return value of +1 means a cursed win, a return value of -1 is a blessed loss. These should also be considered a draw.
The method may throw an exception. One common cause is a missing table.
- safeProbeWdl POSITION, DEFAULT
-
Like probeWdl() but returns DEFAULT if an exception occurs. If you omit DEFAULT,
undefinedis returned. - probeDtz POSITION
-
Does a DTZ probe for the Chess::Plisco object POSITION. It returns a positive value for positions where a mate can beforced, and a negative value for positions where a loss is unavoidable. A return value of 0 means a draw.
The absolute value of the return value gives the number of half moves until the winning side can force a reset of the half move counter to 0 either by a pawn move, a capture, or a checkmate.
- safeProbeDtz POSITION, DEFAULT
-
Like probeDtz() but returns DEFAULT if an exception occurs. If you omit DEFAULT,
undefinedis returned. - addDirectory DIRECTORY
-
Adds files from DIRECTORY to the database.
- largestWdl
-
Returns the maximum number of pieces for which WDL probes can be done. A value of 0 means that no WDL tables have been found.
- largestDtz
-
Returns the maximum number of pieces for which WDL probes can be done. A value of 0 means that no DTZ tables have been found.
- largest
-
Returns the maximum of largestWdl and largestDtz.
COPYRIGHT
Copyright (C) 2021-2025 Guido Flohr <guido.flohr@cantanea.com>.
SEE ALSO
Chess::Plisco(3pm), fathom(1), perl(1)