Browse Source

perf: spawn groups of GroupUnion

master
Dnomd343 2 weeks ago
parent
commit
015a1191df
  1. 11
      src/core/benchmark/group.cc
  2. 4
      src/core/group/group.h
  3. 8
      src/core/group/internal/group.inl
  4. 119
      src/core/group/internal/group_union.inl

11
src/core/benchmark/group.cc

@ -250,17 +250,16 @@ static void RangesDerive(benchmark::State &state) {
static void SpawnGroups(benchmark::State &state) { static void SpawnGroups(benchmark::State &state) {
volatile auto val = 169; auto gu = GroupUnion::unsafe_create(169);
auto group_union = klotski::group::GroupUnion::create(val).value();
for (auto _ : state) { for (auto _ : state) {
volatile auto kk = group_union.groups(); volatile auto kk = gu.groups();
} }
} }
BENCHMARK(CommonCodeToTypeId)->Arg(8)->Arg(64)->Arg(256); // BENCHMARK(CommonCodeToTypeId)->Arg(8)->Arg(64)->Arg(256);
BENCHMARK(RawCodeToTypeId)->Arg(8)->Arg(64)->Arg(256); // BENCHMARK(RawCodeToTypeId)->Arg(8)->Arg(64)->Arg(256);
// BENCHMARK(GroupExtend)->Unit(benchmark::kMillisecond); // BENCHMARK(GroupExtend)->Unit(benchmark::kMillisecond);
@ -274,6 +273,6 @@ BENCHMARK(RawCodeToTypeId)->Arg(8)->Arg(64)->Arg(256);
// BENCHMARK(RangesDerive)->Unit(benchmark::kMillisecond); // BENCHMARK(RangesDerive)->Unit(benchmark::kMillisecond);
// BENCHMARK(SpawnGroups); BENCHMARK(SpawnGroups);
BENCHMARK_MAIN(); BENCHMARK_MAIN();

4
src/core/group/group.h

@ -253,15 +253,15 @@ public:
// ------------------------------------------------------------------------------------- // // ------------------------------------------------------------------------------------- //
private: private:
uint_fast8_t type_id_;
Toward toward_; Toward toward_;
uint_fast8_t type_id_;
uint_fast16_t pattern_id_; uint_fast16_t pattern_id_;
/// Tiled merge of type_id and pattern_id. /// Tiled merge of type_id and pattern_id.
[[nodiscard]] constexpr uint32_t flat_id() const; [[nodiscard]] constexpr uint32_t flat_id() const;
/// Hidden constructor called from unsafe_create. /// Hidden constructor called from unsafe_create.
constexpr Group(uint_fast8_t type_id, Toward toward, uint_fast16_t pattern_id); constexpr Group(Toward toward, uint_fast8_t type_id, uint_fast16_t pattern_id);
// ------------------------------------------------------------------------------------- // // ------------------------------------------------------------------------------------- //
}; };

8
src/core/group/internal/group.inl

@ -68,7 +68,7 @@ constexpr auto operator==(const Group &lhs, const Group &rhs) {
} }
constexpr Group Group::unsafe_create(uint_fast8_t type_id, uint_fast16_t pattern_id, Toward toward) { constexpr Group Group::unsafe_create(uint_fast8_t type_id, uint_fast16_t pattern_id, Toward toward) {
return {type_id, toward, pattern_id}; return {toward, type_id, pattern_id};
} }
constexpr std::optional<Group> Group::create(uint_fast8_t type_id, uint_fast16_t pattern_id, Toward toward) { constexpr std::optional<Group> Group::create(uint_fast8_t type_id, uint_fast16_t pattern_id, Toward toward) {
@ -98,10 +98,6 @@ inline Group Group::from_common_code(codec::CommonCode common_code) {
return from_raw_code(common_code.to_raw_code()); return from_raw_code(common_code.to_raw_code());
} }
constexpr Group::Group(uint_fast8_t type_id, Toward toward, uint_fast16_t pattern_id) { constexpr Group::Group(const Toward toward, const uint_fast8_t type_id, const uint_fast16_t pattern_id) : toward_(toward), type_id_(type_id), pattern_id_(pattern_id) {}
type_id_ = type_id;
pattern_id_ = pattern_id;
toward_ = toward;
}
} // namespace klotski::group } // namespace klotski::group

119
src/core/group/internal/group_union.inl

