From 57904b3801b426aeb5a857e80a64ccfab4d7a457 Mon Sep 17 00:00:00 2001 From: Dnomd343 Date: Fri, 14 Apr 2023 10:31:23 +0800 Subject: [PATCH] update: load group info --- src/klotski_core/ffi/tmain.cc | 38 +++++++++++-------- src/klotski_core/group/build_cases.cc | 16 ++++---- src/klotski_core/group/group.h | 6 ++- src/klotski_core/group/group_info.cc | 30 +++++++++++++++ src/klotski_core/group/type_id.h | 54 ++++++++++++++++++--------- 5 files changed, 102 insertions(+), 42 deletions(-) diff --git a/src/klotski_core/ffi/tmain.cc b/src/klotski_core/ffi/tmain.cc index 32c8501..9af43a0 100644 --- a/src/klotski_core/ffi/tmain.cc +++ b/src/klotski_core/ffi/tmain.cc @@ -33,21 +33,29 @@ using klotski::TYPE_ID_LIMIT; void tmain() { // printf("tmain start\n"); - std::vector group_num; - group_num.reserve(TYPE_ID_LIMIT); - for (uint32_t type_id = 0; type_id < TYPE_ID_LIMIT; ++type_id) { - group_num.emplace_back(Group::build_groups(type_id).size()); - std::cerr << type_id << std::endl; - } - - for (uint32_t i = 0; i < group_num.size(); ++i) { - - printf("%4d, ", group_num[i]); - if (i % 16 == 15) { - printf("\n"); - } - - } + Group::group_info(CommonCode(0x1A9BF0C00)); + +// std::vector group_num; +// group_num.reserve(TYPE_ID_LIMIT); +// for (uint32_t type_id = 0; type_id < TYPE_ID_LIMIT; ++type_id) { +// group_num.emplace_back(Group::build_groups(type_id).size()); +// std::cerr << type_id << std::endl; +// } +// +// uint32_t offset = 0; +// std::vector group_offset; +// group_offset.reserve(TYPE_ID_LIMIT); +// for (auto &&tmp : group_num) { +// group_offset.emplace_back(offset); +// offset += tmp; +// } +// +// for (uint32_t i = 0; i < group_offset.size(); ++i) { +// printf("%5d, ", group_offset[i]); +// if (i % 12 == 11) { +// printf("\n"); +// } +// } // printf("tmain exit\n"); } diff --git a/src/klotski_core/group/build_cases.cc b/src/klotski_core/group/build_cases.cc index 42c95f6..b77734b 100644 --- a/src/klotski_core/group/build_cases.cc +++ b/src/klotski_core/group/build_cases.cc @@ -43,12 +43,12 @@ std::vector Group::all_cases(uint32_t type_id) { return all_cases; } -std::vector Group::group_cases(const RawCode &seed) { +std::vector Group::group_cases(const RawCode &raw_code) { std::queue cache; absl::flat_hash_map cases; // - cases.reserve(max_group_size(seed)); - cases.emplace(seed.unwrap(), 0); // without mask - cache.emplace(seed.unwrap()); + cases.reserve(max_group_size(raw_code)); + cases.emplace(raw_code.unwrap(), 0); // without mask + cache.emplace(raw_code.unwrap()); auto core = Core( [&cache, &cases](auto &&code, auto &&mask) { // callback function @@ -68,15 +68,15 @@ std::vector Group::group_cases(const RawCode &seed) { auto result = std::vector(); result.reserve(cases.size()); - for (auto &&raw_code : cases) { // export group cases - result.emplace_back(RawCode::unsafe_create(raw_code.first)); + for (auto &&tmp : cases) { // export group cases + result.emplace_back(RawCode::unsafe_create(tmp.first)); } return result; } // TODO: test this function -std::vector Group::group_cases(const CommonCode &seed) { - return group_cases(RawCode::from_common_code(seed)); +std::vector Group::group_cases(const CommonCode &common_code) { + return group_cases(RawCode::from_common_code(common_code)); } std::vector Group::build_group(uint32_t type_id, uint32_t group_id) { diff --git a/src/klotski_core/group/group.h b/src/klotski_core/group/group.h index 81bccff..f332aa1 100644 --- a/src/klotski_core/group/group.h +++ b/src/klotski_core/group/group.h @@ -35,8 +35,10 @@ public: static std::vector all_cases(uint32_t type_id); /// Search for all derivatives that a case can produce. - static std::vector group_cases(const RawCode &seed); - static std::vector group_cases(const CommonCode &seed); + static std::vector group_cases(const RawCode &raw_code); + static std::vector group_cases(const CommonCode &common_code); + + // TODO: group_seed /// Calculate all groups in the specified type_id. static std::vector> build_groups(uint32_t type_id); diff --git a/src/klotski_core/group/group_info.cc b/src/klotski_core/group/group_info.cc index cc103be..ecd83e8 100644 --- a/src/klotski_core/group/group_info.cc +++ b/src/klotski_core/group/group_info.cc @@ -1,4 +1,9 @@ +#include #include "group.h" +#include "type_id.h" +#include "group_seeds.h" + +#include namespace klotski { @@ -11,6 +16,29 @@ Group::group_info_t Group::group_info(const RawCode &raw_code) { Group::group_info_t Group::group_info(const CommonCode &common_code) { + auto type_id = Group::type_id(common_code); + + std::cout << type_id << std::endl; + std::cout << "group num: " << TYPE_ID_GROUP_NUM[type_id] << std::endl; + std::cout << "offset: " << TYPE_ID_OFFSET[type_id] << std::endl; + + uint32_t start = TYPE_ID_OFFSET[type_id]; + uint32_t end = start + TYPE_ID_GROUP_NUM[type_id]; + std::cout << "range: [" << start << ", " << end << ")" << std::endl; + + auto group = Group::group_cases(common_code); + std::vector g(group.begin(), group.end()); + auto seed = std::min_element(g.begin(), g.end()); + std::cout << "seed: " << *seed << std::endl; + + auto t = std::lower_bound(GROUP_SEEDS + start, GROUP_SEEDS + end, seed->unwrap()); + auto tmp_index = t - GROUP_SEEDS; + std::cout << "tmp index: " << tmp_index; + std::cout << " (" << CommonCode(GROUP_SEEDS[tmp_index]) << ")" << std::endl; + + auto group_id = GROUP_SEEDS_INDEX_[tmp_index]; + std::cout << "group id: " << group_id << std::endl; + // TODO: function body return Group::group_info_t(); @@ -18,6 +46,8 @@ Group::group_info_t Group::group_info(const CommonCode &common_code) { CommonCode Group::group_case(const Group::group_info_t &group_info) { + // TODO: check group info + // TODO: function body return CommonCode(0); diff --git a/src/klotski_core/group/type_id.h b/src/klotski_core/group/type_id.h index 8b558e9..7b4d1eb 100644 --- a/src/klotski_core/group/type_id.h +++ b/src/klotski_core/group/type_id.h @@ -18,6 +18,42 @@ const uint16_t TYPE_ID_INDEX[203] = { 1618, 1632, 1633, 1634, 1792, 1808, 1824, 1840, 1856, 1872, 1888, }; +const uint16_t TYPE_ID_GROUP_NUM[203] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 79, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 141, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 1, 1, 1, 1, 1, 1, + 1, 17, 273, 1, 1, 1, 1, 1, 1, 9, 145, 841, 1, 1, 1, 1, + 1, 1, 15, 97, 517, 1, 1, 1, 1, 1, 1, 1, 5, 91, 1, 1, + 1, 1, 1, 59, 587, 1, 1, 1, 1, 21, 353, 1741, 1, 1, 1, 7, + 81, 479, 2327, 1, 1, 1, 5, 33, 165, 1053, 1, 1, 1, 1, 1, 9, + 157, 1, 1, 1, 57, 505, 1, 1, 13, 325, 1729, 3, 9, 99, 631, 2609, + 1, 17, 91, 487, 2653, 1, 1, 11, 75, 898, 2, 2, 2, 2, 80, 1, + 2, 138, 14, 126, 590, 22, 183, 1074, 33, 209, 1178, 13, 171, 1185, 6, 16, + 214, 6, 18, 54, 2, 44, 40, 124, 84, 70, 18, +}; + +const uint16_t TYPE_ID_OFFSET[203] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 69, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 178, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 346, 347, 348, 349, 350, 351, 352, 353, 370, 643, + 644, 645, 646, 647, 648, 649, 658, 803, 1644, 1645, 1646, 1647, + 1648, 1649, 1650, 1665, 1762, 2279, 2280, 2281, 2282, 2283, 2284, 2285, + 2286, 2291, 2382, 2383, 2384, 2385, 2386, 2387, 2446, 3033, 3034, 3035, + 3036, 3037, 3058, 3411, 5152, 5153, 5154, 5155, 5162, 5243, 5722, 8049, + 8050, 8051, 8052, 8057, 8090, 8255, 9308, 9309, 9310, 9311, 9312, 9313, + 9322, 9479, 9480, 9481, 9482, 9539, 10044, 10045, 10046, 10059, 10384, 12113, + 12116, 12125, 12224, 12855, 15464, 15465, 15482, 15573, 16060, 18713, 18714, 18715, + 18726, 18801, 19699, 19701, 19703, 19705, 19707, 19787, 19788, 19790, 19928, 19942, + 20068, 20658, 20680, 20863, 21937, 21970, 22179, 23357, 23370, 23541, 24726, 24732, + 24748, 24962, 24968, 24986, 25040, 25042, 25086, 25126, 25250, 25334, 25404, +}; + const uint32_t TYPE_ID_SIZE[203] = { 12, 192, 1440, 6720, 21840, 52416, 96096, 137280, 154440, 137280, 96096, 52416, 21840, 6720, 1440, 124, 1736, 11284, 45136, 124124, 248248, 372372, 425568, 372372, @@ -38,7 +74,7 @@ const uint32_t TYPE_ID_SIZE[203] = { 11016, 270, 1080, 1620, 88, 180, 626, 772, 1036, 464, 342, }; -const uint32_t TYPE_ID_MAX_GROUP_SIZE[203] = { +const uint32_t TYPE_ID_GROUP_MAX_SIZE[203] = { 12, 192, 1440, 6720, 21840, 52416, 96096, 137280, 154440, 137280, 96096, 52416, 21840, 6720, 1440, 124, 1736, 11284, 45136, 124124, 248248, 372372, 425568, 372372, 248248, 124124, 45136, 10836, 132, 1848, 12012, 48048, 132132, 264264, 396396, 453024, @@ -58,20 +94,4 @@ const uint32_t TYPE_ID_MAX_GROUP_SIZE[203] = { 1532, 45, 66, 38, 44, 5, 82, 21, 23, 24, 21, }; -const uint16_t TYPE_ID_GROUP_NUM[203] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 3, 79, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 141, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 17, 1, 1, 1, 1, 1, 1, - 1, 17, 273, 1, 1, 1, 1, 1, 1, 9, 145, 841, 1, 1, 1, 1, - 1, 1, 15, 97, 517, 1, 1, 1, 1, 1, 1, 1, 5, 91, 1, 1, - 1, 1, 1, 59, 587, 1, 1, 1, 1, 21, 353, 1741, 1, 1, 1, 7, - 81, 479, 2327, 1, 1, 1, 5, 33, 165, 1053, 1, 1, 1, 1, 1, 9, - 157, 1, 1, 1, 57, 505, 1, 1, 13, 325, 1729, 3, 9, 99, 631, 2609, - 1, 17, 91, 487, 2653, 1, 1, 11, 75, 898, 2, 2, 2, 2, 80, 1, - 2, 138, 14, 126, 590, 22, 183, 1074, 33, 209, 1178, 13, 171, 1185, 6, 16, - 214, 6, 18, 54, 2, 44, 40, 124, 84, 70, 18, -}; - } // namespace klotski