1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 16:53:09 +00:00

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 <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2012-04-01 09:25:07 +01:00
parent 32c504076f
commit adb71b8096
3 changed files with 38 additions and 31 deletions

View file

@ -19,6 +19,7 @@
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
#include <sstream>
#include <vector> #include <vector>
#include "misc.h" #include "misc.h"
@ -57,30 +58,30 @@ static const char* Defaults[] = {
/// format (defaults are the positions defined above) and the type of the /// format (defaults are the positions defined above) and the type of the
/// limit value: depth (default), time in secs or number of nodes. /// limit value: depth (default), time in secs or number of nodes.
void benchmark(int argc, char* argv[]) { void benchmark(istringstream& is) {
vector<string> fens; string token;
Search::LimitsType limits; Search::LimitsType limits;
int64_t nodes = 0; vector<string> fens(Defaults, Defaults + 16);
// Assign default values to missing arguments // Assign default values to missing arguments
string ttSize = argc > 2 ? argv[2] : "128"; string ttSize = (is >> token) ? token : "128";
string threads = argc > 3 ? argv[3] : "1"; string threads = (is >> token) ? token : "1";
string valStr = argc > 4 ? argv[4] : "12"; string limit = (is >> token) ? token : "12";
string fenFile = argc > 5 ? argv[5] : "default"; string fenFile = (is >> token) ? token : "default";
string valType = argc > 6 ? argv[6] : "depth"; string limitType = (is >> token) ? token : "depth";
Options["Hash"] = ttSize; Options["Hash"] = ttSize;
Options["Threads"] = threads; Options["Threads"] = threads;
if (valType == "time") if (limitType == "time")
limits.movetime = 1000 * atoi(valStr.c_str()); // movetime is in ms limits.movetime = 1000 * atoi(limit.c_str()); // movetime is in ms
else if (valType == "nodes") else if (limitType == "nodes")
limits.nodes = atoi(valStr.c_str()); limits.nodes = atoi(limit.c_str());
else else
limits.depth = atoi(valStr.c_str()); limits.depth = atoi(limit.c_str());
if (fenFile != "default") if (fenFile != "default")
{ {
@ -99,9 +100,8 @@ void benchmark(int argc, char* argv[]) {
file.close(); file.close();
} }
else
fens.assign(Defaults, Defaults + 16);
int64_t nodes = 0;
Time time = Time::current_time(); Time time = Time::current_time();
for (size_t i = 0; i < fens.size(); i++) 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; cerr << "\nPosition: " << i + 1 << '/' << fens.size() << endl;
if (valType == "perft") if (limitType == "perft")
{ {
int64_t cnt = Search::perft(pos, limits.depth * ONE_PLY); int64_t cnt = Search::perft(pos, limits.depth * ONE_PLY);
cerr << "\nPerft " << limits.depth << " leaf nodes: " << cnt << endl; cerr << "\nPerft " << limits.depth << " leaf nodes: " << cnt << endl;

View file

@ -28,15 +28,12 @@
#include "tt.h" #include "tt.h"
#include "ucioption.h" #include "ucioption.h"
using namespace std; extern void uci_loop(const std::string&);
extern void uci_loop();
extern void benchmark(int argc, char* argv[]);
extern void kpk_bitbase_init(); extern void kpk_bitbase_init();
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
cout << engine_info() << endl; std::cout << engine_info() << std::endl;
bitboards_init(); bitboards_init();
Position::init(); Position::init();
@ -46,14 +43,10 @@ int main(int argc, char* argv[]) {
Eval::init(); Eval::init();
TT.set_size(Options["Hash"]); TT.set_size(Options["Hash"]);
if (argc == 1) std::string args;
uci_loop();
else if (string(argv[1]) == "bench") for (int i = 1; i < argc; i++)
benchmark(argc, argv); args += std::string(" ") + argv[i];
else uci_loop(args);
cerr << "\nUsage: stockfish bench [hash size = 128] [threads = 1] "
<< "[limit = 12] [fen positions file = default] "
<< "[limited by depth, time, nodes or perft = depth]" << endl;
} }

View file

@ -30,6 +30,8 @@
using namespace std; using namespace std;
extern void benchmark(istringstream& is);
namespace { namespace {
// FEN string of the initial position, normal chess // 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 /// that we exit gracefully if the GUI dies unexpectedly. In addition to the UCI
/// commands, the function also supports a few debug commands. /// 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 Position pos(StartFEN, false, 0); // The root position
string cmd, token; string cmd, token;
while (token != "quit") 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"; cmd = "quit";
istringstream is(cmd); istringstream is(cmd);
@ -113,6 +118,9 @@ void uci_loop() {
else if (token == "eval") else if (token == "eval")
cout << Eval::trace(pos) << endl; cout << Eval::trace(pos) << endl;
else if (token == "bench")
benchmark(is);
else if (token == "key") else if (token == "key")
cout << "key: " << hex << pos.key() cout << "key: " << hex << pos.key()
<< "\nmaterial key: " << pos.material_key() << "\nmaterial key: " << pos.material_key()
@ -124,6 +132,12 @@ void uci_loop() {
<< "\nuciok" << endl; << "\nuciok" << endl;
else else
cout << "Unknown command: " << cmd << endl; cout << "Unknown command: " << cmd << endl;
if (!args.empty()) // Command line arguments have one-shot behaviour
{
Threads.wait_for_search_finished();
break;
}
} }
} }