diff --git a/src/search.cpp b/src/search.cpp index 639c5bc55bf..d98ba4e42fb 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -368,6 +368,7 @@ void Thread::search() { size_t pvFirst = 0; pvLast = 0; + Depth adjustedDepth = rootDepth; // MultiPV loop. We perform a full root search for each PV line for (pvIdx = 0; pvIdx < multiPV && !Threads.stop; ++pvIdx) @@ -401,9 +402,11 @@ void Thread::search() { // Start with a small aspiration window and, in the case of a fail // high/low, re-search with a bigger window until we don't fail // high/low anymore. + int failedHighCnt = 0; while (true) { - bestValue = ::search(rootPos, ss, alpha, beta, rootDepth, false); + adjustedDepth = std::max(ONE_PLY, rootDepth - failedHighCnt * ONE_PLY); + bestValue = ::search(rootPos, ss, alpha, beta, adjustedDepth, false); // Bring the best move to the front. It is critical that sorting // is done with a stable algorithm because all the values but the @@ -425,7 +428,7 @@ void Thread::search() { && multiPV == 1 && (bestValue <= alpha || bestValue >= beta) && Time.elapsed() > 3000) - sync_cout << UCI::pv(rootPos, rootDepth, alpha, beta) << sync_endl; + sync_cout << UCI::pv(rootPos, adjustedDepth, alpha, beta) << sync_endl; // In case of failing low/high increase aspiration window and // re-search, otherwise exit the loop. @@ -436,12 +439,17 @@ void Thread::search() { if (mainThread) { + failedHighCnt = 0; failedLow = true; Threads.stopOnPonderhit = false; } } else if (bestValue >= beta) + { beta = std::min(bestValue + delta, VALUE_INFINITE); + if (mainThread) + ++failedHighCnt; + } else break; @@ -455,15 +463,15 @@ void Thread::search() { if ( mainThread && (Threads.stop || pvIdx + 1 == multiPV || Time.elapsed() > 3000)) - sync_cout << UCI::pv(rootPos, rootDepth, alpha, beta) << sync_endl; + sync_cout << UCI::pv(rootPos, adjustedDepth, alpha, beta) << sync_endl; } if (!Threads.stop) - completedDepth = rootDepth; + completedDepth = adjustedDepth; if (rootMoves[0].pv[0] != lastBestMove) { lastBestMove = rootMoves[0].pv[0]; - lastBestMoveDepth = rootDepth; + lastBestMoveDepth = adjustedDepth; } // Have we found a "mate in x"?