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