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