]> git.sesse.net Git - stockfish/blobdiff - src/material.cpp
Update copyright info
[stockfish] / src / material.cpp
index c7bb810d2869f6670e65c8099d11ca24eb666243..9818fdce54c904b3378537b2b0f114caf221a597 100644 (file)
@@ -1,17 +1,18 @@
 /*
-  Glaurung, a UCI chess playing engine.
-  Copyright (C) 2004-2008 Tord Romstad
+  Stockfish, a UCI chess playing engine derived from Glaurung 2.1
+  Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
+  Copyright (C) 2008 Marco Costalba
 
-  Glaurung is free software: you can redistribute it and/or modify
+  Stockfish is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.
-  
-  Glaurung is distributed in the hope that it will be useful,
+
+  Stockfish is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
-  
+
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
@@ -49,14 +50,14 @@ namespace {
   Key KNPKMaterialKey, KKNPMaterialKey;
   Key KPKPMaterialKey;
 
-};
+}
 
 
 ////
 //// Functions
 ////
 
-/// MaterialInfo::init() is called during program initialization.  It 
+/// MaterialInfo::init() is called during program initialization.  It
 /// precomputes material hash keys for a few basic endgames, in order
 /// to make it easy to recognize such endgames when they occur.
 
@@ -179,7 +180,7 @@ void MaterialInfoTable::clear() {
 /// MaterialInfoTable::get_material_info() takes a position object as input,
 /// computes or looks up a MaterialInfo object, and returns a pointer to it.
 /// If the material configuration is not already present in the table, it
-/// is stored there, so we don't have to recompute everything when the 
+/// is stored there, so we don't have to recompute everything when the
 /// same material configuration occurs again.
 
 MaterialInfo *MaterialInfoTable::get_material_info(const Position &pos) {
@@ -187,7 +188,7 @@ MaterialInfo *MaterialInfoTable::get_material_info(const Position &pos) {
   int index = key & (size - 1);
   MaterialInfo *mi = entries + index;
 
-  // If mi->key matches the position's material hash key, it means that we 
+  // If mi->key matches the position's material hash key, it means that we
   // have analysed this material configuration before, and we can simply
   // return the information we found the last time instead of recomputing it:
   if(mi->key == key)
@@ -255,13 +256,13 @@ MaterialInfo *MaterialInfoTable::get_material_info(const Position &pos) {
     return mi;
   }
   else if(pos.non_pawn_material(BLACK) == Value(0) &&
-          pos.pawn_count(BLACK) == 0 &&
+          pos.piece_count(BLACK, PAWN) == 0 &&
           pos.non_pawn_material(WHITE) >= RookValueEndgame) {
     mi->evaluationFunction = &EvaluateKXK;
     return mi;
   }
   else if(pos.non_pawn_material(WHITE) == Value(0) &&
-          pos.pawn_count(WHITE) == 0 &&
+          pos.piece_count(WHITE, PAWN) == 0 &&
           pos.non_pawn_material(BLACK) >= RookValueEndgame) {
     mi->evaluationFunction = &EvaluateKKX;
     return mi;
@@ -317,48 +318,48 @@ MaterialInfo *MaterialInfoTable::get_material_info(const Position &pos) {
   }
 
   if(pos.non_pawn_material(WHITE) == BishopValueMidgame &&
-     pos.bishop_count(WHITE) == 1 && pos.pawn_count(WHITE) >= 1)
+     pos.piece_count(WHITE, BISHOP) == 1 && pos.piece_count(WHITE, PAWN) >= 1)
     mi->scalingFunction[WHITE] = &ScaleKBPK;
   if(pos.non_pawn_material(BLACK) == BishopValueMidgame &&
-     pos.bishop_count(BLACK) == 1 && pos.pawn_count(BLACK) >= 1)
+     pos.piece_count(BLACK, BISHOP) == 1 && pos.piece_count(BLACK, PAWN) >= 1)
     mi->scalingFunction[BLACK] = &ScaleKKBP;
 
-  if(pos.pawn_count(WHITE) == 0 &&
+  if(pos.piece_count(WHITE, PAWN) == 0 &&
      pos.non_pawn_material(WHITE) == QueenValueMidgame &&
-     pos.queen_count(WHITE) == 1 &&
-     pos.rook_count(BLACK) == 1 && pos.pawn_count(BLACK) >= 1)
+     pos.piece_count(WHITE, QUEEN) == 1 &&
+     pos.piece_count(BLACK, ROOK) == 1 && pos.piece_count(BLACK, PAWN) >= 1)
     mi->scalingFunction[WHITE] = &ScaleKQKRP;
-  else if(pos.pawn_count(BLACK) == 0 &&
+  else if(pos.piece_count(BLACK, PAWN) == 0 &&
           pos.non_pawn_material(BLACK) == QueenValueMidgame &&
-          pos.queen_count(BLACK) == 1 &&
-          pos.rook_count(WHITE) == 1 && pos.pawn_count(WHITE) >= 1)
+          pos.piece_count(BLACK, QUEEN) == 1 &&
+          pos.piece_count(WHITE, ROOK) == 1 && pos.piece_count(WHITE, PAWN) >= 1)
     mi->scalingFunction[BLACK] = &ScaleKRPKQ;
 
   if(pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK) == Value(0)) {
-    if(pos.pawn_count(BLACK) == 0) {
-      assert(pos.pawn_count(WHITE) >= 2);
+    if(pos.piece_count(BLACK, PAWN) == 0) {
+      assert(pos.piece_count(WHITE, PAWN) >= 2);
       mi->scalingFunction[WHITE] = &ScaleKPsK;
     }
-    else if(pos.pawn_count(WHITE) == 0) {
-      assert(pos.pawn_count(BLACK) >= 2);
+    else if(pos.piece_count(WHITE, PAWN) == 0) {
+      assert(pos.piece_count(BLACK, PAWN) >= 2);
       mi->scalingFunction[BLACK] = &ScaleKKPs;
     }
-    else if(pos.pawn_count(WHITE) == 1 && pos.pawn_count(BLACK) == 1) {
+    else if(pos.piece_count(WHITE, PAWN) == 1 && pos.piece_count(BLACK, PAWN) == 1) {
       mi->scalingFunction[WHITE] = &ScaleKPKPw;
       mi->scalingFunction[BLACK] = &ScaleKPKPb;
     }
   }
 
   // Evaluate the material balance.
-  
+
   Color c;
   int sign;
   Value egValue = Value(0), mgValue = Value(0);
-  
+
   for(c = WHITE, sign = 1; c <= BLACK; c++, sign = -sign) {
 
     // No pawns makes it difficult to win, even with a material advantage:
-    if(pos.pawn_count(c) == 0 &&
+    if(pos.piece_count(c, PAWN) == 0 &&
        pos.non_pawn_material(c) - pos.non_pawn_material(opposite_color(c))
        <= BishopValueMidgame) {
       if(pos.non_pawn_material(c) == pos.non_pawn_material(opposite_color(c)))
@@ -366,7 +367,7 @@ MaterialInfo *MaterialInfoTable::get_material_info(const Position &pos) {
       else if(pos.non_pawn_material(c) < RookValueMidgame)
         mi->factor[c] = 0;
       else {
-        switch(pos.bishop_count(c)) {
+        switch(pos.piece_count(c, BISHOP)) {
         case 2:
           mi->factor[c] = 32; break;
         case 1:
@@ -376,27 +377,27 @@ MaterialInfo *MaterialInfoTable::get_material_info(const Position &pos) {
         }
       }
     }
-    
+
     // Bishop pair:
-    if(pos.bishop_count(c) >= 2) {
+    if(pos.piece_count(c, BISHOP) >= 2) {
       mgValue += sign * BishopPairMidgameBonus;
       egValue += sign * BishopPairEndgameBonus;
     }
 
-    // Knights are stronger when there are many pawns on the board.  The 
+    // Knights are stronger when there are many pawns on the board.  The
     // formula is taken from Larry Kaufman's paper "The Evaluation of Material
-    // Imbalances in Chess": 
+    // Imbalances in Chess":
     // http://mywebpages.comcast.net/danheisman/Articles/evaluation_of_material_imbalance.htm
-    mgValue += sign * Value(pos.knight_count(c)*(pos.pawn_count(c)-5)*16);
-    egValue += sign * Value(pos.knight_count(c)*(pos.pawn_count(c)-5)*16);
+    mgValue += sign * Value(pos.piece_count(c, KNIGHT)*(pos.piece_count(c, PAWN)-5)*16);
+    egValue += sign * Value(pos.piece_count(c, KNIGHT)*(pos.piece_count(c, PAWN)-5)*16);
 
     // Redundancy of major pieces, again based on Kaufman's paper:
-    if(pos.rook_count(c) >= 1) {
-      Value v = Value((pos.rook_count(c) - 1) * 32 + pos.queen_count(c) * 16);
+    if(pos.piece_count(c, ROOK) >= 1) {
+      Value v = Value((pos.piece_count(c, ROOK) - 1) * 32 + pos.piece_count(c, QUEEN) * 16);
       mgValue -= sign * v;
       egValue -= sign * v;
     }
-      
+
   }
 
   mi->mgValue = int16_t(mgValue);