Merge Joona's bishop+pawn tweak
authorMarco Costalba <mcostalba@gmail.com>
Fri, 19 Apr 2013 07:31:18 +0000 (09:31 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Fri, 19 Apr 2013 07:36:00 +0000 (09:36 +0200)
The idea is to penalize a bishop in case of
its pawns are on the same colored squares.

Good at short 15"+0.05 TC
LLR: 2.95 (-2.94,2.94)
Total: 4252 W: 925 L: 806 D: 2521

And at longer 60"+0.05 TC
LLR: 2.95 (-2.94,2.94)
Total: 15006 W: 2743 L: 2564 D: 9699

bench: 5274705

src/bitboard.h
src/evaluate.cpp
src/material.cpp
src/pawns.cpp
src/pawns.h

index 2c51b073de3042ec1e7f1cf455b9d247ac927cd9..142c4c5a397f85b5b9092b4692c374cd1c6a2f01 100644 (file)
@@ -63,6 +63,8 @@ extern Bitboard PassedPawnMask[COLOR_NB][SQUARE_NB];
 extern Bitboard AttackSpanMask[COLOR_NB][SQUARE_NB];
 extern Bitboard PseudoAttacks[PIECE_TYPE_NB][SQUARE_NB];
 
+const Bitboard WhiteSquares = 0x55AA55AA55AA55AAULL;
+const Bitboard BlackSquares = 0xAA55AA55AA55AA55ULL;
 
 /// Overloads of bitwise operators between a Bitboard and a Square for testing
 /// whether a given bit is set in a bitboard, and for setting and clearing bits.
index 6990a71d2bbb306d945cfedebc94c659e1497475..dd26e46986e9ad7fb57829ddf4ed5f3992f349cc 100644 (file)
@@ -582,6 +582,10 @@ Value do_evaluate(const Position& pos, Value& margin) {
                  && !more_than_one(BetweenBB[s][pos.king_square(Them)] & pos.pieces()))
                  score += BishopPinBonus;
 
+        // Penalty for bishop with same coloured pawns
+        if (Piece == BISHOP)
+            score -= make_score(8, 12) * ei.pi->same_colored_pawn_count(s, Us); 
+
         // Bishop and knight outposts squares
         if (    (Piece == BISHOP || Piece == KNIGHT)
             && !(pos.pieces(Them, PAWN) & attack_span_mask(Us, s)))
index 9cc8eeadc470b7e2f20a9f91a9c5ee8a4c1f9568..208227e5223b87665377ea2395df11c76f055340 100644 (file)
@@ -46,7 +46,7 @@ namespace {
     {   7                               }, // Bishop pair
     {  39,    2                         }, // Pawn
     {  35,  271,  -4                    }, // Knight
-    {   7,   25,   4,    7              }, // Bishop
+    {   7,  105,   4,    7              }, // Bishop
     { -27,   -2,  46,   100,   56       }, // Rook
     {  58,   29,  83,   148,   -3,  -25 }  // Queen
   };
index c1a93169bd7e394f3b3abffb1234a122864e479d..3d99bfc68645a3e327554eef3fc2e067755a1297 100644 (file)
@@ -176,6 +176,12 @@ namespace {
             value += CandidateBonus[relative_rank(Us, s)];
     }
 
+    e->pawnsOnWhiteSquaresCount[Us]   = popcount<Max15>(ourPawns   & WhiteSquares);
+    e->pawnsOnWhiteSquaresCount[Them] = popcount<Max15>(theirPawns & WhiteSquares);
+
+    e->pawnsOnBlackSquaresCount[Us]   = popcount<Max15>(ourPawns   & BlackSquares);
+    e->pawnsOnBlackSquaresCount[Them] = popcount<Max15>(theirPawns & BlackSquares); 
+
     return value;
   }
 }
index 2c04e7d2eaa7ecf75fb09cc906446173232a613d..3ec62334c96d28cbf68e0a4184d3c4f5da2df780 100644 (file)
@@ -40,6 +40,7 @@ struct Entry {
   int file_is_half_open(Color c, File f) const { return halfOpenFiles[c] & (1 << int(f)); }
   int has_open_file_to_left(Color c, File f) const { return halfOpenFiles[c] & ((1 << int(f)) - 1); }
   int has_open_file_to_right(Color c, File f) const { return halfOpenFiles[c] & ~((1 << int(f+1)) - 1); }
+  int same_colored_pawn_count(Square s, Color c) const { return (BlackSquares & s) ? pawnsOnBlackSquaresCount[c] : pawnsOnWhiteSquaresCount[c]; } 
 
   template<Color Us>
   Score king_safety(const Position& pos, Square ksq)  {
@@ -63,6 +64,8 @@ struct Entry {
   Score value;
   int halfOpenFiles[COLOR_NB];
   Score kingSafety[COLOR_NB];
+  int pawnsOnWhiteSquaresCount[COLOR_NB];
+  int pawnsOnBlackSquaresCount[COLOR_NB];
 };
 
 typedef HashTable<Entry, 16384> Table;