From c45a4e0b48d7f5c570637d63592a07e185476334 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sun, 11 Nov 2012 11:04:58 +0100 Subject: [PATCH] Revert "Don't prune discovered checks" Both Lucas re-test and Jean-Francois confirrm it is a regression. Here Jean-Francois's results after 3600 games : Score of 96d3b1c92b8 vs 3b87314: 690 - 729 - 2181 [0.495] 3600 ELO: -3.86 +- 99%: 14.94 95%: 11.35 LOS: 15.03% Wins: 690 Losses: 729 Draws: 2181 Total: 3600 Bench: 5404066 --- src/position.cpp | 16 ++++++++-------- src/position.h | 2 +- src/search.cpp | 10 +++------- src/types.h | 6 ------ 4 files changed, 12 insertions(+), 22 deletions(-) diff --git a/src/position.cpp b/src/position.cpp index 9f2ee197..004d6994 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -657,7 +657,7 @@ bool Position::is_pseudo_legal(const Move m) const { /// Position::move_gives_check() tests whether a pseudo-legal move gives a check -CheckType Position::move_gives_check(Move m, const CheckInfo& ci) const { +bool Position::move_gives_check(Move m, const CheckInfo& ci) const { assert(is_ok(m)); assert(ci.dcCandidates == discovered_check_candidates()); @@ -669,7 +669,7 @@ CheckType Position::move_gives_check(Move m, const CheckInfo& ci) const { // Direct check ? if (ci.checkSq[pt] & to) - return DIRECT_CHECK; + return true; // Discovery check ? if (ci.dcCandidates && (ci.dcCandidates & from)) @@ -677,19 +677,19 @@ CheckType Position::move_gives_check(Move m, const CheckInfo& ci) const { // For pawn and king moves we need to verify also direction if ( (pt != PAWN && pt != KING) || !squares_aligned(from, to, king_square(~sideToMove))) - return DISCO_CHECK; + return true; } // Can we skip the ugly special cases ? if (type_of(m) == NORMAL) - return NO_CHECK; + return false; Color us = sideToMove; Square ksq = king_square(~us); // Promotion with check ? if (type_of(m) == PROMOTION) - return attacks_from(Piece(promotion_type(m)), to, pieces() ^ from) & ksq ? DIRECT_CHECK : NO_CHECK; + return attacks_from(Piece(promotion_type(m)), to, pieces() ^ from) & ksq; // En passant capture with check ? We have already handled the case // of direct checks and ordinary discovered check, the only case we @@ -701,7 +701,7 @@ CheckType Position::move_gives_check(Move m, const CheckInfo& ci) const { Bitboard b = (pieces() ^ from ^ capsq) | to; return (attacks_bb< ROOK>(ksq, b) & pieces(us, QUEEN, ROOK)) - | (attacks_bb(ksq, b) & pieces(us, QUEEN, BISHOP)) ? DISCO_CHECK : NO_CHECK; + | (attacks_bb(ksq, b) & pieces(us, QUEEN, BISHOP)); } // Castling with check ? @@ -713,10 +713,10 @@ CheckType Position::move_gives_check(Move m, const CheckInfo& ci) const { Square rto = relative_square(us, rfrom > kfrom ? SQ_F1 : SQ_D1); Bitboard b = (pieces() ^ kfrom ^ rfrom) | rto | kto; - return attacks_bb(rto, b) & ksq ? DIRECT_CHECK : NO_CHECK; + return attacks_bb(rto, b) & ksq; } - return NO_CHECK; + return false; } diff --git a/src/position.h b/src/position.h index 813cd010..d09dce08 100644 --- a/src/position.h +++ b/src/position.h @@ -136,7 +136,7 @@ public: template Bitboard attacks_from(Square s, Color c) const; // Properties of moves - CheckType move_gives_check(Move m, const CheckInfo& ci) const; + bool move_gives_check(Move m, const CheckInfo& ci) const; bool move_is_legal(const Move m) const; bool pl_move_is_legal(Move m, Bitboard pinned) const; bool is_pseudo_legal(const Move m) const; diff --git a/src/search.cpp b/src/search.cpp index 35a39681..3ffd8ae4 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -483,8 +483,7 @@ namespace { Depth ext, newDepth; Value bestValue, value, ttValue; Value eval, nullValue, futilityValue; - CheckType givesCheck; - bool inCheck, pvMove, singularExtensionNode; + bool inCheck, givesCheck, pvMove, singularExtensionNode; bool captureOrPromotion, dangerous, doFullDepthSearch; int moveCount, playedMoveCount; @@ -816,7 +815,7 @@ split_point_start: // At split points actual search starts from here if (PvNode && dangerous) ext = ONE_PLY; - else if (givesCheck && (givesCheck == DISCO_CHECK || pos.see_sign(move) >= 0)) + else if (givesCheck && pos.see_sign(move) >= 0) ext = ONE_PLY / 2; // Singular extension search. If all moves but one fail low on a search of @@ -883,7 +882,6 @@ split_point_start: // At split points actual search starts from here // Prune moves with negative SEE at low depths if ( predictedDepth < 2 * ONE_PLY - && givesCheck != DISCO_CHECK && pos.see_sign(move) < 0) { if (SpNode) @@ -1104,8 +1102,7 @@ split_point_start: // At split points actual search starts from here Key posKey; Move ttMove, move, bestMove; Value bestValue, value, ttValue, futilityValue, futilityBase; - CheckType givesCheck; - bool enoughMaterial, evasionPrunable, fromNull; + bool givesCheck, enoughMaterial, evasionPrunable, fromNull; Depth ttDepth; ss->currentMove = bestMove = MOVE_NONE; @@ -1237,7 +1234,6 @@ split_point_start: // At split points actual search starts from here if ( !PvNode && (!InCheck || evasionPrunable) && move != ttMove - && givesCheck != DISCO_CHECK && type_of(move) != PROMOTION && pos.see_sign(move) < 0) continue; diff --git a/src/types.h b/src/types.h index eea31e3b..9b36fd89 100644 --- a/src/types.h +++ b/src/types.h @@ -130,12 +130,6 @@ enum MoveType { CASTLE = 3 << 14 }; -enum CheckType { - NO_CHECK, - DIRECT_CHECK, - DISCO_CHECK -}; - enum CastleRight { // Defined as in PolyGlot book hash key CASTLES_NONE = 0, WHITE_OO = 1, -- 2.39.2