2 Stockfish, a UCI chess playing engine derived from Glaurung 2.1
3 Copyright (C) 2004-2020 The Stockfish developers (see AUTHORS file)
5 Stockfish is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
10 Stockfish is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include <cstring> // For std::memset
37 std::string eval_file_loaded="None";
41 useNNUE = Options["Use NNUE"];
42 std::string eval_file = std::string(Options["EvalFile"]);
43 if (useNNUE && eval_file_loaded != eval_file)
44 if (Eval::NNUE::load_eval_file(eval_file))
45 eval_file_loaded = eval_file;
50 std::string eval_file = std::string(Options["EvalFile"]);
51 if (useNNUE && eval_file_loaded != eval_file)
53 UCI::OptionsMap defaults;
56 std::cerr << "NNUE evaluation used, but the network file " << eval_file << " was not loaded successfully. "
57 << "These network evaluation parameters must be available, and compatible with this version of the code. "
58 << "The UCI option EvalFile might need to specify the full path, including the directory/folder name, to the file. "
59 << "The default net can be downloaded from: https://tests.stockfishchess.org/api/nn/"+std::string(defaults["EvalFile"]) << std::endl;
60 std::exit(EXIT_FAILURE);
64 sync_cout << "info string NNUE evaluation using " << eval_file << " enabled." << sync_endl;
66 sync_cout << "info string classical evaluation enabled." << sync_endl;
72 enum Tracing { NO_TRACE, TRACE };
74 enum Term { // The first 8 entries are reserved for PieceType
75 MATERIAL = 8, IMBALANCE, MOBILITY, THREAT, PASSED, SPACE, WINNABLE, TOTAL, TERM_NB
78 Score scores[TERM_NB][COLOR_NB];
80 double to_cp(Value v) { return double(v) / PawnValueEg; }
82 void add(int idx, Color c, Score s) {
86 void add(int idx, Score w, Score b = SCORE_ZERO) {
87 scores[idx][WHITE] = w;
88 scores[idx][BLACK] = b;
91 std::ostream& operator<<(std::ostream& os, Score s) {
92 os << std::setw(5) << to_cp(mg_value(s)) << " "
93 << std::setw(5) << to_cp(eg_value(s));
97 std::ostream& operator<<(std::ostream& os, Term t) {
99 if (t == MATERIAL || t == IMBALANCE || t == WINNABLE || t == TOTAL)
100 os << " ---- ----" << " | " << " ---- ----";
102 os << scores[t][WHITE] << " | " << scores[t][BLACK];
104 os << " | " << scores[t][WHITE] - scores[t][BLACK] << "\n";
109 using namespace Trace;
113 // Threshold for lazy and space evaluation
114 constexpr Value LazyThreshold1 = Value(1400);
115 constexpr Value LazyThreshold2 = Value(1300);
116 constexpr Value SpaceThreshold = Value(12222);
117 constexpr Value NNUEThreshold1 = Value(550);
118 constexpr Value NNUEThreshold2 = Value(150);
120 // KingAttackWeights[PieceType] contains king attack weights by piece type
121 constexpr int KingAttackWeights[PIECE_TYPE_NB] = { 0, 0, 81, 52, 44, 10 };
123 // SafeCheck[PieceType][single/multiple] contains safe check bonus by piece type,
124 // higher if multiple safe checks are possible for that piece type.
125 constexpr int SafeCheck[][2] = {
126 {}, {}, {792, 1283}, {645, 967}, {1084, 1897}, {772, 1119}
129 #define S(mg, eg) make_score(mg, eg)
131 // MobilityBonus[PieceType-2][attacked] contains bonuses for middle and end game,
132 // indexed by piece type and number of attacked squares in the mobility area.
133 constexpr Score MobilityBonus[][32] = {
134 { S(-62,-81), S(-53,-56), S(-12,-31), S( -4,-16), S( 3, 5), S( 13, 11), // Knight
135 S( 22, 17), S( 28, 20), S( 33, 25) },
136 { S(-48,-59), S(-20,-23), S( 16, -3), S( 26, 13), S( 38, 24), S( 51, 42), // Bishop
137 S( 55, 54), S( 63, 57), S( 63, 65), S( 68, 73), S( 81, 78), S( 81, 86),
138 S( 91, 88), S( 98, 97) },
139 { S(-60,-78), S(-20,-17), S( 2, 23), S( 3, 39), S( 3, 70), S( 11, 99), // Rook
140 S( 22,103), S( 31,121), S( 40,134), S( 40,139), S( 41,158), S( 48,164),
141 S( 57,168), S( 57,169), S( 62,172) },
142 { S(-30,-48), S(-12,-30), S( -8, -7), S( -9, 19), S( 20, 40), S( 23, 55), // Queen
143 S( 23, 59), S( 35, 75), S( 38, 78), S( 53, 96), S( 64, 96), S( 65,100),
144 S( 65,121), S( 66,127), S( 67,131), S( 67,133), S( 72,136), S( 72,141),
145 S( 77,147), S( 79,150), S( 93,151), S(108,168), S(108,168), S(108,171),
146 S(110,182), S(114,182), S(114,192), S(116,219) }
149 // KingProtector[knight/bishop] contains penalty for each distance unit to own king
150 constexpr Score KingProtector[] = { S(8, 9), S(6, 9) };
152 // Outpost[knight/bishop] contains bonuses for each knight or bishop occupying a
153 // pawn protected square on rank 4 to 6 which is also safe from a pawn attack.
154 constexpr Score Outpost[] = { S(56, 36), S(30, 23) };
156 // PassedRank[Rank] contains a bonus according to the rank of a passed pawn
157 constexpr Score PassedRank[RANK_NB] = {
158 S(0, 0), S(10, 28), S(17, 33), S(15, 41), S(62, 72), S(168, 177), S(276, 260)
161 // RookOnFile[semiopen/open] contains bonuses for each rook when there is
162 // no (friendly) pawn on the rook file.
163 constexpr Score RookOnFile[] = { S(19, 7), S(48, 29) };
165 // ThreatByMinor/ByRook[attacked PieceType] contains bonuses according to
166 // which piece type attacks which one. Attacks on lesser pieces which are
167 // pawn-defended are not considered.
168 constexpr Score ThreatByMinor[PIECE_TYPE_NB] = {
169 S(0, 0), S(5, 32), S(57, 41), S(77, 56), S(88, 119), S(79, 161)
172 constexpr Score ThreatByRook[PIECE_TYPE_NB] = {
173 S(0, 0), S(3, 46), S(37, 68), S(42, 60), S(0, 38), S(58, 41)
176 // Assorted bonuses and penalties
177 constexpr Score BadOutpost = S( -7, 36);
178 constexpr Score BishopOnKingRing = S( 24, 0);
179 constexpr Score BishopPawns = S( 3, 7);
180 constexpr Score BishopXRayPawns = S( 4, 5);
181 constexpr Score CorneredBishop = S( 50, 50);
182 constexpr Score FlankAttacks = S( 8, 0);
183 constexpr Score Hanging = S( 69, 36);
184 constexpr Score KnightOnQueen = S( 16, 11);
185 constexpr Score LongDiagonalBishop = S( 45, 0);
186 constexpr Score MinorBehindPawn = S( 18, 3);
187 constexpr Score PassedFile = S( 11, 8);
188 constexpr Score PawnlessFlank = S( 17, 95);
189 constexpr Score ReachableOutpost = S( 31, 22);
190 constexpr Score RestrictedPiece = S( 7, 7);
191 constexpr Score RookOnKingRing = S( 16, 0);
192 constexpr Score RookOnQueenFile = S( 6, 11);
193 constexpr Score SliderOnQueen = S( 60, 18);
194 constexpr Score ThreatByKing = S( 24, 89);
195 constexpr Score ThreatByPawnPush = S( 48, 39);
196 constexpr Score ThreatBySafePawn = S(173, 94);
197 constexpr Score TrappedRook = S( 55, 13);
198 constexpr Score WeakQueenProtection = S( 14, 0);
199 constexpr Score WeakQueen = S( 56, 15);
204 // Evaluation class computes and stores attacks tables and other working data
209 Evaluation() = delete;
210 explicit Evaluation(const Position& p) : pos(p) {}
211 Evaluation& operator=(const Evaluation&) = delete;
215 template<Color Us> void initialize();
216 template<Color Us, PieceType Pt> Score pieces();
217 template<Color Us> Score king() const;
218 template<Color Us> Score threats() const;
219 template<Color Us> Score passed() const;
220 template<Color Us> Score space() const;
221 Value winnable(Score score) const;
226 Bitboard mobilityArea[COLOR_NB];
227 Score mobility[COLOR_NB] = { SCORE_ZERO, SCORE_ZERO };
229 // attackedBy[color][piece type] is a bitboard representing all squares
230 // attacked by a given color and piece type. Special "piece types" which
231 // is also calculated is ALL_PIECES.
232 Bitboard attackedBy[COLOR_NB][PIECE_TYPE_NB];
234 // attackedBy2[color] are the squares attacked by at least 2 units of a given
235 // color, including x-rays. But diagonal x-rays through pawns are not computed.
236 Bitboard attackedBy2[COLOR_NB];
238 // kingRing[color] are the squares adjacent to the king plus some other
239 // very near squares, depending on king position.
240 Bitboard kingRing[COLOR_NB];
242 // kingAttackersCount[color] is the number of pieces of the given color
243 // which attack a square in the kingRing of the enemy king.
244 int kingAttackersCount[COLOR_NB];
246 // kingAttackersWeight[color] is the sum of the "weights" of the pieces of
247 // the given color which attack a square in the kingRing of the enemy king.
248 // The weights of the individual piece types are given by the elements in
249 // the KingAttackWeights array.
250 int kingAttackersWeight[COLOR_NB];
252 // kingAttacksCount[color] is the number of attacks by the given color to
253 // squares directly adjacent to the enemy king. Pieces which attack more
254 // than one square are counted multiple times. For instance, if there is
255 // a white knight on g5 and black's king is on g8, this white knight adds 2
256 // to kingAttacksCount[WHITE].
257 int kingAttacksCount[COLOR_NB];
261 // Evaluation::initialize() computes king and pawn attacks, and the king ring
262 // bitboard for a given color. This is done at the beginning of the evaluation.
264 template<Tracing T> template<Color Us>
265 void Evaluation<T>::initialize() {
267 constexpr Color Them = ~Us;
268 constexpr Direction Up = pawn_push(Us);
269 constexpr Direction Down = -Up;
270 constexpr Bitboard LowRanks = (Us == WHITE ? Rank2BB | Rank3BB : Rank7BB | Rank6BB);
272 const Square ksq = pos.square<KING>(Us);
274 Bitboard dblAttackByPawn = pawn_double_attacks_bb<Us>(pos.pieces(Us, PAWN));
276 // Find our pawns that are blocked or on the first two ranks
277 Bitboard b = pos.pieces(Us, PAWN) & (shift<Down>(pos.pieces()) | LowRanks);
279 // Squares occupied by those pawns, by our king or queen, by blockers to attacks on our king
280 // or controlled by enemy pawns are excluded from the mobility area.
281 mobilityArea[Us] = ~(b | pos.pieces(Us, KING, QUEEN) | pos.blockers_for_king(Us) | pe->pawn_attacks(Them));
283 // Initialize attackedBy[] for king and pawns
284 attackedBy[Us][KING] = attacks_bb<KING>(ksq);
285 attackedBy[Us][PAWN] = pe->pawn_attacks(Us);
286 attackedBy[Us][ALL_PIECES] = attackedBy[Us][KING] | attackedBy[Us][PAWN];
287 attackedBy2[Us] = dblAttackByPawn | (attackedBy[Us][KING] & attackedBy[Us][PAWN]);
289 // Init our king safety tables
290 Square s = make_square(Utility::clamp(file_of(ksq), FILE_B, FILE_G),
291 Utility::clamp(rank_of(ksq), RANK_2, RANK_7));
292 kingRing[Us] = attacks_bb<KING>(s) | s;
294 kingAttackersCount[Them] = popcount(kingRing[Us] & pe->pawn_attacks(Them));
295 kingAttacksCount[Them] = kingAttackersWeight[Them] = 0;
297 // Remove from kingRing[] the squares defended by two pawns
298 kingRing[Us] &= ~dblAttackByPawn;
302 // Evaluation::pieces() scores pieces of a given color and type
304 template<Tracing T> template<Color Us, PieceType Pt>
305 Score Evaluation<T>::pieces() {
307 constexpr Color Them = ~Us;
308 constexpr Direction Down = -pawn_push(Us);
309 constexpr Bitboard OutpostRanks = (Us == WHITE ? Rank4BB | Rank5BB | Rank6BB
310 : Rank5BB | Rank4BB | Rank3BB);
311 const Square* pl = pos.squares<Pt>(Us);
314 Score score = SCORE_ZERO;
316 attackedBy[Us][Pt] = 0;
318 for (Square s = *pl; s != SQ_NONE; s = *++pl)
320 // Find attacked squares, including x-ray attacks for bishops and rooks
321 b = Pt == BISHOP ? attacks_bb<BISHOP>(s, pos.pieces() ^ pos.pieces(QUEEN))
322 : Pt == ROOK ? attacks_bb< ROOK>(s, pos.pieces() ^ pos.pieces(QUEEN) ^ pos.pieces(Us, ROOK))
323 : attacks_bb<Pt>(s, pos.pieces());
325 if (pos.blockers_for_king(Us) & s)
326 b &= line_bb(pos.square<KING>(Us), s);
328 attackedBy2[Us] |= attackedBy[Us][ALL_PIECES] & b;
329 attackedBy[Us][Pt] |= b;
330 attackedBy[Us][ALL_PIECES] |= b;
332 if (b & kingRing[Them])
334 kingAttackersCount[Us]++;
335 kingAttackersWeight[Us] += KingAttackWeights[Pt];
336 kingAttacksCount[Us] += popcount(b & attackedBy[Them][KING]);
339 else if (Pt == ROOK && (file_bb(s) & kingRing[Them]))
340 score += RookOnKingRing;
342 else if (Pt == BISHOP && (attacks_bb<BISHOP>(s, pos.pieces(PAWN)) & kingRing[Them]))
343 score += BishopOnKingRing;
345 int mob = popcount(b & mobilityArea[Us]);
347 mobility[Us] += MobilityBonus[Pt - 2][mob];
349 if (Pt == BISHOP || Pt == KNIGHT)
351 // Bonus if the piece is on an outpost square or can reach one
352 // Reduced bonus for knights (BadOutpost) if few relevant targets
353 bb = OutpostRanks & (attackedBy[Us][PAWN] | shift<Down>(pos.pieces(PAWN)))
354 & ~pe->pawn_attacks_span(Them);
355 Bitboard targets = pos.pieces(Them) & ~pos.pieces(PAWN);
358 && bb & s & ~CenterFiles // on a side outpost
359 && !(b & targets) // no relevant attacks
360 && (!more_than_one(targets & (s & QueenSide ? QueenSide : KingSide))))
363 score += Outpost[Pt == BISHOP];
364 else if (Pt == KNIGHT && bb & b & ~pos.pieces(Us))
365 score += ReachableOutpost;
367 // Bonus for a knight or bishop shielded by pawn
368 if (shift<Down>(pos.pieces(PAWN)) & s)
369 score += MinorBehindPawn;
371 // Penalty if the piece is far from the king
372 score -= KingProtector[Pt == BISHOP] * distance(pos.square<KING>(Us), s);
376 // Penalty according to the number of our pawns on the same color square as the
377 // bishop, bigger when the center files are blocked with pawns and smaller
378 // when the bishop is outside the pawn chain.
379 Bitboard blocked = pos.pieces(Us, PAWN) & shift<Down>(pos.pieces());
381 score -= BishopPawns * pos.pawns_on_same_color_squares(Us, s)
382 * (!(attackedBy[Us][PAWN] & s) + popcount(blocked & CenterFiles));
384 // Penalty for all enemy pawns x-rayed
385 score -= BishopXRayPawns * popcount(attacks_bb<BISHOP>(s) & pos.pieces(Them, PAWN));
387 // Bonus for bishop on a long diagonal which can "see" both center squares
388 if (more_than_one(attacks_bb<BISHOP>(s, pos.pieces(PAWN)) & Center))
389 score += LongDiagonalBishop;
391 // An important Chess960 pattern: a cornered bishop blocked by a friendly
392 // pawn diagonally in front of it is a very serious problem, especially
393 // when that pawn is also blocked.
394 if ( pos.is_chess960()
395 && (s == relative_square(Us, SQ_A1) || s == relative_square(Us, SQ_H1)))
397 Direction d = pawn_push(Us) + (file_of(s) == FILE_A ? EAST : WEST);
398 if (pos.piece_on(s + d) == make_piece(Us, PAWN))
399 score -= !pos.empty(s + d + pawn_push(Us)) ? CorneredBishop * 4
400 : pos.piece_on(s + d + d) == make_piece(Us, PAWN) ? CorneredBishop * 2
408 // Bonus for rook on the same file as a queen
409 if (file_bb(s) & pos.pieces(QUEEN))
410 score += RookOnQueenFile;
412 // Bonus for rook on an open or semi-open file
413 if (pos.is_on_semiopen_file(Us, s))
414 score += RookOnFile[pos.is_on_semiopen_file(Them, s)];
416 // Penalty when trapped by the king, even more if the king cannot castle
419 File kf = file_of(pos.square<KING>(Us));
420 if ((kf < FILE_E) == (file_of(s) < kf))
421 score -= TrappedRook * (1 + !pos.castling_rights(Us));
427 // Penalty if any relative pin or discovered attack against the queen
428 Bitboard queenPinners;
429 if (pos.slider_blockers(pos.pieces(Them, ROOK, BISHOP), s, queenPinners))
434 Trace::add(Pt, Us, score);
440 // Evaluation::king() assigns bonuses and penalties to a king of a given color
442 template<Tracing T> template<Color Us>
443 Score Evaluation<T>::king() const {
445 constexpr Color Them = ~Us;
446 constexpr Bitboard Camp = (Us == WHITE ? AllSquares ^ Rank6BB ^ Rank7BB ^ Rank8BB
447 : AllSquares ^ Rank1BB ^ Rank2BB ^ Rank3BB);
449 Bitboard weak, b1, b2, b3, safe, unsafeChecks = 0;
450 Bitboard rookChecks, queenChecks, bishopChecks, knightChecks;
452 const Square ksq = pos.square<KING>(Us);
454 // Init the score with king shelter and enemy pawns storm
455 Score score = pe->king_safety<Us>(pos);
457 // Attacked squares defended at most once by our queen or king
458 weak = attackedBy[Them][ALL_PIECES]
460 & (~attackedBy[Us][ALL_PIECES] | attackedBy[Us][KING] | attackedBy[Us][QUEEN]);
462 // Analyse the safe enemy's checks which are possible on next move
463 safe = ~pos.pieces(Them);
464 safe &= ~attackedBy[Us][ALL_PIECES] | (weak & attackedBy2[Them]);
466 b1 = attacks_bb<ROOK >(ksq, pos.pieces() ^ pos.pieces(Us, QUEEN));
467 b2 = attacks_bb<BISHOP>(ksq, pos.pieces() ^ pos.pieces(Us, QUEEN));
469 // Enemy rooks checks
470 rookChecks = b1 & attackedBy[Them][ROOK] & safe;
472 kingDanger += SafeCheck[ROOK][more_than_one(rookChecks)];
474 unsafeChecks |= b1 & attackedBy[Them][ROOK];
476 // Enemy queen safe checks: count them only if the checks are from squares from
477 // which opponent cannot give a rook check, because rook checks are more valuable.
478 queenChecks = (b1 | b2) & attackedBy[Them][QUEEN] & safe
479 & ~(attackedBy[Us][QUEEN] | rookChecks);
481 kingDanger += SafeCheck[QUEEN][more_than_one(queenChecks)];
483 // Enemy bishops checks: count them only if they are from squares from which
484 // opponent cannot give a queen check, because queen checks are more valuable.
485 bishopChecks = b2 & attackedBy[Them][BISHOP] & safe
488 kingDanger += SafeCheck[BISHOP][more_than_one(bishopChecks)];
491 unsafeChecks |= b2 & attackedBy[Them][BISHOP];
493 // Enemy knights checks
494 knightChecks = attacks_bb<KNIGHT>(ksq) & attackedBy[Them][KNIGHT];
495 if (knightChecks & safe)
496 kingDanger += SafeCheck[KNIGHT][more_than_one(knightChecks & safe)];
498 unsafeChecks |= knightChecks;
500 // Find the squares that opponent attacks in our king flank, the squares
501 // which they attack twice in that flank, and the squares that we defend.
502 b1 = attackedBy[Them][ALL_PIECES] & KingFlank[file_of(ksq)] & Camp;
503 b2 = b1 & attackedBy2[Them];
504 b3 = attackedBy[Us][ALL_PIECES] & KingFlank[file_of(ksq)] & Camp;
506 int kingFlankAttack = popcount(b1) + popcount(b2);
507 int kingFlankDefense = popcount(b3);
509 kingDanger += kingAttackersCount[Them] * kingAttackersWeight[Them]
510 + 185 * popcount(kingRing[Us] & weak)
511 + 148 * popcount(unsafeChecks)
512 + 98 * popcount(pos.blockers_for_king(Us))
513 + 69 * kingAttacksCount[Them]
514 + 3 * kingFlankAttack * kingFlankAttack / 8
515 + mg_value(mobility[Them] - mobility[Us])
516 - 873 * !pos.count<QUEEN>(Them)
517 - 100 * bool(attackedBy[Us][KNIGHT] & attackedBy[Us][KING])
518 - 6 * mg_value(score) / 8
519 - 4 * kingFlankDefense
522 // Transform the kingDanger units into a Score, and subtract it from the evaluation
523 if (kingDanger > 100)
524 score -= make_score(kingDanger * kingDanger / 4096, kingDanger / 16);
526 // Penalty when our king is on a pawnless flank
527 if (!(pos.pieces(PAWN) & KingFlank[file_of(ksq)]))
528 score -= PawnlessFlank;
530 // Penalty if king flank is under attack, potentially moving toward the king
531 score -= FlankAttacks * kingFlankAttack;
534 Trace::add(KING, Us, score);
540 // Evaluation::threats() assigns bonuses according to the types of the
541 // attacking and the attacked pieces.
543 template<Tracing T> template<Color Us>
544 Score Evaluation<T>::threats() const {
546 constexpr Color Them = ~Us;
547 constexpr Direction Up = pawn_push(Us);
548 constexpr Bitboard TRank3BB = (Us == WHITE ? Rank3BB : Rank6BB);
550 Bitboard b, weak, defended, nonPawnEnemies, stronglyProtected, safe;
551 Score score = SCORE_ZERO;
554 nonPawnEnemies = pos.pieces(Them) & ~pos.pieces(PAWN);
556 // Squares strongly protected by the enemy, either because they defend the
557 // square with a pawn, or because they defend the square twice and we don't.
558 stronglyProtected = attackedBy[Them][PAWN]
559 | (attackedBy2[Them] & ~attackedBy2[Us]);
561 // Non-pawn enemies, strongly protected
562 defended = nonPawnEnemies & stronglyProtected;
564 // Enemies not strongly protected and under our attack
565 weak = pos.pieces(Them) & ~stronglyProtected & attackedBy[Us][ALL_PIECES];
567 // Bonus according to the kind of attacking pieces
570 b = (defended | weak) & (attackedBy[Us][KNIGHT] | attackedBy[Us][BISHOP]);
572 score += ThreatByMinor[type_of(pos.piece_on(pop_lsb(&b)))];
574 b = weak & attackedBy[Us][ROOK];
576 score += ThreatByRook[type_of(pos.piece_on(pop_lsb(&b)))];
578 if (weak & attackedBy[Us][KING])
579 score += ThreatByKing;
581 b = ~attackedBy[Them][ALL_PIECES]
582 | (nonPawnEnemies & attackedBy2[Us]);
583 score += Hanging * popcount(weak & b);
585 // Additional bonus if weak piece is only protected by a queen
586 score += WeakQueenProtection * popcount(weak & attackedBy[Them][QUEEN]);
589 // Bonus for restricting their piece moves
590 b = attackedBy[Them][ALL_PIECES]
592 & attackedBy[Us][ALL_PIECES];
593 score += RestrictedPiece * popcount(b);
595 // Protected or unattacked squares
596 safe = ~attackedBy[Them][ALL_PIECES] | attackedBy[Us][ALL_PIECES];
598 // Bonus for attacking enemy pieces with our relatively safe pawns
599 b = pos.pieces(Us, PAWN) & safe;
600 b = pawn_attacks_bb<Us>(b) & nonPawnEnemies;
601 score += ThreatBySafePawn * popcount(b);
603 // Find squares where our pawns can push on the next move
604 b = shift<Up>(pos.pieces(Us, PAWN)) & ~pos.pieces();
605 b |= shift<Up>(b & TRank3BB) & ~pos.pieces();
607 // Keep only the squares which are relatively safe
608 b &= ~attackedBy[Them][PAWN] & safe;
610 // Bonus for safe pawn threats on the next move
611 b = pawn_attacks_bb<Us>(b) & nonPawnEnemies;
612 score += ThreatByPawnPush * popcount(b);
614 // Bonus for threats on the next moves against enemy queen
615 if (pos.count<QUEEN>(Them) == 1)
617 bool queenImbalance = pos.count<QUEEN>() == 1;
619 Square s = pos.square<QUEEN>(Them);
620 safe = mobilityArea[Us]
621 & ~pos.pieces(Us, PAWN)
622 & ~stronglyProtected;
624 b = attackedBy[Us][KNIGHT] & attacks_bb<KNIGHT>(s);
626 score += KnightOnQueen * popcount(b & safe) * (1 + queenImbalance);
628 b = (attackedBy[Us][BISHOP] & attacks_bb<BISHOP>(s, pos.pieces()))
629 | (attackedBy[Us][ROOK ] & attacks_bb<ROOK >(s, pos.pieces()));
631 score += SliderOnQueen * popcount(b & safe & attackedBy2[Us]) * (1 + queenImbalance);
635 Trace::add(THREAT, Us, score);
640 // Evaluation::passed() evaluates the passed pawns and candidate passed
641 // pawns of the given color.
643 template<Tracing T> template<Color Us>
644 Score Evaluation<T>::passed() const {
646 constexpr Color Them = ~Us;
647 constexpr Direction Up = pawn_push(Us);
648 constexpr Direction Down = -Up;
650 auto king_proximity = [&](Color c, Square s) {
651 return std::min(distance(pos.square<KING>(c), s), 5);
654 Bitboard b, bb, squaresToQueen, unsafeSquares, blockedPassers, helpers;
655 Score score = SCORE_ZERO;
657 b = pe->passed_pawns(Us);
659 blockedPassers = b & shift<Down>(pos.pieces(Them, PAWN));
662 helpers = shift<Up>(pos.pieces(Us, PAWN))
664 & (~attackedBy2[Them] | attackedBy[Us][ALL_PIECES]);
666 // Remove blocked candidate passers that don't have help to pass
668 | shift<WEST>(helpers)
669 | shift<EAST>(helpers);
674 Square s = pop_lsb(&b);
676 assert(!(pos.pieces(Them, PAWN) & forward_file_bb(Us, s + Up)));
678 int r = relative_rank(Us, s);
680 Score bonus = PassedRank[r];
685 Square blockSq = s + Up;
687 // Adjust bonus based on the king's proximity
688 bonus += make_score(0, ( (king_proximity(Them, blockSq) * 19) / 4
689 - king_proximity(Us, blockSq) * 2) * w);
691 // If blockSq is not the queening square then consider also a second push
693 bonus -= make_score(0, king_proximity(Us, blockSq + Up) * w);
695 // If the pawn is free to advance, then increase the bonus
696 if (pos.empty(blockSq))
698 squaresToQueen = forward_file_bb(Us, s);
699 unsafeSquares = passed_pawn_span(Us, s);
701 bb = forward_file_bb(Them, s) & pos.pieces(ROOK, QUEEN);
703 if (!(pos.pieces(Them) & bb))
704 unsafeSquares &= attackedBy[Them][ALL_PIECES];
706 // If there are no enemy attacks on passed pawn span, assign a big bonus.
707 // Otherwise assign a smaller bonus if the path to queen is not attacked
708 // and even smaller bonus if it is attacked but block square is not.
709 int k = !unsafeSquares ? 35 :
710 !(unsafeSquares & squaresToQueen) ? 20 :
711 !(unsafeSquares & blockSq) ? 9 :
714 // Assign a larger bonus if the block square is defended
715 if ((pos.pieces(Us) & bb) || (attackedBy[Us][ALL_PIECES] & blockSq))
718 bonus += make_score(k * w, k * w);
722 score += bonus - PassedFile * edge_distance(file_of(s));
726 Trace::add(PASSED, Us, score);
732 // Evaluation::space() computes a space evaluation for a given side, aiming to improve game
733 // play in the opening. It is based on the number of safe squares on the 4 central files
734 // on ranks 2 to 4. Completely safe squares behind a friendly pawn are counted twice.
735 // Finally, the space bonus is multiplied by a weight which decreases according to occupancy.
737 template<Tracing T> template<Color Us>
738 Score Evaluation<T>::space() const {
740 // Early exit if, for example, both queens or 6 minor pieces have been exchanged
741 if (pos.non_pawn_material() < SpaceThreshold)
744 constexpr Color Them = ~Us;
745 constexpr Direction Down = -pawn_push(Us);
746 constexpr Bitboard SpaceMask =
747 Us == WHITE ? CenterFiles & (Rank2BB | Rank3BB | Rank4BB)
748 : CenterFiles & (Rank7BB | Rank6BB | Rank5BB);
750 // Find the available squares for our pieces inside the area defined by SpaceMask
751 Bitboard safe = SpaceMask
752 & ~pos.pieces(Us, PAWN)
753 & ~attackedBy[Them][PAWN];
755 // Find all squares which are at most three squares behind some friendly pawn
756 Bitboard behind = pos.pieces(Us, PAWN);
757 behind |= shift<Down>(behind);
758 behind |= shift<Down+Down>(behind);
760 int bonus = popcount(safe) + popcount(behind & safe & ~attackedBy[Them][ALL_PIECES]);
761 int weight = pos.count<ALL_PIECES>(Us) - 3 + std::min(pe->blocked_count(), 9);
762 Score score = make_score(bonus * weight * weight / 16, 0);
765 Trace::add(SPACE, Us, score);
771 // Evaluation::winnable() adjusts the midgame and endgame score components, based on
772 // the known attacking/defending status of the players. The final value is derived
773 // by interpolation from the midgame and endgame values.
776 Value Evaluation<T>::winnable(Score score) const {
778 int outflanking = distance<File>(pos.square<KING>(WHITE), pos.square<KING>(BLACK))
779 - distance<Rank>(pos.square<KING>(WHITE), pos.square<KING>(BLACK));
781 bool pawnsOnBothFlanks = (pos.pieces(PAWN) & QueenSide)
782 && (pos.pieces(PAWN) & KingSide);
784 bool almostUnwinnable = outflanking < 0
785 && !pawnsOnBothFlanks;
787 bool infiltration = rank_of(pos.square<KING>(WHITE)) > RANK_4
788 || rank_of(pos.square<KING>(BLACK)) < RANK_5;
790 // Compute the initiative bonus for the attacking side
791 int complexity = 9 * pe->passed_count()
792 + 12 * pos.count<PAWN>()
794 + 21 * pawnsOnBothFlanks
796 + 51 * !pos.non_pawn_material()
797 - 43 * almostUnwinnable
800 Value mg = mg_value(score);
801 Value eg = eg_value(score);
803 // Now apply the bonus: note that we find the attacking side by extracting the
804 // sign of the midgame or endgame values, and that we carefully cap the bonus
805 // so that the midgame and endgame scores do not change sign after the bonus.
806 int u = ((mg > 0) - (mg < 0)) * Utility::clamp(complexity + 50, -abs(mg), 0);
807 int v = ((eg > 0) - (eg < 0)) * std::max(complexity, -abs(eg));
812 // Compute the scale factor for the winning side
813 Color strongSide = eg > VALUE_DRAW ? WHITE : BLACK;
814 int sf = me->scale_factor(pos, strongSide);
816 // If scale factor is not already specific, scale down via general heuristics
817 if (sf == SCALE_FACTOR_NORMAL)
819 if (pos.opposite_bishops())
821 if ( pos.non_pawn_material(WHITE) == BishopValueMg
822 && pos.non_pawn_material(BLACK) == BishopValueMg)
823 sf = 18 + 4 * popcount(pe->passed_pawns(strongSide));
825 sf = 22 + 3 * pos.count<ALL_PIECES>(strongSide);
827 else if ( pos.non_pawn_material(WHITE) == RookValueMg
828 && pos.non_pawn_material(BLACK) == RookValueMg
829 && pos.count<PAWN>(strongSide) - pos.count<PAWN>(~strongSide) <= 1
830 && bool(KingSide & pos.pieces(strongSide, PAWN)) != bool(QueenSide & pos.pieces(strongSide, PAWN))
831 && (attacks_bb<KING>(pos.square<KING>(~strongSide)) & pos.pieces(~strongSide, PAWN)))
833 else if (pos.count<QUEEN>() == 1)
834 sf = 37 + 3 * (pos.count<QUEEN>(WHITE) == 1 ? pos.count<BISHOP>(BLACK) + pos.count<KNIGHT>(BLACK)
835 : pos.count<BISHOP>(WHITE) + pos.count<KNIGHT>(WHITE));
837 sf = std::min(sf, 36 + 7 * pos.count<PAWN>(strongSide));
840 // Interpolate between the middlegame and (scaled by 'sf') endgame score
841 v = mg * int(me->game_phase())
842 + eg * int(PHASE_MIDGAME - me->game_phase()) * ScaleFactor(sf) / SCALE_FACTOR_NORMAL;
847 Trace::add(WINNABLE, make_score(u, eg * ScaleFactor(sf) / SCALE_FACTOR_NORMAL - eg_value(score)));
848 Trace::add(TOTAL, make_score(mg, eg * ScaleFactor(sf) / SCALE_FACTOR_NORMAL));
855 // Evaluation::value() is the main function of the class. It computes the various
856 // parts of the evaluation and returns the value of the position from the point
857 // of view of the side to move.
860 Value Evaluation<T>::value() {
862 assert(!pos.checkers());
864 // Probe the material hash table
865 me = Material::probe(pos);
867 // If we have a specialized evaluation function for the current material
868 // configuration, call it and return.
869 if (me->specialized_eval_exists())
870 return me->evaluate(pos);
872 // Initialize score by reading the incrementally updated scores included in
873 // the position object (material + piece square tables) and the material
874 // imbalance. Score is computed internally from the white point of view.
875 Score score = pos.psq_score() + me->imbalance() + pos.this_thread()->contempt;
877 // Probe the pawn hash table
878 pe = Pawns::probe(pos);
879 score += pe->pawn_score(WHITE) - pe->pawn_score(BLACK);
881 // Early exit if score is high
882 auto lazy_skip = [&](Value lazyThreshold) {
883 return abs(mg_value(score) + eg_value(score)) / 2 > lazyThreshold + pos.non_pawn_material() / 64;
886 if (lazy_skip(LazyThreshold1))
889 // Main evaluation begins here
893 // Pieces evaluated first (also populates attackedBy, attackedBy2).
894 // Note that the order of evaluation of the terms is left unspecified.
895 score += pieces<WHITE, KNIGHT>() - pieces<BLACK, KNIGHT>()
896 + pieces<WHITE, BISHOP>() - pieces<BLACK, BISHOP>()
897 + pieces<WHITE, ROOK >() - pieces<BLACK, ROOK >()
898 + pieces<WHITE, QUEEN >() - pieces<BLACK, QUEEN >();
900 score += mobility[WHITE] - mobility[BLACK];
902 // More complex interactions that require fully populated attack bitboards
903 score += king< WHITE>() - king< BLACK>()
904 + passed< WHITE>() - passed< BLACK>();
906 if (lazy_skip(LazyThreshold2))
909 score += threats<WHITE>() - threats<BLACK>()
910 + space< WHITE>() - space< BLACK>();
913 // Derive single value from mg and eg parts of score
914 Value v = winnable(score);
916 // In case of tracing add all remaining individual evaluation terms
919 Trace::add(MATERIAL, pos.psq_score());
920 Trace::add(IMBALANCE, me->imbalance());
921 Trace::add(PAWN, pe->pawn_score(WHITE), pe->pawn_score(BLACK));
922 Trace::add(MOBILITY, mobility[WHITE], mobility[BLACK]);
928 // Side to move point of view
929 v = (pos.side_to_move() == WHITE ? v : -v) + Tempo;
937 /// evaluate() is the evaluator for the outer world. It returns a static
938 /// evaluation of the position from the point of view of the side to move.
940 Value Eval::evaluate(const Position& pos) {
942 bool classical = !Eval::useNNUE
943 || abs(eg_value(pos.psq_score())) * 16 > NNUEThreshold1 * (16 + pos.rule50_count());
944 Value v = classical ? Evaluation<NO_TRACE>(pos).value()
945 : NNUE::evaluate(pos) * 5 / 4 + Tempo;
947 if (classical && Eval::useNNUE && abs(v) * 16 < NNUEThreshold2 * (16 + pos.rule50_count()))
948 v = NNUE::evaluate(pos) * 5 / 4 + Tempo;
950 // Damp down the evaluation linearly when shuffling
951 v = v * (100 - pos.rule50_count()) / 100;
953 // Guarantee evalution outside of TB range
954 v = Utility::clamp(v, VALUE_TB_LOSS_IN_MAX_PLY + 1, VALUE_TB_WIN_IN_MAX_PLY - 1);
959 /// trace() is like evaluate(), but instead of returning a value, it returns
960 /// a string (suitable for outputting to stdout) that contains the detailed
961 /// descriptions and values of each evaluation term. Useful for debugging.
962 /// Trace scores are from white's point of view
964 std::string Eval::trace(const Position& pos) {
967 return "Final evaluation: none (in check)";
969 std::stringstream ss;
970 ss << std::showpoint << std::noshowpos << std::fixed << std::setprecision(2);
976 v = NNUE::evaluate(pos);
980 std::memset(scores, 0, sizeof(scores));
982 pos.this_thread()->contempt = SCORE_ZERO; // Reset any dynamic contempt
984 v = Evaluation<TRACE>(pos).value();
986 ss << std::showpoint << std::noshowpos << std::fixed << std::setprecision(2)
987 << " Term | White | Black | Total \n"
988 << " | MG EG | MG EG | MG EG \n"
989 << " ------------+-------------+-------------+------------\n"
990 << " Material | " << Term(MATERIAL)
991 << " Imbalance | " << Term(IMBALANCE)
992 << " Pawns | " << Term(PAWN)
993 << " Knights | " << Term(KNIGHT)
994 << " Bishops | " << Term(BISHOP)
995 << " Rooks | " << Term(ROOK)
996 << " Queens | " << Term(QUEEN)
997 << " Mobility | " << Term(MOBILITY)
998 << " King safety | " << Term(KING)
999 << " Threats | " << Term(THREAT)
1000 << " Passed | " << Term(PASSED)
1001 << " Space | " << Term(SPACE)
1002 << " Winnable | " << Term(WINNABLE)
1003 << " ------------+-------------+-------------+------------\n"
1004 << " Total | " << Term(TOTAL);
1007 v = pos.side_to_move() == WHITE ? v : -v;
1009 ss << "\nFinal evaluation: " << to_cp(v) << " (white side)\n";