Browse Source

perf: obtain groups from pattern_id

master
Dnomd343 2 weeks ago
parent
commit
67bd892bc5
  1. 7
      src/core/benchmark/group.cc
  2. 3
      src/core/group/group.h
  3. 2
      src/core/group/internal/group_union.cc
  4. 154
      src/core/group/internal/group_union.inl
  5. 2
      src/core/utils/utility.h

7
src/core/benchmark/group.cc

@ -253,7 +253,12 @@ static void SpawnGroups(benchmark::State &state) {
auto gu = GroupUnion::unsafe_create(169); auto gu = GroupUnion::unsafe_create(169);
for (auto _ : state) { for (auto _ : state) {
volatile auto kk = gu.groups(); // volatile auto kk = gu.groups();
for (auto pattern_id = 0; pattern_id < gu.pattern_num(); ++pattern_id) {
volatile auto kk = gu.groups(pattern_id);
}
} }
} }

3
src/core/group/group.h

@ -70,6 +70,9 @@
#include "short_code/short_code.h" #include "short_code/short_code.h"
#include "common_code/common_code.h" #include "common_code/common_code.h"
#include "internal/constant/group.h"
#include "internal/constant/group_union.h"
namespace klotski::group { namespace klotski::group {
class Group; class Group;

2
src/core/group/internal/group_union.cc

@ -2,8 +2,6 @@
#include "constant/group_union.h" #include "constant/group_union.h"
using klotski::cases::Ranges; using klotski::cases::Ranges;
using klotski::codec::RawCode;
using klotski::codec::CommonCode;
using klotski::group::GroupUnion; using klotski::group::GroupUnion;
using klotski::cases::RangesUnion; using klotski::cases::RangesUnion;

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

@ -2,10 +2,6 @@
#include <ranges> #include <ranges>
// TODO: include at group header
#include "constant/group.h"
#include "constant/group_union.h"
namespace klotski::group { namespace klotski::group {
// ----------------------------------------------------------------------------------------- // // ----------------------------------------------------------------------------------------- //
@ -72,136 +68,50 @@ constexpr GroupUnion GroupUnion::from_common_code(const codec::CommonCode common
// ----------------------------------------------------------------------------------------- // // ----------------------------------------------------------------------------------------- //
//inline std::vector<Group> GroupUnion::groups() const { constexpr auto GroupUnion::groups() const -> Groups {
// auto build = [this](const uint32_t group_id) { auto build = [this](size_t offset) {
// return Group::unsafe_create(type_id_, group_id); const auto raw = GROUP_DATA[offset];
// }; const uint_fast16_t pattern_id = (raw >> 2) & 0x3FF;
// return std::views::iota(0U, group_num()) const auto toward = static_cast<Group::Toward>(raw & 0b11);
// | std::views::transform(build) return Group::unsafe_create(type_id_, pattern_id, toward);
// | std::ranges::to<std::vector>();
//}
constexpr std::vector<Group> GroupUnion::groups() const {
// std::vector<Group> groups;
// groups.reserve(group_num());
// for (uint32_t pattern_id = 0; pattern_id < pattern_num(); ++pattern_id) {
// auto group = Group::unsafe_create(type_id_, pattern_id, Group::Toward::A);
// groups.emplace_back(group);
// switch (group.mirror_type()) {
// case Group::MirrorType::Full:
// continue;
// case Group::MirrorType::Horizontal:
// groups.emplace_back(Group::unsafe_create(type_id_, pattern_id, Group::Toward::C));
// break;
// case Group::MirrorType::Centro:
// case Group::MirrorType::Vertical:
// groups.emplace_back(Group::unsafe_create(type_id_, pattern_id, Group::Toward::B));
// break;
// case Group::MirrorType::Ordinary:
// 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::C));
// groups.emplace_back(Group::unsafe_create(type_id_, pattern_id, Group::Toward::D));
// break;
// }
// }
// 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);
}; };
const auto offset = GROUP_OFFSET[type_id_];
return std::views::iota(begin, end) | std::views::transform(build) | std::ranges::to<std::vector>(); return std::views::iota(offset, offset + group_num())
| 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 auto GroupUnion::groups(const uint_fast16_t pattern_id) const -> std::optional<Groups> {
if (pattern_id >= pattern_num()) { if (pattern_id >= pattern_num()) {
return std::nullopt; return std::nullopt;
} }
std::vector<Group> groups;
auto group = Group::unsafe_create(type_id_, pattern_id, Group::Toward::A); auto flat_id = PATTERN_OFFSET[type_id_] + pattern_id;
groups.emplace_back(group); switch (static_cast<Group::MirrorType>(PATTERN_DATA[flat_id] & 0b111)) {
switch (group.mirror_type()) {
case Group::MirrorType::Full: case Group::MirrorType::Full:
break; return Groups {
Group::unsafe_create(type_id_, pattern_id, Group::Toward::A),
};
case Group::MirrorType::Horizontal: case Group::MirrorType::Horizontal:
groups.emplace_back(Group::unsafe_create(type_id_, pattern_id, Group::Toward::C)); return Groups {
break; 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::Centro:
case Group::MirrorType::Vertical: case Group::MirrorType::Vertical:
groups.emplace_back(Group::unsafe_create(type_id_, pattern_id, Group::Toward::B)); return Groups {
break; Group::unsafe_create(type_id_, pattern_id, Group::Toward::A),
Group::unsafe_create(type_id_, pattern_id, Group::Toward::B),
};
case Group::MirrorType::Ordinary: case Group::MirrorType::Ordinary:
groups.emplace_back(Group::unsafe_create(type_id_, pattern_id, Group::Toward::B)); return Groups {
groups.emplace_back(Group::unsafe_create(type_id_, pattern_id, Group::Toward::C)); Group::unsafe_create(type_id_, pattern_id, Group::Toward::A),
groups.emplace_back(Group::unsafe_create(type_id_, pattern_id, Group::Toward::D)); Group::unsafe_create(type_id_, pattern_id, Group::Toward::B),
break; Group::unsafe_create(type_id_, pattern_id, Group::Toward::C),
Group::unsafe_create(type_id_, pattern_id, Group::Toward::D),
};
} }
return groups; KLSK_UNREACHABLE;
} }
// ----------------------------------------------------------------------------------------- // // ----------------------------------------------------------------------------------------- //

2
src/core/utils/utility.h

@ -29,6 +29,8 @@
#define KLSK_ASSUME(expr) [[assume(expr)]] #define KLSK_ASSUME(expr) [[assume(expr)]]
#endif #endif
#define KLSK_UNREACHABLE __builtin_unreachable() // TODO: using `std::unreachable`
/// Force function declaration to be inline. /// Force function declaration to be inline.
#define KLSK_INLINE __attribute__ ((always_inline)) #define KLSK_INLINE __attribute__ ((always_inline))
#define KLSK_INLINE_CE KLSK_INLINE constexpr #define KLSK_INLINE_CE KLSK_INLINE constexpr

Loading…
Cancel
Save