mirror of
https://github.com/sockspls/badfish
synced 2025-04-29 16:23:09 +00:00
join scale_factor, initiative and mg+eg reduction
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 https://github.com/official-stockfish/Stockfish/pull/2710 No functional change.
This commit is contained in:
parent
15e190e942
commit
902309020a
1 changed files with 25 additions and 29 deletions
|
@ -35,7 +35,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];
|
||||
|
@ -59,7 +59,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];
|
||||
|
@ -173,8 +173,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;
|
||||
|
@ -717,12 +716,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 {
|
||||
|
||||
int outflanking = distance<File>(pos.square<KING>(WHITE), pos.square<KING>(BLACK))
|
||||
- distance<Rank>(pos.square<KING>(WHITE), pos.square<KING>(BLACK));
|
||||
|
@ -756,17 +755,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));
|
||||
mg += u;
|
||||
eg += v;
|
||||
|
||||
return make_score(u, 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);
|
||||
|
@ -786,7 +778,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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -841,14 +844,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)
|
||||
|
@ -857,7 +854,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
|
||||
|
@ -909,11 +905,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();
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue