- const Value BishopPairMidgameBonus = Value(100);
- const Value BishopPairEndgameBonus = Value(100);
-
- Key KPKMaterialKey, KKPMaterialKey;
- Key KBNKMaterialKey, KKBNMaterialKey;
- Key KRKPMaterialKey, KPKRMaterialKey;
- Key KRKBMaterialKey, KBKRMaterialKey;
- Key KRKNMaterialKey, KNKRMaterialKey;
- Key KQKRMaterialKey, KRKQMaterialKey;
- Key KRPKRMaterialKey, KRKRPMaterialKey;
- Key KRPPKRPMaterialKey, KRPKRPPMaterialKey;
- Key KNNKMaterialKey, KKNNMaterialKey;
- Key KBPKBMaterialKey, KBKBPMaterialKey;
- Key KBPKNMaterialKey, KNKBPMaterialKey;
- Key KNPKMaterialKey, KKNPMaterialKey;
- Key KPKPMaterialKey;
-
-};
-
-
-////
-//// Functions
-////
-
-/// MaterialInfo::init() is called during program initialization. It
-/// precomputes material hash keys for a few basic endgames, in order
-/// to make it easy to recognize such endgames when they occur.
-
-void MaterialInfo::init() {
- KPKMaterialKey = Position::zobMaterial[WHITE][PAWN][1];
- KKPMaterialKey = Position::zobMaterial[BLACK][PAWN][1];
- KBNKMaterialKey =
- Position::zobMaterial[WHITE][BISHOP][1] ^
- Position::zobMaterial[WHITE][KNIGHT][1];
- KKBNMaterialKey =
- Position::zobMaterial[BLACK][BISHOP][1] ^
- Position::zobMaterial[BLACK][KNIGHT][1];
- KRKPMaterialKey =
- Position::zobMaterial[WHITE][ROOK][1] ^
- Position::zobMaterial[BLACK][PAWN][1];
- KPKRMaterialKey =
- Position::zobMaterial[WHITE][PAWN][1] ^
- Position::zobMaterial[BLACK][ROOK][1];
- KRKBMaterialKey =
- Position::zobMaterial[WHITE][ROOK][1] ^
- Position::zobMaterial[BLACK][BISHOP][1];
- KBKRMaterialKey =
- Position::zobMaterial[WHITE][BISHOP][1] ^
- Position::zobMaterial[BLACK][ROOK][1];
- KRKNMaterialKey =
- Position::zobMaterial[WHITE][ROOK][1] ^
- Position::zobMaterial[BLACK][KNIGHT][1];
- KNKRMaterialKey =
- Position::zobMaterial[WHITE][KNIGHT][1] ^
- Position::zobMaterial[BLACK][ROOK][1];
- KQKRMaterialKey =
- Position::zobMaterial[WHITE][QUEEN][1] ^
- Position::zobMaterial[BLACK][ROOK][1];
- KRKQMaterialKey =
- Position::zobMaterial[WHITE][ROOK][1] ^
- Position::zobMaterial[BLACK][QUEEN][1];
- KRPKRMaterialKey =
- Position::zobMaterial[WHITE][ROOK][1] ^
- Position::zobMaterial[WHITE][PAWN][1] ^
- Position::zobMaterial[BLACK][ROOK][1];
- KRKRPMaterialKey =
- Position::zobMaterial[WHITE][ROOK][1] ^
- Position::zobMaterial[BLACK][ROOK][1] ^
- Position::zobMaterial[BLACK][PAWN][1];
- KRPPKRPMaterialKey =
- Position::zobMaterial[WHITE][ROOK][1] ^
- Position::zobMaterial[WHITE][PAWN][1] ^
- Position::zobMaterial[WHITE][PAWN][2] ^
- Position::zobMaterial[BLACK][ROOK][1] ^
- Position::zobMaterial[BLACK][PAWN][1];
- KRPKRPPMaterialKey =
- Position::zobMaterial[WHITE][ROOK][1] ^
- Position::zobMaterial[WHITE][PAWN][1] ^
- Position::zobMaterial[BLACK][ROOK][1] ^
- Position::zobMaterial[BLACK][PAWN][1] ^
- Position::zobMaterial[BLACK][PAWN][2];
- KNNKMaterialKey =
- Position::zobMaterial[WHITE][KNIGHT][1] ^
- Position::zobMaterial[WHITE][KNIGHT][2];
- KKNNMaterialKey =
- Position::zobMaterial[BLACK][KNIGHT][1] ^
- Position::zobMaterial[BLACK][KNIGHT][2];
- KBPKBMaterialKey =
- Position::zobMaterial[WHITE][BISHOP][1] ^
- Position::zobMaterial[WHITE][PAWN][1] ^
- Position::zobMaterial[BLACK][BISHOP][1];
- KBKBPMaterialKey =
- Position::zobMaterial[WHITE][BISHOP][1] ^
- Position::zobMaterial[BLACK][BISHOP][1] ^
- Position::zobMaterial[BLACK][PAWN][1];
- KBPKNMaterialKey =
- Position::zobMaterial[WHITE][BISHOP][1] ^
- Position::zobMaterial[WHITE][PAWN][1] ^
- Position::zobMaterial[BLACK][KNIGHT][1];
- KNKBPMaterialKey =
- Position::zobMaterial[WHITE][KNIGHT][1] ^
- Position::zobMaterial[BLACK][BISHOP][1] ^
- Position::zobMaterial[BLACK][PAWN][1];
- KNPKMaterialKey =
- Position::zobMaterial[WHITE][KNIGHT][1] ^
- Position::zobMaterial[WHITE][PAWN][1];
- KKNPMaterialKey =
- Position::zobMaterial[BLACK][KNIGHT][1] ^
- Position::zobMaterial[BLACK][PAWN][1];
- KPKPMaterialKey =
- Position::zobMaterial[WHITE][PAWN][1] ^
- Position::zobMaterial[BLACK][PAWN][1];
-}
+ // Polynomial material balance parameters
+
+ // pair pawn knight bishop rook queen
+ const int Linear[6] = { 1852, -162, -1122, -183, 249, -154 };
+
+ const int QuadraticSameSide[][PIECE_TYPE_NB] = {
+ // OUR PIECES
+ // pair pawn knight bishop rook queen
+ { 0 }, // Bishop pair
+ { 39, 2 }, // Pawn
+ { 35, 271, -4 }, // knight OUR PIECES
+ { 0, 105, 4, 0 }, // Bishop
+ { -27, -2, 46, 100, -141 }, // Rook
+ {-177, 25, 129, 142, -137, 0 } // Queen
+ };
+
+ const int QuadraticOppositeSide[][PIECE_TYPE_NB] = {
+ // THEIR PIECES
+ // pair pawn knight bishop rook queen
+ { 0 }, // Bishop pair
+ { 37, 0 }, // Pawn
+ { 10, 62, 0 }, // Knight OUR PIECES
+ { 57, 64, 39, 0 }, // Bishop
+ { 50, 40, 23, -22, 0 }, // Rook
+ { 98, 105, -39, 141, 274, 0 } // Queen
+ };