X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fsearch.cpp;h=d654fec9c414a75be3fd6d406fdaf8fc24053613;hb=a530fc2b600da4e9247a0e0242dead246d824c68;hp=44c29ec878209a882c27f5880878443ac32a0081;hpb=dd5a3ae4a6c7cc4adcbb4b72378694b0889139d7;p=stockfish diff --git a/src/search.cpp b/src/search.cpp index 44c29ec8..d654fec9 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -310,7 +310,7 @@ namespace { Value *alpha, Value *beta, Value *bestValue, const Value futilityValue, const Value approximateValue, Depth depth, int *moves, - MovePicker *mp, Bitboard dcCandidates, int master, bool pvNode); + MovePicker *mp, int master, bool pvNode); void wake_sleeping_threads(); #if !defined(_MSC_VER) @@ -333,14 +333,14 @@ namespace { int perft(Position& pos, Depth depth) { Move move; - MovePicker mp = MovePicker(pos, MOVE_NONE, depth, H); int sum = 0; + MovePicker mp = MovePicker(pos, MOVE_NONE, depth, H); // If we are at the last ply we don't need to do and undo // the moves, just to count them. if (depth <= OnePly) // Replace with '<' to test also qsearch { - while ((move = mp.get_next_move()) != MOVE_NONE) sum++; + while (mp.get_next_move()) sum++; return sum; } @@ -348,10 +348,10 @@ int perft(Position& pos, Depth depth) CheckInfo ci(pos); while ((move = mp.get_next_move()) != MOVE_NONE) { - StateInfo st; - pos.do_move(move, st, ci.dcCandidates, pos.move_is_check(move, ci)); - sum += perft(pos, depth - OnePly); - pos.undo_move(move); + StateInfo st; + pos.do_move(move, st, ci, pos.move_is_check(move, ci)); + sum += perft(pos, depth - OnePly); + pos.undo_move(move); } return sum; } @@ -898,13 +898,14 @@ namespace { << " currmovenumber " << i + 1 << std::endl; // Decide search depth for this move + bool moveIsCheck = pos.move_is_check(move); bool captureOrPromotion = pos.move_is_capture_or_promotion(move); bool dangerous; - ext = extension(pos, move, true, captureOrPromotion, pos.move_is_check(move), false, false, &dangerous); + ext = extension(pos, move, true, captureOrPromotion, moveIsCheck, false, false, &dangerous); newDepth = (Iteration - 2) * OnePly + ext + InitialDepth; // Make the move, and search it - pos.do_move(move, st, ci.dcCandidates); + pos.do_move(move, st, ci, moveIsCheck); if (i < MultiPV) { @@ -1135,7 +1136,7 @@ namespace { newDepth = depth - OnePly + ext; // Make and search the move - pos.do_move(move, st, ci.dcCandidates, moveIsCheck); + pos.do_move(move, st, ci, moveIsCheck); if (moveCount == 1) // The first move in list is the PV value = -search_pv(pos, ss, -beta, -alpha, newDepth, ply+1, threadID); @@ -1208,8 +1209,8 @@ namespace { && idle_thread_exists(threadID) && !AbortSearch && !thread_should_stop(threadID) - && split(pos, ss, ply, &alpha, &beta, &bestValue, VALUE_NONE, VALUE_NONE, depth, - &moveCount, &mp, ci.dcCandidates, threadID, true)) + && split(pos, ss, ply, &alpha, &beta, &bestValue, VALUE_NONE, VALUE_NONE, + depth, &moveCount, &mp, threadID, true)) break; } @@ -1398,7 +1399,8 @@ namespace { // Futility pruning if ( useFutilityPruning && !dangerous - && !captureOrPromotion) + && !captureOrPromotion + && move != ttMove) { // History pruning. See ok_to_prune() definition if ( moveCount >= 2 + int(depth) @@ -1423,7 +1425,7 @@ namespace { } // Make and search the move - pos.do_move(move, st, ci.dcCandidates, moveIsCheck); + pos.do_move(move, st, ci, 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. @@ -1468,8 +1470,8 @@ namespace { && idle_thread_exists(threadID) && !AbortSearch && !thread_should_stop(threadID) - && split(pos, ss, ply, &beta, &beta, &bestValue, futilityValue, approximateEval, depth, &moveCount, - &mp, ci.dcCandidates, threadID, false)) + && split(pos, ss, ply, &beta, &beta, &bestValue, futilityValue, approximateEval, + depth, &moveCount, &mp, threadID, false)) break; } @@ -1609,6 +1611,7 @@ namespace { && !isCheck && !pvNode && !moveIsCheck + && move != ttMove && !move_is_promotion(move) && !pos.move_is_passed_pawn_push(move)) { @@ -1635,7 +1638,7 @@ namespace { continue; // Make and search the move - pos.do_move(move, st, ci.dcCandidates, moveIsCheck); + pos.do_move(move, st, ci, moveIsCheck); value = -qsearch(pos, ss, -beta, -alpha, depth-OnePly, ply+1, threadID); pos.undo_move(move); @@ -1762,7 +1765,7 @@ namespace { // Make and search the move. StateInfo st; - pos.do_move(move, st, sp->dcCandidates, moveIsCheck); + pos.do_move(move, st, ci, 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. @@ -1868,7 +1871,7 @@ namespace { // Make and search the move. StateInfo st; - pos.do_move(move, st, sp->dcCandidates, moveIsCheck); + pos.do_move(move, st, ci, 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. @@ -2812,7 +2815,7 @@ namespace { bool split(const Position& p, SearchStack* sstck, int ply, Value* alpha, Value* beta, Value* bestValue, const Value futilityValue, const Value approximateEval, Depth depth, int* moves, - MovePicker* mp, Bitboard dcCandidates, int master, bool pvNode) { + MovePicker* mp, int master, bool pvNode) { assert(p.is_ok()); assert(sstck != NULL); @@ -2849,7 +2852,6 @@ namespace { splitPoint->alpha = pvNode? *alpha : (*beta - 1); splitPoint->beta = *beta; splitPoint->pvNode = pvNode; - splitPoint->dcCandidates = dcCandidates; splitPoint->bestValue = *bestValue; splitPoint->futilityValue = futilityValue; splitPoint->approximateEval = approximateEval;