Subversion Repositories Games.Chess Giants

Rev

Rev 108 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
33 pmbaty 1
#include "chess.h"
2
#include "data.h"
3
/* last modified 02/26/14 */
4
/*
5
 *******************************************************************************
6
 *                                                                             *
7
 *   Bench() runs a simple six-position benchmark to gauge Crafty's            *
8
 *   performance.  The test positons are hard-coded, and the benchmark is      *
9
 *   calculated much like it would with an external "test" file.  The test     *
10
 *   is a mix of opening, middlegame, and endgame positions, with both         *
11
 *   tactical and positional aspects.  (For those interested, the positions    *
12
 *   chosen are Bratko-Kopec 2, 4, 8, 12, 22 and 23.)  This test is a speed    *
13
 *   measure only; the actual solutions to the positions are ignored.          *
14
 *                                                                             *
15
 *******************************************************************************
16
 */
17
void Bench(int increase) {
18
  uint64_t nodes = 0;
19
  int old_do, old_st, old_sd, total_time_used, pos;
20
  FILE *old_books, *old_book;
21
  TREE *const tree = block[0];
22
  char fen[6][80] = {
23
    {"3r1k2/4npp1/1ppr3p/p6P/P2PPPP1/1NR5/5K2/2R5 w - - 0 1"},
24
    {"rnbqkb1r/p3pppp/1p6/2ppP3/3N4/2P5/PPP1QPPP/R1B1KB1R w KQkq - 0 1"},
25
    {"4b3/p3kp2/6p1/3pP2p/2pP1P2/4K1P1/P3N2P/8 w - - 0 1"},
26
    {"r3r1k1/ppqb1ppp/8/4p1NQ/8/2P5/PP3PPP/R3R1K1 b - - 0 1"},
27
    {"2r2rk1/1bqnbpp1/1p1ppn1p/pP6/N1P1P3/P2B1N1P/1B2QPP1/R2R2K1 b - - 0 1"},
28
    {"r1bqk2r/pp2bppp/2p5/3pP3/P2Q1P2/2N1B3/1PP3PP/R4RK1 b kq - 0 1"}
29
  };
30
  int fen_depth[6] = { 21, 19, 25, 19, 19, 18 };
31
 
32
/*
33
 ************************************************************
34
 *                                                          *
35
 *  Initialize.                                             *
36
 *                                                          *
37
 ************************************************************
38
 */
39
  total_time_used = 0;
40
  old_st = search_time_limit;
41
  old_sd = search_depth;
42
  old_do = display_options;
43
  search_time_limit = 90000;
44
  display_options = 1;
45
  old_book = book_file;
46
  book_file = 0;
47
  old_books = books_file;
48
  books_file = 0;
49
  if (increase)
50
    Print(4095, "Running benchmark %d. . .\n", increase);
51
  else
52
    Print(4095, "Running benchmark. . .\n");
53
  printf(".");
54
  fflush(stdout);
55
/*
56
 ************************************************************
57
 *                                                          *
58
 *  Now we loop through the six positions.  We use the      *
59
 *  ReadParse() procedure to break the FEN into tokens and  *
60
 *  then call SetBoard() to set up the positions.  Then a   *
61
 *  call to Iterate() and we are done.                      *
62
 *                                                          *
63
 ************************************************************
64
 */
65
  for (pos = 0; pos < 6; pos++) {
66
    strcpy(buffer, fen[pos]);
67
    nargs = ReadParse(buffer, args, " \t;=");
68
    SetBoard(tree, nargs, args, 0);
69
    search_depth = fen_depth[pos] + increase;
70
    InitializeHashTables();
71
    last_pv.pathd = 0;
72
    thinking = 1;
73
    tree->status[1] = tree->status[0];
74
    (void) Iterate(game_wtm, think, 0);
75
    thinking = 0;
76
    nodes += tree->nodes_searched;
77
    total_time_used += (program_end_time - program_start_time);
78
    printf(".");
79
    fflush(stdout);
80
  }
81
/*
82
 ************************************************************
83
 *                                                          *
84
 *  Benchmark done.  Now dump the results.                  *
85
 *                                                          *
86
 ************************************************************
87
 */
88
  printf("\n");
89
  Print(4095, "Total nodes: %" PRIu64 "\n", nodes);
90
  Print(4095, "Raw nodes per second: %d\n",
91
      (int) ((double) nodes / ((double) total_time_used / (double) 100.0)));
92
  Print(4095, "Total elapsed time: %.2f\n",
93
      ((double) total_time_used / (double) 100.0));
94
  input_stream = stdin;
95
  early_exit = 99;
96
  display_options = old_do;
97
  search_time_limit = old_st;
98
  search_depth = old_sd;
99
  books_file = old_books;
100
  book_file = old_book;
101
  NewGame(0);
102
}