]> git.sesse.net Git - stockfish/blob - src/evaluate.cpp
2c5f130343ecc1f58bbe02a0eaaaad1928faa7eb
[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-2017 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
32 namespace {
33
34   namespace Trace {
35
36     enum Term { // The first 8 entries are for PieceType
37       MATERIAL = 8, IMBALANCE, MOBILITY, THREAT, PASSED, SPACE, TOTAL, TERM_NB
38     };
39
40     double scores[TERM_NB][COLOR_NB][PHASE_NB];
41
42     double to_cp(Value v) { return double(v) / PawnValueEg; }
43
44     void add(int idx, Color c, Score s) {
45       scores[idx][c][MG] = to_cp(mg_value(s));
46       scores[idx][c][EG] = to_cp(eg_value(s));
47     }
48
49     void add(int idx, Score w, Score b = SCORE_ZERO) {
50       add(idx, WHITE, w); add(idx, BLACK, b);
51     }
52
53     std::ostream& operator<<(std::ostream& os, Term t) {
54
55       if (t == MATERIAL || t == IMBALANCE || t == Term(PAWN) || t == TOTAL)
56           os << "  ---   --- |   ---   --- | ";
57       else
58           os << std::setw(5) << scores[t][WHITE][MG] << " "
59              << std::setw(5) << scores[t][WHITE][EG] << " | "
60              << std::setw(5) << scores[t][BLACK][MG] << " "
61              << std::setw(5) << scores[t][BLACK][EG] << " | ";
62
63       os << std::setw(5) << scores[t][WHITE][MG] - scores[t][BLACK][MG] << " "
64          << std::setw(5) << scores[t][WHITE][EG] - scores[t][BLACK][EG] << " \n";
65
66       return os;
67     }
68   }
69
70   using namespace Trace;
71
72   // Struct EvalInfo contains various information computed and collected
73   // by the evaluation functions.
74   struct EvalInfo {
75
76     Material::Entry* me;
77     Pawns::Entry* pe;
78     Bitboard mobilityArea[COLOR_NB];
79
80     // attackedBy[color][piece type] is a bitboard representing all squares
81     // attacked by a given color and piece type (can be also ALL_PIECES).
82     Bitboard attackedBy[COLOR_NB][PIECE_TYPE_NB];
83
84     // attackedBy2[color] are the squares attacked by 2 pieces of a given color,
85     // possibly via x-ray or by one pawn and one piece. Diagonal x-ray through
86     // pawn or squares attacked by 2 pawns are not explicitly added.
87     Bitboard attackedBy2[COLOR_NB];
88
89     // kingRing[color] is the zone around the king which is considered
90     // by the king safety evaluation. This consists of the squares directly
91     // adjacent to the king, and the three (or two, for a king on an edge file)
92     // squares two ranks in front of the king. For instance, if black's king
93     // is on g8, kingRing[BLACK] is a bitboard containing the squares f8, h8,
94     // f7, g7, h7, f6, g6 and h6.
95     Bitboard kingRing[COLOR_NB];
96
97     // kingAttackersCount[color] is the number of pieces of the given color
98     // which attack a square in the kingRing of the enemy king.
99     int kingAttackersCount[COLOR_NB];
100
101     // kingAttackersWeight[color] is the sum of the "weights" of the pieces of the
102     // given color which attack a square in the kingRing of the enemy king. The
103     // weights of the individual piece types are given by the elements in the
104     // KingAttackWeights array.
105     int kingAttackersWeight[COLOR_NB];
106
107     // kingAdjacentZoneAttacksCount[color] is the number of attacks by the given
108     // color to squares directly adjacent to the enemy king. Pieces which attack
109     // more than one square are counted multiple times. For instance, if there is
110     // a white knight on g5 and black's king is on g8, this white knight adds 2
111     // to kingAdjacentZoneAttacksCount[WHITE].
112     int kingAdjacentZoneAttacksCount[COLOR_NB];
113   };
114
115   #define V(v) Value(v)
116   #define S(mg, eg) make_score(mg, eg)
117
118   // MobilityBonus[PieceType][attacked] contains bonuses for middle and end game,
119   // indexed by piece type and number of attacked squares in the mobility area.
120   const Score MobilityBonus[][32] = {
121     {}, {},
122     { S(-75,-76), S(-56,-54), S( -9,-26), S( -2,-10), S(  6,  5), S( 15, 11), // Knights
123       S( 22, 26), S( 30, 28), S( 36, 29) },
124     { S(-48,-58), S(-21,-19), S( 16, -2), S( 26, 12), S( 37, 22), S( 51, 42), // Bishops
125       S( 54, 54), S( 63, 58), S( 65, 63), S( 71, 70), S( 79, 74), S( 81, 86),
126       S( 92, 90), S( 97, 94) },
127     { S(-56,-78), S(-25,-18), S(-11, 26), S( -5, 55), S( -4, 70), S( -1, 81), // Rooks
128       S(  8,109), S( 14,120), S( 21,128), S( 23,143), S( 31,154), S( 32,160),
129       S( 43,165), S( 49,168), S( 59,169) },
130     { S(-40,-35), S(-25,-12), S(  2,  7), S(  4, 19), S( 14, 37), S( 24, 55), // Queens
131       S( 25, 62), S( 40, 76), S( 43, 79), S( 47, 87), S( 54, 94), S( 56,102),
132       S( 60,111), S( 70,116), S( 72,118), S( 73,122), S( 75,128), S( 77,130),
133       S( 85,133), S( 94,136), S( 99,140), S(108,157), S(112,158), S(113,161),
134       S(118,174), S(119,177), S(123,191), S(128,199) }
135   };
136
137   // Outpost[knight/bishop][supported by pawn] contains bonuses for minor
138   // pieces if they can reach an outpost square, bigger if that square is
139   // supported by a pawn. If the minor piece occupies an outpost square
140   // then score is doubled.
141   const Score Outpost[][2] = {
142     { S(22, 6), S(33, 9) }, // Knight
143     { S( 9, 2), S(14, 4) }  // Bishop
144   };
145
146   // RookOnFile[semiopen/open] contains bonuses for each rook when there is no
147   // friendly pawn on the rook file.
148   const Score RookOnFile[2] = { S(20, 7), S(45, 20) };
149
150   // ThreatBySafePawn[PieceType] contains bonuses according to which piece
151   // type is attacked by a pawn which is protected or is not attacked.
152   const Score ThreatBySafePawn[PIECE_TYPE_NB] = {
153     S(0, 0), S(0, 0), S(176, 139), S(131, 127), S(217, 218), S(203, 215)
154   };
155
156   // ThreatByMinor/ByRook[attacked PieceType] contains bonuses according to
157   // which piece type attacks which one. Attacks on lesser pieces which are
158   // pawn-defended are not considered.
159   const Score ThreatByMinor[PIECE_TYPE_NB] = {
160     S(0, 0), S(0, 33), S(45, 43), S(46, 47), S(72, 107), S(48, 118)
161   };
162
163   const Score ThreatByRook[PIECE_TYPE_NB] = {
164     S(0, 0), S(0, 25), S(40, 62), S(40, 59), S( 0, 34), S(35, 48)
165   };
166
167   // ThreatByKing[on one/on many] contains bonuses for king attacks on
168   // pawns or pieces which are not pawn-defended.
169   const Score ThreatByKing[2] = { S(3, 62), S(9, 138) };
170
171   // Passed[mg/eg][Rank] contains midgame and endgame bonuses for passed pawns.
172   // We don't use a Score because we process the two components independently.
173   const Value Passed[][RANK_NB] = {
174     { V(5), V( 5), V(31), V(73), V(166), V(252) },
175     { V(7), V(14), V(38), V(73), V(166), V(252) }
176   };
177
178   // PassedFile[File] contains a bonus according to the file of a passed pawn
179   const Score PassedFile[FILE_NB] = {
180     S(  9, 10), S( 2, 10), S( 1, -8), S(-20,-12),
181     S(-20,-12), S( 1, -8), S( 2, 10), S(  9, 10)
182   };
183
184   // Assorted bonuses and penalties used by evaluation
185   const Score MinorBehindPawn     = S(16,  0);
186   const Score BishopPawns         = S( 8, 12);
187   const Score RookOnPawn          = S( 8, 24);
188   const Score TrappedRook         = S(92,  0);
189   const Score WeakQueen           = S(50, 10);
190   const Score OtherCheck          = S(10, 10);
191   const Score CloseEnemies        = S( 7,  0);
192   const Score PawnlessFlank       = S(20, 80);
193   const Score LooseEnemies        = S( 0, 25);
194   const Score ThreatByHangingPawn = S(71, 61);
195   const Score ThreatByRank        = S(16,  3);
196   const Score Hanging             = S(48, 27);
197   const Score ThreatByPawnPush    = S(38, 22);
198   const Score HinderPassedPawn    = S( 7,  0);
199
200   // Penalty for a bishop on a1/h1 (a8/h8 for black) which is trapped by
201   // a friendly pawn on b2/g2 (b7/g7 for black). This can obviously only
202   // happen in Chess960 games.
203   const Score TrappedBishopA1H1 = S(50, 50);
204
205   #undef S
206   #undef V
207
208   // KingAttackWeights[PieceType] contains king attack weights by piece type
209   const int KingAttackWeights[PIECE_TYPE_NB] = { 0, 0, 78, 56, 45, 11 };
210
211   // Penalties for enemy's safe checks
212   const int QueenCheck        = 745;
213   const int RookCheck         = 688;
214   const int BishopCheck       = 588;
215   const int KnightCheck       = 924;
216
217   // Threshold for lazy evaluation
218   const Value LazyThreshold = Value(1500);
219
220   // eval_init() initializes king and attack bitboards for a given color
221   // adding pawn attacks. To be done at the beginning of the evaluation.
222
223   template<Color Us>
224   void eval_init(const Position& pos, EvalInfo& ei) {
225
226     const Color  Them = (Us == WHITE ? BLACK : WHITE);
227     const Square Up   = (Us == WHITE ? NORTH : SOUTH);
228     const Square Down = (Us == WHITE ? SOUTH : NORTH);
229     const Bitboard LowRanks = (Us == WHITE ? Rank2BB | Rank3BB: Rank7BB | Rank6BB);
230
231     // Find our pawns on the first two ranks, and those which are blocked
232     Bitboard b = pos.pieces(Us, PAWN) & (shift<Down>(pos.pieces()) | LowRanks);
233
234     // Squares occupied by those pawns, by our king, or controlled by enemy pawns
235     // are excluded from the mobility area.
236     ei.mobilityArea[Us] = ~(b | pos.square<KING>(Us) | ei.pe->pawn_attacks(Them));
237
238     // Initialise the attack bitboards with the king and pawn information
239     b = ei.attackedBy[Us][KING] = pos.attacks_from<KING>(pos.square<KING>(Us));
240     ei.attackedBy[Us][PAWN] = ei.pe->pawn_attacks(Us);
241
242     ei.attackedBy2[Us]            = b & ei.attackedBy[Us][PAWN];
243     ei.attackedBy[Us][ALL_PIECES] = b | ei.attackedBy[Us][PAWN];
244
245     // Init our king safety tables only if we are going to use them
246     if (pos.non_pawn_material(Them) >= QueenValueMg)
247     {
248         ei.kingRing[Us] = b | shift<Up>(b);
249         ei.kingAttackersCount[Them] = popcount(b & ei.pe->pawn_attacks(Them));
250         ei.kingAdjacentZoneAttacksCount[Them] = ei.kingAttackersWeight[Them] = 0;
251     }
252     else
253         ei.kingRing[Us] = ei.kingAttackersCount[Them] = 0;
254   }
255
256
257   // evaluate_pieces() assigns bonuses and penalties to the pieces of a given
258   // color and type.
259
260   template<bool DoTrace, Color Us = WHITE, PieceType Pt = KNIGHT>
261   Score evaluate_pieces(const Position& pos, EvalInfo& ei, Score* mobility) {
262
263     const PieceType NextPt = (Us == WHITE ? Pt : PieceType(Pt + 1));
264     const Color Them = (Us == WHITE ? BLACK : WHITE);
265     const Bitboard OutpostRanks = (Us == WHITE ? Rank4BB | Rank5BB | Rank6BB
266                                                : Rank5BB | Rank4BB | Rank3BB);
267     const Square* pl = pos.squares<Pt>(Us);
268
269     Bitboard b, bb;
270     Square s;
271     Score score = SCORE_ZERO;
272
273     ei.attackedBy[Us][Pt] = 0;
274
275     while ((s = *pl++) != SQ_NONE)
276     {
277         // Find attacked squares, including x-ray attacks for bishops and rooks
278         b = Pt == BISHOP ? attacks_bb<BISHOP>(s, pos.pieces() ^ pos.pieces(Us, QUEEN))
279           : Pt ==   ROOK ? attacks_bb<  ROOK>(s, pos.pieces() ^ pos.pieces(Us, ROOK, QUEEN))
280                          : pos.attacks_from<Pt>(s);
281
282         if (pos.pinned_pieces(Us) & s)
283             b &= LineBB[pos.square<KING>(Us)][s];
284
285         ei.attackedBy2[Us] |= ei.attackedBy[Us][ALL_PIECES] & b;
286         ei.attackedBy[Us][ALL_PIECES] |= ei.attackedBy[Us][Pt] |= b;
287
288         if (b & ei.kingRing[Them])
289         {
290             ei.kingAttackersCount[Us]++;
291             ei.kingAttackersWeight[Us] += KingAttackWeights[Pt];
292             ei.kingAdjacentZoneAttacksCount[Us] += popcount(b & ei.attackedBy[Them][KING]);
293         }
294
295         int mob = popcount(b & ei.mobilityArea[Us]);
296
297         mobility[Us] += MobilityBonus[Pt][mob];
298
299         if (Pt == BISHOP || Pt == KNIGHT)
300         {
301             // Bonus for outpost squares
302             bb = OutpostRanks & ~ei.pe->pawn_attacks_span(Them);
303             if (bb & s)
304                 score += Outpost[Pt == BISHOP][!!(ei.attackedBy[Us][PAWN] & s)] * 2;
305             else
306             {
307                 bb &= b & ~pos.pieces(Us);
308                 if (bb)
309                    score += Outpost[Pt == BISHOP][!!(ei.attackedBy[Us][PAWN] & bb)];
310             }
311
312             // Bonus when behind a pawn
313             if (    relative_rank(Us, s) < RANK_5
314                 && (pos.pieces(PAWN) & (s + pawn_push(Us))))
315                 score += MinorBehindPawn;
316
317             // Penalty for pawns on the same color square as the bishop
318             if (Pt == BISHOP)
319                 score -= BishopPawns * ei.pe->pawns_on_same_color_squares(Us, s);
320
321             // An important Chess960 pattern: A cornered bishop blocked by a friendly
322             // pawn diagonally in front of it is a very serious problem, especially
323             // when that pawn is also blocked.
324             if (   Pt == BISHOP
325                 && pos.is_chess960()
326                 && (s == relative_square(Us, SQ_A1) || s == relative_square(Us, SQ_H1)))
327             {
328                 Square 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))                ? TrappedBishopA1H1 * 4
331                             : pos.piece_on(s + d + d) == make_piece(Us, PAWN) ? TrappedBishopA1H1 * 2
332                                                                               : TrappedBishopA1H1;
333             }
334         }
335
336         if (Pt == ROOK)
337         {
338             // Bonus for aligning with enemy pawns on the same rank/file
339             if (relative_rank(Us, s) >= RANK_5)
340                 score += RookOnPawn * popcount(pos.pieces(Them, PAWN) & PseudoAttacks[ROOK][s]);
341
342             // Bonus when on an open or semi-open file
343             if (ei.pe->semiopen_file(Us, file_of(s)))
344                 score += RookOnFile[!!ei.pe->semiopen_file(Them, file_of(s))];
345
346             // Penalty when trapped by the king, even more if the king cannot castle
347             else if (mob <= 3)
348             {
349                 Square ksq = pos.square<KING>(Us);
350
351                 if (   ((file_of(ksq) < FILE_E) == (file_of(s) < file_of(ksq)))
352                     && !ei.pe->semiopen_side(Us, file_of(ksq), file_of(s) < file_of(ksq)))
353                     score -= (TrappedRook - make_score(mob * 22, 0)) * (1 + !pos.can_castle(Us));
354             }
355         }
356
357         if (Pt == QUEEN)
358         {
359             // Penalty if any relative pin or discovered attack against the queen
360             Bitboard pinners;
361             if (pos.slider_blockers(pos.pieces(Them, ROOK, BISHOP), s, pinners))
362                 score -= WeakQueen;
363         }
364     }
365
366     if (DoTrace)
367         Trace::add(Pt, Us, score);
368
369     // Recursively call evaluate_pieces() of next piece type until KING is excluded
370     return score - evaluate_pieces<DoTrace, Them, NextPt>(pos, ei, mobility);
371   }
372
373   template<>
374   Score evaluate_pieces<false, WHITE, KING>(const Position&, EvalInfo&, Score*) { return SCORE_ZERO; }
375   template<>
376   Score evaluate_pieces< true, WHITE, KING>(const Position&, EvalInfo&, Score*) { return SCORE_ZERO; }
377
378
379   // evaluate_king() assigns bonuses and penalties to a king of a given color
380
381   const Bitboard CenterFiles = FileCBB | FileDBB | FileEBB | FileFBB;
382
383   const Bitboard KingFlank[FILE_NB] = {
384     CenterFiles >> 2, CenterFiles >> 2, CenterFiles >> 2, CenterFiles, CenterFiles,
385     CenterFiles << 2, CenterFiles << 2, CenterFiles << 2
386   };
387
388   template<Color Us, bool DoTrace>
389   Score evaluate_king(const Position& pos, const EvalInfo& ei) {
390
391     const Color Them    = (Us == WHITE ? BLACK : WHITE);
392     const Square Up     = (Us == WHITE ? NORTH : SOUTH);
393     const Bitboard Camp = (Us == WHITE ? ~Bitboard(0) ^ Rank6BB ^ Rank7BB ^ Rank8BB
394                                        : ~Bitboard(0) ^ Rank1BB ^ Rank2BB ^ Rank3BB);
395
396     const Square ksq = pos.square<KING>(Us);
397     Bitboard undefended, b, b1, b2, safe, other;
398     int kingDanger;
399
400     // King shelter and enemy pawns storm
401     Score score = ei.pe->king_safety<Us>(pos, ksq);
402
403     // Main king safety evaluation
404     if (ei.kingAttackersCount[Them])
405     {
406         // Find the attacked squares which are defended only by our king...
407         undefended =   ei.attackedBy[Them][ALL_PIECES]
408                     &  ei.attackedBy[Us][KING]
409                     & ~ei.attackedBy2[Us];
410
411         // ... and those which are not defended at all in the larger king ring
412         b =  ei.attackedBy[Them][ALL_PIECES] & ~ei.attackedBy[Us][ALL_PIECES]
413            & ei.kingRing[Us] & ~pos.pieces(Them);
414
415         // Initialize the 'kingDanger' variable, which will be transformed
416         // later into a king danger score. The initial value is based on the
417         // number and types of the enemy's attacking pieces, the number of
418         // attacked and undefended squares around our king and the quality of
419         // the pawn shelter (current 'score' value).
420         kingDanger =  std::min(807, ei.kingAttackersCount[Them] * ei.kingAttackersWeight[Them])
421                     + 101 * ei.kingAdjacentZoneAttacksCount[Them]
422                     + 235 * popcount(undefended)
423                     + 134 * (popcount(b) + !!pos.pinned_pieces(Us))
424                     - 717 * !pos.count<QUEEN>(Them)
425                     -   7 * mg_value(score) / 5 - 5;
426
427         // Analyse the safe enemy's checks which are possible on next move
428         safe  = ~pos.pieces(Them);
429         safe &= ~ei.attackedBy[Us][ALL_PIECES] | (undefended & ei.attackedBy2[Them]);
430
431         b1 = pos.attacks_from<ROOK  >(ksq);
432         b2 = pos.attacks_from<BISHOP>(ksq);
433
434         // Enemy queen safe checks
435         if ((b1 | b2) & ei.attackedBy[Them][QUEEN] & safe)
436             kingDanger += QueenCheck;
437
438         // For minors and rooks, also consider the square safe if attacked twice,
439         // and only defended by our queen.
440         safe |=  ei.attackedBy2[Them]
441                & ~(ei.attackedBy2[Us] | pos.pieces(Them))
442                & ei.attackedBy[Us][QUEEN];
443
444         // Some other potential checks are also analysed, even from squares
445         // currently occupied by the opponent own pieces, as long as the square
446         // is not attacked by our pawns, and is not occupied by a blocked pawn.
447         other = ~(   ei.attackedBy[Us][PAWN]
448                   | (pos.pieces(Them, PAWN) & shift<Up>(pos.pieces(PAWN))));
449
450         // Enemy rooks safe and other checks
451         if (b1 & ei.attackedBy[Them][ROOK] & safe)
452             kingDanger += RookCheck;
453
454         else if (b1 & ei.attackedBy[Them][ROOK] & other)
455             score -= OtherCheck;
456
457         // Enemy bishops safe and other checks
458         if (b2 & ei.attackedBy[Them][BISHOP] & safe)
459             kingDanger += BishopCheck;
460
461         else if (b2 & ei.attackedBy[Them][BISHOP] & other)
462             score -= OtherCheck;
463
464         // Enemy knights safe and other checks
465         b = pos.attacks_from<KNIGHT>(ksq) & ei.attackedBy[Them][KNIGHT];
466         if (b & safe)
467             kingDanger += KnightCheck;
468
469         else if (b & other)
470             score -= OtherCheck;
471
472         // Transform the kingDanger units into a Score, and substract it from the evaluation
473         if (kingDanger > 0)
474             score -= make_score(std::min(kingDanger * kingDanger / 4096,  2 * int(BishopValueMg)), 0);
475     }
476
477     // King tropism: firstly, find squares that opponent attacks in our king flank
478     File kf = file_of(ksq);
479     b = ei.attackedBy[Them][ALL_PIECES] & KingFlank[kf] & Camp;
480
481     assert(((Us == WHITE ? b << 4 : b >> 4) & b) == 0);
482     assert(popcount(Us == WHITE ? b << 4 : b >> 4) == popcount(b));
483
484     // Secondly, add the squares which are attacked twice in that flank and
485     // which are not defended by our pawns.
486     b =  (Us == WHITE ? b << 4 : b >> 4)
487        | (b & ei.attackedBy2[Them] & ~ei.attackedBy[Us][PAWN]);
488
489     score -= CloseEnemies * popcount(b);
490
491     // Penalty when our king is on a pawnless flank
492     if (!(pos.pieces(PAWN) & KingFlank[kf]))
493         score -= PawnlessFlank;
494
495     if (DoTrace)
496         Trace::add(KING, Us, score);
497
498     return score;
499   }
500
501
502   // evaluate_threats() assigns bonuses according to the types of the attacking
503   // and the attacked pieces.
504
505   template<Color Us, bool DoTrace>
506   Score evaluate_threats(const Position& pos, const EvalInfo& ei) {
507
508     const Color Them        = (Us == WHITE ? BLACK      : WHITE);
509     const Square Up         = (Us == WHITE ? NORTH      : SOUTH);
510     const Square Left       = (Us == WHITE ? NORTH_WEST : SOUTH_EAST);
511     const Square Right      = (Us == WHITE ? NORTH_EAST : SOUTH_WEST);
512     const Bitboard TRank2BB = (Us == WHITE ? Rank2BB    : Rank7BB);
513     const Bitboard TRank7BB = (Us == WHITE ? Rank7BB    : Rank2BB);
514
515     Bitboard b, weak, defended, safeThreats;
516     Score score = SCORE_ZERO;
517
518     // Small bonus if the opponent has loose pawns or pieces
519     if (   (pos.pieces(Them) ^ pos.pieces(Them, QUEEN, KING))
520         & ~(ei.attackedBy[Us][ALL_PIECES] | ei.attackedBy[Them][ALL_PIECES]))
521         score += LooseEnemies;
522
523     // Non-pawn enemies attacked by a pawn
524     weak = (pos.pieces(Them) ^ pos.pieces(Them, PAWN)) & ei.attackedBy[Us][PAWN];
525
526     if (weak)
527     {
528         b = pos.pieces(Us, PAWN) & ( ~ei.attackedBy[Them][ALL_PIECES]
529                                     | ei.attackedBy[Us][ALL_PIECES]);
530
531         safeThreats = (shift<Right>(b) | shift<Left>(b)) & weak;
532
533         if (weak ^ safeThreats)
534             score += ThreatByHangingPawn;
535
536         while (safeThreats)
537             score += ThreatBySafePawn[type_of(pos.piece_on(pop_lsb(&safeThreats)))];
538     }
539
540     // Non-pawn enemies defended by a pawn
541     defended = (pos.pieces(Them) ^ pos.pieces(Them, PAWN)) & ei.attackedBy[Them][PAWN];
542
543     // Enemies not defended by a pawn and under our attack
544     weak =   pos.pieces(Them)
545           & ~ei.attackedBy[Them][PAWN]
546           &  ei.attackedBy[Us][ALL_PIECES];
547
548     // Add a bonus according to the kind of attacking pieces
549     if (defended | weak)
550     {
551         b = (defended | weak) & (ei.attackedBy[Us][KNIGHT] | ei.attackedBy[Us][BISHOP]);
552         while (b)
553         {
554             Square s = pop_lsb(&b);
555             score += ThreatByMinor[type_of(pos.piece_on(s))];
556             if (type_of(pos.piece_on(s)) != PAWN)
557                 score += ThreatByRank * (int)relative_rank(Them, s);
558         }
559
560         b = (pos.pieces(Them, QUEEN) | weak) & ei.attackedBy[Us][ROOK];
561         while (b)
562         {
563             Square s = pop_lsb(&b);
564             score += ThreatByRook[type_of(pos.piece_on(s))];
565             if (type_of(pos.piece_on(s)) != PAWN)
566                 score += ThreatByRank * (int)relative_rank(Them, s);
567         }
568
569         score += Hanging * popcount(weak & ~ei.attackedBy[Them][ALL_PIECES]);
570
571         b = weak & ei.attackedBy[Us][KING];
572         if (b)
573             score += ThreatByKing[more_than_one(b)];
574     }
575
576     // Bonus if some pawns can safely push and attack an enemy piece
577     b = pos.pieces(Us, PAWN) & ~TRank7BB;
578     b = shift<Up>(b | (shift<Up>(b & TRank2BB) & ~pos.pieces()));
579
580     b &=  ~pos.pieces()
581         & ~ei.attackedBy[Them][PAWN]
582         & (ei.attackedBy[Us][ALL_PIECES] | ~ei.attackedBy[Them][ALL_PIECES]);
583
584     b =  (shift<Left>(b) | shift<Right>(b))
585        &  pos.pieces(Them)
586        & ~ei.attackedBy[Us][PAWN];
587
588     score += ThreatByPawnPush * popcount(b);
589
590     if (DoTrace)
591         Trace::add(THREAT, Us, score);
592
593     return score;
594   }
595
596
597   // evaluate_passer_pawns() evaluates the passed pawns and candidate passed
598   // pawns of the given color.
599
600   template<Color Us, bool DoTrace>
601   Score evaluate_passer_pawns(const Position& pos, const EvalInfo& ei) {
602
603     const Color Them = (Us == WHITE ? BLACK : WHITE);
604
605     Bitboard b, bb, squaresToQueen, defendedSquares, unsafeSquares;
606     Score score = SCORE_ZERO;
607
608     b = ei.pe->passed_pawns(Us);
609
610     while (b)
611     {
612         Square s = pop_lsb(&b);
613
614         assert(!(pos.pieces(PAWN) & forward_bb(Us, s)));
615
616         bb = forward_bb(Us, s) & (ei.attackedBy[Them][ALL_PIECES] | pos.pieces(Them));
617         score -= HinderPassedPawn * popcount(bb);
618
619         int r = relative_rank(Us, s) - RANK_2;
620         int rr = r * (r - 1);
621
622         Value mbonus = Passed[MG][r], ebonus = Passed[EG][r];
623
624         if (rr)
625         {
626             Square blockSq = s + pawn_push(Us);
627
628             // Adjust bonus based on the king's proximity
629             ebonus +=  distance(pos.square<KING>(Them), blockSq) * 5 * rr
630                      - distance(pos.square<KING>(Us  ), blockSq) * 2 * rr;
631
632             // If blockSq is not the queening square then consider also a second push
633             if (relative_rank(Us, blockSq) != RANK_8)
634                 ebonus -= distance(pos.square<KING>(Us), blockSq + pawn_push(Us)) * rr;
635
636             // If the pawn is free to advance, then increase the bonus
637             if (pos.empty(blockSq))
638             {
639                 // If there is a rook or queen attacking/defending the pawn from behind,
640                 // consider all the squaresToQueen. Otherwise consider only the squares
641                 // in the pawn's path attacked or occupied by the enemy.
642                 defendedSquares = unsafeSquares = squaresToQueen = forward_bb(Us, s);
643
644                 bb = forward_bb(Them, s) & pos.pieces(ROOK, QUEEN) & pos.attacks_from<ROOK>(s);
645
646                 if (!(pos.pieces(Us) & bb))
647                     defendedSquares &= ei.attackedBy[Us][ALL_PIECES];
648
649                 if (!(pos.pieces(Them) & bb))
650                     unsafeSquares &= ei.attackedBy[Them][ALL_PIECES] | pos.pieces(Them);
651
652                 // If there aren't any enemy attacks, assign a big bonus. Otherwise
653                 // assign a smaller bonus if the block square isn't attacked.
654                 int k = !unsafeSquares ? 18 : !(unsafeSquares & blockSq) ? 8 : 0;
655
656                 // If the path to the queen is fully defended, assign a big bonus.
657                 // Otherwise assign a smaller bonus if the block square is defended.
658                 if (defendedSquares == squaresToQueen)
659                     k += 6;
660
661                 else if (defendedSquares & blockSq)
662                     k += 4;
663
664                 mbonus += k * rr, ebonus += k * rr;
665             }
666             else if (pos.pieces(Us) & blockSq)
667                 mbonus += rr + r * 2, ebonus += rr + r * 2;
668         } // rr != 0
669
670         // Assign a small bonus when the opponent has no pieces left
671         if (!pos.non_pawn_material(Them))
672             ebonus += 20;
673
674         // Scale down bonus for candidate passers which need more than one pawn
675         // push to become passed.
676         if (!pos.pawn_passed(Us, s + pawn_push(Us)))
677             mbonus /= 2, ebonus /= 2;
678
679         score += make_score(mbonus, ebonus) + PassedFile[file_of(s)];
680     }
681
682     if (DoTrace)
683         Trace::add(PASSED, Us, score);
684
685     // Add the scores to the middlegame and endgame eval
686     return score;
687   }
688
689
690   // evaluate_space() computes the space evaluation for a given side. The
691   // space evaluation is a simple bonus based on the number of safe squares
692   // available for minor pieces on the central four files on ranks 2--4. Safe
693   // squares one, two or three squares behind a friendly pawn are counted
694   // twice. Finally, the space bonus is multiplied by a weight. The aim is to
695   // improve play on game opening.
696   template<Color Us>
697   Score evaluate_space(const Position& pos, const EvalInfo& ei) {
698
699     const Color Them = (Us == WHITE ? BLACK : WHITE);
700     const Bitboard SpaceMask =
701       Us == WHITE ? CenterFiles & (Rank2BB | Rank3BB | Rank4BB)
702                   : CenterFiles & (Rank7BB | Rank6BB | Rank5BB);
703
704     // Find the safe squares for our pieces inside the area defined by
705     // SpaceMask. A square is unsafe if it is attacked by an enemy
706     // pawn, or if it is undefended and attacked by an enemy piece.
707     Bitboard safe =   SpaceMask
708                    & ~pos.pieces(Us, PAWN)
709                    & ~ei.attackedBy[Them][PAWN]
710                    & (ei.attackedBy[Us][ALL_PIECES] | ~ei.attackedBy[Them][ALL_PIECES]);
711
712     // Find all squares which are at most three squares behind some friendly pawn
713     Bitboard behind = pos.pieces(Us, PAWN);
714     behind |= (Us == WHITE ? behind >>  8 : behind <<  8);
715     behind |= (Us == WHITE ? behind >> 16 : behind << 16);
716
717     // Since SpaceMask[Us] is fully on our half of the board...
718     assert(unsigned(safe >> (Us == WHITE ? 32 : 0)) == 0);
719
720     // ...count safe + (behind & safe) with a single popcount.
721     int bonus = popcount((Us == WHITE ? safe << 32 : safe >> 32) | (behind & safe));
722     bonus = std::min(16, bonus);
723     int weight = pos.count<ALL_PIECES>(Us) - 2 * ei.pe->open_files();
724
725     return make_score(bonus * weight * weight / 18, 0);
726   }
727
728
729   // evaluate_initiative() computes the initiative correction value for the
730   // position, i.e., second order bonus/malus based on the known attacking/defending
731   // status of the players.
732   Score evaluate_initiative(const Position& pos, int asymmetry, Value eg) {
733
734     int kingDistance =  distance<File>(pos.square<KING>(WHITE), pos.square<KING>(BLACK))
735                       - distance<Rank>(pos.square<KING>(WHITE), pos.square<KING>(BLACK));
736     int pawns = pos.count<PAWN>(WHITE) + pos.count<PAWN>(BLACK);
737
738     // Compute the initiative bonus for the attacking side
739     int initiative = 8 * (asymmetry + kingDistance - 15) + 12 * pawns;
740
741     // Now apply the bonus: note that we find the attacking side by extracting
742     // the sign of the endgame value, and that we carefully cap the bonus so
743     // that the endgame score will never be divided by more than two.
744     int value = ((eg > 0) - (eg < 0)) * std::max(initiative, -abs(eg / 2));
745
746     return make_score(0, value);
747   }
748
749
750   // evaluate_scale_factor() computes the scale factor for the winning side
751   ScaleFactor evaluate_scale_factor(const Position& pos, const EvalInfo& ei, Value eg) {
752
753     Color strongSide = eg > VALUE_DRAW ? WHITE : BLACK;
754     ScaleFactor sf = ei.me->scale_factor(pos, strongSide);
755
756     // If we don't already have an unusual scale factor, check for certain
757     // types of endgames, and use a lower scale for those.
758     if (sf == SCALE_FACTOR_NORMAL || sf == SCALE_FACTOR_ONEPAWN)
759     {
760         if (pos.opposite_bishops())
761         {
762             // Endgame with opposite-colored bishops and no other pieces (ignoring pawns)
763             // is almost a draw, in case of KBP vs KB, it is even more a draw.
764             if (   pos.non_pawn_material(WHITE) == BishopValueMg
765                 && pos.non_pawn_material(BLACK) == BishopValueMg)
766                 return more_than_one(pos.pieces(PAWN)) ? ScaleFactor(31) : ScaleFactor(9);
767
768             // Endgame with opposite-colored bishops, but also other pieces. Still
769             // a bit drawish, but not as drawish as with only the two bishops.
770             return ScaleFactor(46);
771         }
772         // Endings where weaker side can place his king in front of the opponent's
773         // pawns are drawish.
774         else if (    abs(eg) <= BishopValueEg
775                  &&  pos.count<PAWN>(strongSide) <= 2
776                  && !pos.pawn_passed(~strongSide, pos.square<KING>(~strongSide)))
777             return ScaleFactor(37 + 7 * pos.count<PAWN>(strongSide));
778     }
779
780     return sf;
781   }
782
783 } // namespace
784
785
786 /// evaluate() is the main evaluation function. It returns a static evaluation
787 /// of the position from the point of view of the side to move.
788
789 template<bool DoTrace>
790 Value Eval::evaluate(const Position& pos) {
791
792   assert(!pos.checkers());
793
794   Score mobility[COLOR_NB] = { SCORE_ZERO, SCORE_ZERO };
795   Value v;
796   EvalInfo ei;
797
798   // Probe the material hash table
799   ei.me = Material::probe(pos);
800
801   // If we have a specialized evaluation function for the current material
802   // configuration, call it and return.
803   if (ei.me->specialized_eval_exists())
804       return ei.me->evaluate(pos);
805
806   // Initialize score by reading the incrementally updated scores included in
807   // the position object (material + piece square tables) and the material
808   // imbalance. Score is computed internally from the white point of view.
809   Score score = pos.psq_score() + ei.me->imbalance();
810
811   // Probe the pawn hash table
812   ei.pe = Pawns::probe(pos);
813   score += ei.pe->pawns_score();
814
815   // Early exit if score is high
816   v = (mg_value(score) + eg_value(score)) / 2;
817   if (abs(v) > LazyThreshold)
818      return pos.side_to_move() == WHITE ? v : -v;
819
820   // Initialize attack and king safety bitboards
821   eval_init<WHITE>(pos, ei);
822   eval_init<BLACK>(pos, ei);
823
824   // Evaluate all pieces but king and pawns
825   score += evaluate_pieces<DoTrace>(pos, ei, mobility);
826   score += mobility[WHITE] - mobility[BLACK];
827
828   // Evaluate kings after all other pieces because we need full attack
829   // information when computing the king safety evaluation.
830   score +=  evaluate_king<WHITE, DoTrace>(pos, ei)
831           - evaluate_king<BLACK, DoTrace>(pos, ei);
832
833   // Evaluate tactical threats, we need full attack information including king
834   score +=  evaluate_threats<WHITE, DoTrace>(pos, ei)
835           - evaluate_threats<BLACK, DoTrace>(pos, ei);
836
837   // Evaluate passed pawns, we need full attack information including king
838   score +=  evaluate_passer_pawns<WHITE, DoTrace>(pos, ei)
839           - evaluate_passer_pawns<BLACK, DoTrace>(pos, ei);
840
841   // Evaluate space for both sides, only during opening
842   if (pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK) >= 12222)
843       score +=  evaluate_space<WHITE>(pos, ei)
844               - evaluate_space<BLACK>(pos, ei);
845
846   // Evaluate position potential for the winning side
847   score += evaluate_initiative(pos, ei.pe->pawn_asymmetry(), eg_value(score));
848
849   // Evaluate scale factor for the winning side
850   ScaleFactor sf = evaluate_scale_factor(pos, ei, eg_value(score));
851
852   // Interpolate between a middlegame and a (scaled by 'sf') endgame score
853   v =  mg_value(score) * int(ei.me->game_phase())
854      + eg_value(score) * int(PHASE_MIDGAME - ei.me->game_phase()) * sf / SCALE_FACTOR_NORMAL;
855
856   v /= int(PHASE_MIDGAME);
857
858   // In case of tracing add all remaining individual evaluation terms
859   if (DoTrace)
860   {
861       Trace::add(MATERIAL, pos.psq_score());
862       Trace::add(IMBALANCE, ei.me->imbalance());
863       Trace::add(PAWN, ei.pe->pawns_score());
864       Trace::add(MOBILITY, mobility[WHITE], mobility[BLACK]);
865       if (pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK) >= 12222)
866           Trace::add(SPACE, evaluate_space<WHITE>(pos, ei)
867                           , evaluate_space<BLACK>(pos, ei));
868       Trace::add(TOTAL, score);
869   }
870
871   return (pos.side_to_move() == WHITE ? v : -v) + Eval::Tempo; // Side to move point of view
872 }
873
874 // Explicit template instantiations
875 template Value Eval::evaluate<true >(const Position&);
876 template Value Eval::evaluate<false>(const Position&);
877
878
879 /// trace() is like evaluate(), but instead of returning a value, it returns
880 /// a string (suitable for outputting to stdout) that contains the detailed
881 /// descriptions and values of each evaluation term. Useful for debugging.
882
883 std::string Eval::trace(const Position& pos) {
884
885   std::memset(scores, 0, sizeof(scores));
886
887   Value v = evaluate<true>(pos);
888   v = pos.side_to_move() == WHITE ? v : -v; // White's point of view
889
890   std::stringstream ss;
891   ss << std::showpoint << std::noshowpos << std::fixed << std::setprecision(2)
892      << "      Eval term |    White    |    Black    |    Total    \n"
893      << "                |   MG    EG  |   MG    EG  |   MG    EG  \n"
894      << "----------------+-------------+-------------+-------------\n"
895      << "       Material | " << Term(MATERIAL)
896      << "      Imbalance | " << Term(IMBALANCE)
897      << "          Pawns | " << Term(PAWN)
898      << "        Knights | " << Term(KNIGHT)
899      << "         Bishop | " << Term(BISHOP)
900      << "          Rooks | " << Term(ROOK)
901      << "         Queens | " << Term(QUEEN)
902      << "       Mobility | " << Term(MOBILITY)
903      << "    King safety | " << Term(KING)
904      << "        Threats | " << Term(THREAT)
905      << "   Passed pawns | " << Term(PASSED)
906      << "          Space | " << Term(SPACE)
907      << "----------------+-------------+-------------+-------------\n"
908      << "          Total | " << Term(TOTAL);
909
910   ss << "\nTotal Evaluation: " << to_cp(v) << " (white side)\n";
911
912   return ss.str();
913 }