]> git.sesse.net Git - stockfish/blob - src/evaluate.cpp
372313b778e688a7333f5fc6815c85c5ff44e8dc
[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<HasPopCnt>(ei.attackedBy[WHITE][PAWN] & ei.attackedBy[BLACK][KING])/2;
355   ei.kingAttackersCount[BLACK] = count_1s_max_15<HasPopCnt>(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(b) == int(uint8_t(count_1s(b))));
498       BitCount8Bit[b] = (uint8_t)count_1s(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(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(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(b2);
817
818           // Rook checks
819           b2 = b & ei.attacked_by(them, ROOK);
820           if (b2)
821               attackUnits += RookCheckBonus * count_1s_max_15(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(b2);
831
832           // Bishop checks
833           b2 = b & ei.attacked_by(them, BISHOP);
834           if (b2)
835               attackUnits += BishopCheckBonus * count_1s_max_15(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(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(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                     // Squares attacked or occupied by enemy pieces
937                     b3 |= (b2 & pos.pieces_of_color(them));
938
939                     // There are no enemy pawns in the pawn's path
940                     assert((b2 & pos.pieces_of_color_and_type(them, PAWN)) == EmptyBoardBB);
941
942                     // Are any of the squares in the pawn's path attacked or occupied by the enemy?
943                     if (b3 == EmptyBoardBB)
944                         // No enemy attacks or pieces, huge bonus!
945                         ebonus += Value(tr * (b2 == b4 ? 17 : 15));
946                     else
947                         // OK, there are enemy attacks or pieces (but not pawns). Are those
948                         // squares which are attacked by the enemy also attacked by us?
949                         // If yes, big bonus (but smaller than when there are no enemy attacks),
950                         // if no, somewhat smaller bonus.
951                         ebonus += Value(tr * ((b3 & b4) == b3 ? 13 : 8));
952
953                     // At last, add a small bonus when there are no *friendly* pieces
954                     // in the pawn's path.
955                     if ((b2 & pos.pieces_of_color(us)) == EmptyBoardBB)
956                         ebonus += Value(tr);
957                 }
958             }
959
960             // If the pawn is supported by a friendly pawn, increase bonus
961             b2 = pos.pawns(us) & neighboring_files_bb(s);
962             if (b2 & rank_bb(s))
963                 ebonus += Value(r * 20);
964             else if (pos.pawn_attacks(them, s) & b2)
965                 ebonus += Value(r * 12);
966
967             // If the other side has only a king, check whether the pawn is
968             // unstoppable
969             if (pos.non_pawn_material(them) == Value(0))
970             {
971                 Square qsq;
972                 int d;
973
974                 qsq = relative_square(us, make_square(square_file(s), RANK_8));
975                 d =  square_distance(s, qsq)
976                    - square_distance(theirKingSq, qsq)
977                    + (us != pos.side_to_move());
978
979                 if (d < 0)
980                 {
981                     int mtg = RANK_8 - relative_rank(us, s);
982                     int blockerCount = count_1s_max_15(squares_in_front_of(us,s) & pos.occupied_squares());
983                     mtg += blockerCount;
984                     d += blockerCount;
985                     if (d < 0)
986                     {
987                         hasUnstoppable[us] = true;
988                         movesToGo[us] = Min(movesToGo[us], mtg);
989                     }
990                 }
991             }
992             // Rook pawns are a special case:  They are sometimes worse, and
993             // sometimes better than other passed pawns. It is difficult to find
994             // good rules for determining whether they are good or bad. For now,
995             // we try the following: Increase the value for rook pawns if the
996             // other side has no pieces apart from a knight, and decrease the
997             // value if the other side has a rook or queen.
998             if (square_file(s) == FILE_A || square_file(s) == FILE_H)
999             {
1000                 if(   pos.non_pawn_material(them) <= KnightValueMidgame
1001                    && pos.piece_count(them, KNIGHT) <= 1)
1002                     ebonus += ebonus / 4;
1003                 else if(pos.rooks_and_queens(them))
1004                     ebonus -= ebonus / 4;
1005             }
1006
1007             // Add the scores for this pawn to the middle game and endgame eval.
1008             ei.mgValue += apply_weight(Sign[us] * mbonus, WeightPassedPawnsMidgame);
1009             ei.egValue += apply_weight(Sign[us] * ebonus, WeightPassedPawnsEndgame);
1010         }
1011     }
1012
1013     // Does either side have an unstoppable passed pawn?
1014     if (hasUnstoppable[WHITE] && !hasUnstoppable[BLACK])
1015        ei.egValue += UnstoppablePawnValue - Value(0x40 * movesToGo[WHITE]);
1016     else if (hasUnstoppable[BLACK] && !hasUnstoppable[WHITE])
1017        ei.egValue -= UnstoppablePawnValue - Value(0x40 * movesToGo[BLACK]);
1018     else if (hasUnstoppable[BLACK] && hasUnstoppable[WHITE])
1019     {
1020         // Both sides have unstoppable pawns! Try to find out who queens
1021         // first. We begin by transforming 'movesToGo' to the number of
1022         // plies until the pawn queens for both sides.
1023         movesToGo[WHITE] *= 2;
1024         movesToGo[BLACK] *= 2;
1025         movesToGo[pos.side_to_move()]--;
1026
1027         // If one side queens at least three plies before the other, that
1028         // side wins.
1029         if (movesToGo[WHITE] <= movesToGo[BLACK] - 3)
1030             ei.egValue += UnstoppablePawnValue - Value(0x40 * (movesToGo[WHITE]/2));
1031         else if(movesToGo[BLACK] <= movesToGo[WHITE] - 3)
1032             ei.egValue -= UnstoppablePawnValue - Value(0x40 * (movesToGo[BLACK]/2));
1033
1034         // We could also add some rules about the situation when one side
1035         // queens exactly one ply before the other: Does the first queen
1036         // check the opponent's king, or attack the opponent's queening square?
1037         // This is slightly tricky to get right, because it is possible that
1038         // the opponent's king has moved somewhere before the first pawn queens.
1039     }
1040   }
1041
1042
1043   // evaluate_trapped_bishop_a7h7() determines whether a bishop on a7/h7
1044   // (a2/h2 for black) is trapped by enemy pawns, and assigns a penalty
1045   // if it is.
1046
1047   void evaluate_trapped_bishop_a7h7(const Position &pos, Square s, Color us,
1048                                     EvalInfo &ei) {
1049     assert(square_is_ok(s));
1050     assert(pos.piece_on(s) == piece_of_color_and_type(us, BISHOP));
1051
1052     Square b6 = relative_square(us, (square_file(s) == FILE_A) ? SQ_B6 : SQ_G6);
1053     Square b8 = relative_square(us, (square_file(s) == FILE_A) ? SQ_B8 : SQ_G8);
1054
1055     if (   pos.piece_on(b6) == piece_of_color_and_type(opposite_color(us), PAWN)
1056         && pos.see(s, b6) < 0
1057         && pos.see(s, b8) < 0)
1058     {
1059         ei.mgValue -= Sign[us] * TrappedBishopA7H7Penalty;
1060         ei.egValue -= Sign[us] * TrappedBishopA7H7Penalty;
1061     }
1062   }
1063
1064
1065   // evaluate_trapped_bishop_a1h1() determines whether a bishop on a1/h1
1066   // (a8/h8 for black) is trapped by a friendly pawn on b2/g2 (b7/g7 for
1067   // black), and assigns a penalty if it is.  This pattern can obviously
1068   // only occur in Chess960 games.
1069
1070   void evaluate_trapped_bishop_a1h1(const Position &pos, Square s, Color us,
1071                                     EvalInfo &ei) {
1072     Piece pawn = piece_of_color_and_type(us, PAWN);
1073     Square b2, b3, c3;
1074
1075     assert(Chess960);
1076     assert(square_is_ok(s));
1077     assert(pos.piece_on(s) == piece_of_color_and_type(us, BISHOP));
1078
1079     if (square_file(s) == FILE_A)
1080     {
1081         b2 = relative_square(us, SQ_B2);
1082         b3 = relative_square(us, SQ_B3);
1083         c3 = relative_square(us, SQ_C3);
1084     }
1085     else
1086     {
1087         b2 = relative_square(us, SQ_G2);
1088         b3 = relative_square(us, SQ_G3);
1089         c3 = relative_square(us, SQ_F3);
1090     }
1091
1092     if (pos.piece_on(b2) == pawn)
1093     {
1094         Value penalty;
1095
1096         if (!pos.square_is_empty(b3))
1097             penalty = 2*TrappedBishopA1H1Penalty;
1098         else if (pos.piece_on(c3) == pawn)
1099             penalty = TrappedBishopA1H1Penalty;
1100         else
1101             penalty = TrappedBishopA1H1Penalty / 2;
1102
1103         ei.mgValue -= Sign[us] * penalty;
1104         ei.egValue -= Sign[us] * penalty;
1105     }
1106   }
1107
1108
1109   // evaluate_space() computes the space evaluation for a given side. The
1110   // space evaluation is a simple bonus based on the number of safe squares
1111   // available for minor pieces on the central four files on ranks 2--4. Safe
1112   // squares one, two or three squares behind a friendly pawn are counted
1113   // twice. Finally, the space bonus is scaled by a weight taken from the
1114   // material hash table.
1115
1116   void evaluate_space(const Position &pos, Color us, EvalInfo &ei) {
1117
1118     Color them = opposite_color(us);
1119
1120     // Find the safe squares for our pieces inside the area defined by
1121     // SpaceMask[us]. A square is unsafe it is attacked by an enemy
1122     // pawn, or if it is undefended and attacked by an enemy piece.
1123
1124     Bitboard safeSquares =   SpaceMask[us]
1125                           & ~pos.pawns(us)
1126                           & ~ei.attacked_by(them, PAWN)
1127                           & ~(~ei.attacked_by(us) & ei.attacked_by(them));
1128
1129     // Find all squares which are at most three squares behind some friendly
1130     // pawn.
1131     Bitboard behindFriendlyPawns = pos.pawns(us);
1132     if (us == WHITE)
1133     {
1134         behindFriendlyPawns |= (behindFriendlyPawns >> 8);
1135         behindFriendlyPawns |= (behindFriendlyPawns >> 16);
1136     }
1137     else
1138     {
1139         behindFriendlyPawns |= (behindFriendlyPawns << 8);
1140         behindFriendlyPawns |= (behindFriendlyPawns << 16);
1141     }
1142
1143     int space =  count_1s_max_15(safeSquares)
1144                + count_1s_max_15(behindFriendlyPawns & safeSquares);
1145
1146     ei.mgValue += Sign[us] * apply_weight(Value(space * ei.mi->space_weight()), WeightSpace);
1147   }
1148
1149
1150   // apply_weight() applies an evaluation weight to a value
1151
1152   inline Value apply_weight(Value v, int w) {
1153     return (v*w) / 0x100;
1154   }
1155
1156
1157   // scale_by_game_phase() interpolates between a middle game and an endgame
1158   // score, based on game phase.  It also scales the return value by a
1159   // ScaleFactor array.
1160
1161   Value scale_by_game_phase(Value mv, Value ev, Phase ph, const ScaleFactor sf[]) {
1162
1163     assert(mv > -VALUE_INFINITE && mv < VALUE_INFINITE);
1164     assert(ev > -VALUE_INFINITE && ev < VALUE_INFINITE);
1165     assert(ph >= PHASE_ENDGAME && ph <= PHASE_MIDGAME);
1166
1167     ev = apply_scale_factor(ev, sf[(ev > Value(0) ? WHITE : BLACK)]);
1168
1169     Value result = Value(int((mv * ph + ev * (128 - ph)) / 128));
1170     return Value(int(result) & ~(GrainSize - 1));
1171   }
1172
1173
1174   // compute_weight() computes the value of an evaluation weight, by combining
1175   // an UCI-configurable weight with an internal weight.
1176
1177   int compute_weight(int uciWeight, int internalWeight) {
1178
1179     uciWeight = (uciWeight * 0x100) / 100;
1180     return (uciWeight * internalWeight) / 0x100;
1181   }
1182
1183
1184   // helper used in read_weights()
1185   int weight_option(const std::string& opt, int weight) {
1186
1187     return compute_weight(get_option_value_int(opt), weight);
1188   }
1189
1190
1191   // init_safety() initizes the king safety evaluation, based on UCI
1192   // parameters.  It is called from read_weights().
1193
1194   void init_safety() {
1195
1196     QueenContactCheckBonus = get_option_value_int("Queen Contact Check Bonus");
1197     QueenCheckBonus        = get_option_value_int("Queen Check Bonus");
1198     RookCheckBonus         = get_option_value_int("Rook Check Bonus");
1199     BishopCheckBonus       = get_option_value_int("Bishop Check Bonus");
1200     KnightCheckBonus       = get_option_value_int("Knight Check Bonus");
1201     DiscoveredCheckBonus   = get_option_value_int("Discovered Check Bonus");
1202     MateThreatBonus        = get_option_value_int("Mate Threat Bonus");
1203
1204     int maxSlope = get_option_value_int("King Safety Max Slope");
1205     int peak     = get_option_value_int("King Safety Max Value") * 256 / 100;
1206     double a     = get_option_value_int("King Safety Coefficient") / 100.0;
1207     double b     = get_option_value_int("King Safety X Intercept");
1208     bool quad    = (get_option_value_string("King Safety Curve") == "Quadratic");
1209     bool linear  = (get_option_value_string("King Safety Curve") == "Linear");
1210
1211     for (int i = 0; i < 100; i++)
1212     {
1213         if (i < b)
1214             SafetyTable[i] = Value(0);
1215         else if(quad)
1216             SafetyTable[i] = Value((int)(a * (i - b) * (i - b)));
1217         else if(linear)
1218             SafetyTable[i] = Value((int)(100 * a * (i - b)));
1219     }
1220
1221     for (int i = 0; i < 100; i++)
1222     {
1223         if (SafetyTable[i+1] - SafetyTable[i] > maxSlope)
1224             for (int j = i + 1; j < 100; j++)
1225                 SafetyTable[j] = SafetyTable[j-1] + Value(maxSlope);
1226
1227         if (SafetyTable[i]  > Value(peak))
1228             SafetyTable[i] = Value(peak);
1229     }
1230   }
1231 }