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