From: Stefan Geschwentner Date: Thu, 19 Jan 2017 17:16:23 +0000 (+0100) Subject: Candidate passed pawns X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=471f7a1b5c4da03a712da2ce079034de45b4c35b 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 --- diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 6e33bb72..d9aae3d3 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -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 - 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(pos, ei); // Evaluate passed pawns, we need full attack information including king - score += evaluate_passed_pawns(pos, ei) - - evaluate_passed_pawns(pos, ei); + score += evaluate_passer_pawns(pos, ei) + - evaluate_passer_pawns(pos, ei); // Evaluate space for both sides, only during opening if (pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK) >= 12222) diff --git a/src/pawns.cpp b/src/pawns.cpp index 03b422f8..fb91afcb 100644 --- a/src/pawns.cpp +++ b/src/pawns.cpp @@ -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(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