]> git.sesse.net Git - stockfish/blob - src/evaluate.cpp
Simplify printing of engine info
[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-2010 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 <cassert>
21 #include <iostream>
22 #include <iomanip>
23 #include <sstream>
24 #include <algorithm>
25
26 #include "bitcount.h"
27 #include "evaluate.h"
28 #include "material.h"
29 #include "pawns.h"
30 #include "thread.h"
31 #include "ucioption.h"
32
33 namespace {
34
35   // Struct EvalInfo contains various information computed and collected
36   // by the evaluation functions.
37   struct EvalInfo {
38
39     // Pointers to material and pawn hash table entries
40     MaterialInfo* mi;
41     PawnInfo* pi;
42
43     // attackedBy[color][piece type] is a bitboard representing all squares
44     // attacked by a given color and piece type, attackedBy[color][0] contains
45     // all squares attacked by the given color.
46     Bitboard attackedBy[2][8];
47
48     // kingRing[color] is the zone around the king which is considered
49     // by the king safety evaluation. This consists of the squares directly
50     // adjacent to the king, and the three (or two, for a king on an edge file)
51     // squares two ranks in front of the king. For instance, if black's king
52     // is on g8, kingRing[BLACK] is a bitboard containing the squares f8, h8,
53     // f7, g7, h7, f6, g6 and h6.
54     Bitboard kingRing[2];
55
56     // kingAttackersCount[color] is the number of pieces of the given color
57     // which attack a square in the kingRing of the enemy king.
58     int kingAttackersCount[2];
59
60     // kingAttackersWeight[color] is the sum of the "weight" of the pieces of the
61     // given color which attack a square in the kingRing of the enemy king. The
62     // weights of the individual piece types are given by the variables
63     // QueenAttackWeight, RookAttackWeight, BishopAttackWeight and
64     // KnightAttackWeight in evaluate.cpp
65     int kingAttackersWeight[2];
66
67     // kingAdjacentZoneAttacksCount[color] is the number of attacks to squares
68     // directly adjacent to the king of the given color. Pieces which attack
69     // more than one square are counted multiple times. For instance, if black's
70     // king is on g8 and there's a white knight on g5, this knight adds
71     // 2 to kingAdjacentZoneAttacksCount[BLACK].
72     int kingAdjacentZoneAttacksCount[2];
73   };
74
75   // Evaluation grain size, must be a power of 2
76   const int GrainSize = 8;
77
78   // Evaluation weights, initialized from UCI options
79   enum { Mobility, PassedPawns, Space, KingDangerUs, KingDangerThem };
80   Score Weights[6];
81
82   typedef Value V;
83   #define S(mg, eg) make_score(mg, eg)
84
85   // Internal evaluation weights. These are applied on top of the evaluation
86   // weights read from UCI parameters. The purpose is to be able to change
87   // the evaluation weights while keeping the default values of the UCI
88   // parameters at 100, which looks prettier.
89   //
90   // Values modified by Joona Kiiski
91   const Score WeightsInternal[] = {
92       S(252, 344), S(216, 266), S(46, 0), S(247, 0), S(259, 0)
93   };
94
95   // MobilityBonus[PieceType][attacked] contains mobility bonuses for middle and
96   // end game, indexed by piece type and number of attacked squares not occupied
97   // by friendly pieces.
98   const Score MobilityBonus[][32] = {
99      {}, {},
100      { S(-38,-33), S(-25,-23), S(-12,-13), S( 0, -3), S(12,  7), S(25, 17), // Knights
101        S( 31, 22), S( 38, 27), S( 38, 27) },
102      { S(-25,-30), S(-11,-16), S(  3, -2), S(17, 12), S(31, 26), S(45, 40), // Bishops
103        S( 57, 52), S( 65, 60), S( 71, 65), S(74, 69), S(76, 71), S(78, 73),
104        S( 79, 74), S( 80, 75), S( 81, 76), S(81, 76) },
105      { S(-20,-36), S(-14,-19), S( -8, -3), S(-2, 13), S( 4, 29), S(10, 46), // Rooks
106        S( 14, 62), S( 19, 79), S( 23, 95), S(26,106), S(27,111), S(28,114),
107        S( 29,116), S( 30,117), S( 31,118), S(32,118) },
108      { S(-10,-18), S( -8,-13), S( -6, -7), S(-3, -2), S(-1,  3), S( 1,  8), // Queens
109        S(  3, 13), S(  5, 19), S(  8, 23), S(10, 27), S(12, 32), S(15, 34),
110        S( 16, 35), S( 17, 35), S( 18, 35), S(20, 35), S(20, 35), S(20, 35),
111        S( 20, 35), S( 20, 35), S( 20, 35), S(20, 35), S(20, 35), S(20, 35),
112        S( 20, 35), S( 20, 35), S( 20, 35), S(20, 35), S(20, 35), S(20, 35),
113        S( 20, 35), S( 20, 35) }
114   };
115
116   // OutpostBonus[PieceType][Square] contains outpost bonuses of knights and
117   // bishops, indexed by piece type and square (from white's point of view).
118   const Value OutpostBonus[][64] = {
119   {
120   //  A     B     C     D     E     F     G     H
121     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0), // Knights
122     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0),
123     V(0), V(0), V(4), V(8), V(8), V(4), V(0), V(0),
124     V(0), V(4),V(17),V(26),V(26),V(17), V(4), V(0),
125     V(0), V(8),V(26),V(35),V(35),V(26), V(8), V(0),
126     V(0), V(4),V(17),V(17),V(17),V(17), V(4), V(0) },
127   {
128     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0), // Bishops
129     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0),
130     V(0), V(0), V(5), V(5), V(5), V(5), V(0), V(0),
131     V(0), V(5),V(10),V(10),V(10),V(10), V(5), V(0),
132     V(0),V(10),V(21),V(21),V(21),V(21),V(10), V(0),
133     V(0), V(5), V(8), V(8), V(8), V(8), V(5), V(0) }
134   };
135
136   // ThreatBonus[attacking][attacked] contains threat bonuses according to
137   // which piece type attacks which one.
138   const Score ThreatBonus[][8] = {
139     {}, {},
140     { S(0, 0), S( 7, 39), S( 0,  0), S(24, 49), S(41,100), S(41,100) }, // KNIGHT
141     { S(0, 0), S( 7, 39), S(24, 49), S( 0,  0), S(41,100), S(41,100) }, // BISHOP
142     { S(0, 0), S(-1, 29), S(15, 49), S(15, 49), S( 0,  0), S(24, 49) }, // ROOK
143     { S(0, 0), S(15, 39), S(15, 39), S(15, 39), S(15, 39), S( 0,  0) }  // QUEEN
144   };
145
146   // ThreatenedByPawnPenalty[PieceType] contains a penalty according to which
147   // piece type is attacked by an enemy pawn.
148   const Score ThreatenedByPawnPenalty[] = {
149     S(0, 0), S(0, 0), S(56, 70), S(56, 70), S(76, 99), S(86, 118)
150   };
151
152   #undef S
153
154   // Rooks and queens on the 7th rank (modified by Joona Kiiski)
155   const Score RookOn7thBonus  = make_score(47, 98);
156   const Score QueenOn7thBonus = make_score(27, 54);
157
158   // Rooks on open files (modified by Joona Kiiski)
159   const Score RookOpenFileBonus = make_score(43, 43);
160   const Score RookHalfOpenFileBonus = make_score(19, 19);
161
162   // Penalty for rooks trapped inside a friendly king which has lost the
163   // right to castle.
164   const Value TrappedRookPenalty = Value(180);
165
166   // Penalty for a bishop on a1/h1 (a8/h8 for black) which is trapped by
167   // a friendly pawn on b2/g2 (b7/g7 for black). This can obviously only
168   // happen in Chess960 games.
169   const Score TrappedBishopA1H1Penalty = make_score(100, 100);
170
171   // The SpaceMask[Color] contains the area of the board which is considered
172   // by the space evaluation. In the middle game, each side is given a bonus
173   // based on how many squares inside this area are safe and available for
174   // friendly minor pieces.
175   const Bitboard SpaceMask[] = {
176     (1ULL << SQ_C2) | (1ULL << SQ_D2) | (1ULL << SQ_E2) | (1ULL << SQ_F2) |
177     (1ULL << SQ_C3) | (1ULL << SQ_D3) | (1ULL << SQ_E3) | (1ULL << SQ_F3) |
178     (1ULL << SQ_C4) | (1ULL << SQ_D4) | (1ULL << SQ_E4) | (1ULL << SQ_F4),
179     (1ULL << SQ_C7) | (1ULL << SQ_D7) | (1ULL << SQ_E7) | (1ULL << SQ_F7) |
180     (1ULL << SQ_C6) | (1ULL << SQ_D6) | (1ULL << SQ_E6) | (1ULL << SQ_F6) |
181     (1ULL << SQ_C5) | (1ULL << SQ_D5) | (1ULL << SQ_E5) | (1ULL << SQ_F5)
182   };
183
184   // King danger constants and variables. The king danger scores are taken
185   // from the KingDangerTable[]. Various little "meta-bonuses" measuring
186   // the strength of the enemy attack are added up into an integer, which
187   // is used as an index to KingDangerTable[].
188   //
189   // KingAttackWeights[PieceType] contains king attack weights by piece type
190   const int KingAttackWeights[] = { 0, 0, 2, 2, 3, 5 };
191
192   // Bonuses for enemy's safe checks
193   const int QueenContactCheckBonus = 6;
194   const int RookContactCheckBonus  = 4;
195   const int QueenCheckBonus        = 3;
196   const int RookCheckBonus         = 2;
197   const int BishopCheckBonus       = 1;
198   const int KnightCheckBonus       = 1;
199
200   // InitKingDanger[Square] contains penalties based on the position of the
201   // defending king, indexed by king's square (from white's point of view).
202   const int InitKingDanger[] = {
203      2,  0,  2,  5,  5,  2,  0,  2,
204      2,  2,  4,  8,  8,  4,  2,  2,
205      7, 10, 12, 12, 12, 12, 10,  7,
206     15, 15, 15, 15, 15, 15, 15, 15,
207     15, 15, 15, 15, 15, 15, 15, 15,
208     15, 15, 15, 15, 15, 15, 15, 15,
209     15, 15, 15, 15, 15, 15, 15, 15,
210     15, 15, 15, 15, 15, 15, 15, 15
211   };
212
213   // KingDangerTable[Color][attackUnits] contains the actual king danger
214   // weighted scores, indexed by color and by a calculated integer number.
215   Score KingDangerTable[2][128];
216
217   // TracedTerms[Color][PieceType || TracedType] contains a breakdown of the
218   // evaluation terms, used when tracing.
219   Score TracedScores[2][16];
220   std::stringstream TraceStream;
221
222   enum TracedType {
223       PST = 8, IMBALANCE = 9, MOBILITY = 10, THREAT = 11,
224       PASSED = 12, UNSTOPPABLE = 13, SPACE = 14, TOTAL = 15
225   };
226
227   // Function prototypes
228   template<bool Trace>
229   Value do_evaluate(const Position& pos, Value& margin);
230
231   template<Color Us>
232   void init_eval_info(const Position& pos, EvalInfo& ei);
233
234   template<Color Us, bool Trace>
235   Score evaluate_pieces_of_color(const Position& pos, EvalInfo& ei, Score& mobility);
236
237   template<Color Us, bool Trace>
238   Score evaluate_king(const Position& pos, EvalInfo& ei, Value margins[]);
239
240   template<Color Us>
241   Score evaluate_threats(const Position& pos, EvalInfo& ei);
242
243   template<Color Us>
244   int evaluate_space(const Position& pos, EvalInfo& ei);
245
246   template<Color Us>
247   Score evaluate_passed_pawns(const Position& pos, EvalInfo& ei);
248
249   Score evaluate_unstoppable_pawns(const Position& pos, EvalInfo& ei);
250
251   inline Score apply_weight(Score v, Score weight);
252   Value scale_by_game_phase(const Score& v, Phase ph, ScaleFactor sf);
253   Score weight_option(const std::string& mgOpt, const std::string& egOpt, Score internalWeight);
254   void init_safety();
255   double to_cp(Value v);
256   void trace_add(int idx, Score term_w, Score term_b = SCORE_ZERO);
257 }
258
259
260 /// evaluate() is the main evaluation function. It always computes two
261 /// values, an endgame score and a middle game score, and interpolates
262 /// between them based on the remaining material.
263 Value evaluate(const Position& pos, Value& margin) { return do_evaluate<false>(pos, margin); }
264
265 namespace {
266
267 template<bool Trace>
268 Value do_evaluate(const Position& pos, Value& margin) {
269
270   EvalInfo ei;
271   Value margins[2];
272   Score score, mobilityWhite, mobilityBlack;
273
274   assert(pos.thread() >= 0 && pos.thread() < MAX_THREADS);
275   assert(!pos.in_check());
276
277   // Initialize score by reading the incrementally updated scores included
278   // in the position object (material + piece square tables).
279   score = pos.value();
280
281   // margins[] store the uncertainty estimation of position's evaluation
282   // that typically is used by the search for pruning decisions.
283   margins[WHITE] = margins[BLACK] = VALUE_ZERO;
284
285   // Probe the material hash table
286   ei.mi = Threads[pos.thread()].materialTable.material_info(pos);
287   score += ei.mi->material_value();
288
289   // If we have a specialized evaluation function for the current material
290   // configuration, call it and return.
291   if (ei.mi->specialized_eval_exists())
292   {
293       margin = VALUE_ZERO;
294       return ei.mi->evaluate(pos);
295   }
296
297   // Probe the pawn hash table
298   ei.pi = Threads[pos.thread()].pawnTable.pawn_info(pos);
299   score += ei.pi->pawns_value();
300
301   // Initialize attack and king safety bitboards
302   init_eval_info<WHITE>(pos, ei);
303   init_eval_info<BLACK>(pos, ei);
304
305   // Evaluate pieces and mobility
306   score +=  evaluate_pieces_of_color<WHITE, Trace>(pos, ei, mobilityWhite)
307           - evaluate_pieces_of_color<BLACK, Trace>(pos, ei, mobilityBlack);
308
309   score += apply_weight(mobilityWhite - mobilityBlack, Weights[Mobility]);
310
311   // Evaluate kings after all other pieces because we need complete attack
312   // information when computing the king safety evaluation.
313   score +=  evaluate_king<WHITE, Trace>(pos, ei, margins)
314           - evaluate_king<BLACK, Trace>(pos, ei, margins);
315
316   // Evaluate tactical threats, we need full attack information including king
317   score +=  evaluate_threats<WHITE>(pos, ei)
318           - evaluate_threats<BLACK>(pos, ei);
319
320   // Evaluate passed pawns, we need full attack information including king
321   score +=  evaluate_passed_pawns<WHITE>(pos, ei)
322           - evaluate_passed_pawns<BLACK>(pos, ei);
323
324   // If one side has only a king, check whether exists any unstoppable passed pawn
325   if (!pos.non_pawn_material(WHITE) || !pos.non_pawn_material(BLACK))
326       score += evaluate_unstoppable_pawns(pos, ei);
327
328   // Evaluate space for both sides, only in middle-game.
329   if (ei.mi->space_weight())
330   {
331       int s = evaluate_space<WHITE>(pos, ei) - evaluate_space<BLACK>(pos, ei);
332       score += apply_weight(make_score(s * ei.mi->space_weight(), 0), Weights[Space]);
333   }
334
335   // Scale winning side if position is more drawish that what it appears
336   ScaleFactor sf = eg_value(score) > VALUE_DRAW ? ei.mi->scale_factor(pos, WHITE)
337                                                 : ei.mi->scale_factor(pos, BLACK);
338
339   // If we don't already have an unusual scale factor, check for opposite
340   // colored bishop endgames, and use a lower scale for those.
341   if (   ei.mi->game_phase() < PHASE_MIDGAME
342       && pos.opposite_colored_bishops()
343       && sf == SCALE_FACTOR_NORMAL)
344   {
345       // Only the two bishops ?
346       if (   pos.non_pawn_material(WHITE) == BishopValueMidgame
347           && pos.non_pawn_material(BLACK) == BishopValueMidgame)
348       {
349           // Check for KBP vs KB with only a single pawn that is almost
350           // certainly a draw or at least two pawns.
351           bool one_pawn = (pos.piece_count(WHITE, PAWN) + pos.piece_count(BLACK, PAWN) == 1);
352           sf = one_pawn ? ScaleFactor(8) : ScaleFactor(32);
353       }
354       else
355           // Endgame with opposite-colored bishops, but also other pieces. Still
356           // a bit drawish, but not as drawish as with only the two bishops.
357            sf = ScaleFactor(50);
358   }
359
360   // Interpolate between the middle game and the endgame score
361   margin = margins[pos.side_to_move()];
362   Value v = scale_by_game_phase(score, ei.mi->game_phase(), sf);
363
364   // In case of tracing add all single evaluation contributions for both white and black
365   if (Trace)
366   {
367       trace_add(PST, pos.value());
368       trace_add(IMBALANCE, ei.mi->material_value());
369       trace_add(PAWN, ei.pi->pawns_value());
370       trace_add(MOBILITY, apply_weight(mobilityWhite, Weights[Mobility]), apply_weight(mobilityBlack, Weights[Mobility]));
371       trace_add(THREAT, evaluate_threats<WHITE>(pos, ei), evaluate_threats<BLACK>(pos, ei));
372       trace_add(PASSED, evaluate_passed_pawns<WHITE>(pos, ei), evaluate_passed_pawns<BLACK>(pos, ei));
373       trace_add(UNSTOPPABLE, evaluate_unstoppable_pawns(pos, ei));
374       Score w = make_score(ei.mi->space_weight() * evaluate_space<WHITE>(pos, ei), 0);
375       Score b = make_score(ei.mi->space_weight() * evaluate_space<BLACK>(pos, ei), 0);
376       trace_add(SPACE, apply_weight(w, Weights[Space]), apply_weight(b, Weights[Space]));
377       trace_add(TOTAL, score);
378       TraceStream << "\nUncertainty margin: White: " << to_cp(margins[WHITE])
379                   << ", Black: " << to_cp(margins[BLACK])
380                   << "\nScaling: " << std::noshowpos
381                   << std::setw(6) << 100.0 * ei.mi->game_phase() / 128.0 << "% MG, "
382                   << std::setw(6) << 100.0 * (1.0 - ei.mi->game_phase() / 128.0) << "% * "
383                   << std::setw(6) << (100.0 * sf) / SCALE_FACTOR_NORMAL << "% EG.\n"
384                   << "Total evaluation: " << to_cp(v);
385   }
386
387   return pos.side_to_move() == WHITE ? v : -v;
388 }
389
390 } // namespace
391
392
393 /// read_weights() reads evaluation weights from the corresponding UCI parameters
394
395 void read_evaluation_uci_options(Color us) {
396
397   // King safety is asymmetrical. Our king danger level is weighted by
398   // "Cowardice" UCI parameter, instead the opponent one by "Aggressiveness".
399   const int kingDangerUs   = (us == WHITE ? KingDangerUs   : KingDangerThem);
400   const int kingDangerThem = (us == WHITE ? KingDangerThem : KingDangerUs);
401
402   Weights[Mobility]       = weight_option("Mobility (Middle Game)", "Mobility (Endgame)", WeightsInternal[Mobility]);
403   Weights[PassedPawns]    = weight_option("Passed Pawns (Middle Game)", "Passed Pawns (Endgame)", WeightsInternal[PassedPawns]);
404   Weights[Space]          = weight_option("Space", "Space", WeightsInternal[Space]);
405   Weights[kingDangerUs]   = weight_option("Cowardice", "Cowardice", WeightsInternal[KingDangerUs]);
406   Weights[kingDangerThem] = weight_option("Aggressiveness", "Aggressiveness", WeightsInternal[KingDangerThem]);
407
408   // If running in analysis mode, make sure we use symmetrical king safety. We do this
409   // by replacing both Weights[kingDangerUs] and Weights[kingDangerThem] by their average.
410   if (Options["UCI_AnalyseMode"])
411       Weights[kingDangerUs] = Weights[kingDangerThem] = (Weights[kingDangerUs] + Weights[kingDangerThem]) / 2;
412
413   init_safety();
414 }
415
416
417 namespace {
418
419   // init_eval_info() initializes king bitboards for given color adding
420   // pawn attacks. To be done at the beginning of the evaluation.
421
422   template<Color Us>
423   void init_eval_info(const Position& pos, EvalInfo& ei) {
424
425     const BitCountType Max15 = HasPopCnt ? CNT_POPCNT : Is64Bit ? CNT64_MAX15 : CNT32_MAX15;
426     const Color Them = (Us == WHITE ? BLACK : WHITE);
427
428     Bitboard b = ei.attackedBy[Them][KING] = pos.attacks_from<KING>(pos.king_square(Them));
429     ei.attackedBy[Us][PAWN] = ei.pi->pawn_attacks(Us);
430
431     // Init king safety tables only if we are going to use them
432     if (   pos.piece_count(Us, QUEEN)
433         && pos.non_pawn_material(Us) >= QueenValueMidgame + RookValueMidgame)
434     {
435         ei.kingRing[Them] = (b | (Us == WHITE ? b >> 8 : b << 8));
436         b &= ei.attackedBy[Us][PAWN];
437         ei.kingAttackersCount[Us] = b ? count_1s<Max15>(b) / 2 : 0;
438         ei.kingAdjacentZoneAttacksCount[Us] = ei.kingAttackersWeight[Us] = 0;
439     } else
440         ei.kingRing[Them] = ei.kingAttackersCount[Us] = 0;
441   }
442
443
444   // evaluate_outposts() evaluates bishop and knight outposts squares
445
446   template<PieceType Piece, Color Us>
447   Score evaluate_outposts(const Position& pos, EvalInfo& ei, Square s) {
448
449     const Color Them = (Us == WHITE ? BLACK : WHITE);
450
451     assert (Piece == BISHOP || Piece == KNIGHT);
452
453     // Initial bonus based on square
454     Value bonus = OutpostBonus[Piece == BISHOP][relative_square(Us, s)];
455
456     // Increase bonus if supported by pawn, especially if the opponent has
457     // no minor piece which can exchange the outpost piece.
458     if (bonus && bit_is_set(ei.attackedBy[Us][PAWN], s))
459     {
460         if (   !pos.pieces(KNIGHT, Them)
461             && !(same_color_squares(s) & pos.pieces(BISHOP, Them)))
462             bonus += bonus + bonus / 2;
463         else
464             bonus += bonus / 2;
465     }
466     return make_score(bonus, bonus);
467   }
468
469
470   // evaluate_pieces<>() assigns bonuses and penalties to the pieces of a given color
471
472   template<PieceType Piece, Color Us, bool Trace>
473   Score evaluate_pieces(const Position& pos, EvalInfo& ei, Score& mobility, Bitboard mobilityArea) {
474
475     Bitboard b;
476     Square s, ksq;
477     int mob;
478     File f;
479     Score score = SCORE_ZERO;
480
481     const BitCountType Full  = HasPopCnt ? CNT_POPCNT : Is64Bit ? CNT64 : CNT32;
482     const BitCountType Max15 = HasPopCnt ? CNT_POPCNT : Is64Bit ? CNT64_MAX15 : CNT32_MAX15;
483     const Color Them = (Us == WHITE ? BLACK : WHITE);
484     const Square* pl = pos.piece_list(Us, Piece);
485
486     ei.attackedBy[Us][Piece] = 0;
487
488     while ((s = *pl++) != SQ_NONE)
489     {
490         // Find attacked squares, including x-ray attacks for bishops and rooks
491         if (Piece == KNIGHT || Piece == QUEEN)
492             b = pos.attacks_from<Piece>(s);
493         else if (Piece == BISHOP)
494             b = bishop_attacks_bb(s, pos.occupied_squares() & ~pos.pieces(QUEEN, Us));
495         else if (Piece == ROOK)
496             b = rook_attacks_bb(s, pos.occupied_squares() & ~pos.pieces(ROOK, QUEEN, Us));
497         else
498             assert(false);
499
500         // Update attack info
501         ei.attackedBy[Us][Piece] |= b;
502
503         // King attacks
504         if (b & ei.kingRing[Them])
505         {
506             ei.kingAttackersCount[Us]++;
507             ei.kingAttackersWeight[Us] += KingAttackWeights[Piece];
508             Bitboard bb = (b & ei.attackedBy[Them][KING]);
509             if (bb)
510                 ei.kingAdjacentZoneAttacksCount[Us] += count_1s<Max15>(bb);
511         }
512
513         // Mobility
514         mob = (Piece != QUEEN ? count_1s<Max15>(b & mobilityArea)
515                               : count_1s<Full >(b & mobilityArea));
516
517         mobility += MobilityBonus[Piece][mob];
518
519         // Decrease score if we are attacked by an enemy pawn. Remaining part
520         // of threat evaluation must be done later when we have full attack info.
521         if (bit_is_set(ei.attackedBy[Them][PAWN], s))
522             score -= ThreatenedByPawnPenalty[Piece];
523
524         // Bishop and knight outposts squares
525         if (    (Piece == BISHOP || Piece == KNIGHT)
526             && !(pos.pieces(PAWN, Them) & attack_span_mask(Us, s)))
527             score += evaluate_outposts<Piece, Us>(pos, ei, s);
528
529         // Queen or rook on 7th rank
530         if (  (Piece == ROOK || Piece == QUEEN)
531             && relative_rank(Us, s) == RANK_7
532             && relative_rank(Us, pos.king_square(Them)) == RANK_8)
533         {
534             score += (Piece == ROOK ? RookOn7thBonus : QueenOn7thBonus);
535         }
536
537         // Special extra evaluation for bishops
538         if (Piece == BISHOP && pos.is_chess960())
539         {
540             // An important Chess960 pattern: A cornered bishop blocked by
541             // a friendly pawn diagonally in front of it is a very serious
542             // problem, especially when that pawn is also blocked.
543             if (s == relative_square(Us, SQ_A1) || s == relative_square(Us, SQ_H1))
544             {
545                 Square d = pawn_push(Us) + (file_of(s) == FILE_A ? DELTA_E : DELTA_W);
546                 if (pos.piece_on(s + d) == make_piece(Us, PAWN))
547                 {
548                     if (!pos.square_is_empty(s + d + pawn_push(Us)))
549                         score -= 2*TrappedBishopA1H1Penalty;
550                     else if (pos.piece_on(s + 2*d) == make_piece(Us, PAWN))
551                         score -= TrappedBishopA1H1Penalty;
552                     else
553                         score -= TrappedBishopA1H1Penalty / 2;
554                 }
555             }
556         }
557
558         // Special extra evaluation for rooks
559         if (Piece == ROOK)
560         {
561             // Open and half-open files
562             f = file_of(s);
563             if (ei.pi->file_is_half_open(Us, f))
564             {
565                 if (ei.pi->file_is_half_open(Them, f))
566                     score += RookOpenFileBonus;
567                 else
568                     score += RookHalfOpenFileBonus;
569             }
570
571             // Penalize rooks which are trapped inside a king. Penalize more if
572             // king has lost right to castle.
573             if (mob > 6 || ei.pi->file_is_half_open(Us, f))
574                 continue;
575
576             ksq = pos.king_square(Us);
577
578             if (    file_of(ksq) >= FILE_E
579                 &&  file_of(s) > file_of(ksq)
580                 && (relative_rank(Us, ksq) == RANK_1 || rank_of(ksq) == rank_of(s)))
581             {
582                 // Is there a half-open file between the king and the edge of the board?
583                 if (!ei.pi->has_open_file_to_right(Us, file_of(ksq)))
584                     score -= make_score(pos.can_castle(Us) ? (TrappedRookPenalty - mob * 16) / 2
585                                                            : (TrappedRookPenalty - mob * 16), 0);
586             }
587             else if (    file_of(ksq) <= FILE_D
588                      &&  file_of(s) < file_of(ksq)
589                      && (relative_rank(Us, ksq) == RANK_1 || rank_of(ksq) == rank_of(s)))
590             {
591                 // Is there a half-open file between the king and the edge of the board?
592                 if (!ei.pi->has_open_file_to_left(Us, file_of(ksq)))
593                     score -= make_score(pos.can_castle(Us) ? (TrappedRookPenalty - mob * 16) / 2
594                                                            : (TrappedRookPenalty - mob * 16), 0);
595             }
596         }
597     }
598
599     if (Trace)
600         TracedScores[Us][Piece] = score;
601
602     return score;
603   }
604
605
606   // evaluate_threats<>() assigns bonuses according to the type of attacking piece
607   // and the type of attacked one.
608
609   template<Color Us>
610   Score evaluate_threats(const Position& pos, EvalInfo& ei) {
611
612     const Color Them = (Us == WHITE ? BLACK : WHITE);
613
614     Bitboard b;
615     Score score = SCORE_ZERO;
616
617     // Enemy pieces not defended by a pawn and under our attack
618     Bitboard weakEnemies =  pos.pieces(Them)
619                           & ~ei.attackedBy[Them][PAWN]
620                           & ei.attackedBy[Us][0];
621     if (!weakEnemies)
622         return SCORE_ZERO;
623
624     // Add bonus according to type of attacked enemy piece and to the
625     // type of attacking piece, from knights to queens. Kings are not
626     // considered because are already handled in king evaluation.
627     for (PieceType pt1 = KNIGHT; pt1 < KING; pt1++)
628     {
629         b = ei.attackedBy[Us][pt1] & weakEnemies;
630         if (b)
631             for (PieceType pt2 = PAWN; pt2 < KING; pt2++)
632                 if (b & pos.pieces(pt2))
633                     score += ThreatBonus[pt1][pt2];
634     }
635     return score;
636   }
637
638
639   // evaluate_pieces_of_color<>() assigns bonuses and penalties to all the
640   // pieces of a given color.
641
642   template<Color Us, bool Trace>
643   Score evaluate_pieces_of_color(const Position& pos, EvalInfo& ei, Score& mobility) {
644
645     const Color Them = (Us == WHITE ? BLACK : WHITE);
646
647     Score score = mobility = SCORE_ZERO;
648
649     // Do not include in mobility squares protected by enemy pawns or occupied by our pieces
650     const Bitboard mobilityArea = ~(ei.attackedBy[Them][PAWN] | pos.pieces(Us));
651
652     score += evaluate_pieces<KNIGHT, Us, Trace>(pos, ei, mobility, mobilityArea);
653     score += evaluate_pieces<BISHOP, Us, Trace>(pos, ei, mobility, mobilityArea);
654     score += evaluate_pieces<ROOK,   Us, Trace>(pos, ei, mobility, mobilityArea);
655     score += evaluate_pieces<QUEEN,  Us, Trace>(pos, ei, mobility, mobilityArea);
656
657     // Sum up all attacked squares
658     ei.attackedBy[Us][0] =   ei.attackedBy[Us][PAWN]   | ei.attackedBy[Us][KNIGHT]
659                            | ei.attackedBy[Us][BISHOP] | ei.attackedBy[Us][ROOK]
660                            | ei.attackedBy[Us][QUEEN]  | ei.attackedBy[Us][KING];
661     return score;
662   }
663
664
665   // evaluate_king<>() assigns bonuses and penalties to a king of a given color
666
667   template<Color Us, bool Trace>
668   Score evaluate_king(const Position& pos, EvalInfo& ei, Value margins[]) {
669
670     const BitCountType Max15 = HasPopCnt ? CNT_POPCNT : Is64Bit ? CNT64_MAX15 : CNT32_MAX15;
671     const Color Them = (Us == WHITE ? BLACK : WHITE);
672
673     Bitboard undefended, b, b1, b2, safe;
674     int attackUnits;
675     const Square ksq = pos.king_square(Us);
676
677     // King shelter
678     Score score = ei.pi->king_shelter<Us>(pos, ksq);
679
680     // King safety. This is quite complicated, and is almost certainly far
681     // from optimally tuned.
682     if (   ei.kingAttackersCount[Them] >= 2
683         && ei.kingAdjacentZoneAttacksCount[Them])
684     {
685         // Find the attacked squares around the king which has no defenders
686         // apart from the king itself
687         undefended = ei.attackedBy[Them][0] & ei.attackedBy[Us][KING];
688         undefended &= ~(  ei.attackedBy[Us][PAWN]   | ei.attackedBy[Us][KNIGHT]
689                         | ei.attackedBy[Us][BISHOP] | ei.attackedBy[Us][ROOK]
690                         | ei.attackedBy[Us][QUEEN]);
691
692         // Initialize the 'attackUnits' variable, which is used later on as an
693         // index to the KingDangerTable[] array. The initial value is based on
694         // the number and types of the enemy's attacking pieces, the number of
695         // attacked and undefended squares around our king, the square of the
696         // king, and the quality of the pawn shelter.
697         attackUnits =  std::min(25, (ei.kingAttackersCount[Them] * ei.kingAttackersWeight[Them]) / 2)
698                      + 3 * (ei.kingAdjacentZoneAttacksCount[Them] + count_1s<Max15>(undefended))
699                      + InitKingDanger[relative_square(Us, ksq)]
700                      - mg_value(ei.pi->king_shelter<Us>(pos, ksq)) / 32;
701
702         // Analyse enemy's safe queen contact checks. First find undefended
703         // squares around the king attacked by enemy queen...
704         b = undefended & ei.attackedBy[Them][QUEEN] & ~pos.pieces(Them);
705         if (b)
706         {
707             // ...then remove squares not supported by another enemy piece
708             b &= (  ei.attackedBy[Them][PAWN]   | ei.attackedBy[Them][KNIGHT]
709                   | ei.attackedBy[Them][BISHOP] | ei.attackedBy[Them][ROOK]);
710             if (b)
711                 attackUnits +=  QueenContactCheckBonus
712                               * count_1s<Max15>(b)
713                               * (Them == pos.side_to_move() ? 2 : 1);
714         }
715
716         // Analyse enemy's safe rook contact checks. First find undefended
717         // squares around the king attacked by enemy rooks...
718         b = undefended & ei.attackedBy[Them][ROOK] & ~pos.pieces(Them);
719
720         // Consider only squares where the enemy rook gives check
721         b &= RookPseudoAttacks[ksq];
722
723         if (b)
724         {
725             // ...then remove squares not supported by another enemy piece
726             b &= (  ei.attackedBy[Them][PAWN]   | ei.attackedBy[Them][KNIGHT]
727                   | ei.attackedBy[Them][BISHOP] | ei.attackedBy[Them][QUEEN]);
728             if (b)
729                 attackUnits +=  RookContactCheckBonus
730                               * count_1s<Max15>(b)
731                               * (Them == pos.side_to_move() ? 2 : 1);
732         }
733
734         // Analyse enemy's safe distance checks for sliders and knights
735         safe = ~(pos.pieces(Them) | ei.attackedBy[Us][0]);
736
737         b1 = pos.attacks_from<ROOK>(ksq) & safe;
738         b2 = pos.attacks_from<BISHOP>(ksq) & safe;
739
740         // Enemy queen safe checks
741         b = (b1 | b2) & ei.attackedBy[Them][QUEEN];
742         if (b)
743             attackUnits += QueenCheckBonus * count_1s<Max15>(b);
744
745         // Enemy rooks safe checks
746         b = b1 & ei.attackedBy[Them][ROOK];
747         if (b)
748             attackUnits += RookCheckBonus * count_1s<Max15>(b);
749
750         // Enemy bishops safe checks
751         b = b2 & ei.attackedBy[Them][BISHOP];
752         if (b)
753             attackUnits += BishopCheckBonus * count_1s<Max15>(b);
754
755         // Enemy knights safe checks
756         b = pos.attacks_from<KNIGHT>(ksq) & ei.attackedBy[Them][KNIGHT] & safe;
757         if (b)
758             attackUnits += KnightCheckBonus * count_1s<Max15>(b);
759
760         // To index KingDangerTable[] attackUnits must be in [0, 99] range
761         attackUnits = std::min(99, std::max(0, attackUnits));
762
763         // Finally, extract the king danger score from the KingDangerTable[]
764         // array and subtract the score from evaluation. Set also margins[]
765         // value that will be used for pruning because this value can sometimes
766         // be very big, and so capturing a single attacking piece can therefore
767         // result in a score change far bigger than the value of the captured piece.
768         score -= KingDangerTable[Us][attackUnits];
769         margins[Us] += mg_value(KingDangerTable[Us][attackUnits]);
770     }
771
772     if (Trace)
773         TracedScores[Us][KING] = score;
774
775     return score;
776   }
777
778
779   // evaluate_passed_pawns<>() evaluates the passed pawns of the given color
780
781   template<Color Us>
782   Score evaluate_passed_pawns(const Position& pos, EvalInfo& ei) {
783
784     const Color Them = (Us == WHITE ? BLACK : WHITE);
785
786     Bitboard b, squaresToQueen, defendedSquares, unsafeSquares, supportingPawns;
787     Score score = SCORE_ZERO;
788
789     b = ei.pi->passed_pawns(Us);
790
791     if (!b)
792         return SCORE_ZERO;
793
794     do {
795         Square s = pop_1st_bit(&b);
796
797         assert(pos.pawn_is_passed(Us, s));
798
799         int r = int(relative_rank(Us, s) - RANK_2);
800         int rr = r * (r - 1);
801
802         // Base bonus based on rank
803         Value mbonus = Value(20 * rr);
804         Value ebonus = Value(10 * (rr + r + 1));
805
806         if (rr)
807         {
808             Square blockSq = s + pawn_push(Us);
809
810             // Adjust bonus based on kings proximity
811             ebonus += Value(square_distance(pos.king_square(Them), blockSq) * 5 * rr);
812             ebonus -= Value(square_distance(pos.king_square(Us), blockSq) * 2 * rr);
813
814             // If blockSq is not the queening square then consider also a second push
815             if (rank_of(blockSq) != (Us == WHITE ? RANK_8 : RANK_1))
816                 ebonus -= Value(square_distance(pos.king_square(Us), blockSq + pawn_push(Us)) * rr);
817
818             // If the pawn is free to advance, increase bonus
819             if (pos.square_is_empty(blockSq))
820             {
821                 squaresToQueen = squares_in_front_of(Us, s);
822                 defendedSquares = squaresToQueen & ei.attackedBy[Us][0];
823
824                 // If there is an enemy rook or queen attacking the pawn from behind,
825                 // add all X-ray attacks by the rook or queen. Otherwise consider only
826                 // the squares in the pawn's path attacked or occupied by the enemy.
827                 if (   (squares_in_front_of(Them, s) & pos.pieces(ROOK, QUEEN, Them))
828                     && (squares_in_front_of(Them, s) & pos.pieces(ROOK, QUEEN, Them) & pos.attacks_from<ROOK>(s)))
829                     unsafeSquares = squaresToQueen;
830                 else
831                     unsafeSquares = squaresToQueen & (ei.attackedBy[Them][0] | pos.pieces(Them));
832
833                 // If there aren't enemy attacks or pieces along the path to queen give
834                 // huge bonus. Even bigger if we protect the pawn's path.
835                 if (!unsafeSquares)
836                     ebonus += Value(rr * (squaresToQueen == defendedSquares ? 17 : 15));
837                 else
838                     // OK, there are enemy attacks or pieces (but not pawns). Are those
839                     // squares which are attacked by the enemy also attacked by us ?
840                     // If yes, big bonus (but smaller than when there are no enemy attacks),
841                     // if no, somewhat smaller bonus.
842                     ebonus += Value(rr * ((unsafeSquares & defendedSquares) == unsafeSquares ? 13 : 8));
843             }
844         } // rr != 0
845
846         // Increase the bonus if the passed pawn is supported by a friendly pawn
847         // on the same rank and a bit smaller if it's on the previous rank.
848         supportingPawns = pos.pieces(PAWN, Us) & neighboring_files_bb(file_of(s));
849         if (supportingPawns & rank_bb(s))
850             ebonus += Value(r * 20);
851
852         else if (supportingPawns & rank_bb(s - pawn_push(Us)))
853             ebonus += Value(r * 12);
854
855         // Rook pawns are a special case: They are sometimes worse, and
856         // sometimes better than other passed pawns. It is difficult to find
857         // good rules for determining whether they are good or bad. For now,
858         // we try the following: Increase the value for rook pawns if the
859         // other side has no pieces apart from a knight, and decrease the
860         // value if the other side has a rook or queen.
861         if (file_of(s) == FILE_A || file_of(s) == FILE_H)
862         {
863             if (pos.non_pawn_material(Them) <= KnightValueMidgame)
864                 ebonus += ebonus / 4;
865             else if (pos.pieces(ROOK, QUEEN, Them))
866                 ebonus -= ebonus / 4;
867         }
868         score += make_score(mbonus, ebonus);
869
870     } while (b);
871
872     // Add the scores to the middle game and endgame eval
873     return apply_weight(score, Weights[PassedPawns]);
874   }
875
876
877   // evaluate_unstoppable_pawns() evaluates the unstoppable passed pawns for both sides, this is quite
878   // conservative and returns a winning score only when we are very sure that the pawn is winning.
879
880   Score evaluate_unstoppable_pawns(const Position& pos, EvalInfo& ei) {
881
882     const BitCountType Max15 = HasPopCnt ? CNT_POPCNT : Is64Bit ? CNT64_MAX15 : CNT32_MAX15;
883
884     Bitboard b, b2, blockers, supporters, queeningPath, candidates;
885     Square s, blockSq, queeningSquare;
886     Color c, winnerSide, loserSide;
887     bool pathDefended, opposed;
888     int pliesToGo, movesToGo, oppMovesToGo, sacptg, blockersCount, minKingDist, kingptg, d;
889     int pliesToQueen[] = { 256, 256 };
890
891     // Step 1. Hunt for unstoppable passed pawns. If we find at least one,
892     // record how many plies are required for promotion.
893     for (c = WHITE; c <= BLACK; c++)
894     {
895         // Skip if other side has non-pawn pieces
896         if (pos.non_pawn_material(flip(c)))
897             continue;
898
899         b = ei.pi->passed_pawns(c);
900
901         while (b)
902         {
903             s = pop_1st_bit(&b);
904             queeningSquare = relative_square(c, make_square(file_of(s), RANK_8));
905             queeningPath = squares_in_front_of(c, s);
906
907             // Compute plies to queening and check direct advancement
908             movesToGo = rank_distance(s, queeningSquare) - int(relative_rank(c, s) == RANK_2);
909             oppMovesToGo = square_distance(pos.king_square(flip(c)), queeningSquare) - int(c != pos.side_to_move());
910             pathDefended = ((ei.attackedBy[c][0] & queeningPath) == queeningPath);
911
912             if (movesToGo >= oppMovesToGo && !pathDefended)
913                 continue;
914
915             // Opponent king cannot block because path is defended and position
916             // is not in check. So only friendly pieces can be blockers.
917             assert(!pos.in_check());
918             assert((queeningPath & pos.occupied_squares()) == (queeningPath & pos.pieces(c)));
919
920             // Add moves needed to free the path from friendly pieces and retest condition
921             movesToGo += count_1s<Max15>(queeningPath & pos.pieces(c));
922
923             if (movesToGo >= oppMovesToGo && !pathDefended)
924                 continue;
925
926             pliesToGo = 2 * movesToGo - int(c == pos.side_to_move());
927             pliesToQueen[c] = std::min(pliesToQueen[c], pliesToGo);
928         }
929     }
930
931     // Step 2. If either side cannot promote at least three plies before the other side then situation
932     // becomes too complex and we give up. Otherwise we determine the possibly "winning side"
933     if (abs(pliesToQueen[WHITE] - pliesToQueen[BLACK]) < 3)
934         return SCORE_ZERO;
935
936     winnerSide = (pliesToQueen[WHITE] < pliesToQueen[BLACK] ? WHITE : BLACK);
937     loserSide = flip(winnerSide);
938
939     // Step 3. Can the losing side possibly create a new passed pawn and thus prevent the loss?
940     b = candidates = pos.pieces(PAWN, loserSide);
941
942     while (b)
943     {
944         s = pop_1st_bit(&b);
945
946         // Compute plies from queening
947         queeningSquare = relative_square(loserSide, make_square(file_of(s), RANK_8));
948         movesToGo = rank_distance(s, queeningSquare) - int(relative_rank(loserSide, s) == RANK_2);
949         pliesToGo = 2 * movesToGo - int(loserSide == pos.side_to_move());
950
951         // Check if (without even considering any obstacles) we're too far away or doubled
952         if (   pliesToQueen[winnerSide] + 3 <= pliesToGo
953             || (squares_in_front_of(loserSide, s) & pos.pieces(PAWN, loserSide)))
954             clear_bit(&candidates, s);
955     }
956
957     // If any candidate is already a passed pawn it _may_ promote in time. We give up.
958     if (candidates & ei.pi->passed_pawns(loserSide))
959         return SCORE_ZERO;
960
961     // Step 4. Check new passed pawn creation through king capturing and pawn sacrifices
962     b = candidates;
963
964     while (b)
965     {
966         s = pop_1st_bit(&b);
967         sacptg = blockersCount = 0;
968         minKingDist = kingptg = 256;
969
970         // Compute plies from queening
971         queeningSquare = relative_square(loserSide, make_square(file_of(s), RANK_8));
972         movesToGo = rank_distance(s, queeningSquare) - int(relative_rank(loserSide, s) == RANK_2);
973         pliesToGo = 2 * movesToGo - int(loserSide == pos.side_to_move());
974
975         // Generate list of blocking pawns and supporters
976         supporters = neighboring_files_bb(file_of(s)) & candidates;
977         opposed = squares_in_front_of(loserSide, s) & pos.pieces(PAWN, winnerSide);
978         blockers = passed_pawn_mask(loserSide, s) & pos.pieces(PAWN, winnerSide);
979
980         assert(blockers);
981
982         // How many plies does it take to remove all the blocking pawns?
983         while (blockers)
984         {
985             blockSq = pop_1st_bit(&blockers);
986             movesToGo = 256;
987
988             // Check pawns that can give support to overcome obstacle, for instance
989             // black pawns: a4, b4 white: b2 then pawn in b4 is giving support.
990             if (!opposed)
991             {
992                 b2 = supporters & in_front_bb(winnerSide, blockSq + pawn_push(winnerSide));
993
994                 while (b2) // This while-loop could be replaced with LSB/MSB (depending on color)
995                 {
996                     d = square_distance(blockSq, pop_1st_bit(&b2)) - 2;
997                     movesToGo = std::min(movesToGo, d);
998                 }
999             }
1000
1001             // Check pawns that can be sacrificed against the blocking pawn
1002             b2 = attack_span_mask(winnerSide, blockSq) & candidates & ~(1ULL << s);
1003
1004             while (b2) // This while-loop could be replaced with LSB/MSB (depending on color)
1005             {
1006                 d = square_distance(blockSq, pop_1st_bit(&b2)) - 2;
1007                 movesToGo = std::min(movesToGo, d);
1008             }
1009
1010             // If obstacle can be destroyed with an immediate pawn exchange / sacrifice,
1011             // it's not a real obstacle and we have nothing to add to pliesToGo.
1012             if (movesToGo <= 0)
1013                 continue;
1014
1015             // Plies needed to sacrifice against all the blocking pawns
1016             sacptg += movesToGo * 2;
1017             blockersCount++;
1018
1019             // Plies needed for the king to capture all the blocking pawns
1020             d = square_distance(pos.king_square(loserSide), blockSq);
1021             minKingDist = std::min(minKingDist, d);
1022             kingptg = (minKingDist + blockersCount) * 2;
1023         }
1024
1025         // Check if pawn sacrifice plan _may_ save the day
1026         if (pliesToQueen[winnerSide] + 3 > pliesToGo + sacptg)
1027             return SCORE_ZERO;
1028
1029         // Check if king capture plan _may_ save the day (contains some false positives)
1030         if (pliesToQueen[winnerSide] + 3 > pliesToGo + kingptg)
1031             return SCORE_ZERO;
1032     }
1033
1034     // Winning pawn is unstoppable and will promote as first, return big score
1035     Score score = make_score(0, (Value) 0x500 - 0x20 * pliesToQueen[winnerSide]);
1036     return winnerSide == WHITE ? score : -score;
1037   }
1038
1039
1040   // evaluate_space() computes the space evaluation for a given side. The
1041   // space evaluation is a simple bonus based on the number of safe squares
1042   // available for minor pieces on the central four files on ranks 2--4. Safe
1043   // squares one, two or three squares behind a friendly pawn are counted
1044   // twice. Finally, the space bonus is scaled by a weight taken from the
1045   // material hash table. The aim is to improve play on game opening.
1046   template<Color Us>
1047   int evaluate_space(const Position& pos, EvalInfo& ei) {
1048
1049     const BitCountType Max15 = HasPopCnt ? CNT_POPCNT : Is64Bit ? CNT64_MAX15 : CNT32_MAX15;
1050     const Color Them = (Us == WHITE ? BLACK : WHITE);
1051
1052     // Find the safe squares for our pieces inside the area defined by
1053     // SpaceMask[]. A square is unsafe if it is attacked by an enemy
1054     // pawn, or if it is undefended and attacked by an enemy piece.
1055     Bitboard safe =   SpaceMask[Us]
1056                    & ~pos.pieces(PAWN, Us)
1057                    & ~ei.attackedBy[Them][PAWN]
1058                    & (ei.attackedBy[Us][0] | ~ei.attackedBy[Them][0]);
1059
1060     // Find all squares which are at most three squares behind some friendly pawn
1061     Bitboard behind = pos.pieces(PAWN, Us);
1062     behind |= (Us == WHITE ? behind >>  8 : behind <<  8);
1063     behind |= (Us == WHITE ? behind >> 16 : behind << 16);
1064
1065     return count_1s<Max15>(safe) + count_1s<Max15>(behind & safe);
1066   }
1067
1068
1069   // apply_weight() applies an evaluation weight to a value trying to prevent overflow
1070
1071   inline Score apply_weight(Score v, Score w) {
1072     return make_score((int(mg_value(v)) * mg_value(w)) / 0x100,
1073                       (int(eg_value(v)) * eg_value(w)) / 0x100);
1074   }
1075
1076
1077   // scale_by_game_phase() interpolates between a middle game and an endgame score,
1078   // based on game phase. It also scales the return value by a ScaleFactor array.
1079
1080   Value scale_by_game_phase(const Score& v, Phase ph, ScaleFactor sf) {
1081
1082     assert(mg_value(v) > -VALUE_INFINITE && mg_value(v) < VALUE_INFINITE);
1083     assert(eg_value(v) > -VALUE_INFINITE && eg_value(v) < VALUE_INFINITE);
1084     assert(ph >= PHASE_ENDGAME && ph <= PHASE_MIDGAME);
1085
1086     int ev = (eg_value(v) * int(sf)) / SCALE_FACTOR_NORMAL;
1087     int result = (mg_value(v) * int(ph) + ev * int(128 - ph)) / 128;
1088     return Value((result + GrainSize / 2) & ~(GrainSize - 1));
1089   }
1090
1091
1092   // weight_option() computes the value of an evaluation weight, by combining
1093   // two UCI-configurable weights (midgame and endgame) with an internal weight.
1094
1095   Score weight_option(const std::string& mgOpt, const std::string& egOpt, Score internalWeight) {
1096
1097     // Scale option value from 100 to 256
1098     int mg = Options[mgOpt] * 256 / 100;
1099     int eg = Options[egOpt] * 256 / 100;
1100
1101     return apply_weight(make_score(mg, eg), internalWeight);
1102   }
1103
1104
1105   // init_safety() initizes the king safety evaluation, based on UCI
1106   // parameters. It is called from read_weights().
1107
1108   void init_safety() {
1109
1110     const Value MaxSlope = Value(30);
1111     const Value Peak = Value(1280);
1112     Value t[100];
1113
1114     // First setup the base table
1115     for (int i = 0; i < 100; i++)
1116     {
1117         t[i] = Value(int(0.4 * i * i));
1118
1119         if (i > 0)
1120             t[i] = std::min(t[i], t[i - 1] + MaxSlope);
1121
1122         t[i] = std::min(t[i], Peak);
1123     }
1124
1125     // Then apply the weights and get the final KingDangerTable[] array
1126     for (Color c = WHITE; c <= BLACK; c++)
1127         for (int i = 0; i < 100; i++)
1128             KingDangerTable[c][i] = apply_weight(make_score(t[i], 0), Weights[KingDangerUs + c]);
1129   }
1130
1131
1132   // A couple of little helpers used by tracing code, to_cp() converts a value to
1133   // a double in centipawns scale, trace_add() stores white and black scores.
1134
1135   double to_cp(Value v) { return double(v) / double(PawnValueMidgame); }
1136
1137   void trace_add(int idx, Score wScore, Score bScore) {
1138
1139       TracedScores[WHITE][idx] = wScore;
1140       TracedScores[BLACK][idx] = bScore;
1141   }
1142
1143   // trace_row() is an helper function used by tracing code to register the
1144   // values of a single evaluation term.
1145
1146   void trace_row(const char *name, int idx) {
1147
1148     Score wScore = TracedScores[WHITE][idx];
1149     Score bScore = TracedScores[BLACK][idx];
1150
1151     switch (idx) {
1152     case PST: case IMBALANCE: case PAWN: case UNSTOPPABLE: case TOTAL:
1153         TraceStream << std::setw(20) << name << " |   ---   --- |   ---   --- | "
1154                     << std::setw(6)  << to_cp(mg_value(wScore)) << " "
1155                     << std::setw(6)  << to_cp(eg_value(wScore)) << " \n";
1156         break;
1157     default:
1158         TraceStream << std::setw(20) << name << " | " << std::noshowpos
1159                     << std::setw(5)  << to_cp(mg_value(wScore)) << " "
1160                     << std::setw(5)  << to_cp(eg_value(wScore)) << " | "
1161                     << std::setw(5)  << to_cp(mg_value(bScore)) << " "
1162                     << std::setw(5)  << to_cp(eg_value(bScore)) << " | "
1163                     << std::showpos
1164                     << std::setw(6)  << to_cp(mg_value(wScore - bScore)) << " "
1165                     << std::setw(6)  << to_cp(eg_value(wScore - bScore)) << " \n";
1166     }
1167   }
1168 }
1169
1170
1171 /// trace_evaluate() is like evaluate() but instead of a value returns a string
1172 /// suitable to be print on stdout with the detailed descriptions and values of
1173 /// each evaluation term. Used mainly for debugging.
1174
1175 std::string trace_evaluate(const Position& pos) {
1176
1177     Value margin;
1178     std::string totals;
1179
1180     TraceStream.str("");
1181     TraceStream << std::showpoint << std::showpos << std::fixed << std::setprecision(2);
1182     memset(TracedScores, 0, 2 * 16 * sizeof(Score));
1183
1184     do_evaluate<true>(pos, margin);
1185
1186     totals = TraceStream.str();
1187     TraceStream.str("");
1188
1189     TraceStream << std::setw(21) << "Eval term " << "|    White    |    Black    |     Total     \n"
1190                 <<             "                     |   MG    EG  |   MG    EG  |   MG     EG   \n"
1191                 <<             "---------------------+-------------+-------------+---------------\n";
1192
1193     trace_row("Material, PST, Tempo", PST);
1194     trace_row("Material imbalance", IMBALANCE);
1195     trace_row("Pawns", PAWN);
1196     trace_row("Knights", KNIGHT);
1197     trace_row("Bishops", BISHOP);
1198     trace_row("Rooks", ROOK);
1199     trace_row("Queens", QUEEN);
1200     trace_row("Mobility", MOBILITY);
1201     trace_row("King safety", KING);
1202     trace_row("Threats", THREAT);
1203     trace_row("Passed pawns", PASSED);
1204     trace_row("Unstoppable pawns", UNSTOPPABLE);
1205     trace_row("Space", SPACE);
1206
1207     TraceStream <<             "---------------------+-------------+-------------+---------------\n";
1208     trace_row("Total", TOTAL);
1209     TraceStream << totals;
1210
1211     return TraceStream.str();
1212 }