26 #ifndef TILEDARRAY_SYMM_REPRESENTATION_H__INCLUDED 27 #define TILEDARRAY_SYMM_REPRESENTATION_H__INCLUDED 46 template <
typename Group,
typename Representative>
62 generator_representatives_(
std::move(generator_reps))
65 init(generator_representatives_, element_representatives_);
70 return element_representatives_.size();
75 std::shared_ptr<group_type>
group()
const {
78 std::vector<element_type> generators;
79 generators.reserve(generator_representatives_.size());
80 for(
const auto& g_op_pair: generator_representatives_) {
81 generators.emplace_back(g_op_pair.first);
84 return std::make_shared<group_type>(std::move(generators));
88 return element_representatives_;
92 std::shared_ptr<group_type> g_;
93 std::map<element_type,representative_type> generator_representatives_;
94 std::map<element_type,representative_type> element_representatives_;
97 static void init(std::map<element_type,representative_type>& generator_reps,
98 std::map<element_type,representative_type>& element_reps) {
106 element_reps = generator_reps;
113 std::vector<element_type> elements;
114 for(
const auto& eop: element_reps)
115 elements.push_back(eop.first);
117 for(
size_t i = 0; i < elements.size(); ++i) {
118 auto e = std::cref(elements[i]);
119 auto e_op = std::cref(element_reps[e]);
120 for(
const auto& g_op_pair: generator_reps) {
121 const auto& g = g_op_pair.first;
122 const auto& g_op = g_op_pair.second;
124 if(element_reps.find(h) == element_reps.end()) {
125 auto h_op = e_op.get() * g_op;
126 element_reps[h] = h_op;
127 const auto orig_elements_capacity = elements.capacity();
128 elements.emplace_back(std::move(h));
130 if (orig_elements_capacity != elements.capacity()) {
131 e = std::cref(elements[i]);
132 e_op = std::cref(element_reps[e]);
Representation(std::map< element_type, representative_type > generator_reps)
Construct Representation from a set of {generator,operator} pairs construct operator representation o...
const std::map< element_type, representative_type > & representatives() const
Representation & operator=(const Representation &)=default
std::shared_ptr< group_type > group() const
Representative representative_type
T identity()
identity for group of objects of type T
size_t order() const
the order of the representation = the order of the group
typename Group::element_type element_type