2 Stockfish, a UCI chess playing engine derived from Glaurung 2.1
3 Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
4 Copyright (C) 2008-2015 Marco Costalba, Joona Kiiski, Tord Romstad
5 Copyright (C) 2015-2020 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad
7 Stockfish is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 Stockfish is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include <cstring> // For std::memset
35 enum Tracing { NO_TRACE, TRACE };
37 enum Term { // The first 8 entries are reserved for PieceType
38 MATERIAL = 8, IMBALANCE, MOBILITY, THREAT, PASSED, SPACE, WINNABLE, TOTAL, TERM_NB
41 Score scores[TERM_NB][COLOR_NB];
43 double to_cp(Value v) { return double(v) / PawnValueEg; }
45 void add(int idx, Color c, Score s) {
49 void add(int idx, Score w, Score b = SCORE_ZERO) {
50 scores[idx][WHITE] = w;
51 scores[idx][BLACK] = b;
54 std::ostream& operator<<(std::ostream& os, Score s) {
55 os << std::setw(5) << to_cp(mg_value(s)) << " "
56 << std::setw(5) << to_cp(eg_value(s));
60 std::ostream& operator<<(std::ostream& os, Term t) {
62 if (t == MATERIAL || t == IMBALANCE || t == WINNABLE || t == TOTAL)
63 os << " ---- ----" << " | " << " ---- ----";
65 os << scores[t][WHITE] << " | " << scores[t][BLACK];
67 os << " | " << scores[t][WHITE] - scores[t][BLACK] << "\n";
72 using namespace Trace;
76 // Threshold for lazy and space evaluation
77 constexpr Value LazyThreshold = Value(1400);
78 constexpr Value SpaceThreshold = Value(12222);
80 // KingAttackWeights[PieceType] contains king attack weights by piece type
81 constexpr int KingAttackWeights[PIECE_TYPE_NB] = { 0, 0, 81, 52, 44, 10 };
83 // Penalties for enemy's safe checks
84 constexpr int QueenSafeCheck = 772;
85 constexpr int RookSafeCheck = 1084;
86 constexpr int BishopSafeCheck = 645;
87 constexpr int KnightSafeCheck = 792;
89 #define S(mg, eg) make_score(mg, eg)
91 // MobilityBonus[PieceType-2][attacked] contains bonuses for middle and end game,
92 // indexed by piece type and number of attacked squares in the mobility area.
93 constexpr Score MobilityBonus[][32] = {
94 { S(-62,-81), S(-53,-56), S(-12,-31), S( -4,-16), S( 3, 5), S( 13, 11), // Knight
95 S( 22, 17), S( 28, 20), S( 33, 25) },
96 { S(-48,-59), S(-20,-23), S( 16, -3), S( 26, 13), S( 38, 24), S( 51, 42), // Bishop
97 S( 55, 54), S( 63, 57), S( 63, 65), S( 68, 73), S( 81, 78), S( 81, 86),
98 S( 91, 88), S( 98, 97) },
99 { S(-60,-78), S(-20,-17), S( 2, 23), S( 3, 39), S( 3, 70), S( 11, 99), // Rook
100 S( 22,103), S( 31,121), S( 40,134), S( 40,139), S( 41,158), S( 48,164),
101 S( 57,168), S( 57,169), S( 62,172) },
102 { S(-30,-48), S(-12,-30), S( -8, -7), S( -9, 19), S( 20, 40), S( 23, 55), // Queen
103 S( 23, 59), S( 35, 75), S( 38, 78), S( 53, 96), S( 64, 96), S( 65,100),
104 S( 65,121), S( 66,127), S( 67,131), S( 67,133), S( 72,136), S( 72,141),
105 S( 77,147), S( 79,150), S( 93,151), S(108,168), S(108,168), S(108,171),
106 S(110,182), S(114,182), S(114,192), S(116,219) }
109 // RookOnFile[semiopen/open] contains bonuses for each rook when there is
110 // no (friendly) pawn on the rook file.
111 constexpr Score RookOnFile[] = { S(19, 7), S(48, 29) };
113 // ThreatByMinor/ByRook[attacked PieceType] contains bonuses according to
114 // which piece type attacks which one. Attacks on lesser pieces which are
115 // pawn-defended are not considered.
116 constexpr Score ThreatByMinor[PIECE_TYPE_NB] = {
117 S(0, 0), S(5, 32), S(57, 41), S(77, 56), S(88, 119), S(79, 161)
120 constexpr Score ThreatByRook[PIECE_TYPE_NB] = {
121 S(0, 0), S(3, 46), S(37, 68), S(42, 60), S(0, 38), S(58, 41)
124 // PassedRank[Rank] contains a bonus according to the rank of a passed pawn
125 constexpr Score PassedRank[RANK_NB] = {
126 S(0, 0), S(10, 28), S(17, 33), S(15, 41), S(62, 72), S(168, 177), S(276, 260)
129 // Assorted bonuses and penalties
130 constexpr Score BishopPawns = S( 3, 7);
131 constexpr Score BishopOnKingRing = S( 24, 0);
132 constexpr Score BishopXRayPawns = S( 4, 5);
133 constexpr Score CorneredBishop = S( 50, 50);
134 constexpr Score FlankAttacks = S( 8, 0);
135 constexpr Score Hanging = S( 69, 36);
136 constexpr Score BishopKingProtector = S( 6, 9);
137 constexpr Score KnightKingProtector = S( 8, 9);
138 constexpr Score KnightOnQueen = S( 16, 11);
139 constexpr Score LongDiagonalBishop = S( 45, 0);
140 constexpr Score MinorBehindPawn = S( 18, 3);
141 constexpr Score KnightOutpost = S( 56, 36);
142 constexpr Score BishopOutpost = S( 30, 23);
143 constexpr Score ReachableOutpost = S( 31, 22);
144 constexpr Score PassedFile = S( 11, 8);
145 constexpr Score PawnlessFlank = S( 17, 95);
146 constexpr Score QueenInfiltration = S( -2, 14);
147 constexpr Score RestrictedPiece = S( 7, 7);
148 constexpr Score RookOnKingRing = S( 16, 0);
149 constexpr Score RookOnQueenFile = S( 6, 11);
150 constexpr Score SliderOnQueen = S( 60, 18);
151 constexpr Score ThreatByKing = S( 24, 89);
152 constexpr Score ThreatByPawnPush = S( 48, 39);
153 constexpr Score ThreatBySafePawn = S(173, 94);
154 constexpr Score TrappedRook = S( 55, 13);
155 constexpr Score WeakQueen = S( 56, 15);
156 constexpr Score WeakQueenProtection = S( 14, 0);
160 // Evaluation class computes and stores attacks tables and other working data
165 Evaluation() = delete;
166 explicit Evaluation(const Position& p) : pos(p) {}
167 Evaluation& operator=(const Evaluation&) = delete;
171 template<Color Us> void initialize();
172 template<Color Us, PieceType Pt> Score pieces();
173 template<Color Us> Score king() const;
174 template<Color Us> Score threats() const;
175 template<Color Us> Score passed() const;
176 template<Color Us> Score space() const;
177 Value winnable(Score score) const;
182 Bitboard mobilityArea[COLOR_NB];
183 Score mobility[COLOR_NB] = { SCORE_ZERO, SCORE_ZERO };
185 // attackedBy[color][piece type] is a bitboard representing all squares
186 // attacked by a given color and piece type. Special "piece types" which
187 // is also calculated is ALL_PIECES.
188 Bitboard attackedBy[COLOR_NB][PIECE_TYPE_NB];
190 // attackedBy2[color] are the squares attacked by at least 2 units of a given
191 // color, including x-rays. But diagonal x-rays through pawns are not computed.
192 Bitboard attackedBy2[COLOR_NB];
194 // kingRing[color] are the squares adjacent to the king plus some other
195 // very near squares, depending on king position.
196 Bitboard kingRing[COLOR_NB];
198 // kingAttackersCount[color] is the number of pieces of the given color
199 // which attack a square in the kingRing of the enemy king.
200 int kingAttackersCount[COLOR_NB];
202 // kingAttackersWeight[color] is the sum of the "weights" of the pieces of
203 // the given color which attack a square in the kingRing of the enemy king.
204 // The weights of the individual piece types are given by the elements in
205 // the KingAttackWeights array.
206 int kingAttackersWeight[COLOR_NB];
208 // kingAttacksCount[color] is the number of attacks by the given color to
209 // squares directly adjacent to the enemy king. Pieces which attack more
210 // than one square are counted multiple times. For instance, if there is
211 // a white knight on g5 and black's king is on g8, this white knight adds 2
212 // to kingAttacksCount[WHITE].
213 int kingAttacksCount[COLOR_NB];
217 // Evaluation::initialize() computes king and pawn attacks, and the king ring
218 // bitboard for a given color. This is done at the beginning of the evaluation.
219 template<Tracing T> template<Color Us>
220 void Evaluation<T>::initialize() {
222 constexpr Color Them = ~Us;
223 constexpr Direction Up = pawn_push(Us);
224 constexpr Direction Down = -Up;
225 constexpr Bitboard LowRanks = (Us == WHITE ? Rank2BB | Rank3BB : Rank7BB | Rank6BB);
227 const Square ksq = pos.square<KING>(Us);
229 Bitboard dblAttackByPawn = pawn_double_attacks_bb<Us>(pos.pieces(Us, PAWN));
231 // Find our pawns that are blocked or on the first two ranks
232 Bitboard b = pos.pieces(Us, PAWN) & (shift<Down>(pos.pieces()) | LowRanks);
234 // Squares occupied by those pawns, by our king or queen, by blockers to attacks on our king
235 // or controlled by enemy pawns are excluded from the mobility area.
236 mobilityArea[Us] = ~(b | pos.pieces(Us, KING, QUEEN) | pos.blockers_for_king(Us) | pe->pawn_attacks(Them));
238 // Initialize attackedBy[] for king and pawns
239 attackedBy[Us][KING] = attacks_bb<KING>(ksq);
240 attackedBy[Us][PAWN] = pe->pawn_attacks(Us);
241 attackedBy[Us][ALL_PIECES] = attackedBy[Us][KING] | attackedBy[Us][PAWN];
242 attackedBy2[Us] = dblAttackByPawn | (attackedBy[Us][KING] & attackedBy[Us][PAWN]);
244 // Init our king safety tables
245 Square s = make_square(Utility::clamp(file_of(ksq), FILE_B, FILE_G),
246 Utility::clamp(rank_of(ksq), RANK_2, RANK_7));
247 kingRing[Us] = attacks_bb<KING>(s) | s;
249 kingAttackersCount[Them] = popcount(kingRing[Us] & pe->pawn_attacks(Them));
250 kingAttacksCount[Them] = kingAttackersWeight[Them] = 0;
252 // Remove from kingRing[] the squares defended by two pawns
253 kingRing[Us] &= ~dblAttackByPawn;
257 // Evaluation::pieces() scores pieces of a given color and type
258 template<Tracing T> template<Color Us, PieceType Pt>
259 Score Evaluation<T>::pieces() {
261 constexpr Color Them = ~Us;
262 constexpr Direction Down = -pawn_push(Us);
263 constexpr Bitboard OutpostRanks = (Us == WHITE ? Rank4BB | Rank5BB | Rank6BB
264 : Rank5BB | Rank4BB | Rank3BB);
265 const Square* pl = pos.squares<Pt>(Us);
268 Score score = SCORE_ZERO;
270 attackedBy[Us][Pt] = 0;
272 for (Square s = *pl; s != SQ_NONE; s = *++pl)
274 // Find attacked squares, including x-ray attacks for bishops and rooks
275 b = Pt == BISHOP ? attacks_bb<BISHOP>(s, pos.pieces() ^ pos.pieces(QUEEN))
276 : Pt == ROOK ? attacks_bb< ROOK>(s, pos.pieces() ^ pos.pieces(QUEEN) ^ pos.pieces(Us, ROOK))
277 : attacks_bb<Pt>(s, pos.pieces());
279 if (pos.blockers_for_king(Us) & s)
280 b &= line_bb(pos.square<KING>(Us), s);
282 attackedBy2[Us] |= attackedBy[Us][ALL_PIECES] & b;
283 attackedBy[Us][Pt] |= b;
284 attackedBy[Us][ALL_PIECES] |= b;
286 if (b & kingRing[Them])
288 kingAttackersCount[Us]++;
289 kingAttackersWeight[Us] += KingAttackWeights[Pt];
290 kingAttacksCount[Us] += popcount(b & attackedBy[Them][KING]);
293 else if (Pt == ROOK && (file_bb(s) & kingRing[Them]))
294 score += RookOnKingRing;
296 else if (Pt == BISHOP && (attacks_bb<BISHOP>(s, pos.pieces(PAWN)) & kingRing[Them]))
297 score += BishopOnKingRing;
299 int mob = popcount(b & mobilityArea[Us]);
301 mobility[Us] += MobilityBonus[Pt - 2][mob];
303 if (Pt == BISHOP || Pt == KNIGHT)
305 // Bonus if piece is on an outpost square or can reach one
306 bb = OutpostRanks & attackedBy[Us][PAWN] & ~pe->pawn_attacks_span(Them);
308 score += (Pt == KNIGHT) ? KnightOutpost : BishopOutpost;
309 else if (Pt == KNIGHT && bb & b & ~pos.pieces(Us))
310 score += ReachableOutpost;
312 // Bonus for a knight or bishop shielded by pawn
313 if (shift<Down>(pos.pieces(PAWN)) & s)
314 score += MinorBehindPawn;
316 // Penalty if the piece is far from the king
317 score -= (Pt == KNIGHT ? KnightKingProtector
318 : BishopKingProtector) * distance(pos.square<KING>(Us), s);
322 // Penalty according to the number of our pawns on the same color square as the
323 // bishop, bigger when the center files are blocked with pawns and smaller
324 // when the bishop is outside the pawn chain.
325 Bitboard blocked = pos.pieces(Us, PAWN) & shift<Down>(pos.pieces());
327 score -= BishopPawns * pos.pawns_on_same_color_squares(Us, s)
328 * (!(attackedBy[Us][PAWN] & s) + popcount(blocked & CenterFiles));
330 // Penalty for all enemy pawns x-rayed
331 score -= BishopXRayPawns * popcount(attacks_bb<BISHOP>(s) & pos.pieces(Them, PAWN));
333 // Bonus for bishop on a long diagonal which can "see" both center squares
334 if (more_than_one(attacks_bb<BISHOP>(s, pos.pieces(PAWN)) & Center))
335 score += LongDiagonalBishop;
337 // An important Chess960 pattern: a cornered bishop blocked by a friendly
338 // pawn diagonally in front of it is a very serious problem, especially
339 // when that pawn is also blocked.
340 if ( pos.is_chess960()
341 && (s == relative_square(Us, SQ_A1) || s == relative_square(Us, SQ_H1)))
343 Direction d = pawn_push(Us) + (file_of(s) == FILE_A ? EAST : WEST);
344 if (pos.piece_on(s + d) == make_piece(Us, PAWN))
345 score -= !pos.empty(s + d + pawn_push(Us)) ? CorneredBishop * 4
346 : pos.piece_on(s + d + d) == make_piece(Us, PAWN) ? CorneredBishop * 2
354 // Bonus for rook on the same file as a queen
355 if (file_bb(s) & pos.pieces(QUEEN))
356 score += RookOnQueenFile;
358 // Bonus for rook on an open or semi-open file
359 if (pos.is_on_semiopen_file(Us, s))
360 score += RookOnFile[pos.is_on_semiopen_file(Them, s)];
362 // Penalty when trapped by the king, even more if the king cannot castle
365 File kf = file_of(pos.square<KING>(Us));
366 if ((kf < FILE_E) == (file_of(s) < kf))
367 score -= TrappedRook * (1 + !pos.castling_rights(Us));
373 // Penalty if any relative pin or discovered attack against the queen
374 Bitboard queenPinners;
375 if (pos.slider_blockers(pos.pieces(Them, ROOK, BISHOP), s, queenPinners))
378 // Bonus for queen on weak square in enemy camp
379 if (relative_rank(Us, s) > RANK_4 && (~pe->pawn_attacks_span(Them) & s))
380 score += QueenInfiltration;
384 Trace::add(Pt, Us, score);
390 // Evaluation::king() assigns bonuses and penalties to a king of a given color
391 template<Tracing T> template<Color Us>
392 Score Evaluation<T>::king() const {
394 constexpr Color Them = ~Us;
395 constexpr Bitboard Camp = (Us == WHITE ? AllSquares ^ Rank6BB ^ Rank7BB ^ Rank8BB
396 : AllSquares ^ Rank1BB ^ Rank2BB ^ Rank3BB);
398 Bitboard weak, b1, b2, b3, safe, unsafeChecks = 0;
399 Bitboard rookChecks, queenChecks, bishopChecks, knightChecks;
401 const Square ksq = pos.square<KING>(Us);
403 // Init the score with king shelter and enemy pawns storm
404 Score score = pe->king_safety<Us>(pos);
406 // Attacked squares defended at most once by our queen or king
407 weak = attackedBy[Them][ALL_PIECES]
409 & (~attackedBy[Us][ALL_PIECES] | attackedBy[Us][KING] | attackedBy[Us][QUEEN]);
411 // Analyse the safe enemy's checks which are possible on next move
412 safe = ~pos.pieces(Them);
413 safe &= ~attackedBy[Us][ALL_PIECES] | (weak & attackedBy2[Them]);
415 b1 = attacks_bb<ROOK >(ksq, pos.pieces() ^ pos.pieces(Us, QUEEN));
416 b2 = attacks_bb<BISHOP>(ksq, pos.pieces() ^ pos.pieces(Us, QUEEN));
418 // Enemy rooks checks
419 rookChecks = b1 & safe & attackedBy[Them][ROOK];
421 kingDanger += more_than_one(rookChecks) ? RookSafeCheck * 175/100
424 unsafeChecks |= b1 & attackedBy[Them][ROOK];
426 // Enemy queen safe checks: we count them only if they are from squares from
427 // which we can't give a rook check, because rook checks are more valuable.
428 queenChecks = (b1 | b2)
429 & attackedBy[Them][QUEEN]
431 & ~attackedBy[Us][QUEEN]
434 kingDanger += more_than_one(queenChecks) ? QueenSafeCheck * 145/100
437 // Enemy bishops checks: we count them only if they are from squares from
438 // which we can't give a queen check, because queen checks are more valuable.
440 & attackedBy[Them][BISHOP]
444 kingDanger += more_than_one(bishopChecks) ? BishopSafeCheck * 3/2
447 unsafeChecks |= b2 & attackedBy[Them][BISHOP];
449 // Enemy knights checks
450 knightChecks = attacks_bb<KNIGHT>(ksq) & attackedBy[Them][KNIGHT];
451 if (knightChecks & safe)
452 kingDanger += more_than_one(knightChecks & safe) ? KnightSafeCheck * 162/100
455 unsafeChecks |= knightChecks;
457 // Find the squares that opponent attacks in our king flank, the squares
458 // which they attack twice in that flank, and the squares that we defend.
459 b1 = attackedBy[Them][ALL_PIECES] & KingFlank[file_of(ksq)] & Camp;
460 b2 = b1 & attackedBy2[Them];
461 b3 = attackedBy[Us][ALL_PIECES] & KingFlank[file_of(ksq)] & Camp;
463 int kingFlankAttack = popcount(b1) + popcount(b2);
464 int kingFlankDefense = popcount(b3);
466 kingDanger += kingAttackersCount[Them] * kingAttackersWeight[Them]
467 + 185 * popcount(kingRing[Us] & weak)
468 + 148 * popcount(unsafeChecks)
469 + 98 * popcount(pos.blockers_for_king(Us))
470 + 69 * kingAttacksCount[Them]
471 + 3 * kingFlankAttack * kingFlankAttack / 8
472 + mg_value(mobility[Them] - mobility[Us])
473 - 873 * !pos.count<QUEEN>(Them)
474 - 100 * bool(attackedBy[Us][KNIGHT] & attackedBy[Us][KING])
475 - 6 * mg_value(score) / 8
476 - 4 * kingFlankDefense
479 // Transform the kingDanger units into a Score, and subtract it from the evaluation
480 if (kingDanger > 100)
481 score -= make_score(kingDanger * kingDanger / 4096, kingDanger / 16);
483 // Penalty when our king is on a pawnless flank
484 if (!(pos.pieces(PAWN) & KingFlank[file_of(ksq)]))
485 score -= PawnlessFlank;
487 // Penalty if king flank is under attack, potentially moving toward the king
488 score -= FlankAttacks * kingFlankAttack;
491 Trace::add(KING, Us, score);
497 // Evaluation::threats() assigns bonuses according to the types of the
498 // attacking and the attacked pieces.
499 template<Tracing T> template<Color Us>
500 Score Evaluation<T>::threats() const {
502 constexpr Color Them = ~Us;
503 constexpr Direction Up = pawn_push(Us);
504 constexpr Bitboard TRank3BB = (Us == WHITE ? Rank3BB : Rank6BB);
506 Bitboard b, weak, defended, nonPawnEnemies, stronglyProtected, safe;
507 Score score = SCORE_ZERO;
510 nonPawnEnemies = pos.pieces(Them) & ~pos.pieces(PAWN);
512 // Squares strongly protected by the enemy, either because they defend the
513 // square with a pawn, or because they defend the square twice and we don't.
514 stronglyProtected = attackedBy[Them][PAWN]
515 | (attackedBy2[Them] & ~attackedBy2[Us]);
517 // Non-pawn enemies, strongly protected
518 defended = nonPawnEnemies & stronglyProtected;
520 // Enemies not strongly protected and under our attack
521 weak = pos.pieces(Them) & ~stronglyProtected & attackedBy[Us][ALL_PIECES];
523 // Bonus according to the kind of attacking pieces
526 b = (defended | weak) & (attackedBy[Us][KNIGHT] | attackedBy[Us][BISHOP]);
528 score += ThreatByMinor[type_of(pos.piece_on(pop_lsb(&b)))];
530 b = weak & attackedBy[Us][ROOK];
532 score += ThreatByRook[type_of(pos.piece_on(pop_lsb(&b)))];
534 if (weak & attackedBy[Us][KING])
535 score += ThreatByKing;
537 b = ~attackedBy[Them][ALL_PIECES]
538 | (nonPawnEnemies & attackedBy2[Us]);
539 score += Hanging * popcount(weak & b);
541 // Additional bonus if weak piece is only protected by a queen
542 score += WeakQueenProtection * popcount(weak & attackedBy[Them][QUEEN]);
545 // Bonus for restricting their piece moves
546 b = attackedBy[Them][ALL_PIECES]
548 & attackedBy[Us][ALL_PIECES];
549 score += RestrictedPiece * popcount(b);
551 // Protected or unattacked squares
552 safe = ~attackedBy[Them][ALL_PIECES] | attackedBy[Us][ALL_PIECES];
554 // Bonus for attacking enemy pieces with our relatively safe pawns
555 b = pos.pieces(Us, PAWN) & safe;
556 b = pawn_attacks_bb<Us>(b) & nonPawnEnemies;
557 score += ThreatBySafePawn * popcount(b);
559 // Find squares where our pawns can push on the next move
560 b = shift<Up>(pos.pieces(Us, PAWN)) & ~pos.pieces();
561 b |= shift<Up>(b & TRank3BB) & ~pos.pieces();
563 // Keep only the squares which are relatively safe
564 b &= ~attackedBy[Them][PAWN] & safe;
566 // Bonus for safe pawn threats on the next move
567 b = pawn_attacks_bb<Us>(b) & nonPawnEnemies;
568 score += ThreatByPawnPush * popcount(b);
570 // Bonus for threats on the next moves against enemy queen
571 if (pos.count<QUEEN>(Them) == 1)
573 Square s = pos.square<QUEEN>(Them);
574 safe = mobilityArea[Us] & ~stronglyProtected;
576 b = attackedBy[Us][KNIGHT] & attacks_bb<KNIGHT>(s);
578 score += KnightOnQueen * popcount(b & safe);
580 b = (attackedBy[Us][BISHOP] & attacks_bb<BISHOP>(s, pos.pieces()))
581 | (attackedBy[Us][ROOK ] & attacks_bb<ROOK >(s, pos.pieces()));
583 score += SliderOnQueen * popcount(b & safe & attackedBy2[Us]);
587 Trace::add(THREAT, Us, score);
592 // Evaluation::passed() evaluates the passed pawns and candidate passed
593 // pawns of the given color.
595 template<Tracing T> template<Color Us>
596 Score Evaluation<T>::passed() const {
598 constexpr Color Them = ~Us;
599 constexpr Direction Up = pawn_push(Us);
600 constexpr Direction Down = -Up;
602 auto king_proximity = [&](Color c, Square s) {
603 return std::min(distance(pos.square<KING>(c), s), 5);
606 Bitboard b, bb, squaresToQueen, unsafeSquares, blockedPassers, helpers;
607 Score score = SCORE_ZERO;
609 b = pe->passed_pawns(Us);
611 blockedPassers = b & shift<Down>(pos.pieces(Them, PAWN));
614 helpers = shift<Up>(pos.pieces(Us, PAWN))
616 & (~attackedBy2[Them] | attackedBy[Us][ALL_PIECES]);
618 // Remove blocked candidate passers that don't have help to pass
620 | shift<WEST>(helpers)
621 | shift<EAST>(helpers);
626 Square s = pop_lsb(&b);
628 assert(!(pos.pieces(Them, PAWN) & forward_file_bb(Us, s + Up)));
630 int r = relative_rank(Us, s);
632 Score bonus = PassedRank[r];
637 Square blockSq = s + Up;
639 // Adjust bonus based on the king's proximity
640 bonus += make_score(0, ( (king_proximity(Them, blockSq) * 19) / 4
641 - king_proximity(Us, blockSq) * 2) * w);
643 // If blockSq is not the queening square then consider also a second push
645 bonus -= make_score(0, king_proximity(Us, blockSq + Up) * w);
647 // If the pawn is free to advance, then increase the bonus
648 if (pos.empty(blockSq))
650 squaresToQueen = forward_file_bb(Us, s);
651 unsafeSquares = passed_pawn_span(Us, s);
653 bb = forward_file_bb(Them, s) & pos.pieces(ROOK, QUEEN);
655 if (!(pos.pieces(Them) & bb))
656 unsafeSquares &= attackedBy[Them][ALL_PIECES];
658 // If there are no enemy attacks on passed pawn span, assign a big bonus.
659 // Otherwise assign a smaller bonus if the path to queen is not attacked
660 // and even smaller bonus if it is attacked but block square is not.
661 int k = !unsafeSquares ? 35 :
662 !(unsafeSquares & squaresToQueen) ? 20 :
663 !(unsafeSquares & blockSq) ? 9 :
666 // Assign a larger bonus if the block square is defended
667 if ((pos.pieces(Us) & bb) || (attackedBy[Us][ALL_PIECES] & blockSq))
670 bonus += make_score(k * w, k * w);
674 score += bonus - PassedFile * edge_distance(file_of(s));
678 Trace::add(PASSED, Us, score);
684 // Evaluation::space() computes a space evaluation for a given side, aiming to improve game
685 // play in the opening. It is based on the number of safe squares on the 4 central files
686 // on ranks 2 to 4. Completely safe squares behind a friendly pawn are counted twice.
687 // Finally, the space bonus is multiplied by a weight which decreases according to occupancy.
689 template<Tracing T> template<Color Us>
690 Score Evaluation<T>::space() const {
692 // Early exit if, for example, both queens or 6 minor pieces have been exchanged
693 if (pos.non_pawn_material() < SpaceThreshold)
696 constexpr Color Them = ~Us;
697 constexpr Direction Down = -pawn_push(Us);
698 constexpr Bitboard SpaceMask =
699 Us == WHITE ? CenterFiles & (Rank2BB | Rank3BB | Rank4BB)
700 : CenterFiles & (Rank7BB | Rank6BB | Rank5BB);
702 // Find the available squares for our pieces inside the area defined by SpaceMask
703 Bitboard safe = SpaceMask
704 & ~pos.pieces(Us, PAWN)
705 & ~attackedBy[Them][PAWN];
707 // Find all squares which are at most three squares behind some friendly pawn
708 Bitboard behind = pos.pieces(Us, PAWN);
709 behind |= shift<Down>(behind);
710 behind |= shift<Down+Down>(behind);
712 int bonus = popcount(safe) + popcount(behind & safe & ~attackedBy[Them][ALL_PIECES]);
713 int weight = pos.count<ALL_PIECES>(Us) - 3 + std::min(pe->blocked_count(), 9);
714 Score score = make_score(bonus * weight * weight / 16, 0);
717 Trace::add(SPACE, Us, score);
723 // Evaluation::winnable() adjusts the mg and eg score components based on the
724 // known attacking/defending status of the players.
725 // A single value is derived from the mg and eg values and returned.
728 Value Evaluation<T>::winnable(Score score) const {
730 int outflanking = distance<File>(pos.square<KING>(WHITE), pos.square<KING>(BLACK))
731 - distance<Rank>(pos.square<KING>(WHITE), pos.square<KING>(BLACK));
733 bool pawnsOnBothFlanks = (pos.pieces(PAWN) & QueenSide)
734 && (pos.pieces(PAWN) & KingSide);
736 bool almostUnwinnable = outflanking < 0
737 && !pawnsOnBothFlanks;
739 bool infiltration = rank_of(pos.square<KING>(WHITE)) > RANK_4
740 || rank_of(pos.square<KING>(BLACK)) < RANK_5;
742 // Compute the initiative bonus for the attacking side
743 int complexity = 9 * pe->passed_count()
744 + 12 * pos.count<PAWN>()
746 + 21 * pawnsOnBothFlanks
748 + 51 * !pos.non_pawn_material()
749 - 43 * almostUnwinnable
752 Value mg = mg_value(score);
753 Value eg = eg_value(score);
755 // Now apply the bonus: note that we find the attacking side by extracting the
756 // sign of the midgame or endgame values, and that we carefully cap the bonus
757 // so that the midgame and endgame scores do not change sign after the bonus.
758 int u = ((mg > 0) - (mg < 0)) * Utility::clamp(complexity + 50, -abs(mg), 0);
759 int v = ((eg > 0) - (eg < 0)) * std::max(complexity, -abs(eg));
764 // Compute the scale factor for the winning side
766 Color strongSide = eg > VALUE_DRAW ? WHITE : BLACK;
767 int sf = me->scale_factor(pos, strongSide);
769 // If scale is not already specific, scale down the endgame via general heuristics
770 if (sf == SCALE_FACTOR_NORMAL)
772 if (pos.opposite_bishops())
774 if ( pos.non_pawn_material(WHITE) == BishopValueMg
775 && pos.non_pawn_material(BLACK) == BishopValueMg)
776 sf = 18 + 4 * popcount(pe->passed_pawns(strongSide));
778 sf = 22 + 3 * pos.count<ALL_PIECES>(strongSide);
781 sf = std::min(sf, 36 + 7 * pos.count<PAWN>(strongSide));
784 // Interpolate between the middlegame and (scaled by 'sf') endgame score
785 v = mg * int(me->game_phase())
786 + eg * int(PHASE_MIDGAME - me->game_phase()) * ScaleFactor(sf) / SCALE_FACTOR_NORMAL;
791 Trace::add(WINNABLE, make_score(u, eg * ScaleFactor(sf) / SCALE_FACTOR_NORMAL - eg_value(score)));
792 Trace::add(TOTAL, make_score(mg, eg * ScaleFactor(sf) / SCALE_FACTOR_NORMAL));
799 // Evaluation::value() is the main function of the class. It computes the various
800 // parts of the evaluation and returns the value of the position from the point
801 // of view of the side to move.
804 Value Evaluation<T>::value() {
806 assert(!pos.checkers());
808 // Probe the material hash table
809 me = Material::probe(pos);
811 // If we have a specialized evaluation function for the current material
812 // configuration, call it and return.
813 if (me->specialized_eval_exists())
814 return me->evaluate(pos);
816 // Initialize score by reading the incrementally updated scores included in
817 // the position object (material + piece square tables) and the material
818 // imbalance. Score is computed internally from the white point of view.
819 Score score = pos.psq_score() + me->imbalance() + pos.this_thread()->contempt;
821 // Probe the pawn hash table
822 pe = Pawns::probe(pos);
823 score += pe->pawn_score(WHITE) - pe->pawn_score(BLACK);
825 // Early exit if score is high
826 Value v = (mg_value(score) + eg_value(score)) / 2;
827 if (abs(v) > LazyThreshold + pos.non_pawn_material() / 64)
828 return pos.side_to_move() == WHITE ? v : -v;
830 // Main evaluation begins here
835 // Pieces evaluated first (also populates attackedBy, attackedBy2).
836 // Note that the order of evaluation of the terms is left unspecified
837 score += pieces<WHITE, KNIGHT>() - pieces<BLACK, KNIGHT>()
838 + pieces<WHITE, BISHOP>() - pieces<BLACK, BISHOP>()
839 + pieces<WHITE, ROOK >() - pieces<BLACK, ROOK >()
840 + pieces<WHITE, QUEEN >() - pieces<BLACK, QUEEN >();
842 score += mobility[WHITE] - mobility[BLACK];
844 // More complex interactions that require fully populated attack bitboards
845 score += king< WHITE>() - king< BLACK>()
846 + threats<WHITE>() - threats<BLACK>()
847 + passed< WHITE>() - passed< BLACK>()
848 + space< WHITE>() - space< BLACK>();
850 // Derive single value from mg and eg parts of score
853 // In case of tracing add all remaining individual evaluation terms
856 Trace::add(MATERIAL, pos.psq_score());
857 Trace::add(IMBALANCE, me->imbalance());
858 Trace::add(PAWN, pe->pawn_score(WHITE), pe->pawn_score(BLACK));
859 Trace::add(MOBILITY, mobility[WHITE], mobility[BLACK]);
865 // Side to move point of view
866 v = (pos.side_to_move() == WHITE ? v : -v) + Tempo;
868 // Damp down the evaluation linearly when shuffling
869 v = v * (100 - pos.rule50_count()) / 100;
877 /// evaluate() is the evaluator for the outer world. It returns a static
878 /// evaluation of the position from the point of view of the side to move.
880 Value Eval::evaluate(const Position& pos) {
881 return Evaluation<NO_TRACE>(pos).value();
885 /// trace() is like evaluate(), but instead of returning a value, it returns
886 /// a string (suitable for outputting to stdout) that contains the detailed
887 /// descriptions and values of each evaluation term. Useful for debugging.
889 std::string Eval::trace(const Position& pos) {
892 return "Total evaluation: none (in check)";
894 std::memset(scores, 0, sizeof(scores));
896 pos.this_thread()->contempt = SCORE_ZERO; // Reset any dynamic contempt
898 Value v = Evaluation<TRACE>(pos).value();
900 v = pos.side_to_move() == WHITE ? v : -v; // Trace scores are from white's point of view
902 std::stringstream ss;
903 ss << std::showpoint << std::noshowpos << std::fixed << std::setprecision(2)
904 << " Term | White | Black | Total \n"
905 << " | MG EG | MG EG | MG EG \n"
906 << " ------------+-------------+-------------+------------\n"
907 << " Material | " << Term(MATERIAL)
908 << " Imbalance | " << Term(IMBALANCE)
909 << " Pawns | " << Term(PAWN)
910 << " Knights | " << Term(KNIGHT)
911 << " Bishops | " << Term(BISHOP)
912 << " Rooks | " << Term(ROOK)
913 << " Queens | " << Term(QUEEN)
914 << " Mobility | " << Term(MOBILITY)
915 << " King safety | " << Term(KING)
916 << " Threats | " << Term(THREAT)
917 << " Passed | " << Term(PASSED)
918 << " Space | " << Term(SPACE)
919 << " Winnable | " << Term(WINNABLE)
920 << " ------------+-------------+-------------+------------\n"
921 << " Total | " << Term(TOTAL);
923 ss << "\nFinal evaluation: " << to_cp(v) << " (white side)\n";