X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fevaluate.cpp;h=3ba219cb90af808c2801ae0925e9d597e60c3d2a;hp=9202c9ed3d861d58c5cda2b45be52b9bb6b2557a;hb=24df0f72c0bb1f6fcc28882995be41b17772ce3e;hpb=6b4959e3e00035dbcabd74a6d49ce7d04008d62c diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 9202c9ed..3ba219cb 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -88,7 +88,7 @@ namespace { // kingRing[color] is the zone around the king which is considered // by the king safety evaluation. This consists of the squares directly - // adjacent to the king, and the three (or two, for a king on an edge file) + // adjacent to the king, and (only for a king on its first rank) the // squares two ranks in front of the king. For instance, if black's king // is on g8, kingRing[BLACK] is a bitboard containing the squares f8, h8, // f7, g7, h7, f6, g6 and h6. @@ -174,8 +174,8 @@ namespace { S(-20,-12), S( 1, -8), S( 2, 10), S( 9, 10) }; - // KingProtector[PieceType-2] * "distance to own king" determines a bonus for each piece. - const Score KingProtector[] = {S(-3, -5), S(-4, -3), S(-3, 0), S(-1, 1) }; + // KingProtector[PieceType-2] contains a bonus according to distance from king + const Score KingProtector[] = { S(-3, -5), S(-4, -3), S(-3, 0), S(-1, 1) }; // Assorted bonuses and penalties used by evaluation const Score MinorBehindPawn = S( 16, 0); @@ -240,9 +240,12 @@ namespace { ei.attackedBy[Us][ALL_PIECES] = b | ei.attackedBy[Us][PAWN]; // Init our king safety tables only if we are going to use them - if (pos.non_pawn_material(Them) >= QueenValueMg) + if (pos.non_pawn_material(Them) >= RookValueMg + KnightValueMg) { - ei.kingRing[Us] = b | shift(b); + ei.kingRing[Us] = b; + if (relative_rank(Us, pos.square(Us)) == RANK_1) + ei.kingRing[Us] |= shift(b); + ei.kingAttackersCount[Them] = popcount(b & ei.pe->pawn_attacks(Them)); ei.kingAdjacentZoneAttacksCount[Them] = ei.kingAttackersWeight[Them] = 0; } @@ -291,9 +294,10 @@ namespace { int mob = popcount(b & ei.mobilityArea[Us]); - mobility[Us] += MobilityBonus[Pt-2][mob]; + mobility[Us] += MobilityBonus[Pt - 2][mob]; - score += KingProtector[Pt-2] * distance(s, pos.square(Us)); + // Bonus for this piece as a king protector + score += KingProtector[Pt - 2] * distance(s, pos.square(Us)); if (Pt == BISHOP || Pt == KNIGHT) { @@ -401,7 +405,7 @@ namespace { Score score = ei.pe->king_safety(pos, ksq); // Main king safety evaluation - if (ei.kingAttackersCount[Them]) + if (ei.kingAttackersCount[Them] > (1 - pos.count(Them))) { // Find the attacked squares which are defended only by our king... undefended = ei.attackedBy[Them][ALL_PIECES] @@ -422,7 +426,8 @@ namespace { + 201 * popcount(undefended) + 143 * (popcount(b) + !!pos.pinned_pieces(Us)) - 848 * !pos.count(Them) - - 28 * mg_value(score) / 25 - 5; + - 9 * mg_value(score) / 8 + + 40; // Analyse the safe enemy's checks which are possible on next move safe = ~pos.pieces(Them); @@ -471,7 +476,7 @@ namespace { // Transform the kingDanger units into a Score, and substract it from the evaluation if (kingDanger > 0) - score -= make_score(kingDanger * kingDanger / 4096, 0); + score -= make_score(kingDanger * kingDanger / 4096, kingDanger / 16); } // King tropism: firstly, find squares that opponent attacks in our king flank @@ -890,7 +895,7 @@ std::string Eval::trace(const Position& pos) { << " Imbalance | " << Term(IMBALANCE) << " Pawns | " << Term(PAWN) << " Knights | " << Term(KNIGHT) - << " Bishop | " << Term(BISHOP) + << " Bishops | " << Term(BISHOP) << " Rooks | " << Term(ROOK) << " Queens | " << Term(QUEEN) << " Mobility | " << Term(MOBILITY)