mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 16:53: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>
|
||||
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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue