Skip to content

Commit

Permalink
Add perft 'divide' command
Browse files Browse the repository at this point in the history
To show perft numbers for each move. Just
use 'divide' instead of 'perft', for instance:

position startpos moves e2e4 e7e5
divide 4

Inspired by Ronald de Man.

No functional change.
  • Loading branch information
mcostalba committed May 24, 2014
1 parent 88b5100 commit e49eb67
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 3 deletions.
13 changes: 12 additions & 1 deletion src/benchmark.cpp
Expand Up @@ -23,6 +23,7 @@
#include <vector>

#include "misc.h"
#include "notation.h"
#include "position.h"
#include "search.h"
#include "thread.h"
Expand Down Expand Up @@ -136,7 +137,17 @@ void benchmark(const Position& current, istream& is) {

cerr << "\nPosition: " << i + 1 << '/' << fens.size() << endl;

if (limitType == "perft")
if (limitType == "divide")
for (MoveList<LEGAL> it(pos); *it; ++it)
{
StateInfo si;
pos.do_move(*it, si);
uint64_t cnt = limits.depth > 1 ? Search::perft(pos, (limits.depth - 1) * ONE_PLY) : 1;
pos.undo_move(*it);
cerr << move_to_uci(*it, pos.is_chess960()) << ": " << cnt << endl;
nodes += cnt;
}
else if (limitType == "perft")
{
uint64_t cnt = Search::perft(pos, limits.depth * ONE_PLY);
cerr << "\nPerft " << limits.depth << " leaf nodes: " << cnt << endl;
Expand Down
6 changes: 4 additions & 2 deletions src/uci.cpp
Expand Up @@ -174,12 +174,14 @@ void UCI::loop(int argc, char* argv[]) {
else
Search::Limits.ponder = false;
}
else if (token == "perft" && (is >> token)) // Read perft depth
else if (token == "perft" || token == "divide")
{
int depth;
stringstream ss;

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

benchmark(pos, ss);
}
Expand Down

0 comments on commit e49eb67

Please sign in to comment.