]> git.sesse.net Git - stockfish/blob - src/evaluate.cpp
Multiple lazy stages.
[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 LazyThreshold1  = Value(1400);
78   constexpr Value LazyThreshold2  = Value(1300);
79   constexpr Value SpaceThreshold = Value(12222);
80
81   // KingAttackWeights[PieceType] contains king attack weights by piece type
82   constexpr int KingAttackWeights[PIECE_TYPE_NB] = { 0, 0, 81, 52, 44, 10 };
83
84   // SafeCheck[PieceType][single/multiple] contains safe check bonus by piece type,
85   // higher if multiple safe checks are possible for that piece type.
86   constexpr int SafeCheck[][2] = {
87       {}, {}, {792, 1283}, {645, 967}, {1084, 1897}, {772, 1119}
88   };
89
90 #define S(mg, eg) make_score(mg, eg)
91
92   // MobilityBonus[PieceType-2][attacked] contains bonuses for middle and end game,
93   // indexed by piece type and number of attacked squares in the mobility area.
94   constexpr Score MobilityBonus[][32] = {
95     { S(-62,-81), S(-53,-56), S(-12,-31), S( -4,-16), S(  3,  5), S( 13, 11), // Knight
96       S( 22, 17), S( 28, 20), S( 33, 25) },
97     { S(-48,-59), S(-20,-23), S( 16, -3), S( 26, 13), S( 38, 24), S( 51, 42), // Bishop
98       S( 55, 54), S( 63, 57), S( 63, 65), S( 68, 73), S( 81, 78), S( 81, 86),
99       S( 91, 88), S( 98, 97) },
100     { S(-60,-78), S(-20,-17), S(  2, 23), S(  3, 39), S(  3, 70), S( 11, 99), // Rook
101       S( 22,103), S( 31,121), S( 40,134), S( 40,139), S( 41,158), S( 48,164),
102       S( 57,168), S( 57,169), S( 62,172) },
103     { S(-30,-48), S(-12,-30), S( -8, -7), S( -9, 19), S( 20, 40), S( 23, 55), // Queen
104       S( 23, 59), S( 35, 75), S( 38, 78), S( 53, 96), S( 64, 96), S( 65,100),
105       S( 65,121), S( 66,127), S( 67,131), S( 67,133), S( 72,136), S( 72,141),
106       S( 77,147), S( 79,150), S( 93,151), S(108,168), S(108,168), S(108,171),
107       S(110,182), S(114,182), S(114,192), S(116,219) }
108   };
109
110   // KingProtector[knight/bishop] contains penalty for each distance unit to own king
111   constexpr Score KingProtector[] = { S(8, 9), S(6, 9) };
112
113   // Outpost[knight/bishop] contains bonuses for each knight or bishop occupying a
114   // pawn protected square on rank 4 to 6 which is also safe from a pawn attack.
115   constexpr Score Outpost[] = { S(56, 36), S(30, 23) };
116
117   // PassedRank[Rank] contains a bonus according to the rank of a passed pawn
118   constexpr Score PassedRank[RANK_NB] = {
119     S(0, 0), S(10, 28), S(17, 33), S(15, 41), S(62, 72), S(168, 177), S(276, 260)
120   };
121
122   // RookOnFile[semiopen/open] contains bonuses for each rook when there is
123   // no (friendly) pawn on the rook file.
124   constexpr Score RookOnFile[] = { S(19, 7), S(48, 29) };
125
126   // ThreatByMinor/ByRook[attacked PieceType] contains bonuses according to
127   // which piece type attacks which one. Attacks on lesser pieces which are
128   // pawn-defended are not considered.
129   constexpr Score ThreatByMinor[PIECE_TYPE_NB] = {
130     S(0, 0), S(5, 32), S(57, 41), S(77, 56), S(88, 119), S(79, 161)
131   };
132
133   constexpr Score ThreatByRook[PIECE_TYPE_NB] = {
134     S(0, 0), S(3, 46), S(37, 68), S(42, 60), S(0, 38), S(58, 41)
135   };
136
137   // Assorted bonuses and penalties
138   constexpr Score BadOutpost          = S( -7, 36);
139   constexpr Score BishopOnKingRing    = S( 24,  0);
140   constexpr Score BishopPawns         = S(  3,  7);
141   constexpr Score BishopXRayPawns     = S(  4,  5);
142   constexpr Score CorneredBishop      = S( 50, 50);
143   constexpr Score FlankAttacks        = S(  8,  0);
144   constexpr Score Hanging             = S( 69, 36);
145   constexpr Score KnightOnQueen       = S( 16, 11);
146   constexpr Score LongDiagonalBishop  = S( 45,  0);
147   constexpr Score MinorBehindPawn     = S( 18,  3);
148   constexpr Score PassedFile          = S( 11,  8);
149   constexpr Score PawnlessFlank       = S( 17, 95);
150   constexpr Score QueenInfiltration   = S( -2, 14);
151   constexpr Score ReachableOutpost    = S( 31, 22);
152   constexpr Score RestrictedPiece     = S(  7,  7);
153   constexpr Score RookOnKingRing      = S( 16,  0);
154   constexpr Score RookOnQueenFile     = S(  6, 11);
155   constexpr Score SliderOnQueen       = S( 60, 18);
156   constexpr Score ThreatByKing        = S( 24, 89);
157   constexpr Score ThreatByPawnPush    = S( 48, 39);
158   constexpr Score ThreatBySafePawn    = S(173, 94);
159   constexpr Score TrappedRook         = S( 55, 13);
160   constexpr Score WeakQueenProtection = S( 14,  0);
161   constexpr Score WeakQueen           = S( 56, 15);
162
163
164 #undef S
165
166   // Evaluation class computes and stores attacks tables and other working data
167   template<Tracing T>
168   class Evaluation {
169
170   public:
171     Evaluation() = delete;
172     explicit Evaluation(const Position& p) : pos(p) {}
173     Evaluation& operator=(const Evaluation&) = delete;
174     Value value();
175
176   private:
177     template<Color Us> void initialize();
178     template<Color Us, PieceType Pt> Score pieces();
179     template<Color Us> Score king() const;
180     template<Color Us> Score threats() const;
181     template<Color Us> Score passed() const;
182     template<Color Us> Score space() const;
183     Value winnable(Score score) const;
184
185     const Position& pos;
186     Material::Entry* me;
187     Pawns::Entry* pe;
188     Bitboard mobilityArea[COLOR_NB];
189     Score mobility[COLOR_NB] = { SCORE_ZERO, SCORE_ZERO };
190
191     // attackedBy[color][piece type] is a bitboard representing all squares
192     // attacked by a given color and piece type. Special "piece types" which
193     // is also calculated is ALL_PIECES.
194     Bitboard attackedBy[COLOR_NB][PIECE_TYPE_NB];
195
196     // attackedBy2[color] are the squares attacked by at least 2 units of a given
197     // color, including x-rays. But diagonal x-rays through pawns are not computed.
198     Bitboard attackedBy2[COLOR_NB];
199
200     // kingRing[color] are the squares adjacent to the king plus some other
201     // very near squares, depending on king position.
202     Bitboard kingRing[COLOR_NB];
203
204     // kingAttackersCount[color] is the number of pieces of the given color
205     // which attack a square in the kingRing of the enemy king.
206     int kingAttackersCount[COLOR_NB];
207
208     // kingAttackersWeight[color] is the sum of the "weights" of the pieces of
209     // the given color which attack a square in the kingRing of the enemy king.
210     // The weights of the individual piece types are given by the elements in
211     // the KingAttackWeights array.
212     int kingAttackersWeight[COLOR_NB];
213
214     // kingAttacksCount[color] is the number of attacks by the given color to
215     // squares directly adjacent to the enemy king. Pieces which attack more
216     // than one square are counted multiple times. For instance, if there is
217     // a white knight on g5 and black's king is on g8, this white knight adds 2
218     // to kingAttacksCount[WHITE].
219     int kingAttacksCount[COLOR_NB];
220   };
221
222
223   // Evaluation::initialize() computes king and pawn attacks, and the king ring
224   // bitboard for a given color. This is done at the beginning of the evaluation.
225
226   template<Tracing T> template<Color Us>
227   void Evaluation<T>::initialize() {
228
229     constexpr Color     Them = ~Us;
230     constexpr Direction Up   = pawn_push(Us);
231     constexpr Direction Down = -Up;
232     constexpr Bitboard LowRanks = (Us == WHITE ? Rank2BB | Rank3BB : Rank7BB | Rank6BB);
233
234     const Square ksq = pos.square<KING>(Us);
235
236     Bitboard dblAttackByPawn = pawn_double_attacks_bb<Us>(pos.pieces(Us, PAWN));
237
238     // Find our pawns that are blocked or on the first two ranks
239     Bitboard b = pos.pieces(Us, PAWN) & (shift<Down>(pos.pieces()) | LowRanks);
240
241     // Squares occupied by those pawns, by our king or queen, by blockers to attacks on our king
242     // or controlled by enemy pawns are excluded from the mobility area.
243     mobilityArea[Us] = ~(b | pos.pieces(Us, KING, QUEEN) | pos.blockers_for_king(Us) | pe->pawn_attacks(Them));
244
245     // Initialize attackedBy[] for king and pawns
246     attackedBy[Us][KING] = attacks_bb<KING>(ksq);
247     attackedBy[Us][PAWN] = pe->pawn_attacks(Us);
248     attackedBy[Us][ALL_PIECES] = attackedBy[Us][KING] | attackedBy[Us][PAWN];
249     attackedBy2[Us] = dblAttackByPawn | (attackedBy[Us][KING] & attackedBy[Us][PAWN]);
250
251     // Init our king safety tables
252     Square s = make_square(Utility::clamp(file_of(ksq), FILE_B, FILE_G),
253                            Utility::clamp(rank_of(ksq), RANK_2, RANK_7));
254     kingRing[Us] = attacks_bb<KING>(s) | s;
255
256     kingAttackersCount[Them] = popcount(kingRing[Us] & pe->pawn_attacks(Them));
257     kingAttacksCount[Them] = kingAttackersWeight[Them] = 0;
258
259     // Remove from kingRing[] the squares defended by two pawns
260     kingRing[Us] &= ~dblAttackByPawn;
261   }
262
263
264   // Evaluation::pieces() scores pieces of a given color and type
265
266   template<Tracing T> template<Color Us, PieceType Pt>
267   Score Evaluation<T>::pieces() {
268
269     constexpr Color     Them = ~Us;
270     constexpr Direction Down = -pawn_push(Us);
271     constexpr Bitboard OutpostRanks = (Us == WHITE ? Rank4BB | Rank5BB | Rank6BB
272                                                    : Rank5BB | Rank4BB | Rank3BB);
273     const Square* pl = pos.squares<Pt>(Us);
274
275     Bitboard b, bb;
276     Score score = SCORE_ZERO;
277
278     attackedBy[Us][Pt] = 0;
279
280     for (Square s = *pl; s != SQ_NONE; s = *++pl)
281     {
282         // Find attacked squares, including x-ray attacks for bishops and rooks
283         b = Pt == BISHOP ? attacks_bb<BISHOP>(s, pos.pieces() ^ pos.pieces(QUEEN))
284           : Pt ==   ROOK ? attacks_bb<  ROOK>(s, pos.pieces() ^ pos.pieces(QUEEN) ^ pos.pieces(Us, ROOK))
285                          : attacks_bb<Pt>(s, pos.pieces());
286
287         if (pos.blockers_for_king(Us) & s)
288             b &= line_bb(pos.square<KING>(Us), s);
289
290         attackedBy2[Us] |= attackedBy[Us][ALL_PIECES] & b;
291         attackedBy[Us][Pt] |= b;
292         attackedBy[Us][ALL_PIECES] |= b;
293
294         if (b & kingRing[Them])
295         {
296             kingAttackersCount[Us]++;
297             kingAttackersWeight[Us] += KingAttackWeights[Pt];
298             kingAttacksCount[Us] += popcount(b & attackedBy[Them][KING]);
299         }
300
301         else if (Pt == ROOK && (file_bb(s) & kingRing[Them]))
302             score += RookOnKingRing;
303
304         else if (Pt == BISHOP && (attacks_bb<BISHOP>(s, pos.pieces(PAWN)) & kingRing[Them]))
305             score += BishopOnKingRing;
306
307         int mob = popcount(b & mobilityArea[Us]);
308
309         mobility[Us] += MobilityBonus[Pt - 2][mob];
310
311         if (Pt == BISHOP || Pt == KNIGHT)
312         {
313             // Bonus if piece is on an outpost square or can reach one
314             bb = OutpostRanks & attackedBy[Us][PAWN] & ~pe->pawn_attacks_span(Them);
315             if (   Pt == KNIGHT
316                 && bb & s & ~CenterFiles
317                 && !(b & pos.pieces(Them) & ~pos.pieces(PAWN))
318                 && !conditional_more_than_two(
319                       pos.pieces(Them) & ~pos.pieces(PAWN) & (s & QueenSide ? QueenSide : KingSide)))
320                 score += BadOutpost;
321             else if (bb & s)
322                 score += Outpost[Pt == BISHOP];
323             else if (Pt == KNIGHT && bb & b & ~pos.pieces(Us))
324                 score += ReachableOutpost;
325
326             // Bonus for a knight or bishop shielded by pawn
327             if (shift<Down>(pos.pieces(PAWN)) & s)
328                 score += MinorBehindPawn;
329
330             // Penalty if the piece is far from the king
331             score -= KingProtector[Pt == BISHOP] * distance(pos.square<KING>(Us), s);
332
333             if (Pt == BISHOP)
334             {
335                 // Penalty according to the number of our pawns on the same color square as the
336                 // bishop, bigger when the center files are blocked with pawns and smaller
337                 // when the bishop is outside the pawn chain.
338                 Bitboard blocked = pos.pieces(Us, PAWN) & shift<Down>(pos.pieces());
339
340                 score -= BishopPawns * pos.pawns_on_same_color_squares(Us, s)
341                                      * (!(attackedBy[Us][PAWN] & s) + popcount(blocked & CenterFiles));
342
343                 // Penalty for all enemy pawns x-rayed
344                 score -= BishopXRayPawns * popcount(attacks_bb<BISHOP>(s) & pos.pieces(Them, PAWN));
345
346                 // Bonus for bishop on a long diagonal which can "see" both center squares
347                 if (more_than_one(attacks_bb<BISHOP>(s, pos.pieces(PAWN)) & Center))
348                     score += LongDiagonalBishop;
349
350                 // An important Chess960 pattern: a cornered bishop blocked by a friendly
351                 // pawn diagonally in front of it is a very serious problem, especially
352                 // when that pawn is also blocked.
353                 if (   pos.is_chess960()
354                     && (s == relative_square(Us, SQ_A1) || s == relative_square(Us, SQ_H1)))
355                 {
356                     Direction d = pawn_push(Us) + (file_of(s) == FILE_A ? EAST : WEST);
357                     if (pos.piece_on(s + d) == make_piece(Us, PAWN))
358                         score -= !pos.empty(s + d + pawn_push(Us))                ? CorneredBishop * 4
359                                 : pos.piece_on(s + d + d) == make_piece(Us, PAWN) ? CorneredBishop * 2
360                                                                                   : CorneredBishop;
361                 }
362             }
363         }
364
365         if (Pt == ROOK)
366         {
367             // Bonus for rook on the same file as a queen
368             if (file_bb(s) & pos.pieces(QUEEN))
369                 score += RookOnQueenFile;
370
371             // Bonus for rook on an open or semi-open file
372             if (pos.is_on_semiopen_file(Us, s))
373                 score += RookOnFile[pos.is_on_semiopen_file(Them, s)];
374
375             // Penalty when trapped by the king, even more if the king cannot castle
376             else if (mob <= 3)
377             {
378                 File kf = file_of(pos.square<KING>(Us));
379                 if ((kf < FILE_E) == (file_of(s) < kf))
380                     score -= TrappedRook * (1 + !pos.castling_rights(Us));
381             }
382         }
383
384         if (Pt == QUEEN)
385         {
386             // Penalty if any relative pin or discovered attack against the queen
387             Bitboard queenPinners;
388             if (pos.slider_blockers(pos.pieces(Them, ROOK, BISHOP), s, queenPinners))
389                 score -= WeakQueen;
390
391             // Bonus for queen on weak square in enemy camp
392             if (relative_rank(Us, s) > RANK_4 && (~pe->pawn_attacks_span(Them) & s))
393                 score += QueenInfiltration;
394         }
395     }
396     if (T)
397         Trace::add(Pt, Us, score);
398
399     return score;
400   }
401
402
403   // Evaluation::king() assigns bonuses and penalties to a king of a given color
404
405   template<Tracing T> template<Color Us>
406   Score Evaluation<T>::king() const {
407
408     constexpr Color    Them = ~Us;
409     constexpr Bitboard Camp = (Us == WHITE ? AllSquares ^ Rank6BB ^ Rank7BB ^ Rank8BB
410                                            : AllSquares ^ Rank1BB ^ Rank2BB ^ Rank3BB);
411
412     Bitboard weak, b1, b2, b3, safe, unsafeChecks = 0;
413     Bitboard rookChecks, queenChecks, bishopChecks, knightChecks;
414     int kingDanger = 0;
415     const Square ksq = pos.square<KING>(Us);
416
417     // Init the score with king shelter and enemy pawns storm
418     Score score = pe->king_safety<Us>(pos);
419
420     // Attacked squares defended at most once by our queen or king
421     weak =  attackedBy[Them][ALL_PIECES]
422           & ~attackedBy2[Us]
423           & (~attackedBy[Us][ALL_PIECES] | attackedBy[Us][KING] | attackedBy[Us][QUEEN]);
424
425     // Analyse the safe enemy's checks which are possible on next move
426     safe  = ~pos.pieces(Them);
427     safe &= ~attackedBy[Us][ALL_PIECES] | (weak & attackedBy2[Them]);
428
429     b1 = attacks_bb<ROOK  >(ksq, pos.pieces() ^ pos.pieces(Us, QUEEN));
430     b2 = attacks_bb<BISHOP>(ksq, pos.pieces() ^ pos.pieces(Us, QUEEN));
431
432     // Enemy rooks checks
433     rookChecks = b1 & attackedBy[Them][ROOK] & safe;
434     if (rookChecks)
435         kingDanger += SafeCheck[ROOK][more_than_one(rookChecks)];
436     else
437         unsafeChecks |= b1 & attackedBy[Them][ROOK];
438
439     // Enemy queen safe checks: count them only if the checks are from squares from
440     // which opponent cannot give a rook check, because rook checks are more valuable.
441     queenChecks =  (b1 | b2) & attackedBy[Them][QUEEN] & safe
442                  & ~(attackedBy[Us][QUEEN] | rookChecks);
443     if (queenChecks)
444         kingDanger += SafeCheck[QUEEN][more_than_one(queenChecks)];
445
446     // Enemy bishops checks: count them only if they are from squares from which
447     // opponent cannot give a queen check, because queen checks are more valuable.
448     bishopChecks =  b2 & attackedBy[Them][BISHOP] & safe
449                   & ~queenChecks;
450     if (bishopChecks)
451         kingDanger += SafeCheck[BISHOP][more_than_one(bishopChecks)];
452
453     else
454         unsafeChecks |= b2 & attackedBy[Them][BISHOP];
455
456     // Enemy knights checks
457     knightChecks = attacks_bb<KNIGHT>(ksq) & attackedBy[Them][KNIGHT];
458     if (knightChecks & safe)
459         kingDanger += SafeCheck[KNIGHT][more_than_one(knightChecks & safe)];
460     else
461         unsafeChecks |= knightChecks;
462
463     // Find the squares that opponent attacks in our king flank, the squares
464     // which they attack twice in that flank, and the squares that we defend.
465     b1 = attackedBy[Them][ALL_PIECES] & KingFlank[file_of(ksq)] & Camp;
466     b2 = b1 & attackedBy2[Them];
467     b3 = attackedBy[Us][ALL_PIECES] & KingFlank[file_of(ksq)] & Camp;
468
469     int kingFlankAttack  = popcount(b1) + popcount(b2);
470     int kingFlankDefense = popcount(b3);
471
472     kingDanger +=        kingAttackersCount[Them] * kingAttackersWeight[Them]
473                  + 185 * popcount(kingRing[Us] & weak)
474                  + 148 * popcount(unsafeChecks)
475                  +  98 * popcount(pos.blockers_for_king(Us))
476                  +  69 * kingAttacksCount[Them]
477                  +   3 * kingFlankAttack * kingFlankAttack / 8
478                  +       mg_value(mobility[Them] - mobility[Us])
479                  - 873 * !pos.count<QUEEN>(Them)
480                  - 100 * bool(attackedBy[Us][KNIGHT] & attackedBy[Us][KING])
481                  -   6 * mg_value(score) / 8
482                  -   4 * kingFlankDefense
483                  +  37;
484
485     // Transform the kingDanger units into a Score, and subtract it from the evaluation
486     if (kingDanger > 100)
487         score -= make_score(kingDanger * kingDanger / 4096, kingDanger / 16);
488
489     // Penalty when our king is on a pawnless flank
490     if (!(pos.pieces(PAWN) & KingFlank[file_of(ksq)]))
491         score -= PawnlessFlank;
492
493     // Penalty if king flank is under attack, potentially moving toward the king
494     score -= FlankAttacks * kingFlankAttack;
495
496     if (T)
497         Trace::add(KING, Us, score);
498
499     return score;
500   }
501
502
503   // Evaluation::threats() assigns bonuses according to the types of the
504   // attacking and the attacked pieces.
505
506   template<Tracing T> template<Color Us>
507   Score Evaluation<T>::threats() const {
508
509     constexpr Color     Them     = ~Us;
510     constexpr Direction Up       = pawn_push(Us);
511     constexpr Bitboard  TRank3BB = (Us == WHITE ? Rank3BB : Rank6BB);
512
513     Bitboard b, weak, defended, nonPawnEnemies, stronglyProtected, safe;
514     Score score = SCORE_ZERO;
515
516     // Non-pawn enemies
517     nonPawnEnemies = pos.pieces(Them) & ~pos.pieces(PAWN);
518
519     // Squares strongly protected by the enemy, either because they defend the
520     // square with a pawn, or because they defend the square twice and we don't.
521     stronglyProtected =  attackedBy[Them][PAWN]
522                        | (attackedBy2[Them] & ~attackedBy2[Us]);
523
524     // Non-pawn enemies, strongly protected
525     defended = nonPawnEnemies & stronglyProtected;
526
527     // Enemies not strongly protected and under our attack
528     weak = pos.pieces(Them) & ~stronglyProtected & attackedBy[Us][ALL_PIECES];
529
530     // Bonus according to the kind of attacking pieces
531     if (defended | weak)
532     {
533         b = (defended | weak) & (attackedBy[Us][KNIGHT] | attackedBy[Us][BISHOP]);
534         while (b)
535             score += ThreatByMinor[type_of(pos.piece_on(pop_lsb(&b)))];
536
537         b = weak & attackedBy[Us][ROOK];
538         while (b)
539             score += ThreatByRook[type_of(pos.piece_on(pop_lsb(&b)))];
540
541         if (weak & attackedBy[Us][KING])
542             score += ThreatByKing;
543
544         b =  ~attackedBy[Them][ALL_PIECES]
545            | (nonPawnEnemies & attackedBy2[Us]);
546         score += Hanging * popcount(weak & b);
547
548         // Additional bonus if weak piece is only protected by a queen
549         score += WeakQueenProtection * popcount(weak & attackedBy[Them][QUEEN]);
550     }
551
552     // Bonus for restricting their piece moves
553     b =   attackedBy[Them][ALL_PIECES]
554        & ~stronglyProtected
555        &  attackedBy[Us][ALL_PIECES];
556     score += RestrictedPiece * popcount(b);
557
558     // Protected or unattacked squares
559     safe = ~attackedBy[Them][ALL_PIECES] | attackedBy[Us][ALL_PIECES];
560
561     // Bonus for attacking enemy pieces with our relatively safe pawns
562     b = pos.pieces(Us, PAWN) & safe;
563     b = pawn_attacks_bb<Us>(b) & nonPawnEnemies;
564     score += ThreatBySafePawn * popcount(b);
565
566     // Find squares where our pawns can push on the next move
567     b  = shift<Up>(pos.pieces(Us, PAWN)) & ~pos.pieces();
568     b |= shift<Up>(b & TRank3BB) & ~pos.pieces();
569
570     // Keep only the squares which are relatively safe
571     b &= ~attackedBy[Them][PAWN] & safe;
572
573     // Bonus for safe pawn threats on the next move
574     b = pawn_attacks_bb<Us>(b) & nonPawnEnemies;
575     score += ThreatByPawnPush * popcount(b);
576
577     // Bonus for threats on the next moves against enemy queen
578     if (pos.count<QUEEN>(Them) == 1)
579     {
580         Square s = pos.square<QUEEN>(Them);
581         safe = mobilityArea[Us] & ~stronglyProtected;
582
583         b = attackedBy[Us][KNIGHT] & attacks_bb<KNIGHT>(s);
584
585         score += KnightOnQueen * popcount(b & safe);
586
587         b =  (attackedBy[Us][BISHOP] & attacks_bb<BISHOP>(s, pos.pieces()))
588            | (attackedBy[Us][ROOK  ] & attacks_bb<ROOK  >(s, pos.pieces()));
589
590         score += SliderOnQueen * popcount(b & safe & attackedBy2[Us]);
591     }
592
593     if (T)
594         Trace::add(THREAT, Us, score);
595
596     return score;
597   }
598
599   // Evaluation::passed() evaluates the passed pawns and candidate passed
600   // pawns of the given color.
601
602   template<Tracing T> template<Color Us>
603   Score Evaluation<T>::passed() const {
604
605     constexpr Color     Them = ~Us;
606     constexpr Direction Up   = pawn_push(Us);
607     constexpr Direction Down = -Up;
608
609     auto king_proximity = [&](Color c, Square s) {
610       return std::min(distance(pos.square<KING>(c), s), 5);
611     };
612
613     Bitboard b, bb, squaresToQueen, unsafeSquares, blockedPassers, helpers;
614     Score score = SCORE_ZERO;
615
616     b = pe->passed_pawns(Us);
617
618     blockedPassers = b & shift<Down>(pos.pieces(Them, PAWN));
619     if (blockedPassers)
620     {
621         helpers =  shift<Up>(pos.pieces(Us, PAWN))
622                  & ~pos.pieces(Them)
623                  & (~attackedBy2[Them] | attackedBy[Us][ALL_PIECES]);
624
625         // Remove blocked candidate passers that don't have help to pass
626         b &=  ~blockedPassers
627             | shift<WEST>(helpers)
628             | shift<EAST>(helpers);
629     }
630
631     while (b)
632     {
633         Square s = pop_lsb(&b);
634
635         assert(!(pos.pieces(Them, PAWN) & forward_file_bb(Us, s + Up)));
636
637         int r = relative_rank(Us, s);
638
639         Score bonus = PassedRank[r];
640
641         if (r > RANK_3)
642         {
643             int w = 5 * r - 13;
644             Square blockSq = s + Up;
645
646             // Adjust bonus based on the king's proximity
647             bonus += make_score(0, (  (king_proximity(Them, blockSq) * 19) / 4
648                                      - king_proximity(Us,   blockSq) *  2) * w);
649
650             // If blockSq is not the queening square then consider also a second push
651             if (r != RANK_7)
652                 bonus -= make_score(0, king_proximity(Us, blockSq + Up) * w);
653
654             // If the pawn is free to advance, then increase the bonus
655             if (pos.empty(blockSq))
656             {
657                 squaresToQueen = forward_file_bb(Us, s);
658                 unsafeSquares = passed_pawn_span(Us, s);
659
660                 bb = forward_file_bb(Them, s) & pos.pieces(ROOK, QUEEN);
661
662                 if (!(pos.pieces(Them) & bb))
663                     unsafeSquares &= attackedBy[Them][ALL_PIECES];
664
665                 // If there are no enemy attacks on passed pawn span, assign a big bonus.
666                 // Otherwise assign a smaller bonus if the path to queen is not attacked
667                 // and even smaller bonus if it is attacked but block square is not.
668                 int k = !unsafeSquares                    ? 35 :
669                         !(unsafeSquares & squaresToQueen) ? 20 :
670                         !(unsafeSquares & blockSq)        ?  9 :
671                                                              0 ;
672
673                 // Assign a larger bonus if the block square is defended
674                 if ((pos.pieces(Us) & bb) || (attackedBy[Us][ALL_PIECES] & blockSq))
675                     k += 5;
676
677                 bonus += make_score(k * w, k * w);
678             }
679         } // r > RANK_3
680
681         score += bonus - PassedFile * edge_distance(file_of(s));
682     }
683
684     if (T)
685         Trace::add(PASSED, Us, score);
686
687     return score;
688   }
689
690
691   // Evaluation::space() computes a space evaluation for a given side, aiming to improve game
692   // play in the opening. It is based on the number of safe squares on the 4 central files
693   // on ranks 2 to 4. Completely safe squares behind a friendly pawn are counted twice.
694   // Finally, the space bonus is multiplied by a weight which decreases according to occupancy.
695
696   template<Tracing T> template<Color Us>
697   Score Evaluation<T>::space() const {
698
699     // Early exit if, for example, both queens or 6 minor pieces have been exchanged
700     if (pos.non_pawn_material() < SpaceThreshold)
701         return SCORE_ZERO;
702
703     constexpr Color Them     = ~Us;
704     constexpr Direction Down = -pawn_push(Us);
705     constexpr Bitboard SpaceMask =
706       Us == WHITE ? CenterFiles & (Rank2BB | Rank3BB | Rank4BB)
707                   : CenterFiles & (Rank7BB | Rank6BB | Rank5BB);
708
709     // Find the available squares for our pieces inside the area defined by SpaceMask
710     Bitboard safe =   SpaceMask
711                    & ~pos.pieces(Us, PAWN)
712                    & ~attackedBy[Them][PAWN];
713
714     // Find all squares which are at most three squares behind some friendly pawn
715     Bitboard behind = pos.pieces(Us, PAWN);
716     behind |= shift<Down>(behind);
717     behind |= shift<Down+Down>(behind);
718
719     int bonus = popcount(safe) + popcount(behind & safe & ~attackedBy[Them][ALL_PIECES]);
720     int weight = pos.count<ALL_PIECES>(Us) - 3 + std::min(pe->blocked_count(), 9);
721     Score score = make_score(bonus * weight * weight / 16, 0);
722
723     if (T)
724         Trace::add(SPACE, Us, score);
725
726     return score;
727   }
728
729
730   // Evaluation::winnable() adjusts the midgame and endgame score components, based on
731   // the known attacking/defending status of the players. The final value is derived
732   // by interpolation from the midgame and endgame values.
733
734   template<Tracing T>
735   Value Evaluation<T>::winnable(Score score) const {
736
737     int outflanking =  distance<File>(pos.square<KING>(WHITE), pos.square<KING>(BLACK))
738                      - distance<Rank>(pos.square<KING>(WHITE), pos.square<KING>(BLACK));
739
740     bool pawnsOnBothFlanks =   (pos.pieces(PAWN) & QueenSide)
741                             && (pos.pieces(PAWN) & KingSide);
742
743     bool almostUnwinnable =   outflanking < 0
744                            && !pawnsOnBothFlanks;
745
746     bool infiltration =   rank_of(pos.square<KING>(WHITE)) > RANK_4
747                        || rank_of(pos.square<KING>(BLACK)) < RANK_5;
748
749     // Compute the initiative bonus for the attacking side
750     int complexity =   9 * pe->passed_count()
751                     + 12 * pos.count<PAWN>()
752                     +  9 * outflanking
753                     + 21 * pawnsOnBothFlanks
754                     + 24 * infiltration
755                     + 51 * !pos.non_pawn_material()
756                     - 43 * almostUnwinnable
757                     -110 ;
758
759     Value mg = mg_value(score);
760     Value eg = eg_value(score);
761
762     // Now apply the bonus: note that we find the attacking side by extracting the
763     // sign of the midgame or endgame values, and that we carefully cap the bonus
764     // so that the midgame and endgame scores do not change sign after the bonus.
765     int u = ((mg > 0) - (mg < 0)) * Utility::clamp(complexity + 50, -abs(mg), 0);
766     int v = ((eg > 0) - (eg < 0)) * std::max(complexity, -abs(eg));
767
768     mg += u;
769     eg += v;
770
771     // Compute the scale factor for the winning side
772     Color strongSide = eg > VALUE_DRAW ? WHITE : BLACK;
773     int sf = me->scale_factor(pos, strongSide);
774
775     // If scale factor is not already specific, scale down via general heuristics
776     if (sf == SCALE_FACTOR_NORMAL)
777     {
778         if (pos.opposite_bishops())
779         {
780             if (   pos.non_pawn_material(WHITE) == BishopValueMg
781                 && pos.non_pawn_material(BLACK) == BishopValueMg)
782                 sf = 18 + 4 * popcount(pe->passed_pawns(strongSide));
783             else
784                 sf = 22 + 3 * pos.count<ALL_PIECES>(strongSide);
785         }
786         else if (  pos.non_pawn_material(WHITE) == RookValueMg
787                 && pos.non_pawn_material(BLACK) == RookValueMg
788                 && pos.count<PAWN>(strongSide) - pos.count<PAWN>(~strongSide) <= 1
789                 && bool(KingSide & pos.pieces(strongSide, PAWN)) != bool(QueenSide & pos.pieces(strongSide, PAWN))
790                 && (attacks_bb<KING>(pos.square<KING>(~strongSide)) & pos.pieces(~strongSide, PAWN)))
791             sf = 36;
792         else if (pos.count<QUEEN>() == 1)
793             sf = 37 + 3 * (pos.count<QUEEN>(WHITE) == 1 ? pos.count<BISHOP>(BLACK) + pos.count<KNIGHT>(BLACK)
794                                                         : pos.count<BISHOP>(WHITE) + pos.count<KNIGHT>(WHITE));
795         else
796             sf = std::min(sf, 36 + 7 * pos.count<PAWN>(strongSide));
797     }
798
799     // Interpolate between the middlegame and (scaled by 'sf') endgame score
800     v =  mg * int(me->game_phase())
801        + eg * int(PHASE_MIDGAME - me->game_phase()) * ScaleFactor(sf) / SCALE_FACTOR_NORMAL;
802     v /= PHASE_MIDGAME;
803
804     if (T)
805     {
806         Trace::add(WINNABLE, make_score(u, eg * ScaleFactor(sf) / SCALE_FACTOR_NORMAL - eg_value(score)));
807         Trace::add(TOTAL, make_score(mg, eg * ScaleFactor(sf) / SCALE_FACTOR_NORMAL));
808     }
809
810     return Value(v);
811   }
812
813
814   // Evaluation::value() is the main function of the class. It computes the various
815   // parts of the evaluation and returns the value of the position from the point
816   // of view of the side to move.
817
818   template<Tracing T>
819   Value Evaluation<T>::value() {
820
821     assert(!pos.checkers());
822
823     // Probe the material hash table
824     me = Material::probe(pos);
825
826     // If we have a specialized evaluation function for the current material
827     // configuration, call it and return.
828     if (me->specialized_eval_exists())
829         return me->evaluate(pos);
830
831     // Initialize score by reading the incrementally updated scores included in
832     // the position object (material + piece square tables) and the material
833     // imbalance. Score is computed internally from the white point of view.
834     Score score = pos.psq_score() + me->imbalance() + pos.this_thread()->contempt;
835
836     // Probe the pawn hash table
837     pe = Pawns::probe(pos);
838     score += pe->pawn_score(WHITE) - pe->pawn_score(BLACK);
839
840     // Early exit if score is high
841     auto lazy_skip = [&](Value lazyThreshold) {
842         return abs(mg_value(score) + eg_value(score)) / 2 > lazyThreshold + pos.non_pawn_material() / 64;
843     };
844
845     if (lazy_skip(LazyThreshold1))
846         goto make_v;
847
848     // Main evaluation begins here
849     initialize<WHITE>();
850     initialize<BLACK>();
851
852     // Pieces evaluated first (also populates attackedBy, attackedBy2).
853     // Note that the order of evaluation of the terms is left unspecified.
854     score +=  pieces<WHITE, KNIGHT>() - pieces<BLACK, KNIGHT>()
855             + pieces<WHITE, BISHOP>() - pieces<BLACK, BISHOP>()
856             + pieces<WHITE, ROOK  >() - pieces<BLACK, ROOK  >()
857             + pieces<WHITE, QUEEN >() - pieces<BLACK, QUEEN >();
858
859     score += mobility[WHITE] - mobility[BLACK];
860
861     // More complex interactions that require fully populated attack bitboards
862     score +=  king<   WHITE>() - king<   BLACK>()
863             + passed< WHITE>() - passed< BLACK>();
864
865     if (lazy_skip(LazyThreshold2))
866         goto make_v;
867
868     score +=  threats<WHITE>() - threats<BLACK>()
869             + space<  WHITE>() - space<  BLACK>();
870
871 make_v:
872     // Derive single value from mg and eg parts of score
873     Value v = winnable(score);
874
875     // In case of tracing add all remaining individual evaluation terms
876     if (T)
877     {
878         Trace::add(MATERIAL, pos.psq_score());
879         Trace::add(IMBALANCE, me->imbalance());
880         Trace::add(PAWN, pe->pawn_score(WHITE), pe->pawn_score(BLACK));
881         Trace::add(MOBILITY, mobility[WHITE], mobility[BLACK]);
882     }
883
884     // Evaluation grain
885     v = (v / 16) * 16;
886
887     // Side to move point of view
888     v = (pos.side_to_move() == WHITE ? v : -v) + Tempo;
889
890     // Damp down the evaluation linearly when shuffling
891     v = v * (100 - pos.rule50_count()) / 100;
892
893     return v;
894   }
895
896 } // namespace
897
898
899 /// evaluate() is the evaluator for the outer world. It returns a static
900 /// evaluation of the position from the point of view of the side to move.
901
902 Value Eval::evaluate(const Position& pos) {
903   return Evaluation<NO_TRACE>(pos).value();
904 }
905
906
907 /// trace() is like evaluate(), but instead of returning a value, it returns
908 /// a string (suitable for outputting to stdout) that contains the detailed
909 /// descriptions and values of each evaluation term. Useful for debugging.
910
911 std::string Eval::trace(const Position& pos) {
912
913   if (pos.checkers())
914       return "Total evaluation: none (in check)";
915
916   std::memset(scores, 0, sizeof(scores));
917
918   pos.this_thread()->contempt = SCORE_ZERO; // Reset any dynamic contempt
919
920   Value v = Evaluation<TRACE>(pos).value();
921
922   v = pos.side_to_move() == WHITE ? v : -v; // Trace scores are from white's point of view
923
924   std::stringstream ss;
925   ss << std::showpoint << std::noshowpos << std::fixed << std::setprecision(2)
926      << "     Term    |    White    |    Black    |    Total   \n"
927      << "             |   MG    EG  |   MG    EG  |   MG    EG \n"
928      << " ------------+-------------+-------------+------------\n"
929      << "    Material | " << Term(MATERIAL)
930      << "   Imbalance | " << Term(IMBALANCE)
931      << "       Pawns | " << Term(PAWN)
932      << "     Knights | " << Term(KNIGHT)
933      << "     Bishops | " << Term(BISHOP)
934      << "       Rooks | " << Term(ROOK)
935      << "      Queens | " << Term(QUEEN)
936      << "    Mobility | " << Term(MOBILITY)
937      << " King safety | " << Term(KING)
938      << "     Threats | " << Term(THREAT)
939      << "      Passed | " << Term(PASSED)
940      << "       Space | " << Term(SPACE)
941      << "    Winnable | " << Term(WINNABLE)
942      << " ------------+-------------+-------------+------------\n"
943      << "       Total | " << Term(TOTAL);
944
945   ss << "\nFinal evaluation: " << to_cp(v) << " (white side)\n";
946
947   return ss.str();
948 }