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