10 #ifndef EIGEN_CXX11_TENSORSYMMETRY_TEMPLATEGROUPTHEORY_H 11 #define EIGEN_CXX11_TENSORSYMMETRY_TEMPLATEGROUPTHEORY_H 17 namespace group_theory {
119 template<
template<
typename,
typename>
class Equality,
typename id,
typename L>
struct strip_identities;
122 template<
typename,
typename>
class Equality,
127 struct strip_identities<Equality, id, type_list<t, ts...>>
129 typedef typename conditional<
130 Equality<id, t>::value,
131 typename strip_identities<Equality, id, type_list<ts...>>::type,
132 typename concat<type_list<t>,
typename strip_identities<Equality, id, type_list<ts...>>::type>::type
134 constexpr
static int global_flags = Equality<id, t>::global_flags | strip_identities<Equality, id, type_list<ts...>>::global_flags;
138 template<
typename,
typename>
class Equality,
140 EIGEN_TPL_PP_SPEC_HACK_DEFC(
typename, ts)
142 struct strip_identities<Equality, id, type_list<EIGEN_TPL_PP_SPEC_HACK_USE(ts)>>
144 typedef type_list<> type;
145 constexpr
static int global_flags = 0;
162 template<
typename,
typename>
class Multiply,
163 template<
typename,
typename>
class Equality,
166 typename current_element,
168 bool dont_add_current_element
170 struct dimino_first_step_elements_helper
171 #ifndef EIGEN_PARSED_BY_DOXYGEN
173 public dimino_first_step_elements_helper<
178 typename Multiply<current_element, g>::type,
179 typename concat<elements, type_list<current_element>>::type,
180 Equality<typename Multiply<current_element, g>::type, id>::value
184 template<
typename,
typename>
class Multiply,
185 template<
typename,
typename>
class Equality,
188 typename current_element,
191 struct dimino_first_step_elements_helper<Multiply, Equality, id, g, current_element, elements, true>
194 typedef elements type;
195 constexpr
static int global_flags = Equality<current_element, id>::global_flags;
212 template<
typename,
typename>
class Multiply,
213 template<
typename,
typename>
class Equality,
217 struct dimino_first_step_elements
219 typedef typename get<0, generators>::type first_generator;
220 typedef typename skip<1, generators>::type next_generators;
221 typedef type_list<first_generator> generators_done;
223 typedef dimino_first_step_elements_helper<
232 typedef typename helper::type type;
233 constexpr
static int global_flags = helper::global_flags;
257 template<
typename,
typename>
class Multiply,
258 typename sub_group_elements,
259 typename new_coset_rep,
262 struct dimino_get_coset_elements
264 typedef typename apply_op_from_right<Multiply, new_coset_rep, sub_group_elements>::type type;
268 template<
typename,
typename>
class Multiply,
269 typename sub_group_elements,
270 typename new_coset_rep
272 struct dimino_get_coset_elements<Multiply, sub_group_elements, new_coset_rep, false>
274 typedef type_list<> type;
292 template<
typename,
typename>
class Multiply,
293 template<
typename,
typename>
class Equality,
295 typename sub_group_elements,
298 typename rep_element,
301 struct dimino_add_cosets_for_rep;
304 template<
typename,
typename>
class Multiply,
305 template<
typename,
typename>
class Equality,
307 typename sub_group_elements,
311 typename rep_element,
314 struct dimino_add_cosets_for_rep<Multiply, Equality, id, sub_group_elements, elements, type_list<g, gs...>, rep_element, sub_group_size>
316 typedef typename Multiply<rep_element, g>::type new_coset_rep;
317 typedef contained_in_list_gf<Equality, new_coset_rep, elements> _cil;
318 constexpr
static bool add_coset = !_cil::value;
320 typedef typename dimino_get_coset_elements<
325 >::type coset_elements;
327 typedef dimino_add_cosets_for_rep<
332 typename concat<elements, coset_elements>::type,
338 typedef typename _helper::type type;
339 constexpr
static int global_flags = _cil::global_flags | _helper::global_flags;
350 template<
typename,
typename>
class Multiply,
351 template<
typename,
typename>
class Equality,
353 typename sub_group_elements,
355 EIGEN_TPL_PP_SPEC_HACK_DEFC(
typename, empty),
356 typename rep_element,
359 struct dimino_add_cosets_for_rep<Multiply, Equality, id, sub_group_elements, elements, type_list<EIGEN_TPL_PP_SPEC_HACK_USE(empty)>, rep_element, sub_group_size>
361 typedef elements type;
362 constexpr
static int global_flags = 0;
380 template<
typename,
typename>
class Multiply,
381 template<
typename,
typename>
class Equality,
383 typename sub_group_elements,
390 struct dimino_add_all_coset_spaces
392 typedef typename get<rep_pos, elements>::type rep_element;
393 typedef dimino_add_cosets_for_rep<
401 sub_group_elements::count
403 typedef typename _ac4r::type new_elements;
405 constexpr
static int new_rep_pos = rep_pos + sub_group_elements::count;
406 constexpr
static bool new_stop_condition = new_rep_pos >= new_elements::count;
408 typedef dimino_add_all_coset_spaces<
420 typedef typename _helper::type type;
421 constexpr
static int global_flags = _helper::global_flags | _ac4r::global_flags;
425 template<
typename,
typename>
class Multiply,
426 template<
typename,
typename>
class Equality,
428 typename sub_group_elements,
434 struct dimino_add_all_coset_spaces<Multiply, Equality, id, sub_group_elements, elements, generators, sub_group_size, rep_pos, true>
436 typedef elements type;
437 constexpr
static int global_flags = 0;
453 template<
typename,
typename>
class Multiply,
454 template<
typename,
typename>
class Equality,
457 typename generators_done,
458 typename current_generator,
461 struct dimino_add_generator
467 typedef typename apply_op_from_right<Multiply, current_generator, elements>::type multiplied_elements;
468 typedef typename concat<elements, multiplied_elements>::type new_elements;
470 constexpr
static int rep_pos = elements::count;
472 typedef dimino_add_all_coset_spaces<
478 typename concat<generators_done, type_list<current_generator>>::type,
483 typedef typename _helper::type type;
484 constexpr
static int global_flags = _helper::global_flags;
488 template<
typename,
typename>
class Multiply,
489 template<
typename,
typename>
class Equality,
492 typename generators_done,
493 typename current_generator
495 struct dimino_add_generator<Multiply, Equality, id, elements, generators_done, current_generator, true>
498 typedef elements type;
499 constexpr
static int global_flags = 0;
515 template<
typename,
typename>
class Multiply,
516 template<
typename,
typename>
class Equality,
518 typename generators_done,
519 typename remaining_generators,
522 struct dimino_add_remaining_generators
524 typedef typename get<0, remaining_generators>::type first_generator;
525 typedef typename skip<1, remaining_generators>::type next_generators;
527 typedef contained_in_list_gf<Equality, first_generator, elements> _cil;
529 typedef dimino_add_generator<
539 typedef typename _helper::type new_elements;
541 typedef dimino_add_remaining_generators<
545 typename concat<generators_done, type_list<first_generator>>::type,
550 typedef typename _next_iter::type type;
551 constexpr
static int global_flags =
553 _helper::global_flags |
554 _next_iter::global_flags;
558 template<
typename,
typename>
class Multiply,
559 template<
typename,
typename>
class Equality,
561 typename generators_done,
564 struct dimino_add_remaining_generators<Multiply, Equality, id, generators_done, type_list<>, elements>
566 typedef elements type;
567 constexpr
static int global_flags = 0;
585 template<
typename,
typename>
class Multiply,
586 template<
typename,
typename>
class Equality,
589 int initial_global_flags = 0
591 struct enumerate_group_elements_noid
593 typedef dimino_first_step_elements<Multiply, Equality, id, generators> first_step;
594 typedef typename first_step::type first_step_elements;
596 typedef dimino_add_remaining_generators<
600 typename first_step::generators_done,
601 typename first_step::next_generators,
602 typename first_step::type
605 typedef typename _helper::type type;
606 constexpr
static int global_flags =
607 initial_global_flags |
608 first_step::global_flags |
609 _helper::global_flags;
614 template<
typename,
typename>
class Multiply,
615 template<
typename,
typename>
class Equality,
617 int initial_global_flags
619 struct enumerate_group_elements_noid<Multiply, Equality, id, type_list<>, initial_global_flags>
621 typedef type_list<id> type;
622 constexpr
static int global_flags = initial_global_flags;
643 template<
typename,
typename>
class Multiply,
644 template<
typename,
typename>
class Equality,
648 struct enumerate_group_elements
649 :
public enumerate_group_elements_noid<
653 typename strip_identities<Equality, id, _generators>::type,
654 strip_identities<Equality, id, _generators>::global_flags
665 #endif // EIGEN_CXX11_TENSORSYMMETRY_TEMPLATEGROUPTHEORY_H Namespace containing all symbols from the Eigen library.