From 0aa9c2957016bcbc426445a44ad9444143d34637 Mon Sep 17 00:00:00 2001 From: Dnomd343 Date: Sat, 22 Feb 2025 16:21:59 +0800 Subject: [PATCH] update: cleanup the group extend code --- src/core/group/internal/group.cc | 155 +++++++++++++++---------------- 1 file changed, 75 insertions(+), 80 deletions(-) diff --git a/src/core/group/internal/group.cc b/src/core/group/internal/group.cc index 8b6c86d..b91d26f 100644 --- a/src/core/group/internal/group.cc +++ b/src/core/group/internal/group.cc @@ -17,106 +17,125 @@ using klotski::mover::MaskMover; using klotski::group::GROUP_DATA; using klotski::group::PATTERN_DATA; -template -KLSK_NOINLINE static void group_extend(RawCode seed, const size_t reserve, MFunc add_mirror, RFunc release) { - std::vector codes; - std::vector mirrors; - phmap::flat_hash_map cases; // +template +KLSK_NOINLINE static void extend(RawCode seed, const size_t size, MF add_mirror, RF release) { + std::vector queue, mirrors; + phmap::flat_hash_map cases; - codes.reserve(reserve); - mirrors.reserve(reserve); // TODO: cal max size-coff - cases.reserve(static_cast(reserve * 1.56)); + queue.reserve(size); mirrors.reserve(size); + cases.reserve(static_cast(static_cast(size) * 1.56)); // reduce load factor - auto core = MaskMover([&codes, &cases, &mirrors, add_mirror](RawCode code, uint64_t hint) { + auto mover = MaskMover([&queue, &cases, &mirrors, add_mirror](RawCode code, uint64_t hint) { if (const auto [iter, ret] = cases.try_emplace(code, hint); !ret) { iter->second |= hint; // update hint return; } - codes.emplace_back(code); + queue.emplace_back(code); add_mirror(code, [&cases, &mirrors](RawCode mirror) { - cases.emplace(mirror, 0); + cases.emplace(mirror, 0); // without hint mirrors.emplace_back(mirror); }); }); - uint64_t offset = 0; - codes.emplace_back(seed); - cases.emplace(seed, 0); // without hint + queue.emplace_back(seed); + cases.emplace(seed, 0); add_mirror(seed, [&mirrors, &cases](RawCode mirror) { - cases.emplace(mirror, 0); + cases.emplace(mirror, 0); // without hint mirrors.emplace_back(mirror); }); - while (offset != codes.size()) { - const auto curr = codes[offset++]; - core.next_cases(curr, cases.find(curr)->second); - } - for (const auto code : codes) { - release(code); - } - for (const auto code : mirrors) { - release(code); + size_t offset = 0; + while (offset != queue.size()) { + const auto curr = queue[offset++]; + mover.next_cases(curr, cases.find(curr)->second); } + for (const auto code : queue) { release(code); } + for (const auto code : mirrors) { release(code); } } static RangesUnion extend_type_common(RawCode seed, size_t reserve) { - RangesUnion result {}; - group_extend(seed, reserve, [](RawCode, auto) {}, [&result](RawCode code) { - const auto common_code = code.to_common_code().unwrap(); - result.ranges(common_code >> 32).emplace_back(static_cast(common_code)); + RangesUnion data {}; + extend(seed, reserve, [](RawCode, auto) {}, [&data](const RawCode raw_code) { + const auto code = raw_code.to_common_code().unwrap(); + data.ranges(code >> 32).emplace_back(static_cast(code)); }); - return result; + return data; } static RangesUnion extend_type_hor(RawCode seed, size_t reserve) { - RangesUnion result {}; - group_extend(seed, reserve, [](const RawCode code, auto callback) { + + // size_t size_a = static_cast(static_cast(size) * 0.500892) + 11; + // size_t size_b = static_cast(static_cast(size) * 0.499108) + 10; + + RangesUnion data {}; + + // TODO: how to reserve + // size_t val = reserve / 8; + // + // data.ranges(0).reserve(val); + // data.ranges(1).reserve(val); + // data.ranges(2).reserve(val); + // + // data.ranges(4).reserve(val); + // data.ranges(5).reserve(val); + // data.ranges(6).reserve(val); + // + // data.ranges(8).reserve(val); + // data.ranges(9).reserve(val); + // data.ranges(10).reserve(val); + // + // data.ranges(12).reserve(val); + // data.ranges(13).reserve(val); + // data.ranges(14).reserve(val); + + extend(seed, reserve, [](const RawCode code, auto callback) { if (const auto mirror = code.to_horizontal_mirror(); mirror != code) { callback(mirror); } - }, [&result](RawCode code) { - const auto common_code = code.to_common_code().unwrap(); - result.ranges(common_code >> 32).emplace_back(static_cast(common_code)); + }, [&data](const RawCode raw_code) { + const auto code = raw_code.to_common_code().unwrap(); + data.ranges(code >> 32).emplace_back(static_cast(code)); }); - return result; + + return data; } static RangesUnion extend_type_ver(RawCode seed, size_t reserve) { - RangesUnion result {}; - group_extend(seed, reserve, [](const RawCode code, auto callback) { + RangesUnion data {}; + extend(seed, reserve, [](const RawCode code, auto callback) { callback(code.to_vertical_mirror()); - }, [&result](RawCode code) { - const auto common_code = code.to_common_code().unwrap(); - result.ranges(common_code >> 32).emplace_back(static_cast(common_code)); + }, [&data](const RawCode raw_code) { + const auto code = raw_code.to_common_code().unwrap(); + data.ranges(code >> 32).emplace_back(static_cast(code)); }); - return result; + return data; } static RangesUnion extend_type_diag(RawCode seed, size_t reserve) { - RangesUnion result {}; - group_extend(seed, reserve, [](const RawCode code, auto callback) { + RangesUnion data {}; + extend(seed, reserve, [](const RawCode code, auto callback) { callback(code.to_diagonal_mirror()); - }, [&result](RawCode code) { - const auto common_code = code.to_common_code().unwrap(); - result.ranges(common_code >> 32).emplace_back(static_cast(common_code)); + }, [&data](const RawCode raw_code) { + const auto code = raw_code.to_common_code().unwrap(); + data.ranges(code >> 32).emplace_back(static_cast(code)); }); - return result; + return data; } static RangesUnion extend_type_x(RawCode seed, size_t reserve) { - RangesUnion result {}; - group_extend(seed, reserve, [](const RawCode code, auto callback) { + RangesUnion data {}; + extend(seed, reserve, [](const RawCode code, auto callback) { const auto mirror_1 = code.to_vertical_mirror(); callback(mirror_1); if (const auto mirror_2 = code.to_horizontal_mirror(); mirror_2 != code) { callback(mirror_2); callback(mirror_1.to_horizontal_mirror()); } - }, [&result](RawCode code) { - const auto common_code = code.to_common_code().unwrap(); - result.ranges(common_code >> 32).emplace_back(static_cast(common_code)); + }, [&data](const RawCode raw_code) { + const auto code = raw_code.to_common_code().unwrap(); + data.ranges(code >> 32).emplace_back(static_cast(code)); }); - return result; + return data; } template @@ -163,25 +182,14 @@ KLSK_NOINLINE static void spawn_pattern(RawCode seed, const size_t reserve, MFun } KLSK_NOINLINE static void spawn_full_pattern(RawCode seed, const size_t reserve, RangesUnion &output) { - spawn_pattern(seed, reserve, [](const RawCode code, auto callback) { - // const auto mirror_1 = code.to_vertical_mirror(); - // callback(mirror_1); - // if (const auto mirror_2 = code.to_horizontal_mirror(); mirror_2 != code) { - // callback(mirror_2); - // callback(mirror_1.to_horizontal_mirror()); - // } - }, [&output](RawCode raw_code) { + spawn_pattern(seed, reserve, [](RawCode, auto) {}, [&output](RawCode raw_code) { const auto code = raw_code.to_common_code().unwrap(); output.ranges(code >> 32).emplace_back(static_cast(code)); }); } KLSK_NOINLINE static void spawn_hor_pattern(RawCode seed, const size_t reserve, RangesUnion &output) { - spawn_pattern(seed, reserve, [](const RawCode code, auto callback) { - // if (const auto mirror = code.to_horizontal_mirror(); mirror != code) { - // callback(mirror); - // } - }, [&output](RawCode raw_code) { + spawn_pattern(seed, reserve, [](RawCode, auto) {}, [&output](RawCode raw_code) { const auto code = raw_code.to_common_code().unwrap(); output.ranges(code >> 32).emplace_back(static_cast(code)); @@ -191,9 +199,7 @@ KLSK_NOINLINE static void spawn_hor_pattern(RawCode seed, const size_t reserve, } KLSK_NOINLINE static void spawn_ver_pattern(RawCode seed, const size_t reserve, RangesUnion &output) { - spawn_pattern(seed, reserve, [](const RawCode code, auto callback) { - // callback(code.to_vertical_mirror()); - }, [&output](RawCode raw_code) { + spawn_pattern(seed, reserve, [](RawCode, auto) {}, [&output](RawCode raw_code) { const auto code = raw_code.to_common_code().unwrap(); output.ranges(code >> 32).emplace_back(static_cast(code)); @@ -204,17 +210,6 @@ KLSK_NOINLINE static void spawn_ver_pattern(RawCode seed, const size_t reserve, KLSK_NOINLINE static void spawn_ord_pattern(RawCode seed, const size_t reserve, RangesUnion &output) { spawn_pattern(seed, reserve, [](RawCode, auto) {}, [&output](RawCode raw_code) { - - // auto add_case = [&output](RawCode r_code) { - // const auto code = r_code.to_common_code().unwrap(); - // output.ranges(code >> 32).emplace_back(static_cast(code)); - // }; - // - // add_case(raw_code); - // add_case(raw_code.to_vertical_mirror()); - // add_case(raw_code.to_horizontal_mirror()); - // add_case(raw_code.to_diagonal_mirror()); - const auto code = raw_code.to_common_code().unwrap(); output.ranges(code >> 32).emplace_back(static_cast(code));