00001
00002
00003 #ifndef CATEGORY_ORDEROFMOVE_H
00004 #define CATEGORY_ORDEROFMOVE_H
00005
00006 #include "osl/category/categoryEnv.h"
00007 #include "osl/category/categoryList.h"
00008 #include "osl/category/classify.h"
00009 #include "osl/category/moveEvaluation.h"
00010 #include "osl/container/moveLogProbVector.h"
00011 namespace osl
00012 {
00013 namespace category
00014 {
00015 template <class T> class CategoryUtil;
00016 namespace analyzer
00017 {
00021 class OrderOfMove
00022 {
00023 const CategoryEnv& env;
00024 Move target;
00025 public:
00026 struct Output
00027 {
00028 int order;
00029 int generated;
00030 const char *name;
00031 Output() : order(0), generated(0), name(0)
00032 {
00033 }
00034 virtual ~Output()
00035 {
00036 }
00037 virtual void generatorOfEachMove(const char *n, const MoveLogProb&)
00038 {
00039 name = n;
00040 }
00041 };
00042 private:
00043 Output& out;
00044 public:
00045 OrderOfMove(const CategoryEnv& e, Move t, Output& o)
00046 : env(e), target(t), out(o)
00047 {
00048 }
00049 template <typename Head, typename Tail>
00050 MoveLogProb generate(CategoryList<Head, Tail>);
00051 MoveLogProb generate(NullCategory)
00052 {
00053 return MoveLogProb();
00054 }
00055 template <typename SubCategories>
00056 const char *getCategoryName(Classify<SubCategories>, MoveLogProb move)
00057 {
00058 Position8 sendoffs;
00059 CategoryUtilBase::findSendOff(env, sendoffs);
00060 const int diff =
00061 MoveEvaluation::evalDetailed(env, move.getMove(), sendoffs);
00062 return getNameInClassify(SubCategories(), move, diff);
00063 }
00064 template <typename T>
00065 const char *getCategoryName(T, MoveLogProb)
00066 {
00067 return T::getName();
00068 }
00069 template <typename Head, typename Tail>
00070 const char* getNameInClassify(CategoryList<Head,Tail>, MoveLogProb move,
00071 int pieceValue)
00072 {
00073 const std::pair<bool,int> r =
00074 CategoryUtil<Head>::getProbIf(env, move.getMove(), pieceValue);
00075 if (r.first && (r.second == move.getLogProb()))
00076 return Head::getName();
00077 return getNameInClassify(Tail(), move, pieceValue);
00078 }
00079 const char *getNameInClassify(NullCategory, MoveLogProb, int)
00080 {
00081 return "null?!";
00082 }
00083 };
00084 }
00085 }
00086 }
00087
00088 template <typename Head, typename Tail>
00089 osl::MoveLogProb osl::category::analyzer::OrderOfMove::
00090 generate(CategoryList<Head, Tail>)
00091 {
00092 MoveLogProbVector moves;
00093 CategoryUtil<Head>::generate(env,moves);
00094 out.generated += moves.size();
00095 for (size_t i=0; i<moves.size(); ++i, ++(out.order))
00096 {
00097 out.generatorOfEachMove(getCategoryName(Head(), moves[i]), moves[i]);
00098 if (moves[i].getMove() == target)
00099 return moves[i];
00100 }
00101 return generate(Tail());
00102 }
00103
00104 #endif
00105
00106
00107
00108