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