X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=e1b7a1d7cfb8f7ee57787bb6c411b1cd6f1dbf64;hp=15a9cde5b706914ffe1904ca74d060769ff892c2;hb=838255ef919425dc664909e6e6d2e28dbb42f3f8;hpb=6fbe027da05d6de0b7f03e8696bbde2e33baad98 diff --git a/src/search.cpp b/src/search.cpp index 15a9cde5..e1b7a1d7 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -296,12 +296,9 @@ namespace { Value bestValue, alpha, beta, delta; memset(ss-1, 0, 4 * sizeof(Stack)); - (ss-1)->currentMove = MOVE_NULL; // Hack to skip update gains - depth = BestMoveChanges = 0; - bestValue = delta = alpha = -VALUE_INFINITE; - beta = VALUE_INFINITE; - + bestValue = delta = -VALUE_INFINITE; + (ss-1)->currentMove = MOVE_NULL; // Hack to skip update gains TT.new_search(); History.clear(); Gains.clear(); @@ -331,12 +328,17 @@ namespace { // MultiPV loop. We perform a full root search for each PV line for (PVIdx = 0; PVIdx < PVSize; PVIdx++) { - // Reset aspiration window starting size - if (depth >= 5) + // Set aspiration window default width + if (depth >= 5 && abs(RootMoves[PVIdx].prevScore) < VALUE_KNOWN_WIN) { delta = Value(16); - alpha = std::max(RootMoves[PVIdx].prevScore - delta,-VALUE_INFINITE); - beta = std::min(RootMoves[PVIdx].prevScore + delta, VALUE_INFINITE); + alpha = RootMoves[PVIdx].prevScore - delta; + beta = RootMoves[PVIdx].prevScore + delta; + } + else + { + alpha = -VALUE_INFINITE; + beta = VALUE_INFINITE; } // Start with a small aspiration window and, in case of fail high/low, @@ -364,28 +366,35 @@ namespace { if (Signals.stop) return; - // In case of failing low/high increase aspiration window and + // In case of failing high/low increase aspiration window and // research, otherwise exit the loop. - if (bestValue <= alpha) - { - alpha = std::max(bestValue - delta, -VALUE_INFINITE); + if (bestValue > alpha && bestValue < beta) + break; - Signals.failedLowAtRoot = true; - Signals.stopOnPonderhit = false; + // Give some update (without cluttering the UI) before to research + if (Time::now() - SearchTime > 3000) + sync_cout << uci_pv(pos, depth, alpha, beta) << sync_endl; + + if (abs(bestValue) >= VALUE_KNOWN_WIN) + { + alpha = -VALUE_INFINITE; + beta = VALUE_INFINITE; } else if (bestValue >= beta) - beta = std::min(bestValue + delta, VALUE_INFINITE); - + { + beta += delta; + delta += delta / 2; + } else - break; + { + Signals.failedLowAtRoot = true; + Signals.stopOnPonderhit = false; - delta += delta / 2; + alpha -= delta; + delta += delta / 2; + } assert(alpha >= -VALUE_INFINITE && beta <= VALUE_INFINITE); - - // Give some update (without cluttering the UI) before to research - if (Time::now() - SearchTime > 3000) - sync_cout << uci_pv(pos, depth, alpha, beta) << sync_endl; } // Sort the PV lines searched so far and update the GUI