00001
00002
00003 #ifndef _BIGRAMPOSITION_H
00004 #define _BIGRAMPOSITION_H
00005
00006 #include "osl/pieceStand.h"
00007 #include "osl/category/categoryEnv.h"
00008 #include "osl/category/categoryTraits.h"
00009 #include "osl/container/moveStack.h"
00010 #include "osl/container/moveLogProbVector.h"
00011 #include "osl/misc/carray.h"
00012 #include "osl/stl/vector.h"
00013 #include "osl/misc/carray.h"
00014
00015 #include <boost/scoped_ptr.hpp>
00016 #include <map>
00017
00018 namespace osl
00019 {
00020 namespace category
00021 {
00022 struct BigramHelper
00023 {
00024 BigramHelper();
00025 int moveToIndex(osl::Move move, osl::Player player) const;
00026 int moveToValue(osl::Move move) const;
00027 int toIndex(osl::Position pos, osl::Move move, osl::Player player) const;
00028 osl::Move indexToMove(int value,
00029 const CategoryEnv::effect_state_t& state) const;
00030 private:
00031 CArray<int, PTYPE_SIZE> pieceMap;
00032 int moveToIndex(osl::Move move, bool from) const;
00033 };
00034
00035 #ifdef MORE_BIGRAM
00036 struct BigramTable
00037 {
00038 typedef std::map<int,osl::stl::vector<std::pair<int, int> > > map_t;
00039 BigramTable();
00040 BigramTable(const char *oslHome, const char *name);
00041 void init(const char *filename);
00042 void generate(const CategoryEnv& env, MoveLogProbVector& out,
00043 int back) const;
00044
00045 private:
00046 boost::scoped_ptr<map_t> table;
00047 int min;
00048 };
00049
00050 struct BigramPosition : public SpecialProbabilityCategory
00051 {
00052 static BigramTable probTable;
00053 static const char *getName() { return "BigramPosition"; }
00054 static int minProb() { return 10; }
00055 static void generate(const CategoryEnv& env, MoveLogProbVector& out) {
00056 probTable.generate(env, out, 1);
00057 }
00058 };
00059
00060 struct SamePlayerBigramPosition : public SpecialProbabilityCategory
00061 {
00062 static BigramTable probTable;
00063 static const char *getName() { return "SamePlayerBigramPosition"; }
00064 static int minProb() { return 10; }
00065 static void generate(const CategoryEnv& env, MoveLogProbVector& out) {
00066 probTable.generate(env, out, 2);
00067 }
00068 };
00069
00070 struct CombinedBigramPosition : public SpecialProbabilityCategory
00071 {
00072 static const char *getName() { return "CombinedBigramPosition"; }
00073 static int minProb() { return 10; }
00074 static void generate(const CategoryEnv& env, MoveLogProbVector& out) {
00075 MoveLogProbVector b, sb;
00076 BigramPosition::generate(env, b);
00077 SamePlayerBigramPosition::generate(env, sb);
00078 size_t i, j;
00079 i = j = 0;
00080 while (true)
00081 {
00082 if (i == b.size() && j == sb.size())
00083 break;
00084 else if (i == b.size())
00085 out.push_back(sb[j++]);
00086 else if (j == sb.size())
00087 out.push_back(b[i++]);
00088 else
00089 {
00090 if (b[i] < sb[j])
00091 out.push_back(b[i++]);
00092 else
00093 out.push_back(sb[j++]);
00094 }
00095 }
00096 }
00097 };
00098
00099 struct BigramHistoryTable
00100 {
00101 typedef std::map<int,int> map_t;
00102 BigramHistoryTable(int dummy);
00103 void setupTable(const SimpleState& state,
00104 const CategoryEnv::effect_state_t& eState,
00105 const container::MoveStack& history);
00106 void generate(const CategoryEnv& env, MoveLogProbVector& out) const;
00107 private:
00108 boost::scoped_ptr<map_t> table;
00109 static const int DECAY_VALUE = 150;
00110 static const int RETAIN_REALIZATION_PROBABILITY = 500;
00111 };
00112
00113 struct BigramHistory : public SpecialProbabilityCategory
00114 {
00115 static BigramHistoryTable probTable;
00116 static const char *getName() { return "BigramHistory"; }
00117 static int minProb() { return 150; }
00118
00119 static void setupTable(const SimpleState& state,
00120 const CategoryEnv::effect_state_t& eState,
00121 const container::MoveStack& history)
00122 {
00123 probTable.setupTable(state, eState, history);
00124 }
00125 static void generate(const CategoryEnv& env, MoveLogProbVector& out)
00126 {
00127 probTable.generate(env, out);
00128 }
00129 };
00130 #endif
00131 struct KingNeighborBigramTable
00132 {
00133 typedef std::map<int,osl::stl::vector<std::pair<int, int> > > map_t;
00134 KingNeighborBigramTable();
00135 KingNeighborBigramTable(const char *oslHome, const char *name);
00136 void init(const char *filename);
00137 void generate(const CategoryEnv& env, MoveLogProbVector& out,
00138 int back) const;
00139 int probability(const CategoryEnv& env, Move, int back) const;
00140 private:
00141 bool isIn5x5(const osl::Position kingPosition,
00142 const osl::Position targetPosition) const;
00143 bool isAttackByMajorPiece(const osl::category::CategoryEnv::effect_state_t&,
00144 const osl::Position pos,
00145 const osl::Ptype ptype,
00146 const osl::Player turn) const;
00147 boost::scoped_ptr<map_t> table;
00148 int min;
00149 };
00150
00151 struct BigramAttack : public SpecialProbabilityCategory
00152 {
00153 static KingNeighborBigramTable probTable;
00154 static const char *getName() { return "BigramAttack"; }
00155 static int minProb() { return 30; }
00156
00157 static void generate(const CategoryEnv& env, MoveLogProbVector& out)
00158 {
00159 probTable.generate(env, out, 2);
00160 }
00161 static int probability(const CategoryEnv& env, Move move)
00162 {
00163 return probTable.probability(env, move, 2);
00164 };
00165 };
00166
00167 struct BigramDefense : public SpecialProbabilityCategory
00168 {
00169 static KingNeighborBigramTable probTable;
00170 static const char *getName() { return "BigramDefense"; }
00171 static int minProb() { return 30; }
00172
00173 static void generate(const CategoryEnv& env, MoveLogProbVector& out)
00174 {
00175 probTable.generate(env, out, 1);
00176 }
00177 };
00178 }
00179 }
00180
00181 #endif
00182
00183
00184
00185