27 valarray_t& wins, std::valarray<long double>& denominator)
const
35 const bool in_check = EffectUtil::isKingInCheck(state.
turn(), state);
36 if (! in_check ||
features.effectiveInCheck(g))
39 int found =
features.group(g).findMatch(state, selected, env);
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) {
50 for (
size_t j=0; j<
features.groupSize(); ++j) {
52 if (in_check && !
features.effectiveInCheck(j))
55 int found =
features.group(j).findMatch(state, m, env);
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;
101 assert(wins.size() ==
features.featureSize());
105 for (
size_t i=first; i<last; i++) {
117 for (
size_t j=0; j<moves.size(); j++) {
126 if (!
addSquare(g, state, env, moves[j], wins, denominator))
130 env.
update(state, moves[j]);
152 boost::ptr_vector<std::thread> threads;
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];
173 std::cerr <<
" " << std::setw(14) <<
features.feature(f).name()
174 <<
" " <<
features.weight(f) <<
" => " << sum_win/sum_denom
175 <<
" " << sum_win <<
" / " << sum_denom
176 <<
" " << 400*log10(sum_win/sum_denom) <<
"\n";
180 features.setWeight(f, sum_win/sum_denom);
181 assert(! std::isinf(
features.weight(f)));
182 assert(! std::isnan(
features.weight(f)));
191 for (
int j=0; j<16; ++j) {
192 std::cerr <<
"\nnew iteration " << j <<
"\n";
193 for (
size_t i=0; i<
features.groupSize(); ++i) {
bool isMember(const T &e, const_iterator first, const_iterator last) const
std::string ipxFileName() const
void generateLegal(MoveVector &) const
全ての合法手を生成する.
bool inCheck(Player P) const
Pの玉が王手状態
std::valarray< long double > * denominator
const BradleyTerry * features
Thread(const BradleyTerry *a, size_t t, size_t f, size_t l, valarray_t *w, std::valarray< long double > *d, size_t *s)
std::string kisen_filename
std::valarray< double > valarray_t
BradleyTerry(FeatureSet &features, const std::string &kisen_file, int kisen_start=0)
bool addSquare(size_t g, const NumEffectState &state, const RatingEnv &env, Move selected, valarray_t &wins, std::valarray< long double > &denominator) const
size_t accumulate(size_t g, size_t first, size_t last, valarray_t &wins, std::valarray< long double > &denominator) const
std::string output_directory
void make(const NumEffectState &new_state)
void update(const NumEffectState &new_state, Move last_move)
std::vector< Move > moves(size_t index)
NumEffectState initialState() const
unsigned int rating(size_t index, Player pl)
std::pair< int, int > range_t