From 53239d7d3df44208a915fce84a5745101d3a2ea6 Mon Sep 17 00:00:00 2001 From: Rocky640 Date: Sat, 11 Nov 2017 07:37:29 -0500 Subject: [PATCH] Simplify some kingring penalties expressions The new "weak" expression helps simplify the safe check calculations for rooks or minors, (but the end result for all the safe checks is the exactly the same as in current master) The only functional change is for the "outer king ring" (for example, squares f3 g3 h3 when white king is on g1). In current master, there was a 191 penalty if any of these was not defended at all. With this pr, there is this 191 penalty if any of these is not defended at all or is only defended by a white queen. Tested as a simplification STC http://tests.stockfishchess.org/tests/view/59fb03d80ebc590ccbb89fee LLR: 2.96 (-2.94,2.94) [-3.00,1.00] Total: 66167 W: 12015 L: 11971 D: 42181 (against master (Update Copyright year inMakefile)) LTC http://tests.stockfishchess.org/tests/view/5a0106ae0ebc590ccbb8a55f LLR: 2.96 (-2.94,2.94) [-3.00,1.00] Total: 15790 W: 2095 L: 1968 D: 11727 (against master (Handle BxN trade as good capture when history scor)) same as #1296 but rebased on latest master bench: 5109559 --- src/evaluate.cpp | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/src/evaluate.cpp b/src/evaluate.cpp index ee93f11f..39dac6d1 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -421,7 +421,7 @@ namespace { : AllSquares ^ Rank1BB ^ Rank2BB ^ Rank3BB); const Square ksq = pos.square(Us); - Bitboard kingOnlyDefended, undefended, b, b1, b2, safe, other; + Bitboard weak, b, b1, b2, safe, other; int kingDanger; // King shelter and enemy pawns storm @@ -430,16 +430,10 @@ namespace { // Main king safety evaluation if (kingAttackersCount[Them] > (1 - pos.count(Them))) { - // Find the attacked squares which are defended only by our king... - kingOnlyDefended = attackedBy[Them][ALL_PIECES] - & attackedBy[Us][KING] - & ~attackedBy2[Us]; - - // ... and those which are not defended at all in the larger king ring - undefended = attackedBy[Them][ALL_PIECES] - & ~attackedBy[Us][ALL_PIECES] - & kingRing[Us] - & ~pos.pieces(Them); + // Attacked squares defended at most once by our queen or king + weak = attackedBy[Them][ALL_PIECES] + & ~attackedBy2[Us] + & (attackedBy[Us][KING] | attackedBy[Us][QUEEN] | ~attackedBy[Us][ALL_PIECES]); // Initialize the 'kingDanger' variable, which will be transformed // later into a king danger score. The initial value is based on the @@ -448,7 +442,7 @@ namespace { // the quality of the pawn shelter (current 'score' value). kingDanger = kingAttackersCount[Them] * kingAttackersWeight[Them] + 102 * kingAdjacentZoneAttacksCount[Them] - + 191 * popcount(kingOnlyDefended | undefended) + + 191 * popcount(kingRing[Us] & weak) + 143 * !!pos.pinned_pieces(Us) - 848 * !pos.count(Them) - 9 * mg_value(score) / 8 @@ -456,21 +450,15 @@ namespace { // Analyse the safe enemy's checks which are possible on next move safe = ~pos.pieces(Them); - safe &= ~attackedBy[Us][ALL_PIECES] | (kingOnlyDefended & attackedBy2[Them]); + safe &= ~attackedBy[Us][ALL_PIECES] | (weak & attackedBy2[Them]); b1 = pos.attacks_from< ROOK>(ksq); b2 = pos.attacks_from(ksq); // Enemy queen safe checks - if ((b1 | b2) & attackedBy[Them][QUEEN] & safe) + if ((b1 | b2) & attackedBy[Them][QUEEN] & safe & ~attackedBy[Us][QUEEN]) kingDanger += QueenCheck; - // For minors and rooks, also consider the square safe if attacked twice, - // and only defended by our queen. - safe |= attackedBy2[Them] - & ~(attackedBy2[Us] | pos.pieces(Them)) - & attackedBy[Us][QUEEN]; - // Some other potential checks are also analysed, even from squares // currently occupied by the opponent own pieces, as long as the square // is not attacked by our pawns, and is not occupied by a blocked pawn. -- 2.39.2