mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-20 09:06:45 +08:00
Scale down endgames with pawns on one or two adjacent files
This commit is contained in:
@@ -197,6 +197,7 @@ namespace {
|
||||
// scores, indexed by a calculated integer number.
|
||||
Score KingDanger[128];
|
||||
|
||||
const int ScalePawnSpan[2] = { 38, 56 };
|
||||
|
||||
// apply_weight() weighs score 'v' by weight 'w' trying to prevent overflow
|
||||
Score apply_weight(Score v, const Weight& w) {
|
||||
@@ -726,29 +727,33 @@ namespace {
|
||||
}
|
||||
|
||||
// Scale winning side if position is more drawish than it appears
|
||||
ScaleFactor sf = eg_value(score) > VALUE_DRAW ? ei.mi->scale_factor(pos, WHITE)
|
||||
: ei.mi->scale_factor(pos, BLACK);
|
||||
Color strongSide = eg_value(score) > VALUE_DRAW ? WHITE : BLACK;
|
||||
ScaleFactor sf = ei.mi->scale_factor(pos, strongSide);
|
||||
|
||||
// If we don't already have an unusual scale factor, check for opposite
|
||||
// colored bishop endgames, and use a lower scale for those.
|
||||
// If we don't already have an unusual scale factor, check for certain
|
||||
// types of endgames, and use a lower scale for those.
|
||||
if ( ei.mi->game_phase() < PHASE_MIDGAME
|
||||
&& pos.opposite_bishops()
|
||||
&& (sf == SCALE_FACTOR_NORMAL || sf == SCALE_FACTOR_ONEPAWN))
|
||||
{
|
||||
// Ignoring any pawns, do both sides only have a single bishop and no
|
||||
// other pieces?
|
||||
if ( pos.non_pawn_material(WHITE) == BishopValueMg
|
||||
&& pos.non_pawn_material(BLACK) == BishopValueMg)
|
||||
{
|
||||
// Check for KBP vs KB with only a single pawn that is almost
|
||||
// certainly a draw or at least two pawns.
|
||||
bool one_pawn = (pos.count<PAWN>(WHITE) + pos.count<PAWN>(BLACK) == 1);
|
||||
sf = one_pawn ? ScaleFactor(8) : ScaleFactor(32);
|
||||
if (pos.opposite_bishops()) {
|
||||
// Ignoring any pawns, do both sides only have a single bishop and no
|
||||
// other pieces?
|
||||
if ( pos.non_pawn_material(WHITE) == BishopValueMg
|
||||
&& pos.non_pawn_material(BLACK) == BishopValueMg)
|
||||
{
|
||||
// Check for KBP vs KB with only a single pawn that is almost
|
||||
// certainly a draw or at least two pawns.
|
||||
bool one_pawn = (pos.count<PAWN>(WHITE) + pos.count<PAWN>(BLACK) == 1);
|
||||
sf = one_pawn ? ScaleFactor(8) : ScaleFactor(32);
|
||||
}
|
||||
else
|
||||
// Endgame with opposite-colored bishops, but also other pieces. Still
|
||||
// a bit drawish, but not as drawish as with only the two bishops.
|
||||
sf = ScaleFactor(50 * sf / SCALE_FACTOR_NORMAL);
|
||||
} else if ( ei.pi->pawn_span(strongSide) <= 1 &&
|
||||
!pos.pawn_passed(~strongSide, pos.king_square(~strongSide))) {
|
||||
sf = ScaleFactor(ScalePawnSpan[ei.pi->pawn_span(strongSide)]);
|
||||
}
|
||||
else
|
||||
// Endgame with opposite-colored bishops, but also other pieces. Still
|
||||
// a bit drawish, but not as drawish as with only the two bishops.
|
||||
sf = ScaleFactor(50 * sf / SCALE_FACTOR_NORMAL);
|
||||
}
|
||||
|
||||
// Interpolate between a middlegame and a (scaled by 'sf') endgame score
|
||||
|
||||
Reference in New Issue
Block a user