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