]> git.sesse.net Git - stockfish/blob - src/evaluate.cpp
Remove a redundant check in passed pawn eval
[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
21 ////
22 //// Includes
23 ////
24
25 #include <cassert>
26 #include <cstring>
27
28 #include "bitcount.h"
29 #include "evaluate.h"
30 #include "material.h"
31 #include "pawns.h"
32 #include "scale.h"
33 #include "thread.h"
34 #include "ucioption.h"
35
36
37 ////
38 //// Local definitions
39 ////
40
41 namespace {
42
43   const int Sign[2] = { 1, -1 };
44
45   // Evaluation grain size, must be a power of 2
46   const int GrainSize = 8;
47
48   // Evaluation weights, initialized from UCI options
49   enum { Mobility, PawnStructure, PassedPawns, Space, KingDangerUs, KingDangerThem };
50   Score Weights[6];
51
52   typedef Value V;
53   #define S(mg, eg) make_score(mg, eg)
54
55   // Internal evaluation weights. These are applied on top of the evaluation
56   // weights read from UCI parameters. The purpose is to be able to change
57   // the evaluation weights while keeping the default values of the UCI
58   // parameters at 100, which looks prettier.
59   //
60   // Values modified by Joona Kiiski
61   const Score WeightsInternal[] = {
62       S(248, 271), S(233, 201), S(252, 259), S(46, 0), S(247, 0), S(259, 0)
63   };
64
65   // Knight mobility bonus in middle game and endgame, indexed by the number
66   // of attacked squares not occupied by friendly piecess.
67   const Score KnightMobilityBonus[16] = {
68     S(-38,-33), S(-25,-23), S(-12,-13), S( 0,-3),
69     S( 12,  7), S( 25, 17), S( 31, 22), S(38, 27), S(38, 27)
70   };
71
72   // Bishop mobility bonus in middle game and endgame, indexed by the number
73   // of attacked squares not occupied by friendly pieces. X-ray attacks through
74   // queens are also included.
75   const Score BishopMobilityBonus[16] = {
76     S(-25,-30), S(-11,-16), S( 3, -2), S(17, 12),
77     S( 31, 26), S( 45, 40), S(57, 52), S(65, 60),
78     S( 71, 65), S( 74, 69), S(76, 71), S(78, 73),
79     S( 79, 74), S( 80, 75), S(81, 76), S(81, 76)
80   };
81
82   // Rook mobility bonus in middle game and endgame, indexed by the number
83   // of attacked squares not occupied by friendly pieces. X-ray attacks through
84   // queens and rooks are also included.
85   const Score RookMobilityBonus[16] = {
86     S(-20,-36), S(-14,-19), S(-8, -3), S(-2, 13),
87     S(  4, 29), S( 10, 46), S(14, 62), S(19, 79),
88     S( 23, 95), S( 26,106), S(27,111), S(28,114),
89     S( 29,116), S( 30,117), S(31,118), S(32,118)
90   };
91
92   // Queen mobility bonus in middle game and endgame, indexed by the number
93   // of attacked squares not occupied by friendly pieces.
94   const Score QueenMobilityBonus[32] = {
95     S(-10,-18), S(-8,-13), S(-6, -7), S(-3, -2), S(-1,  3), S( 1,  8),
96     S(  3, 13), S( 5, 19), S( 8, 23), S(10, 27), S(12, 32), S(15, 34),
97     S( 16, 35), S(17, 35), S(18, 35), S(20, 35), S(20, 35), S(20, 35),
98     S( 20, 35), S(20, 35), S(20, 35), S(20, 35), S(20, 35), S(20, 35),
99     S( 20, 35), S(20, 35), S(20, 35), S(20, 35), S(20, 35), S(20, 35),
100     S( 20, 35), S(20, 35)
101   };
102
103   // Pointers table to access mobility tables through piece type
104   const Score* MobilityBonus[8] = { 0, 0, KnightMobilityBonus, BishopMobilityBonus,
105                                     RookMobilityBonus, QueenMobilityBonus, 0, 0 };
106
107   // Outpost bonuses for knights and bishops, indexed by square (from white's
108   // point of view).
109   const Value KnightOutpostBonus[64] = {
110   //  A     B     C     D     E     F     G     H
111     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0), // 1
112     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0), // 2
113     V(0), V(0), V(4), V(8), V(8), V(4), V(0), V(0), // 3
114     V(0), V(4),V(17),V(26),V(26),V(17), V(4), V(0), // 4
115     V(0), V(8),V(26),V(35),V(35),V(26), V(8), V(0), // 5
116     V(0), V(4),V(17),V(17),V(17),V(17), V(4), V(0), // 6
117     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0), // 7
118     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0)  // 8
119   };
120
121   const Value BishopOutpostBonus[64] = {
122   //  A     B     C     D     E     F     G     H
123     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0), // 1
124     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0), // 2
125     V(0), V(0), V(5), V(5), V(5), V(5), V(0), V(0), // 3
126     V(0), V(5),V(10),V(10),V(10),V(10), V(5), V(0), // 4
127     V(0),V(10),V(21),V(21),V(21),V(21),V(10), V(0), // 5
128     V(0), V(5), V(8), V(8), V(8), V(8), V(5), V(0), // 6
129     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0), // 7
130     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0)  // 8
131   };
132
133   // ThreatBonus[attacking][attacked] contains bonus according to which
134   // piece type attacks which one.
135   const Score ThreatBonus[8][8] = {
136     {}, {},
137     { S(0, 0), S( 7, 39), S( 0,  0), S(24, 49), S(41,100), S(41,100) }, // KNIGHT
138     { S(0, 0), S( 7, 39), S(24, 49), S( 0,  0), S(41,100), S(41,100) }, // BISHOP
139     { S(0, 0), S(-1, 29), S(15, 49), S(15, 49), S( 0,  0), S(24, 49) }, // ROOK
140     { S(0, 0), S(15, 39), S(15, 39), S(15, 39), S(15, 39), S( 0,  0) }  // QUEEN
141   };
142
143   // ThreatedByPawnPenalty[] contains a penalty according to which piece
144   // type is attacked by an enemy pawn.
145   const Score ThreatedByPawnPenalty[8] = {
146     S(0, 0), S(0, 0), S(56, 70), S(56, 70), S(76, 99), S(86, 118)
147   };
148
149   #undef S
150
151   // Bonus for unstoppable passed pawns
152   const Value UnstoppablePawnValue = Value(0x500);
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 a7/h7 (a2/h2 for black) which is trapped by
167   // enemy pawns.
168   const Score TrappedBishopA7H7Penalty = make_score(300, 300);
169
170   // Bitboard masks for detecting trapped bishops on a7/h7 (a2/h2 for black)
171   const Bitboard MaskA7H7[2] = {
172     ((1ULL << SQ_A7) | (1ULL << SQ_H7)),
173     ((1ULL << SQ_A2) | (1ULL << SQ_H2))
174   };
175
176   // Penalty for a bishop on a1/h1 (a8/h8 for black) which is trapped by
177   // a friendly pawn on b2/g2 (b7/g7 for black). This can obviously only
178   // happen in Chess960 games.
179   const Score TrappedBishopA1H1Penalty = make_score(100, 100);
180
181   // Bitboard masks for detecting trapped bishops on a1/h1 (a8/h8 for black)
182   const Bitboard MaskA1H1[2] = {
183     ((1ULL << SQ_A1) | (1ULL << SQ_H1)),
184     ((1ULL << SQ_A8) | (1ULL << SQ_H8))
185   };
186
187   // The SpaceMask[color] contains the area of the board which is considered
188   // by the space evaluation. In the middle game, each side is given a bonus
189   // based on how many squares inside this area are safe and available for
190   // friendly minor pieces.
191   const Bitboard SpaceMask[2] = {
192     (1ULL<<SQ_C2) | (1ULL<<SQ_D2) | (1ULL<<SQ_E2) | (1ULL<<SQ_F2) |
193     (1ULL<<SQ_C3) | (1ULL<<SQ_D3) | (1ULL<<SQ_E3) | (1ULL<<SQ_F3) |
194     (1ULL<<SQ_C4) | (1ULL<<SQ_D4) | (1ULL<<SQ_E4) | (1ULL<<SQ_F4),
195     (1ULL<<SQ_C7) | (1ULL<<SQ_D7) | (1ULL<<SQ_E7) | (1ULL<<SQ_F7) |
196     (1ULL<<SQ_C6) | (1ULL<<SQ_D6) | (1ULL<<SQ_E6) | (1ULL<<SQ_F6) |
197     (1ULL<<SQ_C5) | (1ULL<<SQ_D5) | (1ULL<<SQ_E5) | (1ULL<<SQ_F5)
198   };
199
200   /// King danger constants and variables. The king danger scores are taken
201   /// from the KingDangerTable[]. Various little "meta-bonuses" measuring
202   /// the strength of the enemy attack are added up into an integer, which
203   /// is used as an index to KingDangerTable[].
204
205   // KingAttackWeights[] contains king attack weights by piece type
206   const int KingAttackWeights[8] = { 0, 0, 2, 2, 3, 5 };
207
208   // Bonuses for enemy's safe checks
209   const int QueenContactCheckBonus = 3;
210   const int QueenCheckBonus        = 2;
211   const int RookCheckBonus         = 1;
212   const int BishopCheckBonus       = 1;
213   const int KnightCheckBonus       = 1;
214
215   // InitKingDanger[] contains bonuses based on the position of the defending
216   // king.
217   const int InitKingDanger[64] = {
218      2,  0,  2,  5,  5,  2,  0,  2,
219      2,  2,  4,  8,  8,  4,  2,  2,
220      7, 10, 12, 12, 12, 12, 10,  7,
221     15, 15, 15, 15, 15, 15, 15, 15,
222     15, 15, 15, 15, 15, 15, 15, 15,
223     15, 15, 15, 15, 15, 15, 15, 15,
224     15, 15, 15, 15, 15, 15, 15, 15,
225     15, 15, 15, 15, 15, 15, 15, 15
226   };
227
228   // KingDangerTable[color][] contains the actual king danger weighted scores
229   Score KingDangerTable[2][128];
230
231   // Pawn and material hash tables, indexed by the current thread id.
232   // Note that they will be initialized at 0 being global variables.
233   MaterialInfoTable* MaterialTable[MAX_THREADS];
234   PawnInfoTable* PawnTable[MAX_THREADS];
235
236   // Sizes of pawn and material hash tables
237   const int PawnTableSize = 16384;
238   const int MaterialTableSize = 1024;
239
240   // Function prototypes
241   template<bool HasPopCnt>
242   Value do_evaluate(const Position& pos, EvalInfo& ei);
243
244   template<Color Us, bool HasPopCnt>
245   void init_attack_tables(const Position& pos, EvalInfo& ei);
246
247   template<Color Us, bool HasPopCnt>
248   void evaluate_pieces_of_color(const Position& pos, EvalInfo& ei);
249
250   template<Color Us, bool HasPopCnt>
251   void evaluate_king(const Position& pos, EvalInfo& ei);
252
253   template<Color Us>
254   void evaluate_threats(const Position& pos, EvalInfo& ei);
255
256   template<Color Us, bool HasPopCnt>
257   int evaluate_space(const Position& pos, EvalInfo& ei);
258
259   template<Color Us>
260   void evaluate_passed_pawns(const Position& pos, EvalInfo& ei);
261
262   void evaluate_unstoppable_pawns(const Position& pos, EvalInfo& ei);
263   void evaluate_trapped_bishop_a7h7(const Position& pos, Square s, Color us, EvalInfo& ei);
264   void evaluate_trapped_bishop_a1h1(const Position& pos, Square s, Color us, EvalInfo& ei);
265   inline Score apply_weight(Score v, Score weight);
266   Value scale_by_game_phase(const Score& v, Phase ph, const ScaleFactor sf[]);
267   Score weight_option(const std::string& mgOpt, const std::string& egOpt, Score internalWeight);
268   void init_safety();
269 }
270
271
272 ////
273 //// Functions
274 ////
275
276 /// evaluate() is the main evaluation function. It always computes two
277 /// values, an endgame score and a middle game score, and interpolates
278 /// between them based on the remaining material.
279 Value evaluate(const Position& pos, EvalInfo& ei) {
280
281     return CpuHasPOPCNT ? do_evaluate<true>(pos, ei)
282                         : do_evaluate<false>(pos, ei);
283 }
284
285 namespace {
286
287 template<bool HasPopCnt>
288 Value do_evaluate(const Position& pos, EvalInfo& ei) {
289
290   ScaleFactor factor[2];
291
292   assert(pos.is_ok());
293   assert(pos.thread() >= 0 && pos.thread() < MAX_THREADS);
294   assert(!pos.is_check());
295
296   memset(&ei, 0, sizeof(EvalInfo));
297
298   // Initialize by reading the incrementally updated scores included in the
299   // position object (material + piece square tables)
300   ei.value = pos.value();
301
302   // Probe the material hash table
303   ei.mi = MaterialTable[pos.thread()]->get_material_info(pos);
304   ei.value += ei.mi->material_value();
305
306   // If we have a specialized evaluation function for the current material
307   // configuration, call it and return
308   if (ei.mi->specialized_eval_exists())
309       return ei.mi->evaluate(pos);
310
311   // After get_material_info() call that modifies them
312   factor[WHITE] = ei.mi->scale_factor(pos, WHITE);
313   factor[BLACK] = ei.mi->scale_factor(pos, BLACK);
314
315   // Probe the pawn hash table
316   ei.pi = PawnTable[pos.thread()]->get_pawn_info(pos);
317   ei.value += apply_weight(ei.pi->pawns_value(), Weights[PawnStructure]);
318
319   // Initialize attack bitboards with pawns evaluation
320   init_attack_tables<WHITE, HasPopCnt>(pos, ei);
321   init_attack_tables<BLACK, HasPopCnt>(pos, ei);
322
323   // Evaluate pieces
324   evaluate_pieces_of_color<WHITE, HasPopCnt>(pos, ei);
325   evaluate_pieces_of_color<BLACK, HasPopCnt>(pos, ei);
326
327   // Kings. Kings are evaluated after all other pieces for both sides,
328   // because we need complete attack information for all pieces when computing
329   // the king safety evaluation.
330   evaluate_king<WHITE, HasPopCnt>(pos, ei);
331   evaluate_king<BLACK, HasPopCnt>(pos, ei);
332
333   // Evaluate tactical threats, we need full attack info including king
334   evaluate_threats<WHITE>(pos, ei);
335   evaluate_threats<BLACK>(pos, ei);
336
337   // Evaluate passed pawns, we need full attack info including king
338   evaluate_passed_pawns<WHITE>(pos, ei);
339   evaluate_passed_pawns<BLACK>(pos, ei);
340
341   // If one side has only a king, check whether exsists any unstoppable passed pawn
342   if (!pos.non_pawn_material(WHITE) || !pos.non_pawn_material(BLACK))
343       evaluate_unstoppable_pawns(pos, ei);
344
345   Phase phase = ei.mi->game_phase();
346
347   // Middle-game specific evaluation terms
348   if (phase > PHASE_ENDGAME)
349   {
350       // Pawn storms in positions with opposite castling
351       if (   square_file(pos.king_square(WHITE)) >= FILE_E
352           && square_file(pos.king_square(BLACK)) <= FILE_D)
353
354           ei.value += make_score(ei.pi->queenside_storm_value(WHITE) - ei.pi->kingside_storm_value(BLACK), 0);
355
356       else if (   square_file(pos.king_square(WHITE)) <= FILE_D
357                && square_file(pos.king_square(BLACK)) >= FILE_E)
358
359           ei.value += make_score(ei.pi->kingside_storm_value(WHITE) - ei.pi->queenside_storm_value(BLACK), 0);
360
361       // Evaluate space for both sides
362       if (ei.mi->space_weight() > 0)
363       {
364           int s = evaluate_space<WHITE, HasPopCnt>(pos, ei) - evaluate_space<BLACK, HasPopCnt>(pos, ei);
365           ei.value += apply_weight(make_score(s * ei.mi->space_weight(), 0), Weights[Space]);
366       }
367   }
368
369   // Mobility
370   ei.value += apply_weight(ei.mobility, Weights[Mobility]);
371
372   // If we don't already have an unusual scale factor, check for opposite
373   // colored bishop endgames, and use a lower scale for those
374   if (   phase < PHASE_MIDGAME
375       && pos.opposite_colored_bishops()
376       && (   (factor[WHITE] == SCALE_FACTOR_NORMAL && eg_value(ei.value) > Value(0))
377           || (factor[BLACK] == SCALE_FACTOR_NORMAL && eg_value(ei.value) < Value(0))))
378   {
379       ScaleFactor sf;
380
381       // Only the two bishops ?
382       if (   pos.non_pawn_material(WHITE) == BishopValueMidgame
383           && pos.non_pawn_material(BLACK) == BishopValueMidgame)
384       {
385           // Check for KBP vs KB with only a single pawn that is almost
386           // certainly a draw or at least two pawns.
387           bool one_pawn = (pos.piece_count(WHITE, PAWN) + pos.piece_count(BLACK, PAWN) == 1);
388           sf = one_pawn ? ScaleFactor(8) : ScaleFactor(32);
389       }
390       else
391           // Endgame with opposite-colored bishops, but also other pieces. Still
392           // a bit drawish, but not as drawish as with only the two bishops.
393            sf = ScaleFactor(50);
394
395       if (factor[WHITE] == SCALE_FACTOR_NORMAL)
396           factor[WHITE] = sf;
397       if (factor[BLACK] == SCALE_FACTOR_NORMAL)
398           factor[BLACK] = sf;
399   }
400
401   // Interpolate between the middle game and the endgame score
402   return Sign[pos.side_to_move()] * scale_by_game_phase(ei.value, phase, factor);
403 }
404
405 } // namespace
406
407 /// init_eval() initializes various tables used by the evaluation function
408
409 void init_eval(int threads) {
410
411   assert(threads <= MAX_THREADS);
412
413   for (int i = 0; i < MAX_THREADS; i++)
414   {
415     if (i >= threads)
416     {
417         delete PawnTable[i];
418         delete MaterialTable[i];
419         PawnTable[i] = NULL;
420         MaterialTable[i] = NULL;
421         continue;
422     }
423     if (!PawnTable[i])
424         PawnTable[i] = new PawnInfoTable(PawnTableSize);
425     if (!MaterialTable[i])
426         MaterialTable[i] = new MaterialInfoTable(MaterialTableSize);
427   }
428 }
429
430
431 /// quit_eval() releases heap-allocated memory at program termination
432
433 void quit_eval() {
434
435   for (int i = 0; i < MAX_THREADS; i++)
436   {
437       delete PawnTable[i];
438       delete MaterialTable[i];
439       PawnTable[i] = NULL;
440       MaterialTable[i] = NULL;
441   }
442 }
443
444
445 /// read_weights() reads evaluation weights from the corresponding UCI parameters
446
447 void read_weights(Color us) {
448
449   // King safety is asymmetrical. Our king danger level is weighted by
450   // "Cowardice" UCI parameter, instead the opponent one by "Aggressiveness".
451   const int kingDangerUs   = (us == WHITE ? KingDangerUs   : KingDangerThem);
452   const int kingDangerThem = (us == WHITE ? KingDangerThem : KingDangerUs);
453
454   Weights[Mobility]       = weight_option("Mobility (Middle Game)", "Mobility (Endgame)", WeightsInternal[Mobility]);
455   Weights[PawnStructure]  = weight_option("Pawn Structure (Middle Game)", "Pawn Structure (Endgame)", WeightsInternal[PawnStructure]);
456   Weights[PassedPawns]    = weight_option("Passed Pawns (Middle Game)", "Passed Pawns (Endgame)", WeightsInternal[PassedPawns]);
457   Weights[Space]          = weight_option("Space", "Space", WeightsInternal[Space]);
458   Weights[kingDangerUs]   = weight_option("Cowardice", "Cowardice", WeightsInternal[KingDangerUs]);
459   Weights[kingDangerThem] = weight_option("Aggressiveness", "Aggressiveness", WeightsInternal[KingDangerThem]);
460
461   // If running in analysis mode, make sure we use symmetrical king safety. We do this
462   // by replacing both Weights[kingDangerUs] and Weights[kingDangerThem] by their average.
463   if (get_option_value_bool("UCI_AnalyseMode"))
464       Weights[kingDangerUs] = Weights[kingDangerThem] = (Weights[kingDangerUs] + Weights[kingDangerThem]) / 2;
465
466   init_safety();
467 }
468
469
470 namespace {
471
472   // init_attack_tables() initializes king bitboards for both sides adding
473   // pawn attacks. To be done before other evaluations.
474
475   template<Color Us, bool HasPopCnt>
476   void init_attack_tables(const Position& pos, EvalInfo& ei) {
477
478     const Color Them = (Us == WHITE ? BLACK : WHITE);
479
480     Bitboard b = ei.attackedBy[Them][KING] = pos.attacks_from<KING>(pos.king_square(Them));
481     ei.kingZone[Us] = (b | (Us == WHITE ? b >> 8 : b << 8));
482     ei.attackedBy[Us][PAWN] = ei.pi->pawn_attacks(Us);
483     b &= ei.attackedBy[Us][PAWN];
484     if (b)
485         ei.kingAttackersCount[Us] = count_1s_max_15<HasPopCnt>(b) / 2;
486   }
487
488
489   // evaluate_outposts() evaluates bishop and knight outposts squares
490
491   template<PieceType Piece, Color Us>
492   void evaluate_outposts(const Position& pos, EvalInfo& ei, Square s) {
493
494     const Color Them = (Us == WHITE ? BLACK : WHITE);
495
496     // Initial bonus based on square
497     Value bonus = (Piece == BISHOP ? BishopOutpostBonus[relative_square(Us, s)]
498                                    : KnightOutpostBonus[relative_square(Us, s)]);
499
500     // Increase bonus if supported by pawn, especially if the opponent has
501     // no minor piece which can exchange the outpost piece
502     if (bonus && bit_is_set(ei.attackedBy[Us][PAWN], s))
503     {
504         if (    pos.pieces(KNIGHT, Them) == EmptyBoardBB
505             && (SquaresByColorBB[square_color(s)] & pos.pieces(BISHOP, Them)) == EmptyBoardBB)
506             bonus += bonus + bonus / 2;
507         else
508             bonus += bonus / 2;
509     }
510     ei.value += Sign[Us] * make_score(bonus, bonus);
511   }
512
513
514   // evaluate_pieces<>() assigns bonuses and penalties to the pieces of a given color
515
516   template<PieceType Piece, Color Us, bool HasPopCnt>
517   void evaluate_pieces(const Position& pos, EvalInfo& ei, Bitboard no_mob_area) {
518
519     Bitboard b;
520     Square s, ksq;
521     int mob;
522     File f;
523
524     const Color Them = (Us == WHITE ? BLACK : WHITE);
525     const Square* ptr = pos.piece_list_begin(Us, Piece);
526
527     while ((s = *ptr++) != SQ_NONE)
528     {
529         // Find attacked squares, including x-ray attacks for bishops and rooks
530         if (Piece == KNIGHT || Piece == QUEEN)
531             b = pos.attacks_from<Piece>(s);
532         else if (Piece == BISHOP)
533             b = bishop_attacks_bb(s, pos.occupied_squares() & ~pos.pieces(QUEEN, Us));
534         else if (Piece == ROOK)
535             b = rook_attacks_bb(s, pos.occupied_squares() & ~pos.pieces(ROOK, QUEEN, Us));
536         else
537             assert(false);
538
539         // Update attack info
540         ei.attackedBy[Us][Piece] |= b;
541
542         // King attacks
543         if (b & ei.kingZone[Us])
544         {
545             ei.kingAttackersCount[Us]++;
546             ei.kingAttackersWeight[Us] += KingAttackWeights[Piece];
547             Bitboard bb = (b & ei.attackedBy[Them][KING]);
548             if (bb)
549                 ei.kingAdjacentZoneAttacksCount[Us] += count_1s_max_15<HasPopCnt>(bb);
550         }
551
552         // Mobility
553         mob = (Piece != QUEEN ? count_1s_max_15<HasPopCnt>(b & no_mob_area)
554                               : count_1s<HasPopCnt>(b & no_mob_area));
555
556         ei.mobility += Sign[Us] * MobilityBonus[Piece][mob];
557
558         // Decrease score if we are attacked by an enemy pawn. Remaining part
559         // of threat evaluation must be done later when we have full attack info.
560         if (bit_is_set(ei.attackedBy[Them][PAWN], s))
561             ei.value -= Sign[Us] * ThreatedByPawnPenalty[Piece];
562
563         // Bishop and knight outposts squares
564         if ((Piece == BISHOP || Piece == KNIGHT) && pos.square_is_weak(s, Us))
565             evaluate_outposts<Piece, Us>(pos, ei, s);
566
567         // Special patterns: trapped bishops on a7/h7/a2/h2
568         // and trapped bishops on a1/h1/a8/h8 in Chess960.
569         if (Piece == BISHOP)
570         {
571             if (bit_is_set(MaskA7H7[Us], s))
572                 evaluate_trapped_bishop_a7h7(pos, s, Us, ei);
573
574             if (Chess960 && bit_is_set(MaskA1H1[Us], s))
575                 evaluate_trapped_bishop_a1h1(pos, s, Us, ei);
576         }
577
578         // Queen or rook on 7th rank
579         if (  (Piece == ROOK || Piece == QUEEN)
580             && relative_rank(Us, s) == RANK_7
581             && relative_rank(Us, pos.king_square(Them)) == RANK_8)
582         {
583             ei.value += Sign[Us] * (Piece == ROOK ? RookOn7thBonus : QueenOn7thBonus);
584         }
585
586         // Special extra evaluation for rooks
587         if (Piece == ROOK)
588         {
589             // Open and half-open files
590             f = square_file(s);
591             if (ei.pi->file_is_half_open(Us, f))
592             {
593                 if (ei.pi->file_is_half_open(Them, f))
594                     ei.value += Sign[Us] * RookOpenFileBonus;
595                 else
596                     ei.value += Sign[Us] * RookHalfOpenFileBonus;
597             }
598
599             // Penalize rooks which are trapped inside a king. Penalize more if
600             // king has lost right to castle.
601             if (mob > 6 || ei.pi->file_is_half_open(Us, f))
602                 continue;
603
604             ksq = pos.king_square(Us);
605
606             if (    square_file(ksq) >= FILE_E
607                 &&  square_file(s) > square_file(ksq)
608                 && (relative_rank(Us, ksq) == RANK_1 || square_rank(ksq) == square_rank(s)))
609             {
610                 // Is there a half-open file between the king and the edge of the board?
611                 if (!ei.pi->has_open_file_to_right(Us, square_file(ksq)))
612                     ei.value -= Sign[Us] * make_score(pos.can_castle(Us) ? (TrappedRookPenalty - mob * 16) / 2
613                                                                          : (TrappedRookPenalty - mob * 16), 0);
614             }
615             else if (    square_file(ksq) <= FILE_D
616                      &&  square_file(s) < square_file(ksq)
617                      && (relative_rank(Us, ksq) == RANK_1 || square_rank(ksq) == square_rank(s)))
618             {
619                 // Is there a half-open file between the king and the edge of the board?
620                 if (!ei.pi->has_open_file_to_left(Us, square_file(ksq)))
621                     ei.value -= Sign[Us] * make_score(pos.can_castle(Us) ? (TrappedRookPenalty - mob * 16) / 2
622                                                                          : (TrappedRookPenalty - mob * 16), 0);
623             }
624         }
625     }
626   }
627
628
629   // evaluate_threats<>() assigns bonuses according to the type of attacking piece
630   // and the type of attacked one.
631
632   template<Color Us>
633   void evaluate_threats(const Position& pos, EvalInfo& ei) {
634
635     const Color Them = (Us == WHITE ? BLACK : WHITE);
636
637     Bitboard b;
638     Score bonus = make_score(0, 0);
639
640     // Enemy pieces not defended by a pawn and under our attack
641     Bitboard weakEnemies =  pos.pieces_of_color(Them)
642                           & ~ei.attackedBy[Them][PAWN]
643                           & ei.attackedBy[Us][0];
644     if (!weakEnemies)
645         return;
646
647     // Add bonus according to type of attacked enemy pieces and to the
648     // type of attacking piece, from knights to queens. Kings are not
649     // considered because are already special handled in king evaluation.
650     for (PieceType pt1 = KNIGHT; pt1 < KING; pt1++)
651     {
652         b = ei.attackedBy[Us][pt1] & weakEnemies;
653         if (b)
654             for (PieceType pt2 = PAWN; pt2 < KING; pt2++)
655                 if (b & pos.pieces(pt2))
656                     bonus += ThreatBonus[pt1][pt2];
657     }
658     ei.value += Sign[Us] * bonus;
659   }
660
661
662   // evaluate_pieces_of_color<>() assigns bonuses and penalties to all the
663   // pieces of a given color.
664
665   template<Color Us, bool HasPopCnt>
666   void evaluate_pieces_of_color(const Position& pos, EvalInfo& ei) {
667
668     const Color Them = (Us == WHITE ? BLACK : WHITE);
669
670     // Do not include in mobility squares protected by enemy pawns or occupied by our pieces
671     const Bitboard no_mob_area = ~(ei.attackedBy[Them][PAWN] | pos.pieces_of_color(Us));
672
673     evaluate_pieces<KNIGHT, Us, HasPopCnt>(pos, ei, no_mob_area);
674     evaluate_pieces<BISHOP, Us, HasPopCnt>(pos, ei, no_mob_area);
675     evaluate_pieces<ROOK,   Us, HasPopCnt>(pos, ei, no_mob_area);
676     evaluate_pieces<QUEEN,  Us, HasPopCnt>(pos, ei, no_mob_area);
677
678     // Sum up all attacked squares
679     ei.attackedBy[Us][0] =   ei.attackedBy[Us][PAWN]   | ei.attackedBy[Us][KNIGHT]
680                            | ei.attackedBy[Us][BISHOP] | ei.attackedBy[Us][ROOK]
681                            | ei.attackedBy[Us][QUEEN]  | ei.attackedBy[Us][KING];
682   }
683
684
685   // evaluate_king<>() assigns bonuses and penalties to a king of a given color
686
687   template<Color Us, bool HasPopCnt>
688   void evaluate_king(const Position& pos, EvalInfo& ei) {
689
690     const Color Them = (Us == WHITE ? BLACK : WHITE);
691
692     Bitboard undefended, b, b1, b2, safe;
693     bool sente;
694     int attackUnits, shelter = 0;
695     const Square ksq = pos.king_square(Us);
696
697     // King shelter
698     if (relative_rank(Us, ksq) <= RANK_4)
699     {
700         shelter = ei.pi->get_king_shelter(pos, Us, ksq);
701         ei.value += Sign[Us] * make_score(shelter, 0);
702     }
703
704     // King safety. This is quite complicated, and is almost certainly far
705     // from optimally tuned.
706     if (   pos.piece_count(Them, QUEEN) >= 1
707         && ei.kingAttackersCount[Them]  >= 2
708         && pos.non_pawn_material(Them)  >= QueenValueMidgame + RookValueMidgame
709         && ei.kingAdjacentZoneAttacksCount[Them])
710     {
711         // Is it the attackers turn to move?
712         sente = (Them == pos.side_to_move());
713
714         // Find the attacked squares around the king which has no defenders
715         // apart from the king itself
716         undefended = ei.attacked_by(Them) & ei.attacked_by(Us, KING);
717         undefended &= ~(  ei.attacked_by(Us, PAWN)   | ei.attacked_by(Us, KNIGHT)
718                         | ei.attacked_by(Us, BISHOP) | ei.attacked_by(Us, ROOK)
719                         | ei.attacked_by(Us, QUEEN));
720
721         // Initialize the 'attackUnits' variable, which is used later on as an
722         // index to the KingDangerTable[] array. The initial value is based on
723         // the number and types of the enemy's attacking pieces, the number of
724         // attacked and undefended squares around our king, the square of the
725         // king, and the quality of the pawn shelter.
726         attackUnits =  Min(25, (ei.kingAttackersCount[Them] * ei.kingAttackersWeight[Them]) / 2)
727                      + 3 * (ei.kingAdjacentZoneAttacksCount[Them] + count_1s_max_15<HasPopCnt>(undefended))
728                      + InitKingDanger[relative_square(Us, ksq)]
729                      - shelter / 32;
730
731         // Analyse enemy's safe queen contact checks. First find undefended
732         // squares around the king attacked by enemy queen...
733         b = undefended & ei.attacked_by(Them, QUEEN) & ~pos.pieces_of_color(Them);
734         if (b)
735         {
736             // ...then remove squares not supported by another enemy piece
737             b &= (  ei.attacked_by(Them, PAWN)   | ei.attacked_by(Them, KNIGHT)
738                   | ei.attacked_by(Them, BISHOP) | ei.attacked_by(Them, ROOK));
739             if (b)
740                 attackUnits += QueenContactCheckBonus * count_1s_max_15<HasPopCnt>(b) * (sente ? 2 : 1);
741         }
742
743         // Analyse enemy's safe distance checks for sliders and knights
744         safe = ~(pos.pieces_of_color(Them) | ei.attacked_by(Us));
745
746         b1 = pos.attacks_from<ROOK>(ksq) & safe;
747         b2 = pos.attacks_from<BISHOP>(ksq) & safe;
748
749         // Enemy queen safe checks
750         b = (b1 | b2) & ei.attacked_by(Them, QUEEN);
751         if (b)
752             attackUnits += QueenCheckBonus * count_1s_max_15<HasPopCnt>(b);
753
754         // Enemy rooks safe checks
755         b = b1 & ei.attacked_by(Them, ROOK);
756         if (b)
757             attackUnits += RookCheckBonus * count_1s_max_15<HasPopCnt>(b);
758
759         // Enemy bishops safe checks
760         b = b2 & ei.attacked_by(Them, BISHOP);
761         if (b)
762             attackUnits += BishopCheckBonus * count_1s_max_15<HasPopCnt>(b);
763
764         // Enemy knights safe checks
765         b = pos.attacks_from<KNIGHT>(ksq) & ei.attacked_by(Them, KNIGHT) & safe;
766         if (b)
767             attackUnits += KnightCheckBonus * count_1s_max_15<HasPopCnt>(b);
768
769         // To index KingDangerTable[] attackUnits must be in [0, 99] range
770         attackUnits = Min(99, Max(0, attackUnits));
771
772         // Finally, extract the king danger score from the KingDangerTable[]
773         // array and subtract the score from evaluation. Set also ei.kingDanger[]
774         // value that will be used for pruning because this value can sometimes
775         // be very big, and so capturing a single attacking piece can therefore
776         // result in a score change far bigger than the value of the captured piece.
777         ei.value -= Sign[Us] * KingDangerTable[Us][attackUnits];
778         ei.kingDanger[Us] = mg_value(KingDangerTable[Us][attackUnits]);
779     }
780   }
781
782
783   // evaluate_passed_pawns<>() evaluates the passed pawns of the given color
784
785   template<Color Us>
786   void evaluate_passed_pawns(const Position& pos, EvalInfo& ei) {
787
788     const Color Them = (Us == WHITE ? BLACK : WHITE);
789
790     Bitboard squaresToQueen, defendedSquares, unsafeSquares, supportingPawns;
791     Bitboard b = ei.pi->passed_pawns() & pos.pieces_of_color(Us);
792
793     while (b)
794     {
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 tr = r * (r - 1);
801
802         // Base bonus based on rank
803         Value mbonus = Value(20 * tr);
804         Value ebonus = Value(10 + r * r * 10);
805
806         if (tr)
807         {
808             Square blockSq = s + pawn_push(Us);
809
810             // Adjust bonus based on kings proximity
811             ebonus -= Value(square_distance(pos.king_square(Us), blockSq) * 3 * tr);
812             ebonus -= Value(square_distance(pos.king_square(Us), blockSq + pawn_push(Us)) * 1 * tr);
813             ebonus += Value(square_distance(pos.king_square(Them), blockSq) * 6 * tr);
814
815             // If the pawn is free to advance, increase bonus
816             if (pos.square_is_empty(blockSq))
817             {
818                 squaresToQueen = squares_in_front_of(Us, s);
819                 defendedSquares = squaresToQueen & ei.attacked_by(Us);
820
821                 // If there is an enemy rook or queen attacking the pawn from behind,
822                 // add all X-ray attacks by the rook or queen. Otherwise consider only
823                 // the squares in the pawn's path attacked or occupied by the enemy.
824                 if (   (squares_behind(Us, s) & pos.pieces(ROOK, QUEEN, Them))
825                     && (squares_behind(Us, s) & pos.pieces(ROOK, QUEEN, Them) & pos.attacks_from<QUEEN>(s)))
826                     unsafeSquares = squaresToQueen;
827                 else
828                     unsafeSquares = squaresToQueen & (ei.attacked_by(Them) | pos.pieces_of_color(Them));
829
830                 // If there aren't enemy attacks or pieces along the path to queen give
831                 // huge bonus. Even bigger if we protect the pawn's path.
832                 if (!unsafeSquares)
833                     ebonus += Value(tr * (squaresToQueen == defendedSquares ? 17 : 15));
834                 else
835                     // OK, there are enemy attacks or pieces (but not pawns). Are those
836                     // squares which are attacked by the enemy also attacked by us ?
837                     // If yes, big bonus (but smaller than when there are no enemy attacks),
838                     // if no, somewhat smaller bonus.
839                     ebonus += Value(tr * ((unsafeSquares & defendedSquares) == unsafeSquares ? 13 : 8));
840
841                 // At last, add a small bonus when there are no *friendly* pieces
842                 // in the pawn's path.
843                 if (!(squaresToQueen & pos.pieces_of_color(Us)))
844                     ebonus += Value(tr);
845             }
846         } // tr != 0
847
848         // Increase the bonus if the passed pawn is supported by a friendly pawn
849         // on the same rank and a bit smaller if it's on the previous rank.
850         supportingPawns = pos.pieces(PAWN, Us) & neighboring_files_bb(s);
851         if (supportingPawns & rank_bb(s))
852             ebonus += Value(r * 20);
853         else if (supportingPawns & rank_bb(s - pawn_push(Us)))
854             ebonus += Value(r * 12);
855
856         // Rook pawns are a special case: They are sometimes worse, and
857         // sometimes better than other passed pawns. It is difficult to find
858         // good rules for determining whether they are good or bad. For now,
859         // we try the following: Increase the value for rook pawns if the
860         // other side has no pieces apart from a knight, and decrease the
861         // value if the other side has a rook or queen.
862         if (square_file(s) == FILE_A || square_file(s) == FILE_H)
863         {
864             if (pos.non_pawn_material(Them) <= KnightValueMidgame)
865                 ebonus += ebonus / 4;
866             else if (pos.pieces(ROOK, QUEEN, Them))
867                 ebonus -= ebonus / 4;
868         }
869
870         // Add the scores for this pawn to the middle game and endgame eval
871         ei.value += Sign[Us] * apply_weight(make_score(mbonus, ebonus), Weights[PassedPawns]);
872
873     } // while
874   }
875
876
877   // evaluate_unstoppable_pawns() evaluates the unstoppable passed pawns for both sides
878
879   void evaluate_unstoppable_pawns(const Position& pos, EvalInfo& ei) {
880
881     int movesToGo[2] = {0, 0};
882     Square pawnToGo[2] = {SQ_NONE, SQ_NONE};
883
884     for (Color c = WHITE; c <= BLACK; c++)
885     {
886         // Skip evaluation if other side has non-pawn pieces
887         if (pos.non_pawn_material(opposite_color(c)))
888             continue;
889
890         Bitboard b = ei.pi->passed_pawns() & pos.pieces_of_color(c);
891
892         while (b)
893         {
894             Square s = pop_1st_bit(&b);
895             Square queeningSquare = relative_square(c, make_square(square_file(s), RANK_8));
896             int d =  square_distance(s, queeningSquare)
897                    - (relative_rank(c, s) == RANK_2) // Double pawn push
898                    - square_distance(pos.king_square(opposite_color(c)), queeningSquare)
899                    + int(c != pos.side_to_move());
900
901             // Do we protect the path to queening ?
902             bool pathDefended = (ei.attacked_by(c) & squares_in_front_of(c, s)) == squares_in_front_of(c, s);
903
904             if (d < 0 || pathDefended)
905             {
906                 int mtg = RANK_8 - relative_rank(c, s);
907                 int blockerCount = count_1s_max_15(squares_in_front_of(c, s) & pos.occupied_squares());
908                 mtg += blockerCount;
909                 d += blockerCount;
910                 if ((d < 0 || pathDefended) && (!movesToGo[c] || movesToGo[c] > mtg))
911                 {
912                     movesToGo[c] = mtg;
913                     pawnToGo[c] = s;
914                 }
915             }
916         }
917     }
918
919     // Neither side has an unstoppable passed pawn?
920     if (!(movesToGo[WHITE] | movesToGo[BLACK]))
921         return;
922
923     // Does only one side have an unstoppable passed pawn?
924     if (!movesToGo[WHITE] || !movesToGo[BLACK])
925     {
926         Color winnerSide = movesToGo[WHITE] ? WHITE : BLACK;
927         ei.value += make_score(0, Sign[winnerSide] * (UnstoppablePawnValue - Value(0x40 * movesToGo[winnerSide])));
928     }
929     else
930     {   // Both sides have unstoppable pawns! Try to find out who queens
931         // first. We begin by transforming 'movesToGo' to the number of
932         // plies until the pawn queens for both sides.
933         movesToGo[WHITE] *= 2;
934         movesToGo[BLACK] *= 2;
935         movesToGo[pos.side_to_move()]--;
936
937         Color winnerSide = movesToGo[WHITE] < movesToGo[BLACK] ? WHITE : BLACK;
938         Color loserSide = opposite_color(winnerSide);
939
940         // If one side queens at least three plies before the other, that side wins
941         if (movesToGo[winnerSide] <= movesToGo[loserSide] - 3)
942             ei.value += Sign[winnerSide] * make_score(0, UnstoppablePawnValue - Value(0x40 * (movesToGo[winnerSide]/2)));
943
944         // If one side queens one ply before the other and checks the king or attacks
945         // the undefended opponent's queening square, that side wins. To avoid cases
946         // where the opponent's king could move somewhere before first pawn queens we
947         // consider only free paths to queen for both pawns.
948         else if (   !(squares_in_front_of(WHITE, pawnToGo[WHITE]) & pos.occupied_squares())
949                  && !(squares_in_front_of(BLACK, pawnToGo[BLACK]) & pos.occupied_squares()))
950         {
951             assert(movesToGo[loserSide] - movesToGo[winnerSide] == 1);
952
953             Square winnerQSq = relative_square(winnerSide, make_square(square_file(pawnToGo[winnerSide]), RANK_8));
954             Square loserQSq = relative_square(loserSide, make_square(square_file(pawnToGo[loserSide]), RANK_8));
955
956             Bitboard b = pos.occupied_squares();
957             clear_bit(&b, pawnToGo[winnerSide]);
958             clear_bit(&b, pawnToGo[loserSide]);
959             b = queen_attacks_bb(winnerQSq, b);
960
961             if (  (b & pos.pieces(KING, loserSide))
962                 ||(bit_is_set(b, loserQSq) && !bit_is_set(ei.attacked_by(loserSide), loserQSq)))
963                 ei.value += Sign[winnerSide] * make_score(0, UnstoppablePawnValue - Value(0x40 * (movesToGo[winnerSide]/2)));
964         }
965     }
966   }
967
968
969   // evaluate_trapped_bishop_a7h7() determines whether a bishop on a7/h7
970   // (a2/h2 for black) is trapped by enemy pawns, and assigns a penalty
971   // if it is.
972
973   void evaluate_trapped_bishop_a7h7(const Position& pos, Square s, Color us, EvalInfo &ei) {
974
975     assert(square_is_ok(s));
976     assert(pos.piece_on(s) == piece_of_color_and_type(us, BISHOP));
977
978     Square b6 = relative_square(us, (square_file(s) == FILE_A) ? SQ_B6 : SQ_G6);
979     Square b8 = relative_square(us, (square_file(s) == FILE_A) ? SQ_B8 : SQ_G8);
980
981     if (   pos.piece_on(b6) == piece_of_color_and_type(opposite_color(us), PAWN)
982         && pos.see(s, b6) < 0
983         && pos.see(s, b8) < 0)
984     {
985         ei.value -= Sign[us] * TrappedBishopA7H7Penalty;
986     }
987   }
988
989
990   // evaluate_trapped_bishop_a1h1() determines whether a bishop on a1/h1
991   // (a8/h8 for black) is trapped by a friendly pawn on b2/g2 (b7/g7 for
992   // black), and assigns a penalty if it is. This pattern can obviously
993   // only occur in Chess960 games.
994
995   void evaluate_trapped_bishop_a1h1(const Position& pos, Square s, Color us, EvalInfo& ei) {
996
997     Piece pawn = piece_of_color_and_type(us, PAWN);
998     Square b2, b3, c3;
999
1000     assert(Chess960);
1001     assert(square_is_ok(s));
1002     assert(pos.piece_on(s) == piece_of_color_and_type(us, BISHOP));
1003
1004     if (square_file(s) == FILE_A)
1005     {
1006         b2 = relative_square(us, SQ_B2);
1007         b3 = relative_square(us, SQ_B3);
1008         c3 = relative_square(us, SQ_C3);
1009     }
1010     else
1011     {
1012         b2 = relative_square(us, SQ_G2);
1013         b3 = relative_square(us, SQ_G3);
1014         c3 = relative_square(us, SQ_F3);
1015     }
1016
1017     if (pos.piece_on(b2) == pawn)
1018     {
1019         Score penalty;
1020
1021         if (!pos.square_is_empty(b3))
1022             penalty = 2 * TrappedBishopA1H1Penalty;
1023         else if (pos.piece_on(c3) == pawn)
1024             penalty = TrappedBishopA1H1Penalty;
1025         else
1026             penalty = TrappedBishopA1H1Penalty / 2;
1027
1028         ei.value -= Sign[us] * penalty;
1029     }
1030   }
1031
1032
1033   // evaluate_space() computes the space evaluation for a given side. The
1034   // space evaluation is a simple bonus based on the number of safe squares
1035   // available for minor pieces on the central four files on ranks 2--4. Safe
1036   // squares one, two or three squares behind a friendly pawn are counted
1037   // twice. Finally, the space bonus is scaled by a weight taken from the
1038   // material hash table.
1039   template<Color Us, bool HasPopCnt>
1040   int evaluate_space(const Position& pos, EvalInfo& ei) {
1041
1042     const Color Them = (Us == WHITE ? BLACK : WHITE);
1043
1044     // Find the safe squares for our pieces inside the area defined by
1045     // SpaceMask[us]. A square is unsafe if it is attacked by an enemy
1046     // pawn, or if it is undefended and attacked by an enemy piece.
1047     Bitboard safe =   SpaceMask[Us]
1048                    & ~pos.pieces(PAWN, Us)
1049                    & ~ei.attacked_by(Them, PAWN)
1050                    & (ei.attacked_by(Us) | ~ei.attacked_by(Them));
1051
1052     // Find all squares which are at most three squares behind some friendly pawn
1053     Bitboard behind = pos.pieces(PAWN, Us);
1054     behind |= (Us == WHITE ? behind >>  8 : behind <<  8);
1055     behind |= (Us == WHITE ? behind >> 16 : behind << 16);
1056
1057     return count_1s_max_15<HasPopCnt>(safe) + count_1s_max_15<HasPopCnt>(behind & safe);
1058   }
1059
1060
1061   // apply_weight() applies an evaluation weight to a value trying to prevent overflow
1062
1063   inline Score apply_weight(Score v, Score w) {
1064       return make_score((int(mg_value(v)) * mg_value(w)) / 0x100, (int(eg_value(v)) * eg_value(w)) / 0x100);
1065   }
1066
1067
1068   // scale_by_game_phase() interpolates between a middle game and an endgame
1069   // score, based on game phase.  It also scales the return value by a
1070   // ScaleFactor array.
1071
1072   Value scale_by_game_phase(const Score& v, Phase ph, const ScaleFactor sf[]) {
1073
1074     assert(mg_value(v) > -VALUE_INFINITE && mg_value(v) < VALUE_INFINITE);
1075     assert(eg_value(v) > -VALUE_INFINITE && eg_value(v) < VALUE_INFINITE);
1076     assert(ph >= PHASE_ENDGAME && ph <= PHASE_MIDGAME);
1077
1078     Value ev = apply_scale_factor(eg_value(v), sf[(eg_value(v) > Value(0) ? WHITE : BLACK)]);
1079
1080     int result = (mg_value(v) * ph + ev * (128 - ph)) / 128;
1081     return Value(result & ~(GrainSize - 1));
1082   }
1083
1084
1085   // weight_option() computes the value of an evaluation weight, by combining
1086   // two UCI-configurable weights (midgame and endgame) with an internal weight.
1087
1088   Score weight_option(const std::string& mgOpt, const std::string& egOpt, Score internalWeight) {
1089
1090     // Scale option value from 100 to 256
1091     int mg = get_option_value_int(mgOpt) * 256 / 100;
1092     int eg = get_option_value_int(egOpt) * 256 / 100;
1093
1094     return apply_weight(make_score(mg, eg), internalWeight);
1095   }
1096
1097   // init_safety() initizes the king safety evaluation, based on UCI
1098   // parameters. It is called from read_weights().
1099
1100   void init_safety() {
1101
1102     const Value MaxSlope = Value(30);
1103     const Value Peak = Value(1280);
1104     Value t[100];
1105
1106     // First setup the base table
1107     for (int i = 0; i < 100; i++)
1108     {
1109         t[i] = Value(int(0.4 * i * i));
1110
1111         if (i > 0)
1112             t[i] = Min(t[i], t[i - 1] + MaxSlope);
1113
1114         t[i] = Min(t[i], Peak);
1115     }
1116
1117     // Then apply the weights and get the final KingDangerTable[] array
1118     for (Color c = WHITE; c <= BLACK; c++)
1119         for (int i = 0; i < 100; i++)
1120             KingDangerTable[c][i] = apply_weight(make_score(t[i], 0), Weights[KingDangerUs + c]);
1121   }
1122 }