void evaluate_trapped_bishop_a7h7(const Position& pos, Square s, Color us, EvalInfo& ei);
void evaluate_trapped_bishop_a1h1(const Position& pos, Square s, Color us, EvalInfo& ei);
inline Value apply_weight(Value v, int w);
+ inline Score apply_weight(Score v, int wmg, int weg);
Value scale_by_game_phase(const Score& v, Phase ph, const ScaleFactor sf[]);
int weight_option(const std::string& opt, int weight);
void init_safety();
// Probe the material hash table
ei.mi = MaterialTable[threadID]->get_material_info(pos);
- ei.value += Score(ei.mi->material_value(), ei.mi->material_value());
+ ei.value += ei.mi->material_value();
// If we have a specialized evaluation function for the current material
// configuration, call it and return
// Probe the pawn hash table
ei.pi = PawnTable[threadID]->get_pawn_info(pos);
- ei.value += Score(apply_weight(ei.pi->mg_value(), WeightPawnStructureMidgame),
- apply_weight(ei.pi->eg_value(), WeightPawnStructureEndgame));
+ ei.value += apply_weight(ei.pi->value(), WeightPawnStructureMidgame, WeightPawnStructureEndgame);
// Initialize king attack bitboards and king attack zones for both sides
ei.attackedBy[WHITE][KING] = pos.attacks_from<KING>(pos.king_square(WHITE));
}
// Mobility
- ei.value += Score(apply_weight(ei.mgMobility, WeightMobilityMidgame),
- apply_weight(ei.egMobility, WeightMobilityEndgame));
+ ei.value += apply_weight(Score(ei.mgMobility, ei.egMobility), WeightMobilityMidgame, WeightMobilityEndgame);
// If we don't already have an unusual scale factor, check for opposite
// colored bishop endgames, and use a lower scale for those
if (relative_rank(Us, s) <= RANK_4)
{
shelter = ei.pi->get_king_shelter(pos, Us, s);
- ei.value += Score(Sign[Us] * Value(shelter), 0);
+ ei.value += Sign[Us] * Score(shelter, 0);
}
// King safety. This is quite complicated, and is almost certainly far
// change far bigger than the value of the captured piece.
Value v = apply_weight(SafetyTable[attackUnits], WeightKingSafety[Us]);
- ei.value -= Score(Sign[Us] * v, 0);
+ ei.value -= Sign[Us] * Score(v, 0);
if (Us == pos.side_to_move())
ei.futilityMargin += v;
return (v*w) / 0x100;
}
+ inline Score apply_weight(Score v, int wmg, int weg) {
+ return Score(v.mg()*wmg, v.eg()*weg) / 0x100;
+ }
+
// scale_by_game_phase() interpolates between a middle game and an endgame
// score, based on game phase. It also scales the return value by a
public:
MaterialInfo() : key(0) { clear(); }
- Value material_value() const;
+ Score material_value() const;
ScaleFactor scale_factor(const Position& pos, Color c) const;
int space_weight() const;
bool specialized_eval_exists() const;
/// MaterialInfo::material_value simply returns the material balance
/// evaluation that is independent from game phase.
-inline Value MaterialInfo::material_value() const {
+inline Score MaterialInfo::material_value() const {
- return Value(value);
+ return Score(value, value);
}
public:
PawnInfo() { clear(); }
- Value mg_value() const;
- Value eg_value() const;
+ Score value() const;
Value kingside_storm_value(Color c) const;
Value queenside_storm_value(Color c) const;
Bitboard pawn_attacks(Color c) const;
//// Inline functions
////
-inline Value PawnInfo::mg_value() const {
- return Value(mgValue);
-}
-
-inline Value PawnInfo::eg_value() const {
- return Value(egValue);
+inline Score PawnInfo::value() const {
+ return Score(mgValue, egValue);
}
inline Bitboard PawnInfo::passed_pawns() const {