mirror of
https://github.com/sockspls/badfish
synced 2025-05-01 01:03: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:
parent
58c181de9a
commit
471f7a1b5c
2 changed files with 20 additions and 8 deletions
|
@ -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>
|
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);
|
const Color Them = (Us == WHITE ? BLACK : WHITE);
|
||||||
|
|
||||||
|
@ -622,7 +623,6 @@ namespace {
|
||||||
{
|
{
|
||||||
Square s = pop_lsb(&b);
|
Square s = pop_lsb(&b);
|
||||||
|
|
||||||
assert(pos.pawn_passed(Us, s));
|
|
||||||
assert(!(pos.pieces(PAWN) & forward_bb(Us, s)));
|
assert(!(pos.pieces(PAWN) & forward_bb(Us, s)));
|
||||||
|
|
||||||
bb = forward_bb(Us, s) & (ei.attackedBy[Them][ALL_PIECES] | pos.pieces(Them));
|
bb = forward_bb(Us, s) & (ei.attackedBy[Them][ALL_PIECES] | pos.pieces(Them));
|
||||||
|
@ -683,6 +683,11 @@ namespace {
|
||||||
if (!pos.non_pawn_material(Them))
|
if (!pos.non_pawn_material(Them))
|
||||||
ebonus += 20;
|
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)];
|
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_threats<BLACK, DoTrace>(pos, ei);
|
||||||
|
|
||||||
// Evaluate passed pawns, we need full attack information including king
|
// Evaluate passed pawns, we need full attack information including king
|
||||||
score += evaluate_passed_pawns<WHITE, DoTrace>(pos, ei)
|
score += evaluate_passer_pawns<WHITE, DoTrace>(pos, ei)
|
||||||
- evaluate_passed_pawns<BLACK, DoTrace>(pos, ei);
|
- evaluate_passer_pawns<BLACK, DoTrace>(pos, ei);
|
||||||
|
|
||||||
// Evaluate space for both sides, only during opening
|
// Evaluate space for both sides, only during opening
|
||||||
if (pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK) >= 12222)
|
if (pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK) >= 12222)
|
||||||
|
|
|
@ -99,8 +99,9 @@ namespace {
|
||||||
const Square Left = (Us == WHITE ? NORTH_WEST : SOUTH_EAST);
|
const Square Left = (Us == WHITE ? NORTH_WEST : SOUTH_EAST);
|
||||||
|
|
||||||
Bitboard b, neighbours, stoppers, doubled, supported, phalanx;
|
Bitboard b, neighbours, stoppers, doubled, supported, phalanx;
|
||||||
|
Bitboard lever, leverPush, connected;
|
||||||
Square s;
|
Square s;
|
||||||
bool opposed, lever, connected, backward;
|
bool opposed, backward;
|
||||||
Score score = SCORE_ZERO;
|
Score score = SCORE_ZERO;
|
||||||
const Square* pl = pos.squares<PAWN>(Us);
|
const Square* pl = pos.squares<PAWN>(Us);
|
||||||
const Bitboard* pawnAttacksBB = StepAttacksBB[make_piece(Us, PAWN)];
|
const Bitboard* pawnAttacksBB = StepAttacksBB[make_piece(Us, PAWN)];
|
||||||
|
@ -129,6 +130,7 @@ namespace {
|
||||||
opposed = theirPawns & forward_bb(Us, s);
|
opposed = theirPawns & forward_bb(Us, s);
|
||||||
stoppers = theirPawns & passed_pawn_mask(Us, s);
|
stoppers = theirPawns & passed_pawn_mask(Us, s);
|
||||||
lever = theirPawns & pawnAttacksBB[s];
|
lever = theirPawns & pawnAttacksBB[s];
|
||||||
|
leverPush = theirPawns & pawnAttacksBB[s + Up];
|
||||||
doubled = ourPawns & (s + Up);
|
doubled = ourPawns & (s + Up);
|
||||||
neighbours = ourPawns & adjacent_files_bb(f);
|
neighbours = ourPawns & adjacent_files_bb(f);
|
||||||
phalanx = neighbours & rank_bb(s);
|
phalanx = neighbours & rank_bb(s);
|
||||||
|
@ -153,8 +155,13 @@ namespace {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Passed pawns will be properly scored in evaluation because we need
|
// Passed pawns will be properly scored in evaluation because we need
|
||||||
// full attack info to evaluate them.
|
// full attack info to evaluate them. Include also not passed pawns
|
||||||
if (!stoppers && !(ourPawns & forward_bb(Us, s)))
|
// 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;
|
e->passedPawns[Us] |= s;
|
||||||
|
|
||||||
// Score this pawn
|
// Score this pawn
|
||||||
|
|
Loading…
Add table
Reference in a new issue