X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fevaluate.cpp;h=2c5f130343ecc1f58bbe02a0eaaaad1928faa7eb;hb=a753e20bd4fc1e916f7e99884c01bb63fd7c1326;hp=4b9960d530672d2a9113112eade7e20f274e33bc;hpb=cf4a38e0cb05d5de4ccdde0314e9e4bbeb70e165;p=stockfish diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 4b9960d5..2c5f1303 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -75,7 +75,6 @@ namespace { Material::Entry* me; Pawns::Entry* pe; - Bitboard pinnedPieces[COLOR_NB]; Bitboard mobilityArea[COLOR_NB]; // attackedBy[color][piece type] is a bitboard representing all squares @@ -210,7 +209,6 @@ namespace { const int KingAttackWeights[PIECE_TYPE_NB] = { 0, 0, 78, 56, 45, 11 }; // Penalties for enemy's safe checks - const int QueenContactCheck = 997; const int QueenCheck = 745; const int RookCheck = 688; const int BishopCheck = 588; @@ -230,8 +228,6 @@ namespace { const Square Down = (Us == WHITE ? SOUTH : NORTH); const Bitboard LowRanks = (Us == WHITE ? Rank2BB | Rank3BB: Rank7BB | Rank6BB); - ei.pinnedPieces[Us] = pos.pinned_pieces(Us); - // Find our pawns on the first two ranks, and those which are blocked Bitboard b = pos.pieces(Us, PAWN) & (shift(pos.pieces()) | LowRanks); @@ -283,7 +279,7 @@ namespace { : Pt == ROOK ? attacks_bb< ROOK>(s, pos.pieces() ^ pos.pieces(Us, ROOK, QUEEN)) : pos.attacks_from(s); - if (ei.pinnedPieces[Us] & s) + if (pos.pinned_pieces(Us) & s) b &= LineBB[pos.square(Us)][s]; ei.attackedBy2[Us] |= ei.attackedBy[Us][ALL_PIECES] & b; @@ -296,11 +292,6 @@ namespace { ei.kingAdjacentZoneAttacksCount[Us] += popcount(b & ei.attackedBy[Them][KING]); } - if (Pt == QUEEN) - b &= ~( ei.attackedBy[Them][KNIGHT] - | ei.attackedBy[Them][BISHOP] - | ei.attackedBy[Them][ROOK]); - int mob = popcount(b & ei.mobilityArea[Us]); mobility[Us] += MobilityBonus[Pt][mob]; @@ -429,19 +420,13 @@ namespace { kingDanger = std::min(807, ei.kingAttackersCount[Them] * ei.kingAttackersWeight[Them]) + 101 * ei.kingAdjacentZoneAttacksCount[Them] + 235 * popcount(undefended) - + 134 * (popcount(b) + !!ei.pinnedPieces[Us]) + + 134 * (popcount(b) + !!pos.pinned_pieces(Us)) - 717 * !pos.count(Them) - 7 * mg_value(score) / 5 - 5; - // Analyse the enemy's safe queen contact checks. Firstly, find the - // undefended squares around our king reachable by the enemy queen... - b = undefended & ei.attackedBy[Them][QUEEN] & ~pos.pieces(Them); - - // ...and keep squares supported by another enemy piece. - kingDanger += QueenContactCheck * popcount(b & ei.attackedBy2[Them]); - // Analyse the safe enemy's checks which are possible on next move - safe = ~(ei.attackedBy[Us][ALL_PIECES] | pos.pieces(Them)); + safe = ~pos.pieces(Them); + safe &= ~ei.attackedBy[Us][ALL_PIECES] | (undefended & ei.attackedBy2[Them]); b1 = pos.attacks_from(ksq); b2 = pos.attacks_from(ksq); @@ -609,10 +594,11 @@ namespace { } - // evaluate_passed_pawns() evaluates the passed pawns of the given color + // evaluate_passer_pawns() evaluates the passed pawns and candidate passed + // pawns of the given color. template - Score evaluate_passed_pawns(const Position& pos, const EvalInfo& ei) { + Score evaluate_passer_pawns(const Position& pos, const EvalInfo& ei) { const Color Them = (Us == WHITE ? BLACK : WHITE); @@ -625,7 +611,6 @@ namespace { { Square s = pop_lsb(&b); - assert(pos.pawn_passed(Us, s)); assert(!(pos.pieces(PAWN) & forward_bb(Us, s))); bb = forward_bb(Us, s) & (ei.attackedBy[Them][ALL_PIECES] | pos.pieces(Them)); @@ -686,6 +671,11 @@ namespace { if (!pos.non_pawn_material(Them)) ebonus += 20; + // Scale down bonus for candidate passers which need more than one pawn + // push to become passed. + if (!pos.pawn_passed(Us, s + pawn_push(Us))) + mbonus /= 2, ebonus /= 2; + score += make_score(mbonus, ebonus) + PassedFile[file_of(s)]; } @@ -765,8 +755,7 @@ namespace { // If we don't already have an unusual scale factor, check for certain // types of endgames, and use a lower scale for those. - if ( ei.me->game_phase() < PHASE_MIDGAME - && (sf == SCALE_FACTOR_NORMAL || sf == SCALE_FACTOR_ONEPAWN)) + if (sf == SCALE_FACTOR_NORMAL || sf == SCALE_FACTOR_ONEPAWN) { if (pos.opposite_bishops()) { @@ -774,19 +763,18 @@ namespace { // is almost a draw, in case of KBP vs KB, it is even more a draw. if ( pos.non_pawn_material(WHITE) == BishopValueMg && pos.non_pawn_material(BLACK) == BishopValueMg) - sf = more_than_one(pos.pieces(PAWN)) ? ScaleFactor(31) : ScaleFactor(9); + return more_than_one(pos.pieces(PAWN)) ? ScaleFactor(31) : ScaleFactor(9); // Endgame with opposite-colored bishops, but also other pieces. Still // a bit drawish, but not as drawish as with only the two bishops. - else - sf = ScaleFactor(46); + return ScaleFactor(46); } // Endings where weaker side can place his king in front of the opponent's // pawns are drawish. else if ( abs(eg) <= BishopValueEg && pos.count(strongSide) <= 2 && !pos.pawn_passed(~strongSide, pos.square(~strongSide))) - sf = ScaleFactor(37 + 7 * pos.count(strongSide)); + return ScaleFactor(37 + 7 * pos.count(strongSide)); } return sf; @@ -847,8 +835,8 @@ Value Eval::evaluate(const Position& pos) { - evaluate_threats(pos, ei); // Evaluate passed pawns, we need full attack information including king - score += evaluate_passed_pawns(pos, ei) - - evaluate_passed_pawns(pos, ei); + score += evaluate_passer_pawns(pos, ei) + - evaluate_passer_pawns(pos, ei); // Evaluate space for both sides, only during opening if (pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK) >= 12222)