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
/// penalty for a king, looking at the king file and the two closest files.
template<Color Us>
/// penalty for a king, looking at the king file and the two closest files.
template<Color Us>
-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);
constexpr Color Them = (Us == WHITE ? BLACK : WHITE);
constexpr Direction Down = (Us == WHITE ? SOUTH : NORTH);
Bitboard ourPawns = b & pos.pieces(Us);
Bitboard theirPawns = b & pos.pieces(Them);
Bitboard ourPawns = b & pos.pieces(Us);
Bitboard theirPawns = b & pos.pieces(Them);
- Value safety = (shift<Down>(theirPawns) & BlockSquares & ksq) ? Value(374) : Value(5);
+ Value bonus[] = { (shift<Down>(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)
File center = clamp(file_of(ksq), FILE_B, FILE_G);
for (File f = File(center - 1); f <= File(center + 1); ++f)
Rank theirRank = b ? relative_rank(Us, frontmost_sq(Them, b)) : RANK_1;
int d = std::min(f, ~f);
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];
+ if (bonus[MG] > mg_value(shelter))
+ shelter = make_score(bonus[MG], bonus[EG]);
else while (pawns)
minPawnDist = std::min(minPawnDist, distance(ksq, pop_lsb(&pawns)));
else while (pawns)
minPawnDist = std::min(minPawnDist, distance(ksq, pop_lsb(&pawns)));
- Value bonus = evaluate_shelter<Us>(pos, ksq);
+ Score shelter = make_score(-VALUE_INFINITE, VALUE_ZERO);
+ evaluate_shelter<Us>(pos, ksq, shelter);
// If we can castle use the bonus after the castling if it is bigger
if (pos.can_castle(Us | KING_SIDE))
// 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<Us>(pos, relative_square(Us, SQ_G1)));
+ evaluate_shelter<Us>(pos, relative_square(Us, SQ_G1), shelter);
if (pos.can_castle(Us | QUEEN_SIDE))
if (pos.can_castle(Us | QUEEN_SIDE))
- bonus = std::max(bonus, evaluate_shelter<Us>(pos, relative_square(Us, SQ_C1)));
+ evaluate_shelter<Us>(pos, relative_square(Us, SQ_C1), shelter);
- return make_score(bonus, -16 * minPawnDist);
+ return shelter - make_score(VALUE_ZERO, 16 * minPawnDist);
}
// Explicit template instantiation
}
// Explicit template instantiation
Score do_king_safety(const Position& pos);
template<Color Us>
Score do_king_safety(const Position& pos);
template<Color Us>
- Value evaluate_shelter(const Position& pos, Square ksq);
+ void evaluate_shelter(const Position& pos, Square ksq, Score& shelter);
Key key;
Score scores[COLOR_NB];
Key key;
Score scores[COLOR_NB];