X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=2fa2ce7e27cb4e41c0243a8f55f987b3d8f2dd35;hp=a74e3f256833c576c4e11f19462367af32f91119;hb=a47bbca0ea40ac007d64682c3ba51fa4158b2d3f;hpb=a90fc4c877b39769ebdf227b3124008ec394ad3d diff --git a/src/search.cpp b/src/search.cpp index a74e3f25..2fa2ce7e 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -153,6 +153,9 @@ namespace { {1, 0, 0, 0, 0, 1, 1 ,1}, }; + Value bonus(Depth depth) { int d = depth / ONE_PLY ; return Value(d * d + 2 * d - 2); } + Value penalty(Depth depth) { int d = depth / ONE_PLY ; return -Value(d * d + 4 * d + 1); } + const size_t HalfDensitySize = std::extent::value; EasyMoveManager EasyMove; @@ -573,9 +576,13 @@ namespace { if (thisThread->resetCalls.load(std::memory_order_relaxed)) { thisThread->resetCalls = false; - thisThread->callsCnt = 0; + // At low node count increase the checking rate to about 0.1% of nodes + // otherwise use a default value. + thisThread->callsCnt = Limits.nodes ? std::min((int64_t)4096, Limits.nodes / 1024) + : 4096; } - if (++thisThread->callsCnt > 4096) + + if (--thisThread->callsCnt <= 0) { for (Thread* th : Threads) th->resetCalls = true; @@ -612,6 +619,7 @@ namespace { ss->counterMoves = nullptr; (ss+1)->skipEarlyPruning = false; (ss+2)->killers[0] = (ss+2)->killers[1] = MOVE_NONE; + Square prevSq = to_sq((ss-1)->currentMove); // 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 @@ -634,21 +642,12 @@ namespace { // If ttMove is quiet, update killers, history, counter move on TT hit if (ttValue >= beta && ttMove) { - int d = depth / ONE_PLY; - if (!pos.capture_or_promotion(ttMove)) - { - Value bonus = Value(d * d + 2 * d - 2); - update_stats(pos, ss, ttMove, nullptr, 0, bonus); - } + update_stats(pos, ss, ttMove, nullptr, 0, bonus(depth)); // Extra penalty for a quiet TT move in previous ply when it gets refuted if ((ss-1)->moveCount == 1 && !pos.captured_piece()) - { - Value penalty = Value(d * d + 4 * d + 1); - Square prevSq = to_sq((ss-1)->currentMove); - update_cm_stats(ss-1, pos.piece_on(prevSq), prevSq, -penalty); - } + update_cm_stats(ss-1, pos.piece_on(prevSq), prevSq, penalty(depth)); } return ttValue; } @@ -946,9 +945,10 @@ moves_loop: // When in check search starts from here } else if (depth < 7 * ONE_PLY && !extension) { - Value v = Value(-35 * depth / ONE_PLY * depth / ONE_PLY); - if (ss->staticEval != VALUE_NONE) - v += ss->staticEval - alpha - 200; + Value v = -Value(399 + 35 * depth / ONE_PLY * depth / ONE_PLY); + + if (PvNode) + v += beta - alpha - 1; if (!pos.see_ge(move, v)) continue; @@ -991,7 +991,6 @@ moves_loop: // When in check search starts from here // castling moves, because they are coded as "king captures rook" and // hence break make_move(). else if ( type_of(move) == NORMAL - && type_of(pos.piece_on(to_sq(move))) != PAWN && !pos.see_ge(make_move(to_sq(move), from_sq(move)), VALUE_ZERO)) r -= 2 * ONE_PLY; @@ -1136,33 +1135,20 @@ moves_loop: // When in check search starts from here : inCheck ? mated_in(ss->ply) : DrawValue[pos.side_to_move()]; else if (bestMove) { - int d = depth / ONE_PLY; // Quiet best move: update killers, history and countermoves if (!pos.capture_or_promotion(bestMove)) - { - Value bonus = Value(d * d + 2 * d - 2); - update_stats(pos, ss, bestMove, quietsSearched, quietCount, bonus); - } + update_stats(pos, ss, bestMove, quietsSearched, quietCount, bonus(depth)); // Extra penalty for a quiet TT move in previous ply when it gets refuted if ((ss-1)->moveCount == 1 && !pos.captured_piece()) - { - Value penalty = Value(d * d + 4 * d + 1); - Square prevSq = to_sq((ss-1)->currentMove); - update_cm_stats(ss-1, pos.piece_on(prevSq), prevSq, -penalty); - } + update_cm_stats(ss-1, pos.piece_on(prevSq), prevSq, penalty(depth)); } // Bonus for prior countermove that caused the fail low else if ( depth >= 3 * ONE_PLY && !pos.captured_piece() && is_ok((ss-1)->currentMove)) - { - int d = depth / ONE_PLY; - Value bonus = Value(d * d + 2 * d - 2); - Square prevSq = to_sq((ss-1)->currentMove); - update_cm_stats(ss-1, pos.piece_on(prevSq), prevSq, bonus); - } + update_cm_stats(ss-1, pos.piece_on(prevSq), prevSq, bonus(depth)); tte->save(posKey, value_to_tt(bestValue, ss->ply), bestValue >= beta ? BOUND_LOWER :