From: Alain SAVARD Date: Sun, 6 Oct 2019 22:48:19 +0000 (+0200) Subject: Adjust pawn span X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=7264540107b7f20d16628ac8615070fe3334f5f5;hp=c78f8ddd868966b43b20ae4ef585b6cf1f7ab595 Adjust pawn span Run as a simplification a) insures that pawn attacks are always included in the pawn span (this "fixes" the case where some outpost or reachable outpost bonus were awarded on squares controlled by enemy pawns). b) compute the full span only if not "backward" or not "blocked". By looking at "blocked" instead of "opposed", we get a nice simpli- fication and the "new" outpost detection is almost identical, except a few borderline cases on rank 4. passed STC http://tests.stockfishchess.org/tests/view/5d9950730ebc5902b6cefb90 LLR: 2.95 (-2.94,2.94) [-3.00,1.00] Total: 79113 W: 17168 L: 17159 D: 44786 passed LTC http://tests.stockfishchess.org/tests/view/5d99d14e0ebc5902b6cf0692 LLR: 2.95 (-2.94,2.94) [-3.00,1.00] Total: 41286 W: 6819 L: 6731 D: 27736 See https://github.com/official-stockfish/Stockfish/pull/2348 bench: 3812891 --- diff --git a/src/pawns.cpp b/src/pawns.cpp index 1e5b4f43..1825b6e2 100644 --- a/src/pawns.cpp +++ b/src/pawns.cpp @@ -72,7 +72,7 @@ namespace { constexpr Direction Up = (Us == WHITE ? NORTH : SOUTH); Bitboard neighbours, stoppers, support, phalanx, opposed; - Bitboard lever, leverPush; + Bitboard lever, leverPush, blocked; Square s; bool backward, passed, doubled; Score score = SCORE_ZERO; @@ -83,9 +83,9 @@ namespace { Bitboard doubleAttackThem = pawn_double_attacks_bb(theirPawns); - e->passedPawns[Us] = e->pawnAttacksSpan[Us] = 0; + e->passedPawns[Us] = 0; e->kingSquares[Us] = SQ_NONE; - e->pawnAttacks[Us] = pawn_attacks_bb(ourPawns); + e->pawnAttacks[Us] = e->pawnAttacksSpan[Us] = pawn_attacks_bb(ourPawns); // Loop through all pawns of the current color and score each pawn while ((s = *pl++) != SQ_NONE) @@ -96,6 +96,7 @@ namespace { // Flag the pawn opposed = theirPawns & forward_file_bb(Us, s); + blocked = theirPawns & (s + Up); stoppers = theirPawns & passed_pawn_span(Us, s); lever = theirPawns & PawnAttacks[Us][s]; leverPush = theirPawns & PawnAttacks[Us][s + Up]; @@ -105,21 +106,13 @@ namespace { support = neighbours & rank_bb(s - Up); // A pawn is backward when it is behind all pawns of the same color on - // the adjacent files and cannot safely advance. Phalanx and isolated - // pawns will be excluded when the pawn is scored. - backward = !(neighbours & forward_ranks_bb(Them, s)) - && (stoppers & (leverPush | (s + Up))); - - // Span of backward pawns and span behind opposing pawns are not included - // in the pawnAttacksSpan bitboard. - if (!backward || phalanx) - { - if (opposed) - e->pawnAttacksSpan[Us] |= pawn_attack_span(Us, s) & - ~pawn_attack_span(Us, frontmost_sq(Them, opposed)); - else - e->pawnAttacksSpan[Us] |= pawn_attack_span(Us, s); - } + // the adjacent files and cannot safely advance. + backward = !(neighbours & forward_ranks_bb(Them, s + Up)) + && (stoppers & (leverPush | blocked)); + + // Compute additional span if pawn is not backward nor blocked + if (!backward && !blocked) + e->pawnAttacksSpan[Us] |= pawn_attack_span(Us, s); // A pawn is passed if one of the three following conditions is true: // (a) there is no stoppers except some levers @@ -128,7 +121,7 @@ namespace { passed = !(stoppers ^ lever) || ( !(stoppers ^ leverPush) && popcount(phalanx) >= popcount(leverPush)) - || ( stoppers == square_bb(s + Up) && r >= RANK_5 + || ( stoppers == blocked && r >= RANK_5 && (shift(support) & ~(theirPawns | doubleAttackThem))); // Passed pawns will be properly scored later in evaluation when we have