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