Add bonuses for each threat instead of max threat value.
authorAjith <achajo@yahoo.co.in>
Tue, 4 Nov 2014 15:40:37 +0000 (23:40 +0800)
committerGary Linscott <glinscott@gmail.com>
Tue, 4 Nov 2014 15:50:54 +0000 (23:50 +0800)
Use SPSA tuned values for all threat bonuses

STC
LLR: 2.96 (-2.94,2.94) [-1.50,4.50]
Total: 6074 W: 1284 L: 1160 D: 3630

LTC
LLR: 2.97 (-2.94,2.94) [0.00,6.00]
Total: 13563 W: 2402 L: 2232 D: 8929

Bench: 6981908

Resolves #94

src/evaluate.cpp

index 2161bf9..f76862c 100644 (file)
@@ -140,27 +140,29 @@ namespace {
   // Threat[attacking][attacked] contains bonuses according to which piece
   // type attacks which one.
   const Score Threat[][PIECE_TYPE_NB] = {
-    { S(0, 0), S(0, 38), S(32, 45), S(32, 45), S(41,100), S(35,104) }, // Minor
-    { S(0, 0), S(7, 28), S(20, 49), S(20, 49), S(8 , 42), S(23, 44) }  // Major
+    { S(0, 0), S( 0, 0), S(19, 37), S(24, 37), S(44, 97), S(35,106) }, // Protected Minor attacks
+    { S(0, 0), S( 0, 0), S( 9, 14), S( 9, 14), S( 7, 14), S(24, 48) }, // Protected Major attacks
+    { S(0, 0), S( 0,32), S(33, 41), S(31, 50), S(41,100), S(35,104) }, // Weak Minor attacks
+    { S(0, 0), S( 0,27), S(26, 57), S(26, 57), S(0 , 43), S(23, 51) }  // Weak Major attacks
   };
 
   // ThreatenedByPawn[PieceType] contains a penalty according to which piece
   // type is attacked by an enemy pawn.
   const Score ThreatenedByPawn[] = {
-    S(0, 0), S(0, 0), S(80, 119), S(80, 119), S(117, 199), S(127, 218)
+    S(0, 0), S(0, 0), S(87, 118), S(84, 122), S(114, 203), S(121, 217)
   };
 
   // Assorted bonuses and penalties used by evaluation
   const Score KingOnOne        = S(2 , 58);
   const Score KingOnMany       = S(6 ,125);
-  const Score RookOnPawn       = S(10, 28);
+  const Score RookOnPawn       = S(7 , 27);
   const Score RookOpenFile     = S(43, 21);
   const Score RookSemiOpenFile = S(19, 10);
   const Score BishopPawns      = S( 8, 12);
   const Score MinorBehindPawn  = S(16,  0);
   const Score TrappedRook      = S(92,  0);
   const Score Unstoppable      = S( 0, 20);
-  const Score Hanging          = S(23, 20);
+  const Score Hanging          = S(31, 26);
 
   // Penalty for a bishop on a1/h1 (a8/h8 for black) which is trapped by
   // a friendly pawn on b2/g2 (b7/g7 for black). This can obviously only
@@ -488,20 +490,6 @@ namespace {
   }
 
 
-  // max_piece_type() is a helper function used by evaluate_threats() to get
-  // the value of the biggest PieceType of color C in 'target' bitboard.
-
-  template<Color C>
-  inline PieceType max_piece_type(const Position& pos, const Bitboard target) {
-
-    assert(target & (pos.pieces(C) ^ pos.pieces(C, KING)));
-
-    for (PieceType pt = QUEEN; pt > PAWN; --pt)
-        if (target & pos.pieces(C, pt))
-            return pt;
-
-    return PAWN;
-  }
 
 
   // evaluate_threats() assigns bonuses according to the type of attacking piece
@@ -512,18 +500,27 @@ namespace {
 
     const Color Them = (Us == WHITE ? BLACK : WHITE);
 
-    enum { Minor, Major };
-
+    enum { Protected_Minor, Protected_Major, Minor, Major };
     Bitboard b, weakEnemies, protectedEnemies;
     Score score = SCORE_ZERO;
 
-    // Enemies defended by a pawn and under our attack by a minor piece
-    protectedEnemies =  (pos.pieces(Them) ^ pos.pieces(Them, PAWN))
-                       ei.attackedBy[Them][PAWN]
-                      & (ei.attackedBy[Us][KNIGHT] | ei.attackedBy[Us][BISHOP]);
+    // Enemies defended by a pawn and under our attack
+    protectedEnemies = (pos.pieces(Them) ^ pos.pieces(Them, PAWN))
+                       & ei.attackedBy[Them][PAWN]
+                       & (ei.attackedBy[Us][KNIGHT] | ei.attackedBy[Us][BISHOP] | ei.attackedBy[Us][ROOK]);
 
     if (protectedEnemies)
-        score += Threat[Minor][max_piece_type<Them>(pos, protectedEnemies)];
+    {
+        // Enemies defended by a pawn and under our attack by a minor piece
+        b = protectedEnemies & (ei.attackedBy[Us][KNIGHT] | ei.attackedBy[Us][BISHOP]);
+        while (b)
+            score += Threat[Protected_Minor][type_of(pos.piece_on(pop_lsb(&b)))];
+
+        // Enemies defended by a pawn and under our attack by a ROOK
+        b = protectedEnemies & (ei.attackedBy[Us][ROOK]);
+        while (b)
+            score += Threat[Protected_Major][type_of(pos.piece_on(pop_lsb(&b)))];
+    }
 
     // Enemies not defended by a pawn and under our attack
     weakEnemies =   pos.pieces(Them)
@@ -534,12 +531,12 @@ namespace {
     if (weakEnemies)
     {
         b = weakEnemies & (ei.attackedBy[Us][KNIGHT] | ei.attackedBy[Us][BISHOP]);
-        if (b)
-            score += Threat[Minor][max_piece_type<Them>(pos, b)];
+        while (b)
+            score += Threat[Minor][type_of(pos.piece_on(pop_lsb(&b)))];
 
         b = weakEnemies & (ei.attackedBy[Us][ROOK] | ei.attackedBy[Us][QUEEN]);
-        if (b)
-            score += Threat[Major][max_piece_type<Them>(pos, b)];
+        while (b)
+            score += Threat[Major][type_of(pos.piece_on(pop_lsb(&b)))];
 
         b = weakEnemies & ~ei.attackedBy[Them][ALL_PIECES];
         if (b)