mirror of
https://github.com/sockspls/badfish
synced 2025-05-01 17:19:36 +00:00
Analysis Contempt combo box
This patch introduces an Analysis Contempt UCI combo box to control the behaviour of contempt during analysis. The possible values are Both, Off, White, Black. Technically, the engine is supposed to be in analysis mode if UCI_AnalyseMode is set by the graphical user interface or if the user has chosen infinite analysis mode ("go infinite"). Credits: the idea for the combo box is due to Michel Van den Bergh. No functional change (outside analysis mode). ----------------------------------------------------- The so-called "contempt" is an optimism value that the engine adds to one color to avoid simplifications and keep tension in the position during its search. It was introduced in Stockfish 9 and seemed to give good results during the TCEC 11 tournament (Stockfish seemed to play a little bit more actively than in previous seasons). The patch does not change the play during match or blitz play, but gives more options for correspondance players to decide for which color(s) they would like to use contempt in analysis mode (infinite time). Here is a description of the various options: * Both : in analysis mode, use the contempt for both players (alternating) * Off : in analysis mode, use the contempt for none of the players * White : in analysis mode, White will play actively, Black will play passively * Black : in analysis mode, Black will play actively, White will play passively
This commit is contained in:
parent
ae0bb6dc2b
commit
e9aeaad052
3 changed files with 26 additions and 5 deletions
|
@ -319,6 +319,16 @@ void Thread::search() {
|
||||||
multiPV = std::min(multiPV, rootMoves.size());
|
multiPV = std::min(multiPV, rootMoves.size());
|
||||||
|
|
||||||
int ct = Options["Contempt"] * PawnValueEg / 100; // From centipawns
|
int ct = Options["Contempt"] * PawnValueEg / 100; // From centipawns
|
||||||
|
|
||||||
|
// In analysis mode, adjust contempt in accordance with user preference
|
||||||
|
if (Limits.infinite || Options["UCI_AnalyseMode"])
|
||||||
|
ct = Options["Analysis Contempt"] == "Off" ? 0
|
||||||
|
: Options["Analysis Contempt"] == "Both" ? ct
|
||||||
|
: Options["Analysis Contempt"] == "White" && us == BLACK ? -ct
|
||||||
|
: Options["Analysis Contempt"] == "Black" && us == WHITE ? -ct
|
||||||
|
: ct;
|
||||||
|
|
||||||
|
// In evaluate.cpp the evaluation is from the white point of view
|
||||||
contempt = (us == WHITE ? make_score(ct, ct / 2)
|
contempt = (us == WHITE ? make_score(ct, ct / 2)
|
||||||
: -make_score(ct, ct / 2));
|
: -make_score(ct, ct / 2));
|
||||||
|
|
||||||
|
@ -358,13 +368,11 @@ void Thread::search() {
|
||||||
alpha = std::max(previousScore - delta,-VALUE_INFINITE);
|
alpha = std::max(previousScore - delta,-VALUE_INFINITE);
|
||||||
beta = std::min(previousScore + delta, VALUE_INFINITE);
|
beta = std::min(previousScore + delta, VALUE_INFINITE);
|
||||||
|
|
||||||
ct = Options["Contempt"] * PawnValueEg / 100; // From centipawns
|
|
||||||
|
|
||||||
// Adjust contempt based on root move's previousScore (dynamic contempt)
|
// Adjust contempt based on root move's previousScore (dynamic contempt)
|
||||||
ct += int(std::round(48 * atan(float(previousScore) / 128)));
|
int dct = ct + int(std::round(48 * atan(float(previousScore) / 128)));
|
||||||
|
|
||||||
contempt = (us == WHITE ? make_score(ct, ct / 2)
|
contempt = (us == WHITE ? make_score(dct, dct / 2)
|
||||||
: -make_score(ct, ct / 2));
|
: -make_score(dct, dct / 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start with a small aspiration window and, in the case of a fail
|
// Start with a small aspiration window and, in the case of a fail
|
||||||
|
|
|
@ -50,11 +50,13 @@ public:
|
||||||
Option(bool v, OnChange = nullptr);
|
Option(bool v, OnChange = nullptr);
|
||||||
Option(const char* v, OnChange = nullptr);
|
Option(const char* v, OnChange = nullptr);
|
||||||
Option(int v, int minv, int maxv, OnChange = nullptr);
|
Option(int v, int minv, int maxv, OnChange = nullptr);
|
||||||
|
Option(const char* v, const char *cur, OnChange = nullptr);
|
||||||
|
|
||||||
Option& operator=(const std::string&);
|
Option& operator=(const std::string&);
|
||||||
void operator<<(const Option&);
|
void operator<<(const Option&);
|
||||||
operator int() const;
|
operator int() const;
|
||||||
operator std::string() const;
|
operator std::string() const;
|
||||||
|
bool operator==(const char*);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend std::ostream& operator<<(std::ostream&, const OptionsMap&);
|
friend std::ostream& operator<<(std::ostream&, const OptionsMap&);
|
||||||
|
|
|
@ -60,6 +60,7 @@ void init(OptionsMap& o) {
|
||||||
|
|
||||||
o["Debug Log File"] << Option("", on_logger);
|
o["Debug Log File"] << Option("", on_logger);
|
||||||
o["Contempt"] << Option(12, -100, 100);
|
o["Contempt"] << Option(12, -100, 100);
|
||||||
|
o["Analysis Contempt"] << Option("Both var Off var White var Black var Both", "Both");
|
||||||
o["Threads"] << Option(1, 1, 512, on_threads);
|
o["Threads"] << Option(1, 1, 512, on_threads);
|
||||||
o["Hash"] << Option(16, 1, MaxHashMB, on_hash_size);
|
o["Hash"] << Option(16, 1, MaxHashMB, on_hash_size);
|
||||||
o["Clear Hash"] << Option(on_clear_hash);
|
o["Clear Hash"] << Option(on_clear_hash);
|
||||||
|
@ -71,6 +72,7 @@ void init(OptionsMap& o) {
|
||||||
o["Slow Mover"] << Option(84, 10, 1000);
|
o["Slow Mover"] << Option(84, 10, 1000);
|
||||||
o["nodestime"] << Option(0, 0, 10000);
|
o["nodestime"] << Option(0, 0, 10000);
|
||||||
o["UCI_Chess960"] << Option(false);
|
o["UCI_Chess960"] << Option(false);
|
||||||
|
o["UCI_AnalyseMode"] << Option(false);
|
||||||
o["SyzygyPath"] << Option("<empty>", on_tb_path);
|
o["SyzygyPath"] << Option("<empty>", on_tb_path);
|
||||||
o["SyzygyProbeDepth"] << Option(1, 1, 100);
|
o["SyzygyProbeDepth"] << Option(1, 1, 100);
|
||||||
o["Syzygy50MoveRule"] << Option(true);
|
o["Syzygy50MoveRule"] << Option(true);
|
||||||
|
@ -117,6 +119,9 @@ Option::Option(OnChange f) : type("button"), min(0), max(0), on_change(f)
|
||||||
Option::Option(int v, int minv, int maxv, OnChange f) : type("spin"), min(minv), max(maxv), on_change(f)
|
Option::Option(int v, int minv, int maxv, OnChange f) : type("spin"), min(minv), max(maxv), on_change(f)
|
||||||
{ defaultValue = currentValue = std::to_string(v); }
|
{ defaultValue = currentValue = std::to_string(v); }
|
||||||
|
|
||||||
|
Option::Option(const char* v, const char* cur, OnChange f) : type("combo"), min(0), max(0), on_change(f)
|
||||||
|
{ defaultValue = v; currentValue = cur; }
|
||||||
|
|
||||||
Option::operator int() const {
|
Option::operator int() const {
|
||||||
assert(type == "check" || type == "spin");
|
assert(type == "check" || type == "spin");
|
||||||
return (type == "spin" ? stoi(currentValue) : currentValue == "true");
|
return (type == "spin" ? stoi(currentValue) : currentValue == "true");
|
||||||
|
@ -127,6 +132,12 @@ Option::operator std::string() const {
|
||||||
return currentValue;
|
return currentValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Option::operator==(const char* s) {
|
||||||
|
assert(type == "combo");
|
||||||
|
return !CaseInsensitiveLess()(currentValue, s)
|
||||||
|
&& !CaseInsensitiveLess()(s, currentValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// operator<<() inits options and assigns idx in the correct printing order
|
/// operator<<() inits options and assigns idx in the correct printing order
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue