]> git.sesse.net Git - stockfish/blob - src/evaluate.cpp
Move-Count Formula Tweak
[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-2015 Marco Costalba, Joona Kiiski, Tord Romstad
5   Copyright (C) 2015-2017 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad
6
7   Stockfish is free software: you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation, either version 3 of the License, or
10   (at your option) any later version.
11
12   Stockfish is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #include <algorithm>
22 #include <cassert>
23 #include <cstring>   // For std::memset
24 #include <iomanip>
25 #include <sstream>
26
27 #include "bitboard.h"
28 #include "evaluate.h"
29 #include "material.h"
30 #include "pawns.h"
31
32 namespace {
33
34   namespace Trace {
35
36     enum Term { // The first 8 entries are for PieceType
37       MATERIAL = 8, IMBALANCE, MOBILITY, THREAT, PASSED, SPACE, TOTAL, TERM_NB
38     };
39
40     double scores[TERM_NB][COLOR_NB][PHASE_NB];
41
42     double to_cp(Value v) { return double(v) / PawnValueEg; }
43
44     void add(int idx, Color c, Score s) {
45       scores[idx][c][MG] = to_cp(mg_value(s));
46       scores[idx][c][EG] = to_cp(eg_value(s));
47     }
48
49     void add(int idx, Score w, Score b = SCORE_ZERO) {
50       add(idx, WHITE, w); add(idx, BLACK, b);
51     }
52
53     std::ostream& operator<<(std::ostream& os, Term t) {
54
55       if (t == MATERIAL || t == IMBALANCE || t == Term(PAWN) || t == TOTAL)
56           os << "  ---   --- |   ---   --- | ";
57       else
58           os << std::setw(5) << scores[t][WHITE][MG] << " "
59              << std::setw(5) << scores[t][WHITE][EG] << " | "
60              << std::setw(5) << scores[t][BLACK][MG] << " "
61              << std::setw(5) << scores[t][BLACK][EG] << " | ";
62
63       os << std::setw(5) << scores[t][WHITE][MG] - scores[t][BLACK][MG] << " "
64          << std::setw(5) << scores[t][WHITE][EG] - scores[t][BLACK][EG] << " \n";
65
66       return os;
67     }
68   }
69
70   using namespace Trace;
71
72   // Struct EvalInfo contains various information computed and collected
73   // by the evaluation functions.
74   struct EvalInfo {
75
76     Material::Entry* me;
77     Pawns::Entry* pe;
78     Bitboard mobilityArea[COLOR_NB];
79
80     // attackedBy[color][piece type] is a bitboard representing all squares
81     // attacked by a given color and piece type (can be also ALL_PIECES).
82     Bitboard attackedBy[COLOR_NB][PIECE_TYPE_NB];
83
84     // attackedBy2[color] are the squares attacked by 2 pieces of a given color,
85     // possibly via x-ray or by one pawn and one piece. Diagonal x-ray through
86     // pawn or squares attacked by 2 pawns are not explicitly added.
87     Bitboard attackedBy2[COLOR_NB];
88
89     // kingRing[color] is the zone around the king which is considered
90     // by the king safety evaluation. This consists of the squares directly
91     // adjacent to the king, and the three (or two, for a king on an edge file)
92     // squares two ranks in front of the king. For instance, if black's king
93     // is on g8, kingRing[BLACK] is a bitboard containing the squares f8, h8,
94     // f7, g7, h7, f6, g6 and h6.
95     Bitboard kingRing[COLOR_NB];
96
97     // kingAttackersCount[color] is the number of pieces of the given color
98     // which attack a square in the kingRing of the enemy king.
99     int kingAttackersCount[COLOR_NB];
100
101     // kingAttackersWeight[color] is the sum of the "weights" of the pieces of the
102     // given color which attack a square in the kingRing of the enemy king. The
103     // weights of the individual piece types are given by the elements in the
104     // KingAttackWeights array.
105     int kingAttackersWeight[COLOR_NB];
106
107     // kingAdjacentZoneAttacksCount[color] is the number of attacks by the given
108     // color to squares directly adjacent to the enemy king. Pieces which attack
109     // more than one square are counted multiple times. For instance, if there is
110     // a white knight on g5 and black's king is on g8, this white knight adds 2
111     // to kingAdjacentZoneAttacksCount[WHITE].
112     int kingAdjacentZoneAttacksCount[COLOR_NB];
113   };
114
115   #define V(v) Value(v)
116   #define S(mg, eg) make_score(mg, eg)
117
118   // MobilityBonus[PieceType-2][attacked] contains bonuses for middle and end game,
119   // indexed by piece type and number of attacked squares in the mobility area.
120   const Score MobilityBonus[4][32] = {
121     { S(-75,-76), S(-57,-54), S( -9,-28), S( -2,-10), S(  6,  5), S( 14, 12), // Knights
122       S( 22, 26), S( 29, 29), S( 36, 29) },
123     { S(-48,-59), S(-20,-23), S( 16, -3), S( 26, 13), S( 38, 24), S( 51, 42), // Bishops
124       S( 55, 54), S( 63, 57), S( 63, 65), S( 68, 73), S( 81, 78), S( 81, 86),
125       S( 91, 88), S( 98, 97) },
126     { S(-60,-77), S(-26,-20), S(-11, 27), S( -6, 57), S( -3, 69), S( -1, 82), // Rooks
127       S( 10,109), S( 16,121), S( 24,131), S( 25,143), S( 32,155), S( 32,163),
128       S( 43,167), S( 48,171), S( 56,173) },
129     { S(-39,-36), S(-21,-15), S(  3,  8), S(  3, 18), S( 14, 34), S( 22, 54), // Queens
130       S( 28, 61), S( 41, 73), S( 43, 79), S( 48, 92), S( 56, 94), S( 60,104),
131       S( 60,113), S( 66,120), S( 67,123), S( 70,126), S( 71,133), S( 73,136),
132       S( 79,140), S( 88,143), S( 88,148), S( 99,166), S(102,170), S(102,175),
133       S(106,184), S(109,191), S(113,206), S(116,212) }
134   };
135
136   // Outpost[knight/bishop][supported by pawn] contains bonuses for minor
137   // pieces if they can reach an outpost square, bigger if that square is
138   // supported by a pawn. If the minor piece occupies an outpost square
139   // then score is doubled.
140   const Score Outpost[][2] = {
141     { S(22, 6), S(33, 9) }, // Knight
142     { S( 9, 2), S(14, 4) }  // Bishop
143   };
144
145   // RookOnFile[semiopen/open] contains bonuses for each rook when there is no
146   // friendly pawn on the rook file.
147   const Score RookOnFile[2] = { S(20, 7), S(45, 20) };
148
149   // ThreatByMinor/ByRook[attacked PieceType] contains bonuses according to
150   // which piece type attacks which one. Attacks on lesser pieces which are
151   // pawn-defended are not considered.
152   const Score ThreatByMinor[PIECE_TYPE_NB] = {
153     S(0, 0), S(0, 33), S(45, 43), S(46, 47), S(72, 107), S(48, 118)
154   };
155
156   const Score ThreatByRook[PIECE_TYPE_NB] = {
157     S(0, 0), S(0, 25), S(40, 62), S(40, 59), S( 0, 34), S(35, 48)
158   };
159
160   // ThreatByKing[on one/on many] contains bonuses for king attacks on
161   // pawns or pieces which are not pawn-defended.
162   const Score ThreatByKing[2] = { S(3, 62), S(9, 138) };
163
164   // Passed[mg/eg][Rank] contains midgame and endgame bonuses for passed pawns.
165   // We don't use a Score because we process the two components independently.
166   const Value Passed[][RANK_NB] = {
167     { V(5), V( 5), V(31), V(73), V(166), V(252) },
168     { V(7), V(14), V(38), V(73), V(166), V(252) }
169   };
170
171   // PassedFile[File] contains a bonus according to the file of a passed pawn
172   const Score PassedFile[FILE_NB] = {
173     S(  9, 10), S( 2, 10), S( 1, -8), S(-20,-12),
174     S(-20,-12), S( 1, -8), S( 2, 10), S(  9, 10)
175   };
176
177   // Protector[PieceType-2][distance] contains a protecting bonus for our king,
178   // indexed by piece type and distance between the piece and the king.
179   const Score Protector[4][8] = {
180     { S(0, 0), S( 7, 9), S( 7, 1), S( 1, 5), S(-10,-4), S( -1,-4), S( -7,-3), S(-16,-10) }, // Knight
181     { S(0, 0), S(11, 8), S(-7,-1), S(-1,-2), S( -1,-7), S(-11,-3), S( -9,-1), S(-16, -1) }, // Bishop
182     { S(0, 0), S(10, 0), S(-2, 2), S(-5, 4), S( -6, 2), S(-14,-3), S( -2,-9), S(-12, -7) }, // Rook
183     { S(0, 0), S( 3,-5), S( 2,-5), S(-4, 0), S( -9,-6),  S(-4, 7), S(-13,-7), S(-10, -7) }  // Queen
184   };
185
186   // Assorted bonuses and penalties used by evaluation
187   const Score MinorBehindPawn     = S( 16,  0);
188   const Score BishopPawns         = S(  8, 12);
189   const Score RookOnPawn          = S(  8, 24);
190   const Score TrappedRook         = S( 92,  0);
191   const Score WeakQueen           = S( 50, 10);
192   const Score OtherCheck          = S( 10, 10);
193   const Score CloseEnemies        = S(  7,  0);
194   const Score PawnlessFlank       = S( 20, 80);
195   const Score ThreatByHangingPawn = S( 71, 61);
196   const Score ThreatBySafePawn    = S(182,175);
197   const Score ThreatByRank        = S( 16,  3);
198   const Score Hanging             = S( 48, 27);
199   const Score ThreatByPawnPush    = S( 38, 22);
200   const Score HinderPassedPawn    = S(  7,  0);
201
202   // Penalty for a bishop on a1/h1 (a8/h8 for black) which is trapped by
203   // a friendly pawn on b2/g2 (b7/g7 for black). This can obviously only
204   // happen in Chess960 games.
205   const Score TrappedBishopA1H1 = S(50, 50);
206
207   #undef S
208   #undef V
209
210   // KingAttackWeights[PieceType] contains king attack weights by piece type
211   const int KingAttackWeights[PIECE_TYPE_NB] = { 0, 0, 78, 56, 45, 11 };
212
213   // Penalties for enemy's safe checks
214   const int QueenCheck        = 745;
215   const int RookCheck         = 688;
216   const int BishopCheck       = 588;
217   const int KnightCheck       = 924;
218
219   // Threshold for lazy evaluation
220   const Value LazyThreshold = Value(1500);
221
222   // eval_init() initializes king and attack bitboards for a given color
223   // adding pawn attacks. To be done at the beginning of the evaluation.
224
225   template<Color Us>
226   void eval_init(const Position& pos, EvalInfo& ei) {
227
228     const Color  Them = (Us == WHITE ? BLACK : WHITE);
229     const Square Up   = (Us == WHITE ? NORTH : SOUTH);
230     const Square Down = (Us == WHITE ? SOUTH : NORTH);
231     const Bitboard LowRanks = (Us == WHITE ? Rank2BB | Rank3BB: Rank7BB | Rank6BB);
232
233     // Find our pawns on the first two ranks, and those which are blocked
234     Bitboard b = pos.pieces(Us, PAWN) & (shift<Down>(pos.pieces()) | LowRanks);
235
236     // Squares occupied by those pawns, by our king, or controlled by enemy pawns
237     // are excluded from the mobility area.
238     ei.mobilityArea[Us] = ~(b | pos.square<KING>(Us) | ei.pe->pawn_attacks(Them));
239
240     // Initialise the attack bitboards with the king and pawn information
241     b = ei.attackedBy[Us][KING] = pos.attacks_from<KING>(pos.square<KING>(Us));
242     ei.attackedBy[Us][PAWN] = ei.pe->pawn_attacks(Us);
243
244     ei.attackedBy2[Us]            = b & ei.attackedBy[Us][PAWN];
245     ei.attackedBy[Us][ALL_PIECES] = b | ei.attackedBy[Us][PAWN];
246
247     // Init our king safety tables only if we are going to use them
248     if (pos.non_pawn_material(Them) >= QueenValueMg)
249     {
250         ei.kingRing[Us] = b | shift<Up>(b);
251         ei.kingAttackersCount[Them] = popcount(b & ei.pe->pawn_attacks(Them));
252         ei.kingAdjacentZoneAttacksCount[Them] = ei.kingAttackersWeight[Them] = 0;
253     }
254     else
255         ei.kingRing[Us] = ei.kingAttackersCount[Them] = 0;
256   }
257
258
259   // evaluate_pieces() assigns bonuses and penalties to the pieces of a given
260   // color and type.
261
262   template<bool DoTrace, Color Us = WHITE, PieceType Pt = KNIGHT>
263   Score evaluate_pieces(const Position& pos, EvalInfo& ei, Score* mobility) {
264
265     const PieceType NextPt = (Us == WHITE ? Pt : PieceType(Pt + 1));
266     const Color Them = (Us == WHITE ? BLACK : WHITE);
267     const Bitboard OutpostRanks = (Us == WHITE ? Rank4BB | Rank5BB | Rank6BB
268                                                : Rank5BB | Rank4BB | Rank3BB);
269     const Square* pl = pos.squares<Pt>(Us);
270
271     Bitboard b, bb;
272     Square s;
273     Score score = SCORE_ZERO;
274
275     ei.attackedBy[Us][Pt] = 0;
276
277     while ((s = *pl++) != SQ_NONE)
278     {
279         // Find attacked squares, including x-ray attacks for bishops and rooks
280         b = Pt == BISHOP ? attacks_bb<BISHOP>(s, pos.pieces() ^ pos.pieces(Us, QUEEN))
281           : Pt ==   ROOK ? attacks_bb<  ROOK>(s, pos.pieces() ^ pos.pieces(Us, ROOK, QUEEN))
282                          : pos.attacks_from<Pt>(s);
283
284         if (pos.pinned_pieces(Us) & s)
285             b &= LineBB[pos.square<KING>(Us)][s];
286
287         ei.attackedBy2[Us] |= ei.attackedBy[Us][ALL_PIECES] & b;
288         ei.attackedBy[Us][ALL_PIECES] |= ei.attackedBy[Us][Pt] |= b;
289
290         if (b & ei.kingRing[Them])
291         {
292             ei.kingAttackersCount[Us]++;
293             ei.kingAttackersWeight[Us] += KingAttackWeights[Pt];
294             ei.kingAdjacentZoneAttacksCount[Us] += popcount(b & ei.attackedBy[Them][KING]);
295         }
296
297         int mob = popcount(b & ei.mobilityArea[Us]);
298
299         mobility[Us] += MobilityBonus[Pt-2][mob];
300
301         // Bonus for this piece as a king protector
302         score += Protector[Pt-2][distance(s, pos.square<KING>(Us))];
303
304         if (Pt == BISHOP || Pt == KNIGHT)
305         {
306             // Bonus for outpost squares
307             bb = OutpostRanks & ~ei.pe->pawn_attacks_span(Them);
308             if (bb & s)
309                 score += Outpost[Pt == BISHOP][!!(ei.attackedBy[Us][PAWN] & s)] * 2;
310             else
311             {
312                 bb &= b & ~pos.pieces(Us);
313                 if (bb)
314                    score += Outpost[Pt == BISHOP][!!(ei.attackedBy[Us][PAWN] & bb)];
315             }
316
317             // Bonus when behind a pawn
318             if (    relative_rank(Us, s) < RANK_5
319                 && (pos.pieces(PAWN) & (s + pawn_push(Us))))
320                 score += MinorBehindPawn;
321
322             // Penalty for pawns on the same color square as the bishop
323             if (Pt == BISHOP)
324                 score -= BishopPawns * ei.pe->pawns_on_same_color_squares(Us, s);
325
326             // An important Chess960 pattern: A cornered bishop blocked by a friendly
327             // pawn diagonally in front of it is a very serious problem, especially
328             // when that pawn is also blocked.
329             if (   Pt == BISHOP
330                 && pos.is_chess960()
331                 && (s == relative_square(Us, SQ_A1) || s == relative_square(Us, SQ_H1)))
332             {
333                 Square d = pawn_push(Us) + (file_of(s) == FILE_A ? EAST : WEST);
334                 if (pos.piece_on(s + d) == make_piece(Us, PAWN))
335                     score -= !pos.empty(s + d + pawn_push(Us))                ? TrappedBishopA1H1 * 4
336                             : pos.piece_on(s + d + d) == make_piece(Us, PAWN) ? TrappedBishopA1H1 * 2
337                                                                               : TrappedBishopA1H1;
338             }
339         }
340
341         if (Pt == ROOK)
342         {
343             // Bonus for aligning with enemy pawns on the same rank/file
344             if (relative_rank(Us, s) >= RANK_5)
345                 score += RookOnPawn * popcount(pos.pieces(Them, PAWN) & PseudoAttacks[ROOK][s]);
346
347             // Bonus when on an open or semi-open file
348             if (ei.pe->semiopen_file(Us, file_of(s)))
349                 score += RookOnFile[!!ei.pe->semiopen_file(Them, file_of(s))];
350
351             // Penalty when trapped by the king, even more if the king cannot castle
352             else if (mob <= 3)
353             {
354                 Square ksq = pos.square<KING>(Us);
355
356                 if (   ((file_of(ksq) < FILE_E) == (file_of(s) < file_of(ksq)))
357                     && !ei.pe->semiopen_side(Us, file_of(ksq), file_of(s) < file_of(ksq)))
358                     score -= (TrappedRook - make_score(mob * 22, 0)) * (1 + !pos.can_castle(Us));
359             }
360         }
361
362         if (Pt == QUEEN)
363         {
364             // Penalty if any relative pin or discovered attack against the queen
365             Bitboard pinners;
366             if (pos.slider_blockers(pos.pieces(Them, ROOK, BISHOP), s, pinners))
367                 score -= WeakQueen;
368         }
369     }
370
371     if (DoTrace)
372         Trace::add(Pt, Us, score);
373
374     // Recursively call evaluate_pieces() of next piece type until KING is excluded
375     return score - evaluate_pieces<DoTrace, Them, NextPt>(pos, ei, mobility);
376   }
377
378   template<>
379   Score evaluate_pieces<false, WHITE, KING>(const Position&, EvalInfo&, Score*) { return SCORE_ZERO; }
380   template<>
381   Score evaluate_pieces< true, WHITE, KING>(const Position&, EvalInfo&, Score*) { return SCORE_ZERO; }
382
383
384   // evaluate_king() assigns bonuses and penalties to a king of a given color
385
386   const Bitboard QueenSide   = FileABB | FileBBB | FileCBB | FileDBB;
387   const Bitboard CenterFiles = FileCBB | FileDBB | FileEBB | FileFBB;
388   const Bitboard KingSide    = FileEBB | FileFBB | FileGBB | FileHBB;
389
390   const Bitboard KingFlank[FILE_NB] = {
391     QueenSide, QueenSide, QueenSide, CenterFiles, CenterFiles, KingSide, KingSide, KingSide
392   };
393
394   template<Color Us, bool DoTrace>
395   Score evaluate_king(const Position& pos, const EvalInfo& ei) {
396
397     const Color Them    = (Us == WHITE ? BLACK : WHITE);
398     const Square Up     = (Us == WHITE ? NORTH : SOUTH);
399     const Bitboard Camp = (Us == WHITE ? ~Bitboard(0) ^ Rank6BB ^ Rank7BB ^ Rank8BB
400                                        : ~Bitboard(0) ^ Rank1BB ^ Rank2BB ^ Rank3BB);
401
402     const Square ksq = pos.square<KING>(Us);
403     Bitboard undefended, b, b1, b2, safe, other;
404     int kingDanger;
405
406     // King shelter and enemy pawns storm
407     Score score = ei.pe->king_safety<Us>(pos, ksq);
408
409     // Main king safety evaluation
410     if (ei.kingAttackersCount[Them])
411     {
412         // Find the attacked squares which are defended only by our king...
413         undefended =   ei.attackedBy[Them][ALL_PIECES]
414                     &  ei.attackedBy[Us][KING]
415                     & ~ei.attackedBy2[Us];
416
417         // ... and those which are not defended at all in the larger king ring
418         b =  ei.attackedBy[Them][ALL_PIECES] & ~ei.attackedBy[Us][ALL_PIECES]
419            & ei.kingRing[Us] & ~pos.pieces(Them);
420
421         // Initialize the 'kingDanger' variable, which will be transformed
422         // later into a king danger score. The initial value is based on the
423         // number and types of the enemy's attacking pieces, the number of
424         // attacked and undefended squares around our king and the quality of
425         // the pawn shelter (current 'score' value).
426         kingDanger =  std::min(807, ei.kingAttackersCount[Them] * ei.kingAttackersWeight[Them])
427                     + 101 * ei.kingAdjacentZoneAttacksCount[Them]
428                     + 235 * popcount(undefended)
429                     + 134 * (popcount(b) + !!pos.pinned_pieces(Us))
430                     - 717 * !pos.count<QUEEN>(Them)
431                     -   7 * mg_value(score) / 5 - 5;
432
433         // Analyse the safe enemy's checks which are possible on next move
434         safe  = ~pos.pieces(Them);
435         safe &= ~ei.attackedBy[Us][ALL_PIECES] | (undefended & ei.attackedBy2[Them]);
436
437         b1 = pos.attacks_from<ROOK  >(ksq);
438         b2 = pos.attacks_from<BISHOP>(ksq);
439
440         // Enemy queen safe checks
441         if ((b1 | b2) & ei.attackedBy[Them][QUEEN] & safe)
442             kingDanger += QueenCheck;
443
444         // For minors and rooks, also consider the square safe if attacked twice,
445         // and only defended by our queen.
446         safe |=  ei.attackedBy2[Them]
447                & ~(ei.attackedBy2[Us] | pos.pieces(Them))
448                & ei.attackedBy[Us][QUEEN];
449
450         // Some other potential checks are also analysed, even from squares
451         // currently occupied by the opponent own pieces, as long as the square
452         // is not attacked by our pawns, and is not occupied by a blocked pawn.
453         other = ~(   ei.attackedBy[Us][PAWN]
454                   | (pos.pieces(Them, PAWN) & shift<Up>(pos.pieces(PAWN))));
455
456         // Enemy rooks safe and other checks
457         if (b1 & ei.attackedBy[Them][ROOK] & safe)
458             kingDanger += RookCheck;
459
460         else if (b1 & ei.attackedBy[Them][ROOK] & other)
461             score -= OtherCheck;
462
463         // Enemy bishops safe and other checks
464         if (b2 & ei.attackedBy[Them][BISHOP] & safe)
465             kingDanger += BishopCheck;
466
467         else if (b2 & ei.attackedBy[Them][BISHOP] & other)
468             score -= OtherCheck;
469
470         // Enemy knights safe and other checks
471         b = pos.attacks_from<KNIGHT>(ksq) & ei.attackedBy[Them][KNIGHT];
472         if (b & safe)
473             kingDanger += KnightCheck;
474
475         else if (b & other)
476             score -= OtherCheck;
477
478         // Transform the kingDanger units into a Score, and substract it from the evaluation
479         if (kingDanger > 0)
480             score -= make_score(kingDanger * kingDanger / 4096, 0);
481     }
482
483     // King tropism: firstly, find squares that opponent attacks in our king flank
484     File kf = file_of(ksq);
485     b = ei.attackedBy[Them][ALL_PIECES] & KingFlank[kf] & Camp;
486
487     assert(((Us == WHITE ? b << 4 : b >> 4) & b) == 0);
488     assert(popcount(Us == WHITE ? b << 4 : b >> 4) == popcount(b));
489
490     // Secondly, add the squares which are attacked twice in that flank and
491     // which are not defended by our pawns.
492     b =  (Us == WHITE ? b << 4 : b >> 4)
493        | (b & ei.attackedBy2[Them] & ~ei.attackedBy[Us][PAWN]);
494
495     score -= CloseEnemies * popcount(b);
496
497     // Penalty when our king is on a pawnless flank
498     if (!(pos.pieces(PAWN) & KingFlank[kf]))
499         score -= PawnlessFlank;
500
501     if (DoTrace)
502         Trace::add(KING, Us, score);
503
504     return score;
505   }
506
507
508   // evaluate_threats() assigns bonuses according to the types of the attacking
509   // and the attacked pieces.
510
511   template<Color Us, bool DoTrace>
512   Score evaluate_threats(const Position& pos, const EvalInfo& ei) {
513
514     const Color Them        = (Us == WHITE ? BLACK      : WHITE);
515     const Square Up         = (Us == WHITE ? NORTH      : SOUTH);
516     const Square Left       = (Us == WHITE ? NORTH_WEST : SOUTH_EAST);
517     const Square Right      = (Us == WHITE ? NORTH_EAST : SOUTH_WEST);
518     const Bitboard TRank2BB = (Us == WHITE ? Rank2BB    : Rank7BB);
519     const Bitboard TRank7BB = (Us == WHITE ? Rank7BB    : Rank2BB);
520
521     Bitboard b, weak, defended, stronglyProtected, safeThreats;
522     Score score = SCORE_ZERO;
523
524     // Non-pawn enemies attacked by a pawn
525     weak = (pos.pieces(Them) ^ pos.pieces(Them, PAWN)) & ei.attackedBy[Us][PAWN];
526
527     if (weak)
528     {
529         b = pos.pieces(Us, PAWN) & ( ~ei.attackedBy[Them][ALL_PIECES]
530                                     | ei.attackedBy[Us][ALL_PIECES]);
531
532         safeThreats = (shift<Right>(b) | shift<Left>(b)) & weak;
533
534         if (weak ^ safeThreats)
535             score += ThreatByHangingPawn;
536
537         score += ThreatBySafePawn * popcount(safeThreats);
538     }
539
540     // Squares strongly protected by the opponent, either because they attack the
541     // square with a pawn, or because they attack the square twice and we don't.
542     stronglyProtected =  ei.attackedBy[Them][PAWN]
543                        | (ei.attackedBy2[Them] & ~ei.attackedBy2[Us]);
544
545     // Non-pawn enemies, strongly protected
546     defended =  (pos.pieces(Them) ^ pos.pieces(Them, PAWN))
547               & stronglyProtected;
548
549     // Enemies not strongly protected and under our attack
550     weak =   pos.pieces(Them)
551           & ~stronglyProtected
552           &  ei.attackedBy[Us][ALL_PIECES];
553
554     // Add a bonus according to the kind of attacking pieces
555     if (defended | weak)
556     {
557         b = (defended | weak) & (ei.attackedBy[Us][KNIGHT] | ei.attackedBy[Us][BISHOP]);
558         while (b)
559         {
560             Square s = pop_lsb(&b);
561             score += ThreatByMinor[type_of(pos.piece_on(s))];
562             if (type_of(pos.piece_on(s)) != PAWN)
563                 score += ThreatByRank * (int)relative_rank(Them, s);
564         }
565
566         b = (pos.pieces(Them, QUEEN) | weak) & ei.attackedBy[Us][ROOK];
567         while (b)
568         {
569             Square s = pop_lsb(&b);
570             score += ThreatByRook[type_of(pos.piece_on(s))];
571             if (type_of(pos.piece_on(s)) != PAWN)
572                 score += ThreatByRank * (int)relative_rank(Them, s);
573         }
574
575         score += Hanging * popcount(weak & ~ei.attackedBy[Them][ALL_PIECES]);
576
577         b = weak & ei.attackedBy[Us][KING];
578         if (b)
579             score += ThreatByKing[more_than_one(b)];
580     }
581
582     // Bonus if some pawns can safely push and attack an enemy piece
583     b = pos.pieces(Us, PAWN) & ~TRank7BB;
584     b = shift<Up>(b | (shift<Up>(b & TRank2BB) & ~pos.pieces()));
585
586     b &=  ~pos.pieces()
587         & ~ei.attackedBy[Them][PAWN]
588         & (ei.attackedBy[Us][ALL_PIECES] | ~ei.attackedBy[Them][ALL_PIECES]);
589
590     b =  (shift<Left>(b) | shift<Right>(b))
591        &  pos.pieces(Them)
592        & ~ei.attackedBy[Us][PAWN];
593
594     score += ThreatByPawnPush * popcount(b);
595
596     if (DoTrace)
597         Trace::add(THREAT, Us, score);
598
599     return score;
600   }
601
602
603   // evaluate_passer_pawns() evaluates the passed pawns and candidate passed
604   // pawns of the given color.
605
606   template<Color Us, bool DoTrace>
607   Score evaluate_passer_pawns(const Position& pos, const EvalInfo& ei) {
608
609     const Color Them = (Us == WHITE ? BLACK : WHITE);
610
611     Bitboard b, bb, squaresToQueen, defendedSquares, unsafeSquares;
612     Score score = SCORE_ZERO;
613
614     b = ei.pe->passed_pawns(Us);
615
616     while (b)
617     {
618         Square s = pop_lsb(&b);
619
620         assert(!(pos.pieces(PAWN) & forward_bb(Us, s)));
621
622         bb = forward_bb(Us, s) & (ei.attackedBy[Them][ALL_PIECES] | pos.pieces(Them));
623         score -= HinderPassedPawn * popcount(bb);
624
625         int r = relative_rank(Us, s) - RANK_2;
626         int rr = r * (r - 1);
627
628         Value mbonus = Passed[MG][r], ebonus = Passed[EG][r];
629
630         if (rr)
631         {
632             Square blockSq = s + pawn_push(Us);
633
634             // Adjust bonus based on the king's proximity
635             ebonus +=  distance(pos.square<KING>(Them), blockSq) * 5 * rr
636                      - distance(pos.square<KING>(Us  ), blockSq) * 2 * rr;
637
638             // If blockSq is not the queening square then consider also a second push
639             if (relative_rank(Us, blockSq) != RANK_8)
640                 ebonus -= distance(pos.square<KING>(Us), blockSq + pawn_push(Us)) * rr;
641
642             // If the pawn is free to advance, then increase the bonus
643             if (pos.empty(blockSq))
644             {
645                 // If there is a rook or queen attacking/defending the pawn from behind,
646                 // consider all the squaresToQueen. Otherwise consider only the squares
647                 // in the pawn's path attacked or occupied by the enemy.
648                 defendedSquares = unsafeSquares = squaresToQueen = forward_bb(Us, s);
649
650                 bb = forward_bb(Them, s) & pos.pieces(ROOK, QUEEN) & pos.attacks_from<ROOK>(s);
651
652                 if (!(pos.pieces(Us) & bb))
653                     defendedSquares &= ei.attackedBy[Us][ALL_PIECES];
654
655                 if (!(pos.pieces(Them) & bb))
656                     unsafeSquares &= ei.attackedBy[Them][ALL_PIECES] | pos.pieces(Them);
657
658                 // If there aren't any enemy attacks, assign a big bonus. Otherwise
659                 // assign a smaller bonus if the block square isn't attacked.
660                 int k = !unsafeSquares ? 18 : !(unsafeSquares & blockSq) ? 8 : 0;
661
662                 // If the path to the queen is fully defended, assign a big bonus.
663                 // Otherwise assign a smaller bonus if the block square is defended.
664                 if (defendedSquares == squaresToQueen)
665                     k += 6;
666
667                 else if (defendedSquares & blockSq)
668                     k += 4;
669
670                 mbonus += k * rr, ebonus += k * rr;
671             }
672             else if (pos.pieces(Us) & blockSq)
673                 mbonus += rr + r * 2, ebonus += rr + r * 2;
674         } // rr != 0
675
676         // Scale down bonus for candidate passers which need more than one
677         // pawn push to become passed.
678         if (!pos.pawn_passed(Us, s + pawn_push(Us)))
679             mbonus /= 2, ebonus /= 2;
680
681         score += make_score(mbonus, ebonus) + PassedFile[file_of(s)];
682     }
683
684     if (DoTrace)
685         Trace::add(PASSED, Us, score);
686
687     return score;
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 multiplied by a weight. The aim is to
696   // improve play on game opening.
697   template<Color Us>
698   Score evaluate_space(const Position& pos, const EvalInfo& ei) {
699
700     const Color Them = (Us == WHITE ? BLACK : WHITE);
701     const Bitboard SpaceMask =
702       Us == WHITE ? CenterFiles & (Rank2BB | Rank3BB | Rank4BB)
703                   : CenterFiles & (Rank7BB | Rank6BB | Rank5BB);
704
705     // Find the safe squares for our pieces inside the area defined by
706     // SpaceMask. A square is unsafe if it is attacked by an enemy
707     // pawn, or if it is undefended and attacked by an enemy piece.
708     Bitboard safe =   SpaceMask
709                    & ~pos.pieces(Us, PAWN)
710                    & ~ei.attackedBy[Them][PAWN]
711                    & (ei.attackedBy[Us][ALL_PIECES] | ~ei.attackedBy[Them][ALL_PIECES]);
712
713     // Find all squares which are at most three squares behind some friendly pawn
714     Bitboard behind = pos.pieces(Us, PAWN);
715     behind |= (Us == WHITE ? behind >>  8 : behind <<  8);
716     behind |= (Us == WHITE ? behind >> 16 : behind << 16);
717
718     // Since SpaceMask[Us] is fully on our half of the board...
719     assert(unsigned(safe >> (Us == WHITE ? 32 : 0)) == 0);
720
721     // ...count safe + (behind & safe) with a single popcount.
722     int bonus = popcount((Us == WHITE ? safe << 32 : safe >> 32) | (behind & safe));
723     int weight = pos.count<ALL_PIECES>(Us) - 2 * ei.pe->open_files();
724
725     return make_score(bonus * weight * weight / 16, 0);
726   }
727
728
729   // evaluate_initiative() computes the initiative correction value for the
730   // position, i.e., second order bonus/malus based on the known attacking/defending
731   // status of the players.
732   Score evaluate_initiative(const Position& pos, int asymmetry, Value eg) {
733
734     int kingDistance =  distance<File>(pos.square<KING>(WHITE), pos.square<KING>(BLACK))
735                       - distance<Rank>(pos.square<KING>(WHITE), pos.square<KING>(BLACK));
736     bool bothFlanks = (pos.pieces(PAWN) & QueenSide) && (pos.pieces(PAWN) & KingSide);
737
738     // Compute the initiative bonus for the attacking side
739     int initiative = 8 * (asymmetry + kingDistance - 17) + 12 * pos.count<PAWN>() + 16 * bothFlanks;
740
741     // Now apply the bonus: note that we find the attacking side by extracting
742     // the sign of the endgame value, and that we carefully cap the bonus so
743     // that the endgame score will never change sign after the bonus.
744     int value = ((eg > 0) - (eg < 0)) * std::max(initiative, -abs(eg));
745
746     return make_score(0, value);
747   }
748
749
750   // evaluate_scale_factor() computes the scale factor for the winning side
751   ScaleFactor evaluate_scale_factor(const Position& pos, const EvalInfo& ei, Value eg) {
752
753     Color strongSide = eg > VALUE_DRAW ? WHITE : BLACK;
754     ScaleFactor sf = ei.me->scale_factor(pos, strongSide);
755
756     // If we don't already have an unusual scale factor, check for certain
757     // types of endgames, and use a lower scale for those.
758     if (sf == SCALE_FACTOR_NORMAL || sf == SCALE_FACTOR_ONEPAWN)
759     {
760         if (pos.opposite_bishops())
761         {
762             // Endgame with opposite-colored bishops and no other pieces (ignoring pawns)
763             // is almost a draw, in case of KBP vs KB, it is even more a draw.
764             if (   pos.non_pawn_material(WHITE) == BishopValueMg
765                 && pos.non_pawn_material(BLACK) == BishopValueMg)
766                 return more_than_one(pos.pieces(PAWN)) ? ScaleFactor(31) : ScaleFactor(9);
767
768             // Endgame with opposite-colored bishops, but also other pieces. Still
769             // a bit drawish, but not as drawish as with only the two bishops.
770             return ScaleFactor(46);
771         }
772         // Endings where weaker side can place his king in front of the opponent's
773         // pawns are drawish.
774         else if (    abs(eg) <= BishopValueEg
775                  &&  pos.count<PAWN>(strongSide) <= 2
776                  && !pos.pawn_passed(~strongSide, pos.square<KING>(~strongSide)))
777             return ScaleFactor(37 + 7 * pos.count<PAWN>(strongSide));
778     }
779
780     return sf;
781   }
782
783 } // namespace
784
785
786 /// evaluate() is the main evaluation function. It returns a static evaluation
787 /// of the position from the point of view of the side to move.
788
789 template<bool DoTrace>
790 Value Eval::evaluate(const Position& pos) {
791
792   assert(!pos.checkers());
793
794   Score mobility[COLOR_NB] = { SCORE_ZERO, SCORE_ZERO };
795   Value v;
796   EvalInfo ei;
797
798   // Probe the material hash table
799   ei.me = Material::probe(pos);
800
801   // If we have a specialized evaluation function for the current material
802   // configuration, call it and return.
803   if (ei.me->specialized_eval_exists())
804       return ei.me->evaluate(pos);
805
806   // Initialize score by reading the incrementally updated scores included in
807   // the position object (material + piece square tables) and the material
808   // imbalance. Score is computed internally from the white point of view.
809   Score score = pos.psq_score() + ei.me->imbalance();
810
811   // Probe the pawn hash table
812   ei.pe = Pawns::probe(pos);
813   score += ei.pe->pawns_score();
814
815   // Early exit if score is high
816   v = (mg_value(score) + eg_value(score)) / 2;
817   if (abs(v) > LazyThreshold)
818      return pos.side_to_move() == WHITE ? v : -v;
819
820   // Initialize attack and king safety bitboards
821   eval_init<WHITE>(pos, ei);
822   eval_init<BLACK>(pos, ei);
823
824   // Evaluate all pieces but king and pawns
825   score += evaluate_pieces<DoTrace>(pos, ei, mobility);
826   score += mobility[WHITE] - mobility[BLACK];
827
828   // Evaluate kings after all other pieces because we need full attack
829   // information when computing the king safety evaluation.
830   score +=  evaluate_king<WHITE, DoTrace>(pos, ei)
831           - evaluate_king<BLACK, DoTrace>(pos, ei);
832
833   // Evaluate tactical threats, we need full attack information including king
834   score +=  evaluate_threats<WHITE, DoTrace>(pos, ei)
835           - evaluate_threats<BLACK, DoTrace>(pos, ei);
836
837   // Evaluate passed pawns, we need full attack information including king
838   score +=  evaluate_passer_pawns<WHITE, DoTrace>(pos, ei)
839           - evaluate_passer_pawns<BLACK, DoTrace>(pos, ei);
840
841   // Evaluate space for both sides, only during opening
842   if (pos.non_pawn_material() >= 12222)
843       score +=  evaluate_space<WHITE>(pos, ei)
844               - evaluate_space<BLACK>(pos, ei);
845
846   // Evaluate position potential for the winning side
847   score += evaluate_initiative(pos, ei.pe->pawn_asymmetry(), eg_value(score));
848
849   // Evaluate scale factor for the winning side
850   ScaleFactor sf = evaluate_scale_factor(pos, ei, eg_value(score));
851
852   // Interpolate between a middlegame and a (scaled by 'sf') endgame score
853   v =  mg_value(score) * int(ei.me->game_phase())
854      + eg_value(score) * int(PHASE_MIDGAME - ei.me->game_phase()) * sf / SCALE_FACTOR_NORMAL;
855
856   v /= int(PHASE_MIDGAME);
857
858   // In case of tracing add all remaining individual evaluation terms
859   if (DoTrace)
860   {
861       Trace::add(MATERIAL, pos.psq_score());
862       Trace::add(IMBALANCE, ei.me->imbalance());
863       Trace::add(PAWN, ei.pe->pawns_score());
864       Trace::add(MOBILITY, mobility[WHITE], mobility[BLACK]);
865       if (pos.non_pawn_material() >= 12222)
866           Trace::add(SPACE, evaluate_space<WHITE>(pos, ei)
867                           , evaluate_space<BLACK>(pos, ei));
868       Trace::add(TOTAL, score);
869   }
870
871   return (pos.side_to_move() == WHITE ? v : -v) + Eval::Tempo; // Side to move point of view
872 }
873
874 // Explicit template instantiations
875 template Value Eval::evaluate<true >(const Position&);
876 template Value Eval::evaluate<false>(const Position&);
877
878
879 /// trace() is like evaluate(), but instead of returning a value, it returns
880 /// a string (suitable for outputting to stdout) that contains the detailed
881 /// descriptions and values of each evaluation term. Useful for debugging.
882
883 std::string Eval::trace(const Position& pos) {
884
885   std::memset(scores, 0, sizeof(scores));
886
887   Value v = evaluate<true>(pos);
888   v = pos.side_to_move() == WHITE ? v : -v; // White's point of view
889
890   std::stringstream ss;
891   ss << std::showpoint << std::noshowpos << std::fixed << std::setprecision(2)
892      << "      Eval term |    White    |    Black    |    Total    \n"
893      << "                |   MG    EG  |   MG    EG  |   MG    EG  \n"
894      << "----------------+-------------+-------------+-------------\n"
895      << "       Material | " << Term(MATERIAL)
896      << "      Imbalance | " << Term(IMBALANCE)
897      << "          Pawns | " << Term(PAWN)
898      << "        Knights | " << Term(KNIGHT)
899      << "         Bishop | " << Term(BISHOP)
900      << "          Rooks | " << Term(ROOK)
901      << "         Queens | " << Term(QUEEN)
902      << "       Mobility | " << Term(MOBILITY)
903      << "    King safety | " << Term(KING)
904      << "        Threats | " << Term(THREAT)
905      << "   Passed pawns | " << Term(PASSED)
906      << "          Space | " << Term(SPACE)
907      << "----------------+-------------+-------------+-------------\n"
908      << "          Total | " << Term(TOTAL);
909
910   ss << "\nTotal Evaluation: " << to_cp(v) << " (white side)\n";
911
912   return ss.str();
913 }