00001
00002
00003 #include "osl/search/quiescenceSearch2.h"
00004 #include "osl/search/simpleHashTable.h"
00005 #include "osl/search/searchState2.h"
00006 #include "osl/effect_util/effectUtil.h"
00007 #include "osl/record/csaString.h"
00008 #include "osl/record/csaRecord.h"
00009 #include "osl/eval/progressEval.h"
00010 #include "osl/misc/perfmon.h"
00011
00012 #include <iostream>
00013 #include <fstream>
00014
00015 using namespace osl;
00016 using namespace osl::search;
00017 using namespace osl::misc;
00018
00019 void qsearch(const char *filename);
00020
00021 void usage(const char *program_name)
00022 {
00023 std::cerr << program_name << " [-d depth] [-s skip] [-v] csafiles\n";
00024 exit(1);
00025 }
00026
00027 int depth = -2;
00028 bool verbose = false;
00029 size_t skip_first = 0;
00030
00031 void qsearch(const char *filename);
00032
00033 int main(int argc, char **argv)
00034 {
00035 const char *program_name = argv[0];
00036 bool error_flag = false;
00037
00038 extern char *optarg;
00039 extern int optind;
00040 char c;
00041 while ((c = getopt(argc, argv, "d:s:vh")) != EOF)
00042 {
00043 switch(c)
00044 {
00045 case 'd': depth = atoi(optarg);
00046 break;
00047 case 's': skip_first = atoi(optarg);
00048 break;
00049 case 'v': verbose = true;
00050 break;
00051 default: error_flag = true;
00052 }
00053 }
00054 argc -= optind;
00055 argv += optind;
00056
00057 if (error_flag || (argc < 1))
00058 usage(program_name);
00059
00060 std::cerr << "using table record depth " << depth << "\n";
00061 eval::ProgressEval::setUp();
00062 try
00063 {
00064 for (int i=0; i<argc; ++i)
00065 {
00066 qsearch(argv[i]);
00067 }
00068 }
00069 catch (std::exception& e)
00070 {
00071 std::cerr << e.what() << "\n";
00072 return 1;
00073 }
00074 catch (...)
00075 {
00076 throw;
00077 }
00078 }
00079
00080 void qsearch(const char *filename)
00081 {
00082 if (verbose)
00083 std::cerr << filename;
00084 unsigned long long total_cycles=0;
00085 unsigned long long positions = 0;
00086 Record rec=CsaFile(filename).getRecord();
00087 HashEffectState state(rec.getInitialState());
00088 const vector<osl::Move> moves=rec.getMoves();
00089
00090 typedef QuiescenceSearch2<eval::ProgressEval> qsearch_t;
00091
00092 SimpleHashTable table(1000000,depth,verbose);
00093 SearchState2Core::checkmate_t checkmate_searcher;
00094 eval::ProgressEval ev(state);
00095 size_t i=0;
00096 Player initial_turn = state.getTurn();
00097 while (true)
00098 {
00099 if (i >= skip_first)
00100 {
00101 SearchState2Core core(state, checkmate_searcher);
00102 qsearch_t qs(core, table);
00103 const Move last_move = (i > 0) ? moves[i-1] : Move::PASS(alt(initial_turn));
00104 if (verbose)
00105 std::cerr << i << " " << last_move << "\n";
00106 PerfMon clock;
00107 const int val = qs.search(state.getTurn(), ev, last_move);
00108 total_cycles += clock.stop();
00109 positions += qs.nodeCount();
00110 }
00111 if (i >= moves.size())
00112 break;
00113 const Move move = moves[i++];
00114 ApplyMoveOfTurn::doMove(state, move);
00115 ev.update(state, move);
00116 }
00117 const size_t checkmate_count = checkmate_searcher.totalNodeCount();
00118 std::cerr << total_cycles << " / ( " << positions
00119 << " + " << checkmate_count << " ) = "
00120 << total_cycles/(double)(positions + checkmate_count) << "\n";
00121 }
00122
00123
00124
00125
00126
00127