00001 #include "osl/rating/featureSet.h"
00002 #include "osl/rating/ratingEnv.h"
00003 #include "osl/eval/progressEval.h"
00004 #include "osl/effect_util/sendOffPosition.h"
00005 #include "osl/effect_util/effectUtil.h"
00006 #include "osl/record/csaRecord.h"
00007 #include "osl/record/csaIOError.h"
00008 #include "osl/apply_move/applyMove.h"
00009 #include "osl/stat/average.h"
00010 #include "osl/misc/perfmon.h"
00011
00012 #include <boost/format.hpp>
00013 #include <string>
00014 #include <iostream>
00015 #include <iomanip>
00016 #include <cmath>
00017 using namespace osl;
00018 using namespace osl::rating;
00019
00025 void usage(const char *prog)
00026 {
00027 using namespace std;
00028 cerr << "Usage: " << prog << " [-v] [-f skip] csafiles\n"
00029 << endl;
00030 exit(1);
00031 }
00032
00033 size_t first_skip = 0;
00034 bool verbose = false;
00035
00036 stat::Average moves, cycles, cycles_per_move, probs, order, top_score, selected_score;
00037 int min_selected = 1000;
00038
00039 void test_file(const FeatureSet&, const char *filename);
00040
00041 int main(int argc, char **argv)
00042 {
00043 const char *program_name = argv[0];
00044 bool error_flag = false;
00045 extern char *optarg;
00046 extern int optind;
00047
00048 char c;
00049 while ((c = getopt(argc, argv, "f:vh")) != EOF)
00050 {
00051 switch(c)
00052 {
00053 case 'f': first_skip = atoi(optarg);
00054 break;
00055 case 'v': verbose = true;
00056 break;
00057 default: error_flag = true;
00058 }
00059 }
00060 argc -= optind;
00061 argv += optind;
00062
00063 if (error_flag || (argc < 1))
00064 usage(program_name);
00065
00066 eval::ProgressEval::setUp();
00067 StandardFeatureSet f;
00068
00069 for (int i=0; i<argc; ++i)
00070 {
00071 if (i % 128 == 0)
00072 std::cerr << '.';
00073 test_file(f, argv[i]);
00074 }
00075
00076 std::cout << "\n"
00077 << "average moves/position " << moves.getAverage() << "\n"
00078 << "average order " << order.getAverage() << "\n"
00079 << "average selected score " << selected_score.getAverage() << "\n"
00080 << "min selected score " << min_selected << "\n"
00081 << "average top score " << top_score.getAverage() << "\n";
00082 std::cout << "average cycles/position " << cycles.getAverage() << "\n"
00083 << "average cycles/position/move " << cycles_per_move.getAverage()
00084 << "\n";
00085 }
00086
00087
00088
00089 size_t num_positions = 0;
00090 void test_position(const FeatureSet& f, Move next_move, Move last_move, const RatingEnv& env,
00091 const NumEffectState& state)
00092 {
00093 RatedMoveVector my_moves;
00094
00095 misc::PerfMon clock;
00096 f.generateRating(state, env, 1400, my_moves);
00097
00098 const size_t consumed = clock.stop();
00099 if (my_moves.size())
00100 top_score.add(my_moves[0].rating());
00101 const RatedMove *p = my_moves.find(next_move);
00102 int count = my_moves.size();
00103 int order = p ? p - &*my_moves.begin() +1 : count;
00104 if (p) {
00105 ::order.add(order);
00106 if (p->rating() < min_selected)
00107 min_selected = p->rating();
00108 if (p->rating() < -2000) {
00109 std::cerr << state << "selected " << *p << "\n" << my_moves;
00110 }
00111 }
00112 else {
00113 ::order.add(count);
00114 }
00115 moves.add(count);
00116 cycles.add(consumed);
00117 cycles_per_move.add(consumed/count);
00118 ++num_positions;
00119
00120 }
00121
00122 void test_file(const FeatureSet& f, const char *filename)
00123 {
00124 Record rec;
00125 try {
00126 rec = CsaFile(filename).getRecord();
00127 }
00128 catch (CsaIOError& e) {
00129 std::cerr << "skip " << filename <<"\n";
00130 std::cerr << e.what() << "\n";
00131 return;
00132 }
00133 catch (...) {
00134 throw;
00135 }
00136
00137 NumEffectState state(rec.getInitialState());
00138 const osl::stl::vector<osl::Move> moves=rec.getMoves();
00139
00140 RatingEnv env;
00141 env.make(state);
00142 for (size_t i=0; i<moves.size(); ++i) {
00143 const Move move = moves[i];
00144 assert(state.isValidMove(move));
00145 if (i >= first_skip) {
00146 test_position(f, moves[i], (i>0 ? moves[i-1] : Move::PASS(alt(moves[i].player()))),
00147 env, state);
00148 }
00149 ApplyMoveOfTurn::doMove(state, move);
00150 env.update(state, move);
00151 }
00152 }
00153
00154
00155
00156
00157
00158