mirror of
https://github.com/sockspls/badfish
synced 2025-04-29 16:23:09 +00:00

Let to sleep even split point master, it will be waken up by its slaves when they return from the search. This time let it be enabled by an UCI option, so people is free to test it on their Hyper Thread box. Option is disabled by default. No functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
174 lines
6.3 KiB
C++
174 lines
6.3 KiB
C++
/*
|
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
|
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
|
|
|
Stockfish is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
Stockfish is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include <iostream>
|
|
#include <sstream>
|
|
|
|
#include "misc.h"
|
|
#include "thread.h"
|
|
#include "ucioption.h"
|
|
|
|
using std::string;
|
|
using std::cout;
|
|
using std::endl;
|
|
|
|
OptionsMap Options;
|
|
|
|
// stringify() converts a value of type T to a std::string
|
|
template<typename T>
|
|
static string stringify(const T& v) {
|
|
|
|
std::ostringstream ss;
|
|
ss << v;
|
|
return ss.str();
|
|
}
|
|
|
|
|
|
/// init_uci_options() initializes the UCI options to their hard coded default
|
|
/// values and initializes the default value of "Threads" and "Minimum Split Depth"
|
|
/// parameters according to the number of CPU cores.
|
|
|
|
void init_uci_options() {
|
|
|
|
Options["Use Search Log"] = Option(false);
|
|
Options["Search Log Filename"] = Option("SearchLog.txt");
|
|
Options["Book File"] = Option("book.bin");
|
|
Options["Best Book Move"] = Option(false);
|
|
Options["Mobility (Middle Game)"] = Option(100, 0, 200);
|
|
Options["Mobility (Endgame)"] = Option(100, 0, 200);
|
|
Options["Pawn Structure (Middle Game)"] = Option(100, 0, 200);
|
|
Options["Pawn Structure (Endgame)"] = Option(100, 0, 200);
|
|
Options["Passed Pawns (Middle Game)"] = Option(100, 0, 200);
|
|
Options["Passed Pawns (Endgame)"] = Option(100, 0, 200);
|
|
Options["Space"] = Option(100, 0, 200);
|
|
Options["Aggressiveness"] = Option(100, 0, 200);
|
|
Options["Cowardice"] = Option(100, 0, 200);
|
|
Options["Check Extension (PV nodes)"] = Option(2, 0, 2);
|
|
Options["Check Extension (non-PV nodes)"] = Option(1, 0, 2);
|
|
Options["Single Evasion Extension (PV nodes)"] = Option(2, 0, 2);
|
|
Options["Single Evasion Extension (non-PV nodes)"] = Option(2, 0, 2);
|
|
Options["Mate Threat Extension (PV nodes)"] = Option(2, 0, 2);
|
|
Options["Mate Threat Extension (non-PV nodes)"] = Option(2, 0, 2);
|
|
Options["Pawn Push to 7th Extension (PV nodes)"] = Option(1, 0, 2);
|
|
Options["Pawn Push to 7th Extension (non-PV nodes)"] = Option(1, 0, 2);
|
|
Options["Passed Pawn Extension (PV nodes)"] = Option(1, 0, 2);
|
|
Options["Passed Pawn Extension (non-PV nodes)"] = Option(0, 0, 2);
|
|
Options["Pawn Endgame Extension (PV nodes)"] = Option(2, 0, 2);
|
|
Options["Pawn Endgame Extension (non-PV nodes)"] = Option(2, 0, 2);
|
|
Options["Minimum Split Depth"] = Option(4, 4, 7);
|
|
Options["Maximum Number of Threads per Split Point"] = Option(5, 4, 8);
|
|
Options["Threads"] = Option(1, 1, MAX_THREADS);
|
|
Options["Use Sleeping Master"] = Option(false);
|
|
Options["Hash"] = Option(32, 4, 8192);
|
|
Options["Clear Hash"] = Option(false, "button");
|
|
Options["New Game"] = Option(false, "button");
|
|
Options["Ponder"] = Option(true);
|
|
Options["OwnBook"] = Option(true);
|
|
Options["MultiPV"] = Option(1, 1, 500);
|
|
Options["Emergency Move Horizon"] = Option(40, 0, 50);
|
|
Options["Emergency Base Time"] = Option(200, 0, 60000);
|
|
Options["Emergency Move Time"] = Option(70, 0, 5000);
|
|
Options["Minimum Thinking Time"] = Option(20, 0, 5000);
|
|
Options["UCI_Chess960"] = Option(false); // Just a dummy but needed by GUIs
|
|
Options["UCI_AnalyseMode"] = Option(false);
|
|
|
|
// Set some SMP parameters accordingly to the detected CPU count
|
|
Option& thr = Options["Threads"];
|
|
Option& msd = Options["Minimum Split Depth"];
|
|
|
|
thr.defaultValue = thr.currentValue = stringify(cpu_count());
|
|
|
|
if (cpu_count() >= 8)
|
|
msd.defaultValue = msd.currentValue = stringify(7);
|
|
}
|
|
|
|
|
|
/// print_uci_options() prints all the UCI options to the standard output,
|
|
/// in chronological insertion order (the idx field) and in the format
|
|
/// defined by the UCI protocol.
|
|
|
|
void print_uci_options() {
|
|
|
|
for (size_t i = 0; i <= Options.size(); i++)
|
|
for (OptionsMap::const_iterator it = Options.begin(); it != Options.end(); ++it)
|
|
if (it->second.idx == i)
|
|
{
|
|
const Option& o = it->second;
|
|
cout << "\noption name " << it->first << " type " << o.type;
|
|
|
|
if (o.type == "check")
|
|
cout << " default " << (o.defaultValue == "1" ? "true" : "false");
|
|
else if (o.type == "string")
|
|
cout << " default " << o.defaultValue;
|
|
else if (o.type == "spin")
|
|
{
|
|
cout << " default " << o.defaultValue
|
|
<< " min " << o.minValue << " max " << o.maxValue;
|
|
}
|
|
else if (o.type != "button")
|
|
assert(false);
|
|
|
|
break;
|
|
}
|
|
cout << endl;
|
|
}
|
|
|
|
|
|
// Option class c'tors
|
|
|
|
Option::Option(): type("UNDEFINED") {}
|
|
|
|
Option::Option(const char* def, string t) : type(t), idx(Options.size()), minValue(0), maxValue(0)
|
|
{ defaultValue = currentValue = def; }
|
|
|
|
Option::Option(bool def, string t) : type(t), idx(Options.size()), minValue(0), maxValue(0)
|
|
{ defaultValue = currentValue = (def ? "1" : "0"); }
|
|
|
|
Option::Option(int def, int minv, int maxv) : type("spin"), idx(Options.size()), minValue(minv), maxValue(maxv)
|
|
{ defaultValue = currentValue = stringify(def); }
|
|
|
|
|
|
// set_value() updates currentValue of the Option object to the passed value
|
|
|
|
void Option::set_value(const string& value) {
|
|
|
|
assert(type != "UNDEFINED");
|
|
|
|
// UCI protocol uses "true" and "false" instead of "1" and "0", so convert
|
|
// value according to standard C++ convention before to store it.
|
|
string v(value);
|
|
if (v == "true")
|
|
v = "1";
|
|
else if (v == "false")
|
|
v = "0";
|
|
|
|
// Normally it's up to the GUI to check for option's limits,
|
|
// but we could receive the new value directly from the user
|
|
// by teminal window. So let's check the bounds anyway.
|
|
if (type == "check" && v != "0" && v != "1")
|
|
return;
|
|
|
|
if (type == "spin")
|
|
{
|
|
int val = atoi(v.c_str());
|
|
if (val < minValue || val > maxValue)
|
|
return;
|
|
}
|
|
currentValue = v;
|
|
}
|