diff --git a/src/engine.cpp b/src/engine.cpp index d835fc8e..6c8799a1 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -59,57 +59,83 @@ Engine::Engine(std::optional path) : NN::NetworkSmall({EvalFileDefaultNameSmall, "None", ""}, NN::EmbeddedNNUEType::SMALL))) { pos.set(StartFEN, false, &states->back()); - options["Debug Log File"] << Option("", [](const Option& o) { - start_logger(o); - return std::nullopt; - }); - options["NumaPolicy"] << Option("auto", [this](const Option& o) { - set_numa_config_from_option(o); - return numa_config_information_as_string() + "\n" - + thread_allocation_information_as_string(); - }); + options.add( // + "Debug Log File", Option("", [](const Option& o) { + start_logger(o); + return std::nullopt; + })); - options["Threads"] << Option(1, 1, 1024, [this](const Option&) { - resize_threads(); - return thread_allocation_information_as_string(); - }); + options.add( // + "NumaPolicy", Option("auto", [this](const Option& o) { + set_numa_config_from_option(o); + return numa_config_information_as_string() + "\n" + + thread_allocation_information_as_string(); + })); - options["Hash"] << Option(16, 1, MaxHashMB, [this](const Option& o) { - set_tt_size(o); - return std::nullopt; - }); + options.add( // + "Threads", Option(1, 1, 1024, [this](const Option&) { + resize_threads(); + return thread_allocation_information_as_string(); + })); - options["Clear Hash"] << Option([this](const Option&) { - search_clear(); - return std::nullopt; - }); - options["Ponder"] << Option(false); - options["MultiPV"] << Option(1, 1, MAX_MOVES); - options["Skill Level"] << Option(20, 0, 20); - options["Move Overhead"] << Option(10, 0, 5000); - options["nodestime"] << Option(0, 0, 10000); - options["UCI_Chess960"] << Option(false); - options["UCI_LimitStrength"] << Option(false); - options["UCI_Elo"] << Option(Stockfish::Search::Skill::LowestElo, - Stockfish::Search::Skill::LowestElo, - Stockfish::Search::Skill::HighestElo); - options["UCI_ShowWDL"] << Option(false); - options["SyzygyPath"] << Option("", [](const Option& o) { - Tablebases::init(o); - return std::nullopt; - }); - options["SyzygyProbeDepth"] << Option(1, 1, 100); - options["Syzygy50MoveRule"] << Option(true); - options["SyzygyProbeLimit"] << Option(7, 0, 7); - options["EvalFile"] << Option(EvalFileDefaultNameBig, [this](const Option& o) { - load_big_network(o); - return std::nullopt; - }); - options["EvalFileSmall"] << Option(EvalFileDefaultNameSmall, [this](const Option& o) { - load_small_network(o); - return std::nullopt; - }); + options.add( // + "Hash", Option(16, 1, MaxHashMB, [this](const Option& o) { + set_tt_size(o); + return std::nullopt; + })); + + options.add( // + "Clear Hash", Option([this](const Option&) { + search_clear(); + return std::nullopt; + })); + + options.add( // + "Ponder", Option(false)); + + options.add( // + "MultiPV", Option(1, 1, MAX_MOVES)); + + options.add("Skill Level", Option(20, 0, 20)); + + options.add("Move Overhead", Option(10, 0, 5000)); + + options.add("nodestime", Option(0, 0, 10000)); + + options.add("UCI_Chess960", Option(false)); + + options.add("UCI_LimitStrength", Option(false)); + + options.add("UCI_Elo", + Option(Stockfish::Search::Skill::LowestElo, Stockfish::Search::Skill::LowestElo, + Stockfish::Search::Skill::HighestElo)); + + options.add("UCI_ShowWDL", Option(false)); + + options.add( // + "SyzygyPath", Option("", [](const Option& o) { + Tablebases::init(o); + return std::nullopt; + })); + + options.add("SyzygyProbeDepth", Option(1, 1, 100)); + + options.add("Syzygy50MoveRule", Option(true)); + + options.add("SyzygyProbeLimit", Option(7, 0, 7)); + + options.add( // + "EvalFile", Option(EvalFileDefaultNameBig, [this](const Option& o) { + load_big_network(o); + return std::nullopt; + })); + + options.add( // + "EvalFileSmall", Option(EvalFileDefaultNameSmall, [this](const Option& o) { + load_small_network(o); + return std::nullopt; + })); load_networks(); resize_threads(); @@ -340,5 +366,4 @@ std::string Engine::thread_allocation_information_as_string() const { return ss.str(); } - } diff --git a/src/tune.cpp b/src/tune.cpp index aff96c8c..f53a0eb5 100644 --- a/src/tune.cpp +++ b/src/tune.cpp @@ -55,7 +55,7 @@ void Tune::make_option(OptionsMap* opts, const string& n, int v, const SetRange& if (TuneResults.count(n)) v = TuneResults[n]; - (*opts)[n] << Option(v, r(v).first, r(v).second, on_tune); + opts->add(n, Option(v, r(v).first, r(v).second, on_tune)); LastOption = &((*opts)[n]); // Print formatted parameters, ready to be copy-pasted in Fishtest diff --git a/src/ucioption.cpp b/src/ucioption.cpp index 56cf41ed..a76bd3ac 100644 --- a/src/ucioption.cpp +++ b/src/ucioption.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -57,17 +58,31 @@ void OptionsMap::setoption(std::istringstream& is) { sync_cout << "No such option: " << name << sync_endl; } -Option OptionsMap::operator[](const std::string& name) const { +const Option& OptionsMap::operator[](const std::string& name) const { auto it = options_map.find(name); - return it != options_map.end() ? it->second : Option(this); + assert(it != options_map.end()); + return it->second; } -Option& OptionsMap::operator[](const std::string& name) { +// Inits options and assigns idx in the correct printing order +void OptionsMap::add(const std::string& name, const Option& option) { if (!options_map.count(name)) - options_map[name] = Option(this); - return options_map[name]; + { + static size_t insert_order = 0; + + options_map[name] = option; + + options_map[name].parent = this; + options_map[name].idx = insert_order++; + } + else + { + std::cerr << "Option \"" << name << "\" was already added!" << std::endl; + std::exit(EXIT_FAILURE); + } } + std::size_t OptionsMap::count(const std::string& name) const { return options_map.count(name); } Option::Option(const OptionsMap* map) : @@ -130,19 +145,6 @@ bool Option::operator==(const char* s) const { bool Option::operator!=(const char* s) const { return !(*this == s); } -// Inits options and assigns idx in the correct printing order - -void Option::operator<<(const Option& o) { - - static size_t insert_order = 0; - - auto p = this->parent; - *this = o; - - this->parent = p; - idx = insert_order++; -} - // Updates currentValue and triggers on_change() action. It's up to // the GUI to check for option's limits, but we could receive the new value // from the user by console window, so let's check the bounds anyway. @@ -161,7 +163,7 @@ Option& Option::operator=(const std::string& v) { std::string token; std::istringstream ss(defaultValue); while (ss >> token) - comboMap[token] << Option(); + comboMap.add(token, Option()); if (!comboMap.count(v) || v == "var") return *this; } diff --git a/src/ucioption.h b/src/ucioption.h index c9f6787d..3d7386c3 100644 --- a/src/ucioption.h +++ b/src/ucioption.h @@ -54,12 +54,13 @@ class Option { friend std::ostream& operator<<(std::ostream&, const OptionsMap&); + int operator<<(const Option&) = delete; + private: friend class OptionsMap; friend class Engine; friend class Tune; - void operator<<(const Option&); std::string defaultValue, currentValue, type; int min, max; @@ -82,8 +83,9 @@ class OptionsMap { void setoption(std::istringstream&); - Option operator[](const std::string&) const; - Option& operator[](const std::string&); + const Option& operator[](const std::string&) const; + + void add(const std::string&, const Option& option); std::size_t count(const std::string&) const;