1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 16:53:09 +00:00

Simplify BlockedByPawn to one dimension

I was able to get this to pass which reduces BlockedByPawn to one dimension
with NO distance from edge offset.

GOOD)  It's more simple and may provide additional clarity for further
simplifications.  Facilitates migrating unblocked to one dimension as well.

BAD) If there is indeed a distance component to BlockedStorm (may or may
not be the case), this obfuscates this component into ShelterStrength and
UnblockedStorm. This may be more convoluted. Also, it may be more convenient
to have each of the three arrays (ShelterStrength, BlockedStorm, and UnBlocked)
be the same size.

STC:
LLR: 2.96 (-2.94,2.94) [-3.00,1.00]
Total: 96173 W: 19326 L: 19343 D: 57504
http://tests.stockfishchess.org/tests/view/5b04544d0ebc5914abc12965

LTC:
LLR: 2.95 (-2.94,2.94) [-3.00,1.00]
Total: 49818 W: 7441 L: 7363 D: 35014
http://tests.stockfishchess.org/tests/view/5b0487d50ebc5914abc12990

Closes https://github.com/official-stockfish/Stockfish/pull/1611

Bench: 5133208
This commit is contained in:
protonspring 2018-05-24 18:46:38 +02:00 committed by Stéphane Nicolet
parent beaadd6547
commit d5d23bfd2d

View file

@ -47,25 +47,25 @@ namespace {
// RANK_1 = 0 is used for files where we have no pawn, or pawn is behind our king. // RANK_1 = 0 is used for files where we have no pawn, or pawn is behind our king.
constexpr Value ShelterStrength[int(FILE_NB) / 2][RANK_NB] = { constexpr Value ShelterStrength[int(FILE_NB) / 2][RANK_NB] = {
{ V( 7), V(76), V( 84), V( 38), V( 7), V( 30), V(-19) }, { V( 7), V(76), V( 84), V( 38), V( 7), V( 30), V(-19) },
{ V(-3), V(93), V(52), V(-17), V(12), V(-22), V(-35) }, { V(-13), V(83), V( 42), V(-27), V( 2), V(-32), V(-45) },
{ V(-6), V(83), V(25), V(-24), V(15), V( 22), V(-39) }, { V(-26), V(63), V( 5), V(-44), V( -5), V( 2), V(-59) },
{ V(11), V(83), V(19), V( 8), V(18), V(-21), V(-30) } { V(-19), V(53), V(-11), V(-22), V(-12), V(-51), V(-60) }
}; };
// Danger of enemy pawns moving toward our king by [type][distance from edge][rank]. // Danger of enemy pawns moving toward our king by [distance from edge][rank].
// For the unblocked case, RANK_1 = 0 is used when opponent has no pawn on the // RANK_1 = 0 is used for files where the enemy has no pawn, or their pawn
// given file, or their pawn is behind our king. // is behind our king.
constexpr Value StormDanger[][4][RANK_NB] = { constexpr Value UnblockedStorm[int(FILE_NB) / 2][RANK_NB] = {
{ { V(25), V( 79), V(107), V( 51), V( 27) }, // UnBlocked { V( 25), V( 79), V(107), V( 51), V( 27), V( 0), V( 0) },
{ V(15), V( 45), V(131), V( 8), V( 25) }, { V( 5), V( 35), V(121), V( -2), V( 15), V(-10), V(-10) },
{ V( 0), V( 42), V(118), V( 56), V( 27) }, { V(-20), V( 22), V( 98), V( 36), V( 7), V(-20), V(-20) },
{ V( 3), V( 54), V(110), V( 55), V( 26) } }, { V(-27), V( 24), V( 80), V( 25), V( -4), V(-30), V(-30) }
{ { V( 0), V( 0), V( 37), V( 5), V(-48) }, // BlockedByPawn
{ V( 0), V( 0), V( 68), V(-12), V( 13) },
{ V( 0), V( 0), V(111), V(-25), V( -3) },
{ V( 0), V( 0), V(108), V( 14), V( 21) } }
}; };
// Danger of blocked enemy pawns storming our king, by rank
constexpr Value BlockedStorm[RANK_NB] =
{ V( 0), V( 0), V( 75), V(-10), V(-20), V(-20), V(-20) };
#undef S #undef S
#undef V #undef V
@ -208,7 +208,6 @@ Entry* probe(const Position& pos) {
template<Color Us> template<Color Us>
Value Entry::evaluate_shelter(const Position& pos, Square ksq) { Value Entry::evaluate_shelter(const Position& pos, Square ksq) {
enum { UnBlocked, BlockedByPawn };
constexpr Color Them = (Us == WHITE ? BLACK : WHITE); constexpr Color Them = (Us == WHITE ? BLACK : WHITE);
constexpr Direction Down = (Us == WHITE ? SOUTH : NORTH); constexpr Direction Down = (Us == WHITE ? SOUTH : NORTH);
constexpr Bitboard BlockRanks = (Us == WHITE ? Rank1BB | Rank2BB : Rank8BB | Rank7BB); constexpr Bitboard BlockRanks = (Us == WHITE ? Rank1BB | Rank2BB : Rank8BB | Rank7BB);
@ -232,10 +231,9 @@ Value Entry::evaluate_shelter(const Position& pos, Square ksq) {
int theirRank = b ? relative_rank(Us, frontmost_sq(Them, b)) : 0; int theirRank = b ? relative_rank(Us, frontmost_sq(Them, b)) : 0;
int d = std::min(f, ~f); int d = std::min(f, ~f);
safety += ShelterStrength[d][ourRank]; safety += ShelterStrength[d][ourRank];
safety -= StormDanger[ourRank && (ourRank == theirRank - 1) ? BlockedByPawn : UnBlocked] safety -= (ourRank && (ourRank == theirRank - 1)) ? BlockedStorm[theirRank]
[d][theirRank]; : UnblockedStorm[d][theirRank];
} }
return safety; return safety;