20 using namespace osl::misc;
22 void qsearch(
const char *filename);
24 void usage(
const char *program_name)
26 std::cerr << program_name <<
" [-C] [-P] [-d depth] [-s skip] [-v] csafiles\n";
27 std::cerr <<
"-C comparison w,w/o table\n";
38 void qsearch(
const char *filename);
40 int main(
int argc,
char **argv)
42 const char *program_name = argv[0];
43 bool error_flag =
false;
48 while ((c = getopt(argc, argv,
"C:Pd:s:vh")) != EOF)
54 case 'd':
depth = atoi(optarg);
62 default: error_flag =
true;
68 if (error_flag || (argc < 1))
71 std::cerr <<
"using table record depth " <<
depth <<
"\n";
74 for (
int i=0; i<argc; ++i)
77 qsearch<eval::ProgressEval>(argv[i]);
79 qsearch<PieceEval>(argv[i]);
82 catch (std::exception& e)
84 std::cerr << e.what() <<
"\n";
94 void qsearch(
const char *filename)
98 Record rec=CsaFile(filename).getRecord();
99 NumEffectState state(rec.getInitialState());
100 const vector<osl::Move>
moves=rec.getMoves();
114 qsearch_t qs(core, table);
115 qsearch_t qsnull(core, nulltable);
116 const Move last_move = (i > 0) ? moves[i-1] :
Move::PASS(
alt(moves[0].player()));
118 std::cerr << i <<
" " << last_move <<
"\n";
121 const char *logfile =
"/tmp/q-w-table.log";
123 QuiescenceLog::init(logfile);
126 const int val = qs.search(state.turn(), ev, last_move);
127 total_cycles += clock.
stop();
132 const char *logfile =
"/tmp/q-wo-table.log";
134 QuiescenceLog::init(logfile);
136 const int valnull = qsnull.search(state.turn(), ev, last_move);
137 if (
verbose || (valnull != val))
139 std::cerr << state <<
"\n";
140 std::cerr << ev.value() <<
" " ;
141 if (! state.inCheck())
142 std::cerr << ((state.turn() ==
BLACK)
143 ? qs.template staticValueWithThreat<BLACK>(ev)
144 : qs.template staticValueWithThreat<WHITE>(ev)) <<
" ";
145 std::cerr << val <<
" " << valnull <<
"\n";
149 positions += qs.nodeCount();
151 if (i >= moves.size())
153 const Move move = moves[i++];
154 state.makeMove(move);
155 ev.update(state, move);
157 const size_t checkmate_count = checkmate_searcher.
totalNodeCount();
158 std::cerr << total_cycles <<
" / ( " << positions
159 <<
" + " << checkmate_count <<
" ) = "
160 << total_cycles/(double)(positions + checkmate_count) <<
"\n";