|
@ -5,10 +5,20 @@ |
|
|
|
|
|
|
|
|
using klotski::cases::GroupCases; |
|
|
using klotski::cases::GroupCases; |
|
|
|
|
|
|
|
|
|
|
|
using klotski::codec::ShortCode; |
|
|
|
|
|
|
|
|
using klotski::codec::CommonCode; |
|
|
using klotski::codec::CommonCode; |
|
|
|
|
|
|
|
|
using klotski::cases::RangesUnion; |
|
|
using klotski::cases::RangesUnion; |
|
|
|
|
|
|
|
|
|
|
|
using klotski::cases::GroupUnion; |
|
|
|
|
|
|
|
|
|
|
|
using klotski::cases::ALL_GROUP_NUM; |
|
|
|
|
|
|
|
|
|
|
|
using klotski::cases::TYPE_ID_LIMIT; |
|
|
|
|
|
|
|
|
|
|
|
using klotski::cases::ALL_CASES_NUM_; |
|
|
|
|
|
|
|
|
struct tmp_t { |
|
|
struct tmp_t { |
|
|
uint32_t group_id : 12; |
|
|
uint32_t group_id : 12; |
|
|
uint32_t case_id : 20; |
|
|
uint32_t case_id : 20; |
|
@ -21,38 +31,26 @@ static_assert(sizeof(tmp_t) == 4); |
|
|
std::vector<RangesUnion> build_ranges_unions() { |
|
|
std::vector<RangesUnion> build_ranges_unions() { |
|
|
|
|
|
|
|
|
std::vector<RangesUnion> unions; |
|
|
std::vector<RangesUnion> unions; |
|
|
unions.reserve(25422); |
|
|
unions.reserve(ALL_GROUP_NUM); |
|
|
|
|
|
|
|
|
// auto group_union = klotski::cases::GroupUnion::unsafe_create(169);
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: add white list for single-group unions
|
|
|
// TODO: add white list for single-group unions
|
|
|
|
|
|
|
|
|
for (uint32_t type_id = 0; type_id < klotski::cases::TYPE_ID_LIMIT; ++type_id) { |
|
|
for (uint32_t type_id = 0; type_id < TYPE_ID_LIMIT; ++type_id) { |
|
|
auto group_union = klotski::cases::GroupUnion::unsafe_create(type_id); |
|
|
auto group_union = GroupUnion::unsafe_create(type_id); |
|
|
for (auto group : group_union.groups()) { |
|
|
for (auto group : group_union.groups()) { |
|
|
unions.emplace_back(group.cases()); |
|
|
unions.emplace_back(group.cases()); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
std::cout << unions.size() << std::endl; |
|
|
|
|
|
|
|
|
|
|
|
return unions; |
|
|
return unions; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
CommonCode GroupCases::from_info_t(info_t info) { |
|
|
CommonCode GroupCases::from_info_t(info_t info) { |
|
|
|
|
|
|
|
|
std::vector<RangesUnion> data = build_ranges_unions(); |
|
|
// TODO: build as static class member (ptr)
|
|
|
|
|
|
static std::vector<RangesUnion> data = build_ranges_unions(); |
|
|
// TODO: build as static data
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: loop [0, 25422) -> get RangesUnion of all flat_ids
|
|
|
|
|
|
|
|
|
|
|
|
auto flat_id = GROUP_OFFSET[info.type_id] + info.group_id; |
|
|
auto flat_id = GROUP_OFFSET[info.type_id] + info.group_id; |
|
|
std::cout << "flat_id = " << flat_id << std::endl; |
|
|
|
|
|
|
|
|
|
|
|
// auto codes = data[flat_id].codes();
|
|
|
|
|
|
// std::stable_sort(codes.begin(), codes.end());
|
|
|
|
|
|
// std::cout << codes[info.case_id] << std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
auto &cases = data[flat_id]; |
|
|
auto &cases = data[flat_id]; |
|
|
// TODO: make offset table for perf
|
|
|
// TODO: make offset table for perf
|
|
@ -68,23 +66,50 @@ CommonCode GroupCases::from_info_t(info_t info) { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
std::cout << "head = " << head << std::endl; |
|
|
auto range = cases[head][info.case_id]; |
|
|
std::cout << info.case_id << std::endl; |
|
|
return CommonCode::unsafe_create(head << 32 | range); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static std::vector<tmp_t> build_tmp_data() { |
|
|
|
|
|
|
|
|
|
|
|
std::vector<tmp_t> data; |
|
|
|
|
|
data.resize(ALL_CASES_NUM_); |
|
|
|
|
|
ShortCode::speed_up(true); |
|
|
|
|
|
|
|
|
|
|
|
for (uint32_t type_id = 0; type_id < TYPE_ID_LIMIT; ++type_id) { |
|
|
|
|
|
auto group_union = GroupUnion::unsafe_create(type_id); |
|
|
|
|
|
for (auto group : group_union.groups()) { |
|
|
|
|
|
uint32_t group_id = group.group_id(); |
|
|
|
|
|
|
|
|
// TODO: need sort in `Group::cases`
|
|
|
auto codes = group.cases().codes(); |
|
|
std::stable_sort(cases[head].begin(), cases[head].end()); |
|
|
for (uint32_t case_id = 0; case_id < codes.size(); ++case_id) { |
|
|
|
|
|
auto short_code = codes[case_id].to_short_code(); |
|
|
|
|
|
|
|
|
std::cout << CommonCode::unsafe_create(head << 32 | cases[1][1909]) << std::endl; |
|
|
data[short_code.unwrap()] = tmp_t { |
|
|
|
|
|
.group_id = group_id, |
|
|
|
|
|
.case_id = case_id, |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return data; |
|
|
|
|
|
|
|
|
return CommonCode::unsafe_create(0); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
GroupCases::info_t GroupCases::to_info_t(codec::ShortCode short_code) { |
|
|
GroupCases::info_t GroupCases::to_info_t(codec::ShortCode short_code) { |
|
|
std::vector<tmp_t> data; |
|
|
|
|
|
|
|
|
|
|
|
// TODO: build as static data
|
|
|
// TODO: build as static class member (ptr)
|
|
|
|
|
|
static auto data = build_tmp_data(); |
|
|
|
|
|
|
|
|
// TODO: loop from `std::vector<RangesUnion>`
|
|
|
uint16_t type_id = GroupUnion::from_short_code(short_code).unwrap(); // NOTE: need to convert as CommonCode
|
|
|
|
|
|
uint16_t group_id = data[short_code.unwrap()].group_id; |
|
|
|
|
|
auto case_id = data[short_code.unwrap()].case_id; |
|
|
|
|
|
|
|
|
return {}; |
|
|
return info_t { |
|
|
|
|
|
.type_id = type_id, |
|
|
|
|
|
.group_id = group_id, |
|
|
|
|
|
.case_id = case_id, |
|
|
|
|
|
}; |
|
|
} |
|
|
} |
|
|