From: Stéphane Nicolet Date: Sun, 29 Jul 2018 23:41:04 +0000 (+0200) Subject: Introduce tropism measure in king danger X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=ba2a2c34bb3098648d6f772a4b26d84d761afe2e Introduce tropism measure in king danger This patch adds the tropism measure as a new term in the king danger variable. Since we then trasform this variable as a Score via a quadratic formula, the main effect of the patch is the positive correlation of the tropism measure with some checks and pins information already present in the king danger code. STC: LLR: 2.96 (-2.94,2.94) [0.00,5.00] Total: 6805 W: 1597 L: 1431 D: 3777 http://tests.stockfishchess.org/tests/view/5b5df8d10ebc5902bdb91699 LTC: LLR: 2.96 (-2.94,2.94) [0.00,5.00] Total: 32872 W: 5782 L: 5523 D: 21567 http://tests.stockfishchess.org/tests/view/5b5e08d80ebc5902bdb917ee How to continue from there? • it may be possible to use CloseEnemies=S(7,0) • we may want to try incorporating other strategic features in the quadratic king danger. Closes https://github.com/official-stockfish/Stockfish/pull/1717 Bench: 5591925 --- diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 964a3870..c54b6d30 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -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);