12#include <unordered_map>
14namespace uni20::detail
18class SymmetryFactorBase {
20 virtual ~SymmetryFactorBase() =
default;
24 virtual auto type_name() const ->
std::string_view = 0;
29 virtual auto dual_code(
std::uint64_t code) const ->
std::uint64_t = 0;
34 virtual auto qdim_code(
std::uint64_t code) const ->
double = 0;
39 virtual auto degree_code(
std::uint64_t code) const ->
int = 0;
45 virtual auto add_codes(
std::uint64_t lhs,
std::uint64_t rhs) const ->
std::uint64_t = 0;
50 virtual auto format_code(
std::uint64_t code) const ->
std::
string = 0;
55template <typename Q> struct SymmetryFactorTraits;
59template <typename Q> class SymmetryFactor final : public SymmetryFactorBase {
64 auto encode(Q
const&
value)
const -> std::uint64_t {
return SymmetryFactorTraits<Q>::encode(
value); }
69 auto decode(std::uint64_t code)
const -> Q {
return SymmetryFactorTraits<Q>::decode(code); }
73 auto type_name() const ->
std::string_view
override {
return SymmetryFactorTraits<Q>::type_name(); }
78 auto dual_code(std::uint64_t code)
const -> std::uint64_t
override
80 return this->encode(
dual(this->decode(code)));
86 auto qdim_code(std::uint64_t code)
const ->
double override {
return qdim(this->decode(code)); }
91 auto degree_code(std::uint64_t code)
const ->
int override {
return degree(this->decode(code)); }
97 auto add_codes(std::uint64_t lhs, std::uint64_t rhs)
const -> std::uint64_t
override
99 return this->encode(this->decode(lhs) + this->decode(rhs));
105 auto format_code(std::uint64_t code)
const -> std::string
override {
return to_string(this->decode(code)); }
110inline auto symmetry_factor_registry() -> std::unordered_map<std::string, SymmetryFactorBase const*>&
112 static std::unordered_map<std::string, SymmetryFactorBase const*> registry;
119inline auto register_symmetry_factor(SymmetryFactorBase
const* factor) -> SymmetryFactorBase
const*
121 symmetry_factor_registry().emplace(std::string{factor->type_name()}, factor);
128inline auto find_symmetry_factor(std::string_view type_name) -> SymmetryFactorBase
const*
130 auto const it = symmetry_factor_registry().find(std::string{type_name});
131 if (it == symmetry_factor_registry().end())
133 throw std::invalid_argument(
"unsupported symmetry factor type: " + std::string{type_name});
locale_t value
Definition data_table.cpp:49
auto degree(QNum const &q) -> int
Return the integral degree of a quantum number.
Definition qnum.hpp:270
auto qdim(QNum const &q) -> double
Return the quantum dimension of a quantum number.
Definition qnum.hpp:255
auto dual(SpaceType const &space) -> Dual< std::remove_cvref_t< SpaceType > >
Construct an explicitly dual basis without changing occurrence order.
Definition dual_space.hpp:244
auto to_string(basic_half_int< T > value) -> std::string
Format a half-integer as an integer or decimal .5.
Definition half_int.hpp:477