X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=ffe724aa10a864d8b3fad173c5a91c5fa9bb7e26;hp=433129d9b5737659cacc8a9307d803a9a0e2d30d;hb=a18c2c2c3f38070cb897a8a28cf1d6d45236ded4;hpb=9da3b44ddc7bc9ea7094b91663cbc0f8319c46be diff --git a/src/search.cpp b/src/search.cpp index 433129d9..ffe724aa 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -68,14 +68,15 @@ namespace { const int skipPhase[] = { 0, 1, 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7 }; // Razoring and futility margin based on depth - const int razor_margin[4] = { 483, 570, 603, 554 }; + // razor_margin[0] is unused as long as depth >= ONE_PLY in search + const int razor_margin[] = { 0, 570, 603, 554 }; Value futility_margin(Depth d) { return Value(150 * d / ONE_PLY); } // Futility and reductions lookup tables, initialized at startup int FutilityMoveCounts[2][16]; // [improving][depth] int Reductions[2][2][64][64]; // [pv][improving][depth][moveNumber] - // Threshold used for countermoves based pruning. + // Threshold used for countermoves based pruning const int CounterMovePruneThreshold = 0; template Depth reduction(bool i, Depth d, int mn) { @@ -195,8 +196,10 @@ void Search::clear() { th->counterMoves.clear(); th->history.clear(); th->counterMoveHistory.clear(); - th->counterMoveHistory[NO_PIECE][0].fill(CounterMovePruneThreshold-1); th->resetCalls = true; + CounterMoveStats& cm = th->counterMoveHistory[NO_PIECE][0]; + int* t = &cm[NO_PIECE][0]; + std::fill(t, t + sizeof(cm), CounterMovePruneThreshold - 1); } Threads.main()->previousScore = VALUE_INFINITE; @@ -562,9 +565,10 @@ namespace { if (thisThread->resetCalls.load(std::memory_order_relaxed)) { thisThread->resetCalls = false; + // 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) + thisThread->callsCnt = Limits.nodes ? std::min(4096, int(Limits.nodes / 1024)) : 4096; } @@ -875,7 +879,7 @@ moves_loop: // When in check search starts from here // (alpha-s, beta-s), and just one fails high on (alpha, beta), then that move // is singular and should be extended. To verify this we do a reduced search // on all the other moves but the ttMove and if the result is lower than - // ttValue minus a margin then we extend the ttMove. + // ttValue minus a margin then we will extend the ttMove. if ( singularExtensionNode && move == ttMove && pos.legal(move)) @@ -889,7 +893,7 @@ moves_loop: // When in check search starts from here if (value < rBeta) extension = ONE_PLY; } - else if ( givesCheck + else if ( givesCheck && !moveCountPruning && pos.see_ge(move, VALUE_ZERO)) extension = ONE_PLY; @@ -904,10 +908,11 @@ moves_loop: // When in check search starts from here { if ( !captureOrPromotion && !givesCheck - && (!pos.advanced_pawn_push(move) || pos.non_pawn_material() >= 5000)) + && (!pos.advanced_pawn_push(move) || pos.non_pawn_material() >= Value(5000))) { // Move count based pruning - if (moveCountPruning) { + if (moveCountPruning) + { skipQuiets = true; continue; } @@ -1126,11 +1131,11 @@ moves_loop: // When in check search starts from here && is_ok((ss-1)->currentMove)) update_cm_stats(ss-1, pos.piece_on(prevSq), prevSq, stat_bonus(depth)); - if(!excludedMove) + if (!excludedMove) tte->save(posKey, value_to_tt(bestValue, ss->ply), - bestValue >= beta ? BOUND_LOWER : - PvNode && bestMove ? BOUND_EXACT : BOUND_UPPER, - depth, bestMove, ss->staticEval, TT.generation()); + bestValue >= beta ? BOUND_LOWER : + PvNode && bestMove ? BOUND_EXACT : BOUND_UPPER, + depth, bestMove, ss->staticEval, TT.generation()); assert(bestValue > -VALUE_INFINITE && bestValue < VALUE_INFINITE); @@ -1278,6 +1283,7 @@ moves_loop: // When in check search starts from here // Detect non-capture evasions that are candidates to be pruned evasionPrunable = InCheck + && depth != DEPTH_ZERO && bestValue > VALUE_MATED_IN_MAX_PLY && !pos.capture(move);