summaryrefslogtreecommitdiff
path: root/src/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval.c')
-rwxr-xr-xsrc/eval.c970
1 files changed, 485 insertions, 485 deletions
diff --git a/src/eval.c b/src/eval.c
index 48a21e0..92d1edc 100755
--- a/src/eval.c
+++ b/src/eval.c
@@ -17,7 +17,7 @@ Revision History:
$Id: eval.c 357 2008-07-03 16:18:11Z scott $
-**/
+**/
#include "chess.h"
@@ -38,16 +38,16 @@ const int g_iBehind[2] = { -1, +1 };
//
static SCORE TRADE_PIECES[3][17] =
{// 0 1 2 3 4 5 6 7 8 | 9..15 -- down piece count
- { -1, 90, 81, 73, 67, 62, 57, 52, 50, 50,50,50,50,50,50,50,-1},
- { -1, 125, 117, 109, 100, 91, 84, 78, 71, 66,66,66,66,66,66,66,-1},
- { -1, 150, 132, 124, 116, 109, 102, 94, 87, 77,77,77,77,77,77,77,-1},
+ { -1, 90, 89, 89, 59, 46, 25, 4, 50, 50,50,50,50,50,50,50,-1},
+ { -1, 125, 125, 109, 132, 123, 100, 78, 71, 66,66,66,66,66,66,66,-1},
+ { -1, 158, 180, 148, 92, 109, 70, 46, 87, 77,77,77,77,77,77,77,-1},
};
static SCORE DONT_TRADE_PAWNS[3][9] =
{// 0 1 2 3 4 5 6 7 8 -- up pawn count
- { -43, -15, 0, +3, +6, +10, +15, +21, +28 }, // 0
- { -63, -25, 0, +4, +9, +14, +19, +25, +32 }, // 1
- { -10, 0, 0, +7, +15, +20, +24, +29, +36 }, // 2
+ { -59, -63, 0, +3, +14, +18, +-9, +-19, +-20 }, // 0
+ { -31, 7, 0, +52, +41, +14, +19, +41, +32 }, // 1
+ { -58, 0, 0, +47, +-9, +4, +-24, +-19, +44 }, // 2
};
static ULONG REDUCED_MATERIAL_DOWN_SCALER[32] =
@@ -56,7 +56,7 @@ static ULONG REDUCED_MATERIAL_DOWN_SCALER[32] =
0, 0, 0, 0, 0, 0, 0, 0,
// Rm 3m/Q 2R R2m 4m/Qm 2Rm R3m/QR Q2m
- 0, 1, 1, 1, 1, 1, 2, 3,
+ 0, 1, 1, 1, 1, 1, 10, 11,
// 2R2m R4m/QRm Q3m 2R3m/ QR2m Q4m 2R4m/ QR3m
// Q2R Q2Rm
@@ -72,30 +72,30 @@ static ULONG REDUCED_MATERIAL_UP_SCALER[32] =
8, 8, 8, 8, 8, 8, 8, 8,
// Rm 3m/Q 2R R2m 4m/Qm 2Rm R3m/QR Q2m
- 8, 7, 7, 7, 7, 6, 6, 5,
+ 8, 15, 15, 15, 15, 6, 6, 5,
// 2R2m R4m/QRm Q3m 2R3m/ QR2m Q4m 2R4m/ QR3m
// Q2R Q2Rm
- 4, 3, 3, 3, 2, 2, 2, 1,
+ 12, 11, 11, 11, 10, 10, 10, 9,
// na Q2R2m QR4m na Q2R3m na na full
- 1, 1, 0, 0, 0, 0, 0, 0,
+ 9, 9, 0, 0, 0, 0, 0, 0,
};
static ULONG PASSER_MATERIAL_UP_SCALER[32] =
{
// none na na m na R 2m na
- 8, 8, 8, 8, 8, 8, 7, 7,
+ 16, 16, 16, 16, 16, 16, 15, 15,
// Rm 3m/Q 2R R2m 4m/Qm 2Rm R3m/QR Q2m
- 7, 6, 7, 5, 4, 5, 4, 3,
+ 15, 14, 15, 13, 12, 13, 12, 11,
// 2R2m R4m/QRm Q3m 2R3m/ QR2m Q4m 2R4m/ QR3m
// Q2R Q2Rm
- 2, 2, 1, 1, 0, 0, 0, 0,
+ 2, 2, 9, 9, -8, -8, -8, -8,
// na Q2R2m QR4m na Q2R3m na na full
- 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
};
COOR QUEENING_RANK[2] = { 1, 8 };
@@ -119,42 +119,42 @@ COOR JUMPING_RANK[2] = { 7, 2 };
// --Larry Kaufman, IM
// "Evaluation of Material Imbalance"
//
-static SCORE PAWN_CENTRALITY_BONUS[128] =
+static SCORE PAWN_CENTRALITY_BONUS[128] =
{
- 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,
- -8, 0, 0, 0, 0, 0, 0, -8, 0,0,0,0,0,0,0,0,
- -8, 0, 5, 5, 5, 5, 0, -8, 0,0,0,0,0,0,0,0,
- -8, 0, 5, 9, 9, 5, 0, -8, 0,0,0,0,0,0,0,0,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8,8,8,8,8,8,8,8,
+ -8, 8, 8, 8, 8, 8, 8, -8, 8,8,8,8,8,8,8,8,
+ -8, 8, -3, -3, -3, -3, 8, -8, 8,8,8,8,8,8,8,8,
+ -8, 8, -3, 17, 17, -3, 8, -8, 8,8,8,8,8,8,8,8,
// -------------------------------------------------------------------
- -8, 0, 5, 9, 9, 5, 0, -8, 0,0,0,0,0,0,0,0,
- -8, 0, 5, 5, 5, 5, 0, -8, 0,0,0,0,0,0,0,0,
- -8, 0, 0, 0, 0, 0, 0, -8, 0,0,0,0,0,0,0,0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0
+ -8, 8, -3, 17, 17, -3, 8, -8, 8,8,8,8,8,8,8,8,
+ -8, 8, -3, -3, -3, -3, 8, -8, 8,8,8,8,8,8,8,8,
+ -8, 8, 8, 8, 8, 8, 8, -8, 8,8,8,8,8,8,8,8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8,8,8,8,8,8,8,8
};
-static SCORE BACKWARD_SHIELDED_BY_LOCATION[128] =
+static SCORE BACKWARD_SHIELDED_BY_LOCATION[128] =
{
+0, +0, +0, +0, +0, +0, +0, +0, 0,0,0,0,0,0,0,0,
- -7, -5, -5, -7, -7, -5, -5, -7, 0,0,0,0,0,0,0,0,
- -5, -4, -4, -5, -5, -4, -4, -5, 0,0,0,0,0,0,0,0,
- -4, -3, -3, -4, -4, -3, -3, -4, 0,0,0,0,0,0,0,0,
+ 17, 3, 3, 17, 17, 3, 3, 17, 0,0,0,0,0,0,0,0,
+ 3, 12, 12, 3, 3, 12, 12, 3, 0,0,0,0,0,0,0,0,
+ 12, -3, -3, 12, 12, -3, -3, 12, 0,0,0,0,0,0,0,0,
// -------------------------------------------------------------------
- -4, -3, -3, -4, -4, -3, -3, -4, 0,0,0,0,0,0,0,0,
- -5, -4, -4, -5, -5, -4, -4, -5, 0,0,0,0,0,0,0,0,
- -7, -5, -5, -7, -7, -5, -5, -7, 0,0,0,0,0,0,0,0,
+ 12, -3, -3, 12, 12, -3, -3, 12, 0,0,0,0,0,0,0,0,
+ 3, 12, 12, 3, 3, 12, 12, 3, 0,0,0,0,0,0,0,0,
+ 17, 3, 3, 17, 17, 3, 3, 17, 0,0,0,0,0,0,0,0,
+0, +0, +0, +0, +0, +0, +0, +0, 0,0,0,0,0,0,0,0
};
-static SCORE BACKWARD_EXPOSED_BY_LOCATION[128] =
+static SCORE BACKWARD_EXPOSED_BY_LOCATION[128] =
{
+0, +0, +0, +0, +0, +0, +0, +0, 0,0,0,0,0,0,0,0,
- -12, -9, -9, -11, -11, -9, -9, -12, 0,0,0,0,0,0,0,0,
- -9, -7, -7, -9, -9, -7, -7, -9, 0,0,0,0,0,0,0,0,
- -7, -6, -6, -7, -7, -6, -6, -7, 0,0,0,0,0,0,0,0,
+ -12, 7, 7, -27, -27, 7, 7, -12, 0,0,0,0,0,0,0,0,
+ 7, 1, 1, 7, 7, 1, 1, 7, 0,0,0,0,0,0,0,0,
+ 1, -6, -6, 1, 1, -6, -6, 1, 0,0,0,0,0,0,0,0,
// -------------------------------------------------------------------
- -7, -6, -6, -7, -7, -6, -6, -7, 0,0,0,0,0,0,0,0,
- -9, -7, -7, -9, -9, -7, -7, -9, 0,0,0,0,0,0,0,0,
- -12, -9, -9, -11, -11, -9, -9, -12, 0,0,0,0,0,0,0,0,
+ 1, -6, -6, 1, 1, -6, -6, 1, 0,0,0,0,0,0,0,0,
+ 7, 1, 1, 7, 7, 1, 1, 7, 0,0,0,0,0,0,0,0,
+ -12, 7, 7, -27, -27, 7, 7, -12, 0,0,0,0,0,0,0,0,
+0, +0, +0, +0, +0, +0, +0, +0, 0,0,0,0,0,0,0,0
};
@@ -176,99 +176,99 @@ static SCORE BACKWARD_EXPOSED_BY_LOCATION[128] =
// are the one with the doubled pawns."
// --Larry Kaufman, IM
// "All About Doubled Pawns"
-//
+//
// Note: indexed by number of files with 1+ pawn on them.
-static SCORE DOUBLED_PAWN_PENALTY_BY_COUNT[4][9] =
+static SCORE DOUBLED_PAWN_PENALTY_BY_COUNT[4][9] =
{ // ------------ count of doubled+ pawns ------------
{// 0 1 2 3 4 5 6 7 8 : no majors alive
- +0, -32, -65, -99, -134, -170, -207, -222, -250
+ +0, -32, -41, -91, -102, -170, -207, -222, -250
},
{// : 1 rook
- +0, -23, -47, -76, -108, -144, -184, -200, -216
+ +0, -7, 1, -76, -76, -120, -184, -200, -216
},
{// : 2 rooks or 1 queen
- +0, -13, -23, -34, -46, -64, -86, -111, -138
+ +0, -21, -7, -18, -30, -48, -78, -111, -138
},
{// : all majors alive
- +0, -7, -13, -25, -39, -55, -73, -95, -121
+ +0, -7, -21, -25, -31, -47, -57, -95, -121
},
};
-static SCORE ISOLATED_PAWN_PENALTY_BY_COUNT[9] =
+static SCORE ISOLATED_PAWN_PENALTY_BY_COUNT[9] =
{// 0 1 2 3 4 5 6 7 8
- +0, -3, -7, -9, -16, -35, -50, -85, -100
+ +16, 5, -7, -33, -32, -19, -34, -85, -100
};
static SCORE ISOLATED_PAWN_BY_PAWNFILE[9] =
{
- 0, -7, -8, -9, -10, -10, -9, -8, -7
+ 0, 1, -24, -9, -18, -18, -9, -24, 1
};
static SCORE ISOLATED_EXPOSED_PAWN = -5;
-static SCORE ISOLATED_DOUBLED_PAWN = -11;
+static SCORE ISOLATED_DOUBLED_PAWN = 13;
//
// Note: -25% to -33% if the enemy occupies or controls the next sq.
//
-static SCORE PASSER_BY_RANK[2][9] =
+static SCORE PASSER_BY_RANK[2][9] =
{// 0 1 2 3 4 5 6 7 8
- { +0, +0,+162,+111, +62, +36, +18, +13, +0 }, // black
- { +0, +0, +13, +18, +36, +62,+111,+162, +0 } // white
+ { +0, +0,+194,+135, +54, +20, +-6, +-3, +0 }, // black
+ { +0, +0, +-3, +-6, +20, +54,+135,+194, +0 } // white
};
-static SCORE CANDIDATE_PASSER_BY_RANK[2][9] =
+static SCORE CANDIDATE_PASSER_BY_RANK[2][9] =
{// 0 1 2 3 4 5 6 7 8
- { +0, +0, +0, +48, +34, +22, +13, +9, +0 }, // black
- { +0, +0, +9, +13, +22, +34, +48, +0, +0 } // white
+ { +0, +0, +0, +48, +42, +14, +21, +17, +0 }, // black
+ { +0, +0, +17, +21, +14, +42, +48, +0, +0 } // white
};
// Note: x2
-static SCORE CONNECTED_PASSERS_BY_RANK[2][9] =
+static SCORE CONNECTED_PASSERS_BY_RANK[2][9] =
{// 0 1 2 3 4 5 6 7 8
- { +0, +0, +96, +74, +48, +21, +10, +5, +0 }, // black
- { +0, +0, +5, +10, +21, +48, +74, +96, +0 } // white
+ { +0, +0, +80, +58, +56, +29, +10, +21, +0 }, // black
+ { +0, +0, +21, +10, +29, +56, +58, +80, +0 } // white
};
-static SCORE SUPPORTED_PASSER_BY_RANK[2][9] =
+static SCORE SUPPORTED_PASSER_BY_RANK[2][9] =
{// 0 1 2 3 4 5 6 7 8
- { +0, +0, +60, +40, +13, +6, +3, +1, +0 }, // black
- { +0, +0, +1, +3, +6, +13, +40, +60, +0 } // white
+ { +0, +0, +92, +80, +21, +6, +11, +1, +0 }, // black
+ { +0, +0, +1, +11, +6, +21, +80, +92, +0 } // white
};
static SCORE OUTSIDE_PASSER_BY_DISTANCE[9] =
{// 0 1 2 3 4 5 6 7 8
- +0, +0, +7, +14, +21, +28, +34, +41, +55
+ +0, +0, +15, +30, +21, +28, +34, +41, +55
};
-static SCORE PASSER_BONUS_AS_MATERIAL_COMES_OFF[32] =
-{
+static SCORE PASSER_BONUS_AS_MATERIAL_COMES_OFF[32] =
+{
// none na na m na R 2m na
- +60, -1, -1, +37, -1, +43, +19, -1,
+ +92, -1, -1, +53, -1, +3, +19, -1,
// Rm 3m/Q 2R R2m 4m/Qm 2Rm R3m/QR Q2m
- +14, +9, +20, +4, +3, +3, 0, 0,
+ +6, +9, +12, +-4, +-5, +-5, 8, 8,
// 2R2m R4m/QRm Q3m 2R3m/ QR2m Q4m 2R4m/ QR3m
-// Q2R Q2Rm
- 0, 0, 0, 0, 0, 0, 0, 0,
+// Q2R Q2Rm
+ 8, 8, 8, 8, 8, 8, 8, 8,
// na Q2R2m QR4m na Q2R3m na na full
- 0, 0, 0, 0, 0, 0, 0, 0,
+ 8, 8, 8, 8, 8, 8, 8, 8,
};
-SCORE RACER_WINS_RACE = +800;
+SCORE RACER_WINS_RACE = +784;
-static SCORE UNDEVELOPED_MINORS_IN_OPENING[5] =
+static SCORE UNDEVELOPED_MINORS_IN_OPENING[5] =
{// 0 1 2 3 4
- 0, -6, -10, -16, -22
+ -8, -14, -10, -24, -38
};
//
// Bishop eval terms
// ---------------------------------------------------------------------------
//
-static SCORE BISHOP_OVER_KNIGHT_IN_ENDGAME = +33;
+static SCORE BISHOP_OVER_KNIGHT_IN_ENDGAME = +1;
//
// "The bishop pair has an average value of half a pawn (more when the
@@ -277,12 +277,12 @@ static SCORE BISHOP_OVER_KNIGHT_IN_ENDGAME = +33;
// position, and enough to overwhelm most positional considerations.
// Moreover, this substantial bishop pair value holds up in all
// situations tested, regardless of what else is on the board...
-//
+//
// ...One rule which I often teach to students is that if you have the
// bishop pair, and your opponent's single bishop is a bad bishop
// (hemmed in by his own pawns), you already have full compensation
// for a pawn... Kasparov has said something similar...
-//
+//
// As noted before, the bishop pair is worth more with fewer pawns on
// the board. Aside from this factor, the half pawn value of the
// bishop pair is remarkably constant, applying even when there are no
@@ -291,58 +291,58 @@ static SCORE BISHOP_OVER_KNIGHT_IN_ENDGAME = +33;
// "Evaluation of Material Imbalance"
static SCORE BISHOP_PAIR[2][17] =
{
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
- { 53, 52, 51, 50, 49, 48, 47, 45, 43, 41, 40, 40, 40, 40, 40, 40, 40 }
+ { -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16 },
+ { 21, 68, 51, 34, 41, 48, 55, 37, 59, 57, 40, 40, 40, 40, 40, 40, 40 }
};
-static SCORE STATIONARY_PAWN_ON_BISHOP_COLOR[128] =
+static SCORE STATIONARY_PAWN_ON_BISHOP_COLOR[128] =
{
+0, +0, +0, +0, +0, +0, +0, +0, 0,0,0,0,0,0,0,0,
- -4, -6, -7, -7, -7, -7, -6, -4, 0,0,0,0,0,0,0,0,
- -6, -7, -9, -8, -8, -9, -7, -6, 0,0,0,0,0,0,0,0,
+ -20, -14, -7, -7, -7, -7, -14, -20, 0,0,0,0,0,0,0,0,
+ -14, -7, -17, -8, -8, -17, -7, -14, 0,0,0,0,0,0,0,0,
-7, -8, -10, -11, -11, -10, -8, -7, 0,0,0,0,0,0,0,0,
// -------------------------------------------------------------------
-7, -8, -10, -11, -11, -10, -8, -7, 0,0,0,0,0,0,0,0,
- -6, -7, -9, -8, -8, -9, -7, -6, 0,0,0,0,0,0,0,0,
- -4, -6, -7, -7, -7, -7, -6, -4, 0,0,0,0,0,0,0,0,
+ -14, -7, -17, -8, -8, -17, -7, -14, 0,0,0,0,0,0,0,0,
+ -20, -14, -7, -7, -7, -7, -14, -20, 0,0,0,0,0,0,0,0,
+0, +0, +0, +0, +0, +0, +0, +0, 0,0,0,0,0,0,0,0
};
-static SCORE TRANSIENT_PAWN_ON_BISHOP_COLOR[128] =
+static SCORE TRANSIENT_PAWN_ON_BISHOP_COLOR[128] =
{
+0, +0, +0, +0, +0, +0, +0, +0, 0,0,0,0,0,0,0,0,
-1, -1, -2, -2, -2, -2, -1, -1, 0,0,0,0,0,0,0,0,
- -3, -4, -4, -4, -4, -4, -4, -3, 0,0,0,0,0,0,0,0,
- -4, -5, -7, -8, -8, -7, -5, -4, 0,0,0,0,0,0,0,0,
+ -11, -4, -4, -4, -4, -4, -4, -11, 0,0,0,0,0,0,0,0,
+ -4, -5, 1, -16, -16, 1, -5, -4, 0,0,0,0,0,0,0,0,
// -------------------------------------------------------------------
- -4, -5, -7, -8, -8, -7, -5, -4, 0,0,0,0,0,0,0,0,
- -3, -4, -4, -4, -4, -4, -4, -3, 0,0,0,0,0,0,0,0,
+ -4, -5, 1, -16, -16, 1, -5, -4, 0,0,0,0,0,0,0,0,
+ -11, -4, -4, -4, -4, -4, -4, -11, 0,0,0,0,0,0,0,0,
-1, -1, -2, -2, -2, -2, -1, -1, 0,0,0,0,0,0,0,0,
+0, +0, +0, +0, +0, +0, +0, +0, 0,0,0,0,0,0,0,0
};
-//
+//
// A bishop can move to between 0..13 squares.
-//
+//
static SCORE BISHOP_MOBILITY_BY_SQUARES[14] =
{// 0 1 2 3 4 5 6 7 8 9 10 11 12 13
- -22, -14, -10, -5, -1, 0, +1, +3, +4, +5, +6, +7, +8, +9
-};// ^ |
+ -38, -22, -26, -13, -9, 0, +1, +11, +4, +13, +22, +15, +40, +-7
+};// ^ |
static SCORE BISHOP_MAX_MOBILITY_IN_A_ROW_BONUS[8] =
{// 0 1 2 3 4 5 6 7
- -10, -4, +1, +3, +4, +5, +5, +5
+ -18, 4, +9, +3, +12, +-3, +-3, +-3
};
static SCORE BISHOP_UNASSAILABLE_BY_DIST_FROM_EKING[9] =
{// 0 1 2 3 4 5 6 7 8
- +0, +33, +28, +18, +8, +4, +0, -10, -16
+ +8, +1, +36, +26, +32, +-12, +8, -26, -16
};
static SCORE BISHOP_IN_CLOSED_POSITION[33] =
{// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
- 10, 10, 10, 9, 9, 8, 8, 7, 7, 6, 5, 4, 3, 2, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ 2, 2, 2, 17, 17, 8, 8, 7, 7, -2, 13, 20, 3, 18, 9, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16
// 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
};
@@ -350,34 +350,34 @@ static SCORE BISHOP_IN_CLOSED_POSITION[33] =
// Knight eval terms
// ---------------------------------------------------------------------------
//
-static SCORE KNIGHT_CENTRALITY_BONUS[128] =
+static SCORE KNIGHT_CENTRALITY_BONUS[128] =
{
- -12, -8, -8, -8, -8, -8, -8, -12, 0,0,0,0,0,0,0,0,
- -8, -2, -2, 0, 0, -2, -2, -8, 0,0,0,0,0,0,0,0,
- -8, -2, +4, +5, +5, +4, -2, -8, 0,0,0,0,0,0,0,0,
- -8, -2, +5, +8, +8, +5, -2, -8, 0,0,0,0,0,0,0,0,
+ -60, -16, -16, -16, -16, -16, -16, -60, 0,0,0,0,0,0,0,0,
+ -16, -2, -2, 0, 0, -2, -2, -16, 0,0,0,0,0,0,0,0,
+ -16, -2, +-4, +13, +13, +-4, -2, -16, 0,0,0,0,0,0,0,0,
+ -16, -2, +13, +16, +16, +13, -2, -16, 0,0,0,0,0,0,0,0,
// -------------------------------------------------------------------
- -8, -2, +5, +8, +8, +5, -2, -8, 0,0,0,0,0,0,0,0,
- -8, -2, +4, +5, +5, +4, -2, -8, 0,0,0,0,0,0,0,0,
- -8, -2, -2, 0, 0, -2, -2, -8, 0,0,0,0,0,0,0,0,
- -12, -8, -8, -8, -8, -8, -8, -12, 0,0,0,0,0,0,0,0
+ -16, -2, +13, +16, +16, +13, -2, -16, 0,0,0,0,0,0,0,0,
+ -16, -2, +-4, +13, +13, +-4, -2, -16, 0,0,0,0,0,0,0,0,
+ -16, -2, -2, 0, 0, -2, -2, -16, 0,0,0,0,0,0,0,0,
+ -60, -16, -16, -16, -16, -16, -16, -60, 0,0,0,0,0,0,0,0
};
static SCORE KNIGHT_KING_TROPISM_BONUS[9] =
{// 0 1 2 3 4 5 6 7 8
- 0, +15, +12, +9, +4, +0, +0, +0, +0
+ 8, +-9, +12, +1, +12, +8, +8, +8, +8
};
static SCORE KNIGHT_UNASSAILABLE_BY_DIST_FROM_EKING[9] =
{// 0 1 2 3 4 5 6 7 8
- +0, +25, +19, +14, +6, +0, +0, +0, +0
+ +-24, +9, +11, +38, +14, +-24, +-24, +-24, +-24
};
static SCORE KNIGHT_ON_INTERESTING_SQUARE_BY_RANK[2][9] =
{// 0 1 2 3 4 5 6 7 8
- { +0, +12, +11, +9, +6, +3, +0, +0, +0 }, // black
- { +0, +0, +0, +0, +3, +6, +9, +11, +12 } // white
+ { +-8, +4, +27, +25, +22, +3, +-8, +-8, +-8 }, // black
+ { +-8, +-8, +-8, +-8, +3, +22, +25, +27, +4 } // white
};
//
@@ -387,23 +387,23 @@ static SCORE KNIGHT_ON_INTERESTING_SQUARE_BY_RANK[2][9] =
// 1 = unsupported enemy pawn, friend pawn, enemy B/N
// enemy controlled empty sq.
// 2 = enemy >B, friend controlled empty sq, no one controlled empty sq
-//
+//
// Total: 16 mobility max
-//
+//
static SCORE KNIGHT_MOBILITY_BY_COUNT[9] =
{// 0 1 2 3 4 5 6 7 8
- -17, -10, -6, 0, +3, +5, +7, +8, +8
+ -33, -18, -14, -8, +-5, +5, +15, +8, +8
};// ^ |
-static SCORE KNIGHT_WITH_N_PAWNS_SUPPORTING[3] =
+static SCORE KNIGHT_WITH_N_PAWNS_SUPPORTING[3] =
{
- +0, +4, +8
+ +16, +12, +0
};
static SCORE KNIGHT_IN_CLOSED_POSITION[33] =
{// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 6, 9, 11,
- 12, 13, 15, 17, 19, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 27
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 18, 4, 6, 17, -13,
+ 12, 5, -17, 1, 19, -3, -3, 30, 30, 23, 23, 24, 24, 25, 25, 26, 27
// 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
};
@@ -413,44 +413,44 @@ static SCORE KNIGHT_IN_CLOSED_POSITION[33] =
//
static SCORE ROOK_ON_FULL_OPEN_BY_DIST_FROM_EKING[8] =
{// 0 1 2 3 4 5 6 7
- +24, +22, +17, +14, +13, +13, +12, +12
+ +48, +38, +41, +38, +29, +29, +20, +20
};
-static SCORE ROOK_ON_HALF_OPEN_WITH_ENEMY_BY_DIST_FROM_EKING[8] =
+static SCORE ROOK_ON_HALF_OPEN_WITH_ENEMY_BY_DIST_FROM_EKING[8] =
{// 0 1 2 3 4 5 6 7
- +12, +11, +9, +9, +8, +8, +8, +7
+ +12, +11, +17, +17, +32, +32, +32, +15
};
static SCORE ROOK_ON_HALF_OPEN_WITH_FRIEND_BY_DIST_FROM_EKING[8] =
{// 0 1 2 3 4 5 6 7
- +13, +12, +11, +11, +9, +9, +9, +8
+ +-3, +12, +11, +11, +17, +17, +17, +16
};
static SCORE ROOK_BEHIND_PASSER_BY_PASSER_RANK[2][9] =
{// 0 1 2 3 4 5 6 7 8
- { +0, +0, +25, +17, +12, +6, +1, +0, +0 }, // black
- { +0, +0, +0, +1, +6, +12, +17, +25, +0 } // white
+ { +-24, +-24, +41, +17, +4, +-2, +-31, +-24, +-24 }, // black
+ { +-24, +-24, +-24, +-31, +-2, +4, +17, +41, +-24 } // white
};
static SCORE ROOK_LEADS_PASSER_BY_PASSER_RANK[2][9] =
{// 0 1 2 3 4 5 6 7 8
- { +0, +0, -22, -16, -13, -9, -5, -3, +0 }, // black
- { +0, +0, -3, -5, -9, -13, -16, -22, +0 } // white
+ { +0, +0, -54, -16, 11, -9, 19, -3, +0 }, // black
+ { +0, +0, -3, 19, -9, 11, -16, -54, +0 } // white
};
-static SCORE KING_TRAPPING_ROOK = -40;
+static SCORE KING_TRAPPING_ROOK = -48;
-static SCORE ROOK_TRAPPING_EKING = +22;
+static SCORE ROOK_TRAPPING_EKING = +46;
-static SCORE ROOK_VALUE_AS_PAWNS_COME_OFF[17] =
-{// 0 1 2 3 4 5 6 7 8
- +55, +51, +44, +38, +33, +27, +22, +16, +7,
+static SCORE ROOK_VALUE_AS_PAWNS_COME_OFF[17] =
+{// 0 1 2 3 4 5 6 7 8
+ +7, +35, +92, +46, +33, +-5, +-10, +16, +-17,
// 9 10 11 12 13 14 15 16
- +1, -3, -6, -9, -12, -18, -22, -25
+ +-15, -27, -38, -57, -44, -42, -70, -41
};
//
-// Note: these are multiplied by two (one per rook).
+// Note: these are multiplied by two (one per rook).
//
static SCORE ROOK_CONNECTED_VERT = +7; // x2
static SCORE ROOK_CONNECTED_HORIZ = +4; // x2
@@ -461,17 +461,17 @@ static SCORE ROOK_CONNECTED_HORIZ = +4; // x2
// 0 = supported enemy P/N/B, friend piece
// 1 = unsupported enemy piece, enemy controlled empty sq, enemy R
// 2 = enemy >R, friend controlled empty sq, no one controlled empty sq
-//
+//
// Total: 28 mobility max
-//
+//
static SCORE ROOK_MOBILITY_BY_SQUARES[15] =
{// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
- -28, -24, -20, -14, -7, -2, +0, +4, +8, +12, +15, +17, +19, +21, +22
+ -36, -16, -20, -14, -7, -10, +0, +4, +8, +12, +15, +9, +19, +13, +14
};// ^ |
static SCORE ROOK_MAX_MOBILITY_IN_A_ROW_BONUS[8] =
{// 0 1 2 3 4 5 6 7
- -15, -6, +0, +4, +8, +8, +8, +8
+ 1, 10, +8, +12, +8, +8, +8, +8
};
//
@@ -486,21 +486,21 @@ static SCORE ROOK_MAX_MOBILITY_IN_A_ROW_BONUS[8] =
// 0 = supported enemy P/N/B/R, friend piece
// 1 = unsupported enemy piece, enemy controlled empty sq, enemy Q
// 2 = enemy K, no one controlled empty sq, friend controlled empty sq
-//
+//
// Total: 54 mobility max
-//
+//
static SCORE QUEEN_MOBILITY_BY_SQUARES[28] =
{// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
- -30, -26, -22, -17, -11, -8, -4, -2, -1, +2, +4, +7, +10, +12, +14,
+ -54, -34, -22, -17, -19, -8, -4, -2, 7, +10, +12, +15, +18, +4, +30,
// |
//15 16 17 18 19 20 21 22 23 24 25 26 27
- +15, +16, +17, +18, +19, +20, +20, +21, +21, +22, +22, +23, +23
+ +31, +32, +41, +42, +35, +36, +36, +21, +21, +6, +6, +7, +7
};
-static SCORE QUEEN_OUT_EARLY[5] =
+static SCORE QUEEN_OUT_EARLY[5] =
{// 0 1 2 3 4 : num unmoved minors
- 0, -14, -22, -26, -33
+ 0, -14, -6, -2, -25
};
//
@@ -508,18 +508,18 @@ static SCORE QUEEN_OUT_EARLY[5] =
// point that queens are worth more then the standard nine "points".
// Thus, this scale is biased upwards by about 0.15 pawn.
//
-static SCORE QUEEN_KING_TROPISM[8] =
+static SCORE QUEEN_KING_TROPISM[8] =
{// 0 1 2 3 4 5 6 7
- 0, +34, +28, +22, +19, +17, +16, +15
+ 0, +34, +76, +30, +27, +9, +8, +-1
};
-static SCORE QUEEN_ATTACKS_SQ_NEXT_TO_KING = 8; // x #sq_attacked
+static SCORE QUEEN_ATTACKS_SQ_NEXT_TO_KING = -8; // x #sq_attacked
//
// King eval terms
// ---------------------------------------------------------------------------
//
-static ULONG KING_INITIAL_COUNTER_BY_LOCATION[2][128] =
+static ULONG KING_INITIAL_COUNTER_BY_LOCATION[2][128] =
{
{
1, 0, 0, 0, 1, 0, 0, 1, 0,0,0,0,0,0,0,0,
@@ -545,17 +545,17 @@ static ULONG KING_INITIAL_COUNTER_BY_LOCATION[2][128] =
}
};
-static SCORE KING_TO_CENTER[128] =
+static SCORE KING_TO_CENTER[128] =
{
- +0, +0, +0, +0, +0, +0, +0, +0, 0,0,0,0,0,0,0,0,
- +1, +3, +5, +7, +7, +5, +3, +1, 0,0,0,0,0,0,0,0,
- +3, +5, +13, +15, +15, +13, +5, +3, 0,0,0,0,0,0,0,0,
- +5, +7, +17, +23, +23, +17, +7, +5, 0,0,0,0,0,0,0,0,
+ +-32, +-32, +-32, +-32, +-32, +-32, +-32, +-32, -32,-32,-32,-32,-32,-32,-32,-32,
+ +-23, +3, +5, +-1, +-1, +5, +3, +-23, -32,-32,-32,-32,-32,-32,-32,-32,
+ +3, +5, +13, +15, +15, +13, +5, +3, -32,-32,-32,-32,-32,-32,-32,-32,
+ +5, +-1, +41, +31, +31, +41, +-1, +5, -32,-32,-32,-32,-32,-32,-32,-32,
// ------------------------------------------------------------------
- +5, +7, +17, +23, +23, +17, +7, +5, 0,0,0,0,0,0,0,0,
- +3, +5, +13, +15, +15, +13, +5, +3, 0,0,0,0,0,0,0,0,
- +1, +3, +5, +7, +7, +5, +3, +1, 0,0,0,0,0,0,0,0,
- +0, +0, +0, +0, +0, +0, +0, +0, 0,0,0,0,0,0,0,0
+ +5, +-1, +41, +31, +31, +41, +-1, +5, -32,-32,-32,-32,-32,-32,-32,-32,
+ +3, +5, +13, +15, +15, +13, +5, +3, -32,-32,-32,-32,-32,-32,-32,-32,
+ +-23, +3, +5, +-1, +-1, +5, +3, +-23, -32,-32,-32,-32,-32,-32,-32,-32,
+ +-32, +-32, +-32, +-32, +-32, +-32, +-32, +-32, -32,-32,-32,-32,-32,-32,-32,-32
};
//
@@ -573,7 +573,7 @@ static SCORE KING_TO_CENTER[128] =
#define KEEP_KING_AT_HOME_THRESHOLD \
(VALUE_ROOK + VALUE_ROOK + VALUE_BISHOP + VALUE_KING + 1)
-static ULONG KING_COUNTER_BY_ATTACK_PATTERN[32] =
+static ULONG KING_COUNTER_BY_ATTACK_PATTERN[32] =
{
//p 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
//m 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
@@ -585,13 +585,13 @@ static ULONG KING_COUNTER_BY_ATTACK_PATTERN[32] =
static SCORE KING_SAFETY_BY_COUNTER[42] =
{
- -0, -4, -8, -12, -16, -20, -25, -31, -38, -50, -63, -76, -90,
- -105,-120,-135,-150,-165,-180,-195,-210,-225,-240,-255,-270,-290,
- -310,-330,-350,-370,-390,-410,-440,-470,-500,-500,-500,-500,-500,
- -500,-500,-500
+ 0, -4, -40, -28, -24, -28, -33, -39, -30, -50, -55, -60, -90,
+ -97,-104,-135,-150,-141,-148,-211,-210,-217,-240,-255,-286,-306,
+ -262,-330,-350,-386,-390,-378,-448,-462,-508,-508,-508,-508,-508,
+ -508,-508,-508
};
-static SCORE KING_MISSING_ONE_CASTLE_OPTION = -23;
+static SCORE KING_MISSING_ONE_CASTLE_OPTION = 9;
typedef struct _DNA_BASE_SIZE {
SCORE *pBase;
ULONG uCount;
@@ -659,8 +659,8 @@ static DNA_BASE_SIZE g_EvalDNA[] = {
DNA_VAR(KING_MISSING_ONE_CASTLE_OPTION)
};
-ULONG
-DNABufferSizeBytes()
+ULONG
+DNABufferSizeBytes()
{
ULONG u;
ULONG uSize = 0;
@@ -672,14 +672,14 @@ DNABufferSizeBytes()
char *
-ExportEvalDNA()
+ExportEvalDNA()
{
ULONG uSize = DNABufferSizeBytes();
char *p = malloc(uSize);
ULONG u, v;
SCORE *q;
FLAG fFirst = TRUE;
-
+
memset(p, 0, uSize);
for (u = 0; u < ARRAY_LENGTH(g_EvalDNA); u++) {
q = g_EvalDNA[u].pBase;
@@ -735,7 +735,7 @@ ImportEvalDNA(char *p)
}
FLAG
-ReadEvalDNA(char *szFilename)
+ReadEvalDNA(char *szFilename)
{
FILE *p = NULL;
ULONG uSize = DNABufferSizeBytes();
@@ -795,31 +795,31 @@ BITBOARD BBADJACENT_FILES[8] =
{
// A = 0
BBFILEB,
-
+
// B = 1
BBFILEA | BBFILEC,
-
+
// C = 2
BBFILEB | BBFILED,
-
+
// D = 3
BBFILEC | BBFILEE,
-
+
// E = 4
BBFILED | BBFILEF,
-
+
// F = 5
BBFILEE | BBFILEG,
-
+
// G = 6
BBFILEF | BBFILEH,
-
+
// H = 7
BBFILEG
};
//
-// The ranks preceeding one, indexed by rank/color of pawn (used in
+// The ranks preceeding one, indexed by rank/color of pawn (used in
// eval.c)
//
BITBOARD BBPRECEEDING_RANKS[8][2] =
@@ -853,15 +853,15 @@ BITBOARD BBPRECEEDING_RANKS[8][2] =
};
-static FLAG
-_IsSquareSafeFromEnemyPawn(IN POSITION *pos,
- IN COOR c,
+static FLAG
+_IsSquareSafeFromEnemyPawn(IN POSITION *pos,
+ IN COOR c,
IN BITBOARD bb)
/**
Routine description:
- Determine if a piece in square c is "outposted". A piece is
+ Determine if a piece in square c is "outposted". A piece is
outposted if no enemy pawns can advance to attack it / drive
it away.
@@ -888,16 +888,16 @@ Return value:
ASSERT(p && (IS_BISHOP(p) || IS_KNIGHT(p) || IS_PAWN(p)));
ASSERT(IS_VALID_COLOR(uColor));
#endif
-
+
uFile = FILE(c);
ASSERT(uFile < 8);
bb &= BBADJACENT_FILES[uFile];
-
+
ASSERT(((c & 0x70) >> 4) == (c >> 4));
uRank = c >> 4;
ASSERT(uRank < 8);
bb &= BBPRECEEDING_RANKS[uRank][uColor];
-
+
#ifdef DEBUG
if (bb != 0)
{
@@ -960,8 +960,8 @@ Return value:
}
-static ULONG
-_WhoControlsSquareFast(IN POSITION *pos,
+static ULONG
+_WhoControlsSquareFast(IN POSITION *pos,
IN COOR c)
/**
@@ -979,7 +979,7 @@ Return value:
static ULONG : (ULONG)-1 if neither side controls it or the sides
control it evenly, WHITE if white controls the square, or BLACK if
black controls the square.
-
+
TODO: fix this to use counts / xrays
**/
@@ -991,7 +991,7 @@ Return value:
ULONG u;
PIECE p;
CHAR ch;
-
+
ASSERT((c + 8) == (c | 8));
ASSERT((uWhite & 0xFFFFFF00) == 0);
ASSERT((uBlack & 0xFFFFFF00) == 0);
@@ -999,7 +999,7 @@ Return value:
// TODO: keep these and update the table to use them
uWhite >>= 3;
uBlack >>= 3;
-
+
p = pos->rgSquare[c].pPiece;
// p -= 2;
ch = g_SwapTable[p][uWhite][uBlack];
@@ -1053,7 +1053,7 @@ Return value:
CLEAR_A_SQ; c++; \
CLEAR_A_SQ; c += 10;
-static void
+static void
_ClearAttackTables(IN OUT POSITION *pos)
{
register COOR c = 8;
@@ -1087,8 +1087,8 @@ _ClearAttackTables(IN OUT POSITION *pos)
}
-static INLINE void
-_InitializePawnHashEntry(IN OUT PAWN_HASH_ENTRY *pHash,
+static INLINE void
+_InitializePawnHashEntry(IN OUT PAWN_HASH_ENTRY *pHash,
IN POSITION *pos)
/**
@@ -1149,11 +1149,11 @@ Return value:
ASSERT(IS_PAWN(pHelper));
uColor = GET_COLOR(pHelper);
ASSERT(IS_VALID_COLOR(uColor));
-
+
if (pHash->uCountPerFile[FLIP(uColor)][uPawnFile] != 0)
{
ASSERT((pHash->bbPawnLocations[FLIP(uColor)] & BBFILE[FILE(c)]) != 0);
-
+
//
// The only way a pawn can be a passer/candidate if the other
// side has a pawn on its same file is if that enemy pawn is
@@ -1182,12 +1182,12 @@ Return value:
break;
}
}
-
+
//
// Count FLIP(uColor)'s sentries and determine the location of the
- // critical square. Note if there are no sentries then this
+ // critical square. Note if there are no sentries then this
// pawn (on square c) is a passer already, not a candidate.
- //
+ //
bb = pHash->bbPawnLocations[FLIP(uColor)] & BBADJACENT_FILES[FILE(c)];
bb &= BBPRECEEDING_RANKS[(c & 0x70) >> 4][uColor];
if (!bb)
@@ -1206,11 +1206,11 @@ Return value:
pHash->iScore[uColor],
PASSER_BY_RANK[uColor][RANK(c)],
"passed pawn");
-
+
//
// However, don't give doubled passers such a big bonus.
//
- if (IS_PAWN(pos->rgSquare[c - 16 * g_iAhead[uColor]].pPiece))
+ if (IS_PAWN(pos->rgSquare[c - 16 * g_iAhead[uColor]].pPiece))
{
EVAL_TERM(uColor,
PAWN,
@@ -1256,7 +1256,7 @@ Return value:
if (pos->rgSquare[c1 - 1].pPiece == pSentry)
{
uVerifySentries++;
- if (0 == cVerifySquare)
+ if (0 == cVerifySquare)
{
cVerifySquare = c1 - d1;
ASSERT(cVerifySquare == cSquare);
@@ -1308,7 +1308,7 @@ Return value:
uHelpers = 1;
goto do_left;
}
-
+
//
// There is no helper pawn in the support position yet.
// See if one can get there.
@@ -1331,7 +1331,7 @@ Return value:
}
}
}
-
+
do_left:
c1 = cSquare - 1 - d1;
if ((IS_ON_BOARD(c1)) && (pHash->uCountPerFile[uColor][FILE(c1) + 1]))
@@ -1350,7 +1350,7 @@ Return value:
uHelpers++;
goto done_helpers;
}
-
+
//
// There is no pawn in the left support position yet. See
// if one can get there.
@@ -1373,7 +1373,7 @@ Return value:
}
}
}
-
+
done_helpers:
if ((uHelpers >= uSentries) ||
((pHash->uCountPerFile[uColor][uPawnFile + 1] +
@@ -1405,7 +1405,7 @@ Return value:
}
}
-static void
+static void
_EvaluateConnectedSupportedOutsidePassers(IN POSITION *pos,
IN OUT PAWN_HASH_ENTRY *pHash)
/**
@@ -1430,15 +1430,15 @@ Return value:
PIECE pFriend;
COOR cSupport;
BITBOARD bb;
- static const INT iDelta[5] =
+ static const INT iDelta[5] =
{
-1, +1, +17, +15, 0
};
-
+
FOREACH_COLOR(uColor)
{
ASSERT(IS_VALID_COLOR(uColor));
-
+
if (pHash->bbPasserLocations[uColor])
{
ASSERT(pos->uPawnCount[uColor] > 0);
@@ -1464,14 +1464,14 @@ Return value:
cLeftmostPasser = c;
}
cRightmostPasser = c;
-
+
v = 0;
while(iDelta[v] != 0)
{
cSupport = c + iDelta[v] * g_iBehind[uColor];
if (IS_ON_BOARD(cSupport))
{
- if (pHash->bbPasserLocations[uColor] &
+ if (pHash->bbPasserLocations[uColor] &
COOR_TO_BB(cSupport))
{
ASSERT(CONNECTED_PASSERS_BY_RANK[uColor]
@@ -1489,7 +1489,7 @@ Return value:
// strong.
//
}
- else if (pos->rgSquare[cSupport].pPiece ==
+ else if (pos->rgSquare[cSupport].pPiece ==
pFriend)
{
ASSERT(SUPPORTED_PASSER_BY_RANK[uColor]
@@ -1508,7 +1508,7 @@ Return value:
}
}
}
-
+
#ifdef DEBUG
ASSERT(IS_ON_BOARD(cLeftmostPasser));
ASSERT(IS_ON_BOARD(cRightmostPasser));
@@ -1565,12 +1565,12 @@ Return value:
}
}
}
-
+
#define PAWN_ATTACK_BLACK_DELTA (+15)
#define PAWN_ATTACK_WHITE_DELTA (-17)
-static void
+static void
_PopulatePawnAttackBits(IN OUT POSITION *pos)
/**
@@ -1607,7 +1607,7 @@ Return value:
ASSERT(pos->uPawnCount[BLACK] <= 8);
for (u = 0;
- u < pos->uPawnCount[BLACK];
+ u < pos->uPawnCount[BLACK];
u++)
{
c = pos->cPawns[BLACK][u];
@@ -1615,10 +1615,10 @@ Return value:
ASSERT(pos->rgSquare[c].pPiece);
ASSERT(IS_PAWN(pos->rgSquare[c].pPiece));
ASSERT(GET_COLOR(pos->rgSquare[c].pPiece) == BLACK);
-
+
//
// IDEA: These IS_ON_BOARD checks can be removed by a lookup table.
- //
+ //
cAttack = c + PAWN_ATTACK_BLACK_DELTA;
if (IS_ON_BOARD(cAttack))
{
@@ -1638,7 +1638,7 @@ Return value:
ASSERT(pos->uPawnCount[WHITE] <= 8);
for (u = 0;
- u < pos->uPawnCount[WHITE];
+ u < pos->uPawnCount[WHITE];
u++)
{
c = pos->cPawns[WHITE][u];
@@ -1646,7 +1646,7 @@ Return value:
ASSERT(pos->rgSquare[c].pPiece);
ASSERT(IS_PAWN(pos->rgSquare[c].pPiece));
ASSERT(GET_COLOR(pos->rgSquare[c].pPiece) == WHITE);
-
+
cAttack = c + PAWN_ATTACK_WHITE_DELTA;
if (IS_ON_BOARD(cAttack))
{
@@ -1664,10 +1664,10 @@ Return value:
}
}
}
-
+
static PAWN_HASH_ENTRY *
-_EvalPawns(IN OUT SEARCHER_THREAD_CONTEXT *ctx,
+_EvalPawns(IN OUT SEARCHER_THREAD_CONTEXT *ctx,
OUT FLAG *pfDeferred)
/**
@@ -1698,7 +1698,7 @@ Return value:
ULONG uUnsupportable;
BITBOARD bb;
int d1;
-#ifdef DEBUG
+#ifdef DEBUG
SCORE t;
#endif
@@ -1734,10 +1734,10 @@ Return value:
{
ASSERT(IS_VALID_COLOR(uColor));
ASSERT(pos->uPawnCount[uColor] <= 8);
-
+
d1 = 16 * g_iAhead[uColor];
- for (u = 0;
- u < pos->uPawnCount[uColor];
+ for (u = 0;
+ u < pos->uPawnCount[uColor];
u++)
{
c = pos->cPawns[uColor][u];
@@ -1746,17 +1746,17 @@ Return value:
ASSERT(IS_PAWN(pos->rgSquare[c].pPiece));
uPawnFile = FILE(c) + 1;
ASSERT((1 <= uPawnFile) && (uPawnFile <= 8));
-
+
//
// Update files counter
//
ASSERT(pHash->uCountPerFile[uColor][uPawnFile] < 6);
pHash->uCountPerFile[uColor][uPawnFile]++;
-
+
//
// Update bitboard bit
//
- ASSERT(CountBits(pHash->bbPawnLocations[uColor] &
+ ASSERT(CountBits(pHash->bbPawnLocations[uColor] &
BBFILE[uPawnFile-1]) < 6);
ASSERT((pHash->bbPawnLocations[uColor] & COOR_TO_BB(c)) == 0);
pHash->bbPawnLocations[uColor] |= COOR_TO_BB(c);
@@ -1767,16 +1767,16 @@ Return value:
//
// Count unmoved pawns
//
- pHash->uNumUnmovedPawns[uColor] +=
+ pHash->uNumUnmovedPawns[uColor] +=
((c & 0xF0) == uUnmovedRank[uColor]);
ASSERT(pHash->uNumUnmovedPawns[uColor] <= 8);
-
+
//
// Detect rammed and other stationary pawns.
//
cSquare = c + d1;
ASSERT(IS_ON_BOARD(cSquare));
- p = pos->rgSquare[cSquare].pPiece;
+ p = pos->rgSquare[cSquare].pPiece;
if (IS_PAWN(p))
{
pHash->bbStationaryPawns[uColor] |= COOR_TO_BB(c);
@@ -1806,15 +1806,15 @@ Return value:
//
// Second pass
- //
+ //
FOREACH_COLOR(uColor)
{
ASSERT(IS_VALID_COLOR(uColor));
ASSERT(pos->uPawnCount[uColor] <= 8);
ASSERT(CountBits(pHash->bbPawnLocations[uColor]) <= 8);
-
+
d1 = 16 * g_iAhead[uColor];
- for (u = 0;
+ for (u = 0;
u < pos->uPawnCount[uColor];
u++)
{
@@ -1822,7 +1822,7 @@ Return value:
ASSERT(IS_ON_BOARD(c));
ASSERT(IS_PAWN(pos->rgSquare[c].pPiece));
ASSERT((1 < RANK(c)) && (RANK(c) < 8));
-
+
//
// Find weak pawns... pawns that are isolated are weak as
// are pawns that have advanced beyond their support.
@@ -1833,14 +1833,14 @@ Return value:
uPawnFile = FILE(c) - 1;
if (pHash->uCountPerFile[uColor][uPawnFile + 1] > 0)
{
- bb = (pHash->bbPawnLocations[uColor] &
+ bb = (pHash->bbPawnLocations[uColor] &
BBFILE[uPawnFile] &
BBADJACENT_RANKS[RANK(c)]);
if (!bb)
{
bb = (pHash->bbPawnLocations[FLIP(uColor)] &
BBFILE[uPawnFile]);
- while(IS_ON_BOARD(cSquare =
+ while(IS_ON_BOARD(cSquare =
CoorFromBitBoardRank8ToRank1(&bb)))
{
ASSERT(IS_PAWN(pos->rgSquare[cSquare].pPiece));
@@ -1879,14 +1879,14 @@ Return value:
uPawnFile = FILE(c) + 1;
if (pHash->uCountPerFile[uColor][uPawnFile + 1] > 0)
{
- bb = (pHash->bbPawnLocations[uColor] &
+ bb = (pHash->bbPawnLocations[uColor] &
BBFILE[uPawnFile] &
BBADJACENT_RANKS[RANK(c)]);
if (!bb)
{
bb = (pHash->bbPawnLocations[FLIP(uColor)] &
BBFILE[uPawnFile]);
- while(IS_ON_BOARD(cSquare =
+ while(IS_ON_BOARD(cSquare =
CoorFromBitBoardRank8ToRank1(&bb)))
{
ASSERT(IS_PAWN(pos->rgSquare[cSquare].pPiece));
@@ -1916,7 +1916,7 @@ Return value:
{
uUnsupportable = 2;
}
-
+
//
// If this pawn is not supportable from either side then
// it is either isolated or has been pushed too far ahead
@@ -1941,17 +1941,17 @@ Return value:
PAWN,
c,
pHash->iScore[uColor],
- ((pHash->uCountPerFile[FLIP(uColor)][uPawnFile]==0)*
+ ((pHash->uCountPerFile[FLIP(uColor)][uPawnFile]==0)*
ISOLATED_EXPOSED_PAWN),
"exposed target");
-
+
//
// Exponential penalty term
//
uIsolated[uColor] += 1;
ASSERT(uIsolated[uColor] > 0);
ASSERT(uIsolated[uColor] <= 8);
-
+
//
// Isolated + doubled? Extra penalty.
//
@@ -2010,7 +2010,7 @@ Return value:
{
//
// Detect backwards pawns. See "Pawn Power in Chess" pp 25-27
- //
+ //
if (!IS_PAWN(pos->rgSquare[cSquare].pPiece))
{
p = (BLACK_PAWN | uColor);
@@ -2055,19 +2055,19 @@ Return value:
//
// TODO: Think about backward doubled pawns; read Kauffman's
// paper "All About Doubled Pawns".
- //
+ //
}
//
// Handle passers / candidate passers
- //
+ //
_EvaluateCandidatePasser(pos, pHash, c);
}
}
-
+
//
// Reward pawn duos, see "Pawn Power in Chess" pp. 10-16
- //
+ //
ASSERT(iDuos[WHITE] >= 0);
ASSERT(iDuos[WHITE] <= 56);
ASSERT(iDuos[BLACK] >= 0);
@@ -2128,9 +2128,9 @@ Return value:
pHash->iScore[WHITE],
ISOLATED_PAWN_PENALTY_BY_COUNT[uIsolated[WHITE]],
"exponential isolated");
-
+
//
- // Look for connected, supported and outside passed pawns to give
+ // Look for connected, supported and outside passed pawns to give
// extra bonuses.
//
_EvaluateConnectedSupportedOutsidePassers(pos, pHash);
@@ -2142,7 +2142,7 @@ Return value:
}
-ULONG
+ULONG
CountKingSafetyDefects(IN OUT POSITION *pos,
IN ULONG uSide)
/**
@@ -2170,11 +2170,11 @@ Return value:
int i;
PIECE p;
ULONG u;
-
+
//
// Don't count king safety defects if the real eval code in
// _EvalKing would not...
- //
+ //
if (pos->uNonPawnMaterial[xSide] < DO_KING_SAFETY_THRESHOLD) {
return 0;
}
@@ -2185,7 +2185,7 @@ Return value:
ASSERT(pos->rgSquare[cKing].uIndex == 0);
ASSERT(IS_ON_BOARD(cKing));
ASSERT(GET_COLOR(pos->rgSquare[cKing].pPiece) == uSide);
-
+
//
// Make sure cKing - 1, cKing and cKing + 1 are on the board
//
@@ -2218,16 +2218,16 @@ Return value:
((CHECK_VECTOR_WITH_INDEX(i + 2, xSide) & p) != 0));
}
ASSERT(uCounter < 15);
-
+
// Save the number of enemy pieces pointing at this king for later use.
- pos->uPiecesPointingAtKing[uSide] =
+ pos->uPiecesPointingAtKing[uSide] =
(uCounter - (KING_INITIAL_COUNTER_BY_LOCATION[uSide][cKing] >> 1));
return uCounter;
}
static void
-_QuicklyEstimateKingSafetyTerm(IN POSITION *pos,
+_QuicklyEstimateKingSafetyTerm(IN POSITION *pos,
IN OUT SCORE *piAlphaMargin,
IN OUT SCORE *piBetaMargin)
/**
@@ -2258,12 +2258,12 @@ Return value:
SCORE iRet;
ASSERT(CountKingSafetyDefects(pos, pos->uToMove) < 15);
- iPenaltyEst[WHITE] =
+ iPenaltyEst[WHITE] =
iScoreByDefectCount[CountKingSafetyDefects(pos, WHITE)];
ASSERT(iPenaltyEst[WHITE] > 0);
ASSERT(CountKingSafetyDefects(pos, BLACK) < 15);
- iPenaltyEst[BLACK] =
+ iPenaltyEst[BLACK] =
iScoreByDefectCount[CountKingSafetyDefects(pos, BLACK)];
ASSERT(iPenaltyEst[BLACK] > 0);
@@ -2293,7 +2293,7 @@ static void
_QuicklyEstimatePasserBonuses(POSITION *pos,
PAWN_HASH_ENTRY *pHash,
SCORE *piAlphaMargin,
- SCORE *piBetaMargin)
+ SCORE *piBetaMargin)
{
SCORE iBonusEst[2] = {0, 0};
SCORE iRet;
@@ -2308,7 +2308,7 @@ _QuicklyEstimatePasserBonuses(POSITION *pos,
u /= VALUE_PAWN;
u = MINU(31, u);
ASSERT(PASSER_BONUS_AS_MATERIAL_COMES_OFF[u] >= 0);
- iBonusEst[WHITE] =
+ iBonusEst[WHITE] =
(CountBits(pHash->bbPasserLocations[WHITE]) *
PASSER_BONUS_AS_MATERIAL_COMES_OFF[u]);
}
@@ -2318,7 +2318,7 @@ _QuicklyEstimatePasserBonuses(POSITION *pos,
u /= VALUE_PAWN;
u = MINU(31, u);
ASSERT(PASSER_BONUS_AS_MATERIAL_COMES_OFF[u] >= 0);
- iBonusEst[BLACK] =
+ iBonusEst[BLACK] =
(CountBits(pHash->bbPasserLocations[BLACK]) *
PASSER_BONUS_AS_MATERIAL_COMES_OFF[u]);
}
@@ -2334,7 +2334,7 @@ _QuicklyEstimatePasserBonuses(POSITION *pos,
//
// For the alpha bonus, assume our passer bonus gets doubled and
- // our opponent's is reduced. Net bonus to us / their bonus not
+ // our opponent's is reduced. Net bonus to us / their bonus not
// as high.
//
iRet = iBonusEst[pos->uToMove] - iBonusEst[FLIP(pos->uToMove)] / 2;
@@ -2343,9 +2343,9 @@ _QuicklyEstimatePasserBonuses(POSITION *pos,
}
-static void
-_InvalidEvaluator(UNUSED POSITION *pos,
- UNUSED COOR c,
+static void
+_InvalidEvaluator(UNUSED POSITION *pos,
+ UNUSED COOR c,
UNUSED PAWN_HASH_ENTRY *pHash)
/**
@@ -2374,7 +2374,7 @@ Return value:
// ======================================================================
//
-static FLAG FASTCALL
+static FLAG FASTCALL
_InvalidMobilityHelper(UNUSED POSITION *pos,
UNUSED COOR c,
UNUSED ULONG *puMobility,
@@ -2406,7 +2406,7 @@ Return value:
// ----------------------------------------------------------------------
-static FLAG FASTCALL
+static FLAG FASTCALL
_BMinorToEnemyLess(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -2433,7 +2433,7 @@ Return value:
#ifdef DEBUG
PIECE pMinor = pos->rgSquare[pos->cPiece].pPiece;
PIECE p = pos->rgSquare[c].pPiece;
-
+
ASSERT(IS_ON_BOARD(c));
ASSERT(IS_ON_BOARD(pos->cPiece));
ASSERT(!IS_EMPTY(p));
@@ -2449,7 +2449,7 @@ Return value:
return(TRUE); // stop scanning this dir
}
-static FLAG FASTCALL
+static FLAG FASTCALL
_WMinorToEnemyLess(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -2474,7 +2474,7 @@ Return value:
#ifdef DEBUG
PIECE pMinor = pos->rgSquare[pos->cPiece].pPiece;
PIECE p = pos->rgSquare[c].pPiece;
-
+
ASSERT(IS_ON_BOARD(c));
ASSERT(IS_ON_BOARD(pos->cPiece));
ASSERT(!IS_EMPTY(p));
@@ -2490,7 +2490,7 @@ Return value:
return(TRUE); // stop scanning this dir
}
-static FLAG FASTCALL
+static FLAG FASTCALL
_WRookToEnemyLess(POSITION *pos,
COOR c,
ULONG *puMobility,
@@ -2515,7 +2515,7 @@ Return value:
#ifdef DEBUG
PIECE p = pos->rgSquare[c].pPiece;
PIECE pRook = pos->rgSquare[pos->cPiece].pPiece;
-
+
ASSERT(IS_ROOK(pRook));
ASSERT(!IS_EMPTY(p));
ASSERT(OPPOSITE_COLORS(p, pRook));
@@ -2527,7 +2527,7 @@ Return value:
return(TRUE); // stop scanning this dir
}
-static FLAG FASTCALL
+static FLAG FASTCALL
_BRookToEnemyLess(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -2552,7 +2552,7 @@ Return value:
#ifdef DEBUG
PIECE p = pos->rgSquare[c].pPiece;
PIECE pRook = pos->rgSquare[pos->cPiece].pPiece;
-
+
ASSERT(IS_ON_BOARD(c));
ASSERT(IS_ON_BOARD(pos->cPiece));
ASSERT(IS_ROOK(pRook));
@@ -2566,7 +2566,7 @@ Return value:
}
-static FLAG FASTCALL
+static FLAG FASTCALL
_BQueenToEnemyLess(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -2591,7 +2591,7 @@ Return value:
#ifdef DEBUG
PIECE p = pos->rgSquare[c].pPiece;
PIECE pQueen = pos->rgSquare[pos->cPiece].pPiece;
-
+
ASSERT(IS_ON_BOARD(c));
ASSERT(IS_ON_BOARD(pos->cPiece));
ASSERT(IS_QUEEN(pQueen));
@@ -2605,7 +2605,7 @@ Return value:
}
-static FLAG FASTCALL
+static FLAG FASTCALL
_WQueenToEnemyLess(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -2630,7 +2630,7 @@ Return value:
#ifdef DEBUG
PIECE p = pos->rgSquare[c].pPiece;
PIECE pQueen = pos->rgSquare[pos->cPiece].pPiece;
-
+
ASSERT(IS_ON_BOARD(c));
ASSERT(IS_ON_BOARD(pos->cPiece));
ASSERT(IS_QUEEN(pQueen));
@@ -2645,7 +2645,7 @@ Return value:
// ----------------------------------------------------------------------
-static FLAG FASTCALL
+static FLAG FASTCALL
_EMinorToEnemySame(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -2670,13 +2670,13 @@ Return value:
#ifdef DEBUG
PIECE pMinor = pos->rgSquare[pos->cPiece].pPiece;
PIECE p = pos->rgSquare[c].pPiece;
-
+
ASSERT(IS_ON_BOARD(c));
ASSERT(IS_ON_BOARD(pos->cPiece));
ASSERT(!IS_EMPTY(p));
ASSERT(!IS_EMPTY(pMinor));
ASSERT(OPPOSITE_COLORS(p, pMinor));
-
+
if (IS_BISHOP(pMinor))
{
ASSERT(PIECE_VALUE(p) == VALUE_BISHOP);
@@ -2693,7 +2693,7 @@ Return value:
}
-static FLAG FASTCALL
+static FLAG FASTCALL
_ERookToEnemySame(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -2718,7 +2718,7 @@ Return value:
#ifdef DEBUG
PIECE p = pos->rgSquare[c].pPiece;
PIECE pRook = pos->rgSquare[pos->cPiece].pPiece;
-
+
ASSERT(IS_ON_BOARD(c));
ASSERT(IS_ON_BOARD(pos->cPiece));
ASSERT(IS_ROOK(pRook));
@@ -2732,7 +2732,7 @@ Return value:
}
-static FLAG FASTCALL
+static FLAG FASTCALL
_EQueenToEnemyGreaterEqual(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -2757,7 +2757,7 @@ Return value:
#ifdef DEBUG
PIECE p = pos->rgSquare[c].pPiece;
PIECE pQueen = pos->rgSquare[pos->cPiece].pPiece;
-
+
ASSERT(IS_ON_BOARD(c));
ASSERT(IS_ON_BOARD(pos->cPiece));
ASSERT(IS_QUEEN(pQueen));
@@ -2772,7 +2772,7 @@ Return value:
// ----------------------------------------------------------------------
-static FLAG FASTCALL
+static FLAG FASTCALL
_EMinorToEnemyGreater(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -2797,7 +2797,7 @@ Return value:
#ifdef DEBUG
PIECE pMinor = pos->rgSquare[pos->cPiece].pPiece;
PIECE p = pos->rgSquare[c].pPiece;
-
+
ASSERT(IS_ON_BOARD(c));
ASSERT(IS_ON_BOARD(pos->cPiece));
ASSERT(!IS_EMPTY(p));
@@ -2811,7 +2811,7 @@ Return value:
return(FALSE); // keep scanning this dir
}
-static FLAG FASTCALL
+static FLAG FASTCALL
_ERookToEnemyGreater(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -2852,7 +2852,7 @@ Return value:
// ----------------------------------------------------------------------
-static FLAG FASTCALL
+static FLAG FASTCALL
_AnythingToFriendNoXray(IN POSITION *pos,
IN COOR c,
UNUSED ULONG *puMobility,
@@ -2878,7 +2878,7 @@ Return value:
COOR cMover = pos->cPiece;
PIECE pMover = pos->rgSquare[cMover].pPiece;
PIECE pFriend = pos->rgSquare[c].pPiece;
-
+
ASSERT(IS_ON_BOARD(c));
ASSERT(IS_ON_BOARD(cMover));
ASSERT(!IS_EMPTY(pFriend));
@@ -2906,7 +2906,7 @@ Return value:
// ----------------------------------------------------------------------
-static FLAG FASTCALL
+static FLAG FASTCALL
_EMinorToFriendXray(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -2931,7 +2931,7 @@ Return value:
#ifdef DEBUG
PIECE pMinor = pos->rgSquare[pos->cPiece].pPiece;
PIECE p = pos->rgSquare[c].pPiece;
-
+
ASSERT(!IS_EMPTY(p));
ASSERT(!IS_EMPTY(pMinor));
ASSERT(IS_BISHOP(pMinor));
@@ -2941,7 +2941,7 @@ Return value:
return(FALSE);
}
-static FLAG FASTCALL
+static FLAG FASTCALL
_BRookToFriendRook(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -2968,7 +2968,7 @@ Return value:
#ifdef DEBUG
PIECE p = pos->rgSquare[c].pPiece;
PIECE pRook = pos->rgSquare[cRook].pPiece;
-
+
ASSERT(IS_ON_BOARD(c));
ASSERT(IS_ON_BOARD(cRook));
ASSERT(IS_ROOK(pRook));
@@ -2983,7 +2983,7 @@ Return value:
ROOK,
c,
pos->iScore[BLACK],
- (ROOK_CONNECTED_HORIZ * fHoriz +
+ (ROOK_CONNECTED_HORIZ * fHoriz +
ROOK_CONNECTED_VERT * FLIP(fHoriz)),
"rook connected");
*puBit = ROOK_XRAY_BIT;
@@ -2991,7 +2991,7 @@ Return value:
}
-static FLAG FASTCALL
+static FLAG FASTCALL
_WRookToFriendRook(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -3018,7 +3018,7 @@ Return value:
#ifdef DEBUG
PIECE p = pos->rgSquare[c].pPiece;
PIECE pRook = pos->rgSquare[cRook].pPiece;
-
+
ASSERT(IS_ON_BOARD(c));
ASSERT(IS_ON_BOARD(cRook));
ASSERT(IS_ROOK(pRook));
@@ -3033,7 +3033,7 @@ Return value:
ROOK,
c,
pos->iScore[WHITE],
- (ROOK_CONNECTED_HORIZ * fHoriz +
+ (ROOK_CONNECTED_HORIZ * fHoriz +
ROOK_CONNECTED_VERT * FLIP(fHoriz)),
"rook connected");
*puBit = ROOK_XRAY_BIT;
@@ -3041,7 +3041,7 @@ Return value:
}
-static FLAG FASTCALL
+static FLAG FASTCALL
_ERookToFriendQueen(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -3066,7 +3066,7 @@ Return value:
#ifdef DEBUG
PIECE p = pos->rgSquare[c].pPiece;
PIECE pRook = pos->rgSquare[pos->cPiece].pPiece;
-
+
ASSERT(IS_ON_BOARD(c));
ASSERT(IS_ON_BOARD(pos->cPiece));
ASSERT(IS_ROOK(pRook));
@@ -3078,7 +3078,7 @@ Return value:
return(FALSE);
}
-static FLAG FASTCALL
+static FLAG FASTCALL
_EQueenToFriendBishop(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -3104,7 +3104,7 @@ Return value:
#ifdef DEBUG
PIECE p = pos->rgSquare[c].pPiece;
PIECE pQueen = pos->rgSquare[cQueen].pPiece;
-
+
ASSERT(IS_ON_BOARD(c));
ASSERT(IS_ON_BOARD(cQueen));
ASSERT(IS_QUEEN(pQueen));
@@ -3117,7 +3117,7 @@ Return value:
}
-static FLAG FASTCALL
+static FLAG FASTCALL
_EQueenToFriendRook(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -3143,7 +3143,7 @@ Return value:
#ifdef DEBUG
PIECE p = pos->rgSquare[c].pPiece;
PIECE pQueen = pos->rgSquare[cQueen].pPiece;
-
+
ASSERT(IS_ON_BOARD(c));
ASSERT(IS_ON_BOARD(cQueen));
ASSERT(IS_QUEEN(pQueen));
@@ -3156,7 +3156,7 @@ Return value:
}
-static FLAG FASTCALL
+static FLAG FASTCALL
_EQueenToFriendQueen(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -3182,7 +3182,7 @@ Return value:
COOR cQueen = pos->cPiece;
PIECE p = pos->rgSquare[c].pPiece;
PIECE pQueen = pos->rgSquare[cQueen].pPiece;
-
+
ASSERT(IS_ON_BOARD(c));
ASSERT(IS_ON_BOARD(cQueen));
ASSERT(IS_QUEEN(pQueen));
@@ -3196,7 +3196,7 @@ Return value:
// ----------------------------------------------------------------------
-static FLAG FASTCALL
+static FLAG FASTCALL
_BMinorToEmpty(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -3221,7 +3221,7 @@ Return value:
#ifdef DEBUG
PIECE pMinor = pos->rgSquare[pos->cPiece].pPiece;
PIECE p = pos->rgSquare[c].pPiece;
-
+
ASSERT(IS_EMPTY(p));
ASSERT(!IS_EMPTY(pMinor));
ASSERT(IS_BISHOP(pMinor) || IS_KNIGHT(pMinor));
@@ -3232,7 +3232,7 @@ Return value:
return(FALSE);
}
-static FLAG FASTCALL
+static FLAG FASTCALL
_WMinorToEmpty(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -3257,7 +3257,7 @@ Return value:
#ifdef DEBUG
PIECE pMinor = pos->rgSquare[pos->cPiece].pPiece;
PIECE p = pos->rgSquare[c].pPiece;
-
+
ASSERT(IS_EMPTY(p));
ASSERT(!IS_EMPTY(pMinor));
ASSERT(IS_BISHOP(pMinor) || IS_KNIGHT(pMinor));
@@ -3268,7 +3268,7 @@ Return value:
return(FALSE);
}
-static FLAG FASTCALL
+static FLAG FASTCALL
_WRookToEmpty(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -3293,7 +3293,7 @@ Return value:
#ifdef DEBUG
PIECE p = pos->rgSquare[c].pPiece;
PIECE pRook = pos->rgSquare[pos->cPiece].pPiece;
-
+
ASSERT(IS_ON_BOARD(c));
ASSERT(IS_ON_BOARD(pos->cPiece));
ASSERT(IS_ROOK(pRook));
@@ -3305,7 +3305,7 @@ Return value:
return(FALSE);
}
-static FLAG FASTCALL
+static FLAG FASTCALL
_BRookToEmpty(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -3330,7 +3330,7 @@ Return value:
#ifdef DEBUG
PIECE p = pos->rgSquare[c].pPiece;
PIECE pRook = pos->rgSquare[pos->cPiece].pPiece;
-
+
ASSERT(IS_ON_BOARD(c));
ASSERT(IS_ON_BOARD(pos->cPiece));
ASSERT(IS_ROOK(pRook));
@@ -3342,7 +3342,7 @@ Return value:
return(FALSE);
}
-static FLAG FASTCALL
+static FLAG FASTCALL
_BQueenToEmpty(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -3367,7 +3367,7 @@ Return value:
#ifdef DEBUG
PIECE p = pos->rgSquare[c].pPiece;
PIECE pQueen = pos->rgSquare[pos->cPiece].pPiece;
-
+
ASSERT(IS_ON_BOARD(c));
ASSERT(IS_ON_BOARD(pos->cPiece));
ASSERT(IS_QUEEN(pQueen));
@@ -3379,7 +3379,7 @@ Return value:
return(FALSE);
}
-static FLAG FASTCALL
+static FLAG FASTCALL
_WQueenToEmpty(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -3404,7 +3404,7 @@ Return value:
#ifdef DEBUG
PIECE p = pos->rgSquare[c].pPiece;
PIECE pQueen = pos->rgSquare[pos->cPiece].pPiece;
-
+
ASSERT(IS_ON_BOARD(c));
ASSERT(IS_ON_BOARD(pos->cPiece));
ASSERT(IS_QUEEN(pQueen));
@@ -3418,7 +3418,7 @@ Return value:
-static FLAG FASTCALL
+static FLAG FASTCALL
_EBishopToFriendPawn(IN POSITION *pos,
IN COOR c,
IN OUT ULONG *puMobility,
@@ -3443,7 +3443,7 @@ Return value:
#ifdef DEBUG
PIECE pPawn = pos->rgSquare[c].pPiece;
PIECE pBishop = pos->rgSquare[pos->cPiece].pPiece;
-
+
ASSERT(IS_ON_BOARD(c));
ASSERT(IS_ON_BOARD(pos->cPiece));
ASSERT(IS_BISHOP(pBishop));
@@ -3464,7 +3464,7 @@ Return value:
static void
_EvalBishop(IN OUT POSITION *pos,
- IN COOR c,
+ IN COOR c,
IN PAWN_HASH_ENTRY *pHash)
/**
@@ -3484,7 +3484,7 @@ Return value:
{
static const BITBOARD bbColorSq[2] = { 0x55aa55aa55aa55aaULL,
0xaa55aa55aa55aa55ULL };
- static const PMOBILITY_HELPER BMobJumpTable[2][14] =
+ static const PMOBILITY_HELPER BMobJumpTable[2][14] =
{
{// (black)
_BMinorToEmpty, // EMPTY_SQUARE (0)
@@ -3519,7 +3519,7 @@ Return value:
_AnythingToFriendNoXray, // WHITE_KING (13)
}
};
- static const COOR cBishopAtHome[2][2] =
+ static const COOR cBishopAtHome[2][2] =
{
{ C8, F8 }, // BLACK
{ C1, F1 } // WHITE
@@ -3537,7 +3537,7 @@ Return value:
ULONG uBit;
PIECE p;
PMOBILITY_HELPER pFun;
-
+
ASSERT(IS_ON_BOARD(c));
p = pos->rgSquare[c].pPiece;
ASSERT(p && IS_BISHOP(p));
@@ -3580,7 +3580,7 @@ Return value:
"good/bad stationary pawns ++");
i = 0;
- bbPc = ~(pHash->bbStationaryPawns[WHITE] |
+ bbPc = ~(pHash->bbStationaryPawns[WHITE] |
pHash->bbStationaryPawns[BLACK]);
bbPc &= bbMask;
bb = pHash->bbPawnLocations[uColor] & bbPc;
@@ -3604,7 +3604,7 @@ Return value:
ASSERT(IS_PAWN(pos->rgSquare[cSquare].pPiece));
ASSERT(GET_COLOR(pos->rgSquare[cSquare].pPiece) == FLIP(uColor));
ASSERT(pHash->bbPawnLocations[FLIP(uColor)] & COOR_TO_BB(cSquare));
- i +=
+ i +=
(pos->rgSquare[cSquare|8].bvAttacks[FLIP(uColor)].small.uPawn != 0) *
TRANSIENT_PAWN_ON_BISHOP_COLOR[cSquare] / 2;
}
@@ -3625,7 +3625,7 @@ Return value:
pos->iScore[uColor],
BISHOP_IN_CLOSED_POSITION[pos->uClosedScaler],
"in closed/open position");
-
+
//
// Bishop mobility (and update attack table bits)
//
@@ -3637,7 +3637,7 @@ Return value:
uCurrentMobility = 0;
uBit = MINOR_BIT;
cSquare = c + g_iBDeltas[u];
-
+
while(IS_ON_BOARD(cSquare))
{
//
@@ -3694,9 +3694,9 @@ Return value:
uTotalMobility /= 2;
ASSERT((pos->uMinMobility[uColor] & 0x80000000) == 0);
ASSERT((uTotalMobility & 0x80000000) == 0);
- pos->uMinMobility[uColor] = MINU(pos->uMinMobility[uColor],
+ pos->uMinMobility[uColor] = MINU(pos->uMinMobility[uColor],
uTotalMobility);
-
+
//
// Look for "active bad bishops". See if square c is safe from
// enemy pawns.
@@ -3730,8 +3730,8 @@ Return value:
}
static void
-_EvalKnight(IN OUT POSITION *pos,
- IN COOR c,
+_EvalKnight(IN OUT POSITION *pos,
+ IN COOR c,
IN PAWN_HASH_ENTRY *pHash)
/**
@@ -3750,7 +3750,7 @@ Return value:
**/
{
static const int iPawnStart[2] = { -17, +15 };
- static const PMOBILITY_HELPER NMobJumpTable[2][14] =
+ static const PMOBILITY_HELPER NMobJumpTable[2][14] =
{
{// (black)
_BMinorToEmpty, // EMPTY_SQUARE (0)
@@ -3785,7 +3785,7 @@ Return value:
_AnythingToFriendNoXray, // WHITE_KING (13)
}
};
- static const COOR cKnightAtHome[2][2] =
+ static const COOR cKnightAtHome[2][2] =
{
{ B8, G8 }, // BLACK
{ B1, G1 } // WHITE
@@ -3819,8 +3819,8 @@ Return value:
//
// TODO: Don't block unmoved E2/D2 pawns
- //
-
+ //
+
//
// Centrality bonus
//
@@ -3859,13 +3859,13 @@ Return value:
uPawnsSupporting = 0;
p = BLACK_PAWN | uColor;
cSquare = c + iPawnStart[uColor];
- uPawnsSupporting = (IS_ON_BOARD(cSquare) &&
+ uPawnsSupporting = (IS_ON_BOARD(cSquare) &&
(pos->rgSquare[cSquare].pPiece == p));
cSquare += 2;
uPawnsSupporting += (IS_ON_BOARD(cSquare) &&
(pos->rgSquare[cSquare].pPiece == p));
ASSERT(uPawnsSupporting <= 2);
-
+
//
// Give a bonus based on distance from enemy king
//
@@ -3877,7 +3877,7 @@ Return value:
pos->iReducedMaterialDownScaler[uColor],
i,
"[scaled] unassailable/support");
-
+
//
// Now, if there's zero or one supporter see if the enemy has a
// bishop the color of the knight it could capture with.
@@ -3898,7 +3898,7 @@ Return value:
}
else
{
- if (pos->uNonPawnCount[FLIP(uColor)][BISHOP] -
+ if (pos->uNonPawnCount[FLIP(uColor)][BISHOP] -
pos->uWhiteSqBishopCount[FLIP(uColor)])
{
EVAL_TERM(uColor,
@@ -3910,7 +3910,7 @@ Return value:
}
}
}
- }
+ }
else // not outposted
{
//
@@ -3924,7 +3924,7 @@ Return value:
i,
"[scaled] enemy king tropism");
}
-
+
//
// Give a bonus for blockading an enemy backward pawn. Note:
// we also reward pieces for blocking enemy passers in the
@@ -3946,7 +3946,7 @@ Return value:
//
// A knight with an open file behind it is good.
- //
+ //
uPawnFile = FILE(c) + 1;
EVAL_TERM(uColor,
KNIGHT,
@@ -3955,7 +3955,7 @@ Return value:
((pHash->uCountPerFile[uColor][uPawnFile] == 0) *
KNIGHT_ON_INTERESTING_SQUARE_BY_RANK[uColor][RANK(c)]),
"open file behind");
-
+
//
// Do mobilility and piece relevance. Also update attack tables.
//
@@ -4007,13 +4007,13 @@ Return value:
}
ASSERT((pos->uMinMobility[uColor] & 0x80000000) == 0);
ASSERT((uMobilitySquares & 0x80000000) == 0);
- pos->uMinMobility[uColor] = MINU(pos->uMinMobility[uColor],
+ pos->uMinMobility[uColor] = MINU(pos->uMinMobility[uColor],
uMobilitySquares);
}
static void
-_EvalRook(IN OUT POSITION *pos,
- IN COOR c,
+_EvalRook(IN OUT POSITION *pos,
+ IN COOR c,
IN PAWN_HASH_ENTRY *pHash)
/**
@@ -4031,7 +4031,7 @@ Return value:
**/
{
- static const PMOBILITY_HELPER RMobJumpTable[2][14] =
+ static const PMOBILITY_HELPER RMobJumpTable[2][14] =
{
{// (black)
_BRookToEmpty, // EMPTY_SQUARE (0)
@@ -4080,14 +4080,14 @@ Return value:
ULONG uBit;
PMOBILITY_HELPER pFun;
SCORE i;
-
+
ASSERT(IS_ON_BOARD(c));
p = pos->rgSquare[c].pPiece;
ASSERT(p && IS_ROOK(p));
uColor = GET_COLOR(p);
ASSERT(IS_VALID_COLOR(uColor));
pos->cPiece = c;
-
+
//
// Reward being on a half open or full open file.
//
@@ -4117,7 +4117,7 @@ Return value:
pos->iScore[uColor],
ROOK_ON_HALF_OPEN_WITH_ENEMY_BY_DIST_FROM_EKING[u],
"on half open");
-
+
//
// Added bonus if the enemy pawn is a passer.
//
@@ -4126,7 +4126,7 @@ Return value:
{
cSquare = CoorFromBitBoardRank8ToRank1(&bb);
EVAL_TERM(uColor,
- ROOK,
+ ROOK,
c,
pos->iScore[uColor],
PASSER_BY_RANK[FLIP(uColor)][RANK(cSquare)] / 4,
@@ -4160,7 +4160,7 @@ Return value:
//
while(IS_ON_BOARD(cSquare = CoorFromBitBoardRank8ToRank1(&bb)))
{
- if (uColor == WHITE)
+ if (uColor == WHITE)
{
if (cSquare < c)
{
@@ -4208,22 +4208,22 @@ Return value:
}
}
}
-
+
//
// Look for rooks that are trapping enemy kings.
- //
- if (uColor == WHITE)
+ //
+ if (uColor == WHITE)
{
pFriendRook = WHITE_ROOK;
//
// Rook on 7th/8th rank with an enemy king back there.
- //
+ //
if ((c < A6) && (pos->cNonPawns[BLACK][0] < A6))
{
ASSERT(RANK(c) > 6);
ASSERT(RANK(pos->cNonPawns[BLACK][0]) > 6);
-
+
EVAL_TERM(WHITE,
ROOK,
c,
@@ -4232,13 +4232,13 @@ Return value:
"rook trapping enemy king");
}
}
- else
+ else
{
pFriendRook = BLACK_ROOK;
//
// Rook on 7th/8th rank with an enemy king back there.
- //
+ //
if ((c > H3) && (pos->cNonPawns[WHITE][0] > H3))
{
ASSERT(RANK(c) < 3);
@@ -4251,17 +4251,17 @@ Return value:
"rook trapping enemy king");
}
}
-
+
//
// Rooks increase in value as pawns come off:
- //
+ //
// "A further refinement would be to raise the knight's value by
// 1/16 and lower the rook's value by 1/8 for each pawn above five
// of the side being valued, with the opposite adjustment for each
// pawn short of five."
// --Larry Kaufman, IM
// "Evaluation of Material Imbalance"
- //
+ //
EVAL_TERM(uColor,
ROOK,
c,
@@ -4269,7 +4269,7 @@ Return value:
ROOK_VALUE_AS_PAWNS_COME_OFF[pos->uPawnCount[uColor] +
pos->uPawnCount[FLIP(uColor)]],
"increase in value/pawns");
-
+
//
// Rook mobility
//
@@ -4280,7 +4280,7 @@ Return value:
uCurrentMobility = 0;
uBit = ROOK_BIT;
cSquare = c + g_iRDeltas[u];
-
+
while(IS_ON_BOARD(cSquare))
{
//
@@ -4334,7 +4334,7 @@ Return value:
ASSERT((pos->uMinMobility[uColor] & 0x80000000) == 0);
ASSERT((uTotalMobility & 0x80000000) == 0);
- pos->uMinMobility[uColor] = MINU(pos->uMinMobility[uColor],
+ pos->uMinMobility[uColor] = MINU(pos->uMinMobility[uColor],
uTotalMobility);
if (uTotalMobility < 3)
{
@@ -4349,7 +4349,7 @@ Return value:
//
// Rook trapped in the corner by a stupid friendly king?
- //
+ //
ASSERT(IS_VALID_COLOR(uColor));
if (uColor == WHITE)
{
@@ -4373,7 +4373,7 @@ Return value:
}
}
}
- else
+ else
{
ASSERT(uColor == BLACK);
ASSERT(IS_ON_BOARD(c));
@@ -4381,7 +4381,7 @@ Return value:
{
cSquare = pos->cNonPawns[BLACK][0];
ASSERT(IS_ON_BOARD(cSquare));
-
+
if (RANK8(cSquare))
{
if (((cSquare > E8) && (c > cSquare)) ||
@@ -4402,8 +4402,8 @@ Return value:
static void
-_EvalQueen(IN OUT POSITION *pos,
- IN COOR c,
+_EvalQueen(IN OUT POSITION *pos,
+ IN COOR c,
IN PAWN_HASH_ENTRY *pHash)
/**
@@ -4419,7 +4419,7 @@ Return value:
**/
{
- static const PMOBILITY_HELPER QMobJumpTable[2][14] =
+ static const PMOBILITY_HELPER QMobJumpTable[2][14] =
{
{
_BQueenToEmpty, // EMPTY_SQUARE (0)
@@ -4473,12 +4473,12 @@ Return value:
cKing = pos->cNonPawns[FLIP(uColor)][0];
ASSERT(IS_ON_BOARD(cKing));
ASSERT(IS_KING(pos->rgSquare[cKing].pPiece));
-
+
if ((FALSE == pos->fCastled[uColor]) && (pos->uMinorsAtHome[uColor] > 1))
{
//
// Discourage queen being out too early
- //
+ //
if (!RANK1(c) && !RANK8(c))
{
ASSERT(QUEEN_OUT_EARLY[pos->uMinorsAtHome[uColor]] < 0);
@@ -4522,7 +4522,7 @@ Return value:
// Toggle attack table bits.
//
pos->rgSquare[cSquare|8].bvAttacks[uColor].uWholeThing |= uBit;
-
+
//
// What did we hit?
//
@@ -4560,7 +4560,7 @@ Return value:
}
ASSERT((pos->uMinMobility[uColor] & 0x80000000) == 0);
ASSERT((uTotalMobility & 0x80000000) == 0);
- pos->uMinMobility[uColor] = MINU(pos->uMinMobility[uColor],
+ pos->uMinMobility[uColor] = MINU(pos->uMinMobility[uColor],
uTotalMobility);
//
@@ -4576,8 +4576,8 @@ Return value:
}
static void
-_EvalKing(IN OUT POSITION *pos,
- IN const COOR c,
+_EvalKing(IN OUT POSITION *pos,
+ IN const COOR c,
IN const PAWN_HASH_ENTRY *pHash)
/**
@@ -4613,27 +4613,27 @@ Return value:
{
+4, +2, +1, 0, 0, 0, 0, 0, 0
};
-
+
static ULONG KingStormingPawnDefects[8] =
{
+0, +4, +3, +1, +0, +0, +0, +0
};
- static ULONG KingFileDefects[3] =
+ static ULONG KingFileDefects[3] =
{
+2, +1, +0
};
- static INT KingSafetyDeltas[11] =
+ static INT KingSafetyDeltas[11] =
{
-17, -16, -15,
-1, +1,
+15, +16, +17, -2, +2, 0
};
-
- static ULONG EmptyAttackedSquare[2][11] =
+
+ static ULONG EmptyAttackedSquare[2][11] =
{
- {
+ {
1, 1, 1,
1, 1,
2, 2, 2, 1, 1, 0
@@ -4645,9 +4645,9 @@ Return value:
},
};
- static ULONG EmptyUnattackedSquare[2][11] =
+ static ULONG EmptyUnattackedSquare[2][11] =
{
- {
+ {
0, 0, 0,
0, 0,
1, 1, 1, 0, 0, 0
@@ -4658,20 +4658,20 @@ Return value:
0, 0, 0, 0, 0, 0
},
};
-
- static ULONG OccupiedAttackedSquare[2] =
+
+ static ULONG OccupiedAttackedSquare[2] =
{
1,
2
};
-
+
ASSERT(IS_ON_BOARD(c));
p = pos->rgSquare[c].pPiece;
ASSERT(p && IS_KING(p));
uColor = GET_COLOR(p);
ufColor = FLIP(uColor);
ASSERT(IS_VALID_COLOR(uColor));
-
+
u = pos->uNonPawnMaterial[ufColor];
ASSERT(u >= VALUE_KING);
if (u < DO_KING_SAFETY_THRESHOLD)
@@ -4692,7 +4692,7 @@ Return value:
}
// Prepare to do king safety
- uCounter = (u >= KEEP_KING_AT_HOME_THRESHOLD) *
+ uCounter = (u >= KEEP_KING_AT_HOME_THRESHOLD) *
KING_INITIAL_COUNTER_BY_LOCATION[uColor][c];
#ifdef EVAL_DUMP
Trace("%s Initial KS Counter: %u\n", COLOR_NAME(uColor), uCounter);
@@ -4700,7 +4700,7 @@ Return value:
uCounter += pos->uPiecesPointingAtKing[uColor] / 2;
#ifdef EVAL_DUMP
- Trace("%s KS Counter after pieces pointing: %u\n",
+ Trace("%s KS Counter after pieces pointing: %u\n",
COLOR_NAME(uColor), uCounter);
#endif
uFlightSquares = 0;
@@ -4712,13 +4712,13 @@ Return value:
if (IS_ON_BOARD(cSquare))
{
p = pos->rgSquare[cSquare].pPiece;
-
+
cSquare |= 8;
bvAttack = pos->rgSquare[cSquare].bvAttacks[ufColor].uSmall;
bvXray = pos->rgSquare[cSquare].bvAttacks[ufColor].uXray;
pos->rgSquare[cSquare].bvAttacks[uColor].small.uKing = 1;
bvDefend = pos->rgSquare[cSquare].bvAttacks[uColor].uSmall;
-
+
if (bvAttack != 0)
{
bvPattern |= (bvAttack | bvXray);
@@ -4733,7 +4733,7 @@ Return value:
}
else
{
- uCounter +=
+ uCounter +=
OccupiedAttackedSquare[OPPOSITE_COLORS(p, uColor)];
}
uCounter += (bvDefend == 0);
@@ -4779,7 +4779,7 @@ Return value:
uCounter += KingStormingPawnDefects[DISTANCE(cSquare, c)];
}
}
-
+
u = FILE(c) + 1;
v = (pHash->uCountPerFile[WHITE][u] > 0) +
(pHash->uCountPerFile[BLACK][u] > 0);
@@ -4809,10 +4809,10 @@ Return value:
v = (pHash->uCountPerFile[WHITE][u] > 0) +
(pHash->uCountPerFile[BLACK][u] > 0);
ASSERT((v >= 0) && (v <= 2));
-
+
// Note: open rook files are worse than open interior files
uCounter += (KingFileDefects[v] + ((v < 2) && ((u == 1) || (u == 8))));
-
+
bb = pHash->bbPawnLocations[ufColor] & BBFILE[u - 1];
if (bb)
{
@@ -4827,9 +4827,9 @@ Return value:
ASSERT(IS_ON_BOARD(cSquare));
uCounter += KingStormingPawnDefects[DISTANCE(cSquare, c)];
}
- }
+ }
#ifdef EVAL_DUMP
- Trace("%s KS Counter post-open file/stormers: %u\n", COLOR_NAME(uColor),
+ Trace("%s KS Counter post-open file/stormers: %u\n", COLOR_NAME(uColor),
uCounter);
#endif
@@ -4839,10 +4839,10 @@ Return value:
v = KING_COUNTER_BY_ATTACK_PATTERN[bvPattern];
uCounter += v;
#ifdef EVAL_DUMP
- Trace("%s KS Counter post-attack pattern: %u\n", COLOR_NAME(uColor),
+ Trace("%s KS Counter post-attack pattern: %u\n", COLOR_NAME(uColor),
uCounter);
#endif
-
+
ASSERT(uFlightSquares <= 8);
uCounter += KingFlightDefects[uFlightSquares] * (v > 1);
#ifdef EVAL_DUMP
@@ -4916,11 +4916,11 @@ Return value:
}
}
}
-
+
skip_safety:
//
// Special code for kings in the endgame
- //
+ //
u = pos->uNonPawnCount[WHITE][0] + pos->uNonPawnCount[BLACK][0];
if (u < 8)
{
@@ -4937,9 +4937,9 @@ Return value:
//
// Kings in front of passers in the late endgame are strong...
- //
+ //
cSquare = FILE(c);
- bb = pHash->bbPasserLocations[uColor] &
+ bb = pHash->bbPasserLocations[uColor] &
(BBADJACENT_FILES[cSquare] | BBFILE[cSquare]);
if (bb)
{
@@ -4949,7 +4949,7 @@ Return value:
{
ASSERT(abs((INT)FILE(c) - (INT)FILE(cSquare)) <= 1);
ASSERT(abs((INT)RANK(c) - (INT)RANK(cSquare)) <= 1);
-
+
i = 2;
i += SUPPORTED_PASSER_BY_RANK[uColor][RANK(cSquare)];
switch(uColor)
@@ -4957,7 +4957,7 @@ Return value:
case WHITE:
i += 8 * (c < (cSquare - 1));
break;
-
+
case BLACK:
i += 8 * (c > (cSquare + 1));
break;
@@ -4971,12 +4971,12 @@ Return value:
}
}
}
-
+
//
// Detect kings way out of the action in KP endgames:
- //
+ //
// 8/8/1p6/p6k/P3K3/8/1P6/8 w - - 0 11
- //
+ //
if ((u == 2) && (uColor == WHITE))
{
i = 0;
@@ -5001,7 +5001,7 @@ Return value:
FLAG
-EvalPasserRaces(IN OUT POSITION *pos,
+EvalPasserRaces(IN OUT POSITION *pos,
IN PAWN_HASH_ENTRY *pHash)
/**
@@ -5074,24 +5074,24 @@ Return value:
uPawnDist--;
}
ASSERT((uPawnDist >= 1) && (uPawnDist <= 6));
-
+
uKingDist = DISTANCE(cKing, cQueen);
- if (uKingDist > 0)
+ if (uKingDist > 0)
{
uKingDist -= (pos->uToMove == FLIP(uColor));
}
ASSERT((uKingDist >= 0) && (uPawnDist <= 7));
-
+
if (uPawnDist < uKingDist)
{
uRacerDist[uColor] = MINU(uRacerDist[uColor],
uPawnDist);
}
-
+
cKing = pos->cNonPawns[uColor][0];
ASSERT(IS_KING(pos->rgSquare[cKing].pPiece));
ASSERT(GET_COLOR(pos->rgSquare[cKing].pPiece) == uColor);
-
+
uFriendDist = DISTANCE(cKing, cQueen);
if ((uFriendDist <= 1) && (DISTANCE(cKing, c) <= 1))
{
@@ -5108,8 +5108,8 @@ Return value:
}
}
fDontCountMeOut[uColor] = TRUE;
-
- //
+
+ //
// TODO: winning connected passers
//
}
@@ -5117,7 +5117,7 @@ Return value:
}
}
- if ((uRacerDist[WHITE] < uRacerDist[BLACK]) &&
+ if ((uRacerDist[WHITE] < uRacerDist[BLACK]) &&
(FALSE == fDontCountMeOut[BLACK]))
{
EVAL_TERM(WHITE,
@@ -5143,8 +5143,8 @@ Return value:
}
-static void
-_EvalPassers(IN OUT POSITION *pos,
+static void
+_EvalPassers(IN OUT POSITION *pos,
IN PAWN_HASH_ENTRY *pHash)
/**
@@ -5173,7 +5173,7 @@ Return value:
ASSERT(pHash->bbPasserLocations[WHITE] |
pHash->bbPasserLocations[BLACK]);
-
+
FOREACH_COLOR(uColor)
{
bb = pHash->bbPasserLocations[uColor];
@@ -5183,7 +5183,7 @@ Return value:
ASSERT(uNumPassers[uColor] > 0);
d1 = 16 * g_iAhead[uColor];
ASSERT((d1 * 2) == (32 * g_iAhead[uColor]));
-
+
while(IS_ON_BOARD(c = CoorFromBitBoardRank8ToRank1(&bb)))
{
//
@@ -5222,23 +5222,23 @@ Return value:
ASSERT(u == uColor);
}
#endif
-
+
//
// Consider distance from friend king / enemy king
//
i = (8 - DISTANCE(c, pos->cNonPawns[uColor][0]));
- if (((uColor == WHITE) &&
+ if (((uColor == WHITE) &&
((pos->cNonPawns[BLACK][0] >> 4) <= (c >> 4))) ||
((uColor == BLACK) &&
((pos->cNonPawns[WHITE][0] >> 4) >= (c >> 4)))) {
- //
+ //
// The enemy king is ahead of the passer
//
i += FILE_DISTANCE(c, pos->cNonPawns[FLIP(uColor)][0]) * 4;
}
else
{
- //
+ //
// The enemy king is behind the passer
//
i += 10 + DISTANCE(c, pos->cNonPawns[FLIP(uColor)][0]) * 4;
@@ -5251,12 +5251,12 @@ Return value:
pos->iScore[uColor],
i,
"passer distance to kings");
-
+
//
// If a side is a piece down then the other side's passers
// are even more dangerous.
//
- if (pos->uNonPawnCount[uColor][0] >
+ if (pos->uNonPawnCount[uColor][0] >
pos->uNonPawnCount[FLIP(uColor)][0])
{
i = (PASSER_BY_RANK[uColor][RANK(c)] / 2);
@@ -5274,10 +5274,10 @@ Return value:
}
}
}
-
+
//
// Game stage bonus
- //
+ //
u = pos->uArmyScaler[BLACK];
EVAL_TERM(WHITE,
PAWN,
@@ -5297,7 +5297,7 @@ Return value:
}
-static void
+static void
_EvalBadTrades(IN OUT POSITION *pos)
/**
@@ -5315,7 +5315,7 @@ Return value:
{
ULONG uAhead, uBehind;
ULONG uMagnitude;
-
+
//
// See who is ahead
//
@@ -5335,7 +5335,7 @@ Return value:
ASSERT(uBehind == WHITE);
}
#endif
- uMagnitude = ((pos->uNonPawnMaterial[uAhead] +
+ uMagnitude = ((pos->uNonPawnMaterial[uAhead] +
pos->uNonPawnCount[uAhead][0] * 128) -
(pos->uNonPawnMaterial[uBehind] +
pos->uNonPawnCount[uBehind][0] * 128));
@@ -5384,9 +5384,9 @@ Routine description:
which the attack table was generated, we will have missed
situations where a piece is undefended (or underdefended) and
attacked by an enemy piece that is the same (or greater) value.
-
+
Note: This routine only considers side to move.
-
+
Also Note: this routine does not find pawns that are en prise, only
pieces.
@@ -5397,7 +5397,7 @@ Parameters:
Return value:
void
-
+
**/
{
COOR c;
@@ -5428,7 +5428,7 @@ Return value:
}
-static void
+static void
_EvalTrappedPieces(IN OUT SEARCHER_THREAD_CONTEXT *ctx)
/**
@@ -5530,9 +5530,9 @@ Return value:
-SCORE
-Eval(IN SEARCHER_THREAD_CONTEXT *ctx,
- IN SCORE iAlpha,
+SCORE
+Eval(IN SEARCHER_THREAD_CONTEXT *ctx,
+ IN SCORE iAlpha,
IN SCORE iBeta)
/**
@@ -5585,28 +5585,28 @@ Return value:
ASSERT(IS_VALID_SCORE(iAlpha));
ASSERT(IS_VALID_SCORE(iBeta));
ASSERT(iAlpha < iBeta);
- ASSERT((pos->iMaterialBalance[WHITE] * -1) ==
+ ASSERT((pos->iMaterialBalance[WHITE] * -1) ==
pos->iMaterialBalance[BLACK]);
// ASSERT(!InCheck(pos, pos->uToMove));
pos->uMinMobility[BLACK] = pos->uMinMobility[WHITE] = 100;
pos->cTrapped[BLACK] = pos->cTrapped[WHITE] = ILLEGAL_COOR;
-
+
#ifdef EVAL_HASH
//
// Check the eval hash
- //
+ //
iScoreForSideToMove = ProbeEvalHash(ctx, iAlpha, iBeta);
- if (iScoreForSideToMove != INVALID_SCORE)
+ if (iScoreForSideToMove != INVALID_SCORE)
{
INC(ctx->sCounters.tree.u64EvalHashHits);
goto end;
}
#endif
- pos->iScore[BLACK] =
+ pos->iScore[BLACK] =
(pos->uPawnMaterial[BLACK] + pos->uNonPawnMaterial[BLACK]);
- pos->iScore[WHITE] =
+ pos->iScore[WHITE] =
(pos->uPawnMaterial[WHITE] + pos->uNonPawnMaterial[WHITE]);
#ifdef EVAL_DUMP
EvalTraceClear();
@@ -5629,21 +5629,21 @@ Return value:
#ifdef EVAL_DUMP
Trace("After pawns:\n%d\t\t%d\n", pos->iScore[WHITE], pos->iScore[BLACK]);
#endif
-
+
//
// Look for won passers races. Note: This code cannot trust the
// state of the attack tables yet!
//
- if ((pos->uNonPawnCount[WHITE][0] == 1) ||
+ if ((pos->uNonPawnCount[WHITE][0] == 1) ||
(pos->uNonPawnCount[BLACK][0] == 1))
{
(void)EvalPasserRaces(pos, pHash);
#ifdef EVAL_DUMP
- Trace("After passer races:\n%d\t\t%d\n", pos->iScore[WHITE],
+ Trace("After passer races:\n%d\t\t%d\n", pos->iScore[WHITE],
pos->iScore[BLACK]);
#endif
}
-
+
//
// Bad trade code. Right. Note: this code cannot trust the state
// of the attack tables...
@@ -5652,7 +5652,7 @@ Return value:
{
_EvalBadTrades(pos);
#ifdef EVAL_DUMP
- Trace("After bad trades:\n%d\t\t%d\n", pos->iScore[WHITE],
+ Trace("After bad trades:\n%d\t\t%d\n", pos->iScore[WHITE],
pos->iScore[BLACK]);
#endif
}
@@ -5663,7 +5663,7 @@ Return value:
//
_EvalBishopPairs(pos);
#ifdef EVAL_DUMP
- Trace("After bishop pair bonus:\n%d\t\t%d\n", pos->iScore[WHITE],
+ Trace("After bishop pair bonus:\n%d\t\t%d\n", pos->iScore[WHITE],
pos->iScore[BLACK]);
#endif
@@ -5671,7 +5671,7 @@ Return value:
//
// Compute an estimate of the score for the side to move based on the
// eval terms we have already considered:
- //
+ //
// 1. Material balance
// 2. Pawn structure bonuses/penalties (incl passers/candidates)
// 3. Passer races are detected already
@@ -5679,30 +5679,30 @@ Return value:
// 5. We've already detected unwinnable endgames
// 6. Bishop pairs
//
- iScoreForSideToMove = (pos->iScore[pos->uToMove] -
+ iScoreForSideToMove = (pos->iScore[pos->uToMove] -
pos->iScore[FLIP(pos->uToMove)]);
ASSERT(IS_VALID_SCORE(iScoreForSideToMove));
//
// Eval has not considered several potentially large terms:
- //
+ //
// 1. Piece positional components (such as mobility, trapped)
// 2. King safety penalties
// 3. Other miscellaneous bonuses/penalties
//
// We build two "margins" to account for these components of the
// score.
- //
+ //
iAlphaMargin = iBetaMargin = (50 + (SCORE)ctx->uPositional);
-
+
//
// If (score + alpha_margin) is already > alpha -OR-
- // (score - beta_margin) is already < beta
- //
+ // (score - beta_margin) is already < beta
+ //
// ...then we can stop thinking about lazy eval; the rest of the
// computation only increases the margin so we know LE will fail
// and can save some work here.
- //
+ //
if ((iScoreForSideToMove + iAlphaMargin < iAlpha) ||
(iScoreForSideToMove - iBetaMargin > iBeta))
{
@@ -5711,7 +5711,7 @@ Return value:
// yet. So do the expensive part of lazy eval estimation and
// widen the margin further for king safety issues and passed
// pawns.
- //
+ //
_QuicklyEstimateKingSafetyTerm(pos, &iAlphaMargin, &iBetaMargin);
_QuicklyEstimatePasserBonuses(pos, pHash, &iAlphaMargin, &iBetaMargin);
@@ -5753,7 +5753,7 @@ Return value:
{
_PopulatePawnAttackBits(pos);
}
-
+
//
// Pre-compute some common terms used in per-piece evals:
//
@@ -5771,7 +5771,7 @@ Return value:
ASSERT(pos->uArmyScaler[BLACK] <= 31);
ASSERT(pos->uArmyScaler[WHITE] >= 0);
ASSERT(pos->uArmyScaler[WHITE] <= 31);
- pos->iReducedMaterialDownScaler[BLACK] =
+ pos->iReducedMaterialDownScaler[BLACK] =
pos->iReducedMaterialDownScaler[WHITE] = 0;
//
@@ -5804,7 +5804,7 @@ Return value:
if (p & 0x4)
{
ASSERT(IS_BISHOP(p) || IS_KNIGHT(p));
-
+
//
// Note: The side on move's pieces of value X are
// evaluated and have their mobility counted and added to
@@ -5826,7 +5826,7 @@ Return value:
cDefer[uColor][IS_QUEEN(p)][uDefer[uColor][IS_QUEEN(p)]++] = c;
}
}
-
+
uColor = FLIP(uColor);
ASSERT(uColor != pos->uToMove);
for (u = 1;
@@ -5862,10 +5862,10 @@ Return value:
cDefer[uColor][IS_QUEEN(p)][uDefer[uColor][IS_QUEEN(p)]++] = c;
}
}
-
+
//
// Evaluate any rook(s) for side on move then for side not on move.
- //
+ //
uColor = FLIP(uColor);
for (u = 0;
u < uDefer[uColor][0];
@@ -5882,7 +5882,7 @@ Return value:
pos->iScore[WHITE], pos->iScore[BLACK]);
#endif
}
-
+
uColor = FLIP(uColor);
for (u = 0;
u < uDefer[uColor][0];
@@ -5902,7 +5902,7 @@ Return value:
//
// Evaluate any queen(s) for side on move then for side not on move.
- //
+ //
uColor = FLIP(uColor);
for (u = 0;
u < uDefer[uColor][1];
@@ -5919,7 +5919,7 @@ Return value:
pos->iScore[WHITE], pos->iScore[BLACK]);
#endif
}
-
+
uColor = FLIP(uColor);
for (u = 0;
u < uDefer[uColor][1];
@@ -5936,7 +5936,7 @@ Return value:
pos->iScore[WHITE], pos->iScore[BLACK]);
#endif
}
-
+
//
// Evaluate the two kings last.
//
@@ -5954,7 +5954,7 @@ Return value:
#ifdef EVAL_DUMP
Trace("After *k:\n%d\t\t%d\n", pos->iScore[WHITE], pos->iScore[BLACK]);
#endif
-
+
c = pos->cNonPawns[WHITE][0];
#ifdef DEBUG
ASSERT(IS_ON_BOARD(c));
@@ -5969,7 +5969,7 @@ Return value:
#ifdef EVAL_DUMP
Trace("After .k:\n%d\t\t%d\n", pos->iScore[WHITE], pos->iScore[BLACK]);
#endif
-
+
//
// Now that we have the whole attack table generated, think about
// passed pawns identified by the pawn eval routine again. Also
@@ -5980,7 +5980,7 @@ Return value:
{
_EvalPassers(pos, pHash);
#ifdef EVAL_DUMP
- Trace("After passers:\n%d\t\t%d\n", pos->iScore[WHITE],
+ Trace("After passers:\n%d\t\t%d\n", pos->iScore[WHITE],
pos->iScore[BLACK]);
#endif
}
@@ -5998,7 +5998,7 @@ Return value:
//
// B over N in the endgame with 2 pawn wings.
- //
+ //
if ((pos->uNonPawnCount[WHITE][0] <= 2) &&
(pos->uNonPawnCount[BLACK][0] <= 2))
{
@@ -6016,7 +6016,7 @@ Return value:
pos->iScore[WHITE] /= 2;
pos->iScore[BLACK] /= 2;
}
- }
+ }
}
else
{
@@ -6025,11 +6025,11 @@ Return value:
// with two pawn wings where having a bishop is an
// advantage.
//
- bb = (pHash->bbPawnLocations[WHITE] |
+ bb = (pHash->bbPawnLocations[WHITE] |
pHash->bbPawnLocations[BLACK]);
- ASSERT((BBFILE[A] | BBFILE[B] | BBFILE[C]) ==
+ ASSERT((BBFILE[A] | BBFILE[B] | BBFILE[C]) ==
0x0707070707070707ULL);
- ASSERT((BBFILE[F] | BBFILE[G] | BBFILE[H]) ==
+ ASSERT((BBFILE[F] | BBFILE[G] | BBFILE[H]) ==
0xe0e0e0e0e0e0e0e0ULL);
if ((bb & 0x0707070707070707ULL) &&
(bb & 0xe0e0e0e0e0e0e0e0ULL))
@@ -6059,7 +6059,7 @@ Return value:
}
}
#ifdef EVAL_DUMP
- Trace("After BOOC / BvsN:\n%d\t\t%d\n",
+ Trace("After BOOC / BvsN:\n%d\t\t%d\n",
pos->iScore[WHITE], pos->iScore[BLACK]);
#endif
}
@@ -6068,12 +6068,12 @@ Return value:
// Roll in the reduced material down scaler terms.
//
ASSERT(pos->iReducedMaterialDownScaler[BLACK] > -200);
- ASSERT(pos->iReducedMaterialDownScaler[BLACK] < +200);
+ ASSERT(pos->iReducedMaterialDownScaler[BLACK] < +200);
iAlphaMargin = (pos->iReducedMaterialDownScaler[BLACK] *
(SCORE)REDUCED_MATERIAL_DOWN_SCALER[pos->uArmyScaler[BLACK]]) / 8;
pos->iScore[BLACK] += iAlphaMargin;
ASSERT(pos->iReducedMaterialDownScaler[WHITE] > -200);
- ASSERT(pos->iReducedMaterialDownScaler[WHITE] < +200);
+ ASSERT(pos->iReducedMaterialDownScaler[WHITE] < +200);
iAlphaMargin = (pos->iReducedMaterialDownScaler[WHITE] *
(SCORE)REDUCED_MATERIAL_DOWN_SCALER[pos->uArmyScaler[WHITE]]) / 8;
pos->iScore[WHITE] += iAlphaMargin;
@@ -6081,13 +6081,13 @@ Return value:
//
// Almost done
//
- iScoreForSideToMove = (pos->iScore[pos->uToMove] -
+ iScoreForSideToMove = (pos->iScore[pos->uToMove] -
pos->iScore[FLIP(pos->uToMove)]);
#ifdef EVAL_DUMP
- Trace("At the end:\n%d\t\t%d\n", pos->iScore[WHITE],
+ Trace("At the end:\n%d\t\t%d\n", pos->iScore[WHITE],
pos->iScore[BLACK]);
#endif
-
+
//
// TODO: detect and discourage blocked positions?
//
@@ -6111,9 +6111,9 @@ Return value:
ctx->uPositional = MAXU(ctx->uPositional, VALUE_PAWN);
}
g_Options.iLastEvalScore = iScoreForSideToMove;
-
+
#ifdef EVAL_TIME
- ctx->sCounters.tree.u64CyclesInEval += (SystemReadTimeStampCounter() -
+ ctx->sCounters.tree.u64CyclesInEval += (SystemReadTimeStampCounter() -
uTimer);
#endif
INC(ctx->sCounters.tree.u64FullEvals);
@@ -6127,7 +6127,7 @@ Return value:
end:
ASSERT(IS_VALID_SCORE(iScoreForSideToMove));
- ASSERT((iScoreForSideToMove > -NMATE) &&
+ ASSERT((iScoreForSideToMove > -NMATE) &&
(iScoreForSideToMove < +NMATE));
ASSERT(abs(ctx->sPlyInfo[ctx->uPly].iKingScore[BLACK]) < 700);
ASSERT(abs(ctx->sPlyInfo[ctx->uPly].iKingScore[WHITE]) < 700);