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