]> git.sesse.net Git - stockfish/commitdiff
Simplify BlockedByPawn to one dimension
authorprotonspring <mike@whiteley.org>
Thu, 24 May 2018 16:46:38 +0000 (18:46 +0200)
committerStéphane Nicolet <cassio@free.fr>
Thu, 24 May 2018 16:46:55 +0000 (18:46 +0200)
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

src/pawns.cpp

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