#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);
 
}