}
- // interpolate() interpolates between a middlegame and an endgame score,
- // based on game phase. It also scales the return value by a ScaleFactor array.
-
- Value interpolate(const Score& v, Phase ph, ScaleFactor sf) {
-
- assert(-VALUE_INFINITE < mg_value(v) && mg_value(v) < VALUE_INFINITE);
- assert(-VALUE_INFINITE < eg_value(v) && eg_value(v) < VALUE_INFINITE);
- assert(PHASE_ENDGAME <= ph && ph <= PHASE_MIDGAME);
-
- int eg = (eg_value(v) * int(sf)) / SCALE_FACTOR_NORMAL;
- return Value((mg_value(v) * int(ph) + eg * int(PHASE_MIDGAME - ph)) / PHASE_MIDGAME);
- }
-
-
// init_eval_info() initializes king bitboards for given color adding
// pawn attacks. To be done at the beginning of the evaluation.
assert(pos.pawn_passed(Us, s));
- int r = int(relative_rank(Us, s) - RANK_2);
+ int r = relative_rank(Us, s) - RANK_2;
int rr = r * (r - 1);
// Base bonus based on rank
- Value mbonus = Value(17 * rr);
- Value ebonus = Value(7 * (rr + r + 1));
+ Value mbonus = Value(17 * rr), ebonus = Value(7 * (rr + r + 1));
if (rr)
{
Square blockSq = s + pawn_push(Us);
// Adjust bonus based on the king's proximity
- ebonus += Value(square_distance(pos.king_square(Them), blockSq) * 5 * rr)
- - Value(square_distance(pos.king_square(Us ), blockSq) * 2 * rr);
+ ebonus += square_distance(pos.king_square(Them), blockSq) * 5 * rr
+ - square_distance(pos.king_square(Us ), blockSq) * 2 * rr;
// If blockSq is not the queening square then consider also a second push
if (relative_rank(Us, blockSq) != RANK_8)
- ebonus -= Value(rr * square_distance(pos.king_square(Us), blockSq + pawn_push(Us)));
+ ebonus -= square_distance(pos.king_square(Us), blockSq + pawn_push(Us)) * rr;
// If the pawn is free to advance, then increase the bonus
if (pos.empty(blockSq))
else if (defendedSquares & blockSq)
k += 4;
- mbonus += Value(k * rr), ebonus += Value(k * rr);
+ mbonus += k * rr, ebonus += k * rr;
}
} // rr != 0
- // Rook pawns are a special case: They are sometimes worse, and
- // sometimes better than other passed pawns. It is difficult to find
- // good rules for determining whether they are good or bad. For now,
- // we try the following: Increase the value for rook pawns if the
- // other side has no pieces apart from a knight, and decrease the
- // value if the other side has a rook or queen.
- if (file_of(s) == FILE_A || file_of(s) == FILE_H)
- {
- if (pos.non_pawn_material(Them) <= KnightValueMg)
- ebonus += ebonus / 4;
-
- else if (pos.pieces(Them, ROOK, QUEEN))
- ebonus -= ebonus / 4;
- }
-
if (pos.count<PAWN>(Us) < pos.count<PAWN>(Them))
ebonus += ebonus / 4;
ei.attackedBy[WHITE][ALL_PIECES] |= ei.attackedBy[WHITE][KING];
ei.attackedBy[BLACK][ALL_PIECES] |= ei.attackedBy[BLACK][KING];
- // Do not include in mobility squares protected by enemy pawns or occupied by our pieces
+ // Do not include in mobility squares protected by enemy pawns or occupied by our pawns or king
Bitboard mobilityArea[] = { ~(ei.attackedBy[BLACK][PAWN] | pos.pieces(WHITE, PAWN, KING)),
~(ei.attackedBy[WHITE][PAWN] | pos.pieces(BLACK, PAWN, KING)) };
sf = ScaleFactor(50 * sf / SCALE_FACTOR_NORMAL);
}
- Value v = interpolate(score, ei.mi->game_phase(), sf);
+ // Interpolate between a middlegame and an endgame score, scaling by 'sf'
+ Value v = mg_value(score) * int(ei.mi->game_phase())
+ + eg_value(score) * int(sf) / SCALE_FACTOR_NORMAL * int(PHASE_MIDGAME - ei.mi->game_phase());
+
+ v /= PHASE_MIDGAME;
// In case of tracing add all single evaluation contributions for both white and black
if (Trace)
Weights[KingDangerUs] = weight_option("Cowardice", "Cowardice", WeightsInternal[KingDangerUs]);
Weights[KingDangerThem] = weight_option("Aggressiveness", "Aggressiveness", WeightsInternal[KingDangerThem]);
- const int MaxSlope = 30;
- const int Peak = 1280;
+ const double MaxSlope = 30;
+ const double Peak = 1280;
for (int t = 0, i = 1; i < 100; ++i)
{
- t = std::min(Peak, std::min(int(0.4 * i * i), t + MaxSlope));
+ t = int(std::min(Peak, std::min(0.4 * i * i, t + MaxSlope)));
KingDanger[1][i] = apply_weight(make_score(t, 0), Weights[KingDangerUs]);
KingDanger[0][i] = apply_weight(make_score(t, 0), Weights[KingDangerThem]);