+ // Check Tablebases at root
+ int piecesCnt = RootPos.total_piece_count();
+ TBCardinality = Options["SyzygyProbeLimit"];
+ TBProbeDepth = Options["SyzygyProbeDepth"] * ONE_PLY;
+ if (TBCardinality > Tablebases::TBLargest)
+ {
+ TBCardinality = Tablebases::TBLargest;
+ TBProbeDepth = 0 * ONE_PLY;
+ }
+ TB50MoveRule = Options["Syzygy50MoveRule"];
+
+ if (piecesCnt <= TBCardinality)
+ {
+ TBHits = RootMoves.size();
+
+ // If the current root position is in the tablebases then RootMoves
+ // contains only moves that preserve the draw or win.
+ RootInTB = Tablebases::root_probe(RootPos, TBScore);
+
+ if (RootInTB)
+ {
+ TBCardinality = 0; // Do not probe tablebases during the search
+
+ // It might be a good idea to mangle the hash key (xor it
+ // with a fixed value) in order to "clear" the hash table of
+ // the results of previous probes. However, that would have to
+ // be done from within the Position class, so we skip it for now.
+
+ // Optional: decrease target time.
+ }
+ else // If DTZ tables are missing, use WDL tables as a fallback
+ {
+ // Filter out moves that do not preserve a draw or win
+ RootInTB = Tablebases::root_probe_wdl(RootPos, TBScore);
+
+ // Only probe during search if winning
+ if (TBScore <= VALUE_DRAW)
+ TBCardinality = 0;
+ }
+
+ if (!RootInTB)
+ {
+ TBHits = 0;
+ }
+ else if (!TB50MoveRule)
+ {
+ TBScore = TBScore > VALUE_DRAW ? VALUE_MATE - MAX_PLY - 1
+ : TBScore < VALUE_DRAW ? -VALUE_MATE + MAX_PLY + 1
+ : TBScore;
+ }
+ }
+