- // evaluate_pieces() assigns bonuses and penalties to all the pieces of both colors
-
- template<bool Trace>
- Score evaluate_pieces(const Position& pos, EvalInfo& ei, Score* mobility) {
-
- // Do not include in mobility squares protected by enemy pawns or occupied by our pieces
- const Bitboard whiteMobilityArea = ~(ei.attackedBy[BLACK][PAWN] | pos.pieces(WHITE, PAWN, KING));
- const Bitboard blackMobilityArea = ~(ei.attackedBy[WHITE][PAWN] | pos.pieces(BLACK, PAWN, KING));
-
- Score score;
-
- score = evaluate_pieces<KNIGHT, WHITE, Trace>(pos, ei, mobility, whiteMobilityArea)
- - evaluate_pieces<KNIGHT, BLACK, Trace>(pos, ei, mobility, blackMobilityArea);
- score += evaluate_pieces<BISHOP, WHITE, Trace>(pos, ei, mobility, whiteMobilityArea)
- - evaluate_pieces<BISHOP, BLACK, Trace>(pos, ei, mobility, blackMobilityArea);
- score += evaluate_pieces< ROOK, WHITE, Trace>(pos, ei, mobility, whiteMobilityArea)
- - evaluate_pieces< ROOK, BLACK, Trace>(pos, ei, mobility, blackMobilityArea);
- score += evaluate_pieces< QUEEN, WHITE, Trace>(pos, ei, mobility, whiteMobilityArea)
- - evaluate_pieces< QUEEN, BLACK, Trace>(pos, ei, mobility, blackMobilityArea);
-
- // Sum up all attacked squares (updated in evaluate_pieces)
- ei.attackedBy[WHITE][ALL_PIECES] = ei.attackedBy[WHITE][PAWN] | ei.attackedBy[WHITE][KNIGHT]
- | ei.attackedBy[WHITE][BISHOP] | ei.attackedBy[WHITE][ROOK]
- | ei.attackedBy[WHITE][QUEEN] | ei.attackedBy[WHITE][KING];
-
- ei.attackedBy[BLACK][ALL_PIECES] = ei.attackedBy[BLACK][PAWN] | ei.attackedBy[BLACK][KNIGHT]
- | ei.attackedBy[BLACK][BISHOP] | ei.attackedBy[BLACK][ROOK]
- | ei.attackedBy[BLACK][QUEEN] | ei.attackedBy[BLACK][KING];
- if (Trace)
- {
- Tracing::terms[WHITE][Tracing::MOBILITY] = apply_weight(mobility[WHITE], Weights[Mobility]);
- Tracing::terms[BLACK][Tracing::MOBILITY] = apply_weight(mobility[BLACK], Weights[Mobility]);
- }
-
- return score;