X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fsearch.cpp;h=abf2673499ec8be4f0f5ea7a09ad63701ef4542c;hb=17502a56592ffddb05e9a8e647197625157ae23a;hp=4e42ca310536eeefa4bbcceba85ea3503ef3803c;hpb=a0005ba45f7d5c97a096b79065c0b83ae3d81afa;p=stockfish diff --git a/src/search.cpp b/src/search.cpp index 4e42ca31..abf26734 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -239,8 +239,8 @@ namespace { std::ofstream LogFile; // Natural logarithmic lookup table and its getter function - double lnArray[512]; - inline double ln(int i) { return lnArray[i]; } + float lnArray[512]; + inline float ln(int i) { return lnArray[i]; } // MP related variables int ActiveThreads = 1; @@ -288,8 +288,8 @@ namespace { bool ok_to_prune(const Position& pos, Move m, Move threat); bool ok_to_use_TT(const TTEntry* tte, Depth depth, Value beta, int ply); Value refine_eval(const TTEntry* tte, Value defaultEval, int ply); - void reduction_parameters(double base, double Inhibitor, Depth depth, double& logLimit, double& gradient); - Depth reduction(int moveCount, const double LogLimit, const double BaseRed, const double Gradient); + void reduction_parameters(float base, float Inhibitor, Depth depth, float& logLimit, float& gradient); + Depth reduction(int moveCount, const float LogLimit, const float BaseRed, const float Gradient); void update_history(const Position& pos, Move move, Depth depth, Move movesSearched[], int moveCount); void update_killers(Move m, SearchStack& ss); void update_gains(const Position& pos, Move move, Value before, Value after); @@ -574,7 +574,7 @@ void init_threads() { // Init our logarithmic lookup table for (i = 0; i < 512; i++) - lnArray[i] = log(double(i)); // log() returns base-e logarithm + lnArray[i] = float(log(double(i))); // log() returns base-e logarithm for (i = 0; i < THREAD_MAX; i++) Threads[i].activeSplitPoints = 0; @@ -966,7 +966,7 @@ namespace { value = - VALUE_INFINITE; // Precalculate reduction parameters - double LogLimit, Gradient, BaseReduction = 0.5; + float LogLimit, Gradient, BaseReduction = 0.5; reduction_parameters(BaseReduction, 6.0, depth, LogLimit, Gradient); while (1) // Fail high loop @@ -1260,7 +1260,7 @@ namespace { MovePicker mp = MovePicker(pos, ttMove, depth, H, &ss[ply]); // Precalculate reduction parameters - double LogLimit, Gradient, BaseReduction = 0.5; + float LogLimit, Gradient, BaseReduction = 0.5; reduction_parameters(BaseReduction, 6.0, depth, LogLimit, Gradient); // Loop through all legal moves until no moves remain or a beta cutoff @@ -1497,10 +1497,9 @@ namespace { // Do a "stand pat". If we are above beta by a good margin then // return immediately. - // FIXME: test with added condition 'allowNullmove || depth <= OnePly' and !value_is_mate(beta) - // FIXME: test with modified condition 'depth < RazorDepth' if ( !isCheck - && depth < SelectiveDepth + && allowNullmove + && depth < RazorDepth && staticValue - FutilityMargins[int(depth)] >= beta) return staticValue - FutilityMargins[int(depth)]; @@ -1583,7 +1582,7 @@ namespace { CheckInfo ci(pos); // Precalculate reduction parameters - double LogLimit, Gradient, BaseReduction = 0.5; + float LogLimit, Gradient, BaseReduction = 0.5; reduction_parameters(BaseReduction, 3.0, depth, LogLimit, Gradient); // Loop through all legal moves until no moves remain or a beta cutoff occurs @@ -1630,36 +1629,6 @@ namespace { // Update current move movesSearched[moveCount++] = ss[ply].currentMove = move; - // Futility pruning for captures - // FIXME: test disabling 'Futility pruning for captures' - // FIXME: test with 'newDepth < RazorDepth' - Color them = opposite_color(pos.side_to_move()); - - if ( !isCheck - && newDepth < SelectiveDepth - && !dangerous - && pos.move_is_capture(move) - && !pos.move_is_check(move, ci) - && !move_is_promotion(move) - && move != ttMove - && !move_is_ep(move) - && (pos.type_of_piece_on(move_to(move)) != PAWN || !pos.pawn_is_passed(them, move_to(move)))) // Do not prune passed pawn captures - { - int preFutilityValueMargin = 0; - - if (newDepth >= OnePly) - preFutilityValueMargin = FutilityMargins[int(newDepth)]; - - Value futilityCaptureValue = ss[ply].eval + pos.endgame_value_of_piece_on(move_to(move)) + preFutilityValueMargin + ei.futilityMargin + 90; - - if (futilityCaptureValue < beta) - { - if (futilityCaptureValue > bestValue) - bestValue = futilityCaptureValue; - continue; - } - } - // Futility pruning if ( !isCheck && !dangerous @@ -1806,6 +1775,7 @@ namespace { const TTEntry* tte = NULL; int moveCount = 0; bool pvNode = (beta - alpha != 1); + Value oldAlpha = alpha; // Initialize, and make an early exit in case of an aborted search, // an instant draw, maximum ply reached, etc. @@ -1949,14 +1919,14 @@ namespace { // Update transposition table Depth d = (depth == Depth(0) ? Depth(0) : Depth(-1)); - if (bestValue < beta) + if (bestValue <= oldAlpha) { // If bestValue isn't changed it means it is still the static evaluation // of the node, so keep this info to avoid a future evaluation() call. ValueType type = (bestValue == staticValue && !ei.futilityMargin ? VALUE_TYPE_EV_UP : VALUE_TYPE_UPPER); TT.store(pos.get_key(), value_to_tt(bestValue, ply), type, d, MOVE_NONE); } - else + else if (bestValue >= beta) { move = ss[ply].pv[ply]; TT.store(pos.get_key(), value_to_tt(bestValue, ply), VALUE_TYPE_LOWER, d, move); @@ -1965,6 +1935,8 @@ namespace { if (!pos.move_is_capture_or_promotion(move)) update_killers(move, ss[ply]); } + else + TT.store(pos.get_key(), value_to_tt(bestValue, ply), VALUE_TYPE_EXACT, d, ss[ply].pv[ply]); assert(bestValue > -VALUE_INFINITE && bestValue < VALUE_INFINITE); @@ -1998,7 +1970,7 @@ namespace { const int FutilityMoveCountMargin = 3 + (1 << (3 * int(sp->depth) / 8)); // Precalculate reduction parameters - double LogLimit, Gradient, BaseReduction = 0.5; + float LogLimit, Gradient, BaseReduction = 0.5; reduction_parameters(BaseReduction, 3.0, sp->depth, LogLimit, Gradient); while ( lock_grab_bool(&(sp->lock)) @@ -2142,7 +2114,7 @@ namespace { Move move; // Precalculate reduction parameters - double LogLimit, Gradient, BaseReduction = 0.5; + float LogLimit, Gradient, BaseReduction = 0.5; reduction_parameters(BaseReduction, 6.0, sp->depth, LogLimit, Gradient); while ( lock_grab_bool(&(sp->lock)) @@ -2710,26 +2682,26 @@ namespace { // floating point operations are involved we try to recalculate reduction at each move, but // we do the most consuming computation only once per node. - void reduction_parameters(double baseReduction, double reductionInhibitor, Depth depth, double& logLimit, double& gradient) + void reduction_parameters(float baseReduction, float reductionInhibitor, Depth depth, float& logLimit, float& gradient) { // Precalculate some parameters to avoid to calculate the following formula for each move: // // red = baseReduction + ln(moveCount) * ln(depth / 2) / reductionInhibitor; // - logLimit = depth > OnePly ? (1.0 - baseReduction) * reductionInhibitor / ln(depth / 2) : 1000.0; - gradient = ln(depth / 2) / reductionInhibitor; + logLimit = depth > OnePly ? (1 - baseReduction) * reductionInhibitor / ln(depth / 2) : 1000; + gradient = depth > OnePly ? ln(depth / 2) / reductionInhibitor : 0; } // reduction() returns reduction in plies based on moveCount and depth. // Reduction is always at least one ply. - Depth reduction(int moveCount, double logLimit, double baseReduction, double gradient) { + Depth reduction(int moveCount, float logLimit, float baseReduction, float gradient) { if (ln(moveCount) < logLimit) return Depth(0); - double red = baseReduction + ln(moveCount) * gradient; + float red = baseReduction + ln(moveCount) * gradient; return Depth(int(floor(red * int(OnePly)))); }