Weight backward-ness of a pawn
authorMarco Costalba <mcostalba@gmail.com>
Mon, 19 Jul 2010 06:56:14 +0000 (08:56 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Thu, 22 Jul 2010 17:15:16 +0000 (18:15 +0100)
Because not all backward pawns are the same ;-) if the
blocking enemy pawn is near then our pawn is more backward
than another whose enemy pawn is far away so that can advance
for some sqaures.

After 2925 games at 30"+0 on my QUAD
Mod vs Orig +602 =1745 -578 +3 ELO

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/pawns.cpp

index b5c377efcd1e30221a514ea050e8787ba8b5a692..c89f2d0585891ec2ebe253b89de39eb305f56a8f 100644 (file)
@@ -183,7 +183,7 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns,
   Square s;
   File f;
   Rank r;
-  int bonus;
+  int bonus, backwardWeight;
   bool passed, isolated, doubled, opposed, chain, backward, candidate;
   Score value = make_score(0, 0);
   const Square* ptr = pos.piece_list_begin(Us, PAWN);
@@ -227,6 +227,7 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns,
       // Test for backward pawn
       //
       backward = false;
+      backwardWeight = 6;
 
       // If the pawn is passed, isolated, or member of a pawn chain
       // it cannot be backward. If can capture an enemy pawn or if
@@ -245,7 +246,12 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns,
           // Note that we are sure to find something because pawn is not passed
           // nor isolated, so loop is potentially infinite, but it isn't.
           while (!(b & (ourPawns | theirPawns)))
+          {
               Us == WHITE ? b <<= 8 : b >>= 8;
+              backwardWeight--;
+          }
+
+          assert(backwardWeight > 0);
 
           // The friendly pawn needs to be at least two ranks closer than the enemy
           // pawn in order to help the potentially backward pawn advance.
@@ -282,7 +288,7 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns,
 
       if (backward)
       {
-          value -= BackwardPawnPenalty[f];
+          value -= backwardWeight * BackwardPawnPenalty[f] / 4;
           if (!opposed)
               value -= BackwardPawnPenalty[f] / 2;
       }