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