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