rating-perf.cc
Go to the documentation of this file.
00001 #include "osl/rating/featureSet.h"
00002 #include "osl/rating/ratingEnv.h"
00003 #include "osl/eval/progressEval.h"
00004 #include "osl/effect_util/sendOffSquare.h"
00005 #include "osl/effect_util/effectUtil.h"
00006 #include "osl/record/csaRecord.h"
00007 #include "osl/record/csaIOError.h"
00008 #include "osl/stat/average.h"
00009 #include "osl/misc/perfmon.h"
00010 
00011 #include <boost/format.hpp>
00012 #include <string>
00013 #include <iostream>
00014 #include <iomanip>
00015 #include <cmath>
00016 #include <cstdio>
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     state.makeMove(move);
00150     env.update(state, move);
00151   }
00152 }
00153 
00154 /* ------------------------------------------------------------------------- */
00155 // ;;; Local Variables:
00156 // ;;; mode:c++
00157 // ;;; c-basic-offset:2
00158 // ;;; End:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines