]> git.sesse.net Git - stockfish/blob - src/evaluate.cpp
8b4a27bc112b3cad6d9997b3ea11209a5445edce
[stockfish] / src / evaluate.cpp
1 /*
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
6
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.
11
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.
16
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/>.
19 */
20
21 #include <algorithm>
22 #include <cassert>
23 #include <cstring>   // For std::memset
24 #include <iomanip>
25 #include <sstream>
26
27 #include "bitboard.h"
28 #include "evaluate.h"
29 #include "material.h"
30 #include "pawns.h"
31 #include "thread.h"
32
33 namespace Trace {
34
35   enum Tracing { NO_TRACE, TRACE };
36
37   enum Term { // The first 8 entries are reserved for PieceType
38     MATERIAL = 8, IMBALANCE, MOBILITY, THREAT, PASSED, SPACE, WINNABLE, TOTAL, TERM_NB
39   };
40
41   Score scores[TERM_NB][COLOR_NB];
42
43   double to_cp(Value v) { return double(v) / PawnValueEg; }
44
45   void add(int idx, Color c, Score s) {
46     scores[idx][c] = s;
47   }
48
49   void add(int idx, Score w, Score b = SCORE_ZERO) {
50     scores[idx][WHITE] = w;
51     scores[idx][BLACK] = b;
52   }
53
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));
57     return os;
58   }
59
60   std::ostream& operator<<(std::ostream& os, Term t) {
61
62     if (t == MATERIAL || t == IMBALANCE || t == WINNABLE || t == TOTAL)
63         os << " ----  ----"    << " | " << " ----  ----";
64     else
65         os << scores[t][WHITE] << " | " << scores[t][BLACK];
66
67     os << " | " << scores[t][WHITE] - scores[t][BLACK] << "\n";
68     return os;
69   }
70 }
71
72 using namespace Trace;
73
74 namespace {
75
76   // Threshold for lazy and space evaluation
77   constexpr Value LazyThreshold  = Value(1400);
78   constexpr Value SpaceThreshold = Value(12222);
79
80   // KingAttackWeights[PieceType] contains king attack weights by piece type
81   constexpr int KingAttackWeights[PIECE_TYPE_NB] = { 0, 0, 81, 52, 44, 10 };
82
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;
88
89 #define S(mg, eg) make_score(mg, eg)
90
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) }
107   };
108
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) };
112
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)
118   };
119
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)
122   };
123
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)
127   };
128
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);
157
158 #undef S
159
160   // Evaluation class computes and stores attacks tables and other working data
161   template<Tracing T>
162   class Evaluation {
163
164   public:
165     Evaluation() = delete;
166     explicit Evaluation(const Position& p) : pos(p) {}
167     Evaluation& operator=(const Evaluation&) = delete;
168     Value value();
169
170   private:
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;
178
179     const Position& pos;
180     Material::Entry* me;
181     Pawns::Entry* pe;
182     Bitboard mobilityArea[COLOR_NB];
183     Score mobility[COLOR_NB] = { SCORE_ZERO, SCORE_ZERO };
184
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];
189
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];
193
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];
197
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];
201
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];
207
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];
214   };
215
216
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() {
221
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);
226
227     const Square ksq = pos.square<KING>(Us);
228
229     Bitboard dblAttackByPawn = pawn_double_attacks_bb<Us>(pos.pieces(Us, PAWN));
230
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);
233
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));
237
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]);
243
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;
248
249     kingAttackersCount[Them] = popcount(kingRing[Us] & pe->pawn_attacks(Them));
250     kingAttacksCount[Them] = kingAttackersWeight[Them] = 0;
251
252     // Remove from kingRing[] the squares defended by two pawns
253     kingRing[Us] &= ~dblAttackByPawn;
254   }
255
256
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() {
260
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);
266
267     Bitboard b, bb;
268     Score score = SCORE_ZERO;
269
270     attackedBy[Us][Pt] = 0;
271
272     for (Square s = *pl; s != SQ_NONE; s = *++pl)
273     {
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());
278
279         if (pos.blockers_for_king(Us) & s)
280             b &= line_bb(pos.square<KING>(Us), s);
281
282         attackedBy2[Us] |= attackedBy[Us][ALL_PIECES] & b;
283         attackedBy[Us][Pt] |= b;
284         attackedBy[Us][ALL_PIECES] |= b;
285
286         if (b & kingRing[Them])
287         {
288             kingAttackersCount[Us]++;
289             kingAttackersWeight[Us] += KingAttackWeights[Pt];
290             kingAttacksCount[Us] += popcount(b & attackedBy[Them][KING]);
291         }
292
293         else if (Pt == ROOK && (file_bb(s) & kingRing[Them]))
294             score += RookOnKingRing;
295
296         else if (Pt == BISHOP && (attacks_bb<BISHOP>(s, pos.pieces(PAWN)) & kingRing[Them]))
297             score += BishopOnKingRing;
298
299         int mob = popcount(b & mobilityArea[Us]);
300
301         mobility[Us] += MobilityBonus[Pt - 2][mob];
302
303         if (Pt == BISHOP || Pt == KNIGHT)
304         {
305             // Bonus if piece is on an outpost square or can reach one
306             bb = OutpostRanks & attackedBy[Us][PAWN] & ~pe->pawn_attacks_span(Them);
307             if (bb & s)
308                 score += (Pt == KNIGHT) ? KnightOutpost : BishopOutpost;
309             else if (Pt == KNIGHT && bb & b & ~pos.pieces(Us))
310                 score += ReachableOutpost;
311
312             // Bonus for a knight or bishop shielded by pawn
313             if (shift<Down>(pos.pieces(PAWN)) & s)
314                 score += MinorBehindPawn;
315
316             // Penalty if the piece is far from the king
317             score -= (Pt == KNIGHT ? KnightKingProtector
318                                    : BishopKingProtector) * distance(pos.square<KING>(Us), s);
319
320             if (Pt == BISHOP)
321             {
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());
326
327                 score -= BishopPawns * pos.pawns_on_same_color_squares(Us, s)
328                                      * (!(attackedBy[Us][PAWN] & s) + popcount(blocked & CenterFiles));
329
330                 // Penalty for all enemy pawns x-rayed
331                 score -= BishopXRayPawns * popcount(attacks_bb<BISHOP>(s) & pos.pieces(Them, PAWN));
332
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;
336
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)))
342                 {
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
347                                                                                   : CorneredBishop;
348                 }
349             }
350         }
351
352         if (Pt == ROOK)
353         {
354             // Bonus for rook on the same file as a queen
355             if (file_bb(s) & pos.pieces(QUEEN))
356                 score += RookOnQueenFile;
357
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)];
361
362             // Penalty when trapped by the king, even more if the king cannot castle
363             else if (mob <= 3)
364             {
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));
368             }
369         }
370
371         if (Pt == QUEEN)
372         {
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))
376                 score -= WeakQueen;
377
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;    
381         }
382     }
383     if (T)
384         Trace::add(Pt, Us, score);
385
386     return score;
387   }
388
389
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 {
393
394     constexpr Color    Them = ~Us;
395     constexpr Bitboard Camp = (Us == WHITE ? AllSquares ^ Rank6BB ^ Rank7BB ^ Rank8BB
396                                            : AllSquares ^ Rank1BB ^ Rank2BB ^ Rank3BB);
397
398     Bitboard weak, b1, b2, b3, safe, unsafeChecks = 0;
399     Bitboard rookChecks, queenChecks, bishopChecks, knightChecks;
400     int kingDanger = 0;
401     const Square ksq = pos.square<KING>(Us);
402
403     // Init the score with king shelter and enemy pawns storm
404     Score score = pe->king_safety<Us>(pos);
405
406     // Attacked squares defended at most once by our queen or king
407     weak =  attackedBy[Them][ALL_PIECES]
408           & ~attackedBy2[Us]
409           & (~attackedBy[Us][ALL_PIECES] | attackedBy[Us][KING] | attackedBy[Us][QUEEN]);
410
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]);
414
415     b1 = attacks_bb<ROOK  >(ksq, pos.pieces() ^ pos.pieces(Us, QUEEN));
416     b2 = attacks_bb<BISHOP>(ksq, pos.pieces() ^ pos.pieces(Us, QUEEN));
417
418     // Enemy rooks checks
419     rookChecks = b1 & safe & attackedBy[Them][ROOK];
420     if (rookChecks)
421         kingDanger += more_than_one(rookChecks) ? RookSafeCheck * 175/100
422                                                 : RookSafeCheck;
423     else
424         unsafeChecks |= b1 & attackedBy[Them][ROOK];
425
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]
430                  & safe
431                  & ~attackedBy[Us][QUEEN]
432                  & ~rookChecks;
433     if (queenChecks)
434         kingDanger += more_than_one(queenChecks) ? QueenSafeCheck * 145/100
435                                                  : QueenSafeCheck;
436
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.
439     bishopChecks =  b2
440                   & attackedBy[Them][BISHOP]
441                   & safe
442                   & ~queenChecks;
443     if (bishopChecks)
444         kingDanger += more_than_one(bishopChecks) ? BishopSafeCheck * 3/2
445                                                   : BishopSafeCheck;
446     else
447         unsafeChecks |= b2 & attackedBy[Them][BISHOP];
448
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
453                                                          : KnightSafeCheck;
454     else
455         unsafeChecks |= knightChecks;
456
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;
462
463     int kingFlankAttack = popcount(b1) + popcount(b2);
464     int kingFlankDefense = popcount(b3);
465
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
477                  +  37;
478
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);
482
483     // Penalty when our king is on a pawnless flank
484     if (!(pos.pieces(PAWN) & KingFlank[file_of(ksq)]))
485         score -= PawnlessFlank;
486
487     // Penalty if king flank is under attack, potentially moving toward the king
488     score -= FlankAttacks * kingFlankAttack;
489
490     if (T)
491         Trace::add(KING, Us, score);
492
493     return score;
494   }
495
496
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 {
501
502     constexpr Color     Them     = ~Us;
503     constexpr Direction Up       = pawn_push(Us);
504     constexpr Bitboard  TRank3BB = (Us == WHITE ? Rank3BB : Rank6BB);
505
506     Bitboard b, weak, defended, nonPawnEnemies, stronglyProtected, safe;
507     Score score = SCORE_ZERO;
508
509     // Non-pawn enemies
510     nonPawnEnemies = pos.pieces(Them) & ~pos.pieces(PAWN);
511
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]);
516
517     // Non-pawn enemies, strongly protected
518     defended = nonPawnEnemies & stronglyProtected;
519
520     // Enemies not strongly protected and under our attack
521     weak = pos.pieces(Them) & ~stronglyProtected & attackedBy[Us][ALL_PIECES];
522
523     // Bonus according to the kind of attacking pieces
524     if (defended | weak)
525     {
526         b = (defended | weak) & (attackedBy[Us][KNIGHT] | attackedBy[Us][BISHOP]);
527         while (b)
528             score += ThreatByMinor[type_of(pos.piece_on(pop_lsb(&b)))];
529
530         b = weak & attackedBy[Us][ROOK];
531         while (b)
532             score += ThreatByRook[type_of(pos.piece_on(pop_lsb(&b)))];
533
534         if (weak & attackedBy[Us][KING])
535             score += ThreatByKing;
536
537         b =  ~attackedBy[Them][ALL_PIECES]
538            | (nonPawnEnemies & attackedBy2[Us]);
539         score += Hanging * popcount(weak & b);
540
541         // Additional bonus if weak piece is only protected by a queen
542         score += WeakQueenProtection * popcount(weak & attackedBy[Them][QUEEN]);
543     }
544
545     // Bonus for restricting their piece moves
546     b =   attackedBy[Them][ALL_PIECES]
547        & ~stronglyProtected
548        &  attackedBy[Us][ALL_PIECES];
549     score += RestrictedPiece * popcount(b);
550
551     // Protected or unattacked squares
552     safe = ~attackedBy[Them][ALL_PIECES] | attackedBy[Us][ALL_PIECES];
553
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);
558
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();
562
563     // Keep only the squares which are relatively safe
564     b &= ~attackedBy[Them][PAWN] & safe;
565
566     // Bonus for safe pawn threats on the next move
567     b = pawn_attacks_bb<Us>(b) & nonPawnEnemies;
568     score += ThreatByPawnPush * popcount(b);
569
570     // Bonus for threats on the next moves against enemy queen
571     if (pos.count<QUEEN>(Them) == 1)
572     {
573         Square s = pos.square<QUEEN>(Them);
574         safe = mobilityArea[Us] & ~stronglyProtected;
575
576         b = attackedBy[Us][KNIGHT] & attacks_bb<KNIGHT>(s);
577
578         score += KnightOnQueen * popcount(b & safe);
579
580         b =  (attackedBy[Us][BISHOP] & attacks_bb<BISHOP>(s, pos.pieces()))
581            | (attackedBy[Us][ROOK  ] & attacks_bb<ROOK  >(s, pos.pieces()));
582
583         score += SliderOnQueen * popcount(b & safe & attackedBy2[Us]);
584     }
585
586     if (T)
587         Trace::add(THREAT, Us, score);
588
589     return score;
590   }
591
592   // Evaluation::passed() evaluates the passed pawns and candidate passed
593   // pawns of the given color.
594
595   template<Tracing T> template<Color Us>
596   Score Evaluation<T>::passed() const {
597
598     constexpr Color     Them = ~Us;
599     constexpr Direction Up   = pawn_push(Us);
600     constexpr Direction Down = -Up;
601
602     auto king_proximity = [&](Color c, Square s) {
603       return std::min(distance(pos.square<KING>(c), s), 5);
604     };
605
606     Bitboard b, bb, squaresToQueen, unsafeSquares, blockedPassers, helpers;
607     Score score = SCORE_ZERO;
608
609     b = pe->passed_pawns(Us);
610
611     blockedPassers = b & shift<Down>(pos.pieces(Them, PAWN));
612     if (blockedPassers)
613     {
614         helpers =  shift<Up>(pos.pieces(Us, PAWN))
615                  & ~pos.pieces(Them)
616                  & (~attackedBy2[Them] | attackedBy[Us][ALL_PIECES]);
617
618         // Remove blocked candidate passers that don't have help to pass
619         b &=  ~blockedPassers
620             | shift<WEST>(helpers)
621             | shift<EAST>(helpers);
622     }
623
624     while (b)
625     {
626         Square s = pop_lsb(&b);
627
628         assert(!(pos.pieces(Them, PAWN) & forward_file_bb(Us, s + Up)));
629
630         int r = relative_rank(Us, s);
631
632         Score bonus = PassedRank[r];
633
634         if (r > RANK_3)
635         {
636             int w = 5 * r - 13;
637             Square blockSq = s + Up;
638
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);
642
643             // If blockSq is not the queening square then consider also a second push
644             if (r != RANK_7)
645                 bonus -= make_score(0, king_proximity(Us, blockSq + Up) * w);
646
647             // If the pawn is free to advance, then increase the bonus
648             if (pos.empty(blockSq))
649             {
650                 squaresToQueen = forward_file_bb(Us, s);
651                 unsafeSquares = passed_pawn_span(Us, s);
652
653                 bb = forward_file_bb(Them, s) & pos.pieces(ROOK, QUEEN);
654
655                 if (!(pos.pieces(Them) & bb))
656                     unsafeSquares &= attackedBy[Them][ALL_PIECES];
657
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 :
664                                                              0 ;
665
666                 // Assign a larger bonus if the block square is defended
667                 if ((pos.pieces(Us) & bb) || (attackedBy[Us][ALL_PIECES] & blockSq))
668                     k += 5;
669
670                 bonus += make_score(k * w, k * w);
671             }
672         } // r > RANK_3
673
674         score += bonus - PassedFile * edge_distance(file_of(s));
675     }
676
677     if (T)
678         Trace::add(PASSED, Us, score);
679
680     return score;
681   }
682
683
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.
688
689   template<Tracing T> template<Color Us>
690   Score Evaluation<T>::space() const {
691
692     // Early exit if, for example, both queens or 6 minor pieces have been exchanged
693     if (pos.non_pawn_material() < SpaceThreshold)
694         return SCORE_ZERO;
695
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);
701
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];
706
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);
711
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);
715
716     if (T)
717         Trace::add(SPACE, Us, score);
718
719     return score;
720   }
721
722
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.
726
727   template<Tracing T>
728   Value Evaluation<T>::winnable(Score score) const {
729
730     int outflanking =  distance<File>(pos.square<KING>(WHITE), pos.square<KING>(BLACK))
731                      - distance<Rank>(pos.square<KING>(WHITE), pos.square<KING>(BLACK));
732
733     bool pawnsOnBothFlanks =   (pos.pieces(PAWN) & QueenSide)
734                             && (pos.pieces(PAWN) & KingSide);
735
736     bool almostUnwinnable =   outflanking < 0
737                            && !pawnsOnBothFlanks;
738
739     bool infiltration = rank_of(pos.square<KING>(WHITE)) > RANK_4
740                      || rank_of(pos.square<KING>(BLACK)) < RANK_5;
741
742     // Compute the initiative bonus for the attacking side
743     int complexity =   9 * pe->passed_count()
744                     + 12 * pos.count<PAWN>()
745                     +  9 * outflanking
746                     + 21 * pawnsOnBothFlanks
747                     + 24 * infiltration
748                     + 51 * !pos.non_pawn_material()
749                     - 43 * almostUnwinnable
750                     -110 ;
751
752     Value mg = mg_value(score);
753     Value eg = eg_value(score);
754
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));
760
761     mg += u;
762     eg += v;
763
764     // Compute the scale factor for the winning side
765
766     Color strongSide = eg > VALUE_DRAW ? WHITE : BLACK;
767     int sf = me->scale_factor(pos, strongSide);
768
769     // If scale is not already specific, scale down the endgame via general heuristics
770     if (sf == SCALE_FACTOR_NORMAL)
771     {
772         if (pos.opposite_bishops())
773         {
774             if (   pos.non_pawn_material(WHITE) == BishopValueMg
775                 && pos.non_pawn_material(BLACK) == BishopValueMg)
776                 sf = 18 + 4 * popcount(pe->passed_pawns(strongSide));
777             else
778                 sf = 22 + 3 * pos.count<ALL_PIECES>(strongSide);
779         }
780         else
781             sf = std::min(sf, 36 + 7 * pos.count<PAWN>(strongSide));
782     }
783
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;
787     v /= PHASE_MIDGAME;
788
789     if (T)
790     {
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));
793     }
794
795     return Value(v);
796   }
797
798
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.
802
803   template<Tracing T>
804   Value Evaluation<T>::value() {
805
806     assert(!pos.checkers());
807
808     // Probe the material hash table
809     me = Material::probe(pos);
810
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);
815
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;
820
821     // Probe the pawn hash table
822     pe = Pawns::probe(pos);
823     score += pe->pawn_score(WHITE) - pe->pawn_score(BLACK);
824
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;
829
830     // Main evaluation begins here
831
832     initialize<WHITE>();
833     initialize<BLACK>();
834
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 >();
841
842     score += mobility[WHITE] - mobility[BLACK];
843
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>();
849
850     // Derive single value from mg and eg parts of score
851     v = winnable(score);
852
853     // In case of tracing add all remaining individual evaluation terms
854     if (T)
855     {
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]);
860     }
861
862     // Evaluation grain
863     v = (v / 16) * 16;
864
865     // Side to move point of view
866     v = (pos.side_to_move() == WHITE ? v : -v) + Tempo;
867
868     // Damp down the evaluation linearly when shuffling
869     v = v * (100 - pos.rule50_count()) / 100;
870
871     return v;
872   }
873
874 } // namespace
875
876
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.
879
880 Value Eval::evaluate(const Position& pos) {
881   return Evaluation<NO_TRACE>(pos).value();
882 }
883
884
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.
888
889 std::string Eval::trace(const Position& pos) {
890
891   if (pos.checkers())
892       return "Total evaluation: none (in check)";
893
894   std::memset(scores, 0, sizeof(scores));
895
896   pos.this_thread()->contempt = SCORE_ZERO; // Reset any dynamic contempt
897
898   Value v = Evaluation<TRACE>(pos).value();
899
900   v = pos.side_to_move() == WHITE ? v : -v; // Trace scores are from white's point of view
901
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);
922
923   ss << "\nFinal evaluation: " << to_cp(v) << " (white side)\n";
924
925   return ss.str();
926 }