void trace_check(bool aggressive, int depth, board_t board, superinfo_t info, const char* context) { check_board(board); // Stone depth should increase monotonically GEODE_ASSERT(stone_depth<=depth+count_stones(board)); stone_depth = depth+count_stones(board); // Standardize board symmetry_t symmetry; superstandardize(board).get(board,symmetry); info.known = transform_super(symmetry,info.known); info.wins = transform_super(symmetry,info.wins); // Compare with what we know const superinfo_t* known_info = known.get_pointer(tuple(depth,board)); if (known_info) { const super_t errors = (known_info->wins^info.wins)&known_info->known&info.known; if (errors) { const uint8_t r = first(errors); cout << format("trace check failed in %s: depth %d, board %lld, aggressive %d, stones %d, rotation %d, correct %d, got %d", context,depth,board,aggressive,count_stones(board),r,known_info->wins(r),info.wins(r))<<endl; trace_error(aggressive,depth,board,format("%s.trace_check",context).c_str()); } } }