X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=a26a9ab8cbc1092d8a34171cc7a5765a2aaf0c48;hp=6a63fcaa338910a221d2770374faea8ead35f183;hb=883367d21749eb91a5a3737338b5a7f507751a5a;hpb=b19ad4977c0ee427eeff9c11bd7c4da9210cd090 diff --git a/src/search.cpp b/src/search.cpp index 6a63fcaa..a26a9ab8 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -448,7 +448,7 @@ void Thread::search() { { beta = std::min(bestValue + delta, VALUE_INFINITE); if (mainThread) - ++failedHighCnt; + ++failedHighCnt; } else break; @@ -826,8 +826,8 @@ namespace { && depth >= 5 * ONE_PLY && abs(beta) < VALUE_MATE_IN_MAX_PLY) { - Value rbeta = std::min(beta + 216 - 48 * improving, VALUE_INFINITE); - MovePicker mp(pos, ttMove, rbeta - ss->staticEval, &thisThread->captureHistory); + Value raisedBeta = std::min(beta + 216 - 48 * improving, VALUE_INFINITE); + MovePicker mp(pos, ttMove, raisedBeta - ss->staticEval, &thisThread->captureHistory); int probCutCount = 0; while ( (move = mp.next_move()) != MOVE_NONE @@ -844,15 +844,15 @@ namespace { pos.do_move(move, st); // Perform a preliminary qsearch to verify that the move holds - value = -qsearch(pos, ss+1, -rbeta, -rbeta+1); + value = -qsearch(pos, ss+1, -raisedBeta, -raisedBeta+1); // If the qsearch held perform the regular search - if (value >= rbeta) - value = -search(pos, ss+1, -rbeta, -rbeta+1, depth - 4 * ONE_PLY, !cutNode); + if (value >= raisedBeta) + value = -search(pos, ss+1, -raisedBeta, -raisedBeta+1, depth - 4 * ONE_PLY, !cutNode); pos.undo_move(move); - if (value >= rbeta) + if (value >= raisedBeta) return value; } } @@ -928,18 +928,18 @@ moves_loop: // When in check, search starts from here if ( depth >= 8 * ONE_PLY && move == ttMove && !rootNode - && !excludedMove // Recursive singular search is not allowed + && !excludedMove // Avoid recursive singular search && ttValue != VALUE_NONE && (tte->bound() & BOUND_LOWER) && tte->depth() >= depth - 3 * ONE_PLY && pos.legal(move)) { - Value rBeta = std::max(ttValue - 2 * depth / ONE_PLY, -VALUE_MATE); + Value reducedBeta = std::max(ttValue - 2 * depth / ONE_PLY, -VALUE_MATE); ss->excludedMove = move; - value = search(pos, ss, rBeta - 1, rBeta, depth / 2, cutNode); + value = search(pos, ss, reducedBeta - 1, reducedBeta, depth / 2, cutNode); ss->excludedMove = MOVE_NONE; - if (value < rBeta) + if (value < reducedBeta) extension = ONE_PLY; } else if ( givesCheck // Check extension (~2 Elo) @@ -973,7 +973,7 @@ moves_loop: // When in check, search starts from here int lmrDepth = std::max(newDepth - reduction(improving, depth, moveCount), DEPTH_ZERO) / ONE_PLY; // Countermoves based pruning (~20 Elo) - if ( lmrDepth < 3 + ((ss-1)->statScore > 0) + if ( lmrDepth < 3 + ((ss-1)->statScore > 0 || (ss-1)->moveCount == 1) && (*contHist[0])[movedPiece][to_sq(move)] < CounterMovePruneThreshold && (*contHist[1])[movedPiece][to_sq(move)] < CounterMovePruneThreshold) continue; @@ -1185,15 +1185,12 @@ moves_loop: // When in check, search starts from here update_capture_stats(pos, bestMove, capturesSearched, captureCount, stat_bonus(depth + ONE_PLY)); - // Extra penalty for a quiet TT move in previous ply when it gets refuted - if ((ss-1)->moveCount == 1 && !pos.captured_piece()) - update_continuation_histories(ss-1, pos.piece_on(prevSq), prevSq, -stat_bonus(depth + ONE_PLY)); + // Extra penalty for a quiet TT or main killer move in previous ply when it gets refuted + if ( (ss-1)->moveCount == 1 + || ((ss-1)->currentMove == (ss-1)->killers[0] && (ss-1)->killers[0])) + if (!pos.captured_piece()) + update_continuation_histories(ss-1, pos.piece_on(prevSq), prevSq, -stat_bonus(depth + ONE_PLY)); - // Extra penalty for killer move in previous ply when it gets refuted - else if ( (ss-1)->killers[0] - && (ss-1)->currentMove == (ss-1)->killers[0] - && !pos.captured_piece()) - update_continuation_histories(ss-1, pos.piece_on(prevSq), prevSq, -stat_bonus(depth)); } // Bonus for prior countermove that caused the fail low else if ( (depth >= 3 * ONE_PLY || PvNode)