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