template<Color Us, bool Trace>
Score evaluate_king(const Position& pos, EvalInfo& ei, Value margins[]);
- template<Color Us>
+ template<Color Us, bool Trace>
Score evaluate_threats(const Position& pos, EvalInfo& ei);
template<Color Us>
int evaluate_space(const Position& pos, EvalInfo& ei);
- template<Color Us>
+ template<Color Us, bool Trace>
Score evaluate_passed_pawns(const Position& pos, EvalInfo& ei);
Score evaluate_unstoppable_pawns(const Position& pos, EvalInfo& ei);
- evaluate_king<BLACK, Trace>(pos, ei, margins);
// Evaluate tactical threats, we need full attack information including king
- score += evaluate_threats<WHITE>(pos, ei)
- - evaluate_threats<BLACK>(pos, ei);
+ score += evaluate_threats<WHITE, Trace>(pos, ei)
+ - evaluate_threats<BLACK, Trace>(pos, ei);
// Evaluate passed pawns, we need full attack information including king
- score += evaluate_passed_pawns<WHITE>(pos, ei)
- - evaluate_passed_pawns<BLACK>(pos, ei);
+ score += evaluate_passed_pawns<WHITE, Trace>(pos, ei)
+ - evaluate_passed_pawns<BLACK, Trace>(pos, ei);
// If one side has only a king, check whether exists any unstoppable passed pawn
if (!pos.non_pawn_material(WHITE) || !pos.non_pawn_material(BLACK))
trace_add(PST, pos.psq_score());
trace_add(IMBALANCE, ei.mi->material_value());
trace_add(PAWN, ei.pi->pawns_value());
- trace_add(MOBILITY, apply_weight(mobilityWhite, Weights[Mobility]), apply_weight(mobilityBlack, Weights[Mobility]));
- trace_add(THREAT, evaluate_threats<WHITE>(pos, ei), evaluate_threats<BLACK>(pos, ei));
- trace_add(PASSED, evaluate_passed_pawns<WHITE>(pos, ei), evaluate_passed_pawns<BLACK>(pos, ei));
trace_add(UNSTOPPABLE, evaluate_unstoppable_pawns(pos, ei));
Score w = make_score(ei.mi->space_weight() * evaluate_space<WHITE>(pos, ei), 0);
Score b = make_score(ei.mi->space_weight() * evaluate_space<BLACK>(pos, ei), 0);
// evaluate_threats<>() assigns bonuses according to the type of attacking piece
// and the type of attacked one.
- template<Color Us>
+ template<Color Us, bool Trace>
Score evaluate_threats(const Position& pos, EvalInfo& ei) {
const Color Them = (Us == WHITE ? BLACK : WHITE);
& ~ei.attackedBy[Them][PAWN]
& ei.attackedBy[Us][ALL_PIECES];
- if (!weakEnemies)
- return score;
-
// Add bonus according to type of attacked enemy piece and to the
// type of attacking piece, from knights to queens. Kings are not
// considered because are already handled in king evaluation.
- for (PieceType pt1 = KNIGHT; pt1 < KING; pt1++)
- {
- b = ei.attackedBy[Us][pt1] & weakEnemies;
- if (b)
- for (PieceType pt2 = PAWN; pt2 < KING; pt2++)
- if (b & pos.pieces(pt2))
- score += ThreatBonus[pt1][pt2];
- }
+ if (weakEnemies)
+ for (PieceType pt1 = KNIGHT; pt1 < KING; pt1++)
+ {
+ b = ei.attackedBy[Us][pt1] & weakEnemies;
+ if (b)
+ for (PieceType pt2 = PAWN; pt2 < KING; pt2++)
+ if (b & pos.pieces(pt2))
+ score += ThreatBonus[pt1][pt2];
+ }
+
+ if (Trace)
+ TracedScores[Us][THREAT] = score;
+
return score;
}
ei.attackedBy[Us][ALL_PIECES] = ei.attackedBy[Us][PAWN] | ei.attackedBy[Us][KNIGHT]
| ei.attackedBy[Us][BISHOP] | ei.attackedBy[Us][ROOK]
| ei.attackedBy[Us][QUEEN] | ei.attackedBy[Us][KING];
+ if (Trace)
+ TracedScores[Us][MOBILITY] = apply_weight(mobility, Weights[Mobility]);
+
return score;
}
// evaluate_passed_pawns<>() evaluates the passed pawns of the given color
- template<Color Us>
+ template<Color Us, bool Trace>
Score evaluate_passed_pawns(const Position& pos, EvalInfo& ei) {
const Color Them = (Us == WHITE ? BLACK : WHITE);
b = ei.pi->passed_pawns(Us);
- if (!b)
- return SCORE_ZERO;
-
- do {
+ while (b)
+ {
Square s = pop_lsb(&b);
assert(pos.pawn_is_passed(Us, s));
}
score += make_score(mbonus, ebonus);
- } while (b);
+ }
+
+ if (Trace)
+ TracedScores[Us][PASSED] = apply_weight(score, Weights[PassedPawns]);
// Add the scores to the middle game and endgame eval
return apply_weight(score, Weights[PassedPawns]);