X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fsearch.cpp;h=e9afc1c58b2655374c056161e08f325a1c67d7b7;hb=59d10374ca647feebf9323b21031e47012572fb6;hp=394f228fb4f59956914ab3d014b199934d245716;hpb=ad2a0e356e395038a08324f9ff0afee7fc98b8e9;p=stockfish diff --git a/src/search.cpp b/src/search.cpp index 394f228f..e9afc1c5 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -325,7 +325,7 @@ void Thread::search() { // Age out PV variability metric if (mainThread) - mainThread->bestMoveChanges *= 0.505, mainThread->failedLow = false; + mainThread->bestMoveChanges *= 0.517, mainThread->failedLow = false; // Save the last iteration's scores before first PV line is searched and // all the move scores except the (new) PV are set to -VALUE_INFINITE. @@ -444,21 +444,21 @@ void Thread::search() { const int F[] = { mainThread->failedLow, bestValue - mainThread->previousScore }; - int improvingFactor = std::max(229, std::min(715, 357 + 119 * F[0] - 6 * F[1])); + int improvingFactor = std::max(246, std::min(832, 306 + 119 * F[0] - 6 * F[1])); // If the bestMove is stable over several iterations, reduce time accordingly timeReduction = 1.0; for (int i : {3, 4, 5}) if (lastBestMoveDepth * i < completedDepth) - timeReduction *= 1.3; + timeReduction *= 1.25; // Use part of the gained time from a previous stable move for the current move double unstablePvFactor = 1.0 + mainThread->bestMoveChanges; - unstablePvFactor *= std::pow(mainThread->previousTimeReduction, 0.51) / timeReduction; + unstablePvFactor *= std::pow(mainThread->previousTimeReduction, 0.528) / timeReduction; // Stop the search if we have only one legal move, or if available time elapsed if ( rootMoves.size() == 1 - || Time.elapsed() > Time.optimum() * unstablePvFactor * improvingFactor / 605) + || Time.elapsed() > Time.optimum() * unstablePvFactor * improvingFactor / 581) { // If we are allowed to ponder do not stop the search now but // keep pondering until the GUI sends "ponderhit" or "stop". @@ -514,7 +514,6 @@ namespace { Thread* thisThread = pos.this_thread(); inCheck = pos.checkers(); moveCount = captureCount = quietCount = ss->moveCount = 0; - ss->statScore = 0; bestValue = -VALUE_INFINITE; maxValue = VALUE_INFINITE; @@ -554,6 +553,13 @@ namespace { (ss+2)->killers[0] = (ss+2)->killers[1] = MOVE_NONE; Square prevSq = to_sq((ss-1)->currentMove); + // Initialize statScore to zero for the grandchildren of the current position. + // So statScore is shared between all grandchildren and only the first grandchild + // starts with statScore = 0. Later grandchildren start with the last calculated + // statScore of the previous grandchild. This influences the reduction rules in + // LMR which are based on the statScore of parent position. + (ss+2)->statScore = 0; + // Step 4. Transposition table lookup. We don't want the score of a partial // search to overwrite a previous full search TT value, so we use a different // position key in case of an excluded move.