1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 08:43:09 +00:00

Candidate passed pawns

Detect safe candidate passers.

STC: http://tests.stockfishchess.org/tests/view/5882395c0ebc5915193f78b3
LLR: 2.96 (-2.94,2.94) [0.00,5.00]
Total: 53569 W: 9925 L: 9570 D: 34074

LTC: http://tests.stockfishchess.org/tests/view/5882b4fb0ebc5915193f78e2
LLR: 2.95 (-2.94,2.94) [0.00,5.00]
Total: 77576 W: 10387 L: 10014 D: 57175

Bench: 5325829
This commit is contained in:
Stefan Geschwentner 2017-01-19 18:16:23 +01:00 committed by Marco Costalba
parent 58c181de9a
commit 471f7a1b5c
2 changed files with 20 additions and 8 deletions

View file

@ -606,10 +606,11 @@ namespace {
}
// evaluate_passed_pawns() evaluates the passed pawns of the given color
// evaluate_passer_pawns() evaluates the passed pawns and candidate passed
// pawns of the given color.
template<Color Us, bool DoTrace>
Score evaluate_passed_pawns(const Position& pos, const EvalInfo& ei) {
Score evaluate_passer_pawns(const Position& pos, const EvalInfo& ei) {
const Color Them = (Us == WHITE ? BLACK : WHITE);
@ -622,7 +623,6 @@ namespace {
{
Square s = pop_lsb(&b);
assert(pos.pawn_passed(Us, s));
assert(!(pos.pieces(PAWN) & forward_bb(Us, s)));
bb = forward_bb(Us, s) & (ei.attackedBy[Them][ALL_PIECES] | pos.pieces(Them));
@ -683,6 +683,11 @@ namespace {
if (!pos.non_pawn_material(Them))
ebonus += 20;
// Scale down bonus for candidate passers which need more than one pawn
// push to become passed.
if (!pos.pawn_passed(Us, s + pawn_push(Us)))
mbonus /= 2, ebonus /= 2;
score += make_score(mbonus, ebonus) + PassedFile[file_of(s)];
}
@ -844,8 +849,8 @@ Value Eval::evaluate(const Position& pos) {
- evaluate_threats<BLACK, DoTrace>(pos, ei);
// Evaluate passed pawns, we need full attack information including king
score += evaluate_passed_pawns<WHITE, DoTrace>(pos, ei)
- evaluate_passed_pawns<BLACK, DoTrace>(pos, ei);
score += evaluate_passer_pawns<WHITE, DoTrace>(pos, ei)
- evaluate_passer_pawns<BLACK, DoTrace>(pos, ei);
// Evaluate space for both sides, only during opening
if (pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK) >= 12222)

View file

@ -99,8 +99,9 @@ namespace {
const Square Left = (Us == WHITE ? NORTH_WEST : SOUTH_EAST);
Bitboard b, neighbours, stoppers, doubled, supported, phalanx;
Bitboard lever, leverPush, connected;
Square s;
bool opposed, lever, connected, backward;
bool opposed, backward;
Score score = SCORE_ZERO;
const Square* pl = pos.squares<PAWN>(Us);
const Bitboard* pawnAttacksBB = StepAttacksBB[make_piece(Us, PAWN)];
@ -129,6 +130,7 @@ namespace {
opposed = theirPawns & forward_bb(Us, s);
stoppers = theirPawns & passed_pawn_mask(Us, s);
lever = theirPawns & pawnAttacksBB[s];
leverPush = theirPawns & pawnAttacksBB[s + Up];
doubled = ourPawns & (s + Up);
neighbours = ourPawns & adjacent_files_bb(f);
phalanx = neighbours & rank_bb(s);
@ -153,8 +155,13 @@ namespace {
}
// Passed pawns will be properly scored in evaluation because we need
// full attack info to evaluate them.
if (!stoppers && !(ourPawns & forward_bb(Us, s)))
// full attack info to evaluate them. Include also not passed pawns
// which could become passed after one or two pawn pushes when are
// not attacked more times than defended.
if ( !(stoppers ^ lever ^ leverPush)
&& !(ourPawns & forward_bb(Us, s))
&& popcount(supported) >= popcount(lever)
&& popcount(phalanx) >= popcount(leverPush))
e->passedPawns[Us] |= s;
// Score this pawn