| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #include <algorithm> |
| #include <iostream> |
| #include <sstream> |
|
|
| #include "types.h" |
| #include "misc.h" |
| #include "uci.h" |
|
|
| using std::string; |
|
|
| namespace Stockfish { |
|
|
| bool Tune::update_on_last; |
| const UCI::Option* LastOption = nullptr; |
| static std::map<std::string, int> TuneResults; |
|
|
| string Tune::next(string& names, bool pop) { |
|
|
| string name; |
|
|
| do { |
| string token = names.substr(0, names.find(',')); |
|
|
| if (pop) |
| names.erase(0, token.size() + 1); |
|
|
| std::stringstream ws(token); |
| name += (ws >> token, token); |
|
|
| } while ( std::count(name.begin(), name.end(), '(') |
| - std::count(name.begin(), name.end(), ')')); |
|
|
| return name; |
| } |
|
|
| static void on_tune(const UCI::Option& o) { |
|
|
| if (!Tune::update_on_last || LastOption == &o) |
| Tune::read_options(); |
| } |
|
|
| static void make_option(const string& n, int v, const SetRange& r) { |
|
|
| |
| if (r(v).first == r(v).second) |
| return; |
|
|
| if (TuneResults.count(n)) |
| v = TuneResults[n]; |
|
|
| Options[n] << UCI::Option(v, r(v).first, r(v).second, on_tune); |
| LastOption = &Options[n]; |
|
|
| |
| std::cout << n << "," |
| << v << "," |
| << r(v).first << "," << r(v).second << "," |
| << (r(v).second - r(v).first) / 20.0 << "," |
| << "0.0020" |
| << std::endl; |
| } |
|
|
| template<> void Tune::Entry<int>::init_option() { make_option(name, value, range); } |
|
|
| template<> void Tune::Entry<int>::read_option() { |
| if (Options.count(name)) |
| value = int(Options[name]); |
| } |
|
|
| template<> void Tune::Entry<Value>::init_option() { make_option(name, value, range); } |
|
|
| template<> void Tune::Entry<Value>::read_option() { |
| if (Options.count(name)) |
| value = Value(int(Options[name])); |
| } |
|
|
| template<> void Tune::Entry<Score>::init_option() { |
| make_option("m" + name, mg_value(value), range); |
| make_option("e" + name, eg_value(value), range); |
| } |
|
|
| template<> void Tune::Entry<Score>::read_option() { |
| if (Options.count("m" + name)) |
| value = make_score(int(Options["m" + name]), eg_value(value)); |
|
|
| if (Options.count("e" + name)) |
| value = make_score(mg_value(value), int(Options["e" + name])); |
| } |
|
|
| |
| template<> void Tune::Entry<Tune::PostUpdate>::init_option() {} |
| template<> void Tune::Entry<Tune::PostUpdate>::read_option() { value(); } |
|
|
| } |
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #include <cmath> |
|
|
| namespace Stockfish { |
|
|
| void Tune::read_results() { |
|
|
| |
| } |
|
|
| } |
|
|