11#ifndef EIGEN_TENSORSYMMETRY_TEMPLATEGROUPTHEORY_H
12#define EIGEN_TENSORSYMMETRY_TEMPLATEGROUPTHEORY_H
15#include "../InternalHeaderCheck.h"
21namespace group_theory {
123template <
template <
typename,
typename>
class Equality,
typename id,
typename L>
124struct strip_identities;
126template <
template <
typename,
typename>
class Equality,
typename id,
typename t,
typename... ts>
127struct strip_identities<Equality, id, type_list<t, ts...>> {
128 typedef std::conditional_t<
129 Equality<id, t>::value,
typename strip_identities<Equality, id, type_list<ts...>>::type,
130 typename concat<type_list<t>,
typename strip_identities<Equality, id, type_list<ts...>>::type>::type>
132 constexpr static int global_flags =
133 Equality<id, t>::global_flags | strip_identities<Equality, id, type_list<ts...>>::global_flags;
136template <
template <
typename,
typename>
class Equality,
typename id>
137struct strip_identities<Equality, id, type_list<>> {
138 typedef type_list<> type;
139 constexpr static int global_flags = 0;
155template <
template <
typename,
typename>
class Multiply,
template <
typename,
typename>
class Equality,
typename id,
156 typename g,
typename current_element,
typename elements,
157 bool dont_add_current_element
159struct dimino_first_step_elements_helper
160#ifndef EIGEN_PARSED_BY_DOXYGEN
162 public dimino_first_step_elements_helper<Multiply, Equality, id, g, typename Multiply<current_element, g>::type,
163 typename concat<elements, type_list<current_element>>::type,
164 Equality<typename Multiply<current_element, g>::type, id>::value> {
167template <
template <
typename,
typename>
class Multiply,
template <
typename,
typename>
class Equality,
typename id,
168 typename g,
typename current_element,
typename elements>
169struct dimino_first_step_elements_helper<Multiply, Equality, id, g, current_element, elements, true>
172 typedef elements type;
173 constexpr static int global_flags = Equality<current_element, id>::global_flags;
189template <
template <
typename,
typename>
class Multiply,
template <
typename,
typename>
class Equality,
typename id,
191struct dimino_first_step_elements {
192 typedef typename get<0, generators>::type first_generator;
193 typedef typename skip<1, generators>::type next_generators;
194 typedef type_list<first_generator> generators_done;
196 typedef dimino_first_step_elements_helper<Multiply, Equality, id, first_generator, first_generator, type_list<id>,
199 typedef typename helper::type type;
200 constexpr static int global_flags = helper::global_flags;
223template <
template <
typename,
typename>
class Multiply,
typename sub_group_elements,
typename new_coset_rep,
226struct dimino_get_coset_elements {
227 typedef typename apply_op_from_right<Multiply, new_coset_rep, sub_group_elements>::type type;
230template <
template <
typename,
typename>
class Multiply,
typename sub_group_elements,
typename new_coset_rep>
231struct dimino_get_coset_elements<Multiply, sub_group_elements, new_coset_rep, false> {
232 typedef type_list<> type;
249template <
template <
typename,
typename>
class Multiply,
template <
typename,
typename>
class Equality,
typename id,
250 typename sub_group_elements,
typename elements,
typename generators,
typename rep_element,
int sub_group_size>
251struct dimino_add_cosets_for_rep;
253template <
template <
typename,
typename>
class Multiply,
template <
typename,
typename>
class Equality,
typename id,
254 typename sub_group_elements,
typename elements,
typename g,
typename... gs,
typename rep_element,
256struct dimino_add_cosets_for_rep<Multiply, Equality, id, sub_group_elements, elements, type_list<g, gs...>, rep_element,
258 typedef typename Multiply<rep_element, g>::type new_coset_rep;
259 typedef contained_in_list_gf<Equality, new_coset_rep, elements> _cil;
260 constexpr static bool add_coset = !_cil::value;
263 typename dimino_get_coset_elements<Multiply, sub_group_elements, new_coset_rep, add_coset>::type coset_elements;
265 typedef dimino_add_cosets_for_rep<Multiply, Equality, id, sub_group_elements,
266 typename concat<elements, coset_elements>::type, type_list<gs...>, rep_element,
270 typedef typename _helper::type type;
271 constexpr static int global_flags = _cil::global_flags | _helper::global_flags;
281template <
template <
typename,
typename>
class Multiply,
template <
typename,
typename>
class Equality,
typename id,
282 typename sub_group_elements,
typename elements,
typename rep_element,
int sub_group_size>
283struct dimino_add_cosets_for_rep<Multiply, Equality, id, sub_group_elements, elements, type_list<>, rep_element,
285 typedef elements type;
286 constexpr static int global_flags = 0;
303template <
template <
typename,
typename>
class Multiply,
template <
typename,
typename>
class Equality,
typename id,
304 typename sub_group_elements,
typename elements,
typename generators,
int sub_group_size,
int rep_pos,
307struct dimino_add_all_coset_spaces {
308 typedef typename get<rep_pos, elements>::type rep_element;
309 typedef dimino_add_cosets_for_rep<Multiply, Equality, id, sub_group_elements, elements, generators, rep_element,
310 sub_group_elements::count>
312 typedef typename _ac4r::type new_elements;
314 constexpr static int new_rep_pos = rep_pos + sub_group_elements::count;
315 constexpr static bool new_stop_condition = new_rep_pos >= new_elements::count;
317 typedef dimino_add_all_coset_spaces<Multiply, Equality, id, sub_group_elements, new_elements, generators,
318 sub_group_size, new_rep_pos, new_stop_condition>
321 typedef typename _helper::type type;
322 constexpr static int global_flags = _helper::global_flags | _ac4r::global_flags;
325template <
template <
typename,
typename>
class Multiply,
template <
typename,
typename>
class Equality,
typename id,
326 typename sub_group_elements,
typename elements,
typename generators,
int sub_group_size,
int rep_pos>
327struct dimino_add_all_coset_spaces<Multiply, Equality, id, sub_group_elements, elements, generators, sub_group_size,
329 typedef elements type;
330 constexpr static int global_flags = 0;
345template <
template <
typename,
typename>
class Multiply,
template <
typename,
typename>
class Equality,
typename id,
346 typename elements,
typename generators_done,
typename current_generator,
349struct dimino_add_generator {
354 typedef typename apply_op_from_right<Multiply, current_generator, elements>::type multiplied_elements;
355 typedef typename concat<elements, multiplied_elements>::type new_elements;
357 constexpr static int rep_pos = elements::count;
359 typedef dimino_add_all_coset_spaces<
360 Multiply, Equality, id,
362 new_elements,
typename concat<generators_done, type_list<current_generator>>::type,
368 typedef typename _helper::type type;
369 constexpr static int global_flags = _helper::global_flags;
372template <
template <
typename,
typename>
class Multiply,
template <
typename,
typename>
class Equality,
typename id,
373 typename elements,
typename generators_done,
typename current_generator>
374struct dimino_add_generator<Multiply, Equality, id, elements, generators_done, current_generator, true> {
376 typedef elements type;
377 constexpr static int global_flags = 0;
392template <
template <
typename,
typename>
class Multiply,
template <
typename,
typename>
class Equality,
typename id,
393 typename generators_done,
typename remaining_generators,
typename elements>
394struct dimino_add_remaining_generators {
395 typedef typename get<0, remaining_generators>::type first_generator;
396 typedef typename skip<1, remaining_generators>::type next_generators;
398 typedef contained_in_list_gf<Equality, first_generator, elements> _cil;
400 typedef dimino_add_generator<Multiply, Equality, id, elements, generators_done, first_generator, _cil::value> _helper;
402 typedef typename _helper::type new_elements;
404 typedef dimino_add_remaining_generators<Multiply, Equality, id,
405 typename concat<generators_done, type_list<first_generator>>::type,
406 next_generators, new_elements>
409 typedef typename _next_iter::type type;
410 constexpr static int global_flags = _cil::global_flags | _helper::global_flags | _next_iter::global_flags;
413template <
template <
typename,
typename>
class Multiply,
template <
typename,
typename>
class Equality,
typename id,
414 typename generators_done,
typename elements>
415struct dimino_add_remaining_generators<Multiply, Equality, id, generators_done, type_list<>, elements> {
416 typedef elements type;
417 constexpr static int global_flags = 0;
434template <
template <
typename,
typename>
class Multiply,
template <
typename,
typename>
class Equality,
typename id,
435 typename generators,
int initial_global_flags = 0>
436struct enumerate_group_elements_noid {
437 typedef dimino_first_step_elements<Multiply, Equality, id, generators> first_step;
439 typedef dimino_add_remaining_generators<Multiply, Equality, id,
typename first_step::generators_done,
440 typename first_step::next_generators,
441 typename first_step::type
445 typedef typename _helper::type type;
446 constexpr static int global_flags = initial_global_flags | first_step::global_flags | _helper::global_flags;
450template <
template <
typename,
typename>
class Multiply,
template <
typename,
typename>
class Equality,
typename id,
451 int initial_global_flags>
452struct enumerate_group_elements_noid<Multiply, Equality, id, type_list<>, initial_global_flags> {
453 typedef type_list<id> type;
454 constexpr static int global_flags = initial_global_flags;
474template <
template <
typename,
typename>
class Multiply,
template <
typename,
typename>
class Equality,
typename id,
475 typename Generators_>
476struct enumerate_group_elements
477 :
public enumerate_group_elements_noid<Multiply, Equality, id,
478 typename strip_identities<Equality, id, Generators_>::type,
479 strip_identities<Equality, id, Generators_>::global_flags> {};
Namespace containing all symbols from the Eigen library.