X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=978f6622d3f142a178cf2c92a59ea07bdb9d76bd;hp=6f9c8b2bdd14f8e7736288b06f532c3fc934c731;hb=cf4c28ff86ac76c1d04701e2aa88493d31643db6;hpb=d6904157aab50f7b2a53843f681b232247e866e2 diff --git a/src/search.cpp b/src/search.cpp index 6f9c8b2b..978f6622 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -199,7 +199,7 @@ namespace { Depth PassedPawnExtension[2], PawnEndgameExtension[2], MateThreatExtension[2]; // Minimum depth for use of singular extension - const Depth SingularExtensionDepth[2] = { 7 * OnePly /* non-PV */, 6 * OnePly /* PV */}; + const Depth SingularExtensionDepth[2] = { 8 * OnePly /* non-PV */, 6 * OnePly /* PV */}; // If the TT move is at least SingularExtensionMargin better then the // remaining ones we will extend it. @@ -366,26 +366,27 @@ void init_search() { int perft(Position& pos, Depth depth) { + MoveStack mlist[256]; StateInfo st; - Move move; + Move m; int sum = 0; - MovePicker mp(pos, MOVE_NONE, depth, H); + + // Generate all legal moves + MoveStack* last = generate_moves(pos, mlist); // 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 (mp.get_next_move()) sum++; - return sum; - } + if (depth <= OnePly) + return int(last - mlist); // Loop through all legal moves CheckInfo ci(pos); - while ((move = mp.get_next_move()) != MOVE_NONE) + for (MoveStack* cur = mlist; cur != last; cur++) { - pos.do_move(move, st, ci, pos.move_is_check(move, ci)); + m = cur->move; + pos.do_move(m, st, ci, pos.move_is_check(m, ci)); sum += perft(pos, depth - OnePly); - pos.undo_move(move); + pos.undo_move(m); } return sum; } @@ -714,6 +715,7 @@ namespace { alpha = *alphaPtr; beta = *betaPtr; isCheck = pos.is_check(); + depth = (Iteration - 2) * OnePly + InitialDepth; // Step 1. Initialize node (polling is omitted at root) ss->currentMove = ss->bestMove = MOVE_NONE; @@ -763,7 +765,6 @@ namespace { captureOrPromotion = pos.move_is_capture_or_promotion(move); // Step 11. Decide the new search depth - depth = (Iteration - 2) * OnePly + InitialDepth; ext = extension(pos, move, captureOrPromotion, moveIsCheck, false, false, &dangerous); newDepth = depth + ext; @@ -969,7 +970,7 @@ namespace { Move movesSearched[256]; EvalInfo ei; StateInfo st; - const TTEntry *tte, *ttx; + const TTEntry *tte; Key posKey; Move ttMove, move, excludedMove, threatMove; Depth ext, newDepth; @@ -1167,7 +1168,7 @@ namespace { // Expensive mate threat detection (only for PV nodes) if (PvNode) - mateThreat = pos.has_mate_threat(opposite_color(pos.side_to_move())); + mateThreat = pos.has_mate_threat(); // Initialize a MovePicker object for the current position MovePicker mp = MovePicker(pos, ttMove, depth, H, ss, (PvNode ? -VALUE_INFINITE : beta)); @@ -1206,22 +1207,9 @@ namespace { && move == tte->move() && ext < OnePly) { - // Avoid to do an expensive singular extension search on nodes where - // such search have already been done in the past, so assume the last - // singular extension search result is still valid. - if ( !PvNode - && depth < SingularExtensionDepth[PvNode] + 5 * OnePly - && (ttx = TT.retrieve(pos.get_exclusion_key())) != NULL) - { - if (is_upper_bound(ttx->type())) - ext = OnePly; - - singularExtensionNode = false; - } - Value ttValue = value_from_tt(tte->value(), ply); - if (singularExtensionNode && abs(ttValue) < VALUE_KNOWN_WIN) + if (abs(ttValue) < VALUE_KNOWN_WIN) { Value b = ttValue - SingularExtensionMargin; ss->excludedMove = move; @@ -2034,7 +2022,7 @@ namespace { if ( m != MOVE_NULL && before != VALUE_NONE && after != VALUE_NONE - && pos.captured_piece() == NO_PIECE_TYPE + && pos.captured_piece_type() == PIECE_TYPE_NONE && !move_is_special(m)) H.set_gain(pos.piece_on(move_to(m)), move_to(m), -(before + after)); }