Skip to content

Commit

Permalink
More accurate pawn attack span definition
Browse files Browse the repository at this point in the history
Tweak the pawn attack span for backward pawns and the zone behind
opponent opposing pawns. This is important in positional play and
one of weaknesses of the engine in recent high level games.

STC
LLR: -2.95 (-2.94,2.94) [0.50,4.50]
Total: 66843 W: 14884 L: 14717 D: 37242
http://tests.stockfishchess.org/tests/view/5d8dcb1b0ebc590f3beb2956

LTC
LLR: 2.96 (-2.94,2.94) [0.00,3.50]
Total: 77699 W: 12993 L: 12602 D: 52104
http://tests.stockfishchess.org/tests/view/5d8de9bc0ebc590f3beb3d00

See discussion in #2332

Bench: 4012371
  • Loading branch information
MJZ1977 authored and snicolet committed Oct 2, 2019
1 parent 005ad17 commit e6f4b5f
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 8 deletions.
2 changes: 1 addition & 1 deletion src/evaluate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ namespace {
constexpr Score KnightOnQueen = S( 16, 12);
constexpr Score LongDiagonalBishop = S( 45, 0);
constexpr Score MinorBehindPawn = S( 18, 3);
constexpr Score Outpost = S( 18, 6);
constexpr Score Outpost = S( 16, 5);
constexpr Score PassedFile = S( 11, 8);
constexpr Score PawnlessFlank = S( 17, 95);
constexpr Score RestrictedPiece = S( 7, 7);
Expand Down
25 changes: 18 additions & 7 deletions src/pawns.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,10 @@ namespace {
constexpr Color Them = (Us == WHITE ? BLACK : WHITE);
constexpr Direction Up = (Us == WHITE ? NORTH : SOUTH);

Bitboard neighbours, stoppers, support, phalanx;
Bitboard neighbours, stoppers, support, phalanx, opposed;
Bitboard lever, leverPush;
Square s;
bool opposed, backward, passed, doubled;
bool backward, passed, doubled;
Score score = SCORE_ZERO;
const Square* pl = pos.squares<PAWN>(Us);

Expand All @@ -94,8 +94,6 @@ namespace {

Rank r = relative_rank(Us, s);

e->pawnAttacksSpan[Us] |= pawn_attack_span(Us, s);

// Flag the pawn
opposed = theirPawns & forward_file_bb(Us, s);
stoppers = theirPawns & passed_pawn_span(Us, s);
Expand All @@ -112,6 +110,17 @@ namespace {
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);
}

// A pawn is passed if one of the three following conditions is true:
// (a) there is no stoppers except some levers
// (b) the only stoppers are the leverPush, but we outnumber them
Expand All @@ -130,17 +139,19 @@ namespace {
// Score this pawn
if (support | phalanx)
{
int v = Connected[r] * (2 + bool(phalanx) - opposed)
int v = Connected[r] * (2 + bool(phalanx) - bool(opposed))
+ 21 * popcount(support);

score += make_score(v, v * (r - 2) / 4);
}

else if (!neighbours)
score -= Isolated + WeakUnopposed * !opposed;
score -= Isolated
+ WeakUnopposed * !opposed;

else if (backward)
score -= Backward + WeakUnopposed * !opposed;
score -= Backward
+ WeakUnopposed * !opposed;

if (!support)
score -= Doubled * doubled
Expand Down

0 comments on commit e6f4b5f

Please sign in to comment.