X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=fb5dfd00776c4a549f196c2761f2452ffb1abd7b;hp=5e3e61b2011925bd3fad886481325098e3ecf634;hb=a834bfe8332adcb0dfc1fd280f1f9d8bbce86266;hpb=231103d2cf223a087fc76dbfabc4f44cc42385a6 diff --git a/src/search.cpp b/src/search.cpp index 5e3e61b2..fb5dfd00 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -71,16 +71,6 @@ namespace { return Value((175 - 50 * improving) * d / ONE_PLY); } - // Margin for pruning capturing moves: almost linear in depth - constexpr int CapturePruneMargin[] = { 0, - 1 * PawnValueEg * 1055 / 1000, - 2 * PawnValueEg * 1042 / 1000, - 3 * PawnValueEg * 963 / 1000, - 4 * PawnValueEg * 1038 / 1000, - 5 * PawnValueEg * 950 / 1000, - 6 * PawnValueEg * 930 / 1000 - }; - // Futility and reductions lookup tables, initialized at startup int FutilityMoveCounts[2][16]; // [improving][depth] int Reductions[2][2][64][64]; // [pv][improving][depth][moveNumber] @@ -296,6 +286,7 @@ void Thread::search() { MainThread* mainThread = (this == Threads.main() ? Threads.main() : nullptr); double timeReduction = 1.0; Color us = rootPos.side_to_move(); + bool failedLow; std::memset(ss-4, 0, 7 * sizeof(Stack)); for (int i = 4; i > 0; i--) @@ -305,7 +296,7 @@ void Thread::search() { beta = VALUE_INFINITE; if (mainThread) - mainThread->bestMoveChanges = 0, mainThread->failedLow = false; + mainThread->bestMoveChanges = 0, failedLow = false; size_t multiPV = Options["MultiPV"]; Skill skill(Options["Skill Level"]); @@ -346,7 +337,7 @@ void Thread::search() { // Age out PV variability metric if (mainThread) - mainThread->bestMoveChanges *= 0.517, mainThread->failedLow = false; + mainThread->bestMoveChanges *= 0.517, 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. @@ -423,7 +414,7 @@ void Thread::search() { if (mainThread) { - mainThread->failedLow = true; + failedLow = true; Threads.stopOnPonderhit = false; } } @@ -471,7 +462,7 @@ void Thread::search() { && !Threads.stop && !Threads.stopOnPonderhit) { - const int F[] = { mainThread->failedLow, + const int F[] = { failedLow, bestValue - mainThread->previousScore }; int improvingFactor = std::max(246, std::min(832, 306 + 119 * F[0] - 6 * F[1])); @@ -522,7 +513,7 @@ namespace { constexpr bool PvNode = NT == PV; const bool rootNode = PvNode && ss->ply == 0; - // Check if we have an upcoming move which draws by repetition, or + // Check if we have an upcoming move which draws by repetition, or // if the opponent had an alternative move earlier to this position. if ( pos.rule50_count() >= 3 && alpha < VALUE_DRAW @@ -956,13 +947,11 @@ moves_loop: // When in check, search starts from here continue; // Prune moves with negative SEE (~10 Elo) - if ( lmrDepth < 8 - && !pos.see_ge(move, Value(-35 * lmrDepth * lmrDepth))) + if (!pos.see_ge(move, Value(-29 * lmrDepth * lmrDepth))) continue; } - else if ( depth < 7 * ONE_PLY // (~20 Elo) - && !extension - && !pos.see_ge(move, -Value(CapturePruneMargin[depth / ONE_PLY]))) + else if ( !extension // (~20 Elo) + && !pos.see_ge(move, -Value(PawnValueEg * (depth / ONE_PLY)))) continue; } @@ -1164,7 +1153,8 @@ moves_loop: // When in check, search starts from here { // Quiet best move: update move sorting heuristics if (!pos.capture_or_promotion(bestMove)) - update_quiet_stats(pos, ss, bestMove, quietsSearched, quietCount, stat_bonus(depth)); + update_quiet_stats(pos, ss, bestMove, quietsSearched, quietCount, + stat_bonus(depth + (bestValue > beta + PawnValueMg ? ONE_PLY : DEPTH_ZERO))); else update_capture_stats(pos, bestMove, capturesSearched, captureCount, stat_bonus(depth + ONE_PLY));