X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fsearch.cpp;h=44c29ec878209a882c27f5880878443ac32a0081;hb=dd5a3ae4a6c7cc4adcbb4b72378694b0889139d7;hp=f7ddfa0481f2f32697400015c408b91bdf75abc0;hpb=30075e4abcf0430cef78ae0b7823390013e75618;p=stockfish diff --git a/src/search.cpp b/src/search.cpp index f7ddfa04..44c29ec8 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -334,7 +334,6 @@ int perft(Position& pos, Depth depth) { Move move; MovePicker mp = MovePicker(pos, MOVE_NONE, depth, H); - Bitboard dcCandidates = pos.discovered_check_candidates(pos.side_to_move()); int sum = 0; // If we are at the last ply we don't need to do and undo @@ -346,10 +345,11 @@ int perft(Position& pos, Depth depth) } // Loop through all legal moves + CheckInfo ci(pos); while ((move = mp.get_next_move()) != MOVE_NONE) { StateInfo st; - pos.do_move(move, st, dcCandidates); + pos.do_move(move, st, ci.dcCandidates, pos.move_is_check(move, ci)); sum += perft(pos, depth - OnePly); pos.undo_move(move); } @@ -862,7 +862,7 @@ namespace { Value oldAlpha = alpha; Value value; - Bitboard dcCandidates = pos.discovered_check_candidates(pos.side_to_move()); + CheckInfo ci(pos); // Loop through all the moves in the root move list for (int i = 0; i < rml.move_count() && !AbortSearch; i++) @@ -904,7 +904,7 @@ namespace { newDepth = (Iteration - 2) * OnePly + ext + InitialDepth; // Make the move, and search it - pos.do_move(move, st, dcCandidates); + pos.do_move(move, st, ci.dcCandidates); if (i < MultiPV) { @@ -1065,7 +1065,6 @@ namespace { Move movesSearched[256]; EvalInfo ei; StateInfo st; - Bitboard dcCandidates; const TTEntry* tte; Move ttMove, move; Depth ext, newDepth; @@ -1115,7 +1114,6 @@ namespace { isCheck = pos.is_check(); mateThreat = pos.has_mate_threat(opposite_color(pos.side_to_move())); CheckInfo ci(pos); - dcCandidates = ci.dc; MovePicker mp = MovePicker(pos, ttMove, depth, H, &ss[ply]); // Loop through all legal moves until no moves remain or a beta cutoff @@ -1127,7 +1125,7 @@ namespace { assert(move_is_ok(move)); singleReply = (isCheck && mp.number_of_evasions() == 1); - moveIsCheck = pos.move_is_check(move, dcCandidates); + moveIsCheck = pos.move_is_check(move, ci); captureOrPromotion = pos.move_is_capture_or_promotion(move); movesSearched[moveCount++] = ss[ply].currentMove = move; @@ -1137,7 +1135,7 @@ namespace { newDepth = depth - OnePly + ext; // Make and search the move - pos.do_move(move, st, dcCandidates); + pos.do_move(move, st, ci.dcCandidates, moveIsCheck); if (moveCount == 1) // The first move in list is the PV value = -search_pv(pos, ss, -beta, -alpha, newDepth, ply+1, threadID); @@ -1211,7 +1209,7 @@ namespace { && !AbortSearch && !thread_should_stop(threadID) && split(pos, ss, ply, &alpha, &beta, &bestValue, VALUE_NONE, VALUE_NONE, depth, - &moveCount, &mp, dcCandidates, threadID, true)) + &moveCount, &mp, ci.dcCandidates, threadID, true)) break; } @@ -1258,7 +1256,6 @@ namespace { Move movesSearched[256]; EvalInfo ei; StateInfo st; - Bitboard dcCandidates; const TTEntry* tte; Move ttMove, move; Depth ext, newDepth; @@ -1373,7 +1370,6 @@ namespace { // to search all moves. MovePicker mp = MovePicker(pos, ttMove, depth, H, &ss[ply]); CheckInfo ci(pos); - dcCandidates = ci.dc; futilityValue = VALUE_NONE; useFutilityPruning = depth < SelectiveDepth && !isCheck; @@ -1390,7 +1386,7 @@ namespace { assert(move_is_ok(move)); singleReply = (isCheck && mp.number_of_evasions() == 1); - moveIsCheck = pos.move_is_check(move, dcCandidates); + moveIsCheck = pos.move_is_check(move, ci); captureOrPromotion = pos.move_is_capture_or_promotion(move); movesSearched[moveCount++] = ss[ply].currentMove = move; @@ -1427,7 +1423,7 @@ namespace { } // Make and search the move - pos.do_move(move, st, dcCandidates); + pos.do_move(move, st, ci.dcCandidates, moveIsCheck); // Try to reduce non-pv search depth by one ply if move seems not problematic, // if the move fails high will be re-searched at full depth. @@ -1473,7 +1469,7 @@ namespace { && !AbortSearch && !thread_should_stop(threadID) && split(pos, ss, ply, &beta, &beta, &bestValue, futilityValue, approximateEval, depth, &moveCount, - &mp, dcCandidates, threadID, false)) + &mp, ci.dcCandidates, threadID, false)) break; } @@ -1522,10 +1518,9 @@ namespace { EvalInfo ei; StateInfo st; - Bitboard dcCandidates; Move ttMove, move; Value staticValue, bestValue, value, futilityValue; - bool isCheck, enoughMaterial; + bool isCheck, enoughMaterial, moveIsCheck; const TTEntry* tte = NULL; int moveCount = 0; bool pvNode = (beta - alpha != 1); @@ -1595,7 +1590,6 @@ namespace { // queen promotions and checks (only if depth == 0) will be generated. MovePicker mp = MovePicker(pos, ttMove, depth, H); CheckInfo ci(pos); - dcCandidates = ci.dc; enoughMaterial = pos.non_pawn_material(pos.side_to_move()) > RookValueMidgame; // Loop through the moves until no moves remain or a beta cutoff @@ -1608,12 +1602,14 @@ namespace { moveCount++; ss[ply].currentMove = move; + moveIsCheck = pos.move_is_check(move, ci); + // Futility pruning if ( enoughMaterial && !isCheck && !pvNode + && !moveIsCheck && !move_is_promotion(move) - && !pos.move_is_check(move, dcCandidates) && !pos.move_is_passed_pawn_push(move)) { futilityValue = staticValue @@ -1639,7 +1635,7 @@ namespace { continue; // Make and search the move - pos.do_move(move, st, dcCandidates); + pos.do_move(move, st, ci.dcCandidates, moveIsCheck); value = -qsearch(pos, ss, -beta, -alpha, depth-OnePly, ply+1, threadID); pos.undo_move(move); @@ -1701,6 +1697,7 @@ namespace { assert(ActiveThreads > 1); Position pos = Position(sp->pos); + CheckInfo ci(pos); SearchStack* ss = sp->sstack[threadID]; Value value; Move move; @@ -1714,7 +1711,7 @@ namespace { { assert(move_is_ok(move)); - bool moveIsCheck = pos.move_is_check(move, sp->dcCandidates); + bool moveIsCheck = pos.move_is_check(move, ci); bool captureOrPromotion = pos.move_is_capture_or_promotion(move); lock_grab(&(sp->lock)); @@ -1765,7 +1762,7 @@ namespace { // Make and search the move. StateInfo st; - pos.do_move(move, st, sp->dcCandidates); + pos.do_move(move, st, sp->dcCandidates, moveIsCheck); // Try to reduce non-pv search depth by one ply if move seems not problematic, // if the move fails high will be re-searched at full depth. @@ -1844,6 +1841,7 @@ namespace { assert(ActiveThreads > 1); Position pos = Position(sp->pos); + CheckInfo ci(pos); SearchStack* ss = sp->sstack[threadID]; Value value; Move move; @@ -1852,7 +1850,7 @@ namespace { && !thread_should_stop(threadID) && (move = sp->mp->get_next_move(sp->lock)) != MOVE_NONE) { - bool moveIsCheck = pos.move_is_check(move, sp->dcCandidates); + bool moveIsCheck = pos.move_is_check(move, ci); bool captureOrPromotion = pos.move_is_capture_or_promotion(move); assert(move_is_ok(move)); @@ -1870,7 +1868,7 @@ namespace { // Make and search the move. StateInfo st; - pos.do_move(move, st, sp->dcCandidates); + pos.do_move(move, st, sp->dcCandidates, moveIsCheck); // Try to reduce non-pv search depth by one ply if move seems not problematic, // if the move fails high will be re-searched at full depth.