static void calc_checksum(char *name) { long64 orig_size; if (!work) work = alloc_work(total_work); data = map_file(name, 0, &size); orig_size = size; if ((size & 0x3f) == 0x10) { size &= ~0x3fULL; memcpy(checksum1, data + size, 16); checksum_found = 1; } else { if (size & 0x3f) { printf("Size of %s is not a multiple of 64.\n", name); exit(1); } checksum_found = 0; } int chunks = (size + CHUNK - 1) / CHUNK; results = (uint64 *)malloc(32 * chunks); fill_work(total_work, chunks, 0, work); run_threaded(checksum_worker, work, 0); CityHashCrc128((char *)results, 32 * chunks, checksum2); unmap_file(data, orig_size); free(results); if (checksum_found) checksum_match = (checksum1[0] == checksum2[0] && checksum1[1] == checksum2[1]); }
void reduce_tables(int local) { int i; ubyte v[256]; long64 *work; long64 save_begin = begin; if (!copybuf) copybuf = malloc(COPYSIZE); if (local == num_saves) { work = work_part; fill_work(total_work, begin + (1ULL << shift[numpawns - 1]), 0, work); begin = 0; reduce_val[local] = ply; work = work_part; } else work = work_p; collect_stats(work, 0, local); if (generate_dtz) { save_table(table_w, 'w', local, begin, work[total_work]); if (!symmetric) save_table(table_b, 'b', local, begin, work[total_work]); } for (i = 0; i < 256; i++) v[i] = 0; #ifndef SUICIDE v[BROKEN] = BROKEN; v[UNKNOWN] = UNKNOWN; v[CHANGED] = CHANGED; v[CAPT_DRAW] = CAPT_DRAW; v[PAWN_DRAW] = PAWN_DRAW; v[MATE] = MATE; v[ILLEGAL] = ILLEGAL; v[CAPT_WIN] = CAPT_WIN; if (local == 0) { v[PAWN_WIN] = WIN_RED; for (i = 0; i < DRAW_RULE; i++) { v[WIN_IN_ONE + i] = WIN_RED; v[LOSS_IN_ONE - i] = MATE; } v[CAPT_CWIN] = CAPT_CWIN_RED; v[PAWN_CWIN] = CAPT_CWIN_RED + 1; for (; i < REDUCE_PLY - 2; i++) { v[WIN_IN_ONE + i + 2] = CAPT_CWIN_RED + 1; v[LOSS_IN_ONE - i] = LOSS_IN_ONE; } v[LOSS_IN_ONE - i] = LOSS_IN_ONE; v[WIN_IN_ONE + REDUCE_PLY] = CAPT_CWIN_RED + 2; v[WIN_IN_ONE + REDUCE_PLY + 1] = CAPT_CWIN_RED + 3; v[WIN_IN_ONE + REDUCE_PLY + 2] = CAPT_CWIN_RED + 4; v[LOSS_IN_ONE - REDUCE_PLY + 1] = LOSS_IN_ONE - 1; } else { v[WIN_RED] = WIN_RED; v[LOSS_IN_ONE] = LOSS_IN_ONE; v[CAPT_CWIN_RED] = CAPT_CWIN_RED; v[CAPT_CWIN_RED + 1] = CAPT_CWIN_RED + 1; for (i = 0; i < REDUCE_PLY_RED; i++) { v[CAPT_CWIN_RED + i + 2] = CAPT_CWIN_RED + 1; v[LOSS_IN_ONE - i - 1] = LOSS_IN_ONE; } v[CAPT_CWIN_RED + REDUCE_PLY_RED + 2] = CAPT_CWIN_RED + 2; v[CAPT_CWIN_RED + REDUCE_PLY_RED + 3] = CAPT_CWIN_RED + 3; v[CAPT_CWIN_RED + REDUCE_PLY_RED + 4] = CAPT_CWIN_RED + 4; v[LOSS_IN_ONE - REDUCE_PLY_RED - 1] = LOSS_IN_ONE - 1; } #else v[BROKEN] = BROKEN; v[UNKNOWN] = UNKNOWN; v[CHANGED] = CHANGED; v[CAPT_WIN] = CAPT_WIN; v[CAPT_CWIN] = CAPT_CWIN; v[CAPT_DRAW] = CAPT_DRAW; v[CAPT_CLOSS] = CAPT_CLOSS; v[CAPT_LOSS] = CAPT_LOSS; v[PAWN_DRAW] = PAWN_DRAW; if (local == 0) { v[THREAT_WIN1] = THREAT_WIN_RED; v[THREAT_WIN2] = THREAT_WIN_RED; v[STALE_WIN] = BASE_WIN_RED; v[STALE_WIN + 1] = BASE_WIN_RED; for (i = 2; i <= DRAW_RULE; i++) v[BASE_WIN + i] = BASE_WIN_RED; v[THREAT_CWIN1] = THREAT_CWIN_RED; v[THREAT_CWIN2] = THREAT_CWIN_RED; v[BASE_WIN + DRAW_RULE + 1] = BASE_CWIN_RED; for (i = DRAW_RULE + 2; i < REDUCE_PLY; i++) v[BASE_WIN + i + 2] = BASE_CWIN_RED; for (i = 0; i <= DRAW_RULE; i++) v[BASE_LOSS - i] = BASE_LOSS_RED; for (; i < REDUCE_PLY; i++) v[BASE_LOSS - i] = BASE_CLOSS_RED; v[BASE_WIN + REDUCE_PLY + 2] = BASE_CWIN_RED + 1; v[BASE_WIN + REDUCE_PLY + 3] = BASE_CWIN_RED + 2; v[BASE_LOSS - REDUCE_PLY] = BASE_CLOSS_RED - 1; } else { v[THREAT_WIN_RED] = THREAT_WIN_RED; v[BASE_WIN_RED] = BASE_WIN_RED; v[THREAT_CWIN_RED] = THREAT_CWIN_RED; v[BASE_CWIN_RED] = BASE_CWIN_RED; v[BASE_LOSS_RED] = BASE_LOSS_RED; v[BASE_CLOSS_RED] = BASE_CLOSS_RED; for (i = 0; i < REDUCE_PLY_RED; i++) { v[BASE_CWIN_RED + i + 1] = BASE_CWIN_RED; v[BASE_CLOSS_RED - i - 1] = BASE_CLOSS_RED; } v[BASE_CWIN_RED + REDUCE_PLY_RED + 1] = BASE_CWIN_RED + 1; v[BASE_CWIN_RED + REDUCE_PLY_RED + 2] = BASE_CWIN_RED + 2; v[BASE_CLOSS_RED - REDUCE_PLY_RED - 1] = BASE_CLOSS_RED - 1; } #endif transform_v = v; run_threaded(transform, work, 0); if (local == num_saves) { if (num_saves == 0) reduce_cnt[0] = ply - DRAW_RULE - 2; else reduce_cnt[num_saves] = reduce_cnt[num_saves - 1] + ply; begin = save_begin; num_saves++; } }