X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fmaterial.cpp;h=27ea5923b492fc9caeb548a29e8dab6c1369da91;hp=eb271e8c94b6701c7eab1a308a451454f242cd76;hb=339bb8a524a0a6af093b383da9f61b31504be9fe;hpb=152f3b13b78d014dbc85204d6757e2cdf65e5ecf diff --git a/src/material.cpp b/src/material.cpp index eb271e8c..27ea5923 100644 --- a/src/material.cpp +++ b/src/material.cpp @@ -41,17 +41,17 @@ namespace { const Value BishopPairEndgameBonus = Value(97); // Polynomial material balance parameters - const Value RedundantQueenPenalty = Value(358); - const Value RedundantRookPenalty = Value(536); - const int LinearCoefficients[6] = { 1740, -146, -1246, -197, 206, -7 }; + const Value RedundantQueenPenalty = Value(320); + const Value RedundantRookPenalty = Value(554); + const int LinearCoefficients[6] = { 1709, -137, -1185, -166, 141, 59 }; const int QuadraticCoefficientsSameColor[][6] = { - { 0, 0, 0, 0, 0, 0 }, { 31, -4, 0, 0, 0, 0 }, { 14, 267, -21, 0, 0, 0 }, - { 0, 7, -26, 0, 0, 0 }, { -3, -1, 69, 162, 80, 0 }, { 40, 27, 119, 174, -64, -49 } }; + { 0, 0, 0, 0, 0, 0 }, { 33, -6, 0, 0, 0, 0 }, { 29, 269, -12, 0, 0, 0 }, + { 0, 19, -4, 0, 0, 0 }, { -35, -10, 40, 95, 50, 0 }, { 52, 23, 78, 144, -11, -33 } }; const int QuadraticCoefficientsOppositeColor[][6] = { - { 0, 0, 0, 0, 0, 0 }, { -9, 0, 0, 0, 0, 0 }, { 49, 32, 0, 0, 0, 0 }, - { -25, 19, -5, 0, 0, 0 }, { 97, -6, 39, -88, 0, 0 }, { 77, 69, -42, 104, 116, 0 } }; + { 0, 0, 0, 0, 0, 0 }, { -5, 0, 0, 0, 0, 0 }, { -33, 23, 0, 0, 0, 0 }, + { 17, 25, -3, 0, 0, 0 }, { 10, -2, -19, -67, 0, 0 }, { 69, 64, -41, 116, 137, 0 } }; // Unmapped endgame evaluation and scaling functions, these // are accessed direcly and not through the function maps. @@ -61,8 +61,6 @@ namespace { ScalingFunction ScaleKQKRP(WHITE), ScaleKRPKQ(BLACK); ScalingFunction ScaleKPsK(WHITE), ScaleKKPs(BLACK); ScalingFunction ScaleKPKPw(WHITE), ScaleKPKPb(BLACK); - - Key KNNKMaterialKey, KKNNMaterialKey; } @@ -157,14 +155,6 @@ MaterialInfo* MaterialInfoTable::get_material_info(const Position& pos) { mi->clear(); mi->key = key; - // A special case before looking for a specialized evaluation function - // KNN vs K is a draw. - if (key == KNNKMaterialKey || key == KKNNMaterialKey) - { - mi->factor[WHITE] = mi->factor[BLACK] = 0; - return mi; - } - // Let's look if we have a specialized evaluation function for this // particular material configuration. First we look for a fixed // configuration one, then a generic one if previous search failed. @@ -273,8 +263,10 @@ MaterialInfo* MaterialInfoTable::get_material_info(const Position& pos) { } // Evaluate the material balance - - const int bishopsPair_count[2] = { pos.piece_count(WHITE, BISHOP) > 1, pos.piece_count(BLACK, BISHOP) > 1 }; + const int pieceCount[2][6] = { { pos.piece_count(WHITE, BISHOP) > 1, pos.piece_count(WHITE, PAWN), pos.piece_count(WHITE, KNIGHT), + pos.piece_count(WHITE, BISHOP), pos.piece_count(WHITE, ROOK), pos.piece_count(WHITE, QUEEN) }, + { pos.piece_count(BLACK, BISHOP) > 1, pos.piece_count(BLACK, PAWN), pos.piece_count(BLACK, KNIGHT), + pos.piece_count(BLACK, BISHOP), pos.piece_count(BLACK, ROOK), pos.piece_count(BLACK, QUEEN) } }; Color c, them; int sign; int matValue = 0; @@ -307,29 +299,26 @@ MaterialInfo* MaterialInfoTable::get_material_info(const Position& pos) { // Redundancy of major pieces, formula based on Kaufman's paper // "The Evaluation of Material Imbalances in Chess" // http://mywebpages.comcast.net/danheisman/Articles/evaluation_of_material_imbalance.htm - if (pos.piece_count(c, ROOK) >= 1) - matValue -= sign * ((pos.piece_count(c, ROOK) - 1) * RedundantRookPenalty + pos.piece_count(c, QUEEN) * RedundantQueenPenalty); + if (pieceCount[c][ROOK] >= 1) + matValue -= sign * ((pieceCount[c][ROOK] - 1) * RedundantRookPenalty + pieceCount[c][QUEEN] * RedundantQueenPenalty); // Second-degree polynomial material imbalance by Tord Romstad // // We use NO_PIECE_TYPE as a place holder for the bishop pair "extended piece", // this allow us to be more flexible in defining bishop pair bonuses. them = opposite_color(c); - for (PieceType pt1 = NO_PIECE_TYPE; pt1 <= QUEEN; pt1++) + for (int pt1 = NO_PIECE_TYPE; pt1 <= QUEEN; pt1++) { - int c1, c2, c3; - c1 = sign * (pt1 != NO_PIECE_TYPE ? pos.piece_count(c, pt1) : bishopsPair_count[c]); + int c1 = sign * pieceCount[c][pt1]; if (!c1) continue; matValue += c1 * LinearCoefficients[pt1]; - for (PieceType pt2 = NO_PIECE_TYPE; pt2 <= pt1; pt2++) + for (int pt2 = NO_PIECE_TYPE; pt2 <= pt1; pt2++) { - c2 = (pt2 != NO_PIECE_TYPE ? pos.piece_count(c, pt2) : bishopsPair_count[c]); - c3 = (pt2 != NO_PIECE_TYPE ? pos.piece_count(them, pt2) : bishopsPair_count[them]); - matValue += c1 * c2 * QuadraticCoefficientsSameColor[pt1][pt2]; - matValue += c1 * c3 * QuadraticCoefficientsOppositeColor[pt1][pt2]; + matValue += c1 * pieceCount[c][pt2] * QuadraticCoefficientsSameColor[pt1][pt2]; + matValue += c1 * pieceCount[them][pt2] * QuadraticCoefficientsOppositeColor[pt1][pt2]; } } } @@ -348,9 +337,7 @@ MaterialInfo* MaterialInfoTable::get_material_info(const Position& pos) { EndgameFunctions::EndgameFunctions() { - KNNKMaterialKey = buildKey("KNNK"); - KKNNMaterialKey = buildKey("KKNN"); - + add >("KNNK"); add >("KPK"); add >("KBNK"); add >("KRKP");