9 #include <boost/accumulators/accumulators.hpp> 10 #include <boost/accumulators/statistics/stats.hpp> 11 #include <boost/accumulators/statistics/mean.hpp> 12 #include <boost/accumulators/statistics/min.hpp> 13 #include <boost/accumulators/statistics/max.hpp> 14 #include <boost/format.hpp> 35 features.push_back(f);
37 light_features.push_back(features.size()-1);
43 offsets.resize(features.size()+1);
45 for (
size_t i=0; i<features.size(); ++i)
46 offsets[i+1] = offsets[i] + features[i].dimension();
55 for (
size_t i=0; i<
features.size(); ++i) {
85 std::vector<std::pair<double, std::string> > out;
86 for (
size_t i=0; i<
features.size(); ++i) {
89 out.push_back(make_pair(s,
features[i].name()));
91 std::sort(out.begin(), out.end());
92 std::reverse(out.begin(), out.end());
93 for (
size_t i=0; i<out.size(); ++i) {
94 std::cerr << boost::format(
"%16s %6.2f ") % out[i].second % out[i].first;
98 if (out.size() % 3 != 0)
104 const double * weights)
const 106 assert(! state.
dirty);
111 for (
Move move: moves) {
112 double score =
matchExp(state, move, weights);
123 static const double scale = 100.0 / log(0.5);
125 double p = move.first/sum;
126 if (std::isnan(p) || p <= 1.0/(1<<12))
128 const int logp =
std::max(50, static_cast<int>(log(p)*scale));
136 const double * weights)
const 144 load(
const char *base_filename,
double * weights)
const 146 std::string filename = std::string(base_filename) +
".txt";
147 std::fill(weights, weights+
dimension(), 0.0);
148 std::ifstream is(filename.c_str());
152 std::cerr <<
"load failed at " << i <<
" in " <<
dimension()
153 <<
" file " << filename <<
"\n";
157 return static_cast<bool>(is);
163 std::string filename = std::string(base_filename) +
".bin";
164 std::fill(weights, weights+
dimension(), 0.0);
165 std::ifstream is(filename.c_str(), std::ios_base::binary);
168 if (! reader.hasNext()) {
169 std::cerr <<
"load failed at " << i <<
" in " <<
dimension()
170 <<
" file " << filename <<
"\n";
173 double value = reader.read();
182 for (
size_t i=0; i<
features.size(); ++i) {
184 #if (__GNUC_MINOR__ < 5) 185 using namespace boost::accumulators;
186 accumulator_set<double, stats<tag::mean, tag::min, tag::max> > acc;
191 #if (__GNUC_MINOR__ < 5) 197 std::cerr << std::setw(16) << f.
name()
198 <<
" dim " << std::setw(5) << f.
dimension() - zero
200 #if (__GNUC_MINOR__ < 5) 201 <<
" min " << std::setw(6) <<
min(acc)
202 <<
" max " << std::setw(6) <<
max(acc)
203 <<
" mean " << std::setw(6) << mean(acc)
281 the_instance.
setUp(verbose);
293 namespace move_probability
308 filename +=
"/data/move-order";
310 std::cerr <<
"loading " << filename <<
".bin ";
313 std::cerr << (success ?
"success" :
"failed\a") <<
"\n";
316 filename +=
"/data/move-tactical.txt";
317 const int tactical_dimension = 8*4;
320 std::cerr <<
"loading " << filename <<
" ";
321 std::ifstream is(filename.c_str());
322 for (
int i=0; i<tactical_dimension; ++i)
325 std::cerr << (is ?
"success" :
"failed\a") <<
"\n";
326 this->initialized = success && is;
341 double elapsed = 0.0, welapsed = 0.0, last_p = 1.0;
342 std::sort(moves.
begin(), moves.
end());
343 for (
int i=moves.
size()-1; i>=0; --i) {
345 static const double scale = 100.0 / log(0.5);
346 if (i+1<(
int)moves.
size())
348 double p = move.first/(sum-elapsed+welapsed);
349 if (std::isnan(p) || p <= 1.0/(1<<12))
353 int logp =
std::max(50, static_cast<int>(log(p)*scale));
354 if (moves.
size() - i <= 8)
356 else if (moves.
size() - i <= 16)
359 elapsed += move.first;
360 welapsed = (welapsed+move.first)*(moves.
size()-i)/moves.
size();
407 static const double scale = 100.0 / log(0.5);
409 double p = 1/(1.0+exp(-x));
410 return std::max(50, static_cast<int>(log(p)*scale));
void push_back(const T &e)
int tacticalLogProb(int offset, double sum) const
int max(Player p, int v1, int v2)
double matchExp(const StateInfo &, Move) const
double matchLight(const StateInfo &, Move, const double *weights) const
void sortByProbability()
腆榊蕭sort
int min(Player p, int v1, int v2)
void generateLegal(MoveVector &) const
羈.
int logProbTakeBack(const StateInfo &state, Move target) const
static boost::scoped_array< double > tactical_weights
std::pair< double, Move > WeightedMove
std::vector< int > offsets
double matchNoExp(const StateInfo &, Move, const double *weights) const
void push_back(Move move, int prob)
static void ratingToLogProb(const WeightedMoveVector &rating, double sum, MoveLogProbVector &out)
bool setUp(bool verbose=false)
void generateLogProb(const StateInfo &state, MoveLogProbVector &out, const double *weights) const
int logProbSeePlus(const StateInfo &state, Move target) const
void generateLogProb2(const StateInfo &state, MoveLogProbVector &out) const
void generateLogProb(const StateInfo &state, MoveLogProbVector &out) const
static boost::scoped_array< double > weights
static const StandardFeatureSet & instance(bool verbose=false)
static bool healthCheck()
static const std::string & home(const std::string &initialize_if_first_invocation="")
compile絎c菴.
double matchNoExp(const StateInfo &, Move) const
const NumEffectState * state
std::mutex standardfeatureset_lock
void pushBack(Feature *, bool light=false)
const std::string show(Move)
bool load_binary(const char *base_filename, double *weights) const
void showSummary(const double *weights) const
double matchExp(const StateInfo &, Move, const double *weights) const
double generateRating(const StateInfo &state, WeightedMoveVector &out, const double *weights) const
bool load(const char *base_filename, double *weights) const
double matchLight(const StateInfo &, Move) const
PatternBase< false > Pattern
void analyze(const StateInfo &state, Move move, const double *weights) const
std::vector< int > light_features
boost::ptr_vector< Feature > features