mirror of
https://github.com/sockspls/badfish
synced 2025-05-01 01:03: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 Tracing { NO_TRACE, TRACE };
|
||||||
|
|
||||||
enum Term { // The first 8 entries are reserved for PieceType
|
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];
|
Score scores[TERM_NB][COLOR_NB];
|
||||||
|
@ -59,7 +59,7 @@ namespace Trace {
|
||||||
|
|
||||||
std::ostream& operator<<(std::ostream& os, Term t) {
|
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 << " ---- ----" << " | " << " ---- ----";
|
os << " ---- ----" << " | " << " ---- ----";
|
||||||
else
|
else
|
||||||
os << scores[t][WHITE] << " | " << scores[t][BLACK];
|
os << scores[t][WHITE] << " | " << scores[t][BLACK];
|
||||||
|
@ -173,8 +173,7 @@ namespace {
|
||||||
template<Color Us> Score threats() const;
|
template<Color Us> Score threats() const;
|
||||||
template<Color Us> Score passed() const;
|
template<Color Us> Score passed() const;
|
||||||
template<Color Us> Score space() const;
|
template<Color Us> Score space() const;
|
||||||
ScaleFactor scale_factor(Value eg) const;
|
Value winnable(Score score) const;
|
||||||
Score initiative(Score score) const;
|
|
||||||
|
|
||||||
const Position& pos;
|
const Position& pos;
|
||||||
Material::Entry* me;
|
Material::Entry* me;
|
||||||
|
@ -717,12 +716,12 @@ namespace {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Evaluation::initiative() computes the initiative correction value
|
// Evaluation::winnable() adjusts the mg and eg score components based on the
|
||||||
// for the position. It is a second order bonus/malus based on the
|
|
||||||
// known attacking/defending status of the players.
|
// known attacking/defending status of the players.
|
||||||
|
// A single value is derived from the mg and eg values and returned.
|
||||||
|
|
||||||
template<Tracing T>
|
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))
|
int outflanking = distance<File>(pos.square<KING>(WHITE), pos.square<KING>(BLACK))
|
||||||
- distance<Rank>(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 u = ((mg > 0) - (mg < 0)) * Utility::clamp(complexity + 50, -abs(mg), 0);
|
||||||
int v = ((eg > 0) - (eg < 0)) * std::max(complexity, -abs(eg));
|
int v = ((eg > 0) - (eg < 0)) * std::max(complexity, -abs(eg));
|
||||||
|
|
||||||
if (T)
|
mg += u;
|
||||||
Trace::add(INITIATIVE, make_score(u, v));
|
eg += v;
|
||||||
|
|
||||||
return make_score(u, v);
|
// Compute the scale factor for the winning side
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Evaluation::scale_factor() computes the scale factor for the winning side
|
|
||||||
|
|
||||||
template<Tracing T>
|
|
||||||
ScaleFactor Evaluation<T>::scale_factor(Value eg) const {
|
|
||||||
|
|
||||||
Color strongSide = eg > VALUE_DRAW ? WHITE : BLACK;
|
Color strongSide = eg > VALUE_DRAW ? WHITE : BLACK;
|
||||||
int sf = me->scale_factor(pos, strongSide);
|
int sf = me->scale_factor(pos, strongSide);
|
||||||
|
@ -786,7 +778,18 @@ namespace {
|
||||||
sf = std::min(sf, 36 + 7 * pos.count<PAWN>(strongSide));
|
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>()
|
+ passed< WHITE>() - passed< BLACK>()
|
||||||
+ space< WHITE>() - space< BLACK>();
|
+ space< WHITE>() - space< BLACK>();
|
||||||
|
|
||||||
score += initiative(score);
|
// Derive single value from mg and eg parts of score
|
||||||
|
v = winnable(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;
|
|
||||||
|
|
||||||
// In case of tracing add all remaining individual evaluation terms
|
// In case of tracing add all remaining individual evaluation terms
|
||||||
if (T)
|
if (T)
|
||||||
|
@ -857,7 +854,6 @@ namespace {
|
||||||
Trace::add(IMBALANCE, me->imbalance());
|
Trace::add(IMBALANCE, me->imbalance());
|
||||||
Trace::add(PAWN, pe->pawn_score(WHITE), pe->pawn_score(BLACK));
|
Trace::add(PAWN, pe->pawn_score(WHITE), pe->pawn_score(BLACK));
|
||||||
Trace::add(MOBILITY, mobility[WHITE], mobility[BLACK]);
|
Trace::add(MOBILITY, mobility[WHITE], mobility[BLACK]);
|
||||||
Trace::add(TOTAL, score);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Side to move point of view
|
// Side to move point of view
|
||||||
|
@ -909,11 +905,11 @@ std::string Eval::trace(const Position& pos) {
|
||||||
<< " Threats | " << Term(THREAT)
|
<< " Threats | " << Term(THREAT)
|
||||||
<< " Passed | " << Term(PASSED)
|
<< " Passed | " << Term(PASSED)
|
||||||
<< " Space | " << Term(SPACE)
|
<< " Space | " << Term(SPACE)
|
||||||
<< " Initiative | " << Term(INITIATIVE)
|
<< " Winnable | " << Term(WINNABLE)
|
||||||
<< " ------------+-------------+-------------+------------\n"
|
<< " ------------+-------------+-------------+------------\n"
|
||||||
<< " Total | " << Term(TOTAL);
|
<< " Total | " << Term(TOTAL);
|
||||||
|
|
||||||
ss << "\nTotal evaluation: " << to_cp(v) << " (white side)\n";
|
ss << "\nFinal evaluation: " << to_cp(v) << " (white side)\n";
|
||||||
|
|
||||||
return ss.str();
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue