X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fsearch.cpp;h=3874852b1bbcac48a34ea38812b79b047a283d5d;hb=de642f16db0c443de2dc0ddf7b06c0a7d1c5b8b7;hp=23608f7a379570ff72d27a42816ead695e82e7f5;hpb=5d57bb467a4d703f480c87f58687705e2f56e338;p=stockfish diff --git a/src/search.cpp b/src/search.cpp index 23608f7a..3874852b 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -108,6 +108,13 @@ namespace { void update_quiet_stats(const Position& pos, Stack* ss, Move move, Move* quiets, int quietsCnt, int bonus); void update_capture_stats(const Position& pos, Move move, Move* captures, int captureCnt, int bonus); + inline bool gives_check(const Position& pos, Move move) { + Color us = pos.side_to_move(); + return type_of(move) == NORMAL && !(pos.blockers_for_king(~us) & pos.pieces(us)) + ? pos.check_squares(type_of(pos.moved_piece(move))) & to_sq(move) + : pos.gives_check(move); + } + // perft() is our utility to verify move generation. All the leaf nodes up // to the given depth are generated and counted, and the sum is returned. template @@ -507,7 +514,6 @@ namespace { Thread* thisThread = pos.this_thread(); inCheck = pos.checkers(); moveCount = captureCount = quietCount = ss->moveCount = 0; - ss->statScore = 0; bestValue = -VALUE_INFINITE; maxValue = VALUE_INFINITE; @@ -547,6 +553,13 @@ namespace { (ss+2)->killers[0] = (ss+2)->killers[1] = MOVE_NONE; Square prevSq = to_sq((ss-1)->currentMove); + // Initialize statScore to zero for the grandchildren of the current position. + // So statScore is shared between all grandchildren and only the first grandchild + // starts with statScore = 0. Later grandchildren start with the last calculated + // statScore of the previous grandchild. This influences the reduction rules in + // LMR which are based on the statScore of parent position. + (ss+2)->statScore = 0; + // 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 // position key in case of an excluded move. @@ -742,7 +755,18 @@ namespace { assert(depth >= 5 * ONE_PLY); pos.do_move(move, st); - value = -search(pos, ss+1, -rbeta, -rbeta+1, depth - 4 * ONE_PLY, !cutNode, false); + + // Perform a preliminary search at depth 1 to verify that the move holds. + // We will only do this search if the depth is not 5, thus avoiding two + // searches at depth 1 in a row. + if (depth != 5 * ONE_PLY) + value = -search(pos, ss+1, -rbeta, -rbeta+1, ONE_PLY, !cutNode, true); + + // If the first search was skipped or was performed and held, perform + // the regular search. + if (depth == 5 * ONE_PLY || value >= rbeta) + value = -search(pos, ss+1, -rbeta, -rbeta+1, depth - 4 * ONE_PLY, !cutNode, false); + pos.undo_move(move); if (value >= rbeta) return value; @@ -758,6 +782,7 @@ namespace { search(pos, ss, alpha, beta, d, cutNode, true); tte = TT.probe(posKey, ttHit); + ttValue = ttHit ? value_from_tt(tte->value(), ss->ply) : VALUE_NONE; ttMove = ttHit ? tte->move() : MOVE_NONE; } @@ -811,10 +836,7 @@ moves_loop: // When in check, search starts from here extension = DEPTH_ZERO; captureOrPromotion = pos.capture_or_promotion(move); movedPiece = pos.moved_piece(move); - - givesCheck = type_of(move) == NORMAL && !pos.discovered_check_candidates() - ? pos.check_squares(type_of(movedPiece)) & to_sq(move) - : pos.gives_check(move); + givesCheck = gives_check(pos, move); moveCountPruning = depth < 16 * ONE_PLY && moveCount >= FutilityMoveCounts[improving][depth / ONE_PLY]; @@ -1164,8 +1186,8 @@ moves_loop: // When in check, search starts from here // Transposition table lookup posKey = pos.key(); tte = TT.probe(posKey, ttHit); - ttMove = ttHit ? tte->move() : MOVE_NONE; ttValue = ttHit ? value_from_tt(tte->value(), ss->ply) : VALUE_NONE; + ttMove = ttHit ? tte->move() : MOVE_NONE; if ( !PvNode && ttHit @@ -1226,9 +1248,7 @@ moves_loop: // When in check, search starts from here { assert(is_ok(move)); - givesCheck = type_of(move) == NORMAL && !pos.discovered_check_candidates() - ? pos.check_squares(type_of(pos.moved_piece(move))) & to_sq(move) - : pos.gives_check(move); + givesCheck = gives_check(pos, move); moveCount++;