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