Skip to content

Commit 59d1037

Browse files
locutus2snicolet
authored andcommitted
Blocked pawn storm
In pawn structures like white pawns f6,h6 against black pawns f7,g6,h7 the attack on the king is blocked by the own pawns. So decrease the penalty for king safety. See diagram and discussion in #1434 A sample position that this patch wants to avoid is the following 1rr2bk1/3q1p1p/2n1bPpP/pp1pP3/2pP4/P1P1B3/1PBQN1P1/1K3R1R w - - 0 1 White pawn storm on the king side was a disaster, it locked the king side completely. Therefore, all the king tropism bonus that white have on the king side are useless, and kingadjacent attacks too. Master gives White a static +4.5 advantage, but White cannot win that game. The patch is lowering this evaluation artefact. STC: LLR: 2.94 (-2.94,2.94) [0.00,5.00] Total: 16467 W: 3750 L: 3537 D: 9180 http://tests.stockfishchess.org/tests/view/5a92102d0ebc590297cc87d0 LTC: LLR: 2.96 (-2.94,2.94) [0.00,5.00] Total: 64242 W: 11130 L: 10745 D: 42367 http://tests.stockfishchess.org/tests/view/5a923dc80ebc590297cc8806 This version includes reformatting and speed optimization by Alain Savard. Bench: 5643527
1 parent ad5d86c commit 59d1037

File tree

1 file changed

+11
-2
lines changed

1 file changed

+11
-2
lines changed

src/pawns.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,14 +237,20 @@ template<Color Us>
237237
Value Entry::shelter_storm(const Position& pos, Square ksq) {
238238

239239
const Color Them = (Us == WHITE ? BLACK : WHITE);
240+
const Bitboard ShelterMask = (Us == WHITE ? 1ULL << SQ_A2 | 1ULL << SQ_B3 | 1ULL << SQ_C2 | 1ULL << SQ_F2 | 1ULL << SQ_G3 | 1ULL << SQ_H2
241+
: 1ULL << SQ_A7 | 1ULL << SQ_B6 | 1ULL << SQ_C7 | 1ULL << SQ_F7 | 1ULL << SQ_G6 | 1ULL << SQ_H7);
242+
const Bitboard StormMask = (Us == WHITE ? 1ULL << SQ_A3 | 1ULL << SQ_C3 | 1ULL << SQ_F3 | 1ULL << SQ_H3
243+
: 1ULL << SQ_A6 | 1ULL << SQ_C6 | 1ULL << SQ_F6 | 1ULL << SQ_H6);
240244

241245
enum { BlockedByKing, Unopposed, BlockedByPawn, Unblocked };
242246

243-
Bitboard b = pos.pieces(PAWN) & (forward_ranks_bb(Us, ksq) | rank_bb(ksq));
247+
File center = std::max(FILE_B, std::min(FILE_G, file_of(ksq)));
248+
Bitboard b = pos.pieces(PAWN)
249+
& (forward_ranks_bb(Us, ksq) | rank_bb(ksq))
250+
& (adjacent_files_bb(center) | file_bb(center));
244251
Bitboard ourPawns = b & pos.pieces(Us);
245252
Bitboard theirPawns = b & pos.pieces(Them);
246253
Value safety = MaxSafetyBonus;
247-
File center = std::max(FILE_B, std::min(FILE_G, file_of(ksq)));
248254

249255
for (File f = File(center - 1); f <= File(center + 1); ++f)
250256
{
@@ -263,6 +269,9 @@ Value Entry::shelter_storm(const Position& pos, Square ksq) {
263269
[d][rkThem];
264270
}
265271

272+
if (popcount((ourPawns & ShelterMask) | (theirPawns & StormMask)) == 5)
273+
safety += Value(300);
274+
266275
return safety;
267276
}
268277

0 commit comments

Comments
 (0)