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