constexpr int QuadraticOurs[][PIECE_TYPE_NB] = {
// OUR PIECES
// pair pawn knight bishop rook queen
- {1667 }, // Bishop pair
+ {1443 }, // Bishop pair
{ 40, 0 }, // Pawn
- { 32, 255, -3 }, // Knight OUR PIECES
+ { 32, 255, -67 }, // Knight OUR PIECES
{ 0, 104, 4, 0 }, // Bishop
- { -26, -2, 47, 105, -149 }, // Rook
+ { -26, -2, 47, 105, -221 }, // Rook
{-189, 24, 117, 133, -134, -10 } // Queen
};
{ 97, 100, -42, 137, 268, 0 } // Queen
};
+ constexpr int PawnCount[] = { 0, 304, 144, -320, -560, -704, -672, -464, -320 };
+
// Endgame evaluation and scaling functions are accessed directly and not through
// the function maps because they correspond to more than one material hash key.
Endgame<KXK> EvaluateKXK[] = { Endgame<KXK>(WHITE), Endgame<KXK>(BLACK) };
constexpr Color Them = (Us == WHITE ? BLACK : WHITE);
- int bonus = 0;
+ int bonus = PawnCount[pieceCount[Us][PAWN]];
// Second-degree polynomial material imbalance, by Tord Romstad
for (int pt1 = NO_PIECE_TYPE; pt1 <= QUEEN; ++pt1)
// OK, we didn't find any special evaluation function for the current material
// configuration. Is there a suitable specialized scaling function?
- EndgameBase<ScaleFactor>* sf;
+ const EndgameBase<ScaleFactor>* sf;
if ((sf = pos.this_thread()->endgames.probe<ScaleFactor>(key)) != nullptr)
{
e->factor[BLACK] = uint8_t(npm_b < RookValueMg ? SCALE_FACTOR_DRAW :
npm_w <= BishopValueMg ? 4 : 14);
- if (pos.count<PAWN>(WHITE) == 1 && npm_w - npm_b <= BishopValueMg)
- e->factor[WHITE] = (uint8_t) SCALE_FACTOR_ONEPAWN;
-
- if (pos.count<PAWN>(BLACK) == 1 && npm_b - npm_w <= BishopValueMg)
- e->factor[BLACK] = (uint8_t) SCALE_FACTOR_ONEPAWN;
-
// Evaluate the material imbalance. We use PIECE_TYPE_NONE as a place holder
// for the bishop pair "extended piece", which allows us to be more flexible
// in defining bishop pair bonuses.