From: Marco Costalba Date: Sun, 1 Apr 2012 08:25:07 +0000 (+0100) Subject: Process 'bench' also from SF prompt X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=adb71b8096436a54bf2326d5c69991b16ba5bafa Process 'bench' also from SF prompt It is possible to start with 'stockfish', then from command prompt type 'bench' and SF will do what you expect. Old behaviour is anyhow preserved. As a bonus we can now start from command line any UCI command understood by Stockfish. The difference is that after execution of a command from arguments SF quits, while at the end of the same command from prompt SF stays in UCI loop. No functional change. Signed-off-by: Marco Costalba --- diff --git a/src/benchmark.cpp b/src/benchmark.cpp index 136c6e80..fbf5a46d 100644 --- a/src/benchmark.cpp +++ b/src/benchmark.cpp @@ -19,6 +19,7 @@ #include #include +#include #include #include "misc.h" @@ -57,30 +58,30 @@ static const char* Defaults[] = { /// format (defaults are the positions defined above) and the type of the /// limit value: depth (default), time in secs or number of nodes. -void benchmark(int argc, char* argv[]) { +void benchmark(istringstream& is) { - vector fens; + string token; Search::LimitsType limits; - int64_t nodes = 0; + vector fens(Defaults, Defaults + 16); // Assign default values to missing arguments - string ttSize = argc > 2 ? argv[2] : "128"; - string threads = argc > 3 ? argv[3] : "1"; - string valStr = argc > 4 ? argv[4] : "12"; - string fenFile = argc > 5 ? argv[5] : "default"; - string valType = argc > 6 ? argv[6] : "depth"; + string ttSize = (is >> token) ? token : "128"; + string threads = (is >> token) ? token : "1"; + string limit = (is >> token) ? token : "12"; + string fenFile = (is >> token) ? token : "default"; + string limitType = (is >> token) ? token : "depth"; Options["Hash"] = ttSize; Options["Threads"] = threads; - if (valType == "time") - limits.movetime = 1000 * atoi(valStr.c_str()); // movetime is in ms + if (limitType == "time") + limits.movetime = 1000 * atoi(limit.c_str()); // movetime is in ms - else if (valType == "nodes") - limits.nodes = atoi(valStr.c_str()); + else if (limitType == "nodes") + limits.nodes = atoi(limit.c_str()); else - limits.depth = atoi(valStr.c_str()); + limits.depth = atoi(limit.c_str()); if (fenFile != "default") { @@ -99,9 +100,8 @@ void benchmark(int argc, char* argv[]) { file.close(); } - else - fens.assign(Defaults, Defaults + 16); + int64_t nodes = 0; Time time = Time::current_time(); for (size_t i = 0; i < fens.size(); i++) @@ -110,7 +110,7 @@ void benchmark(int argc, char* argv[]) { cerr << "\nPosition: " << i + 1 << '/' << fens.size() << endl; - if (valType == "perft") + if (limitType == "perft") { int64_t cnt = Search::perft(pos, limits.depth * ONE_PLY); cerr << "\nPerft " << limits.depth << " leaf nodes: " << cnt << endl; diff --git a/src/main.cpp b/src/main.cpp index 505f2ef3..83f6a10f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -28,15 +28,12 @@ #include "tt.h" #include "ucioption.h" -using namespace std; - -extern void uci_loop(); -extern void benchmark(int argc, char* argv[]); +extern void uci_loop(const std::string&); extern void kpk_bitbase_init(); int main(int argc, char* argv[]) { - cout << engine_info() << endl; + std::cout << engine_info() << std::endl; bitboards_init(); Position::init(); @@ -46,14 +43,10 @@ int main(int argc, char* argv[]) { Eval::init(); TT.set_size(Options["Hash"]); - if (argc == 1) - uci_loop(); + std::string args; - else if (string(argv[1]) == "bench") - benchmark(argc, argv); + for (int i = 1; i < argc; i++) + args += std::string(" ") + argv[i]; - else - cerr << "\nUsage: stockfish bench [hash size = 128] [threads = 1] " - << "[limit = 12] [fen positions file = default] " - << "[limited by depth, time, nodes or perft = depth]" << endl; + uci_loop(args); } diff --git a/src/uci.cpp b/src/uci.cpp index 94caada2..a2998e62 100644 --- a/src/uci.cpp +++ b/src/uci.cpp @@ -30,6 +30,8 @@ using namespace std; +extern void benchmark(istringstream& is); + namespace { // FEN string of the initial position, normal chess @@ -52,14 +54,17 @@ namespace { /// that we exit gracefully if the GUI dies unexpectedly. In addition to the UCI /// commands, the function also supports a few debug commands. -void uci_loop() { +void uci_loop(const string& args) { Position pos(StartFEN, false, 0); // The root position string cmd, token; while (token != "quit") { - if (!getline(cin, cmd)) // Block here waiting for input + if (!args.empty()) + cmd = args; + + else if (!getline(cin, cmd)) // Block here waiting for input cmd = "quit"; istringstream is(cmd); @@ -113,6 +118,9 @@ void uci_loop() { else if (token == "eval") cout << Eval::trace(pos) << endl; + else if (token == "bench") + benchmark(is); + else if (token == "key") cout << "key: " << hex << pos.key() << "\nmaterial key: " << pos.material_key() @@ -124,6 +132,12 @@ void uci_loop() { << "\nuciok" << endl; else cout << "Unknown command: " << cmd << endl; + + if (!args.empty()) // Command line arguments have one-shot behaviour + { + Threads.wait_for_search_finished(); + break; + } } }