#include "chess.h"
#include "data.h"
/* last modified 02/26/14 */
/*
*******************************************************************************
* *
* Bench() runs a simple six-position benchmark to gauge Crafty's *
* performance. The test positons are hard-coded, and the benchmark is *
* calculated much like it would with an external "test" file. The test *
* is a mix of opening, middlegame, and endgame positions, with both *
* tactical and positional aspects. (For those interested, the positions *
* chosen are Bratko-Kopec 2, 4, 8, 12, 22 and 23.) This test is a speed *
* measure only; the actual solutions to the positions are ignored. *
* *
*******************************************************************************
*/
void Bench(int increase) {
uint64_t nodes = 0;
int old_do, old_st, old_sd, total_time_used, pos;
FILE *old_books, *old_book;
TREE *const tree = block[0];
char fen[6][80] = {
{"3r1k2/4npp1/1ppr3p/p6P/P2PPPP1/1NR5/5K2/2R5 w - - 0 1"},
{"rnbqkb1r/p3pppp/1p6/2ppP3/3N4/2P5/PPP1QPPP/R1B1KB1R w KQkq - 0 1"},
{"4b3/p3kp2/6p1/3pP2p/2pP1P2/4K1P1/P3N2P/8 w - - 0 1"},
{"r3r1k1/ppqb1ppp/8/4p1NQ/8/2P5/PP3PPP/R3R1K1 b - - 0 1"},
{"2r2rk1/1bqnbpp1/1p1ppn1p/pP6/N1P1P3/P2B1N1P/1B2QPP1/R2R2K1 b - - 0 1"},
{"r1bqk2r/pp2bppp/2p5/3pP3/P2Q1P2/2N1B3/1PP3PP/R4RK1 b kq - 0 1"}
};
int fen_depth[6] = { 21, 19, 25, 19, 19, 18 };
/*
************************************************************
* *
* Initialize. *
* *
************************************************************
*/
total_time_used = 0;
old_st = search_time_limit;
old_sd = search_depth;
old_do = display_options;
search_time_limit = 90000;
display_options = 1;
old_book = book_file;
book_file = 0;
old_books = books_file;
books_file = 0;
if (increase)
Print(4095, "Running benchmark %d. . .\n", increase);
else
Print(4095, "Running benchmark. . .\n");
/*
************************************************************
* *
* Now we loop through the six positions. We use the *
* ReadParse() procedure to break the FEN into tokens and *
* then call SetBoard() to set up the positions. Then a *
* call to Iterate() and we are done. *
* *
************************************************************
*/
for (pos = 0; pos < 6; pos++) {
nargs = ReadParse(buffer, args, " \t;=");
SetBoard(tree, nargs, args, 0);
search_depth = fen_depth[pos] + increase;
InitializeHashTables();
last_pv.pathd = 0;
thinking = 1;
tree->status[1] = tree->status[0];
(void) Iterate(game_wtm, think, 0);
thinking = 0;
nodes += tree->nodes_searched;
total_time_used += (program_end_time - program_start_time);
}
/*
************************************************************
* *
* Benchmark done. Now dump the results. *
* *
************************************************************
*/
Print(4095, "Total nodes: %" PRIu64 "\n", nodes);
Print(4095, "Raw nodes per second: %d\n",
(int) ((double) nodes / ((double) total_time_used / (double) 100.0)));
Print(4095, "Total elapsed time: %.2f\n",
((double) total_time_used / (double) 100.0));
input_stream = stdin;
early_exit = 99;
display_options = old_do;
search_time_limit = old_st;
search_depth = old_sd;
books_file = old_books;
book_file = old_book;
NewGame(0);
}