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