From 5f4d44fda053335ab20cb67c99323b8c182bf824 Mon Sep 17 00:00:00 2001 From: xoto10 Date: Sun, 12 May 2019 22:20:51 +0100 Subject: [PATCH] Add eg component to evaluate_shelter() #2137 Add an endgame component to the blockedstorm penalty so that the penalty applies more uniformly through the game. STC 10+0.1 th 1 : LLR: -2.95 (-2.94,2.94) [0.50,4.50] Total: 94063 W: 21426 L: 21118 D: 51519 http://tests.stockfishchess.org/tests/view/5cd4605c0ebc5925cf04bf43 LTC 60+0.6 th 1 : LLR: 2.95 (-2.94,2.94) [0.00,3.50] Total: 188232 W: 32808 L: 32090 D: 123334 http://tests.stockfishchess.org/tests/view/5cd47d0a0ebc5925cf04c4fd Refactored code with higher constant values gave a more convincing LTC result: LLR: 2.96 (-2.94,2.94) [0.00,3.50] Total: 30050 W: 5330 L: 5066 D: 19654 http://tests.stockfishchess.org/tests/view/5cd6a0000ebc5925cf050653 Bench: 3687700 --- src/pawns.cpp | 26 ++++++++++++++++---------- src/pawns.h | 2 +- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/pawns.cpp b/src/pawns.cpp index 0a88c9f1..8d6f812a 100644 --- a/src/pawns.cpp +++ b/src/pawns.cpp @@ -172,7 +172,7 @@ Entry* probe(const Position& pos) { /// penalty for a king, looking at the king file and the two closest files. template -Value Entry::evaluate_shelter(const Position& pos, Square ksq) { +void Entry::evaluate_shelter(const Position& pos, Square ksq, Score& shelter) { constexpr Color Them = (Us == WHITE ? BLACK : WHITE); constexpr Direction Down = (Us == WHITE ? SOUTH : NORTH); @@ -183,7 +183,8 @@ Value Entry::evaluate_shelter(const Position& pos, Square ksq) { Bitboard ourPawns = b & pos.pieces(Us); Bitboard theirPawns = b & pos.pieces(Them); - Value safety = (shift(theirPawns) & BlockSquares & ksq) ? Value(374) : Value(5); + Value bonus[] = { (shift(theirPawns) & BlockSquares & ksq) ? Value(374) : Value(5), + VALUE_ZERO }; File center = clamp(file_of(ksq), FILE_B, FILE_G); for (File f = File(center - 1); f <= File(center + 1); ++f) @@ -195,12 +196,16 @@ Value Entry::evaluate_shelter(const Position& pos, Square ksq) { Rank theirRank = b ? relative_rank(Us, frontmost_sq(Them, b)) : RANK_1; int d = std::min(f, ~f); - safety += ShelterStrength[d][ourRank]; - safety -= (ourRank && (ourRank == theirRank - 1)) ? 66 * (theirRank == RANK_3) - : UnblockedStorm[d][theirRank]; + bonus[MG] += ShelterStrength[d][ourRank]; + + if (ourRank && (ourRank == theirRank - 1)) + bonus[MG] -= 82 * (theirRank == RANK_3), bonus[EG] -= 82 * (theirRank == RANK_3); + else + bonus[MG] -= UnblockedStorm[d][theirRank]; } - return safety; + if (bonus[MG] > mg_value(shelter)) + shelter = make_score(bonus[MG], bonus[EG]); } @@ -223,16 +228,17 @@ Score Entry::do_king_safety(const Position& pos) { else while (pawns) minPawnDist = std::min(minPawnDist, distance(ksq, pop_lsb(&pawns))); - Value bonus = evaluate_shelter(pos, ksq); + Score shelter = make_score(-VALUE_INFINITE, VALUE_ZERO); + evaluate_shelter(pos, ksq, shelter); // If we can castle use the bonus after the castling if it is bigger if (pos.can_castle(Us | KING_SIDE)) - bonus = std::max(bonus, evaluate_shelter(pos, relative_square(Us, SQ_G1))); + evaluate_shelter(pos, relative_square(Us, SQ_G1), shelter); if (pos.can_castle(Us | QUEEN_SIDE)) - bonus = std::max(bonus, evaluate_shelter(pos, relative_square(Us, SQ_C1))); + evaluate_shelter(pos, relative_square(Us, SQ_C1), shelter); - return make_score(bonus, -16 * minPawnDist); + return shelter - make_score(VALUE_ZERO, 16 * minPawnDist); } // Explicit template instantiation diff --git a/src/pawns.h b/src/pawns.h index 76c5ffc9..771e9cd3 100644 --- a/src/pawns.h +++ b/src/pawns.h @@ -50,7 +50,7 @@ struct Entry { Score do_king_safety(const Position& pos); template - Value evaluate_shelter(const Position& pos, Square ksq); + void evaluate_shelter(const Position& pos, Square ksq, Score& shelter); Key key; Score scores[COLOR_NB]; -- 2.39.2