X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fevaluate.cpp;h=b4e86f3b1d826030f8e6a3d4a34686d680a6f339;hp=99e9f0475281111fff761ad0f4f0b0f33e7e3968;hb=3b19ea6ae5291ecc989df7499998e7856f3c1c5a;hpb=c7cf45241cd264104c02a4e717c447f5231a284a diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 99e9f047..b4e86f3b 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -91,7 +91,7 @@ namespace { // 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) @@ -233,8 +233,8 @@ namespace { 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); } @@ -629,6 +629,7 @@ Value do_evaluate(const Position& pos) { // the pawn shelter (current 'score' value). attackUnits = std::min(20, (ei.kingAttackersCount[Them] * ei.kingAttackersWeight[Them]) / 2) + 3 * (ei.kingAdjacentZoneAttacksCount[Them] + popcount(undefended)) + + 2 * (ei.pinnedPieces[Us] != 0) - mg_value(score) / 32; // Analyse the enemy's safe queen contact checks. Firstly, find the @@ -924,22 +925,19 @@ Value do_evaluate(const Position& pos) { } // 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; } @@ -961,8 +959,8 @@ Value do_evaluate(const Position& pos) { 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 @@ -970,9 +968,8 @@ Value do_evaluate(const Position& pos) { << 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"; } } @@ -981,12 +978,13 @@ Value do_evaluate(const Position& pos) { std::memset(terms, 0, sizeof(terms)); Value v = do_evaluate(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); @@ -1001,14 +999,10 @@ Value do_evaluate(const Position& pos) { 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(); }