From d1e18fc7dd78a3f5223162dfc79c26baaefcf69e Mon Sep 17 00:00:00 2001 From: Gary Linscott Date: Wed, 21 Mar 2012 08:19:21 -0400 Subject: [PATCH 1/1] Optimize undefended minor check. --- src/evaluate.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 2193eb6b..9bd403e1 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -167,6 +167,9 @@ namespace { // happen in Chess960 games. const Score TrappedBishopA1H1Penalty = make_score(100, 100); + // Penalty for a minor piece that is not defended by anything + const Score UndefendedMinorPenalty = make_score(25, 10); + // The SpaceMask[Color] contains the area of the board which is considered // by the space evaluation. In the middle game, each side is given a bonus // based on how many squares inside this area are safe and available for @@ -680,16 +683,19 @@ Value do_evaluate(const Position& pos, Value& margin) { Score score = SCORE_ZERO; // Undefended minors get penalized even if not under attack - Bitboard undefended = pos.pieces(Them) - & (pos.pieces(BISHOP) | pos.pieces(KNIGHT)) - & ~ei.attackedBy[Them][0]; - if (undefended) - score += make_score(25, 10) * popcount(undefended); + const Bitboard undefended = pos.pieces(Them) + & (pos.pieces(BISHOP) | pos.pieces(KNIGHT)) + & ~ei.attackedBy[Them][0]; + if (undefended) { + score += UndefendedMinorPenalty; + if (!single_bit(undefended)) + score += UndefendedMinorPenalty; + } // Enemy pieces not defended by a pawn and under our attack - Bitboard weakEnemies = pos.pieces(Them) - & ~ei.attackedBy[Them][PAWN] - & ei.attackedBy[Us][0]; + const Bitboard weakEnemies = pos.pieces(Them) + & ~ei.attackedBy[Them][PAWN] + & ei.attackedBy[Us][0]; if (!weakEnemies) return score; -- 2.39.2