mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 16:53:09 +00:00
Backward simplication
On top of the usual conditions a) some opponent in front (but no lever) b) some neighbours (in front) (but no neighbour behind or same rank) c) < rank_5 to find out if a pawn is backward we look at the squares in front of this pawn to reach the same rank as the next neighbour. In current master, a pawn is backward if any of those squares is controlled by an enemy pawn on an adjacent file In this version, a pawn is ALSO backward if any of those squares is occupied by an enemy pawn. STC: http://tests.stockfishchess.org/tests/view/56fe7efd0ebc59301a3541f1 LLR: 2.95 (-2.94,2.94) [-3.00,1.00] Total: 19051 W: 3557 L: 3433 D: 12061 LTC: http://tests.stockfishchess.org/tests/view/56febc2d0ebc59301a354209 LLR: 2.95 (-2.94,2.94) [-3.00,1.00] Total: 40810 W: 5619 L: 5526 D: 29665 Bench: 7525245 Resolves #614
This commit is contained in:
parent
8fb45caade
commit
29b5842da8
1 changed files with 24 additions and 32 deletions
|
@ -99,9 +99,9 @@ namespace {
|
|||
const Square Right = (Us == WHITE ? DELTA_NE : DELTA_SW);
|
||||
const Square Left = (Us == WHITE ? DELTA_NW : DELTA_SE);
|
||||
|
||||
Bitboard b, neighbours, doubled, supported, phalanx;
|
||||
Bitboard b, neighbours, stoppers, doubled, supported, phalanx;
|
||||
Square s;
|
||||
bool passed, isolated, opposed, backward, lever, connected;
|
||||
bool opposed, lever, connected, backward;
|
||||
Score score = SCORE_ZERO;
|
||||
const Square* pl = pos.squares<PAWN>(Us);
|
||||
const Bitboard* pawnAttacksBB = StepAttacksBB[make_piece(Us, PAWN)];
|
||||
|
@ -127,55 +127,47 @@ namespace {
|
|||
e->pawnAttacksSpan[Us] |= pawn_attack_span(Us, s);
|
||||
|
||||
// Flag the pawn
|
||||
neighbours = ourPawns & adjacent_files_bb(f);
|
||||
doubled = ourPawns & forward_bb(Us, s);
|
||||
opposed = theirPawns & forward_bb(Us, s);
|
||||
passed = !(theirPawns & passed_pawn_mask(Us, s));
|
||||
stoppers = theirPawns & passed_pawn_mask(Us, s);
|
||||
lever = theirPawns & pawnAttacksBB[s];
|
||||
doubled = ourPawns & forward_bb(Us, s);
|
||||
neighbours = ourPawns & adjacent_files_bb(f);
|
||||
phalanx = neighbours & rank_bb(s);
|
||||
supported = neighbours & rank_bb(s - Up);
|
||||
connected = supported | phalanx;
|
||||
isolated = !neighbours;
|
||||
|
||||
// Test for backward pawn.
|
||||
// If the pawn is passed, isolated, lever or connected it cannot be
|
||||
// backward. If there are friendly pawns behind on adjacent files
|
||||
// or if it is sufficiently advanced, it cannot be backward either.
|
||||
if ( (passed | isolated | lever | connected)
|
||||
|| (ourPawns & pawn_attack_span(Them, s))
|
||||
|| (relative_rank(Us, s) >= RANK_5))
|
||||
// A pawn is backward when it is behind all pawns of the same color on the
|
||||
// adjacent files and cannot be safely advanced.
|
||||
if (!neighbours || lever || relative_rank(Us, s) >= RANK_5)
|
||||
backward = false;
|
||||
else
|
||||
{
|
||||
// We now know there are no friendly pawns beside or behind this
|
||||
// pawn on adjacent files. We now check whether the pawn is
|
||||
// backward by looking in the forward direction on the adjacent
|
||||
// files, and picking the closest pawn there.
|
||||
b = pawn_attack_span(Us, s) & (ourPawns | theirPawns);
|
||||
b = pawn_attack_span(Us, s) & rank_bb(backmost_sq(Us, b));
|
||||
// Find the backmost rank with neighbours or stoppers
|
||||
b = rank_bb(backmost_sq(Us, neighbours | stoppers));
|
||||
|
||||
// If we have an enemy pawn in the same or next rank, the pawn is
|
||||
// backward because it cannot advance without being captured.
|
||||
backward = (b | shift_bb<Up>(b)) & theirPawns;
|
||||
// The pawn is backward when it cannot safely progress to that rank:
|
||||
// either there is a stopper in the way on this rank, or there is a
|
||||
// stopper on adjacent file which controls the way to that rank.
|
||||
backward = (b | shift_bb<Up>(b & adjacent_files_bb(f))) & stoppers;
|
||||
|
||||
assert(!backward || !(pawn_attack_span(Them, s + Up) & neighbours));
|
||||
}
|
||||
|
||||
assert(opposed | passed | (pawn_attack_span(Us, s) & theirPawns));
|
||||
|
||||
// Passed pawns will be properly scored in evaluation because we need
|
||||
// full attack info to evaluate them. Only the frontmost passed
|
||||
// pawn on each file is considered a true passed pawn.
|
||||
if (passed && !doubled)
|
||||
if (!(stoppers | doubled))
|
||||
e->passedPawns[Us] |= s;
|
||||
|
||||
// Score this pawn
|
||||
if (isolated)
|
||||
if (!neighbours)
|
||||
score -= Isolated[opposed][f];
|
||||
|
||||
else if (backward)
|
||||
score -= Backward[opposed];
|
||||
|
||||
else if (!supported)
|
||||
score -= Unsupported[more_than_one(neighbours & rank_bb(s + Up))];
|
||||
score -= Unsupported[more_than_one(neighbours & pawnAttacksBB[s])];
|
||||
|
||||
if (connected)
|
||||
score += Connected[opposed][!!phalanx][more_than_one(supported)][relative_rank(Us, s)];
|
||||
|
|
Loading…
Add table
Reference in a new issue