From 18b08096399c0e316baa1999f8cc6ce56bc7f616 Mon Sep 17 00:00:00 2001 From: Stefan Geschwentner Date: Tue, 3 Feb 2015 11:16:50 +0800 Subject: [PATCH] Add bonus for pawn attack threats Latent pawn attacks: Add a bonus to safe pawn pushes which attacks an enemy piece. Based on an idea of Lyudmil Tsvetkov. STC: LLR: 2.95 (-2.94,2.94) [-1.50,4.50] Total: 7925 W: 1666 L: 1537 D: 4722 LTC: LLR: 2.95 (-2.94,2.94) [0.00,6.00] Total: 40109 W: 6841 L: 6546 D: 26722 Bench: 7696257 Resolves #240 --- src/evaluate.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 153e6eae..822be015 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -162,6 +162,7 @@ namespace { const Score TrappedRook = S(92, 0); const Score Unstoppable = S( 0, 20); const Score Hanging = S(31, 26); + const Score PawnAttackThreat = S(20, 20); // Penalty for a bishop on a1/h1 (a8/h8 for black) which is trapped by // a friendly pawn on b2/g2 (b7/g7 for black). This can obviously only @@ -492,7 +493,12 @@ namespace { template Score evaluate_threats(const Position& pos, const EvalInfo& ei) { - const Color Them = (Us == WHITE ? BLACK : WHITE); + const Color Them = (Us == WHITE ? BLACK : WHITE); + const Square Up = (Us == WHITE ? DELTA_N : DELTA_S); + const Square Left = (Us == WHITE ? DELTA_NW : DELTA_SE); + const Square Right = (Us == WHITE ? DELTA_NE : DELTA_SW); + const Bitboard TRank2BB = (Us == WHITE ? Rank2BB : Rank7BB); + const Bitboard TRank7BB = (Us == WHITE ? Rank7BB : Rank2BB); enum { Defended, Weak }; enum { Minor, Major }; @@ -541,6 +547,21 @@ namespace { score += more_than_one(b) ? KingOnMany : KingOnOne; } + // Add bonus for safe pawn pushes which attacks an enemy piece + b = pos.pieces(Us, PAWN) & ~TRank7BB; + b = shift_bb(b | (shift_bb(b & TRank2BB) & ~pos.pieces())); + + b &= ~pos.pieces() + & ~ei.attackedBy[Them][PAWN] + & (ei.attackedBy[Us][PAWN] | ~ei.attackedBy[Them][ALL_PIECES]); + + b = (shift_bb(b) | shift_bb(b)) + & pos.pieces(Them) + & ~ei.attackedBy[Us][PAWN]; + + if(b) + score += popcount(b) * PawnAttackThreat; + if (Trace) Tracing::write(Tracing::THREAT, Us, score); -- 2.39.2