]> git.sesse.net Git - stockfish/blob - src/evaluate.cpp
d5cabaeb8fd31b11b53550cd98a9b92878e29575
[stockfish] / src / evaluate.cpp
1 /*
2   Glaurung, a UCI chess playing engine.
3   Copyright (C) 2004-2008 Tord Romstad
4
5   Glaurung is free software: you can redistribute it and/or modify
6   it under the terms of the GNU General Public License as published by
7   the Free Software Foundation, either version 3 of the License, or
8   (at your option) any later version.
9
10   Glaurung is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU General Public License for more details.
14
15   You should have received a copy of the GNU General Public License
16   along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18
19
20 ////
21 //// Includes
22 ////
23
24 #include <cassert>
25 #include <cstring>
26
27 #include "evaluate.h"
28 #include "material.h"
29 #include "pawns.h"
30 #include "scale.h"
31 #include "thread.h"
32 #include "ucioption.h"
33
34
35 ////
36 //// Local definitions
37 ////
38
39 namespace {
40
41   const int Sign[2] = {1, -1};
42
43   // Evaluation grain size, must be a power of 2.
44   const int GrainSize = 4;
45
46   // Evaluation weights
47   int WeightMobilityMidgame      = 0x100;
48   int WeightMobilityEndgame      = 0x100;
49   int WeightPawnStructureMidgame = 0x100;
50   int WeightPawnStructureEndgame = 0x100;
51   int WeightPassedPawnsMidgame   = 0x100;
52   int WeightPassedPawnsEndgame   = 0x100;
53   int WeightKingSafety[2] = { 0x100, 0x100 };
54
55   // Internal evaluation weights.  These are applied on top of the evaluation
56   // weights read from UCI parameters.  The purpose is to be able to change
57   // the evaluation weights while keeping the default values of the UCI
58   // parameters at 100, which looks prettier.
59   const int WeightMobilityMidgameInternal      = 0x100;
60   const int WeightMobilityEndgameInternal      = 0x100;
61   const int WeightPawnStructureMidgameInternal = 0x100;
62   const int WeightPawnStructureEndgameInternal = 0x100;
63   const int WeightPassedPawnsMidgameInternal   = 0x100;
64   const int WeightPassedPawnsEndgameInternal   = 0x100;
65   const int WeightKingSafetyInternal           = 0x100;
66
67   // Visually better to define tables constants
68   typedef Value V;
69
70   // Knight mobility bonus in middle game and endgame, indexed by the number
71   // of attacked squares not occupied by friendly piecess.
72   const Value MidgameKnightMobilityBonus[] = {
73   //    0       1      2     3      4      5      6      7      8
74     V(-30), V(-20),V(-10), V(0), V(10), V(20), V(25), V(30), V(30)
75   };
76
77   const Value EndgameKnightMobilityBonus[] = {
78   //    0       1      2     3      4      5      6      7      8
79     V(-30), V(-20),V(-10), V(0), V(10), V(20), V(25), V(30), V(30)
80   };
81
82   // Bishop mobility bonus in middle game and endgame, indexed by the number
83   // of attacked squares not occupied by friendly pieces.  X-ray attacks through
84   // queens are also included.
85   const Value MidgameBishopMobilityBonus[] = {
86   //    0       1      2      3      4      5      6      7
87     V(-30), V(-15),  V(0), V(15), V(30), V(45), V(58), V(66),
88   //    8       9     10     11     12     13     14     15
89     V( 72), V( 76), V(78), V(80), V(81), V(82), V(83), V(83)
90   };
91
92   const Value EndgameBishopMobilityBonus[] = {
93   //    0       1      2      3      4      5      6      7
94     V(-30), V(-15),  V(0), V(15), V(30), V(45), V(58), V(66),
95   //    8       9     10     11     12     13     14     15
96     V( 72), V( 76), V(78), V(80), V(81), V(82), V(83), V(83)
97   };
98
99   // Rook mobility bonus in middle game and endgame, indexed by the number
100   // of attacked squares not occupied by friendly pieces.  X-ray attacks through
101   // queens and rooks are also included.
102   const Value MidgameRookMobilityBonus[] = {
103   //    0       1      2      3      4      5      6      7
104     V(-18), V(-12), V(-6),  V(0),  V(6), V(12), V(16), V(21),
105   //    8       9     10     11     12     13     14     15
106     V( 24), V( 27), V(28), V(29), V(30), V(31), V(32), V(33)
107   };
108
109   const Value EndgameRookMobilityBonus[] = {
110   //    0       1      2      3      4      5      6      7
111     V(-30), V(-18), V(-6),  V(6), V(18), V(30), V(42), V(54),
112   //    8       9     10     11     12     13     14     15
113     V( 66), V( 74), V(78), V(80), V(81), V(82), V(83), V(83)
114   };
115
116   // Queen mobility bonus in middle game and endgame, indexed by the number
117   // of attacked squares not occupied by friendly pieces.
118   const Value MidgameQueenMobilityBonus[] = {
119   //    0      1      2      3      4      5      6      7
120     V(-10), V(-8), V(-6), V(-4), V(-2), V( 0), V( 2), V( 4),
121   //    8      9     10     11     12     13     14     15
122     V(  6), V( 8), V(10), V(12), V(13), V(14), V(15), V(16),
123   //   16     17     18     19     20     21     22     23
124     V( 16), V(16), V(16), V(16), V(16), V(16), V(16), V(16),
125   //   24     25     26     27     28     29     30     31
126     V( 16), V(16), V(16), V(16), V(16), V(16), V(16), V(16)
127   };
128
129   const Value EndgameQueenMobilityBonus[] = {
130   //    0      1      2      3      4      5      6      7
131     V(-20),V(-15),V(-10), V(-5), V( 0), V( 5), V(10), V(15),
132   //    8      9     10     11     12     13     14     15
133     V( 19), V(23), V(27), V(29), V(30), V(30), V(30), V(30),
134   //   16     17     18     19     20     21     22     23
135     V( 30), V(30), V(30), V(30), V(30), V(30), V(30), V(30),
136   //   24     25     26     27     28     29     30     31
137     V( 30), V(30), V(30), V(30), V(30), V(30), V(30), V(30)
138   };
139
140   // Outpost bonuses for knights and bishops, indexed by square (from white's
141   // point of view).
142   const Value KnightOutpostBonus[64] = {
143   //  A     B     C     D     E     F     G     H
144     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0), // 1
145     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0), // 2
146     V(0), V(0), V(5),V(10),V(10), V(5), V(0), V(0), // 3
147     V(0), V(5),V(20),V(30),V(30),V(20), V(5), V(0), // 4
148     V(0),V(10),V(30),V(40),V(40),V(30),V(10), V(0), // 5
149     V(0), V(5),V(20),V(20),V(20),V(20), V(5), V(0), // 6
150     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0), // 7
151     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0)  // 8
152   };
153
154   const Value BishopOutpostBonus[64] = {
155   //  A     B     C     D     E     F     G     H
156     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0), // 1
157     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0), // 2
158     V(0), V(0), V(5), V(5), V(5), V(5), V(0), V(0), // 3
159     V(0), V(5),V(10),V(10),V(10),V(10), V(5), V(0), // 4
160     V(0),V(10),V(20),V(20),V(20),V(20),V(10), V(0), // 5
161     V(0), V(5), V(8), V(8), V(8), V(8), V(5), V(0), // 6
162     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0), // 7
163     V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0)  // 8
164   };
165
166   // Bonus for unstoppable passed pawns:
167   const Value UnstoppablePawnValue = Value(0x500);
168
169   // Rooks and queens on the 7th rank:
170   const Value MidgameRookOn7thBonus  = Value(50);
171   const Value EndgameRookOn7thBonus  = Value(100);
172   const Value MidgameQueenOn7thBonus = Value(25);
173   const Value EndgameQueenOn7thBonus = Value(50);
174
175   // Rooks on open files:
176   const Value RookOpenFileBonus     = Value(40);
177   const Value RookHalfOpenFileBonus = Value(20);
178
179   // Penalty for rooks trapped inside a friendly king which has lost the
180   // right to castle:
181   const Value TrappedRookPenalty = Value(180);
182
183   // Penalty for a bishop on a7/h7 (a2/h2 for black) which is trapped by
184   // enemy pawns:
185   const Value TrappedBishopA7H7Penalty = Value(300);
186
187   // Bitboard masks for detecting trapped bishops on a7/h7 (a2/h2 for black):
188   const Bitboard MaskA7H7[2] = {
189     ((1ULL << SQ_A7) | (1ULL << SQ_H7)),
190     ((1ULL << SQ_A2) | (1ULL << SQ_H2))
191   };
192
193   // Penalty for a bishop on a1/h1 (a8/h8 for black) which is trapped by
194   // a friendly pawn on b2/g2 (b7/g7 for black).  This can obviously only
195   // happen in Chess960 games.
196   const Value TrappedBishopA1H1Penalty = Value(100);
197
198   // Bitboard masks for detecting trapped bishops on a1/h1 (a8/h8 for black):
199   const Bitboard MaskA1H1[2] = {
200     ((1ULL << SQ_A1) | (1ULL << SQ_H1)),
201     ((1ULL << SQ_A8) | (1ULL << SQ_H8))
202   };
203
204   /// King safety constants and variables.  The king safety scores are taken
205   /// from the array SafetyTable[].  Various little "meta-bonuses" measuring
206   /// the strength of the attack are added up into an integer, which is used
207   /// as an index to SafetyTable[].
208
209   // Attack weights for each piece type.
210   const int QueenAttackWeight  = 5;
211   const int RookAttackWeight   = 3;
212   const int BishopAttackWeight = 2;
213   const int KnightAttackWeight = 2;
214
215   // Bonuses for safe checks for each piece type.
216   int QueenContactCheckBonus = 4;
217   int RookContactCheckBonus  = 2;
218   int QueenCheckBonus        = 2;
219   int RookCheckBonus         = 1;
220   int BishopCheckBonus       = 1;
221   int KnightCheckBonus       = 1;
222   int DiscoveredCheckBonus   = 3;
223
224   // Scan for queen contact mates?
225   const bool QueenContactMates = true;
226
227   // Bonus for having a mate threat.
228   int MateThreatBonus = 3;
229
230   // InitKingDanger[] contains bonuses based on the position of the defending
231   // king.
232   const int InitKingDanger[64] = {
233      2,  0,  2,  5,  5,  2,  0,  2,
234      2,  2,  4,  8,  8,  4,  2,  2,
235      7, 10, 12, 12, 12, 12, 10,  7,
236     15, 15, 15, 15, 15, 15, 15, 15,
237     15, 15, 15, 15, 15, 15, 15, 15,
238     15, 15, 15, 15, 15, 15, 15, 15,
239     15, 15, 15, 15, 15, 15, 15, 15,
240     15, 15, 15, 15, 15, 15, 15, 15
241   };
242
243   // SafetyTable[] contains the actual king safety scores.  It is initialized
244   // in init_safety().
245   Value SafetyTable[100];
246
247   // Pawn and material hash tables, indexed by the current thread id:
248   PawnInfoTable *PawnTable[8] = {0, 0, 0, 0, 0, 0, 0, 0};
249   MaterialInfoTable *MaterialTable[8] = {0, 0, 0, 0, 0, 0, 0, 0};
250
251   // Sizes of pawn and material hash tables:
252   const int PawnTableSize = 16384;
253   const int MaterialTableSize = 1024;
254
255   // Array which gives the number of nonzero bits in an 8-bit integer:
256   uint8_t BitCount8Bit[256];
257
258   // Function prototypes:
259   void evaluate_knight(const Position &p, Square s, Color us, EvalInfo &ei);
260   void evaluate_bishop(const Position &p, Square s, Color us, EvalInfo &ei);
261   void evaluate_rook(const Position &p, Square s, Color us, EvalInfo &ei);
262   void evaluate_queen(const Position &p, Square s, Color us, EvalInfo &ei);
263   void evaluate_king(const Position &p, Square s, Color us, EvalInfo &ei);
264
265   void evaluate_passed_pawns(const Position &pos, EvalInfo &ei);
266   void evaluate_trapped_bishop_a7h7(const Position &pos, Square s, Color us,
267                                     EvalInfo &ei);
268   void evaluate_trapped_bishop_a1h1(const Position &pos, Square s, Color us,
269                                     EvalInfo &ei);
270
271   inline Value apply_weight(Value v, int w);
272   Value scale_by_game_phase(Value mv, Value ev, Phase ph, ScaleFactor sf[]);
273
274   int count_1s_8bit(Bitboard b);
275
276   int compute_weight(int uciWeight, int internalWeight);
277   void init_safety();
278
279 }
280
281
282 ////
283 //// Functions
284 ////
285
286 /// evaluate() is the main evaluation function.  It always computes two
287 /// values, an endgame score and a middle game score, and interpolates
288 /// between them based on the remaining material.
289
290 Value evaluate(const Position &pos, EvalInfo &ei, int threadID) {
291   Color stm;
292   Square s;
293   ScaleFactor factor[2] = {SCALE_FACTOR_NORMAL, SCALE_FACTOR_NORMAL};
294   Phase phase;
295
296   memset(&ei, 0, sizeof(EvalInfo));
297
298   assert(pos.is_ok());
299   assert(threadID >= 0 && threadID < THREAD_MAX);
300
301   stm = pos.side_to_move();
302
303   // Initialize by reading the incrementally updated scores included in the
304   // position object (material + piece square tables):
305   ei.mgValue = pos.mg_value();
306   ei.egValue = pos.eg_value();
307
308   // Probe the material hash table:
309   ei.mi = MaterialTable[threadID]->get_material_info(pos);
310   ei.mgValue += ei.mi->mg_value();
311   ei.egValue += ei.mi->eg_value();
312
313   factor[WHITE] = ei.mi->scale_factor(pos, WHITE);
314   factor[BLACK] = ei.mi->scale_factor(pos, BLACK);
315
316   // If we have a specialized evaluation function for the current material
317   // configuration, call it and return:
318   if(ei.mi->specialized_eval_exists())
319     return ei.mi->evaluate(pos);
320
321   phase = pos.game_phase();
322
323   // Probe the pawn hash table:
324   ei.pi = PawnTable[threadID]->get_pawn_info(pos);
325   ei.mgValue += apply_weight(ei.pi->mg_value(), WeightPawnStructureMidgame);
326   ei.egValue += apply_weight(ei.pi->eg_value(), WeightPawnStructureEndgame);
327
328   // Initialize king attack bitboards and king attack zones for both sides:
329   ei.attackedBy[WHITE][KING] = pos.king_attacks(pos.king_square(WHITE));
330   ei.attackedBy[BLACK][KING] = pos.king_attacks(pos.king_square(BLACK));
331   ei.attackZone[WHITE] =
332     ei.attackedBy[BLACK][KING] | (ei.attackedBy[BLACK][KING] >> 8);
333   ei.attackZone[BLACK] =
334     ei.attackedBy[WHITE][KING] | (ei.attackedBy[WHITE][KING] << 8);
335
336   // Initialize pawn attack bitboards for both sides:
337   ei.attackedBy[WHITE][PAWN] =
338     ((pos.pawns(WHITE) << 9) & ~FileABB) | ((pos.pawns(WHITE) << 7) & ~FileHBB);
339   ei.attackCount[WHITE] +=
340     count_1s_max_15(ei.attackedBy[WHITE][PAWN] & ei.attackedBy[BLACK][KING])/2;
341   ei.attackedBy[BLACK][PAWN] =
342     ((pos.pawns(BLACK) >> 7) & ~FileABB) | ((pos.pawns(BLACK) >> 9) & ~FileHBB);
343   ei.attackCount[BLACK] +=
344     count_1s_max_15(ei.attackedBy[BLACK][PAWN] & ei.attackedBy[WHITE][KING])/2;
345
346   // Evaluate pieces:
347   for(Color c = WHITE; c <= BLACK; c++) {
348     Bitboard b;
349
350     // Knights
351     for(int i = 0; i < pos.knight_count(c); i++) {
352       s = pos.knight_list(c, i);
353       evaluate_knight(pos, s, c, ei);
354     }
355
356     // Bishops
357     for(int i = 0; i < pos.bishop_count(c); i++) {
358       s = pos.bishop_list(c, i);
359       evaluate_bishop(pos, s, c, ei);
360     }
361
362     // Rooks
363     for(int i = 0; i < pos.rook_count(c); i++) {
364       s = pos.rook_list(c, i);
365       evaluate_rook(pos, s, c, ei);
366     }
367
368     // Queens
369     for(int i = 0; i < pos.queen_count(c); i++) {
370       s = pos.queen_list(c, i);
371       evaluate_queen(pos, s, c, ei);
372     }
373
374     // Some special patterns:
375
376     // Trapped bishops on a7/h7/a2/h2
377     b = pos.bishops(c) & MaskA7H7[c];
378     while(b) {
379       s = pop_1st_bit(&b);
380       evaluate_trapped_bishop_a7h7(pos, s, c, ei);
381     }
382
383     // Trapped bishops on a1/h1/a8/h8 in Chess960:
384     if(Chess960) {
385       b = pos.bishops(c) & MaskA1H1[c];
386       while(b) {
387         s = pop_1st_bit(&b);
388         evaluate_trapped_bishop_a1h1(pos, s, c, ei);
389       }
390     }
391
392     ei.attackedBy[c][0] =
393       ei.attackedBy[c][PAWN] | ei.attackedBy[c][KNIGHT]
394       | ei.attackedBy[c][BISHOP] | ei.attackedBy[c][ROOK]
395       | ei.attackedBy[c][QUEEN] | ei.attackedBy[c][KING];
396   }
397
398   // Kings.  Kings are evaluated after all other pieces for both sides,
399   // because we need complete attack information for all pieces when computing
400   // the king safety evaluation.
401   for(Color c = WHITE; c <= BLACK; c++) {
402     s = pos.king_square(c);
403     evaluate_king(pos, s, c, ei);
404   }
405
406   // Evaluate passed pawns.  We evaluate passed pawns for both sides at once,
407   // because we need to know which side promotes first in positions where
408   // both sides have an unstoppable passed pawn.
409   if(ei.pi->passed_pawns())
410     evaluate_passed_pawns(pos, ei);
411
412   // Middle-game specific evaluation terms
413   if(phase > PHASE_ENDGAME) {
414
415     // Pawn storms in positions with opposite castling.
416     if(square_file(pos.king_square(WHITE)) >= FILE_E &&
417        square_file(pos.king_square(BLACK)) <= FILE_D)
418       ei.mgValue +=
419         ei.pi->queenside_storm_value(WHITE) -
420         ei.pi->kingside_storm_value(BLACK);
421     else if(square_file(pos.king_square(WHITE)) <= FILE_D &&
422             square_file(pos.king_square(BLACK)) >= FILE_E)
423       ei.mgValue +=
424         ei.pi->kingside_storm_value(WHITE) -
425         ei.pi->queenside_storm_value(BLACK);
426   }
427
428   // Mobility
429   ei.mgValue += apply_weight(ei.mgMobility, WeightMobilityMidgame);
430   ei.egValue += apply_weight(ei.egMobility, WeightMobilityEndgame);
431
432   // If we don't already have an unusual scale factor, check for opposite
433   // colored bishop endgames, and use a lower scale for those:
434   if(phase < PHASE_MIDGAME && pos.opposite_colored_bishops()
435      && ((factor[WHITE] == SCALE_FACTOR_NORMAL && ei.egValue > Value(0)) ||
436          (factor[BLACK] == SCALE_FACTOR_NORMAL && ei.egValue < Value(0)))) {
437     if(pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK) ==
438        2*BishopValueMidgame) {
439       // Only the two bishops
440       if(pos.pawn_count(WHITE) + pos.pawn_count(BLACK) == 1) {
441         // KBP vs KB with only a single pawn; almost certainly a draw.
442         if(factor[WHITE] == SCALE_FACTOR_NORMAL)
443           factor[WHITE] = ScaleFactor(8);
444         if(factor[BLACK] == SCALE_FACTOR_NORMAL)
445           factor[BLACK] = ScaleFactor(8);
446       }
447       else {
448         // At least two pawns
449         if(factor[WHITE] == SCALE_FACTOR_NORMAL)
450           factor[WHITE] = ScaleFactor(32);
451         if(factor[BLACK] == SCALE_FACTOR_NORMAL)
452           factor[BLACK] = ScaleFactor(32);
453       }
454     }
455     else {
456       // Endgame with opposite-colored bishops, but also other pieces.
457       // Still a bit drawish, but not as drawish as with only the two
458       // bishops.
459       if(factor[WHITE] == SCALE_FACTOR_NORMAL)
460         factor[WHITE] = ScaleFactor(50);
461       if(factor[BLACK] == SCALE_FACTOR_NORMAL)
462         factor[BLACK] = ScaleFactor(50);
463     }
464   }
465
466   // Interpolate between the middle game and the endgame score, and
467   // return:
468   Value value = scale_by_game_phase(ei.mgValue, ei.egValue, phase, factor);
469
470   if(ei.mateThreat[stm] != MOVE_NONE)
471     return 8 * QueenValueMidgame - Sign[stm] * value;
472   else
473     return Sign[stm] * value;
474 }
475
476
477 /// quick_evaluate() does a very approximate evaluation of the current position.
478 /// It currently considers only material and piece square table scores.  Perhaps
479 /// we should add scores from the pawn and material hash tables?
480
481 Value quick_evaluate(const Position &pos) {
482   Color stm;
483   Value mgValue, egValue;
484   ScaleFactor factor[2] = {SCALE_FACTOR_NORMAL, SCALE_FACTOR_NORMAL};
485   Phase phase;
486
487   assert(pos.is_ok());
488
489   stm = pos.side_to_move();
490
491   mgValue = pos.mg_value();
492   egValue = pos.eg_value();
493   phase = pos.game_phase();
494
495   Value value = scale_by_game_phase(mgValue, egValue, phase, factor);
496
497   return Sign[stm] * value;
498 }
499
500
501 /// init_eval() initializes various tables used by the evaluation function.
502
503 void init_eval(int threads) {
504
505   assert(threads <= THREAD_MAX);
506
507   for (int i = 0; i < THREAD_MAX; i++)
508   {
509     if (i >= threads)
510     {
511         delete PawnTable[i];
512         delete MaterialTable[i];
513         PawnTable[i] = NULL;
514         MaterialTable[i] = NULL;
515         continue;
516     }
517     if (!PawnTable[i])
518         PawnTable[i] = new PawnInfoTable(PawnTableSize);
519     if (!MaterialTable[i])
520         MaterialTable[i] = new MaterialInfoTable(MaterialTableSize);
521   }
522
523   for (Bitboard b = 0ULL; b < 256ULL; b++)
524       BitCount8Bit[b] = count_1s(b);
525 }
526
527
528 /// quit_eval() releases heap-allocated memory at program termination.
529
530 void quit_eval() {
531   for(int i = 0; i < THREAD_MAX; i++) {
532     delete PawnTable[i];
533     delete MaterialTable[i];
534   }
535 }
536
537
538 /// read_weights() reads evaluation weights from the corresponding UCI
539 /// parameters.
540
541 void read_weights(Color sideToMove) {
542   WeightMobilityMidgame =
543     compute_weight(get_option_value_int("Mobility (Middle Game)"),
544                    WeightMobilityMidgameInternal);
545   WeightMobilityEndgame =
546     compute_weight(get_option_value_int("Mobility (Endgame)"),
547                    WeightMobilityEndgameInternal);
548   WeightPawnStructureMidgame =
549     compute_weight(get_option_value_int("Pawn Structure (Middle Game)"),
550                    WeightPawnStructureMidgameInternal);
551   WeightPawnStructureEndgame =
552     compute_weight(get_option_value_int("Pawn Structure (Endgame)"),
553                    WeightPawnStructureEndgameInternal);
554   WeightPassedPawnsMidgame =
555     compute_weight(get_option_value_int("Passed Pawns (Middle Game)"),
556                    WeightPassedPawnsMidgameInternal);
557   WeightPassedPawnsEndgame =
558     compute_weight(get_option_value_int("Passed Pawns (Endgame)"),
559                    WeightPassedPawnsEndgameInternal);
560   WeightKingSafety[sideToMove] =
561     compute_weight(get_option_value_int("Cowardice"), WeightKingSafetyInternal);
562   WeightKingSafety[opposite_color(sideToMove)] =
563     compute_weight(get_option_value_int("Aggressiveness"),
564                    WeightKingSafetyInternal);
565   WeightKingSafety[opposite_color(sideToMove)] =
566     (get_option_value_int("Aggressiveness") * 0x100) / 100;
567
568   init_safety();
569 }
570
571
572 namespace {
573
574   // evaluate_common() computes terms common to all pieces attack
575
576   int evaluate_common(const Position&p, const Bitboard& b, Color us, EvalInfo& ei,
577                        int AttackWeight, const Value* mgBonus, const Value* egBonus,
578                        Square s = SQ_NONE, const Value* OutpostBonus = NULL) {
579
580     Color them = opposite_color(us);
581
582     // King attack
583     if (b & ei.attackZone[us])
584     {
585       ei.attackCount[us]++;
586       ei.attackWeight[us] += AttackWeight;
587       Bitboard bb = (b & ei.attackedBy[them][KING]);
588       if (bb)
589           ei.attacked[us] += count_1s_max_15(bb);
590     }
591
592     // Mobility
593     int mob = count_1s_max_15(b & ~p.pieces_of_color(us));
594     ei.mgMobility += Sign[us] * mgBonus[mob];
595     ei.egMobility += Sign[us] * egBonus[mob];
596
597     // Bishop and Knight outposts
598     if (!OutpostBonus || !p.square_is_weak(s, them))
599         return mob;
600
601     // Initial bonus based on square
602     Value v, bonus;
603     v = bonus = OutpostBonus[relative_square(us, s)];
604
605     // Increase bonus if supported by pawn, especially if the opponent has
606     // no minor piece which can exchange the outpost piece
607     if (v && (p.pawn_attacks(them, s) & p.pawns(us)))
608     {
609         bonus += v / 2;
610         if (   p.knight_count(them) == 0
611             && (SquaresByColorBB[square_color(s)] & p.bishops(them)) == EmptyBoardBB)
612             bonus += v;
613     }
614     ei.mgValue += Sign[us] * bonus;
615     ei.egValue += Sign[us] * bonus;
616     return mob;
617   }
618
619
620   // evaluate_knight() assigns bonuses and penalties to a knight of a given
621   // color on a given square.
622
623   void evaluate_knight(const Position &p, Square s, Color us, EvalInfo &ei) {
624
625     Bitboard b = p.knight_attacks(s);
626     ei.attackedBy[us][KNIGHT] |= b;
627
628     // King attack, mobility and outposts
629     evaluate_common(p, b, us, ei, KnightAttackWeight, MidgameKnightMobilityBonus,
630                     EndgameKnightMobilityBonus, s, KnightOutpostBonus);
631   }
632
633
634   // evaluate_bishop() assigns bonuses and penalties to a bishop of a given
635   // color on a given square.
636
637   void evaluate_bishop(const Position &p, Square s, Color us, EvalInfo &ei) {
638
639     Bitboard b = bishop_attacks_bb(s, p.occupied_squares() & ~p.queens(us));
640     ei.attackedBy[us][BISHOP] |= b;
641
642     // King attack, mobility and outposts
643     evaluate_common(p, b, us, ei, BishopAttackWeight, MidgameBishopMobilityBonus,
644                     EndgameBishopMobilityBonus, s, BishopOutpostBonus);
645   }
646
647
648   // evaluate_rook() assigns bonuses and penalties to a rook of a given
649   // color on a given square.
650
651   void evaluate_rook(const Position &p, Square s, Color us, EvalInfo &ei) {
652
653     Color them = opposite_color(us);
654
655     // Open and half-open files:
656     File f = square_file(s);
657     if(ei.pi->file_is_half_open(us, f)) {
658       if(ei.pi->file_is_half_open(them, f)) {
659         ei.mgValue += Sign[us] * RookOpenFileBonus;
660         ei.egValue += Sign[us] * RookOpenFileBonus;
661       }
662       else {
663         ei.mgValue += Sign[us] * RookHalfOpenFileBonus;
664         ei.egValue += Sign[us] * RookHalfOpenFileBonus;
665       }
666     }
667
668     // Rook on 7th rank:
669     if(pawn_rank(us, s) == RANK_7 &&
670        pawn_rank(us, p.king_square(them)) == RANK_8) {
671       ei.mgValue += Sign[us] * MidgameRookOn7thBonus;
672       ei.egValue += Sign[us] * EndgameRookOn7thBonus;
673     }
674
675     //Bitboard b = p.rook_attacks(s);
676     Bitboard b = rook_attacks_bb(s, p.occupied_squares() & ~p.rooks_and_queens(us));
677     ei.attackedBy[us][ROOK] |= b;
678
679     // King attack and mobility
680     int mob = evaluate_common(p, b, us, ei, RookAttackWeight, MidgameRookMobilityBonus,
681                               EndgameRookMobilityBonus);
682
683     // Penalize rooks which are trapped inside a king which has lost the
684     // right to castle:
685     if(mob <= 6 && !ei.pi->file_is_half_open(us, f)) {
686       Square ksq = p.king_square(us);
687       if(square_file(ksq) >= FILE_E && square_file(s) > square_file(ksq) &&
688          (pawn_rank(us, ksq) == RANK_1 || square_rank(ksq) == square_rank(s))) {
689         // Is there a half-open file between the king and the edge of the
690         // board?
691         if(!(ei.pi->has_open_file_to_right(us, square_file(ksq)))) {
692           ei.mgValue -= p.can_castle(us)?
693             Sign[us] * ((TrappedRookPenalty - mob * 16) / 2) :
694             Sign[us] * (TrappedRookPenalty - mob * 16);
695         }
696       }
697       else if(square_file(ksq) <= FILE_D && square_file(s) < square_file(ksq)
698               && (pawn_rank(us, ksq) == RANK_1 ||
699                   square_rank(ksq) == square_rank(s))) {
700         // Is there a half-open file between the king and the edge of the
701         // board?
702         if(!(ei.pi->has_open_file_to_left(us, square_file(ksq)))) {
703           ei.mgValue -= p.can_castle(us)?
704             Sign[us] * ((TrappedRookPenalty - mob * 16) / 2) :
705             Sign[us] * (TrappedRookPenalty - mob * 16);
706         }
707       }
708     }
709   }
710
711
712   // evaluate_queen() assigns bonuses and penalties to a queen of a given
713   // color on a given square.
714
715   void evaluate_queen(const Position &p, Square s, Color us, EvalInfo &ei) {
716
717     Color them = opposite_color(us);
718
719     // Queen on 7th rank:
720     if(pawn_rank(us, s) == RANK_7 &&
721        pawn_rank(us, p.king_square(them)) == RANK_8) {
722       ei.mgValue += Sign[us] * MidgameQueenOn7thBonus;
723       ei.egValue += Sign[us] * EndgameQueenOn7thBonus;
724     }
725
726     Bitboard b = p.queen_attacks(s);
727     ei.attackedBy[us][QUEEN] |= b;
728
729     // King attack and mobility
730     evaluate_common(p, b, us, ei, QueenAttackWeight, MidgameQueenMobilityBonus,
731                     EndgameQueenMobilityBonus);
732   }
733
734
735   // evaluate_king() assigns bonuses and penalties to a king of a given
736   // color on a given square.
737
738   void evaluate_king(const Position &p, Square s, Color us, EvalInfo &ei) {
739
740     int shelter = 0, sign = Sign[us];
741
742     // King shelter.
743     if(pawn_rank(us, s) <= RANK_4) {
744       Bitboard pawns = p.pawns(us) & this_and_neighboring_files_bb(s);
745       Rank r = square_rank(s);
746       for(int i = 0; i < 3; i++)
747         shelter += count_1s_8bit(pawns >> ((r+(i+1)*sign) * 8)) * (64>>i);
748       ei.mgValue += sign * Value(shelter);
749     }
750
751     // King safety.  This is quite complicated, and is almost certainly far
752     // from optimally tuned.
753     Color them = opposite_color(us);
754     if(p.queen_count(them) >= 1 && ei.attackCount[them] >= 2
755        && p.non_pawn_material(them) >= QueenValueMidgame + RookValueMidgame
756        && ei.attacked[them]) {
757
758       // Is it the attackers turn to move?
759       bool sente = (them == p.side_to_move());
760
761       // Find the attacked squares around the king which has no defenders
762       // apart from the king itself:
763       Bitboard undefended =
764         ei.attacked_by(them) & ~ei.attacked_by(us, PAWN)
765         & ~ei.attacked_by(us, KNIGHT) & ~ei.attacked_by(us, BISHOP)
766         & ~ei.attacked_by(us, ROOK) & ~ei.attacked_by(us, QUEEN)
767         & ei.attacked_by(us, KING);
768       Bitboard occ = p.occupied_squares(), b, b2;
769
770       // Initialize the 'attackUnits' variable, which is used later on as an
771       // index to the SafetyTable[] array.  The initial is based on the number
772       // and types of the attacking pieces, the number of attacked and
773       // undefended squares around the king, the square of the king, and the
774       // quality of the pawn shelter.
775       int attackUnits =
776         Min((ei.attackCount[them] * ei.attackWeight[them]) / 2, 25)
777         + (ei.attacked[them] + count_1s_max_15(undefended)) * 3
778         + InitKingDanger[relative_square(us, s)] - shelter / 32;
779
780       // Analyse safe queen contact checks:
781       b = undefended & ei.attacked_by(them, QUEEN) & ~p.pieces_of_color(them);
782       if(b) {
783         Bitboard attackedByOthers =
784           ei.attacked_by(them, PAWN) | ei.attacked_by(them, KNIGHT)
785           | ei.attacked_by(them, BISHOP) | ei.attacked_by(them, ROOK);
786         b &= attackedByOthers;
787         if(b) {
788           // The bitboard b now contains the squares available for safe queen
789           // contact checks.
790           int count = count_1s_max_15(b);
791           attackUnits += QueenContactCheckBonus * count * (sente? 2 : 1);
792
793           // Is there a mate threat?
794           if(QueenContactMates && !p.is_check()) {
795             Bitboard escapeSquares =
796               p.king_attacks(s) & ~p.pieces_of_color(us) & ~attackedByOthers;
797             while(b) {
798               Square from, to = pop_1st_bit(&b);
799               if(!(escapeSquares
800                    & ~queen_attacks_bb(to, occ & clear_mask_bb(s)))) {
801                 // We have a mate, unless the queen is pinned or there
802                 // is an X-ray attack through the queen.
803                 for(int i = 0; i < p.queen_count(them); i++) {
804                   from = p.queen_list(them, i);
805                   if(bit_is_set(p.queen_attacks(from), to)
806                      && !bit_is_set(p.pinned_pieces(them), from)
807                      && !(rook_attacks_bb(to, occ & clear_mask_bb(from))
808                           & p.rooks_and_queens(us))
809                      && !(rook_attacks_bb(to, occ & clear_mask_bb(from))
810                           & p.rooks_and_queens(us)))
811                     ei.mateThreat[them] = make_move(from, to);
812                 }
813               }
814             }
815           }
816         }
817       }
818
819       // Analyse safe rook contact checks:
820       if(RookContactCheckBonus) {
821         b = undefended & ei.attacked_by(them, ROOK) & ~p.pieces_of_color(them);
822         if(b) {
823           Bitboard attackedByOthers =
824             ei.attacked_by(them, PAWN) | ei.attacked_by(them, KNIGHT)
825             | ei.attacked_by(them, BISHOP) | ei.attacked_by(them, QUEEN);
826           b &= attackedByOthers;
827           if(b) {
828             int count = count_1s_max_15(b);
829             attackUnits += (RookContactCheckBonus * count * (sente? 2 : 1));
830           }
831         }
832       }
833
834       // Analyse safe distance checks:
835       if(QueenCheckBonus > 0 || RookCheckBonus > 0) {
836         b = p.rook_attacks(s) & ~p.pieces_of_color(them) & ~ei.attacked_by(us);
837
838         // Queen checks
839         b2 = b & ei.attacked_by(them, QUEEN);
840         if(b2) attackUnits += QueenCheckBonus * count_1s_max_15(b2);
841
842         // Rook checks
843         b2 = b & ei.attacked_by(them, ROOK);
844         if(b2) attackUnits += RookCheckBonus * count_1s_max_15(b2);
845       }
846       if(QueenCheckBonus > 0 || BishopCheckBonus > 0) {
847         b = p.bishop_attacks(s) & ~p.pieces_of_color(them) & ~ei.attacked_by(us);
848         // Queen checks
849         b2 = b & ei.attacked_by(them, QUEEN);
850         if(b2) attackUnits += QueenCheckBonus * count_1s_max_15(b2);
851
852         // Bishop checks
853         b2 = b & ei.attacked_by(them, BISHOP);
854         if(b2) attackUnits += BishopCheckBonus * count_1s_max_15(b2);
855       }
856       if(KnightCheckBonus > 0) {
857         b = p.knight_attacks(s) & ~p.pieces_of_color(them) & ~ei.attacked_by(us);
858         // Knight checks
859         b2 = b & ei.attacked_by(them, KNIGHT);
860         if(b2) attackUnits += KnightCheckBonus * count_1s_max_15(b2);
861       }
862
863       // Analyse discovered checks (only for non-pawns right now, consider
864       // adding pawns later).
865       if(DiscoveredCheckBonus) {
866         b = p.discovered_check_candidates(them) & ~p.pawns();
867         if(b)
868           attackUnits +=
869             DiscoveredCheckBonus * count_1s_max_15(b) * (sente? 2 : 1);
870       }
871
872       // Has a mate threat been found?  We don't do anything here if the
873       // side with the mating move is the side to move, because in that
874       // case the mating side will get a huge bonus at the end of the main
875       // evaluation function instead.
876       if(ei.mateThreat[them] != MOVE_NONE)
877         attackUnits += MateThreatBonus;
878
879       // Ensure that attackUnits is between 0 and 99, in order to avoid array
880       // out of bounds errors:
881       if(attackUnits < 0) attackUnits = 0;
882       if(attackUnits >= 100) attackUnits = 99;
883
884       // Finally, extract the king safety score from the SafetyTable[] array.
885       // Add the score to the evaluation, and also to ei.futilityMargin.  The
886       // reason for adding the king safety score to the futility margin is
887       // that the king safety scores can sometimes be very big, and that
888       // capturing a single attacking piece can therefore result in a score
889       // change far bigger than the value of the captured piece.
890       Value v = apply_weight(SafetyTable[attackUnits], WeightKingSafety[us]);
891       ei.mgValue -= sign * v;
892       if(us == p.side_to_move())
893         ei.futilityMargin += v;
894     }
895   }
896
897
898   // evaluate_passed_pawns() evaluates the passed pawns for both sides.
899
900   void evaluate_passed_pawns(const Position &pos, EvalInfo &ei) {
901     bool hasUnstoppable[2] = {false, false};
902     int movesToGo[2] = {100, 100};
903
904     for(Color us = WHITE; us <= BLACK; us++) {
905       Color them = opposite_color(us);
906       Square ourKingSq = pos.king_square(us);
907       Square theirKingSq = pos.king_square(them);
908       Bitboard b = ei.pi->passed_pawns() & pos.pawns(us), b2, b3, b4;
909
910       while(b) {
911         Square s = pop_1st_bit(&b);
912         assert(pos.piece_on(s) == pawn_of_color(us));
913         assert(pos.pawn_is_passed(us, s));
914
915         int r = int(pawn_rank(us, s) - RANK_2);
916         int tr = Max(0, r * (r-1));
917         Square blockSq = s + pawn_push(us);
918
919         // Base bonus based on rank:
920         Value mbonus = Value(20 * tr);
921         Value ebonus = Value(10 + r * r * 10);
922
923         // Adjust bonus based on king proximity:
924         ebonus -= Value(square_distance(ourKingSq, blockSq) * 3 * tr);
925         ebonus -=
926           Value(square_distance(ourKingSq, blockSq + pawn_push(us)) * 1 * tr);
927         ebonus += Value(square_distance(theirKingSq, blockSq) * 6 * tr);
928
929         // If the pawn is free to advance, increase bonus:
930         if(pos.square_is_empty(blockSq)) {
931
932           b2 = squares_in_front_of(us, s);
933           b3 = b2 & ei.attacked_by(them);
934           b4 = b2 & ei.attacked_by(us);
935           if((b2 & pos.pieces_of_color(them)) == EmptyBoardBB) {
936             // There are no enemy pieces in the pawn's path!  Are any of the
937             // squares in the pawn's path attacked by the enemy?
938             if(b3 == EmptyBoardBB)
939               // No enemy attacks, huge bonus!
940               ebonus += Value(tr * ((b2 == b4)? 17 : 15));
941             else
942               // OK, there are enemy attacks.  Are those squares which are
943               // attacked by the enemy also attacked by us?  If yes, big bonus
944               // (but smaller than when there are no enemy attacks), if no,
945               // somewhat smaller bonus.
946               ebonus += Value(tr * (((b3 & b4) == b3)? 13 : 8));
947           }
948           else {
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         // If the pawn is supported by a friendly pawn, increase bonus.
963         b2 = pos.pawns(us) & neighboring_files_bb(s);
964         if(b2 & rank_bb(s))
965           ebonus += Value(r * 20);
966         else if(pos.pawn_attacks(them, s) & b2)
967           ebonus += Value(r * 12);
968
969         // If the other side has only a king, check whether the pawn is
970         // unstoppable:
971         if(pos.non_pawn_material(them) == Value(0)) {
972           Square qsq;
973           int d;
974
975           qsq = relative_square(us, make_square(square_file(s), RANK_8));
976           d = square_distance(s, qsq) - square_distance(theirKingSq, qsq)
977             + ((us == pos.side_to_move())? 0 : 1);
978
979           if(d < 0) {
980             int mtg = RANK_8 - pawn_rank(us, s);
981             int blockerCount =
982               count_1s_max_15(squares_in_front_of(us,s)&pos.occupied_squares());
983             mtg += blockerCount;
984             d += blockerCount;
985             if(d < 0) {
986               hasUnstoppable[us] = true;
987               movesToGo[us] = Min(movesToGo[us], mtg);
988             }
989           }
990         }
991         // Rook pawns are a special case:  They are sometimes worse, and
992         // sometimes better than other passed pawns.  It is difficult to find
993         // good rules for determining whether they are good or bad.  For now,
994         // we try the following:  Increase the value for rook pawns if the
995         // other side has no pieces apart from a knight, and decrease the
996         // value if the other side has a rook or queen.
997         if(square_file(s) == FILE_A || square_file(s) == FILE_H) {
998           if(pos.non_pawn_material(them) == KnightValueMidgame
999              && pos.knight_count(them) == 1)
1000             ebonus += ebonus / 4;
1001           else if(pos.rooks_and_queens(them))
1002             ebonus -= ebonus / 4;
1003         }
1004
1005         // Add the scores for this pawn to the middle game and endgame eval.
1006         ei.mgValue += apply_weight(Sign[us] * mbonus, WeightPassedPawnsMidgame);
1007         ei.egValue += apply_weight(Sign[us] * ebonus, WeightPassedPawnsEndgame);
1008       }
1009     }
1010
1011     // Does either side have an unstoppable passed pawn?
1012     if(hasUnstoppable[WHITE] && !hasUnstoppable[BLACK])
1013       ei.egValue += UnstoppablePawnValue - Value(0x40 * movesToGo[WHITE]);
1014     else if(hasUnstoppable[BLACK] && !hasUnstoppable[WHITE])
1015       ei.egValue -= UnstoppablePawnValue - Value(0x40 * movesToGo[BLACK]);
1016     else if(hasUnstoppable[BLACK] && hasUnstoppable[WHITE]) {
1017       // Both sides have unstoppable pawns!  Try to find out who queens
1018       // first.  We begin by transforming 'movesToGo' to the number of
1019       // plies until the pawn queens for both sides:
1020       movesToGo[WHITE] *= 2;
1021       movesToGo[BLACK] *= 2;
1022       movesToGo[pos.side_to_move()]--;
1023
1024       // If one side queens at least three plies before the other, that
1025       // side wins:
1026       if(movesToGo[WHITE] <= movesToGo[BLACK] - 3)
1027         ei.egValue += UnstoppablePawnValue - Value(0x40 * (movesToGo[WHITE]/2));
1028       else if(movesToGo[BLACK] <= movesToGo[WHITE] - 3)
1029         ei.egValue -= UnstoppablePawnValue - Value(0x40 * (movesToGo[BLACK]/2));
1030
1031       // We could also add some rules about the situation when one side
1032       // queens exactly one ply before the other:  Does the first queen
1033       // check the opponent's king, or attack the opponent's queening square?
1034       // This is slightly tricky to get right, because it is possible that
1035       // the opponent's king has moved somewhere before the first pawn queens.
1036     }
1037   }
1038
1039
1040   // evaluate_trapped_bishop_a7h7() determines whether a bishop on a7/h7
1041   // (a2/h2 for black) is trapped by enemy pawns, and assigns a penalty
1042   // if it is.
1043
1044   void evaluate_trapped_bishop_a7h7(const Position &pos, Square s, Color us,
1045                                     EvalInfo &ei) {
1046     Piece pawn = pawn_of_color(opposite_color(us));
1047     Square b6, b8;
1048
1049     assert(square_is_ok(s));
1050     assert(pos.piece_on(s) == bishop_of_color(us));
1051
1052     if(square_file(s) == FILE_A) {
1053       b6 = relative_square(us, SQ_B6);
1054       b8 = relative_square(us, SQ_B8);
1055     }
1056     else {
1057       b6 = relative_square(us, SQ_G6);
1058       b8 = relative_square(us, SQ_G8);
1059     }
1060
1061     if(pos.piece_on(b6) == pawn && pos.see(s, b6) < 0 && pos.see(s, b8) < 0) {
1062       ei.mgValue -= Sign[us] * TrappedBishopA7H7Penalty;
1063       ei.egValue -= Sign[us] * TrappedBishopA7H7Penalty;
1064     }
1065
1066   }
1067
1068
1069   // evaluate_trapped_bishop_a1h1() determines whether a bishop on a1/h1
1070   // (a8/h8 for black) is trapped by a friendly pawn on b2/g2 (b7/g7 for
1071   // black), and assigns a penalty if it is.  This pattern can obviously
1072   // only occur in Chess960 games.
1073
1074   void evaluate_trapped_bishop_a1h1(const Position &pos, Square s, Color us,
1075                                     EvalInfo &ei) {
1076     Piece pawn = pawn_of_color(us);
1077     Square b2, b3, c3;
1078
1079     assert(Chess960);
1080     assert(square_is_ok(s));
1081     assert(pos.piece_on(s) == bishop_of_color(us));
1082
1083     if(square_file(s) == FILE_A) {
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       b2 = relative_square(us, SQ_G2);
1090       b3 = relative_square(us, SQ_G3);
1091       c3 = relative_square(us, SQ_F3);
1092     }
1093
1094     if(pos.piece_on(b2) == pawn) {
1095       Value penalty;
1096
1097       if(!pos.square_is_empty(b3))
1098         penalty = 2*TrappedBishopA1H1Penalty;
1099       else if(pos.piece_on(c3) == pawn)
1100         penalty = TrappedBishopA1H1Penalty;
1101       else
1102         penalty = TrappedBishopA1H1Penalty / 2;
1103
1104       ei.mgValue -= Sign[us] * penalty;
1105       ei.egValue -= Sign[us] * penalty;
1106     }
1107
1108   }
1109
1110
1111   // apply_weight applies an evaluation weight to a value.
1112
1113   inline Value apply_weight(Value v, int w) {
1114     return (v*w) / 0x100;
1115   }
1116
1117
1118   // scale_by_game_phase interpolates between a middle game and an endgame
1119   // score, based on game phase.  It also scales the return value by a
1120   // ScaleFactor array.
1121
1122   Value scale_by_game_phase(Value mv, Value ev, Phase ph, ScaleFactor sf[]) {
1123     assert(mv > -VALUE_INFINITE && mv < VALUE_INFINITE);
1124     assert(ev > -VALUE_INFINITE && ev < VALUE_INFINITE);
1125     assert(ph >= PHASE_ENDGAME && ph <= PHASE_MIDGAME);
1126
1127     if(ev > Value(0))
1128       ev = apply_scale_factor(ev, sf[WHITE]);
1129     else
1130       ev = apply_scale_factor(ev, sf[BLACK]);
1131
1132     // Superlinear interpolator
1133     int sli_ph = int(ph);
1134     sli_ph -= (64 - sli_ph) / 4;
1135     sli_ph = Min(PHASE_MIDGAME, Max(PHASE_ENDGAME, sli_ph)); // ceiling
1136
1137     Value result = Value(int((mv * sli_ph + ev * (128 - sli_ph)) / 128));
1138     return Value(int(result) & ~(GrainSize - 1));
1139   }
1140
1141
1142   // count_1s_8bit() counts the number of nonzero bits in the 8 least
1143   // significant bits of a Bitboard. This function is used by the king
1144   // shield evaluation.
1145
1146   int count_1s_8bit(Bitboard b) {
1147     return int(BitCount8Bit[b & 0xFF]);
1148   }
1149
1150
1151   // compute_weight() computes the value of an evaluation weight, by combining
1152   // an UCI-configurable weight with an internal weight.
1153
1154   int compute_weight(int uciWeight, int internalWeight) {
1155     uciWeight = (uciWeight * 0x100) / 100;
1156     return (uciWeight * internalWeight) / 0x100;
1157   }
1158
1159
1160   // init_safety() initizes the king safety evaluation, based on UCI
1161   // parameters.  It is called from read_weights().
1162
1163   void init_safety() {
1164     double a, b;
1165     int maxSlope, peak, i, j;
1166
1167     QueenContactCheckBonus = get_option_value_int("Queen Contact Check Bonus");
1168     RookContactCheckBonus = get_option_value_int("Rook Contact Check Bonus");
1169     QueenCheckBonus = get_option_value_int("Queen Check Bonus");
1170     RookCheckBonus = get_option_value_int("Rook Check Bonus");
1171     BishopCheckBonus = get_option_value_int("Bishop Check Bonus");
1172     KnightCheckBonus = get_option_value_int("Knight Check Bonus");
1173     DiscoveredCheckBonus = get_option_value_int("Discovered Check Bonus");
1174     MateThreatBonus = get_option_value_int("Mate Threat Bonus");
1175
1176     a = get_option_value_int("King Safety Coefficient") / 100.0;
1177     b = get_option_value_int("King Safety X Intercept") * 1.0;
1178     maxSlope = get_option_value_int("King Safety Max Slope");
1179     peak = (get_option_value_int("King Safety Max Value") * 256) / 100;
1180
1181     for(i = 0; i < 100; i++) {
1182       if(i < b) SafetyTable[i] = Value(0);
1183       else if(get_option_value_string("King Safety Curve") == "Quadratic")
1184         SafetyTable[i] = Value((int)(a * (i - b) * (i - b)));
1185       else if(get_option_value_string("King Safety Curve") == "Linear")
1186         SafetyTable[i] = Value((int)(100 * a * (i - b)));
1187     }
1188
1189     for(i = 0; i < 100; i++)
1190       if(SafetyTable[i+1] - SafetyTable[i] > maxSlope) {
1191         for(j = i + 1; j < 100; j++)
1192           SafetyTable[j] = SafetyTable[j-1] + Value(maxSlope);
1193       }
1194     for(i = 0; i < 100; i++)
1195       if(SafetyTable[i]  > Value(peak))
1196         SafetyTable[i] = Value(peak);
1197   }
1198
1199 }