]> git.sesse.net Git - stockfish/blob - src/evaluate.cpp
f7a59de69319c9bff7192b739e544e2ba5e76b65
[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-2014 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 #include <cassert>
21 #include <iomanip>
22 #include <sstream>
23 #include <algorithm>
24
25 #include "bitcount.h"
26 #include "evaluate.h"
27 #include "material.h"
28 #include "pawns.h"
29 #include "thread.h"
30 #include "ucioption.h"
31
32 namespace {
33
34   // Struct EvalInfo contains various information computed and collected
35   // by the evaluation functions.
36   struct EvalInfo {
37
38     // Pointers to material and pawn hash table entries
39     Material::Entry* mi;
40     Pawns::Entry* pi;
41
42     // attackedBy[color][piece type] is a bitboard representing all squares
43     // attacked by a given color and piece type, attackedBy[color][ALL_PIECES]
44     // contains all squares attacked by the given color.
45     Bitboard attackedBy[COLOR_NB][PIECE_TYPE_NB];
46
47     // kingRing[color] is the zone around the king which is considered
48     // by the king safety evaluation. This consists of the squares directly
49     // adjacent to the king, and the three (or two, for a king on an edge file)
50     // squares two ranks in front of the king. For instance, if black's king
51     // is on g8, kingRing[BLACK] is a bitboard containing the squares f8, h8,
52     // f7, g7, h7, f6, g6 and h6.
53     Bitboard kingRing[COLOR_NB];
54
55     // kingAttackersCount[color] is the number of pieces of the given color
56     // which attack a square in the kingRing of the enemy king.
57     int kingAttackersCount[COLOR_NB];
58
59     // kingAttackersWeight[color] is the sum of the "weight" of the pieces of the
60     // given color which attack a square in the kingRing of the enemy king. The
61     // weights of the individual piece types are given by the variables
62     // QueenAttackWeight, RookAttackWeight, BishopAttackWeight and
63     // KnightAttackWeight in evaluate.cpp
64     int kingAttackersWeight[COLOR_NB];
65
66     // kingAdjacentZoneAttacksCount[color] is the number of attacks to squares
67     // directly adjacent to the king of the given color. Pieces which attack
68     // more than one square are counted multiple times. For instance, if black's
69     // king is on g8 and there's a white knight on g5, this knight adds
70     // 2 to kingAdjacentZoneAttacksCount[BLACK].
71     int kingAdjacentZoneAttacksCount[COLOR_NB];
72
73     Bitboard pinnedPieces[COLOR_NB];
74   };
75
76   namespace Tracing {
77
78     enum Terms { // First 8 entries are for PieceType
79       PST = 8, IMBALANCE, MOBILITY, THREAT, PASSED, SPACE, TOTAL, TERMS_NB
80     };
81
82     Score terms[COLOR_NB][TERMS_NB];
83     EvalInfo ei;
84     ScaleFactor sf;
85
86     double to_cp(Value v);
87     void add_term(int idx, Score term_w, Score term_b = SCORE_ZERO);
88     void format_row(std::stringstream& ss, const char* name, int idx);
89     std::string do_trace(const Position& pos);
90   }
91
92   // Evaluation weights, initialized from UCI options
93   enum { Mobility, PawnStructure, PassedPawns, Space, KingDangerUs, KingDangerThem };
94   struct Weight { int mg, eg; } Weights[6];
95
96   typedef Value V;
97   #define S(mg, eg) make_score(mg, eg)
98
99   // Internal evaluation weights. These are applied on top of the evaluation
100   // weights read from UCI parameters. The purpose is to be able to change
101   // the evaluation weights while keeping the default values of the UCI
102   // parameters at 100, which looks prettier.
103   //
104   // Values modified by Joona Kiiski
105   const Score WeightsInternal[] = {
106     S(289, 344), S(233, 201), S(221, 273), S(46, 0), S(271, 0), S(307, 0)
107   };
108
109   // MobilityBonus[PieceType][attacked] contains bonuses for middle and end
110   // game, indexed by piece type and number of attacked squares not occupied by
111   // friendly pieces.
112   const Score MobilityBonus[][32] = {
113     {}, {},
114     { S(-65,-50), S(-42,-30), S(-9,-10), S( 3,  0), S(15, 10), S(27, 20), // Knights
115       S( 37, 28), S( 42, 31), S(44, 33) },
116     { S(-52,-47), S(-28,-23), S( 6,  1), S(20, 15), S(34, 29), S(48, 43), // Bishops
117       S( 60, 55), S( 68, 63), S(74, 68), S(77, 72), S(80, 75), S(82, 77),
118       S( 84, 79), S( 86, 81) },
119     { S(-47,-53), S(-31,-26), S(-5,  0), S( 1, 16), S( 7, 32), S(13, 48), // Rooks
120       S( 18, 64), S( 22, 80), S(26, 96), S(29,109), S(31,115), S(33,119),
121       S( 35,122), S( 36,123), S(37,124) },
122     { S(-42,-40), S(-28,-23), S(-5, -7), S( 0,  0), S( 6, 10), S(11, 19), // Queens
123       S( 13, 29), S( 18, 38), S(20, 40), S(21, 41), S(22, 41), S(22, 41),
124       S( 22, 41), S( 23, 41), S(24, 41), S(25, 41), S(25, 41), S(25, 41),
125       S( 25, 41), S( 25, 41), S(25, 41), S(25, 41), S(25, 41), S(25, 41),
126       S( 25, 41), S( 25, 41), S(25, 41), S(25, 41) }
127   };
128
129   // Outpost[PieceType][Square] contains bonuses for knights and bishops outposts,
130   // indexed by piece type and square (from white's point of view).
131   const Value Outpost[][SQUARE_NB] = {
132   {// A     B     C     D     E     F     G     H
133     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0), // Knights
134     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0),
135     V(0), V(0), V(4), V(8), V(8), V(4), V(0), V(0),
136     V(0), V(4),V(17),V(26),V(26),V(17), V(4), V(0),
137     V(0), V(8),V(26),V(35),V(35),V(26), V(8), V(0),
138     V(0), V(4),V(17),V(17),V(17),V(17), V(4), 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   };
147
148   // Threat[attacking][attacked] contains bonuses according to which piece
149   // type attacks which one.
150   const Score Threat[][PIECE_TYPE_NB] = {
151     { S(0, 0), S( 7, 39), S(24, 49), S(24, 49), S(41,100), S(41,100) }, // Minor
152     { S(0, 0), S(15, 39), S(15, 45), S(15, 45), S(15, 45), S(24, 49) }  // Major
153   };
154
155   // ThreatenedByPawn[PieceType] contains a penalty according to which piece
156   // type is attacked by an enemy pawn.
157   const Score ThreatenedByPawn[] = {
158     S(0, 0), S(0, 0), S(56, 70), S(56, 70), S(76, 99), S(86, 118)
159   };
160
161   #undef S
162
163   const Score Tempo            = make_score(24, 11);
164   const Score RookOn7th        = make_score(11, 20);
165   const Score RookOnPawn       = make_score(10, 28);
166   const Score RookOpenFile     = make_score(43, 21);
167   const Score RookSemiopenFile = make_score(19, 10);
168   const Score BishopPawns      = make_score( 8, 12);
169   const Score MinorBehindPawn  = make_score(16,  0);
170   const Score UndefendedMinor  = make_score(25, 10);
171   const Score TrappedRook      = make_score(90,  0);
172   const Score Unstoppable      = make_score( 0, 20);
173
174   // Penalty for a bishop on a1/h1 (a8/h8 for black) which is trapped by
175   // a friendly pawn on b2/g2 (b7/g7 for black). This can obviously only
176   // happen in Chess960 games.
177   const Score TrappedBishopA1H1 = make_score(50, 50);
178
179   // SpaceMask[Color] contains the area of the board which is considered
180   // by the space evaluation. In the middlegame, each side is given a bonus
181   // based on how many squares inside this area are safe and available for
182   // friendly minor pieces.
183   const Bitboard SpaceMask[] = {
184     (FileCBB | FileDBB | FileEBB | FileFBB) & (Rank2BB | Rank3BB | Rank4BB),
185     (FileCBB | FileDBB | FileEBB | FileFBB) & (Rank7BB | Rank6BB | Rank5BB)
186   };
187
188   // King danger constants and variables. The king danger scores are taken
189   // from KingDanger[]. Various little "meta-bonuses" measuring the strength
190   // of the enemy attack are added up into an integer, which is used as an
191   // index to KingDanger[].
192   //
193   // KingAttackWeights[PieceType] contains king attack weights by piece type
194   const int KingAttackWeights[] = { 0, 0, 2, 2, 3, 5 };
195
196   // Bonuses for enemy's safe checks
197   const int QueenContactCheck = 24;
198   const int RookContactCheck  = 16;
199   const int QueenCheck        = 12;
200   const int RookCheck         = 8;
201   const int BishopCheck       = 2;
202   const int KnightCheck       = 3;
203
204   // KingDanger[Color][attackUnits] contains the actual king danger weighted
205   // scores, indexed by color and by a calculated integer number.
206   Score KingDanger[COLOR_NB][128];
207
208
209   // apply_weight() weighs score 'v' by weight 'w' trying to prevent overflow
210   Score apply_weight(Score v, const Weight& w) {
211     return make_score(mg_value(v) * w.mg / 256, eg_value(v) * w.eg / 256);
212   }
213
214
215   // weight_option() computes the value of an evaluation weight, by combining
216   // two UCI-configurable weights (midgame and endgame) with an internal weight.
217
218   Weight weight_option(const std::string& mgOpt, const std::string& egOpt, Score internalWeight) {
219
220     Weight w = { Options[mgOpt] * mg_value(internalWeight) / 100,
221                  Options[egOpt] * eg_value(internalWeight) / 100 };
222     return w;
223   }
224
225
226   // interpolate() interpolates between a middlegame and an endgame score,
227   // based on game phase. It also scales the return value by a ScaleFactor array.
228
229   Value interpolate(const Score& v, Phase ph, ScaleFactor sf) {
230
231     assert(-VALUE_INFINITE < mg_value(v) && mg_value(v) < VALUE_INFINITE);
232     assert(-VALUE_INFINITE < eg_value(v) && eg_value(v) < VALUE_INFINITE);
233     assert(PHASE_ENDGAME <= ph && ph <= PHASE_MIDGAME);
234
235     int eg = (eg_value(v) * int(sf)) / SCALE_FACTOR_NORMAL;
236     return Value((mg_value(v) * int(ph) + eg * int(PHASE_MIDGAME - ph)) / PHASE_MIDGAME);
237   }
238
239
240   // init_eval_info() initializes king bitboards for given color adding
241   // pawn attacks. To be done at the beginning of the evaluation.
242
243   template<Color Us>
244   void init_eval_info(const Position& pos, EvalInfo& ei) {
245
246     const Color  Them = (Us == WHITE ? BLACK : WHITE);
247     const Square Down = (Us == WHITE ? DELTA_S : DELTA_N);
248
249     ei.pinnedPieces[Us] = pos.pinned_pieces(Us);
250
251     Bitboard b = ei.attackedBy[Them][KING] = pos.attacks_from<KING>(pos.king_square(Them));
252     ei.attackedBy[Us][ALL_PIECES] = ei.attackedBy[Us][PAWN] = ei.pi->pawn_attacks(Us);
253
254     // Init king safety tables only if we are going to use them
255     if (pos.count<QUEEN>(Us) && pos.non_pawn_material(Us) > QueenValueMg + PawnValueMg)
256     {
257         ei.kingRing[Them] = b | shift_bb<Down>(b);
258         b &= ei.attackedBy[Us][PAWN];
259         ei.kingAttackersCount[Us] = b ? popcount<Max15>(b) : 0;
260         ei.kingAdjacentZoneAttacksCount[Us] = ei.kingAttackersWeight[Us] = 0;
261     }
262     else
263         ei.kingRing[Them] = ei.kingAttackersCount[Us] = 0;
264   }
265
266
267   // evaluate_outposts() evaluates bishop and knight outpost squares
268
269   template<PieceType Pt, Color Us>
270   Score evaluate_outposts(const Position& pos, EvalInfo& ei, Square s) {
271
272     const Color Them = (Us == WHITE ? BLACK : WHITE);
273
274     assert (Pt == BISHOP || Pt == KNIGHT);
275
276     // Initial bonus based on square
277     Value bonus = Outpost[Pt == BISHOP][relative_square(Us, s)];
278
279     // Increase bonus if supported by pawn, especially if the opponent has
280     // no minor piece which can trade with the outpost piece.
281     if (bonus && (ei.attackedBy[Us][PAWN] & s))
282     {
283         if (   !pos.pieces(Them, KNIGHT)
284             && !(squares_of_color(s) & pos.pieces(Them, BISHOP)))
285             bonus += bonus + bonus / 2;
286         else
287             bonus += bonus / 2;
288     }
289
290     return make_score(bonus, bonus);
291   }
292
293
294   // evaluate_pieces() assigns bonuses and penalties to the pieces of a given color
295
296   template<PieceType Pt, Color Us, bool Trace>
297   Score evaluate_pieces(const Position& pos, EvalInfo& ei, Score* mobility, Bitboard* mobilityArea) {
298
299     Bitboard b;
300     Square s;
301     Score score = SCORE_ZERO;
302
303     const PieceType NextPt = (Us == WHITE ? Pt : PieceType(Pt + 1));
304     const Color Them = (Us == WHITE ? BLACK : WHITE);
305     const Square* pl = pos.list<Pt>(Us);
306
307     ei.attackedBy[Us][Pt] = 0;
308
309     while ((s = *pl++) != SQ_NONE)
310     {
311         // Find attacked squares, including x-ray attacks for bishops and rooks
312         b = Pt == BISHOP ? attacks_bb<BISHOP>(s, pos.pieces() ^ pos.pieces(Us, QUEEN))
313           : Pt ==   ROOK ? attacks_bb<  ROOK>(s, pos.pieces() ^ pos.pieces(Us, ROOK, QUEEN))
314                          : pos.attacks_from<Pt>(s);
315
316         if (ei.pinnedPieces[Us] & s)
317             b &= LineBB[pos.king_square(Us)][s];
318
319         ei.attackedBy[Us][ALL_PIECES] |= ei.attackedBy[Us][Pt] |= b;
320
321         if (b & ei.kingRing[Them])
322         {
323             ei.kingAttackersCount[Us]++;
324             ei.kingAttackersWeight[Us] += KingAttackWeights[Pt];
325             Bitboard bb = b & ei.attackedBy[Them][KING];
326             if (bb)
327                 ei.kingAdjacentZoneAttacksCount[Us] += popcount<Max15>(bb);
328         }
329
330         if (Pt == QUEEN)
331             b &= ~(  ei.attackedBy[Them][KNIGHT]
332                    | ei.attackedBy[Them][BISHOP]
333                    | ei.attackedBy[Them][ROOK]);
334
335         int mob = Pt != QUEEN ? popcount<Max15>(b & mobilityArea[Us])
336                               : popcount<Full >(b & mobilityArea[Us]);
337
338         mobility[Us] += MobilityBonus[Pt][mob];
339
340         // Decrease score if we are attacked by an enemy pawn. The remaining part
341         // of threat evaluation must be done later when we have full attack info.
342         if (ei.attackedBy[Them][PAWN] & s)
343             score -= ThreatenedByPawn[Pt];
344
345         if (Pt == BISHOP || Pt == KNIGHT)
346         {
347             // Penalty for bishop with same colored pawns
348             if (Pt == BISHOP)
349                 score -= BishopPawns * ei.pi->pawns_on_same_color_squares(Us, s);
350
351             // Bishop and knight outposts squares
352             if (!(pos.pieces(Them, PAWN) & pawn_attack_span(Us, s)))
353                 score += evaluate_outposts<Pt, Us>(pos, ei, s);
354
355             // Bishop or knight behind a pawn
356             if (    relative_rank(Us, s) < RANK_5
357                 && (pos.pieces(PAWN) & (s + pawn_push(Us))))
358                 score += MinorBehindPawn;
359         }
360
361         if (Pt == ROOK)
362         {
363             // Rook on 7th rank and enemy king trapped on 8th
364             if (   relative_rank(Us, s) == RANK_7
365                 && relative_rank(Us, pos.king_square(Them)) == RANK_8)
366                 score += RookOn7th;
367
368             // Rook piece attacking enemy pawns on the same rank/file
369             if (relative_rank(Us, s) >= RANK_5)
370             {
371                 Bitboard pawns = pos.pieces(Them, PAWN) & PseudoAttacks[ROOK][s];
372                 if (pawns)
373                     score += popcount<Max15>(pawns) * RookOnPawn;
374             }
375
376             // Give a bonus for a rook on a open or semi-open file
377             if (ei.pi->semiopen_file(Us, file_of(s)))
378                 score += ei.pi->semiopen_file(Them, file_of(s)) ? RookOpenFile : RookSemiopenFile;
379
380             if (mob > 3 || ei.pi->semiopen_file(Us, file_of(s)))
381                 continue;
382
383             Square ksq = pos.king_square(Us);
384
385             // Penalize rooks which are trapped by a king. Penalize more if the
386             // king has lost its castling capability.
387             if (   ((file_of(ksq) < FILE_E) == (file_of(s) < file_of(ksq)))
388                 && (rank_of(ksq) == rank_of(s) || relative_rank(Us, ksq) == RANK_1)
389                 && !ei.pi->semiopen_side(Us, file_of(ksq), file_of(s) < file_of(ksq)))
390                 score -= (TrappedRook - make_score(mob * 8, 0)) * (1 + !pos.can_castle(Us));
391         }
392
393         // An important Chess960 pattern: A cornered bishop blocked by a friendly
394         // pawn diagonally in front of it is a very serious problem, especially
395         // when that pawn is also blocked.
396         if (   Pt == BISHOP
397             && pos.is_chess960()
398             && (s == relative_square(Us, SQ_A1) || s == relative_square(Us, SQ_H1)))
399         {
400             Square d = pawn_push(Us) + (file_of(s) == FILE_A ? DELTA_E : DELTA_W);
401             if (pos.piece_on(s + d) == make_piece(Us, PAWN))
402                 score -= !pos.empty(s + d + pawn_push(Us))                ? TrappedBishopA1H1 * 4
403                         : pos.piece_on(s + d + d) == make_piece(Us, PAWN) ? TrappedBishopA1H1 * 2
404                                                                           : TrappedBishopA1H1;
405         }
406     }
407
408     if (Trace)
409         Tracing::terms[Us][Pt] = score;
410
411     return score - evaluate_pieces<NextPt, Them, Trace>(pos, ei, mobility, mobilityArea);
412   }
413
414   template<>
415   Score evaluate_pieces<KING, WHITE, false>(const Position&, EvalInfo&, Score*, Bitboard*) { return SCORE_ZERO; }
416   template<>
417   Score evaluate_pieces<KING, WHITE,  true>(const Position&, EvalInfo&, Score*, Bitboard*) { return SCORE_ZERO; }
418
419
420   // evaluate_king() assigns bonuses and penalties to a king of a given color
421
422   template<Color Us, bool Trace>
423   Score evaluate_king(const Position& pos, const EvalInfo& ei) {
424
425     const Color Them = (Us == WHITE ? BLACK : WHITE);
426
427     Bitboard undefended, b, b1, b2, safe;
428     int attackUnits;
429     const Square ksq = pos.king_square(Us);
430
431     // King shelter and enemy pawns storm
432     Score score = ei.pi->king_safety<Us>(pos, ksq);
433
434     // Main king safety evaluation
435     if (ei.kingAttackersCount[Them])
436     {
437         // Find the attacked squares around the king which have no defenders
438         // apart from the king itself
439         undefended =  ei.attackedBy[Them][ALL_PIECES]
440                     & ei.attackedBy[Us][KING]
441                     & ~(  ei.attackedBy[Us][PAWN]   | ei.attackedBy[Us][KNIGHT]
442                         | ei.attackedBy[Us][BISHOP] | ei.attackedBy[Us][ROOK]
443                         | ei.attackedBy[Us][QUEEN]);
444
445         // Initialize the 'attackUnits' variable, which is used later on as an
446         // index to the KingDanger[] array. The initial value is based on the
447         // number and types of the enemy's attacking pieces, the number of
448         // attacked and undefended squares around our king and the quality of
449         // the pawn shelter (current 'score' value).
450         attackUnits =  std::min(20, (ei.kingAttackersCount[Them] * ei.kingAttackersWeight[Them]) / 2)
451                      + 3 * (ei.kingAdjacentZoneAttacksCount[Them] + popcount<Max15>(undefended))
452                      + 2 * (ei.pinnedPieces[Us] != 0)
453                      - mg_value(score) / 32;
454
455         // Analyse the enemy's safe queen contact checks. Firstly, find the
456         // undefended squares around the king that are attacked by the enemy's
457         // queen...
458         b = undefended & ei.attackedBy[Them][QUEEN] & ~pos.pieces(Them);
459         if (b)
460         {
461             // ...and then remove squares not supported by another enemy piece
462             b &= (  ei.attackedBy[Them][PAWN]   | ei.attackedBy[Them][KNIGHT]
463                   | ei.attackedBy[Them][BISHOP] | ei.attackedBy[Them][ROOK]);
464
465             if (b)
466                 attackUnits +=  QueenContactCheck
467                               * popcount<Max15>(b)
468                               * (Them == pos.side_to_move() ? 2 : 1);
469         }
470
471         // Analyse the enemy's safe rook contact checks. Firstly, find the
472         // undefended squares around the king that are attacked by the enemy's
473         // rooks...
474         b = undefended & ei.attackedBy[Them][ROOK] & ~pos.pieces(Them);
475
476         // Consider only squares where the enemy's rook gives check
477         b &= PseudoAttacks[ROOK][ksq];
478
479         if (b)
480         {
481             // ...and then remove squares not supported by another enemy piece
482             b &= (  ei.attackedBy[Them][PAWN]   | ei.attackedBy[Them][KNIGHT]
483                   | ei.attackedBy[Them][BISHOP] | ei.attackedBy[Them][QUEEN]);
484
485             if (b)
486                 attackUnits +=  RookContactCheck
487                               * popcount<Max15>(b)
488                               * (Them == pos.side_to_move() ? 2 : 1);
489         }
490
491         // Analyse the enemy's safe distance checks for sliders and knights
492         safe = ~(pos.pieces(Them) | ei.attackedBy[Us][ALL_PIECES]);
493
494         b1 = pos.attacks_from<ROOK>(ksq) & safe;
495         b2 = pos.attacks_from<BISHOP>(ksq) & safe;
496
497         // Enemy queen safe checks
498         b = (b1 | b2) & ei.attackedBy[Them][QUEEN];
499         if (b)
500             attackUnits += QueenCheck * popcount<Max15>(b);
501
502         // Enemy rooks safe checks
503         b = b1 & ei.attackedBy[Them][ROOK];
504         if (b)
505             attackUnits += RookCheck * popcount<Max15>(b);
506
507         // Enemy bishops safe checks
508         b = b2 & ei.attackedBy[Them][BISHOP];
509         if (b)
510             attackUnits += BishopCheck * popcount<Max15>(b);
511
512         // Enemy knights safe checks
513         b = pos.attacks_from<KNIGHT>(ksq) & ei.attackedBy[Them][KNIGHT] & safe;
514         if (b)
515             attackUnits += KnightCheck * popcount<Max15>(b);
516
517         // To index KingDanger[] attackUnits must be in [0, 99] range
518         attackUnits = std::min(99, std::max(0, attackUnits));
519
520         // Finally, extract the king danger score from the KingDanger[]
521         // array and subtract the score from evaluation.
522         score -= KingDanger[Us == Search::RootColor][attackUnits];
523     }
524
525     if (Trace)
526         Tracing::terms[Us][KING] = score;
527
528     return score;
529   }
530
531
532   // evaluate_threats() assigns bonuses according to the type of attacking piece
533   // and the type of attacked one.
534
535   template<Color Us, bool Trace>
536   Score evaluate_threats(const Position& pos, const EvalInfo& ei) {
537
538     const Color Them = (Us == WHITE ? BLACK : WHITE);
539
540     Bitboard b, undefendedMinors, weakEnemies;
541     Score score = SCORE_ZERO;
542
543     // Undefended minors get penalized even if they are not under attack
544     undefendedMinors =  pos.pieces(Them, BISHOP, KNIGHT)
545                       & ~ei.attackedBy[Them][ALL_PIECES];
546
547     if (undefendedMinors)
548         score += UndefendedMinor;
549
550     // Enemy pieces not defended by a pawn and under our attack
551     weakEnemies =  pos.pieces(Them)
552                  & ~ei.attackedBy[Them][PAWN]
553                  & ei.attackedBy[Us][ALL_PIECES];
554
555     // Add a bonus according if the attacking pieces are minor or major
556     if (weakEnemies)
557     {
558         b = weakEnemies & (ei.attackedBy[Us][KNIGHT] | ei.attackedBy[Us][BISHOP]);
559         if (b)
560             score += Threat[0][type_of(pos.piece_on(lsb(b)))];
561
562         b = weakEnemies & (ei.attackedBy[Us][ROOK] | ei.attackedBy[Us][QUEEN]);
563         if (b)
564             score += Threat[1][type_of(pos.piece_on(lsb(b)))];
565     }
566
567     if (Trace)
568         Tracing::terms[Us][Tracing::THREAT] = score;
569
570     return score;
571   }
572
573
574   // evaluate_passed_pawns() evaluates the passed pawns of the given color
575
576   template<Color Us, bool Trace>
577   Score evaluate_passed_pawns(const Position& pos, const EvalInfo& ei) {
578
579     const Color Them = (Us == WHITE ? BLACK : WHITE);
580
581     Bitboard b, squaresToQueen, defendedSquares, unsafeSquares;
582     Score score = SCORE_ZERO;
583
584     b = ei.pi->passed_pawns(Us);
585
586     while (b)
587     {
588         Square s = pop_lsb(&b);
589
590         assert(pos.pawn_passed(Us, s));
591
592         int r = int(relative_rank(Us, s) - RANK_2);
593         int rr = r * (r - 1);
594
595         // Base bonus based on rank
596         Value mbonus = Value(17 * rr);
597         Value ebonus = Value(7 * (rr + r + 1));
598
599         if (rr)
600         {
601             Square blockSq = s + pawn_push(Us);
602
603             // Adjust bonus based on the king's proximity
604             ebonus +=  Value(square_distance(pos.king_square(Them), blockSq) * 5 * rr)
605                      - Value(square_distance(pos.king_square(Us  ), blockSq) * 2 * rr);
606
607             // If blockSq is not the queening square then consider also a second push
608             if (relative_rank(Us, blockSq) != RANK_8)
609                 ebonus -= Value(rr * square_distance(pos.king_square(Us), blockSq + pawn_push(Us)));
610
611             // If the pawn is free to advance, then increase the bonus
612             if (pos.empty(blockSq))
613             {
614                 squaresToQueen = forward_bb(Us, s);
615
616                 // If there is an enemy rook or queen attacking the pawn from behind,
617                 // add all X-ray attacks by the rook or queen. Otherwise consider only
618                 // the squares in the pawn's path attacked or occupied by the enemy.
619                 if (    unlikely(forward_bb(Them, s) & pos.pieces(Them, ROOK, QUEEN))
620                     && (forward_bb(Them, s) & pos.pieces(Them, ROOK, QUEEN) & pos.attacks_from<ROOK>(s)))
621                     unsafeSquares = squaresToQueen;
622                 else
623                     unsafeSquares = squaresToQueen & (ei.attackedBy[Them][ALL_PIECES] | pos.pieces(Them));
624
625                 if (    unlikely(forward_bb(Them, s) & pos.pieces(Us, ROOK, QUEEN))
626                     && (forward_bb(Them, s) & pos.pieces(Us, ROOK, QUEEN) & pos.attacks_from<ROOK>(s)))
627                     defendedSquares = squaresToQueen;
628                 else
629                     defendedSquares = squaresToQueen & ei.attackedBy[Us][ALL_PIECES];
630
631                 // If there aren't any enemy attacks, assign a big bonus. Otherwise
632                 // assign a smaller bonus if the block square isn't attacked.
633                 int k = !unsafeSquares ? 15 : !(unsafeSquares & blockSq) ? 9 : 0;
634
635                 // If the path to queen is fully defended, assign a big bonus.
636                 // Otherwise assign a smaller bonus if the block square is defended.
637                 if (defendedSquares == squaresToQueen)
638                     k += 6;
639
640                 else if (defendedSquares & blockSq)
641                     k += 4;
642
643                 mbonus += Value(k * rr), ebonus += Value(k * rr);
644             }
645         } // rr != 0
646
647         // Rook pawns are a special case: They are sometimes worse, and
648         // sometimes better than other passed pawns. It is difficult to find
649         // good rules for determining whether they are good or bad. For now,
650         // we try the following: Increase the value for rook pawns if the
651         // other side has no pieces apart from a knight, and decrease the
652         // value if the other side has a rook or queen.
653         if (file_of(s) == FILE_A || file_of(s) == FILE_H)
654         {
655             if (pos.non_pawn_material(Them) <= KnightValueMg)
656                 ebonus += ebonus / 4;
657
658             else if (pos.pieces(Them, ROOK, QUEEN))
659                 ebonus -= ebonus / 4;
660         }
661
662         if (pos.count<PAWN>(Us) < pos.count<PAWN>(Them))
663             ebonus += ebonus / 4;
664
665         score += make_score(mbonus, ebonus);
666     }
667
668     if (Trace)
669         Tracing::terms[Us][Tracing::PASSED] = apply_weight(score, Weights[PassedPawns]);
670
671     // Add the scores to the middlegame and endgame eval
672     return apply_weight(score, Weights[PassedPawns]);
673   }
674
675
676   // evaluate_unstoppable_pawns() scores the most advanced among the passed and
677   // candidate pawns. In case opponent has no pieces but pawns, this is somewhat
678   // related to the possibility that pawns are unstoppable.
679
680   Score evaluate_unstoppable_pawns(const Position& pos, Color us, const EvalInfo& ei) {
681
682     Bitboard b = ei.pi->passed_pawns(us) | ei.pi->candidate_pawns(us);
683
684     if (!b || pos.non_pawn_material(~us))
685         return SCORE_ZERO;
686
687     return Unstoppable * int(relative_rank(us, frontmost_sq(us, b)));
688   }
689
690
691   // evaluate_space() computes the space evaluation for a given side. The
692   // space evaluation is a simple bonus based on the number of safe squares
693   // available for minor pieces on the central four files on ranks 2--4. Safe
694   // squares one, two or three squares behind a friendly pawn are counted
695   // twice. Finally, the space bonus is scaled by a weight taken from the
696   // material hash table. The aim is to improve play on game opening.
697   template<Color Us>
698   int evaluate_space(const Position& pos, const EvalInfo& ei) {
699
700     const Color Them = (Us == WHITE ? BLACK : WHITE);
701
702     // Find the safe squares for our pieces inside the area defined by
703     // SpaceMask[]. A square is unsafe if it is attacked by an enemy
704     // pawn, or if it is undefended and attacked by an enemy piece.
705     Bitboard safe =   SpaceMask[Us]
706                    & ~pos.pieces(Us, PAWN)
707                    & ~ei.attackedBy[Them][PAWN]
708                    & (ei.attackedBy[Us][ALL_PIECES] | ~ei.attackedBy[Them][ALL_PIECES]);
709
710     // Find all squares which are at most three squares behind some friendly pawn
711     Bitboard behind = pos.pieces(Us, PAWN);
712     behind |= (Us == WHITE ? behind >>  8 : behind <<  8);
713     behind |= (Us == WHITE ? behind >> 16 : behind << 16);
714
715     // Since SpaceMask[Us] is fully on our half of the board
716     assert(unsigned(safe >> (Us == WHITE ? 32 : 0)) == 0);
717
718     // Count safe + (behind & safe) with a single popcount
719     return popcount<Full>((Us == WHITE ? safe << 32 : safe >> 32) | (behind & safe));
720   }
721
722
723   // do_evaluate() is the evaluation entry point, called directly from evaluate()
724
725   template<bool Trace>
726   Value do_evaluate(const Position& pos) {
727
728     assert(!pos.checkers());
729
730     EvalInfo ei;
731     Score score, mobility[2] = { SCORE_ZERO, SCORE_ZERO };
732     Thread* thisThread = pos.this_thread();
733
734     // Initialize score by reading the incrementally updated scores included
735     // in the position object (material + piece square tables) and adding a
736     // Tempo bonus. Score is computed from the point of view of white.
737     score = pos.psq_score() + (pos.side_to_move() == WHITE ? Tempo : -Tempo);
738
739     // Probe the material hash table
740     ei.mi = Material::probe(pos, thisThread->materialTable, thisThread->endgames);
741     score += ei.mi->material_value();
742
743     // If we have a specialized evaluation function for the current material
744     // configuration, call it and return.
745     if (ei.mi->specialized_eval_exists())
746         return ei.mi->evaluate(pos);
747
748     // Probe the pawn hash table
749     ei.pi = Pawns::probe(pos, thisThread->pawnsTable);
750     score += apply_weight(ei.pi->pawns_value(), Weights[PawnStructure]);
751
752     // Initialize attack and king safety bitboards
753     init_eval_info<WHITE>(pos, ei);
754     init_eval_info<BLACK>(pos, ei);
755
756     ei.attackedBy[WHITE][ALL_PIECES] |= ei.attackedBy[WHITE][KING];
757     ei.attackedBy[BLACK][ALL_PIECES] |= ei.attackedBy[BLACK][KING];
758
759     // Do not include in mobility squares protected by enemy pawns or occupied by our pieces
760     Bitboard mobilityArea[] = { ~(ei.attackedBy[BLACK][PAWN] | pos.pieces(WHITE, PAWN, KING)),
761                                 ~(ei.attackedBy[WHITE][PAWN] | pos.pieces(BLACK, PAWN, KING)) };
762
763     // Evaluate pieces and mobility
764     score += evaluate_pieces<KNIGHT, WHITE, Trace>(pos, ei, mobility, mobilityArea);
765     score += apply_weight(mobility[WHITE] - mobility[BLACK], Weights[Mobility]);
766
767     // Evaluate kings after all other pieces because we need complete attack
768     // information when computing the king safety evaluation.
769     score +=  evaluate_king<WHITE, Trace>(pos, ei)
770             - evaluate_king<BLACK, Trace>(pos, ei);
771
772     // Evaluate tactical threats, we need full attack information including king
773     score +=  evaluate_threats<WHITE, Trace>(pos, ei)
774             - evaluate_threats<BLACK, Trace>(pos, ei);
775
776     // Evaluate passed pawns, we need full attack information including king
777     score +=  evaluate_passed_pawns<WHITE, Trace>(pos, ei)
778             - evaluate_passed_pawns<BLACK, Trace>(pos, ei);
779
780     // If one side has only a king, score for potential unstoppable pawns
781     if (!pos.non_pawn_material(WHITE) || !pos.non_pawn_material(BLACK))
782         score +=  evaluate_unstoppable_pawns(pos, WHITE, ei)
783                 - evaluate_unstoppable_pawns(pos, BLACK, ei);
784
785     // Evaluate space for both sides, only in middlegame
786     if (ei.mi->space_weight())
787     {
788         int s = evaluate_space<WHITE>(pos, ei) - evaluate_space<BLACK>(pos, ei);
789         score += apply_weight(s * ei.mi->space_weight(), Weights[Space]);
790     }
791
792     // Scale winning side if position is more drawish than it appears
793     ScaleFactor sf = eg_value(score) > VALUE_DRAW ? ei.mi->scale_factor(pos, WHITE)
794                                                   : ei.mi->scale_factor(pos, BLACK);
795
796     // If we don't already have an unusual scale factor, check for opposite
797     // colored bishop endgames, and use a lower scale for those.
798     if (    ei.mi->game_phase() < PHASE_MIDGAME
799         &&  pos.opposite_bishops()
800         && (sf == SCALE_FACTOR_NORMAL || sf == SCALE_FACTOR_ONEPAWN))
801     {
802         // Ignoring any pawns, do both sides only have a single bishop and no
803         // other pieces?
804         if (   pos.non_pawn_material(WHITE) == BishopValueMg
805             && pos.non_pawn_material(BLACK) == BishopValueMg)
806         {
807             // Check for KBP vs KB with only a single pawn that is almost
808             // certainly a draw or at least two pawns.
809             bool one_pawn = (pos.count<PAWN>(WHITE) + pos.count<PAWN>(BLACK) == 1);
810             sf = one_pawn ? ScaleFactor(8) : ScaleFactor(32);
811         }
812         else
813             // Endgame with opposite-colored bishops, but also other pieces. Still
814             // a bit drawish, but not as drawish as with only the two bishops.
815              sf = ScaleFactor(50 * sf / SCALE_FACTOR_NORMAL);
816     }
817
818     Value v = interpolate(score, ei.mi->game_phase(), sf);
819
820     // In case of tracing add all single evaluation contributions for both white and black
821     if (Trace)
822     {
823         Tracing::add_term(Tracing::PST, pos.psq_score());
824         Tracing::add_term(Tracing::IMBALANCE, ei.mi->material_value());
825         Tracing::add_term(PAWN, ei.pi->pawns_value());
826         Tracing::add_term(Tracing::MOBILITY, apply_weight(mobility[WHITE], Weights[Mobility])
827                                            , apply_weight(mobility[BLACK], Weights[Mobility]));
828         Score w = ei.mi->space_weight() * evaluate_space<WHITE>(pos, ei);
829         Score b = ei.mi->space_weight() * evaluate_space<BLACK>(pos, ei);
830         Tracing::add_term(Tracing::SPACE, apply_weight(w, Weights[Space]), apply_weight(b, Weights[Space]));
831         Tracing::add_term(Tracing::TOTAL, score);
832         Tracing::ei = ei;
833         Tracing::sf = sf;
834     }
835
836     return pos.side_to_move() == WHITE ? v : -v;
837   }
838
839
840   // Tracing function definitions
841
842   double Tracing::to_cp(Value v) { return double(v) / PawnValueEg; }
843
844   void Tracing::add_term(int idx, Score wScore, Score bScore) {
845
846     terms[WHITE][idx] = wScore;
847     terms[BLACK][idx] = bScore;
848   }
849
850   void Tracing::format_row(std::stringstream& ss, const char* name, int idx) {
851
852     Score wScore = terms[WHITE][idx];
853     Score bScore = terms[BLACK][idx];
854
855     switch (idx) {
856     case PST: case IMBALANCE: case PAWN: case TOTAL:
857         ss << std::setw(20) << name << " |   ---   --- |   ---   --- | "
858            << std::setw(5)  << to_cp(mg_value(wScore - bScore)) << " "
859            << std::setw(5)  << to_cp(eg_value(wScore - bScore)) << " \n";
860         break;
861     default:
862         ss << std::setw(20) << name << " | " << std::noshowpos
863            << std::setw(5)  << to_cp(mg_value(wScore)) << " "
864            << std::setw(5)  << to_cp(eg_value(wScore)) << " | "
865            << std::setw(5)  << to_cp(mg_value(bScore)) << " "
866            << std::setw(5)  << to_cp(eg_value(bScore)) << " | "
867            << std::setw(5)  << to_cp(mg_value(wScore - bScore)) << " "
868            << std::setw(5)  << to_cp(eg_value(wScore - bScore)) << " \n";
869     }
870   }
871
872   std::string Tracing::do_trace(const Position& pos) {
873
874     std::memset(terms, 0, sizeof(terms));
875
876     Value v = do_evaluate<true>(pos);
877     v = pos.side_to_move() == WHITE ? v : -v; // White's point of view
878
879     std::stringstream ss;
880     ss << std::showpoint << std::noshowpos << std::fixed << std::setprecision(2)
881        << "           Eval term |    White    |    Black    |    Total    \n"
882        << "                     |   MG    EG  |   MG    EG  |   MG    EG  \n"
883        << "---------------------+-------------+-------------+-------------\n";
884
885     format_row(ss, "Material, PST, Tempo", PST);
886     format_row(ss, "Material imbalance", IMBALANCE);
887     format_row(ss, "Pawns", PAWN);
888     format_row(ss, "Knights", KNIGHT);
889     format_row(ss, "Bishops", BISHOP);
890     format_row(ss, "Rooks", ROOK);
891     format_row(ss, "Queens", QUEEN);
892     format_row(ss, "Mobility", MOBILITY);
893     format_row(ss, "King safety", KING);
894     format_row(ss, "Threats", THREAT);
895     format_row(ss, "Passed pawns", PASSED);
896     format_row(ss, "Space", SPACE);
897
898     ss << "---------------------+-------------+-------------+-------------\n";
899     format_row(ss, "Total", TOTAL);
900
901     ss << "\nTotal Evaluation: " << to_cp(v) << " (white side)\n";
902
903     return ss.str();
904   }
905
906 } // namespace
907
908
909 namespace Eval {
910
911   /// evaluate() is the main evaluation function. It returns a static evaluation
912   /// of the position always from the point of view of the side to move.
913
914   Value evaluate(const Position& pos) {
915     return do_evaluate<false>(pos);
916   }
917
918
919   /// trace() is like evaluate(), but instead of returning a value, it returns
920   /// a string (suitable for outputting to stdout) that contains the detailed
921   /// descriptions and values of each evaluation term. It's mainly used for
922   /// debugging.
923   std::string trace(const Position& pos) {
924     return Tracing::do_trace(pos);
925   }
926
927
928   /// init() computes evaluation weights from the corresponding UCI parameters
929   /// and setup king tables.
930
931   void init() {
932
933     Weights[Mobility]       = weight_option("Mobility (Midgame)", "Mobility (Endgame)", WeightsInternal[Mobility]);
934     Weights[PawnStructure]  = weight_option("Pawn Structure (Midgame)", "Pawn Structure (Endgame)", WeightsInternal[PawnStructure]);
935     Weights[PassedPawns]    = weight_option("Passed Pawns (Midgame)", "Passed Pawns (Endgame)", WeightsInternal[PassedPawns]);
936     Weights[Space]          = weight_option("Space", "Space", WeightsInternal[Space]);
937     Weights[KingDangerUs]   = weight_option("Cowardice", "Cowardice", WeightsInternal[KingDangerUs]);
938     Weights[KingDangerThem] = weight_option("Aggressiveness", "Aggressiveness", WeightsInternal[KingDangerThem]);
939
940     const int MaxSlope = 30;
941     const int Peak = 1280;
942
943     for (int t = 0, i = 1; i < 100; ++i)
944     {
945         t = std::min(Peak, std::min(int(0.4 * i * i), t + MaxSlope));
946
947         KingDanger[1][i] = apply_weight(make_score(t, 0), Weights[KingDangerUs]);
948         KingDanger[0][i] = apply_weight(make_score(t, 0), Weights[KingDangerThem]);
949     }
950   }
951
952 } // namespace Eval