X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fmaterial.cpp;h=2718300d84474ec650e5e6696de05d9dce8707ae;hp=c7bb810d2869f6670e65c8099d11ca24eb666243;hb=d0e51bc0f0c77f93323aaa86c9c2485c41d38271;hpb=bb751d6c890f5c50c642366d601740366cfae8d0 diff --git a/src/material.cpp b/src/material.cpp index c7bb810d..2718300d 100644 --- a/src/material.cpp +++ b/src/material.cpp @@ -6,12 +6,12 @@ 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, 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 . */ @@ -49,14 +49,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 +179,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 +187,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 +255,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 +317,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 +366,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 +376,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);