X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=a58231d22fe79e85e21a62c3d86a27ec5ad994f2;hp=ce8c4b7a0d782625d76113d863bf7e26e5c774c7;hb=ca6c9f85a5c3a45a248716b8fe68821b20eee201;hpb=805afcbf3d5db39c85b759232cfb99ab0a250311 diff --git a/src/search.cpp b/src/search.cpp index ce8c4b7a..a58231d2 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -622,7 +622,7 @@ namespace { // search to overwrite a previous full search TT value, so we use a different // position key in case of an excluded move. excludedMove = ss->excludedMove; - posKey = excludedMove ? pos.exclusion_key() : pos.key(); + posKey = pos.key() ^ Key(excludedMove); tte = TT.probe(posKey, ttHit); ttValue = ttHit ? value_from_tt(tte->value(), ss->ply) : VALUE_NONE; ttMove = rootNode ? thisThread->rootMoves[thisThread->PVIdx].pv[0] @@ -650,7 +650,7 @@ namespace { } // Extra penalty for a quiet TT move in previous ply when it gets refuted - if ((ss-1)->moveCount == 1 && !pos.captured_piece_type()) + if ((ss-1)->moveCount == 1 && !pos.captured_piece()) { Value penalty = Value(d * d + 4 * d + 1); Square prevSq = to_sq((ss-1)->currentMove); @@ -725,8 +725,8 @@ namespace { // Step 6. Razoring (skipped when in check) if ( !PvNode && depth < 4 * ONE_PLY - && eval + razor_margin[depth / ONE_PLY] <= alpha - && ttMove == MOVE_NONE) + && ttMove == MOVE_NONE + && eval + razor_margin[depth / ONE_PLY] <= alpha) { if ( depth <= ONE_PLY && eval + razor_margin[3 * ONE_PLY] <= alpha) @@ -788,9 +788,8 @@ namespace { } // Step 9. ProbCut (skipped when in check) - // If we have a very good capture (i.e. SEE > seeValues[captured_piece_type]) - // and a reduced search returns a value much above beta, we can (almost) - // safely prune the previous move. + // If we have a good enough capture and a reduced search returns a value + // much above beta, we can (almost) safely prune the previous move. if ( !PvNode && depth >= 5 * ONE_PLY && abs(beta) < VALUE_MATE_IN_MAX_PLY) @@ -802,7 +801,7 @@ namespace { assert((ss-1)->currentMove != MOVE_NONE); assert((ss-1)->currentMove != MOVE_NULL); - MovePicker mp(pos, ttMove, PieceValue[MG][pos.captured_piece_type()]); + MovePicker mp(pos, ttMove, rbeta - ss->staticEval); while ((move = mp.next_move()) != MOVE_NONE) if (pos.legal(move)) @@ -883,7 +882,7 @@ moves_loop: // When in check search starts from here moved_piece = pos.moved_piece(move); givesCheck = type_of(move) == NORMAL && !pos.discovered_check_candidates() - ? pos.check_info().checkSquares[type_of(pos.piece_on(from_sq(move)))] & to_sq(move) + ? pos.check_squares(type_of(pos.piece_on(from_sq(move)))) & to_sq(move) : pos.gives_check(move); moveCountPruning = depth < 16 * ONE_PLY @@ -925,8 +924,8 @@ moves_loop: // When in check search starts from here && !captureOrPromotion && !inCheck && !givesCheck - && !pos.advanced_pawn_push(move) - && bestValue > VALUE_MATED_IN_MAX_PLY) + && bestValue > VALUE_MATED_IN_MAX_PLY + && !pos.advanced_pawn_push(move)) { // Move count based pruning if (moveCountPruning) @@ -936,7 +935,6 @@ moves_loop: // When in check search starts from here // Countermoves based pruning if ( predictedDepth < 3 * ONE_PLY - && move != ss->killers[0] && (!cmh || (*cmh )[moved_piece][to_sq(move)] < VALUE_ZERO) && (!fmh || (*fmh )[moved_piece][to_sq(move)] < VALUE_ZERO) && (!fmh2 || (*fmh2)[moved_piece][to_sq(move)] < VALUE_ZERO || (cmh && fmh))) @@ -1140,7 +1138,7 @@ moves_loop: // When in check search starts from here } // Extra penalty for a quiet TT move in previous ply when it gets refuted - if ((ss-1)->moveCount == 1 && !pos.captured_piece_type()) + if ((ss-1)->moveCount == 1 && !pos.captured_piece()) { Value penalty = Value(d * d + 4 * d + 1); Square prevSq = to_sq((ss-1)->currentMove); @@ -1149,7 +1147,7 @@ moves_loop: // When in check search starts from here } // Bonus for prior countermove that caused the fail low else if ( depth >= 3 * ONE_PLY - && !pos.captured_piece_type() + && !pos.captured_piece() && is_ok((ss-1)->currentMove)) { int d = depth / ONE_PLY; @@ -1285,7 +1283,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_info().checkSquares[type_of(pos.piece_on(from_sq(move)))] & to_sq(move) + ? pos.check_squares(type_of(pos.piece_on(from_sq(move)))) & to_sq(move) : pos.gives_check(move); // Futility pruning @@ -1643,7 +1641,7 @@ void Tablebases::filter_root_moves(Position& pos, Search::RootMoves& rootMoves) RootInTB = root_probe_wdl(pos, rootMoves, TB::Score); // Only probe during search if winning - if (TB::Score <= VALUE_DRAW) + if (RootInTB && TB::Score <= VALUE_DRAW) Cardinality = 0; }