// Evaluation weights, initialized from UCI options
enum { Mobility, PawnStructure, PassedPawns, Space, KingDangerUs, KingDangerThem };
- Score Weights[6];
+ struct Weight { int mg, eg; } Weights[6];
typedef Value V;
#define S(mg, eg) make_score(mg, eg)
Score evaluate_unstoppable_pawns(const Position& pos, Color us, const EvalInfo& ei);
Value interpolate(const Score& v, Phase ph, ScaleFactor sf);
- Score apply_weight(Score v, Score w);
- Score weight_option(const std::string& mgOpt, const std::string& egOpt, Score internalWeight);
+ Score apply_weight(Score v, const Weight& w);
+ Weight weight_option(const std::string& mgOpt, const std::string& egOpt, Score internalWeight);
}
// the pawn shelter (current 'score' value).
attackUnits = std::min(20, (ei.kingAttackersCount[Them] * ei.kingAttackersWeight[Them]) / 2)
+ 3 * (ei.kingAdjacentZoneAttacksCount[Them] + popcount<Max15>(undefended))
+ + 2 * (ei.pinnedPieces[Us] != 0)
- mg_value(score) / 32;
// Analyse the enemy's safe queen contact checks. Firstly, find the
}
// apply_weight() weights score v by score w trying to prevent overflow
- Score apply_weight(Score v, Score w) {
+ Score apply_weight(Score v, const Weight& w) {
- return make_score((int(mg_value(v)) * mg_value(w)) / 0x100,
- (int(eg_value(v)) * eg_value(w)) / 0x100);
+ return make_score(mg_value(v) * w.mg / 256, eg_value(v) * w.eg / 256);
}
// weight_option() computes the value of an evaluation weight, by combining
// two UCI-configurable weights (midgame and endgame) with an internal weight.
- Score weight_option(const std::string& mgOpt, const std::string& egOpt, Score internalWeight) {
+ Weight weight_option(const std::string& mgOpt, const std::string& egOpt, Score internalWeight) {
- // Scale option value from 100 to 256
- int mg = Options[mgOpt] * 256 / 100;
- int eg = Options[egOpt] * 256 / 100;
-
- return apply_weight(make_score(mg, eg), internalWeight);
+ Weight w = { Options[mgOpt] * mg_value(internalWeight) / 100,
+ Options[egOpt] * eg_value(internalWeight) / 100 };
+ return w;
}
switch (idx) {
case PST: case IMBALANCE: case PAWN: case TOTAL:
ss << std::setw(20) << name << " | --- --- | --- --- | "
- << std::setw(6) << to_cp(mg_value(wScore - bScore)) << " "
- << std::setw(6) << to_cp(eg_value(wScore - bScore)) << " \n";
+ << std::setw(5) << to_cp(mg_value(wScore - bScore)) << " "
+ << std::setw(5) << to_cp(eg_value(wScore - bScore)) << " \n";
break;
default:
ss << std::setw(20) << name << " | " << std::noshowpos
<< std::setw(5) << to_cp(eg_value(wScore)) << " | "
<< std::setw(5) << to_cp(mg_value(bScore)) << " "
<< std::setw(5) << to_cp(eg_value(bScore)) << " | "
- << std::showpos
- << std::setw(6) << to_cp(mg_value(wScore - bScore)) << " "
- << std::setw(6) << to_cp(eg_value(wScore - bScore)) << " \n";
+ << std::setw(5) << to_cp(mg_value(wScore - bScore)) << " "
+ << std::setw(5) << to_cp(eg_value(wScore - bScore)) << " \n";
}
}
std::memset(terms, 0, sizeof(terms));
Value v = do_evaluate<true>(pos);
+ v = pos.side_to_move() == WHITE ? v : -v; // White's point of view
std::stringstream ss;
- ss << std::showpoint << std::showpos << std::fixed << std::setprecision(2)
- << " Eval term | White | Black | Total \n"
- << " | MG EG | MG EG | MG EG \n"
- << "---------------------+-------------+-------------+---------------\n";
+ ss << std::showpoint << std::noshowpos << std::fixed << std::setprecision(2)
+ << " Eval term | White | Black | Total \n"
+ << " | MG EG | MG EG | MG EG \n"
+ << "---------------------+-------------+-------------+-------------\n";
format_row(ss, "Material, PST, Tempo", PST);
format_row(ss, "Material imbalance", IMBALANCE);
format_row(ss, "Passed pawns", PASSED);
format_row(ss, "Space", SPACE);
- ss << "---------------------+-------------+-------------+---------------\n";
+ ss << "---------------------+-------------+-------------+-------------\n";
format_row(ss, "Total", TOTAL);
- ss << "\nScaling: " << std::noshowpos
- << std::setw(6) << 100.0 * ei.mi->game_phase() / 128.0 << "% MG, "
- << std::setw(6) << 100.0 * (1.0 - ei.mi->game_phase() / 128.0) << "% * "
- << std::setw(6) << (100.0 * sf) / SCALE_FACTOR_NORMAL << "% EG.\n"
- << "Total evaluation: " << to_cp(v);
+ ss << "\nTotal Evaluation: " << to_cp(v) << " (white side)\n";
return ss.str();
}