-#ifdef SYZYGY
- // 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;
- }
- }
-#endif
-
- for (size_t i = 0; i < Threads.size(); ++i)
- Threads[i]->maxPly = 0;