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