]> git.sesse.net Git - stockfish/blob - src/evaluate.cpp
Give credit to Joona for optimized parameters
[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 (modified by Joona Kiiski)
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 (modified by Joona Kiiski)
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<bool HasPopCnt>
278   void evaluate_king(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_king<HasPopCnt>(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_mobility() computes mobility and attacks for every piece
542
543   template<PieceType Piece, bool HasPopCnt>
544   int evaluate_mobility(const Position& p, const Bitboard& b, Color us, Color them, EvalInfo& ei) {
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
550     // Update attack info
551     ei.attackedBy[us][Piece] |= b;
552
553     // King attacks
554     if (b & ei.kingZone[us])
555     {
556         ei.kingAttackersCount[us]++;
557         ei.kingAttackersWeight[us] += AttackWeight[Piece];
558         Bitboard bb = (b & ei.attackedBy[them][KING]);
559         if (bb)
560             ei.kingAdjacentZoneAttacksCount[us] += count_1s_max_15<HasPopCnt>(bb);
561     }
562
563     // Remove squares protected by enemy pawns
564     Bitboard bb = (b & ~ei.attackedBy[them][PAWN]);
565
566     // Mobility
567     int mob = (Piece != QUEEN ? count_1s_max_15<HasPopCnt>(bb & ~p.pieces_of_color(us))
568                               : count_1s<HasPopCnt>(bb & ~p.pieces_of_color(us)));
569
570     ei.mgMobility += Sign[us] * MgBonus[Piece][mob];
571     ei.egMobility += Sign[us] * EgBonus[Piece][mob];
572     return mob;
573   }
574
575
576   // evaluate_outposts() evaluates bishop and knight outposts squares
577
578   template<PieceType Piece>
579   void evaluate_outposts(const Position& p, Color us, Color them, EvalInfo& ei, Square s) {
580
581     // Initial bonus based on square
582     Value bonus = (Piece == BISHOP ? BishopOutpostBonus[relative_square(us, s)]
583                                    : KnightOutpostBonus[relative_square(us, s)]);
584
585     // Increase bonus if supported by pawn, especially if the opponent has
586     // no minor piece which can exchange the outpost piece
587     if (bonus && (p.pawn_attacks(them, s) & p.pawns(us)))
588     {
589         if (    p.knights(them) == EmptyBoardBB
590             && (SquaresByColorBB[square_color(s)] & p.bishops(them)) == EmptyBoardBB)
591             bonus += bonus + bonus / 2;
592         else
593             bonus += bonus / 2;
594     }
595     ei.mgValue += Sign[us] * bonus;
596     ei.egValue += Sign[us] * bonus;
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     int mob;
609     File f;
610     Color them = opposite_color(us);
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         else
623             assert(false);
624
625         // Attacks and mobility
626         mob = evaluate_mobility<Piece, HasPopCnt>(pos, b, us, them, ei);
627
628         // Bishop and knight outposts squares
629         if ((Piece == BISHOP || Piece == KNIGHT) && pos.square_is_weak(s, them))
630             evaluate_outposts<Piece>(pos, us, them, ei, s);
631
632         // Special patterns: trapped bishops on a7/h7/a2/h2
633         // and trapped bishops on a1/h1/a8/h8 in Chess960.
634         if (Piece == BISHOP)
635         {
636             if (bit_is_set(MaskA7H7[us], s))
637                 evaluate_trapped_bishop_a7h7(pos, s, us, ei);
638
639             if (Chess960 && bit_is_set(MaskA1H1[us], s))
640                 evaluate_trapped_bishop_a1h1(pos, s, us, ei);
641         }
642
643         if (Piece == ROOK || Piece == QUEEN)
644         {
645             // Queen or rook on 7th rank
646             if (   relative_rank(us, s) == RANK_7
647                 && relative_rank(us, pos.king_square(them)) == RANK_8)
648             {
649                 ei.mgValue += Sign[us] * (Piece == ROOK ? MidgameRookOn7thBonus : MidgameQueenOn7thBonus);
650                 ei.egValue += Sign[us] * (Piece == ROOK ? EndgameRookOn7thBonus : EndgameQueenOn7thBonus);
651             }
652         }
653
654         // Special extra evaluation for rooks
655         if (Piece == ROOK)
656         {
657             // Open and half-open files
658             f = square_file(s);
659             if (ei.pi->file_is_half_open(us, f))
660             {
661                 if (ei.pi->file_is_half_open(them, f))
662                 {
663                     ei.mgValue += Sign[us] * RookOpenFileBonus;
664                     ei.egValue += Sign[us] * RookOpenFileBonus;
665                 }
666                 else
667                 {
668                     ei.mgValue += Sign[us] * RookHalfOpenFileBonus;
669                     ei.egValue += Sign[us] * RookHalfOpenFileBonus;
670                 }
671             }
672
673             // Penalize rooks which are trapped inside a king. Penalize more if
674             // king has lost right to castle.
675             if (mob > 6 || ei.pi->file_is_half_open(us, f))
676                 continue;
677
678             ksq = pos.king_square(us);
679
680             if (    square_file(ksq) >= FILE_E
681                 &&  square_file(s) > square_file(ksq)
682                 && (relative_rank(us, ksq) == RANK_1 || square_rank(ksq) == square_rank(s)))
683             {
684                 // Is there a half-open file between the king and the edge of the board?
685                 if (!ei.pi->has_open_file_to_right(us, square_file(ksq)))
686                     ei.mgValue -= pos.can_castle(us)? Sign[us] * ((TrappedRookPenalty - mob * 16) / 2)
687                                                     : Sign[us] *  (TrappedRookPenalty - mob * 16);
688             }
689             else if (    square_file(ksq) <= FILE_D
690                     &&  square_file(s) < square_file(ksq)
691                     && (relative_rank(us, ksq) == RANK_1 || square_rank(ksq) == square_rank(s)))
692             {
693                 // Is there a half-open file between the king and the edge of the board?
694                 if (!ei.pi->has_open_file_to_left(us, square_file(ksq)))
695                     ei.mgValue -= pos.can_castle(us)? Sign[us] * ((TrappedRookPenalty - mob * 16) / 2)
696                                                     : Sign[us] * (TrappedRookPenalty - mob * 16);
697             }
698         }
699     }
700   }
701
702   inline Bitboard shiftRowsDown(const Bitboard& b, int num) {
703
704     return b >> (num << 3);
705   }
706
707   // evaluate_king<>() assigns bonuses and penalties to a king of a given color.
708
709   template<bool HasPopCnt>
710   void evaluate_king(const Position& p, Color us, EvalInfo& ei) {
711
712     int shelter = 0, sign = Sign[us];
713     Square s = p.king_square(us);
714
715     // King shelter
716     if (relative_rank(us, s) <= RANK_4)
717     {
718         // Shelter cache lookup
719         shelter = ei.pi->kingShelter(us, s);
720         if (shelter == -1)
721         {
722             shelter = 0;
723             Bitboard pawns = p.pawns(us) & this_and_neighboring_files_bb(s);
724             Rank r = square_rank(s);
725             for (int i = 1; i < 4; i++)
726                 shelter += BitCount8Bit[shiftRowsDown(pawns, r+i*sign) & 0xFF] * (128 >> i);
727
728             // Cache shelter value in pawn info
729             ei.pi->setKingShelter(us, s, shelter);
730         }
731         ei.mgValue += sign * Value(shelter);
732     }
733
734     // King safety. This is quite complicated, and is almost certainly far
735     // from optimally tuned.
736     Color them = opposite_color(us);
737
738     if (   p.piece_count(them, QUEEN) >= 1
739         && ei.kingAttackersCount[them] >= 2
740         && p.non_pawn_material(them) >= QueenValueMidgame + RookValueMidgame
741         && ei.kingAdjacentZoneAttacksCount[them])
742     {
743       // Is it the attackers turn to move?
744       bool sente = (them == p.side_to_move());
745
746       // Find the attacked squares around the king which has no defenders
747       // apart from the king itself
748       Bitboard undefended =
749              ei.attacked_by(them)       & ~ei.attacked_by(us, PAWN)
750           & ~ei.attacked_by(us, KNIGHT) & ~ei.attacked_by(us, BISHOP)
751           & ~ei.attacked_by(us, ROOK)   & ~ei.attacked_by(us, QUEEN)
752           & ei.attacked_by(us, KING);
753
754       Bitboard occ = p.occupied_squares(), b, b2;
755
756       // Initialize the 'attackUnits' variable, which is used later on as an
757       // index to the SafetyTable[] array.  The initial value is based on the
758       // number and types of the attacking pieces, the number of attacked and
759       // undefended squares around the king, the square of the king, and the
760       // quality of the pawn shelter.
761       int attackUnits =
762             Min((ei.kingAttackersCount[them] * ei.kingAttackersWeight[them]) / 2, 25)
763           + (ei.kingAdjacentZoneAttacksCount[them] + count_1s_max_15<HasPopCnt>(undefended)) * 3
764           + InitKingDanger[relative_square(us, s)] - (shelter >> 5);
765
766       // Analyse safe queen contact checks
767       b = undefended & ei.attacked_by(them, QUEEN) & ~p.pieces_of_color(them);
768       if (b)
769       {
770         Bitboard attackedByOthers =
771               ei.attacked_by(them, PAWN)   | ei.attacked_by(them, KNIGHT)
772             | ei.attacked_by(them, BISHOP) | ei.attacked_by(them, ROOK);
773
774         b &= attackedByOthers;
775         if (b)
776         {
777           // The bitboard b now contains the squares available for safe queen
778           // contact checks.
779           int count = count_1s_max_15<HasPopCnt>(b);
780           attackUnits += QueenContactCheckBonus * count * (sente ? 2 : 1);
781
782           // Is there a mate threat?
783           if (QueenContactMates && !p.is_check())
784           {
785             Bitboard escapeSquares =
786                 p.piece_attacks<KING>(s) & ~p.pieces_of_color(us) & ~attackedByOthers;
787
788             while (b)
789             {
790                 Square from, to = pop_1st_bit(&b);
791                 if (!(escapeSquares & ~queen_attacks_bb(to, occ & ClearMaskBB[s])))
792                 {
793                     // We have a mate, unless the queen is pinned or there
794                     // is an X-ray attack through the queen.
795                     for (int i = 0; i < p.piece_count(them, QUEEN); i++)
796                     {
797                         from = p.piece_list(them, QUEEN, i);
798                         if (    bit_is_set(p.piece_attacks<QUEEN>(from), to)
799                             && !bit_is_set(p.pinned_pieces(them), from)
800                             && !(rook_attacks_bb(to, occ & ClearMaskBB[from]) & p.rooks_and_queens(us))
801                             && !(bishop_attacks_bb(to, occ & ClearMaskBB[from]) & p.bishops_and_queens(us)))
802
803                             ei.mateThreat[them] = make_move(from, to);
804                     }
805                 }
806             }
807           }
808         }
809       }
810
811       // Analyse safe distance checks
812       if (QueenCheckBonus > 0 || RookCheckBonus > 0)
813       {
814           b = p.piece_attacks<ROOK>(s) & ~p.pieces_of_color(them) & ~ei.attacked_by(us);
815
816           // Queen checks
817           b2 = b & ei.attacked_by(them, QUEEN);
818           if( b2)
819               attackUnits += QueenCheckBonus * count_1s_max_15<HasPopCnt>(b2);
820
821           // Rook checks
822           b2 = b & ei.attacked_by(them, ROOK);
823           if (b2)
824               attackUnits += RookCheckBonus * count_1s_max_15<HasPopCnt>(b2);
825       }
826       if (QueenCheckBonus > 0 || BishopCheckBonus > 0)
827       {
828           b = p.piece_attacks<BISHOP>(s) & ~p.pieces_of_color(them) & ~ei.attacked_by(us);
829
830           // Queen checks
831           b2 = b & ei.attacked_by(them, QUEEN);
832           if (b2)
833               attackUnits += QueenCheckBonus * count_1s_max_15<HasPopCnt>(b2);
834
835           // Bishop checks
836           b2 = b & ei.attacked_by(them, BISHOP);
837           if (b2)
838               attackUnits += BishopCheckBonus * count_1s_max_15<HasPopCnt>(b2);
839       }
840       if (KnightCheckBonus > 0)
841       {
842           b = p.piece_attacks<KNIGHT>(s) & ~p.pieces_of_color(them) & ~ei.attacked_by(us);
843
844           // Knight checks
845           b2 = b & ei.attacked_by(them, KNIGHT);
846           if (b2)
847               attackUnits += KnightCheckBonus * count_1s_max_15<HasPopCnt>(b2);
848       }
849
850       // Analyse discovered checks (only for non-pawns right now, consider
851       // adding pawns later).
852       if (DiscoveredCheckBonus)
853       {
854         b = p.discovered_check_candidates(them) & ~p.pawns();
855         if (b)
856           attackUnits += DiscoveredCheckBonus * count_1s_max_15<HasPopCnt>(b) * (sente? 2 : 1);
857       }
858
859       // Has a mate threat been found?  We don't do anything here if the
860       // side with the mating move is the side to move, because in that
861       // case the mating side will get a huge bonus at the end of the main
862       // evaluation function instead.
863       if (ei.mateThreat[them] != MOVE_NONE)
864           attackUnits += MateThreatBonus;
865
866       // Ensure that attackUnits is between 0 and 99, in order to avoid array
867       // out of bounds errors:
868       if (attackUnits < 0)
869           attackUnits = 0;
870
871       if (attackUnits >= 100)
872           attackUnits = 99;
873
874       // Finally, extract the king safety score from the SafetyTable[] array.
875       // Add the score to the evaluation, and also to ei.futilityMargin.  The
876       // reason for adding the king safety score to the futility margin is
877       // that the king safety scores can sometimes be very big, and that
878       // capturing a single attacking piece can therefore result in a score
879       // change far bigger than the value of the captured piece.
880       Value v = apply_weight(SafetyTable[attackUnits], WeightKingSafety[us]);
881
882       ei.mgValue -= sign * v;
883
884       if (us == p.side_to_move())
885           ei.futilityMargin += v;
886     }
887   }
888
889
890   // evaluate_passed_pawns() evaluates the passed pawns for both sides.
891
892   void evaluate_passed_pawns(const Position &pos, EvalInfo &ei) {
893
894     bool hasUnstoppable[2] = {false, false};
895     int movesToGo[2] = {100, 100};
896
897     for (Color us = WHITE; us <= BLACK; us++)
898     {
899         Color them = opposite_color(us);
900         Square ourKingSq = pos.king_square(us);
901         Square theirKingSq = pos.king_square(them);
902         Bitboard b = ei.pi->passed_pawns() & pos.pawns(us), b2, b3, b4;
903
904         while (b)
905         {
906             Square s = pop_1st_bit(&b);
907
908             assert(pos.piece_on(s) == piece_of_color_and_type(us, PAWN));
909             assert(pos.pawn_is_passed(us, s));
910
911             int r = int(relative_rank(us, s) - RANK_2);
912             int tr = Max(0, r * (r - 1));
913             Square blockSq = s + pawn_push(us);
914
915             // Base bonus based on rank
916             Value mbonus = Value(20 * tr);
917             Value ebonus = Value(10 + r * r * 10);
918
919             // Adjust bonus based on king proximity
920             if (tr != 0)
921             {
922                 ebonus -= Value(square_distance(ourKingSq, blockSq) * 3 * tr);
923                 ebonus -= Value(square_distance(ourKingSq, blockSq + pawn_push(us)) * 1 * tr);
924                 ebonus += Value(square_distance(theirKingSq, blockSq) * 6 * tr);
925
926                 // If the pawn is free to advance, increase bonus
927                 if (pos.square_is_empty(blockSq))
928                 {
929                     b2 = squares_in_front_of(us, s);
930                     b3 = b2 & ei.attacked_by(them);
931                     b4 = b2 & ei.attacked_by(us);
932
933                     // If there is an enemy rook or queen attacking the pawn from behind,
934                     // add all X-ray attacks by the rook or queen.
935                     if (    bit_is_set(ei.attacked_by(them,ROOK) | ei.attacked_by(them,QUEEN),s)
936                         && (squares_behind(us, s) & pos.rooks_and_queens(them)))
937                         b3 = b2;
938
939                     // Squares attacked or occupied by enemy pieces
940                     b3 |= (b2 & pos.pieces_of_color(them));
941
942                     // There are no enemy pawns in the pawn's path
943                     assert((b2 & pos.pieces_of_color_and_type(them, PAWN)) == EmptyBoardBB);
944
945                     // Are any of the squares in the pawn's path attacked or occupied by the enemy?
946                     if (b3 == EmptyBoardBB)
947                         // No enemy attacks or pieces, huge bonus!
948                         ebonus += Value(tr * (b2 == b4 ? 17 : 15));
949                     else
950                         // OK, there are enemy attacks or pieces (but not pawns). Are those
951                         // squares which are attacked by the enemy also attacked by us?
952                         // If yes, big bonus (but smaller than when there are no enemy attacks),
953                         // if no, somewhat smaller bonus.
954                         ebonus += Value(tr * ((b3 & b4) == b3 ? 13 : 8));
955
956                     // At last, add a small bonus when there are no *friendly* pieces
957                     // in the pawn's path.
958                     if ((b2 & pos.pieces_of_color(us)) == EmptyBoardBB)
959                         ebonus += Value(tr);
960                 }
961             }
962
963             // If the pawn is supported by a friendly pawn, increase bonus
964             b2 = pos.pawns(us) & neighboring_files_bb(s);
965             if (b2 & rank_bb(s))
966                 ebonus += Value(r * 20);
967             else if (pos.pawn_attacks(them, s) & b2)
968                 ebonus += Value(r * 12);
969
970             // If the other side has only a king, check whether the pawn is
971             // unstoppable
972             if (pos.non_pawn_material(them) == Value(0))
973             {
974                 Square qsq;
975                 int d;
976
977                 qsq = relative_square(us, make_square(square_file(s), RANK_8));
978                 d =  square_distance(s, qsq)
979                    - square_distance(theirKingSq, qsq)
980                    + (us != pos.side_to_move());
981
982                 if (d < 0)
983                 {
984                     int mtg = RANK_8 - relative_rank(us, s);
985                     int blockerCount = count_1s_max_15(squares_in_front_of(us,s) & pos.occupied_squares());
986                     mtg += blockerCount;
987                     d += blockerCount;
988                     if (d < 0)
989                     {
990                         hasUnstoppable[us] = true;
991                         movesToGo[us] = Min(movesToGo[us], mtg);
992                     }
993                 }
994             }
995             // Rook pawns are a special case: They are sometimes worse, and
996             // sometimes better than other passed pawns. It is difficult to find
997             // good rules for determining whether they are good or bad. For now,
998             // we try the following: Increase the value for rook pawns if the
999             // other side has no pieces apart from a knight, and decrease the
1000             // value if the other side has a rook or queen.
1001             if (square_file(s) == FILE_A || square_file(s) == FILE_H)
1002             {
1003                 if (   pos.non_pawn_material(them) <= KnightValueMidgame
1004                     && pos.piece_count(them, KNIGHT) <= 1)
1005                     ebonus += ebonus / 4;
1006                 else if (pos.rooks_and_queens(them))
1007                     ebonus -= ebonus / 4;
1008             }
1009
1010             // Add the scores for this pawn to the middle game and endgame eval.
1011             ei.mgValue += apply_weight(Sign[us] * mbonus, WeightPassedPawnsMidgame);
1012             ei.egValue += apply_weight(Sign[us] * ebonus, WeightPassedPawnsEndgame);
1013         }
1014     }
1015
1016     // Does either side have an unstoppable passed pawn?
1017     if (hasUnstoppable[WHITE] && !hasUnstoppable[BLACK])
1018         ei.egValue += UnstoppablePawnValue - Value(0x40 * movesToGo[WHITE]);
1019     else if (hasUnstoppable[BLACK] && !hasUnstoppable[WHITE])
1020         ei.egValue -= UnstoppablePawnValue - Value(0x40 * movesToGo[BLACK]);
1021     else if (hasUnstoppable[BLACK] && hasUnstoppable[WHITE])
1022     {
1023         // Both sides have unstoppable pawns! Try to find out who queens
1024         // first. We begin by transforming 'movesToGo' to the number of
1025         // plies until the pawn queens for both sides.
1026         movesToGo[WHITE] *= 2;
1027         movesToGo[BLACK] *= 2;
1028         movesToGo[pos.side_to_move()]--;
1029
1030         // If one side queens at least three plies before the other, that
1031         // side wins.
1032         if (movesToGo[WHITE] <= movesToGo[BLACK] - 3)
1033             ei.egValue += UnstoppablePawnValue - Value(0x40 * (movesToGo[WHITE]/2));
1034         else if(movesToGo[BLACK] <= movesToGo[WHITE] - 3)
1035             ei.egValue -= UnstoppablePawnValue - Value(0x40 * (movesToGo[BLACK]/2));
1036
1037         // We could also add some rules about the situation when one side
1038         // queens exactly one ply before the other: Does the first queen
1039         // check the opponent's king, or attack the opponent's queening square?
1040         // This is slightly tricky to get right, because it is possible that
1041         // the opponent's king has moved somewhere before the first pawn queens.
1042     }
1043   }
1044
1045
1046   // evaluate_trapped_bishop_a7h7() determines whether a bishop on a7/h7
1047   // (a2/h2 for black) is trapped by enemy pawns, and assigns a penalty
1048   // if it is.
1049
1050   void evaluate_trapped_bishop_a7h7(const Position &pos, Square s, Color us,
1051                                     EvalInfo &ei) {
1052     assert(square_is_ok(s));
1053     assert(pos.piece_on(s) == piece_of_color_and_type(us, BISHOP));
1054
1055     Square b6 = relative_square(us, (square_file(s) == FILE_A) ? SQ_B6 : SQ_G6);
1056     Square b8 = relative_square(us, (square_file(s) == FILE_A) ? SQ_B8 : SQ_G8);
1057
1058     if (   pos.piece_on(b6) == piece_of_color_and_type(opposite_color(us), PAWN)
1059         && pos.see(s, b6) < 0
1060         && pos.see(s, b8) < 0)
1061     {
1062         ei.mgValue -= Sign[us] * TrappedBishopA7H7Penalty;
1063         ei.egValue -= Sign[us] * TrappedBishopA7H7Penalty;
1064     }
1065   }
1066
1067
1068   // evaluate_trapped_bishop_a1h1() determines whether a bishop on a1/h1
1069   // (a8/h8 for black) is trapped by a friendly pawn on b2/g2 (b7/g7 for
1070   // black), and assigns a penalty if it is.  This pattern can obviously
1071   // only occur in Chess960 games.
1072
1073   void evaluate_trapped_bishop_a1h1(const Position &pos, Square s, Color us,
1074                                     EvalInfo &ei) {
1075     Piece pawn = piece_of_color_and_type(us, PAWN);
1076     Square b2, b3, c3;
1077
1078     assert(Chess960);
1079     assert(square_is_ok(s));
1080     assert(pos.piece_on(s) == piece_of_color_and_type(us, BISHOP));
1081
1082     if (square_file(s) == FILE_A)
1083     {
1084         b2 = relative_square(us, SQ_B2);
1085         b3 = relative_square(us, SQ_B3);
1086         c3 = relative_square(us, SQ_C3);
1087     }
1088     else
1089     {
1090         b2 = relative_square(us, SQ_G2);
1091         b3 = relative_square(us, SQ_G3);
1092         c3 = relative_square(us, SQ_F3);
1093     }
1094
1095     if (pos.piece_on(b2) == pawn)
1096     {
1097         Value penalty;
1098
1099         if (!pos.square_is_empty(b3))
1100             penalty = 2*TrappedBishopA1H1Penalty;
1101         else if (pos.piece_on(c3) == pawn)
1102             penalty = TrappedBishopA1H1Penalty;
1103         else
1104             penalty = TrappedBishopA1H1Penalty / 2;
1105
1106         ei.mgValue -= Sign[us] * penalty;
1107         ei.egValue -= Sign[us] * penalty;
1108     }
1109   }
1110
1111
1112   // evaluate_space() computes the space evaluation for a given side. The
1113   // space evaluation is a simple bonus based on the number of safe squares
1114   // available for minor pieces on the central four files on ranks 2--4. Safe
1115   // squares one, two or three squares behind a friendly pawn are counted
1116   // twice. Finally, the space bonus is scaled by a weight taken from the
1117   // material hash table.
1118
1119   void evaluate_space(const Position &pos, Color us, EvalInfo &ei) {
1120
1121     Color them = opposite_color(us);
1122
1123     // Find the safe squares for our pieces inside the area defined by
1124     // SpaceMask[us]. A square is unsafe it is attacked by an enemy
1125     // pawn, or if it is undefended and attacked by an enemy piece.
1126
1127     Bitboard safeSquares =   SpaceMask[us]
1128                           & ~pos.pawns(us)
1129                           & ~ei.attacked_by(them, PAWN)
1130                           & ~(~ei.attacked_by(us) & ei.attacked_by(them));
1131
1132     // Find all squares which are at most three squares behind some friendly
1133     // pawn.
1134     Bitboard behindFriendlyPawns = pos.pawns(us);
1135     if (us == WHITE)
1136     {
1137         behindFriendlyPawns |= (behindFriendlyPawns >> 8);
1138         behindFriendlyPawns |= (behindFriendlyPawns >> 16);
1139     }
1140     else
1141     {
1142         behindFriendlyPawns |= (behindFriendlyPawns << 8);
1143         behindFriendlyPawns |= (behindFriendlyPawns << 16);
1144     }
1145
1146     int space =  count_1s_max_15(safeSquares)
1147                + count_1s_max_15(behindFriendlyPawns & safeSquares);
1148
1149     ei.mgValue += Sign[us] * apply_weight(Value(space * ei.mi->space_weight()), WeightSpace);
1150   }
1151
1152
1153   // apply_weight() applies an evaluation weight to a value
1154
1155   inline Value apply_weight(Value v, int w) {
1156     return (v*w) / 0x100;
1157   }
1158
1159
1160   // scale_by_game_phase() interpolates between a middle game and an endgame
1161   // score, based on game phase.  It also scales the return value by a
1162   // ScaleFactor array.
1163
1164   Value scale_by_game_phase(Value mv, Value ev, Phase ph, const ScaleFactor sf[]) {
1165
1166     assert(mv > -VALUE_INFINITE && mv < VALUE_INFINITE);
1167     assert(ev > -VALUE_INFINITE && ev < VALUE_INFINITE);
1168     assert(ph >= PHASE_ENDGAME && ph <= PHASE_MIDGAME);
1169
1170     ev = apply_scale_factor(ev, sf[(ev > Value(0) ? WHITE : BLACK)]);
1171
1172     Value result = Value(int((mv * ph + ev * (128 - ph)) / 128));
1173     return Value(int(result) & ~(GrainSize - 1));
1174   }
1175
1176
1177   // compute_weight() computes the value of an evaluation weight, by combining
1178   // an UCI-configurable weight with an internal weight.
1179
1180   int compute_weight(int uciWeight, int internalWeight) {
1181
1182     uciWeight = (uciWeight * 0x100) / 100;
1183     return (uciWeight * internalWeight) / 0x100;
1184   }
1185
1186
1187   // helper used in read_weights()
1188   int weight_option(const std::string& opt, int weight) {
1189
1190     return compute_weight(get_option_value_int(opt), weight);
1191   }
1192
1193
1194   // init_safety() initizes the king safety evaluation, based on UCI
1195   // parameters.  It is called from read_weights().
1196
1197   void init_safety() {
1198
1199     QueenContactCheckBonus = get_option_value_int("Queen Contact Check Bonus");
1200     QueenCheckBonus        = get_option_value_int("Queen Check Bonus");
1201     RookCheckBonus         = get_option_value_int("Rook Check Bonus");
1202     BishopCheckBonus       = get_option_value_int("Bishop Check Bonus");
1203     KnightCheckBonus       = get_option_value_int("Knight Check Bonus");
1204     DiscoveredCheckBonus   = get_option_value_int("Discovered Check Bonus");
1205     MateThreatBonus        = get_option_value_int("Mate Threat Bonus");
1206
1207     int maxSlope = get_option_value_int("King Safety Max Slope");
1208     int peak     = get_option_value_int("King Safety Max Value") * 256 / 100;
1209     double a     = get_option_value_int("King Safety Coefficient") / 100.0;
1210     double b     = get_option_value_int("King Safety X Intercept");
1211     bool quad    = (get_option_value_string("King Safety Curve") == "Quadratic");
1212     bool linear  = (get_option_value_string("King Safety Curve") == "Linear");
1213
1214     for (int i = 0; i < 100; i++)
1215     {
1216         if (i < b)
1217             SafetyTable[i] = Value(0);
1218         else if(quad)
1219             SafetyTable[i] = Value((int)(a * (i - b) * (i - b)));
1220         else if(linear)
1221             SafetyTable[i] = Value((int)(100 * a * (i - b)));
1222     }
1223
1224     for (int i = 0; i < 100; i++)
1225     {
1226         if (SafetyTable[i+1] - SafetyTable[i] > maxSlope)
1227             for (int j = i + 1; j < 100; j++)
1228                 SafetyTable[j] = SafetyTable[j-1] + Value(maxSlope);
1229
1230         if (SafetyTable[i]  > Value(peak))
1231             SafetyTable[i] = Value(peak);
1232     }
1233   }
1234 }