X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=d54794bbc8712205a066cf977da4f692b3cb4c02;hp=627a64af2cc5b4ab6da5b31b59a809dcceabd428;hb=7733dadfd7c8781e3bde3cc4e21751fa44ab6ed8;hpb=debc8153520f95c25c1045b723c70ddb4b0d7f80 diff --git a/src/search.cpp b/src/search.cpp index 627a64af..d54794bb 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -52,9 +52,6 @@ using std::endl; namespace { - // Maximum number of allowed moves per position - const int MOVES_MAX = 256; - // Types enum NodeType { NonPV, PV }; @@ -188,12 +185,6 @@ namespace { // Dynamic razoring margin based on depth inline Value razor_margin(Depth d) { return Value(0x200 + 0x10 * int(d)); } - // Step 8. Null move search with verification search - - // Null move margin. A null move search will not be done if the static - // evaluation of the position is more than NullMoveMargin below beta. - const Value NullMoveMargin = Value(0x200); - // Maximum depth for use of dynamic threat detection when null move fails low const Depth ThreatDepth = 5 * ONE_PLY; @@ -372,7 +363,7 @@ void init_search() { // Init futility move count array for (d = 0; d < 32; d++) - FutilityMoveCountArray[d] = 3 + (1 << (3 * d / 8)); + FutilityMoveCountArray[d] = int(3.001 + 0.25 * pow(d, 2.0)); } @@ -639,7 +630,7 @@ namespace { // Add some extra time if the best move has changed during the last two iterations if (Iteration > 5 && Iteration <= 50) - TimeMgr.pv_unstability(BestMoveChangesByIteration[Iteration], + TimeMgr.pv_instability(BestMoveChangesByIteration[Iteration], BestMoveChangesByIteration[Iteration-1]); // Stop search if most of MaxSearchTime is consumed at the end of the @@ -1094,14 +1085,11 @@ namespace { return refinedValue - futility_margin(depth, 0); // Step 8. Null move search with verification search (is omitted in PV nodes) - // When we jump directly to qsearch() we do a null move only if static value is - // at least beta. Otherwise we do a null move if static value is not more than - // NullMoveMargin under beta. if ( !PvNode && !ss->skipNullMove && depth > ONE_PLY && !isCheck - && refinedValue >= beta - (depth >= 4 * ONE_PLY ? NullMoveMargin : 0) + && refinedValue >= beta && !value_is_mate(beta) && pos.non_pawn_material(pos.side_to_move())) { @@ -1443,12 +1431,11 @@ namespace { assert(tte->static_value() != VALUE_NONE); evalMargin = tte->static_value_margin(); - bestValue = tte->static_value(); + ss->eval = bestValue = tte->static_value(); } else - bestValue = evaluate(pos, evalMargin); + ss->eval = bestValue = evaluate(pos, evalMargin); - ss->eval = bestValue; update_gains(pos, (ss-1)->currentMove, (ss-1)->eval, ss->eval); // Stand pat. Return immediately if static value is at least beta @@ -1467,7 +1454,7 @@ namespace { deepChecks = (depth == -ONE_PLY && bestValue >= beta - PawnValueMidgame / 8); // Futility pruning parameters, not needed when in check - futilityBase = bestValue + FutilityMarginQS + evalMargin; + futilityBase = ss->eval + evalMargin + FutilityMarginQS; enoughMaterial = pos.non_pawn_material(pos.side_to_move()) > RookValueMidgame; } @@ -1507,11 +1494,10 @@ namespace { } } - // Detect blocking evasions that are candidate to be pruned + // Detect non-capture evasions that are candidate to be pruned evasionPrunable = isCheck && bestValue > value_mated_in(PLY_MAX) && !pos.move_is_capture(move) - && pos.type_of_piece_on(move_from(move)) != KING && !pos.can_castle(pos.side_to_move()); // Don't search moves with negative SEE values @@ -1554,11 +1540,6 @@ namespace { ValueType vt = (bestValue <= oldAlpha ? VALUE_TYPE_UPPER : bestValue >= beta ? VALUE_TYPE_LOWER : VALUE_TYPE_EXACT); TT.store(pos.get_key(), value_to_tt(bestValue, ply), vt, d, ss->bestMove, ss->eval, evalMargin); - // Update killers only for checking moves that fails high - if ( bestValue >= beta - && !pos.move_is_capture_or_promotion(ss->bestMove)) - update_killers(ss->bestMove, ss); - assert(bestValue > -VALUE_INFINITE && bestValue < VALUE_INFINITE); return bestValue;