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