15 : features(f), kisen_filename(kisen_file), kisen_start(kisen_start), num_cpus(1), num_records(200),
16 verbose(1), fix_group(-1), min_rating(0)
27 valarray_t& wins, std::valarray<long double>& denominator)
const 35 const bool in_check = EffectUtil::isKingInCheck(state.
turn(), state);
41 ++wins[found+range.first];
43 valarray_t sum_c(0.0, range.second-range.first);
44 long double sum_e = 0.0;
45 for (
size_t i=0; i<moves.
size(); ++i) {
62 assert(range.first <= found && found < range.second);
69 sum_c[match_id-range.first] += product /
features.
weight(match_id);
72 for (
int f=range.first; f<range.second; ++f)
73 denominator[f] += sum_c[f-range.first]/sum_e;
89 : features(a), target(t), first(f), last(l), wins(w), denominator(d), skip(s)
94 *skip = features->
accumulate(target, first, last, *wins, *denominator);
105 for (
size_t i=first; i<last; i++) {
117 for (
size_t j=0; j<moves.size(); j++) {
121 const Player turn = state.turn();
122 if (! state.inCheck()
126 if (!
addSquare(g, state, env, moves[j], wins, denominator))
129 state.makeMove(moves[j]);
130 env.update(state, moves[j]);
152 boost::ptr_vector<std::thread> threads;
153 std::valarray<size_t> skip((
size_t)0,
num_cpus);
154 for (
size_t i=0; i<
num_cpus; ++i, cur += step) {
155 size_t next = (i+1 ==
num_cpus) ? last : cur + step;
156 threads.push_back(
new std::thread(
Thread(
this, g, cur, next, &wins[i], &denominator[i], &skip[i])));
161 std::cerr <<
"skip " << skip.sum() <<
" / " <<
num_records <<
"\n";
164 for (
int f=range.first; f<range.second; ++f) {
165 const int NPRIOR = 10;
166 double sum_win = NPRIOR;
167 long double sum_denom = (1.0 / (
features.
weight(f) + 1.0)) * 2 * NPRIOR;
169 sum_win += wins[i][f];
170 sum_denom += denominator[i][f];
175 <<
" " << sum_win <<
" / " << sum_denom
176 <<
" " << 400*log10(sum_win/sum_denom) <<
"\n";
191 for (
int j=0; j<16; ++j) {
192 std::cerr <<
"\nnew iteration " << j <<
"\n";
const range_t & range(size_t group) const
std::valarray< double > valarray_t
bool addSquare(size_t g, const NumEffectState &state, const RatingEnv &env, Move selected, valarray_t &wins, std::valarray< long double > &denominator) const
const double & weight(size_t feature_id) const
const BradleyTerry * features
std::string kisen_filename
void generateLegal(MoveVector &) const
全ての合法手を生成する.
virtual int findMatch(const NumEffectState &state, Move m, const RatingEnv &env) const
std::pair< int, int > range_t
Thread(const BradleyTerry *a, size_t t, size_t f, size_t l, valarray_t *w, std::valarray< long double > *d, size_t *s)
const Feature & feature(size_t feature_id) const
bool isMember(const T &e, const_iterator first, const_iterator last) const
size_t featureSize() const
BradleyTerry(FeatureSet &features, const std::string &kisen_file, int kisen_start=0)
std::string output_directory
std::valarray< long double > * denominator
void showGroup(std::ostream &, size_t group_id) const
void setWeight(size_t feature_id, const double &value)
bool effectiveInCheck(size_t group_id) const
std::string ipxFileName() const
const Group & group(size_t group_id) const
void save(const std::string &output_directory, size_t group_id) const
const std::string & name() const
void make(const NumEffectState &new_state)
size_t accumulate(size_t g, size_t first, size_t last, valarray_t &wins, std::valarray< long double > &denominator) const