]> git.sesse.net Git - stockfish/blob - src/evaluate.cpp
feadbae482ab3b15a47655abbccd589aff7edc95
[stockfish] / src / evaluate.cpp
1 /*
2   Stockfish, a UCI chess playing engine derived from Glaurung 2.1
3   Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
4   Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
5
6   Stockfish is free software: you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation, either version 3 of the License, or
9   (at your option) any later version.
10
11   Stockfish is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20
21 ////
22 //// Includes
23 ////
24
25 #include <cassert>
26
27 #include "bitcount.h"
28 #include "evaluate.h"
29 #include "material.h"
30 #include "pawns.h"
31 #include "thread.h"
32 #include "ucioption.h"
33
34
35 ////
36 //// Local definitions
37 ////
38
39 namespace {
40
41   // Struct EvalInfo contains various information computed and collected
42   // by the evaluation functions.
43   struct EvalInfo {
44
45     // Middle and end game position's static evaluations
46     Score value;
47
48     // margin[color] stores the evaluation margins we should consider for
49     // the given position. This is a kind of uncertainty estimation and
50     // typically is used by the search for pruning decisions.
51     Value margin[2];
52
53     // Pointer to pawn hash table entry
54     PawnInfo* pi;
55
56     // attackedBy[color][piece type] is a bitboard representing all squares
57     // attacked by a given color and piece type, attackedBy[color][0] contains
58     // all squares attacked by the given color.
59     Bitboard attackedBy[2][8];
60
61     // kingZone[color] is the zone around the enemy king which is considered
62     // by the king safety evaluation. This consists of the squares directly
63     // adjacent to the king, and the three (or two, for a king on an edge file)
64     // squares two ranks in front of the king. For instance, if black's king
65     // is on g8, kingZone[WHITE] is a bitboard containing the squares f8, h8,
66     // f7, g7, h7, f6, g6 and h6.
67     Bitboard kingZone[2];
68
69     // kingAttackersCount[color] is the number of pieces of the given color
70     // which attack a square in the kingZone of the enemy king.
71     int kingAttackersCount[2];
72
73     // kingAttackersWeight[color] is the sum of the "weight" of the pieces of the
74     // given color which attack a square in the kingZone of the enemy king. The
75     // weights of the individual piece types are given by the variables
76     // QueenAttackWeight, RookAttackWeight, BishopAttackWeight and
77     // KnightAttackWeight in evaluate.cpp
78     int kingAttackersWeight[2];
79
80     // kingAdjacentZoneAttacksCount[color] is the number of attacks to squares
81     // directly adjacent to the king of the given color. Pieces which attack
82     // more than one square are counted multiple times. For instance, if black's
83     // king is on g8 and there's a white knight on g5, this knight adds
84     // 2 to kingAdjacentZoneAttacksCount[BLACK].
85     int kingAdjacentZoneAttacksCount[2];
86   };
87
88   const int Sign[2] = { 1, -1 };
89
90   // Evaluation grain size, must be a power of 2
91   const int GrainSize = 8;
92
93   // Evaluation weights, initialized from UCI options
94   enum { Mobility, PawnStructure, PassedPawns, Space, KingDangerUs, KingDangerThem };
95   Score Weights[6];
96
97   typedef Value V;
98   #define S(mg, eg) make_score(mg, eg)
99
100   // Internal evaluation weights. These are applied on top of the evaluation
101   // weights read from UCI parameters. The purpose is to be able to change
102   // the evaluation weights while keeping the default values of the UCI
103   // parameters at 100, which looks prettier.
104   //
105   // Values modified by Joona Kiiski
106   const Score WeightsInternal[] = {
107       S(248, 271), S(233, 201), S(252, 259), S(46, 0), S(247, 0), S(259, 0)
108   };
109
110   // MobilityBonus[PieceType][attacked] contains mobility bonuses for middle and
111   // end game, indexed by piece type and number of attacked squares not occupied
112   // by friendly pieces.
113   const Score MobilityBonus[][32] = {
114      {}, {},
115      { S(-38,-33), S(-25,-23), S(-12,-13), S( 0, -3), S(12,  7), S(25, 17), // Knights
116        S( 31, 22), S( 38, 27), S( 38, 27) },
117      { S(-25,-30), S(-11,-16), S(  3, -2), S(17, 12), S(31, 26), S(45, 40), // Bishops
118        S( 57, 52), S( 65, 60), S( 71, 65), S(74, 69), S(76, 71), S(78, 73),
119        S( 79, 74), S( 80, 75), S( 81, 76), S(81, 76) },
120      { S(-20,-36), S(-14,-19), S( -8, -3), S(-2, 13), S( 4, 29), S(10, 46), // Rooks
121        S( 14, 62), S( 19, 79), S( 23, 95), S(26,106), S(27,111), S(28,114),
122        S( 29,116), S( 30,117), S( 31,118), S(32,118) },
123      { S(-10,-18), S( -8,-13), S( -6, -7), S(-3, -2), S(-1,  3), S( 1,  8), // Queens
124        S(  3, 13), S(  5, 19), S(  8, 23), S(10, 27), S(12, 32), S(15, 34),
125        S( 16, 35), S( 17, 35), S( 18, 35), S(20, 35), S(20, 35), S(20, 35),
126        S( 20, 35), S( 20, 35), S( 20, 35), S(20, 35), S(20, 35), S(20, 35),
127        S( 20, 35), S( 20, 35), S( 20, 35), S(20, 35), S(20, 35), S(20, 35),
128        S( 20, 35), S( 20, 35) }
129   };
130
131   // OutpostBonus[PieceType][Square] contains outpost bonuses of knights and
132   // bishops, indexed by piece type and square (from white's point of view).
133   const Value OutpostBonus[][64] = {
134   {
135   //  A     B     C     D     E     F     G     H
136     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0), // Knights
137     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0),
138     V(0), V(0), V(4), V(8), V(8), V(4), V(0), V(0),
139     V(0), V(4),V(17),V(26),V(26),V(17), V(4), V(0),
140     V(0), V(8),V(26),V(35),V(35),V(26), V(8), V(0),
141     V(0), V(4),V(17),V(17),V(17),V(17), V(4), V(0),
142     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0),
143     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0) },
144   {
145     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0), // Bishops
146     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0),
147     V(0), V(0), V(5), V(5), V(5), V(5), V(0), V(0),
148     V(0), V(5),V(10),V(10),V(10),V(10), V(5), V(0),
149     V(0),V(10),V(21),V(21),V(21),V(21),V(10), V(0),
150     V(0), V(5), V(8), V(8), V(8), V(8), V(5), V(0),
151     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0),
152     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0) }
153   };
154
155   // ThreatBonus[attacking][attacked] contains threat bonuses according to
156   // which piece type attacks which one.
157   const Score ThreatBonus[][8] = {
158     {}, {},
159     { S(0, 0), S( 7, 39), S( 0,  0), S(24, 49), S(41,100), S(41,100) }, // KNIGHT
160     { S(0, 0), S( 7, 39), S(24, 49), S( 0,  0), S(41,100), S(41,100) }, // BISHOP
161     { S(0, 0), S(-1, 29), S(15, 49), S(15, 49), S( 0,  0), S(24, 49) }, // ROOK
162     { S(0, 0), S(15, 39), S(15, 39), S(15, 39), S(15, 39), S( 0,  0) }  // QUEEN
163   };
164
165   // ThreatedByPawnPenalty[PieceType] contains a penalty according to which
166   // piece type is attacked by an enemy pawn.
167   const Score ThreatedByPawnPenalty[] = {
168     S(0, 0), S(0, 0), S(56, 70), S(56, 70), S(76, 99), S(86, 118)
169   };
170
171   #undef S
172
173   // Rooks and queens on the 7th rank (modified by Joona Kiiski)
174   const Score RookOn7thBonus  = make_score(47, 98);
175   const Score QueenOn7thBonus = make_score(27, 54);
176
177   // Rooks on open files (modified by Joona Kiiski)
178   const Score RookOpenFileBonus = make_score(43, 43);
179   const Score RookHalfOpenFileBonus = make_score(19, 19);
180
181   // Penalty for rooks trapped inside a friendly king which has lost the
182   // right to castle.
183   const Value TrappedRookPenalty = Value(180);
184
185   // The SpaceMask[Color] contains the area of the board which is considered
186   // by the space evaluation. In the middle game, each side is given a bonus
187   // based on how many squares inside this area are safe and available for
188   // friendly minor pieces.
189   const Bitboard SpaceMask[2] = {
190     (1ULL << SQ_C2) | (1ULL << SQ_D2) | (1ULL << SQ_E2) | (1ULL << SQ_F2) |
191     (1ULL << SQ_C3) | (1ULL << SQ_D3) | (1ULL << SQ_E3) | (1ULL << SQ_F3) |
192     (1ULL << SQ_C4) | (1ULL << SQ_D4) | (1ULL << SQ_E4) | (1ULL << SQ_F4),
193     (1ULL << SQ_C7) | (1ULL << SQ_D7) | (1ULL << SQ_E7) | (1ULL << SQ_F7) |
194     (1ULL << SQ_C6) | (1ULL << SQ_D6) | (1ULL << SQ_E6) | (1ULL << SQ_F6) |
195     (1ULL << SQ_C5) | (1ULL << SQ_D5) | (1ULL << SQ_E5) | (1ULL << SQ_F5)
196   };
197
198   // King danger constants and variables. The king danger scores are taken
199   // from the KingDangerTable[]. Various little "meta-bonuses" measuring
200   // the strength of the enemy attack are added up into an integer, which
201   // is used as an index to KingDangerTable[].
202   //
203   // KingAttackWeights[PieceType] contains king attack weights by piece type
204   const int KingAttackWeights[] = { 0, 0, 2, 2, 3, 5 };
205
206   // Bonuses for enemy's safe checks
207   const int QueenContactCheckBonus = 3;
208   const int QueenCheckBonus        = 2;
209   const int RookCheckBonus         = 1;
210   const int BishopCheckBonus       = 1;
211   const int KnightCheckBonus       = 1;
212
213   // InitKingDanger[Square] contains penalties based on the position of the
214   // defending king, indexed by king's square (from white's point of view).
215   const int InitKingDanger[] = {
216      2,  0,  2,  5,  5,  2,  0,  2,
217      2,  2,  4,  8,  8,  4,  2,  2,
218      7, 10, 12, 12, 12, 12, 10,  7,
219     15, 15, 15, 15, 15, 15, 15, 15,
220     15, 15, 15, 15, 15, 15, 15, 15,
221     15, 15, 15, 15, 15, 15, 15, 15,
222     15, 15, 15, 15, 15, 15, 15, 15,
223     15, 15, 15, 15, 15, 15, 15, 15
224   };
225
226   // KingDangerTable[Color][attackUnits] contains the actual king danger
227   // weighted scores, indexed by color and by a calculated integer number.
228   Score KingDangerTable[2][128];
229
230   // Pawn and material hash tables, indexed by the current thread id.
231   // Note that they will be initialized at 0 being global variables.
232   MaterialInfoTable* MaterialTable[MAX_THREADS];
233   PawnInfoTable* PawnTable[MAX_THREADS];
234
235   // Function prototypes
236   template<bool HasPopCnt>
237   Value do_evaluate(const Position& pos, Value margins[]);
238
239   template<Color Us, bool HasPopCnt>
240   void init_attack_tables(const Position& pos, EvalInfo& ei);
241
242   template<Color Us, bool HasPopCnt>
243   Score evaluate_pieces_of_color(const Position& pos, EvalInfo& ei);
244
245   template<Color Us, bool HasPopCnt>
246   void evaluate_king(const Position& pos, EvalInfo& ei);
247
248   template<Color Us>
249   void evaluate_threats(const Position& pos, EvalInfo& ei);
250
251   template<Color Us, bool HasPopCnt>
252   int evaluate_space(const Position& pos, EvalInfo& ei);
253
254   template<Color Us>
255   void evaluate_passed_pawns(const Position& pos, EvalInfo& ei);
256
257   inline Score apply_weight(Score v, Score weight);
258   Value scale_by_game_phase(const Score& v, Phase ph, const ScaleFactor sf[]);
259   Score weight_option(const std::string& mgOpt, const std::string& egOpt, Score internalWeight);
260   void init_safety();
261 }
262
263
264 ////
265 //// Functions
266 ////
267
268
269 /// Prefetches in pawn hash tables
270
271 void prefetchPawn(Key key, int threadID) {
272
273     PawnTable[threadID]->prefetch(key);
274 }
275
276 /// evaluate() is the main evaluation function. It always computes two
277 /// values, an endgame score and a middle game score, and interpolates
278 /// between them based on the remaining material.
279 Value evaluate(const Position& pos, Value margins[]) {
280
281     return CpuHasPOPCNT ? do_evaluate<true>(pos, margins)
282                         : do_evaluate<false>(pos, margins);
283 }
284
285 namespace {
286
287 template<bool HasPopCnt>
288 Value do_evaluate(const Position& pos, Value margins[]) {
289
290   EvalInfo ei;
291   ScaleFactor factor[2];
292   Score mobility;
293
294   assert(pos.is_ok());
295   assert(pos.thread() >= 0 && pos.thread() < MAX_THREADS);
296   assert(!pos.is_check());
297
298   // Initialize by reading the incrementally updated scores included in the
299   // position object (material + piece square tables).
300   ei.value = pos.value();
301
302   // Probe the material hash table
303   MaterialInfo* mi = MaterialTable[pos.thread()]->get_material_info(pos);
304   ei.value += mi->material_value();
305
306   // If we have a specialized evaluation function for the current material
307   // configuration, call it and return.
308   if (mi->specialized_eval_exists())
309       return mi->evaluate(pos);
310
311   // After get_material_info() call that modifies them
312   factor[WHITE] = mi->scale_factor(pos, WHITE);
313   factor[BLACK] = mi->scale_factor(pos, BLACK);
314
315   // Probe the pawn hash table
316   ei.pi = PawnTable[pos.thread()]->get_pawn_info(pos);
317   ei.value += apply_weight(ei.pi->pawns_value(), Weights[PawnStructure]);
318
319   // Initialize attack bitboards with pawns evaluation
320   init_attack_tables<WHITE, HasPopCnt>(pos, ei);
321   init_attack_tables<BLACK, HasPopCnt>(pos, ei);
322
323   // Evaluate pieces and mobility
324   mobility =   evaluate_pieces_of_color<WHITE, HasPopCnt>(pos, ei)
325              - evaluate_pieces_of_color<BLACK, HasPopCnt>(pos, ei);
326   ei.value += apply_weight(mobility, Weights[Mobility]);
327
328   // Kings. Kings are evaluated after all other pieces for both sides,
329   // because we need complete attack information for all pieces when computing
330   // the king safety evaluation.
331   evaluate_king<WHITE, HasPopCnt>(pos, ei);
332   evaluate_king<BLACK, HasPopCnt>(pos, ei);
333
334   // Evaluate tactical threats, we need full attack info including king
335   evaluate_threats<WHITE>(pos, ei);
336   evaluate_threats<BLACK>(pos, ei);
337
338   // Evaluate passed pawns, we need full attack info including king
339   evaluate_passed_pawns<WHITE>(pos, ei);
340   evaluate_passed_pawns<BLACK>(pos, ei);
341
342   Phase phase = mi->game_phase();
343
344   // Middle-game specific evaluation terms
345   if (phase > PHASE_ENDGAME)
346   {
347       // Evaluate pawn storms in positions with opposite castling
348       if (   square_file(pos.king_square(WHITE)) >= FILE_E
349           && square_file(pos.king_square(BLACK)) <= FILE_D)
350
351           ei.value += make_score(ei.pi->queenside_storm_value(WHITE) - ei.pi->kingside_storm_value(BLACK), 0);
352
353       else if (   square_file(pos.king_square(WHITE)) <= FILE_D
354                && square_file(pos.king_square(BLACK)) >= FILE_E)
355
356           ei.value += make_score(ei.pi->kingside_storm_value(WHITE) - ei.pi->queenside_storm_value(BLACK), 0);
357
358       // Evaluate space for both sides
359       if (mi->space_weight() > 0)
360       {
361           int s = evaluate_space<WHITE, HasPopCnt>(pos, ei) - evaluate_space<BLACK, HasPopCnt>(pos, ei);
362           ei.value += apply_weight(make_score(s * mi->space_weight(), 0), Weights[Space]);
363       }
364   }
365
366   // If we don't already have an unusual scale factor, check for opposite
367   // colored bishop endgames, and use a lower scale for those
368   if (   phase < PHASE_MIDGAME
369       && pos.opposite_colored_bishops()
370       && (   (factor[WHITE] == SCALE_FACTOR_NORMAL && eg_value(ei.value) > VALUE_ZERO)
371           || (factor[BLACK] == SCALE_FACTOR_NORMAL && eg_value(ei.value) < VALUE_ZERO)))
372   {
373       ScaleFactor sf;
374
375       // Only the two bishops ?
376       if (   pos.non_pawn_material(WHITE) == BishopValueMidgame
377           && pos.non_pawn_material(BLACK) == BishopValueMidgame)
378       {
379           // Check for KBP vs KB with only a single pawn that is almost
380           // certainly a draw or at least two pawns.
381           bool one_pawn = (pos.piece_count(WHITE, PAWN) + pos.piece_count(BLACK, PAWN) == 1);
382           sf = one_pawn ? ScaleFactor(8) : ScaleFactor(32);
383       }
384       else
385           // Endgame with opposite-colored bishops, but also other pieces. Still
386           // a bit drawish, but not as drawish as with only the two bishops.
387            sf = ScaleFactor(50);
388
389       if (factor[WHITE] == SCALE_FACTOR_NORMAL)
390           factor[WHITE] = sf;
391       if (factor[BLACK] == SCALE_FACTOR_NORMAL)
392           factor[BLACK] = sf;
393   }
394
395   // Populate margins[]
396   margins[WHITE] = ei.margin[WHITE];
397   margins[BLACK] = ei.margin[BLACK];
398
399   // Interpolate between the middle game and the endgame score
400   return Sign[pos.side_to_move()] * scale_by_game_phase(ei.value, phase, factor);
401 }
402
403 } // namespace
404
405 /// init_eval() initializes various tables used by the evaluation function
406
407 void init_eval(int threads) {
408
409   assert(threads <= MAX_THREADS);
410
411   for (int i = 0; i < MAX_THREADS; i++)
412   {
413     if (i >= threads)
414     {
415         delete PawnTable[i];
416         delete MaterialTable[i];
417         PawnTable[i] = NULL;
418         MaterialTable[i] = NULL;
419         continue;
420     }
421     if (!PawnTable[i])
422         PawnTable[i] = new PawnInfoTable();
423     if (!MaterialTable[i])
424         MaterialTable[i] = new MaterialInfoTable();
425   }
426 }
427
428
429 /// quit_eval() releases heap-allocated memory at program termination
430
431 void quit_eval() {
432
433   for (int i = 0; i < MAX_THREADS; i++)
434   {
435       delete PawnTable[i];
436       delete MaterialTable[i];
437       PawnTable[i] = NULL;
438       MaterialTable[i] = NULL;
439   }
440 }
441
442
443 /// read_weights() reads evaluation weights from the corresponding UCI parameters
444
445 void read_weights(Color us) {
446
447   // King safety is asymmetrical. Our king danger level is weighted by
448   // "Cowardice" UCI parameter, instead the opponent one by "Aggressiveness".
449   const int kingDangerUs   = (us == WHITE ? KingDangerUs   : KingDangerThem);
450   const int kingDangerThem = (us == WHITE ? KingDangerThem : KingDangerUs);
451
452   Weights[Mobility]       = weight_option("Mobility (Middle Game)", "Mobility (Endgame)", WeightsInternal[Mobility]);
453   Weights[PawnStructure]  = weight_option("Pawn Structure (Middle Game)", "Pawn Structure (Endgame)", WeightsInternal[PawnStructure]);
454   Weights[PassedPawns]    = weight_option("Passed Pawns (Middle Game)", "Passed Pawns (Endgame)", WeightsInternal[PassedPawns]);
455   Weights[Space]          = weight_option("Space", "Space", WeightsInternal[Space]);
456   Weights[kingDangerUs]   = weight_option("Cowardice", "Cowardice", WeightsInternal[KingDangerUs]);
457   Weights[kingDangerThem] = weight_option("Aggressiveness", "Aggressiveness", WeightsInternal[KingDangerThem]);
458
459   // If running in analysis mode, make sure we use symmetrical king safety. We do this
460   // by replacing both Weights[kingDangerUs] and Weights[kingDangerThem] by their average.
461   if (get_option_value_bool("UCI_AnalyseMode"))
462       Weights[kingDangerUs] = Weights[kingDangerThem] = (Weights[kingDangerUs] + Weights[kingDangerThem]) / 2;
463
464   init_safety();
465 }
466
467
468 namespace {
469
470   // init_attack_tables() initializes king bitboards for both sides adding
471   // pawn attacks. To be done before other evaluations.
472
473   template<Color Us, bool HasPopCnt>
474   void init_attack_tables(const Position& pos, EvalInfo& ei) {
475
476     const Color Them = (Us == WHITE ? BLACK : WHITE);
477
478     Bitboard b = ei.attackedBy[Them][KING] = pos.attacks_from<KING>(pos.king_square(Them));
479     ei.kingZone[Us] = (b | (Us == WHITE ? b >> 8 : b << 8));
480     ei.attackedBy[Us][PAWN] = ei.pi->pawn_attacks(Us);
481     b &= ei.attackedBy[Us][PAWN];
482     ei.kingAttackersCount[Us] = b ? count_1s_max_15<HasPopCnt>(b) / 2 : 0;
483     ei.kingAdjacentZoneAttacksCount[Us] = ei.kingAttackersWeight[Us] = 0;
484   }
485
486
487   // evaluate_outposts() evaluates bishop and knight outposts squares
488
489   template<PieceType Piece, Color Us>
490   void evaluate_outposts(const Position& pos, EvalInfo& ei, Square s) {
491
492     const Color Them = (Us == WHITE ? BLACK : WHITE);
493
494     assert (Piece == BISHOP || Piece == KNIGHT);
495
496     // Initial bonus based on square
497     Value bonus = OutpostBonus[Piece == BISHOP][relative_square(Us, s)];
498
499     // Increase bonus if supported by pawn, especially if the opponent has
500     // no minor piece which can exchange the outpost piece
501     if (bonus && bit_is_set(ei.attackedBy[Us][PAWN], s))
502     {
503         if (    pos.pieces(KNIGHT, Them) == EmptyBoardBB
504             && (SquaresByColorBB[square_color(s)] & pos.pieces(BISHOP, Them)) == EmptyBoardBB)
505             bonus += bonus + bonus / 2;
506         else
507             bonus += bonus / 2;
508     }
509     ei.value += Sign[Us] * make_score(bonus, bonus);
510   }
511
512
513   // evaluate_pieces<>() assigns bonuses and penalties to the pieces of a given color
514
515   template<PieceType Piece, Color Us, bool HasPopCnt>
516   Score evaluate_pieces(const Position& pos, EvalInfo& ei, Bitboard no_mob_area) {
517
518     Bitboard b;
519     Square s, ksq;
520     int mob;
521     File f;
522     Score mobility = SCORE_ZERO;
523
524     const Color Them = (Us == WHITE ? BLACK : WHITE);
525     const Square* ptr = pos.piece_list_begin(Us, Piece);
526
527     ei.attackedBy[Us][Piece] = 0;
528
529     while ((s = *ptr++) != SQ_NONE)
530     {
531         // Find attacked squares, including x-ray attacks for bishops and rooks
532         if (Piece == KNIGHT || Piece == QUEEN)
533             b = pos.attacks_from<Piece>(s);
534         else if (Piece == BISHOP)
535             b = bishop_attacks_bb(s, pos.occupied_squares() & ~pos.pieces(QUEEN, Us));
536         else if (Piece == ROOK)
537             b = rook_attacks_bb(s, pos.occupied_squares() & ~pos.pieces(ROOK, QUEEN, Us));
538         else
539             assert(false);
540
541         // Update attack info
542         ei.attackedBy[Us][Piece] |= b;
543
544         // King attacks
545         if (b & ei.kingZone[Us])
546         {
547             ei.kingAttackersCount[Us]++;
548             ei.kingAttackersWeight[Us] += KingAttackWeights[Piece];
549             Bitboard bb = (b & ei.attackedBy[Them][KING]);
550             if (bb)
551                 ei.kingAdjacentZoneAttacksCount[Us] += count_1s_max_15<HasPopCnt>(bb);
552         }
553
554         // Mobility
555         mob = (Piece != QUEEN ? count_1s_max_15<HasPopCnt>(b & no_mob_area)
556                               : count_1s<HasPopCnt>(b & no_mob_area));
557
558         mobility += MobilityBonus[Piece][mob];
559
560         // Decrease score if we are attacked by an enemy pawn. Remaining part
561         // of threat evaluation must be done later when we have full attack info.
562         if (bit_is_set(ei.attackedBy[Them][PAWN], s))
563             ei.value -= Sign[Us] * ThreatedByPawnPenalty[Piece];
564
565         // Bishop and knight outposts squares
566         if ((Piece == BISHOP || Piece == KNIGHT) && pos.square_is_weak(s, Us))
567             evaluate_outposts<Piece, Us>(pos, ei, s);
568
569         // Queen or rook on 7th rank
570         if (  (Piece == ROOK || Piece == QUEEN)
571             && relative_rank(Us, s) == RANK_7
572             && relative_rank(Us, pos.king_square(Them)) == RANK_8)
573         {
574             ei.value += Sign[Us] * (Piece == ROOK ? RookOn7thBonus : QueenOn7thBonus);
575         }
576
577         // Special extra evaluation for rooks
578         if (Piece == ROOK)
579         {
580             // Open and half-open files
581             f = square_file(s);
582             if (ei.pi->file_is_half_open(Us, f))
583             {
584                 if (ei.pi->file_is_half_open(Them, f))
585                     ei.value += Sign[Us] * RookOpenFileBonus;
586                 else
587                     ei.value += Sign[Us] * RookHalfOpenFileBonus;
588             }
589
590             // Penalize rooks which are trapped inside a king. Penalize more if
591             // king has lost right to castle.
592             if (mob > 6 || ei.pi->file_is_half_open(Us, f))
593                 continue;
594
595             ksq = pos.king_square(Us);
596
597             if (    square_file(ksq) >= FILE_E
598                 &&  square_file(s) > square_file(ksq)
599                 && (relative_rank(Us, ksq) == RANK_1 || square_rank(ksq) == square_rank(s)))
600             {
601                 // Is there a half-open file between the king and the edge of the board?
602                 if (!ei.pi->has_open_file_to_right(Us, square_file(ksq)))
603                     ei.value -= Sign[Us] * make_score(pos.can_castle(Us) ? (TrappedRookPenalty - mob * 16) / 2
604                                                                          : (TrappedRookPenalty - mob * 16), 0);
605             }
606             else if (    square_file(ksq) <= FILE_D
607                      &&  square_file(s) < square_file(ksq)
608                      && (relative_rank(Us, ksq) == RANK_1 || square_rank(ksq) == square_rank(s)))
609             {
610                 // Is there a half-open file between the king and the edge of the board?
611                 if (!ei.pi->has_open_file_to_left(Us, square_file(ksq)))
612                     ei.value -= Sign[Us] * make_score(pos.can_castle(Us) ? (TrappedRookPenalty - mob * 16) / 2
613                                                                          : (TrappedRookPenalty - mob * 16), 0);
614             }
615         }
616     }
617     return mobility;
618   }
619
620
621   // evaluate_threats<>() assigns bonuses according to the type of attacking piece
622   // and the type of attacked one.
623
624   template<Color Us>
625   void evaluate_threats(const Position& pos, EvalInfo& ei) {
626
627     const Color Them = (Us == WHITE ? BLACK : WHITE);
628
629     Bitboard b;
630     Score bonus = SCORE_ZERO;
631
632     // Enemy pieces not defended by a pawn and under our attack
633     Bitboard weakEnemies =  pos.pieces_of_color(Them)
634                           & ~ei.attackedBy[Them][PAWN]
635                           & ei.attackedBy[Us][0];
636     if (!weakEnemies)
637         return;
638
639     // Add bonus according to type of attacked enemy pieces and to the
640     // type of attacking piece, from knights to queens. Kings are not
641     // considered because are already special handled in king evaluation.
642     for (PieceType pt1 = KNIGHT; pt1 < KING; pt1++)
643     {
644         b = ei.attackedBy[Us][pt1] & weakEnemies;
645         if (b)
646             for (PieceType pt2 = PAWN; pt2 < KING; pt2++)
647                 if (b & pos.pieces(pt2))
648                     bonus += ThreatBonus[pt1][pt2];
649     }
650     ei.value += Sign[Us] * bonus;
651   }
652
653
654   // evaluate_pieces_of_color<>() assigns bonuses and penalties to all the
655   // pieces of a given color.
656
657   template<Color Us, bool HasPopCnt>
658   Score evaluate_pieces_of_color(const Position& pos, EvalInfo& ei) {
659
660     const Color Them = (Us == WHITE ? BLACK : WHITE);
661
662     Score mobility = SCORE_ZERO;
663
664     // Do not include in mobility squares protected by enemy pawns or occupied by our pieces
665     const Bitboard no_mob_area = ~(ei.attackedBy[Them][PAWN] | pos.pieces_of_color(Us));
666
667     mobility += evaluate_pieces<KNIGHT, Us, HasPopCnt>(pos, ei, no_mob_area);
668     mobility += evaluate_pieces<BISHOP, Us, HasPopCnt>(pos, ei, no_mob_area);
669     mobility += evaluate_pieces<ROOK,   Us, HasPopCnt>(pos, ei, no_mob_area);
670     mobility += evaluate_pieces<QUEEN,  Us, HasPopCnt>(pos, ei, no_mob_area);
671
672     // Sum up all attacked squares
673     ei.attackedBy[Us][0] =   ei.attackedBy[Us][PAWN]   | ei.attackedBy[Us][KNIGHT]
674                            | ei.attackedBy[Us][BISHOP] | ei.attackedBy[Us][ROOK]
675                            | ei.attackedBy[Us][QUEEN]  | ei.attackedBy[Us][KING];
676     return mobility;
677   }
678
679
680   // evaluate_king<>() assigns bonuses and penalties to a king of a given color
681
682   template<Color Us, bool HasPopCnt>
683   void evaluate_king(const Position& pos, EvalInfo& ei) {
684
685     const Color Them = (Us == WHITE ? BLACK : WHITE);
686
687     Bitboard undefended, b, b1, b2, safe;
688     bool sente;
689     int attackUnits;
690     const Square ksq = pos.king_square(Us);
691
692     // King shelter
693     ei.value += Sign[Us] * ei.pi->king_shelter(pos, Us, ksq);
694
695     // King safety. This is quite complicated, and is almost certainly far
696     // from optimally tuned.
697     if (   pos.piece_count(Them, QUEEN) >= 1
698         && ei.kingAttackersCount[Them]  >= 2
699         && pos.non_pawn_material(Them)  >= QueenValueMidgame + RookValueMidgame
700         && ei.kingAdjacentZoneAttacksCount[Them])
701     {
702         // Is it the attackers turn to move?
703         sente = (Them == pos.side_to_move());
704
705         // Find the attacked squares around the king which has no defenders
706         // apart from the king itself
707         undefended = ei.attackedBy[Them][0] & ei.attackedBy[Us][KING];
708         undefended &= ~(  ei.attackedBy[Us][PAWN]   | ei.attackedBy[Us][KNIGHT]
709                         | ei.attackedBy[Us][BISHOP] | ei.attackedBy[Us][ROOK]
710                         | ei.attackedBy[Us][QUEEN]);
711
712         // Initialize the 'attackUnits' variable, which is used later on as an
713         // index to the KingDangerTable[] array. The initial value is based on
714         // the number and types of the enemy's attacking pieces, the number of
715         // attacked and undefended squares around our king, the square of the
716         // king, and the quality of the pawn shelter.
717         attackUnits =  Min(25, (ei.kingAttackersCount[Them] * ei.kingAttackersWeight[Them]) / 2)
718                      + 3 * (ei.kingAdjacentZoneAttacksCount[Them] + count_1s_max_15<HasPopCnt>(undefended))
719                      + InitKingDanger[relative_square(Us, ksq)]
720                      - mg_value(ei.pi->king_shelter(pos, Us, ksq)) / 32;
721
722         // Analyse enemy's safe queen contact checks. First find undefended
723         // squares around the king attacked by enemy queen...
724         b = undefended & ei.attackedBy[Them][QUEEN] & ~pos.pieces_of_color(Them);
725         if (b)
726         {
727             // ...then remove squares not supported by another enemy piece
728             b &= (  ei.attackedBy[Them][PAWN]   | ei.attackedBy[Them][KNIGHT]
729                   | ei.attackedBy[Them][BISHOP] | ei.attackedBy[Them][ROOK]);
730             if (b)
731                 attackUnits += QueenContactCheckBonus * count_1s_max_15<HasPopCnt>(b) * (sente ? 2 : 1);
732         }
733
734         // Analyse enemy's safe distance checks for sliders and knights
735         safe = ~(pos.pieces_of_color(Them) | ei.attackedBy[Us][0]);
736
737         b1 = pos.attacks_from<ROOK>(ksq) & safe;
738         b2 = pos.attacks_from<BISHOP>(ksq) & safe;
739
740         // Enemy queen safe checks
741         b = (b1 | b2) & ei.attackedBy[Them][QUEEN];
742         if (b)
743             attackUnits += QueenCheckBonus * count_1s_max_15<HasPopCnt>(b);
744
745         // Enemy rooks safe checks
746         b = b1 & ei.attackedBy[Them][ROOK];
747         if (b)
748             attackUnits += RookCheckBonus * count_1s_max_15<HasPopCnt>(b);
749
750         // Enemy bishops safe checks
751         b = b2 & ei.attackedBy[Them][BISHOP];
752         if (b)
753             attackUnits += BishopCheckBonus * count_1s_max_15<HasPopCnt>(b);
754
755         // Enemy knights safe checks
756         b = pos.attacks_from<KNIGHT>(ksq) & ei.attackedBy[Them][KNIGHT] & safe;
757         if (b)
758             attackUnits += KnightCheckBonus * count_1s_max_15<HasPopCnt>(b);
759
760         // To index KingDangerTable[] attackUnits must be in [0, 99] range
761         attackUnits = Min(99, Max(0, attackUnits));
762
763         // Finally, extract the king danger score from the KingDangerTable[]
764         // array and subtract the score from evaluation. Set also ei.margin[]
765         // value that will be used for pruning because this value can sometimes
766         // be very big, and so capturing a single attacking piece can therefore
767         // result in a score change far bigger than the value of the captured piece.
768         ei.value -= Sign[Us] * KingDangerTable[Us][attackUnits];
769         ei.margin[Us] = mg_value(KingDangerTable[Us][attackUnits]);
770     } else
771         ei.margin[Us] = VALUE_ZERO;
772   }
773
774
775   // evaluate_passed_pawns<>() evaluates the passed pawns of the given color
776
777   template<Color Us>
778   void evaluate_passed_pawns(const Position& pos, EvalInfo& ei) {
779
780     const Color Them = (Us == WHITE ? BLACK : WHITE);
781
782     Score bonus = SCORE_ZERO;
783     Bitboard squaresToQueen, defendedSquares, unsafeSquares, supportingPawns;
784     Bitboard b = ei.pi->passed_pawns(Us);
785
786     if (!b)
787         return;
788
789     do {
790         Square s = pop_1st_bit(&b);
791
792         assert(pos.pawn_is_passed(Us, s));
793
794         int r = int(relative_rank(Us, s) - RANK_2);
795         int tr = r * (r - 1);
796
797         // Base bonus based on rank
798         Value mbonus = Value(20 * tr);
799         Value ebonus = Value(10 + r * r * 10);
800
801         if (tr)
802         {
803             Square blockSq = s + pawn_push(Us);
804
805             // Adjust bonus based on kings proximity
806             ebonus -= Value(square_distance(pos.king_square(Us), blockSq) * 3 * tr);
807             ebonus -= Value(square_distance(pos.king_square(Us), blockSq + pawn_push(Us)) * 1 * tr);
808             ebonus += Value(square_distance(pos.king_square(Them), blockSq) * 6 * tr);
809
810             // If the pawn is free to advance, increase bonus
811             if (pos.square_is_empty(blockSq))
812             {
813                 squaresToQueen = squares_in_front_of(Us, s);
814                 defendedSquares = squaresToQueen & ei.attackedBy[Us][0];
815
816                 // If there is an enemy rook or queen attacking the pawn from behind,
817                 // add all X-ray attacks by the rook or queen. Otherwise consider only
818                 // the squares in the pawn's path attacked or occupied by the enemy.
819                 if (   (squares_behind(Us, s) & pos.pieces(ROOK, QUEEN, Them))
820                     && (squares_behind(Us, s) & pos.pieces(ROOK, QUEEN, Them) & pos.attacks_from<ROOK>(s)))
821                     unsafeSquares = squaresToQueen;
822                 else
823                     unsafeSquares = squaresToQueen & (ei.attackedBy[Them][0] | pos.pieces_of_color(Them));
824
825                 // If there aren't enemy attacks or pieces along the path to queen give
826                 // huge bonus. Even bigger if we protect the pawn's path.
827                 if (!unsafeSquares)
828                     ebonus += Value(tr * (squaresToQueen == defendedSquares ? 17 : 15));
829                 else
830                     // OK, there are enemy attacks or pieces (but not pawns). Are those
831                     // squares which are attacked by the enemy also attacked by us ?
832                     // If yes, big bonus (but smaller than when there are no enemy attacks),
833                     // if no, somewhat smaller bonus.
834                     ebonus += Value(tr * ((unsafeSquares & defendedSquares) == unsafeSquares ? 13 : 8));
835
836                 // At last, add a small bonus when there are no *friendly* pieces
837                 // in the pawn's path.
838                 if (!(squaresToQueen & pos.pieces_of_color(Us)))
839                     ebonus += Value(tr);
840             }
841         } // tr != 0
842
843         // Increase the bonus if the passed pawn is supported by a friendly pawn
844         // on the same rank and a bit smaller if it's on the previous rank.
845         supportingPawns = pos.pieces(PAWN, Us) & neighboring_files_bb(s);
846         if (supportingPawns & rank_bb(s))
847             ebonus += Value(r * 20);
848         else if (supportingPawns & rank_bb(s - pawn_push(Us)))
849             ebonus += Value(r * 12);
850
851         // Rook pawns are a special case: They are sometimes worse, and
852         // sometimes better than other passed pawns. It is difficult to find
853         // good rules for determining whether they are good or bad. For now,
854         // we try the following: Increase the value for rook pawns if the
855         // other side has no pieces apart from a knight, and decrease the
856         // value if the other side has a rook or queen.
857         if (square_file(s) == FILE_A || square_file(s) == FILE_H)
858         {
859             if (pos.non_pawn_material(Them) <= KnightValueMidgame)
860                 ebonus += ebonus / 4;
861             else if (pos.pieces(ROOK, QUEEN, Them))
862                 ebonus -= ebonus / 4;
863         }
864         bonus += make_score(mbonus, ebonus);
865
866     } while (b);
867
868     // Add the scores to the middle game and endgame eval
869     ei.value += Sign[Us] * apply_weight(bonus, Weights[PassedPawns]);
870   }
871
872
873   // evaluate_space() computes the space evaluation for a given side. The
874   // space evaluation is a simple bonus based on the number of safe squares
875   // available for minor pieces on the central four files on ranks 2--4. Safe
876   // squares one, two or three squares behind a friendly pawn are counted
877   // twice. Finally, the space bonus is scaled by a weight taken from the
878   // material hash table.
879   template<Color Us, bool HasPopCnt>
880   int evaluate_space(const Position& pos, EvalInfo& ei) {
881
882     const Color Them = (Us == WHITE ? BLACK : WHITE);
883
884     // Find the safe squares for our pieces inside the area defined by
885     // SpaceMask[us]. A square is unsafe if it is attacked by an enemy
886     // pawn, or if it is undefended and attacked by an enemy piece.
887     Bitboard safe =   SpaceMask[Us]
888                    & ~pos.pieces(PAWN, Us)
889                    & ~ei.attackedBy[Them][PAWN]
890                    & (ei.attackedBy[Us][0] | ~ei.attackedBy[Them][0]);
891
892     // Find all squares which are at most three squares behind some friendly pawn
893     Bitboard behind = pos.pieces(PAWN, Us);
894     behind |= (Us == WHITE ? behind >>  8 : behind <<  8);
895     behind |= (Us == WHITE ? behind >> 16 : behind << 16);
896
897     return count_1s_max_15<HasPopCnt>(safe) + count_1s_max_15<HasPopCnt>(behind & safe);
898   }
899
900
901   // apply_weight() applies an evaluation weight to a value trying to prevent overflow
902
903   inline Score apply_weight(Score v, Score w) {
904       return make_score((int(mg_value(v)) * mg_value(w)) / 0x100, (int(eg_value(v)) * eg_value(w)) / 0x100);
905   }
906
907
908   // scale_by_game_phase() interpolates between a middle game and an endgame score,
909   // based on game phase. It also scales the return value by a ScaleFactor array.
910
911   Value scale_by_game_phase(const Score& v, Phase ph, const ScaleFactor sf[]) {
912
913     assert(mg_value(v) > -VALUE_INFINITE && mg_value(v) < VALUE_INFINITE);
914     assert(eg_value(v) > -VALUE_INFINITE && eg_value(v) < VALUE_INFINITE);
915     assert(ph >= PHASE_ENDGAME && ph <= PHASE_MIDGAME);
916
917     Value eg = eg_value(v);
918     ScaleFactor f = sf[eg > VALUE_ZERO ? WHITE : BLACK];
919     Value ev = Value((eg * int(f)) / SCALE_FACTOR_NORMAL);
920
921     int result = (mg_value(v) * int(ph) + ev * int(128 - ph)) / 128;
922     return Value(result & ~(GrainSize - 1));
923   }
924
925
926   // weight_option() computes the value of an evaluation weight, by combining
927   // two UCI-configurable weights (midgame and endgame) with an internal weight.
928
929   Score weight_option(const std::string& mgOpt, const std::string& egOpt, Score internalWeight) {
930
931     // Scale option value from 100 to 256
932     int mg = get_option_value_int(mgOpt) * 256 / 100;
933     int eg = get_option_value_int(egOpt) * 256 / 100;
934
935     return apply_weight(make_score(mg, eg), internalWeight);
936   }
937
938   // init_safety() initizes the king safety evaluation, based on UCI
939   // parameters. It is called from read_weights().
940
941   void init_safety() {
942
943     const Value MaxSlope = Value(30);
944     const Value Peak = Value(1280);
945     Value t[100];
946
947     // First setup the base table
948     for (int i = 0; i < 100; i++)
949     {
950         t[i] = Value(int(0.4 * i * i));
951
952         if (i > 0)
953             t[i] = Min(t[i], t[i - 1] + MaxSlope);
954
955         t[i] = Min(t[i], Peak);
956     }
957
958     // Then apply the weights and get the final KingDangerTable[] array
959     for (Color c = WHITE; c <= BLACK; c++)
960         for (int i = 0; i < 100; i++)
961             KingDangerTable[c][i] = apply_weight(make_score(t[i], 0), Weights[KingDangerUs + c]);
962   }
963 }