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