@ -2,6 +2,8 @@
#include <ranges> #include <ranges>
// TODO: include at group header
#include "constant/group.h"
#include "constant/group_union.h" #include "constant/group_union.h"
namespace klotski::group { namespace klotski::group {
@ -80,29 +82,100 @@ constexpr GroupUnion GroupUnion::from_common_code(const codec::CommonCode common
//} //}
constexpr std::vector<Group> GroupUnion::groups() const { constexpr std::vector<Group> GroupUnion::groups() const {
std::vector<Group> groups;
groups.reserve(group_num()); // std::vector<Group> groups;
for (uint32_t pattern_id = 0; pattern_id < pattern_num(); ++pattern_id) { // groups.reserve(group_num());
auto group = Group::unsafe_create(type_id_, pattern_id, Group::Toward::A); // for (uint32_t pattern_id = 0; pattern_id < pattern_num(); ++pattern_id) {
groups.emplace_back(group); // auto group = Group::unsafe_create(type_id_, pattern_id, Group::Toward::A);
switch (group.mirror_type()) { // groups.emplace_back(group);
case Group::MirrorType::Full: // switch (group.mirror_type()) {
continue; // case Group::MirrorType::Full:
case Group::MirrorType::Horizontal: // continue;
groups.emplace_back(Group::unsafe_create(type_id_, pattern_id, Group::Toward::C)); // case Group::MirrorType::Horizontal:
break; // groups.emplace_back(Group::unsafe_create(type_id_, pattern_id, Group::Toward::C));
case Group::MirrorType::Centro: // break;
case Group::MirrorType::Vertical: // case Group::MirrorType::Centro:
groups.emplace_back(Group::unsafe_create(type_id_, pattern_id, Group::Toward::B)); // case Group::MirrorType::Vertical:
break; // groups.emplace_back(Group::unsafe_create(type_id_, pattern_id, Group::Toward::B));
case Group::MirrorType::Ordinary: // break;
groups.emplace_back(Group::unsafe_create(type_id_, pattern_id, Group::Toward::B)); // case Group::MirrorType::Ordinary:
groups.emplace_back(Group::unsafe_create(type_id_, pattern_id, Group::Toward::C)); // groups.emplace_back(Group::unsafe_create(type_id_, pattern_id, Group::Toward::B));
groups.emplace_back(Group::unsafe_create(type_id_, pattern_id, Group::Toward::D)); // groups.emplace_back(Group::unsafe_create(type_id_, pattern_id, Group::Toward::C));
break; // groups.emplace_back(Group::unsafe_create(type_id_, pattern_id, Group::Toward::D));
} // break;
} // }
return groups; // }
// return groups;
// auto build = [this](const uint32_t pattern_id) -> std::vector<Group> {
// auto flat_id = PATTERN_OFFSET[type_id_] + pattern_id;
// auto mirror_type = static_cast<Group::MirrorType>(PATTERN_DATA[flat_id] & 0b111);
//
// switch (mirror_type) {
// case Group::MirrorType::Full:
// return {
// Group::unsafe_create(type_id_, pattern_id, Group::Toward::A),
// };
// case Group::MirrorType::Horizontal:
// return {
// Group::unsafe_create(type_id_, pattern_id, Group::Toward::A),
// Group::unsafe_create(type_id_, pattern_id, Group::Toward::C),
// };
// case Group::MirrorType::Centro:
// case Group::MirrorType::Vertical:
// return {
// Group::unsafe_create(type_id_, pattern_id, Group::Toward::A),
// Group::unsafe_create(type_id_, pattern_id, Group::Toward::B),
// };
// case Group::MirrorType::Ordinary:
// return {
// Group::unsafe_create(type_id_, pattern_id, Group::Toward::A),
// Group::unsafe_create(type_id_, pattern_id, Group::Toward::B),
// Group::unsafe_create(type_id_, pattern_id, Group::Toward::C),
// Group::unsafe_create(type_id_, pattern_id, Group::Toward::D),
// };
// }
// };
//
// return std::views::iota(0U, pattern_num())
// | std::views::transform(build)
// | std::views::join
// | std::ranges::to<std::vector>();
// std::vector<Group> groups;
// groups.reserve(group_num());
auto begin = GROUP_OFFSET[type_id_];
auto end = begin + group_num();
auto build = [this](uint32_t kk) {
auto raw = GROUP_DATA[kk];
uint32_t pattern_id = (raw >> 2) & 0b1111111111;
uint32_t toward = raw & 0b11;
return Group::unsafe_create(type_id_, pattern_id, (Group::Toward)toward);
};
return std::views::iota(begin, end) | std::views::transform(build) | std::ranges::to<std::vector>();
// auto build = [this](uint64_t raw) {
// uint32_t pattern_id = (raw >> 2) & 0b1111111111;
// uint32_t toward = raw & 0b11;
// return Group::unsafe_create(type_id_, pattern_id, (Group::Toward)toward);
// };
// return GROUP_DATA | std::views::drop(GROUP_OFFSET[type_id_]) | std::views::take(group_num()) | std::views::transform(build) | std::ranges::to<std::vector>();
// return std::ranges::subrange(GROUP_DATA.begin() + begin, GROUP_DATA.begin() + begin + group_num()) | std::views::transform(build) | std::ranges::to<std::vector>();
// for (auto i = begin; i < end; ++i) {
// auto raw = GROUP_DATA[i];
// uint32_t pattern_id = (raw >> 2) & 0b1111111111;
// uint32_t toward = raw & 0b11;
// auto group = Group::unsafe_create(type_id_, pattern_id, (Group::Toward)toward);
// groups.emplace_back(group);
// }
//
// return groups;
} }
constexpr std::optional<std::vector<Group>> GroupUnion::groups(const uint_fast16_t pattern_id) const { constexpr std::optional<std::vector<Group>> GroupUnion::groups(const uint_fast16_t pattern_id) const {

Loading…
Cancel
Save