Introduce scale factor in pawn evaluation
[stockfish] / src / pawns.cpp
index df7a0a2d3c507a1215b281b0a2ca6e4e4853c602..b381b5c4abc3f567cec33c1b7a68964c70e65adf 100644 (file)
@@ -70,6 +70,13 @@ namespace {
     S(34,68), S(83,166), S(0, 0), S( 0, 0)
   };
 
+  // UnpairedPawnsTable[] gives a score according to the number
+  // of panws that do not have an enemy pawn in front of them.
+  const int UnpairedPawnsTable[8] = {
+    SCALE_FACTOR_NORMAL, SCALE_FACTOR_NORMAL, SCALE_FACTOR_NORMAL, SCALE_FACTOR_NORMAL,
+    SCALE_FACTOR_NORMAL, SCALE_FACTOR_NORMAL, SCALE_FACTOR_NORMAL, SCALE_FACTOR_NORMAL
+  };
+
   // Pawn storm tables for positions with opposite castling
   const int QStormTable[64] = {
     0,  0,  0,  0, 0, 0, 0, 0,
@@ -187,6 +194,7 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns,
   int bonus;
   Score value = make_score(0, 0);
   const Square* ptr = pos.piece_list_begin(Us, PAWN);
+  int unpairedPawnsNum = pos.piece_count(Us, PAWN);
 
   // Initialize pawn storm scores by giving bonuses for open files
   for (f = FILE_A; f <= FILE_H; f++)
@@ -211,6 +219,10 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns,
       doubled  = ourPawns & squares_behind(Us, s);
       opposed  = theirPawns & squares_in_front_of(Us, s);
 
+      // Decrease number of unpaired pawns
+      if (opposed)
+          unpairedPawnsNum--;
+
       // We calculate kingside and queenside pawn storm
       // scores for both colors. These are used when evaluating
       // middle game positions with opposite side castling.
@@ -337,6 +349,9 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns,
           value += CandidateBonus[relative_rank(Us, s)];
   }
 
+  // Calculate a scale factor to be used to evaluate if position is drawish
+  pi->factor[Us] = UnpairedPawnsTable[unpairedPawnsNum];
+
   return value;
 }