X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fmaterial.cpp;h=22953cff6d8d4328706cb1ffe4299d46214d2c05;hp=3474ccd576c5e613c7fd3373b0e71edf6fd1ca1c;hb=4ede49cd850392f28bc9da9537c111d2c3f0b297;hpb=3e4dfb49a747be902d25ae06783f98ba29fb5030 diff --git a/src/material.cpp b/src/material.cpp index 3474ccd5..22953cff 100644 --- a/src/material.cpp +++ b/src/material.cpp @@ -35,18 +35,18 @@ namespace { const int NoPawnsSF[4] = { 6, 12, 32 }; // Polynomial material balance parameters - const Value RedundantQueenPenalty = Value(320); - const Value RedundantRookPenalty = Value(554); + const Value RedundantQueen = Value(320); + const Value RedundantRook = Value(554); // pair pawn knight bishop rook queen - const int LinearCoefficients[6] = { 1617, -162, -1172, -62, 105, 26 }; + const int LinearCoefficients[6] = { 1617, -162, -1172, -190, 105, 26 }; const int QuadraticCoefficientsSameColor[][PIECE_TYPE_NB] = { // pair pawn knight bishop rook queen { 7 }, // Bishop pair { 39, 2 }, // Pawn { 35, 271, -4 }, // Knight - { 7, 25, 4, 7 }, // Bishop + { 7, 105, 4, 7 }, // Bishop { -27, -2, 46, 100, 56 }, // Rook { 58, 29, 83, 148, -3, -25 } // Queen }; @@ -75,24 +75,24 @@ namespace { // Helper templates used to detect a given material distribution template bool is_KXK(const Position& pos) { const Color Them = (Us == WHITE ? BLACK : WHITE); - return pos.non_pawn_material(Them) == VALUE_ZERO - && pos.piece_count(Them, PAWN) == 0 - && pos.non_pawn_material(Us) >= RookValueMg; + return !pos.count(Them) + && pos.non_pawn_material(Them) == VALUE_ZERO + && pos.non_pawn_material(Us) >= RookValueMg; } template bool is_KBPsKs(const Position& pos) { - return pos.non_pawn_material(Us) == BishopValueMg - && pos.piece_count(Us, BISHOP) == 1 - && pos.piece_count(Us, PAWN) >= 1; + return pos.non_pawn_material(Us) == BishopValueMg + && pos.count(Us) == 1 + && pos.count(Us) >= 1; } template bool is_KQKRPs(const Position& pos) { const Color Them = (Us == WHITE ? BLACK : WHITE); - return pos.piece_count(Us, PAWN) == 0 - && pos.non_pawn_material(Us) == QueenValueMg - && pos.piece_count(Us, QUEEN) == 1 - && pos.piece_count(Them, ROOK) == 1 - && pos.piece_count(Them, PAWN) >= 1; + return !pos.count(Us) + && pos.non_pawn_material(Us) == QueenValueMg + && pos.count(Us) == 1 + && pos.count(Them) == 1 + && pos.count(Them) >= 1; } /// imbalance() calculates imbalance comparing piece count of each @@ -109,8 +109,8 @@ namespace { // Redundancy of major pieces, formula based on Kaufman's paper // "The Evaluation of Material Imbalances in Chess" if (pieceCount[Us][ROOK] > 0) - value -= RedundantRookPenalty * (pieceCount[Us][ROOK] - 1) - + RedundantQueenPenalty * pieceCount[Us][QUEEN]; + value -= RedundantRook * (pieceCount[Us][ROOK] - 1) + + RedundantQueen * pieceCount[Us][QUEEN]; // Second-degree polynomial material imbalance by Tord Romstad for (pt1 = NO_PIECE_TYPE; pt1 <= QUEEN; pt1++) @@ -150,7 +150,7 @@ Entry* probe(const Position& pos, Table& entries, Endgames& endgames) { if (e->key == key) return e; - memset(e, 0, sizeof(Entry)); + std::memset(e, 0, sizeof(Entry)); e->key = key; e->factor[WHITE] = e->factor[BLACK] = (uint8_t)SCALE_FACTOR_NORMAL; e->gamePhase = game_phase(pos); @@ -180,8 +180,8 @@ Entry* probe(const Position& pos, Table& entries, Endgames& endgames) { assert((pos.pieces(WHITE, KNIGHT) | pos.pieces(WHITE, BISHOP))); assert((pos.pieces(BLACK, KNIGHT) | pos.pieces(BLACK, BISHOP))); - if ( pos.piece_count(WHITE, BISHOP) + pos.piece_count(WHITE, KNIGHT) <= 2 - && pos.piece_count(BLACK, BISHOP) + pos.piece_count(BLACK, KNIGHT) <= 2) + if ( pos.count(WHITE) + pos.count(WHITE) <= 2 + && pos.count(BLACK) + pos.count(BLACK) <= 2) { e->evaluationFunction = &EvaluateKmmKm[pos.side_to_move()]; return e; @@ -221,17 +221,17 @@ Entry* probe(const Position& pos, Table& entries, Endgames& endgames) { if (npm_w + npm_b == VALUE_ZERO) { - if (pos.piece_count(BLACK, PAWN) == 0) + if (!pos.count(BLACK)) { - assert(pos.piece_count(WHITE, PAWN) >= 2); + assert(pos.count(WHITE) >= 2); e->scalingFunction[WHITE] = &ScaleKPsK[WHITE]; } - else if (pos.piece_count(WHITE, PAWN) == 0) + else if (!pos.count(WHITE)) { - assert(pos.piece_count(BLACK, PAWN) >= 2); + assert(pos.count(BLACK) >= 2); e->scalingFunction[BLACK] = &ScaleKPsK[BLACK]; } - else if (pos.piece_count(WHITE, PAWN) == 1 && pos.piece_count(BLACK, PAWN) == 1) + else if (pos.count(WHITE) == 1 && pos.count(BLACK) == 1) { // This is a special case because we set scaling functions // for both colors instead of only one. @@ -241,23 +241,23 @@ Entry* probe(const Position& pos, Table& entries, Endgames& endgames) { } // No pawns makes it difficult to win, even with a material advantage - if (pos.piece_count(WHITE, PAWN) == 0 && npm_w - npm_b <= BishopValueMg) + if (!pos.count(WHITE) && npm_w - npm_b <= BishopValueMg) { e->factor[WHITE] = (uint8_t) - (npm_w == npm_b || npm_w < RookValueMg ? 0 : NoPawnsSF[std::min(pos.piece_count(WHITE, BISHOP), 2)]); + (npm_w == npm_b || npm_w < RookValueMg ? 0 : NoPawnsSF[std::min(pos.count(WHITE), 2)]); } - if (pos.piece_count(BLACK, PAWN) == 0 && npm_b - npm_w <= BishopValueMg) + if (!pos.count(BLACK) && npm_b - npm_w <= BishopValueMg) { e->factor[BLACK] = (uint8_t) - (npm_w == npm_b || npm_b < RookValueMg ? 0 : NoPawnsSF[std::min(pos.piece_count(BLACK, BISHOP), 2)]); + (npm_w == npm_b || npm_b < RookValueMg ? 0 : NoPawnsSF[std::min(pos.count(BLACK), 2)]); } // Compute the space weight if (npm_w + npm_b >= 2 * QueenValueMg + 4 * RookValueMg + 2 * KnightValueMg) { - int minorPieceCount = pos.piece_count(WHITE, KNIGHT) + pos.piece_count(WHITE, BISHOP) - + pos.piece_count(BLACK, KNIGHT) + pos.piece_count(BLACK, BISHOP); + int minorPieceCount = pos.count(WHITE) + pos.count(WHITE) + + pos.count(BLACK) + pos.count(BLACK); e->spaceWeight = minorPieceCount * minorPieceCount; } @@ -266,10 +266,10 @@ Entry* probe(const Position& pos, Table& entries, Endgames& endgames) { // for the bishop pair "extended piece", this allow us to be more flexible // in defining bishop pair bonuses. const int pieceCount[COLOR_NB][PIECE_TYPE_NB] = { - { 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) } }; + { pos.count(WHITE) > 1, pos.count(WHITE), pos.count(WHITE), + pos.count(WHITE) , pos.count(WHITE), pos.count(WHITE) }, + { pos.count(BLACK) > 1, pos.count(BLACK), pos.count(BLACK), + pos.count(BLACK) , pos.count(BLACK), pos.count(BLACK) } }; e->value = (int16_t)((imbalance(pieceCount) - imbalance(pieceCount)) / 16); return e;