20 #include <boost/format.hpp> 45 average(0), variance(0), probability(0)
69 for (
size_t i=0; i<
groups.size(); ++i) {
71 return std::make_pair(first, first+
groups[i].size());
86 for (
size_t i=0; i<
groups.size(); ++i)
104 for (
size_t i=0; i<g->size(); ++i) {
146 for (
size_t i=0; i<
groups.size(); ++i) {
148 if (! success && result)
149 std::cerr <<
"warning: rating load failed " <<
groups[i].group_name <<
" " << i
150 <<
" in " << input_directory <<
"\n";
153 for (
size_t i=0; i<
features.size(); ++i)
156 std::string filename = input_directory +
"/statistics.txt";
157 std::ifstream is(filename.c_str());
158 typedef std::map<std::string,Statistics>
map_t;
161 double a, s, p, dummy;
162 while (is >> name >> a >> s >> dummy >> dummy >> p) {
168 for (
size_t i=0; i<
groups.size(); ++i) {
169 double a = 0.0, v = 0.0;
170 for (
size_t j=i+1; j<
groups.size(); ++j) {
171 map_t::iterator q = table.find(
groups[j].group_name);
172 if (q == table.end()) {
176 a += q->second.probability * q->second.average;
177 v += q->second.probability * q->second.variance;
180 statistics[i].average_after =
static_cast<int>(a);
181 statistics[i].sigma_after =
static_cast<int>(sqrt(v)*3);
182 # ifdef VERBOSE_RATING 183 std::cerr << groups[i].group_name
196 weightslog10[feature_id] =
static_cast<int>(400*log10(value));
203 #if (defined RATING_STAT) || (defined RATING_STAT2) 207 const bool in_check = state.
inCheck();
214 for (
size_t i=0; i<moves.
size(); ++i) {
215 if (moves[i].ptype() ==
KING) {
219 if (! in_check && env.
my_pin.
any() && ! moves[i].isDrop()
237 186, 213, 243, 247, 249, 255, 252, 258, 263, 269, 267, 279, 295, 295, 295, 295, 295, 295, 295, 295,
238 191, 245, 283, 300, 313, 315, 319, 323, 326, 339, 321, 347, 334, 346, 328, 368, 328, 328, 328, 328,
239 183, 250, 304, 328, 346, 352, 373, 366, 365, 379, 396, 379, 392, 416, 420, 374, 423, 378, 395, 399,
240 184, 253, 312, 346, 358, 378, 389, 407, 409, 403, 404, 421, 432, 395, 421, 444, 444, 461, 411, 408,
241 190, 256, 319, 350, 373, 397, 397, 403, 420, 431, 415, 450, 424, 416, 436, 447, 456, 439, 429, 428,
242 197, 262, 324, 357, 374, 390, 407, 423, 415, 425, 436, 444, 458, 455, 439, 474, 451, 466, 464, 457,
243 202, 268, 332, 360, 381, 386, 416, 416, 418, 433, 447, 446, 452, 462, 479, 468, 467, 486, 483, 459,
244 205, 270, 330, 361, 383, 394, 410, 418, 427, 438, 438, 452, 446, 445, 447, 463, 475, 472, 483, 485,
247 262, 445, 584, 685, 788, 890, 982,1067,1120,1148, 1137,1156,1182,1231,1259, 1343,1352,1359,1359,1359,
248 265, 456, 577, 665, 745, 809, 874, 938, 997,1061, 1088,1154,1179,1231,1259, 1343,1352,1359,1359,1359,
249 260, 467, 596, 680, 751, 807, 872, 908, 951,1003, 1054,1072,1117,1168,1198, 1188,1267,1259,1311,1344,
250 261, 467, 599, 688, 747, 810, 861, 914, 948, 975, 1008,1055,1092,1084,1142, 1189,1214,1254,1231,1258,
251 264, 463, 595, 679, 746, 808, 844, 885, 933, 973, 987,1049,1048,1068,1115, 1151,1184,1191,1209,1233,
252 268, 459, 588, 673, 732, 788, 840, 887, 910, 950, 989,1022,1059,1078,1088, 1144,1144,1180,1201,1216,
253 271, 459, 587, 664, 727, 771, 835, 866, 899, 942, 984,1006,1037,1069,1105, 1114,1134,1173,1188,1186,
254 272, 458, 581, 661, 725, 773, 824, 863, 902, 940, 966,1005,1023,1047,1074, 1113,1145,1163,1193,1214,
259 263, 271, 274, 270, 278, 253, 235, 201, 171, 151, 111, 95, 83, 76, 78, 65, 71, 61,
260 330, 334, 328, 316, 312, 304, 284, 256, 218, 188, 159, 136, 113, 103, 92, 87, 82, 71,
261 377, 374, 376, 368, 356, 337, 311, 278, 246, 203, 175, 146, 131, 118, 107, 96, 81, 65,
262 415, 424, 406, 396, 376, 345, 315, 276, 243, 211, 179, 155, 138, 121, 110, 91, 80, 62,
263 423, 422, 433, 423, 405, 381, 341, 313, 276, 243, 210, 182, 158, 142, 123, 104, 85, 73,
264 442, 451, 448, 437, 417, 395, 364, 333, 297, 267, 234, 202, 178, 158, 133, 107, 91, 76,
265 446, 447, 455, 439, 427, 402, 373, 339, 307, 274, 242, 212, 188, 162, 133, 111, 92, 75,
266 467, 468, 469, 453, 433, 412, 389, 365, 334, 301, 268, 236, 205, 177, 153, 131, 116, 101,
269 978, 880, 786, 676, 586, 475, 383, 302, 239, 208, 167, 153, 134, 127, 126, 100, 100, 82,
270 1020, 935, 836, 730, 634, 549, 472, 412, 351, 312, 269, 232, 190, 167, 143, 127, 112, 95,
271 1095, 998, 910, 810, 715, 623, 543, 471, 407, 338, 291, 246, 216, 189, 160, 140, 115, 90,
272 1106,1031, 929, 829, 730, 635, 551, 469, 402, 341, 290, 249, 217, 186, 159, 127, 108, 85,
273 1185,1092, 1011, 913, 811, 717, 617, 538, 459, 391, 331, 285, 242, 210, 176, 143, 114, 96,
274 1224,1150, 1058, 957, 853, 755, 658, 573, 493, 424, 363, 308, 262, 223, 181, 142, 116, 96,
275 1224,1134, 1057, 953, 857, 759, 666, 579, 501, 432, 373, 315, 267, 220, 178, 141, 115, 93,
276 1296,1201, 1115,1009, 904, 807, 717, 638, 563, 492, 425, 363, 305, 254, 210, 172, 145, 123,
281 193, 220, 235, 249, 256, 263, 268, 274, 279, 284, 283, 279, 292, 267, 272,
282 220, 243, 263, 273, 287, 300, 306, 308, 317, 325, 328, 339, 319, 336, 323,
283 215, 242, 267, 287, 302, 314, 329, 340, 347, 360, 367, 364, 349, 387, 374,
284 209, 243, 267, 293, 317, 332, 347, 360, 372, 383, 387, 387, 395, 398, 405,
285 216, 244, 276, 303, 322, 344, 360, 374, 378, 397, 405, 414, 408, 400, 424,
286 220, 251, 278, 307, 331, 355, 365, 381, 398, 406, 418, 423, 414, 433, 403,
287 226, 254, 284, 311, 336, 354, 378, 390, 408, 418, 420, 448, 414, 446, 408,
288 219, 250, 283, 310, 333, 356, 377, 391, 403, 417, 426, 426, 440, 445, 452,
291 214, 285, 357, 442, 520, 596, 669, 742, 816, 881, 928, 972,1045,1079,1143,
292 237, 302, 374, 442, 519, 595, 662, 731, 799, 870, 925, 994,1031,1112,1159,
293 230, 294, 367, 442, 517, 595, 675, 746, 815, 884, 951,1012,1060,1149,1185,
294 224, 292, 361, 441, 524, 602, 682, 758, 833, 904, 964,1028,1105,1164,1223,
295 231, 295, 369, 449, 525, 611, 692, 771, 839, 922, 985,1041,1094,1150,1239,
296 235, 301, 370, 450, 532, 616, 690, 769, 851, 920, 991,1054,1100,1194,1217,
297 240, 300, 373, 448, 527, 607, 693, 768, 845, 919, 981,1066,1094,1191,1218,
298 233, 294, 364, 435, 511, 591, 674, 753, 832, 917, 993,1065,1157,1224,1300,
301 inline int make_prob(
int score,
int order,
int limit,
int highest,
int progress8,
bool in_pv_or_all)
303 const int order_index =
std::min((
int)order/4, 19);
304 int result = limit+1;
305 if (order_to_width[progress8][order_index] <= limit) {
306 result = (order == 0) ? 100 : order_to_depth[progress8][order_index];
311 if (limit > 600 && score_to_width[progress8][score_index] <= limit) {
312 result =
std::min(result, score_to_depth[progress8][score_index]);
314 if (limit > 700 && order > 0 && in_pv_or_all) {
316 assert(rscore_index >= 0);
317 if (relative_score_to_width[progress8][rscore_index] <= limit)
318 result =
std::min(result, relative_score_to_depth[progress8][rscore_index]);
328 CArray2d<CArray<stat::Average,8>,14,40> data;
329 CArray2d<CArray<double,8>,14,80> selected_all;
330 void add_stat(
int limit,
int rating,
bool added,
int progress8)
337 data[limit/50][(rating+1000)/50][progress8].
add(added);
339 selected_all[limit/50][(rating+1000)/25][progress8] += 1.0;
345 std::cerr <<
"limit " << 0*50+300 <<
" - " << (data.size1()-1)*50+300 <<
"\n";
346 for (
int p=0; p<8; ++p)
348 std::cerr <<
"progress8 " << p <<
"\n ";
349 for (
size_t j=0; j<data.size1(); ++j)
352 for (; i<data.size2(); ++i)
353 if (data[j][i][p].getAverage() > 0.05)
355 std::cerr << (boost::format(
"%+4d, ") %
static_cast<int>(i)*50-1000);
359 std::cerr <<
"limit " << 0*50+300 <<
" - " << (selected_all.size1()-1)*50+300 <<
"\n";
360 CArray<double, 3> prob = {{ 0.01, 0.03, 0.05 }};
361 for (
size_t pp=0; pp<prob.size(); ++pp) {
362 std::cerr <<
"prob " << prob[pp] <<
"\n";
363 for (
int p=0; p<8; ++p)
365 std::cerr <<
"progress8 " << p <<
"\n ";
366 for (
size_t j=0; j<selected_all.size1(); ++j)
369 for (
size_t i=0; i<selected_all.size2(); ++i)
370 sum += selected_all[j][i][p];
372 for (
double so_far = 0; i<selected_all.size2(); ++i) {
373 so_far += selected_all[j][i][p];
374 if (so_far > prob[pp]*sum)
377 std::cerr << (boost::format(
"%+4d, ") %
static_cast<int>(i)*25-1000);
397 const int highest = score[0].rating();
398 const int progress8 = env.
progress.value()/2;
399 for (
size_t i=0; i<score.
size(); ++i) {
400 const int log_prob =
make_prob(score[i].
rating(), i, limit, highest, progress8, in_pv_or_all);
402 add_stat(limit, score[i].
rating(), log_prob <= limit, progress8);
410 223, 204, 208, 190, 159, 137, 124, 110, 100, 89
413 356, 337, 296, 262, 230, 200, 171, 148, 132, 120,
416 203, 201, 199, 188, 181, 169, 159, 147, 136, 122,
422 const bool in_check = state.
inCheck();
426 return score_to_depth[env.
progress.value()/2][score_index];
434 const bool in_check = state.
inCheck();
438 return score_to_depth[env.
progress.value()/2][score_index];
446 const bool in_check = state.
inCheck();
450 return score_to_depth[env.
progress.value()/2][score_index];
461 int found =
groups[group_id].findMatch(state, move, env);
464 const int progress8 = env.
progress.value()/2;
470 found +=
ranges[group_id].first;
472 const int progress8 = env.
progress.value()/2;
485 for (
size_t j=0; j<
groups.size(); ++j) {
490 sum +=
rating(state, env, move, j);
495 int checkmate_if_capture = 0;
498 sum += checkmate_if_capture;
504 if (checkmate_if_capture > 0)
506 else if (sendoff > 0 && capture < 0)
508 const int optimistic = sum +
std::max(0, capture);
520 100, 100, 50, 0, 0, -75,-100,-150,-200,-200,
523 125, 125, 125, 25, 25, -50, -50,-100,-125,-225,
526 100, 75, 100, 25, 0, -25, -50,-100,-125,-175,
529 75, 50, 75, 0, -25, -25, -75,-100,-125,-200,
532 125, 125, 150, 50, 50, 50, -25, 0, -50,-200,
535 175, 200, 200, 75, 75, 75, 0, 0,-175,-300,
538 175, 175, 200, 50, 75, 75, 25, 0,-100,-250,
541 225, 200, 225, 75, 100, 75, 50, 0, 0,-250,
548 100,100,100,0,0,-100,-100,-200,-200,-200,
551 100,100,100,0,0,-100,-100,-100,-100,-200,
554 100,100,100,0,0,0,-100,-100,-100,-200
557 100,100,100,0,0,0,-100,-100,-100,-200
560 200,200,200,100,100,100,0,0,0,-100
563 300,300,300,100,100,100,100,0,-200,-300
566 300,300,300,100,100,100,100,0,0,-200
569 300,300,300,100,200,200,100,0,0,-200
576 int limit,
Move move)
const 579 return makeRate(state, in_check, env, move);
584 int checkmate_if_capture = 0;
585 const int progress8 = env.
progress.value()/2;
586 for (
size_t j=0; j<
groups.size(); ++j) {
589 const int r =
rating(state, env, move, j);
595 checkmate_if_capture = r;
596 if (checkmate_if_capture > 0 && capture < 0) {
604 if (sum +
statistics[j].average_after + sigma < threshold[progress8][limit]) {
610 const int optimistic = sum +
std::max(0, capture);
618 const bool in_check = state.
inCheck();
619 std::vector<std::pair<int, std::string> > values;
620 for (
size_t j=0; j<
groups.size(); ++j) {
623 int found =
groups[j].findMatch(state, move, env);
629 std::sort(values.begin(), values.end());
630 std::reverse(values.begin(), values.end());
631 std::ostringstream ss;
632 for (
size_t i=0; i<values.size(); ++i) {
635 ss << values[i].second <<
" " << values[i].first;
644 os << std::setprecision(3);
657 os << std::setprecision(3);
658 for (
size_t i=0; i<
groups.size(); ++i) {
659 os <<
groups[i].group_name <<
"\t";
660 for (
int p=0; p<8; ++p) {
663 <<
" " <<
frequency[i][p].average() <<
" ";
757 if (! allow_load_failure && ! success) {
768 return common_instance;
776 std::cerr <<
"success\n";
778 catch (std::exception& e)
780 std::cerr << e.what() <<
"\n";
784 std::cerr <<
"unknown exception\n";
798 if (! allow_load_failure && ! success) {
void push_back(const T &e)
static const osl::CArray2d< int, 8, rsc_length > relative_score_to_width
int max(Player p, int v1, int v2)
std::vector< CArray< stat::Average, 8 > > frequency
統計測定用
const range_t & range(size_t group) const
static void generate(const NumEffectState &state, MoveVector &out)
不成の受けも作成
bool hasEffectAt(Square target) const
対象とするマスにあるプレイヤーの利きがあるかどうか.
int checkmate_if_capture_group
static bool isMember(const State &state, Move m)
constexpr Player alt(Player player)
std::vector< char > normal_groups
int average_after
group 以降の性質
const range_t makeRange(size_t group) const
int logProbKingEscape(const NumEffectState &state, const RatingEnv &env, Move) const
int min(Player p, int v1, int v2)
static const osl::CArray2d< int, 8, 20 > order_to_depth
boost::ptr_vector< Group > groups
void generateRating(const NumEffectState &state, const RatingEnv &env, int limit, RatedMoveVector &out, bool in_pv_or_all=true) const
static bool healthCheck()
std::vector< Statistics > statistics
std::vector< int > weightslog10
mutually exclusive set of features
std::pair< int, int > range_t
void push_back(Move move, int prob)
int logProbTakeBack(const NumEffectState &state, const RatingEnv &env, Move) const
virtual bool effectiveInCheck() const
std::vector< stat::Variance > variance_all
std::vector< double > weights
const std::string annotate(const NumEffectState &state, const RatingEnv &env, Move move) const
static const StandardFeatureSet & instance()
int capture_group
makeRateで特別扱いのgroup
const RatedMove makeRateWithCut(const NumEffectState &state, bool in_check, const RatingEnv &env, int limit, Move move) const
std::vector< char > effective_in_check
static const osl::CArray< int, 10 > score_to_depth_seeplus
double average
group 単独の性質
std::vector< range_t > ranges
static void generate(Player p, const NumEffectState &state, MoveVector &)
void saveResult(const std::string &directory, const range_t &range, const std::vector< double > &weights) const
static const osl::CArray< int, 10 > score_to_depth_kingescape
virtual void show(std::ostream &, int name_width, const range_t &range, const std::vector< double > &weights) const
static const osl::CArray2d< int, 8, 16 > threshold
void showGroup(std::ostream &, size_t group_id) const
void setWeight(size_t feature_id, const double &value)
int logProbSeePlus(const NumEffectState &state, const RatingEnv &env, Move) const
void generateLogProb(const NumEffectState &state, const RatingEnv &env, int limit, MoveLogProbVector &out, bool in_pv_or_all=true) const
int rating(const NumEffectState &state, const RatingEnv &env, Move move, size_t group_id) const
std::unordered_map< osl::HashKey, list_t, std::hash< osl::HashKey > > map_t
bool effectiveInCheck(size_t group_id) const
bool inCheck(Player P) const
Pの玉が王手状態
static const std::string & home(const std::string &initialize_if_first_invocation="")
compile時に指定されたディレクトリを返す.
int make_prob(int score, int order, int limit, int highest, int progress8, bool in_pv_or_all)
static const osl::CArray< int, 10 > score_to_depth_takeback
std::vector< CArray< stat::Variance, 8 > > variance_match
void sort()
ratingが高い順にsort
const RatedMove makeRate(const NumEffectState &state, bool in_check, const RatingEnv &env, Move move) const
CaptureSet(bool allow_load_failure=false)
static const osl::CArray2d< int, 8, sc_length > score_to_depth
const Group & group(size_t group_id) const
void save(const std::string &output_directory, size_t group_id) const
static const osl::CArray2d< int, 8, sc_length > score_to_width
bool tryLoad(const std::string &input_directory)
std::vector< Feature * > features
static const osl::CArray2d< int, 8, 20 > order_to_width
StandardFeatureSet(bool allow_load_failure=false)
void showStatistics(std::ostream &) const
static const osl::CArray2d< int, 8, rsc_length > relative_score_to_depth
static std::string defaultDirectory()