X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fevaluate.cpp;h=ac8bde741a385650f9a8155025fbfd99f03c5746;hp=964a3870b7ded986f721b46f35fab93f23332e77;hb=e846a9306d6108fb24cb216689867777ac2b0c4f;hpb=c08e05b494d54c7fc28621204382d77d3595d436 diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 964a3870..ac8bde74 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -158,7 +158,7 @@ namespace { constexpr Score BishopPawns = S( 3, 7); constexpr Score CloseEnemies = S( 6, 0); constexpr Score CorneredBishop = S( 50, 50); - constexpr Score Hanging = S( 52, 30); + constexpr Score Hanging = S( 57, 32); constexpr Score HinderPassedPawn = S( 8, 0); constexpr Score KingProtector = S( 6, 6); constexpr Score KnightOnQueen = S( 21, 11); @@ -166,7 +166,7 @@ namespace { constexpr Score MinorBehindPawn = S( 16, 0); constexpr Score Overload = S( 13, 6); constexpr Score PawnlessFlank = S( 19, 84); - constexpr Score RookOnPawn = S( 8, 24); + constexpr Score RookOnPawn = S( 10, 30); constexpr Score SliderOnQueen = S( 42, 21); constexpr Score ThreatByKing = S( 23, 76); constexpr Score ThreatByPawnPush = S( 45, 40); @@ -413,11 +413,19 @@ namespace { : AllSquares ^ Rank1BB ^ Rank2BB ^ Rank3BB); const Square ksq = pos.square(Us); - Bitboard weak, b, b1, b2, safe, unsafeChecks; + Bitboard kingFlank, weak, b, b1, b2, safe, unsafeChecks; // King shelter and enemy pawns storm Score score = pe->king_safety(pos, ksq); + // Find the squares that opponent attacks in our king flank, and the squares + // which are attacked twice in that flank but not defended by our pawns. + kingFlank = KingFlank[file_of(ksq)]; + b1 = attackedBy[Them][ALL_PIECES] & kingFlank & Camp; + b2 = b1 & attackedBy2[Them] & ~attackedBy[Us][PAWN]; + + int tropism = popcount(b1) + popcount(b2); + // Main king safety evaluation if (kingAttackersCount[Them] > 1 - pos.count(Them)) { @@ -470,9 +478,10 @@ namespace { + 69 * kingAttacksCount[Them] + 185 * popcount(kingRing[Us] & weak) + 129 * popcount(pos.blockers_for_king(Us) | unsafeChecks) + + 4 * tropism - 873 * !pos.count(Them) - 6 * mg_value(score) / 8 - - 2 ; + - 30; // Transform the kingDanger units into a Score, and subtract it from the evaluation if (kingDanger > 0) @@ -483,19 +492,12 @@ namespace { } } - Bitboard kf = KingFlank[file_of(ksq)]; - // Penalty when our king is on a pawnless flank - if (!(pos.pieces(PAWN) & kf)) + if (!(pos.pieces(PAWN) & kingFlank)) score -= PawnlessFlank; - // Find the squares that opponent attacks in our king flank, and the squares - // which are attacked twice in that flank but not defended by our pawns. - b1 = attackedBy[Them][ALL_PIECES] & kf & Camp; - b2 = b1 & attackedBy2[Them] & ~attackedBy[Us][PAWN]; - - // King tropism, to anticipate slow motion attacks on our king - score -= CloseEnemies * (popcount(b1) + popcount(b2)); + // King tropism bonus, to anticipate slow motion attacks on our king + score -= CloseEnemies * tropism; if (T) Trace::add(KING, Us, score); @@ -716,14 +718,14 @@ namespace { template template Score Evaluation::space() const { + if (pos.non_pawn_material() < SpaceThreshold) + return SCORE_ZERO; + constexpr Color Them = (Us == WHITE ? BLACK : WHITE); constexpr Bitboard SpaceMask = Us == WHITE ? CenterFiles & (Rank2BB | Rank3BB | Rank4BB) : CenterFiles & (Rank7BB | Rank6BB | Rank5BB); - if (pos.non_pawn_material() < SpaceThreshold) - return SCORE_ZERO; - // Find the available squares for our pieces inside the area defined by SpaceMask Bitboard safe = SpaceMask & ~pos.pieces(Us, PAWN) @@ -756,16 +758,12 @@ namespace { int outflanking = distance(pos.square(WHITE), pos.square(BLACK)) - distance(pos.square(WHITE), pos.square(BLACK)); - bool pawnsOnBothFlanks = (pos.pieces(PAWN) & QueenSide) - && (pos.pieces(PAWN) & KingSide); - // Compute the initiative bonus for the attacking side int complexity = 8 * pe->pawn_asymmetry() + 12 * pos.count() + 12 * outflanking - + 16 * pawnsOnBothFlanks + 48 * !pos.non_pawn_material() - -136 ; + -110 ; // Now apply the bonus: note that we find the attacking side by extracting // the sign of the endgame value, and that we carefully cap the bonus so