X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=5c22e512b233d5af808538993d01fce556fdafab;hp=0901187acee2af63bebbc120bed03e33948962da;hb=c30eb4c9c9f875a8302056ddd9612003bc21c023;hpb=2c52147dbfdc714a0ae95982f37fc5141b225f8c diff --git a/src/search.cpp b/src/search.cpp index 0901187a..5c22e512 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -33,10 +33,7 @@ #include "thread.h" #include "tt.h" #include "uci.h" - -#ifdef SYZYGY #include "syzygy/tbprobe.h" -#endif namespace Search { @@ -191,13 +188,24 @@ template uint64_t Search::perft(Position& pos, Depth depth); void Search::think() { TimeMgr.init(Limits, RootPos.game_ply(), RootPos.side_to_move()); - TBHits = TBCardinality = 0; - RootInTB = false; int cf = Options["Contempt"] * PawnValueEg / 100; // From centipawns DrawValue[ RootPos.side_to_move()] = VALUE_DRAW - Value(cf); DrawValue[~RootPos.side_to_move()] = VALUE_DRAW + Value(cf); + TBHits = 0; + RootInTB = false; + TBProbeDepth = Options["SyzygyProbeDepth"] * ONE_PLY; + TB50MoveRule = Options["Syzygy50MoveRule"]; + TBCardinality = Options["SyzygyProbeLimit"]; + + // Skip TB probing when no TB found: !TBLargest -> !TBCardinality + if (TBCardinality > Tablebases::TBLargest) + { + TBCardinality = Tablebases::TBLargest; + TBProbeDepth = DEPTH_ZERO; + } + if (RootMoves.empty()) { RootMoves.push_back(MOVE_NONE); @@ -207,37 +215,16 @@ void Search::think() { } else { -#ifdef SYZYGY - // Check Tablebases at root - int piecesCnt = RootPos.total_piece_count(); - TBCardinality = Options["SyzygyProbeLimit"]; - TBProbeDepth = Options["SyzygyProbeDepth"] * ONE_PLY; - if (TBCardinality > Tablebases::TBLargest) + if (TBCardinality >= RootPos.count(WHITE) + + RootPos.count(BLACK)) { - 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 @@ -248,18 +235,16 @@ void Search::think() { TBCardinality = 0; } - if (!RootInTB) - { - TBHits = 0; - } - else if (!TB50MoveRule) + if (RootInTB) { - TBScore = TBScore > VALUE_DRAW ? VALUE_MATE - MAX_PLY - 1 - : TBScore < VALUE_DRAW ? -VALUE_MATE + MAX_PLY + 1 - : TBScore; + TBHits = RootMoves.size(); + + if (!TB50MoveRule) + TBScore = TBScore > VALUE_DRAW ? VALUE_MATE - MAX_PLY - 1 + : TBScore < VALUE_DRAW ? -VALUE_MATE + MAX_PLY + 1 + : VALUE_DRAW; } } -#endif for (size_t i = 0; i < Threads.size(); ++i) Threads[i]->maxPly = 0; @@ -552,38 +537,40 @@ namespace { return ttValue; } -#ifdef SYZYGY // Step 4a. Tablebase probe - if ( !RootNode - && pos.total_piece_count() <= TBCardinality - && ( pos.total_piece_count() < TBCardinality || depth >= TBProbeDepth ) - && pos.rule50_count() == 0) + if (!RootNode && TBCardinality) { - int found, v = Tablebases::probe_wdl(pos, &found); + int piecesCnt = pos.count(WHITE) + pos.count(BLACK); - if (found) + if ( piecesCnt <= TBCardinality + && (piecesCnt < TBCardinality || depth >= TBProbeDepth) + && pos.rule50_count() == 0) { - TBHits++; + int found, v = Tablebases::probe_wdl(pos, &found); - if (TB50MoveRule) { - value = v < -1 ? -VALUE_MATE + MAX_PLY + ss->ply - : v > 1 ? VALUE_MATE - MAX_PLY - ss->ply - : VALUE_DRAW + 2 * v; - } - else + if (found) { - value = v < 0 ? -VALUE_MATE + MAX_PLY + ss->ply - : v > 0 ? VALUE_MATE - MAX_PLY - ss->ply - : VALUE_DRAW; - } + TBHits++; + + if (TB50MoveRule) { + value = v < -1 ? -VALUE_MATE + MAX_PLY + ss->ply + : v > 1 ? VALUE_MATE - MAX_PLY - ss->ply + : VALUE_DRAW + 2 * v; + } + else + { + value = v < 0 ? -VALUE_MATE + MAX_PLY + ss->ply + : v > 0 ? VALUE_MATE - MAX_PLY - ss->ply + : VALUE_DRAW; + } - TT.store(posKey, value_to_tt(value, ss->ply), BOUND_EXACT, - std::min(DEPTH_MAX - ONE_PLY, depth + 6 * ONE_PLY), MOVE_NONE, VALUE_NONE); + TT.store(posKey, value_to_tt(value, ss->ply), BOUND_EXACT, + std::min(DEPTH_MAX - ONE_PLY, depth + 6 * ONE_PLY), MOVE_NONE, VALUE_NONE); - return value; + return value; + } } } -#endif // Step 5. Evaluate the position statically and update parent's gain statistics if (inCheck) @@ -1451,14 +1438,8 @@ moves_loop: // When in check and at SpNode search starts from here Depth d = updated ? depth : depth - ONE_PLY; Value v = updated ? RootMoves[i].score : RootMoves[i].prevScore; - bool tb = RootInTB; - if (tb) - { - if (abs(v) >= VALUE_MATE - MAX_PLY) - tb = false; - else - v = TBScore; - } + bool tb = RootInTB && abs(v) < VALUE_MATE - MAX_PLY; + v = tb ? TBScore : v; if (ss.rdbuf()->in_avail()) // Not at first line ss << "\n";