diff options
| author | Scott Gasch <[email protected]> | 2026-08-24 19:31:36 -0700 |
|---|---|---|
| committer | Scott Gasch <[email protected]> | 2026-08-24 19:31:36 -0700 |
| commit | 29d73f4dd59554a349aa8e86e5ea65f28c912ec9 (patch) | |
| tree | 05e8dcbe6eb3c2f6d8bfd7c8065c250b2734254c /src/eval.c | |
| parent | c5ca1a37b0614f5cb55499692a7f61775f81d1eb (diff) | |
Started doing texel eval tuning.
Diffstat (limited to 'src/eval.c')
| -rwxr-xr-x | src/eval.c | 970 |
1 files changed, 485 insertions, 485 deletions
@@ -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); |
