]> git.sesse.net Git - stockfish/blobdiff - src/material.cpp
Revert "Remove questionable gcc flags from profile-build"
[stockfish] / src / material.cpp
index 56ad39d3619275b18bf86ee908f97b39ec5ce6ec..114f083171fe748423c83070cb619d853ad44096 100644 (file)
@@ -53,9 +53,15 @@ namespace {
     { 101,  100, -37,   141,  268,    0 }  // Queen
   };
 
-  // PawnsSet[count] contains a bonus/malus indexed by number of pawns
-  const int PawnsSet[FILE_NB + 1] = {
-     24, -32, 107, -51, 117, -9, -126, -21, 31
+  // PawnSet[pawn count] contains a bonus/malus indexed by number of pawns
+  const int PawnSet[] = {
+    24, -32, 107, -51, 117, -9, -126, -21, 31
+  };
+
+  // QueenMinorsImbalance[opp_minor_count] is applied when only one side has a queen.
+  // It contains a bonus/malus for the side with the queen.
+  const int QueenMinorsImbalance[16] = { 
+    31, -8, -15, -25, -5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
   };
 
   // Endgame evaluation and scaling functions are accessed directly and not through
@@ -94,7 +100,7 @@ namespace {
 
     const Color Them = (Us == WHITE ? BLACK : WHITE);
 
-    int bonus = PawnsSet[pieceCount[Us][PAWN]];
+    int bonus = PawnSet[pieceCount[Us][PAWN]];
 
     // Second-degree polynomial material imbalance by Tord Romstad
     for (int pt1 = NO_PIECE_TYPE; pt1 <= QUEEN; ++pt1)
@@ -111,6 +117,10 @@ namespace {
         bonus += pieceCount[Us][pt1] * v;
     }
 
+    // Special handling of Queen vs. Minors
+    if  (pieceCount[Us][QUEEN] == 1 && pieceCount[Them][QUEEN] == 0)
+         bonus += QueenMinorsImbalance[pieceCount[Them][KNIGHT] + pieceCount[Them][BISHOP]];
+
     return bonus;
   }
 
@@ -155,7 +165,7 @@ Entry* probe(const Position& pos) {
 
   if ((sf = pos.this_thread()->endgames.probe<ScaleFactor>(key)) != nullptr)
   {
-      e->scalingFunction[sf->strong_side()] = sf; // Only strong color assigned
+      e->scalingFunction[sf->strongSide] = sf; // Only strong color assigned
       return e;
   }