]> git.sesse.net Git - stockfish/blobdiff - src/pawns.cpp
Add doubled isolated pawn penalty.
[stockfish] / src / pawns.cpp
index 0017b8044d8a1c3878546ed12fa09d836054a63c..c20cb5293c009ee2a2538318965be79156ba5d4b 100644 (file)
@@ -32,12 +32,13 @@ namespace {
   #define S(mg, eg) make_score(mg, eg)
 
   // Pawn penalties
-  constexpr Score Backward      = S( 9, 24);
-  constexpr Score BlockedStorm  = S(82, 82);
-  constexpr Score Doubled       = S(11, 56);
-  constexpr Score Isolated      = S( 5, 15);
-  constexpr Score WeakLever     = S( 0, 56);
-  constexpr Score WeakUnopposed = S(13, 27);
+  constexpr Score Backward        = S( 9, 24);
+  constexpr Score BlockedStorm    = S(82, 82);
+  constexpr Score Doubled         = S(11, 56);
+  constexpr Score DoubledIsolated = S(15, 57);
+  constexpr Score Isolated        = S( 5, 15);
+  constexpr Score WeakLever       = S( 0, 56);
+  constexpr Score WeakUnopposed   = S(13, 27);
 
   // Connected pawn bonus
   constexpr int Connected[RANK_NB] = { 0, 7, 8, 12, 29, 48, 86 };
@@ -105,6 +106,8 @@ namespace {
         phalanx    = neighbours & rank_bb(s);
         support    = neighbours & rank_bb(s - Up);
 
+        e->blockedCount += blocked || more_than_one(leverPush);
+
         // A pawn is backward when it is behind all pawns of the same color on
         // the adjacent files and cannot safely advance.
         backward =  !(neighbours & forward_ranks_bb(Them, s + Up))
@@ -118,6 +121,7 @@ namespace {
         // (a) there is no stoppers except some levers
         // (b) the only stoppers are the leverPush, but we outnumber them
         // (c) there is only one front stopper which can be levered.
+        //     (Refined in Evaluation::passed)
         passed =   !(stoppers ^ lever)
                 || (   !(stoppers ^ leverPush)
                     && popcount(phalanx) >= popcount(leverPush))
@@ -134,16 +138,23 @@ namespace {
         // Score this pawn
         if (support | phalanx)
         {
-            int v =  Connected[r] * (2 + bool(phalanx) - bool(opposed))
+            int v =  Connected[r] * (4 + 2 * bool(phalanx) - 2 * bool(opposed) - bool(blocked)) / 2
                    + 21 * popcount(support);
 
             score += make_score(v, v * (r - 2) / 4);
         }
 
         else if (!neighbours)
+        {
             score -=   Isolated
                      + WeakUnopposed * !opposed;
 
+            if (   (ourPawns & forward_file_bb(Them, s))
+                && popcount(opposed) == 1
+                && !(theirPawns & adjacent_files_bb(s)))
+                score -= DoubledIsolated;
+        }
+
         else if (backward)
             score -=   Backward
                      + WeakUnopposed * !opposed;
@@ -174,6 +185,7 @@ Entry* probe(const Position& pos) {
       return e;
 
   e->key = key;
+  e->blockedCount = 0;
   e->scores[WHITE] = evaluate<WHITE>(pos, e);
   e->scores[BLACK] = evaluate<BLACK>(pos, e);
 
@@ -240,7 +252,7 @@ Score Entry::do_king_safety(const Position& pos) {
 
   // In endgame we like to bring our king near our closest pawn
   Bitboard pawns = pos.pieces(Us, PAWN);
-  int minPawnDist = pawns ? 8 : 0;
+  int minPawnDist = 6;
 
   if (pawns & PseudoAttacks[KING][ksq])
       minPawnDist = 1;