Skip to content

Commit

Permalink
join scale_factor, initiative and mg+eg reduction
Browse files Browse the repository at this point in the history
Merging this code into one function `winnable()`.
Should allow common concepts used to adjust the eg value,
either by addition or scaling, to be combined more effectively.

Improve trace function.

closes official-stockfish#2710

No functional change.
  • Loading branch information
xoto10 authored and MichaelB7 committed Jun 11, 2020
1 parent eb85369 commit 3a16028
Showing 1 changed file with 25 additions and 29 deletions.
54 changes: 25 additions & 29 deletions src/evaluate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ namespace Trace {
enum Tracing { NO_TRACE, TRACE };

enum Term { // The first 8 entries are reserved for PieceType
MATERIAL = 8, IMBALANCE, MOBILITY, THREAT, PASSED, SPACE, INITIATIVE, TOTAL, TERM_NB
MATERIAL = 8, IMBALANCE, MOBILITY, THREAT, PASSED, SPACE, WINNABLE, TOTAL, TERM_NB
};

Score scores[TERM_NB][COLOR_NB];
Expand All @@ -60,7 +60,7 @@ namespace Trace {

std::ostream& operator<<(std::ostream& os, Term t) {

if (t == MATERIAL || t == IMBALANCE || t == INITIATIVE || t == TOTAL)
if (t == MATERIAL || t == IMBALANCE || t == WINNABLE || t == TOTAL)
os << " ---- ----" << " | " << " ---- ----";
else
os << scores[t][WHITE] << " | " << scores[t][BLACK];
Expand Down Expand Up @@ -201,8 +201,7 @@ namespace {
template<Color Us> Score threats() const;
template<Color Us> Score passed() const;
template<Color Us> Score space() const;
ScaleFactor scale_factor(Value eg) const;
Score initiative(Score score) const;
Value winnable(Score score) const;

const Position& pos;
Material::Entry* me;
Expand Down Expand Up @@ -774,12 +773,12 @@ namespace {
}


// Evaluation::initiative() computes the initiative correction value
// for the position. It is a second order bonus/malus based on the
// Evaluation::winnable() adjusts the mg and eg score components based on the
// known attacking/defending status of the players.
// A single value is derived from the mg and eg values and returned.

template<Tracing T>
Score Evaluation<T>::initiative(Score score) const {
Value Evaluation<T>::winnable(Score score) const {

#if defined (Sullivan) || (Blau) || (Noir) || (Fortress)
int separation = distance<File>(pos.square<KING>(WHITE), pos.square<KING>(BLACK));
Expand Down Expand Up @@ -819,17 +818,10 @@ namespace {
int u = ((mg > 0) - (mg < 0)) * Utility::clamp(complexity + 50, -abs(mg), 0);
int v = ((eg > 0) - (eg < 0)) * std::max(complexity, -abs(eg));

if (T)
Trace::add(INITIATIVE, make_score(u, v));

return make_score(u, v);
}

mg += u;
eg += v;

// Evaluation::scale_factor() computes the scale factor for the winning side

template<Tracing T>
ScaleFactor Evaluation<T>::scale_factor(Value eg) const {
// Compute the scale factor for the winning side

Color strongSide = eg > VALUE_DRAW ? WHITE : BLACK;
int sf = me->scale_factor(pos, strongSide);
Expand All @@ -849,7 +841,18 @@ namespace {
sf = std::min(sf, 36 + 7 * pos.count<PAWN>(strongSide));
}

return ScaleFactor(sf);
// Interpolate between the middlegame and (scaled by 'sf') endgame score
v = mg * int(me->game_phase())
+ eg * int(PHASE_MIDGAME - me->game_phase()) * ScaleFactor(sf) / SCALE_FACTOR_NORMAL;
v /= PHASE_MIDGAME;

if (T)
{
Trace::add(WINNABLE, make_score(u, eg * ScaleFactor(sf) / SCALE_FACTOR_NORMAL - eg_value(score)));
Trace::add(TOTAL, make_score(mg, eg * ScaleFactor(sf) / SCALE_FACTOR_NORMAL));
}

return Value(v);
}


Expand Down Expand Up @@ -912,14 +915,8 @@ namespace {
+ passed< WHITE>() - passed< BLACK>()
+ space< WHITE>() - space< BLACK>();

score += initiative(score);

// Interpolate between a middlegame and a (scaled by 'sf') endgame score
ScaleFactor sf = scale_factor(eg_value(score));
v = mg_value(score) * int(me->game_phase())
+ eg_value(score) * int(PHASE_MIDGAME - me->game_phase()) * sf / SCALE_FACTOR_NORMAL;

v /= PHASE_MIDGAME;
// Derive single value from mg and eg parts of score
v = winnable(score);

// In case of tracing add all remaining individual evaluation terms
if (T)
Expand All @@ -928,7 +925,6 @@ namespace {
Trace::add(IMBALANCE, me->imbalance());
Trace::add(PAWN, pe->pawn_score(WHITE), pe->pawn_score(BLACK));
Trace::add(MOBILITY, mobility[WHITE], mobility[BLACK]);
Trace::add(TOTAL, score);
}
// Side to move point of view
return (pos.side_to_move() == WHITE ? v : -v) + Tempo;
Expand Down Expand Up @@ -980,11 +976,11 @@ std::string Eval::trace(const Position& pos) {
<< " Threats | " << Term(THREAT)
<< " Passed | " << Term(PASSED)
<< " Space | " << Term(SPACE)
<< " Initiative | " << Term(INITIATIVE)
<< " Winnable | " << Term(WINNABLE)
<< " ------------+-------------+-------------+------------\n"
<< " Total | " << Term(TOTAL);

ss << "\nTotal evaluation: " << to_cp(v) << " (white side)\n";
ss << "\nFinal evaluation: " << to_cp(v) << " (white side)\n";

return ss.str();
}

0 comments on commit 3a16028

Please sign in to comment.