Skip to content

Commit

Permalink
Use bench to implement UI 'perft' command
Browse files Browse the repository at this point in the history
Now that we can call bench on current position
we can directly use it to perform our perft.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
  • Loading branch information
mcostalba committed Apr 7, 2012
1 parent cc04a74 commit 9546b79
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 42 deletions.
20 changes: 10 additions & 10 deletions src/benchmark.cpp
Expand Up @@ -19,7 +19,7 @@

#include <fstream>
#include <iostream>
#include <sstream>
#include <istream>
#include <vector>

#include "misc.h"
Expand Down Expand Up @@ -58,11 +58,11 @@ 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(istringstream& is) {
void benchmark(const Position& current, istream& is) {

string token;
Search::LimitsType limits;
vector<string> fens(Defaults, Defaults + 16);
vector<string> fens;

// Assign default values to missing arguments
string ttSize = (is >> token) ? token : "128";
Expand All @@ -83,14 +83,14 @@ void benchmark(istringstream& is) {
else
limits.depth = atoi(limit.c_str());

if (fenFile == "current")
{
fens.clear();
fens.push_back(Search::RootPosition.to_fen());
}
else if (fenFile != "default")
if (fenFile == "default")
fens.assign(Defaults, Defaults + 16);

else if (fenFile == "current")
fens.push_back(current.to_fen());

else
{
fens.clear();
string fen;
ifstream file(fenFile.c_str());

Expand Down
45 changes: 13 additions & 32 deletions src/uci.cpp
Expand Up @@ -22,15 +22,14 @@
#include <string>

#include "evaluate.h"
#include "misc.h"
#include "position.h"
#include "search.h"
#include "thread.h"
#include "ucioption.h"

using namespace std;

extern void benchmark(istringstream& is);
extern void benchmark(const Position& pos, istream& is);

namespace {

Expand All @@ -45,7 +44,6 @@ namespace {
void set_option(istringstream& up);
void set_position(Position& pos, istringstream& up);
void go(Position& pos, istringstream& up);
void perft(Position& pos, istringstream& up);
}


Expand All @@ -59,8 +57,6 @@ void uci_loop(const string& args) {
Position pos(StartFEN, false, Threads.main_thread()); // The root position
string cmd, token;

Search::RootPosition = pos;

while (token != "quit")
{
if (!args.empty())
Expand Down Expand Up @@ -108,9 +104,6 @@ void uci_loop(const string& args) {
else if (token == "setoption")
set_option(is);

else if (token == "perft")
perft(pos, is);

else if (token == "d")
pos.print();

Expand All @@ -121,7 +114,7 @@ void uci_loop(const string& args) {
cout << Eval::trace(pos) << endl;

else if (token == "bench")
benchmark(is);
benchmark(pos, is);

else if (token == "key")
cout << "key: " << hex << pos.key()
Expand All @@ -132,6 +125,17 @@ void uci_loop(const string& args) {
cout << "id name " << engine_info(true)
<< "\n" << Options
<< "\nuciok" << endl;

else if (token == "perft" && (is >> token)) // Read depth
{
stringstream ss;

ss << Options["Hash"] << " "
<< Options["Threads"] << " " << token << " current perft";

benchmark(pos, ss);
}

else
cout << "Unknown command: " << cmd << endl;

Expand Down Expand Up @@ -246,27 +250,4 @@ namespace {

Threads.start_searching(pos, limits, searchMoves);
}


// perft() is called when engine receives the "perft" command. The function
// calls perft() with the required search depth then prints counted leaf nodes
// and elapsed time.

void perft(Position& pos, istringstream& is) {

int depth;

if (!(is >> depth))
return;

Time time = Time::current_time();

int64_t n = Search::perft(pos, depth * ONE_PLY);

int e = time.elapsed();

cout << "\nNodes " << n
<< "\nTime (ms) " << e
<< "\nNodes/second " << int(n / (e / 1000.0)) << endl;
}
}

0 comments on commit 9546b79

Please sign in to comment.