X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=44347f79f8b85ec1aee88b579c65c6f9d9b48908;hp=a9a62dbf8477926c2a53ae2759eee4f4cb4a0f56;hb=5c4002aa827653a125130a0d01d0bb96dd2b8bae;hpb=49a1fdd3fe894d170a2c2781238c0f0f907c08cc diff --git a/src/search.cpp b/src/search.cpp index a9a62dbf..44347f79 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -67,10 +67,10 @@ namespace { } // Reductions lookup table, initialized at startup - int Reductions[64]; // [depth or moveNumber] + int Reductions[MAX_MOVES]; // [depth or moveNumber] template Depth reduction(bool i, Depth d, int mn) { - int r = Reductions[std::min(d / ONE_PLY, 63)] * Reductions[std::min(mn, 63)] / 1024; + int r = Reductions[d / ONE_PLY] * Reductions[mn] / 1024; return ((r + 512) / 1024 + (!i && r > 1024) - PvNode) * ONE_PLY; } @@ -147,7 +147,7 @@ namespace { void Search::init() { - for (int i = 1; i < 64; ++i) + for (int i = 1; i < MAX_MOVES; ++i) Reductions[i] = int(1024 * std::log(i) / std::sqrt(1.95)); } @@ -584,8 +584,7 @@ namespace { assert(0 <= ss->ply && ss->ply < MAX_PLY); (ss+1)->ply = ss->ply + 1; - ss->currentMove = (ss+1)->excludedMove = bestMove = MOVE_NONE; - ss->continuationHistory = &thisThread->continuationHistory[NO_PIECE][0]; + (ss+1)->excludedMove = bestMove = MOVE_NONE; (ss+2)->killers[0] = (ss+2)->killers[1] = MOVE_NONE; Square prevSq = to_sq((ss-1)->currentMove); @@ -607,15 +606,6 @@ namespace { : ttHit ? tte->move() : MOVE_NONE; ttPv = (ttHit && tte->is_pv()) || (PvNode && depth > 4 * ONE_PLY); - // if position has been searched at higher depths and we are shuffling, return value_draw - if (pos.rule50_count() > 36 - && ss->ply > 36 - && depth < 3 * ONE_PLY - && ttHit - && tte->depth() > depth - && pos.count() > 0) - return VALUE_DRAW; - // At non-PV nodes we check for an early TT cutoff if ( !PvNode && ttHit @@ -632,9 +622,8 @@ namespace { if (!pos.capture_or_promotion(ttMove)) update_quiet_stats(pos, ss, ttMove, nullptr, 0, stat_bonus(depth)); - // 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]) - && !pos.captured_piece()) + // Extra penalty for early quiet moves of the previous ply + if ((ss-1)->moveCount <= 2 && !pos.captured_piece()) update_continuation_histories(ss-1, pos.piece_on(prevSq), prevSq, -stat_bonus(depth + ONE_PLY)); } // Penalty for a quiet ttMove that fails low @@ -934,12 +923,21 @@ moves_loop: // When in check, search starts from here && (pos.blockers_for_king(~us) & from_sq(move) || pos.see_ge(move))) extension = ONE_PLY; + // Castling extension + else if (type_of(move) == CASTLING) + extension = ONE_PLY; + // Shuffle extension - else if(pos.rule50_count() > 14 && ss->ply > 14 && depth < 3 * ONE_PLY && PvNode) + else if ( PvNode + && pos.rule50_count() > 18 + && depth < 3 * ONE_PLY + && ss->ply < 3 * thisThread->rootDepth / ONE_PLY) // To avoid too deep searches extension = ONE_PLY; - // Castling extension - else if (type_of(move) == CASTLING) + // Passed pawn extension + else if ( move == ss->killers[0] + && pos.advanced_pawn_push(move) + && pos.pawn_passed(us, to_sq(move))) extension = ONE_PLY; // Calculate new depth for this move @@ -1234,8 +1232,7 @@ moves_loop: // When in check, search starts from here Thread* thisThread = pos.this_thread(); (ss+1)->ply = ss->ply + 1; - ss->currentMove = bestMove = MOVE_NONE; - ss->continuationHistory = &thisThread->continuationHistory[NO_PIECE][0]; + bestMove = MOVE_NONE; inCheck = pos.checkers(); moveCount = 0;