10#ifndef EIGEN_CXX11_TENSORSYMMETRY_TEMPLATEGROUPTHEORY_H
11#define EIGEN_CXX11_TENSORSYMMETRY_TEMPLATEGROUPTHEORY_H
14#include "../InternalHeaderCheck.h"
20namespace group_theory {
122template <
template <
typename,
typename>
class Equality,
typename id,
typename L>
123struct strip_identities;
125template <
template <
typename,
typename>
class Equality,
typename id,
typename t,
typename... ts>
126struct strip_identities<Equality, id, type_list<t, ts...>> {
127 typedef std::conditional_t<
128 Equality<id, t>::value,
typename strip_identities<Equality, id, type_list<ts...>>::type,
129 typename concat<type_list<t>,
typename strip_identities<Equality, id, type_list<ts...>>::type>::type>
131 constexpr static int global_flags =
132 Equality<id, t>::global_flags | strip_identities<Equality, id, type_list<ts...>>::global_flags;
135template <
template <
typename,
typename>
class Equality,
typename id EIGEN_TPL_PP_SPEC_HACK_DEFC(
typename, ts)>
136struct strip_identities<Equality, id, type_list<EIGEN_TPL_PP_SPEC_HACK_USE(ts)>> {
137 typedef type_list<> type;
138 constexpr static int global_flags = 0;
154template <
template <
typename,
typename>
class Multiply,
template <
typename,
typename>
class Equality,
typename id,
155 typename g,
typename current_element,
typename elements,
156 bool dont_add_current_element
158struct dimino_first_step_elements_helper
159#ifndef EIGEN_PARSED_BY_DOXYGEN
161 public dimino_first_step_elements_helper<Multiply, Equality, id, g, typename Multiply<current_element, g>::type,
162 typename concat<elements, type_list<current_element>>::type,
163 Equality<typename Multiply<current_element, g>::type, id>::value> {
166template <
template <
typename,
typename>
class Multiply,
template <
typename,
typename>
class Equality,
typename id,
167 typename g,
typename current_element,
typename elements>
168struct dimino_first_step_elements_helper<Multiply, Equality, id, g, current_element, elements, true>
171 typedef elements type;
172 constexpr static int global_flags = Equality<current_element, id>::global_flags;
188template <
template <
typename,
typename>
class Multiply,
template <
typename,
typename>
class Equality,
typename id,
190struct dimino_first_step_elements {
191 typedef typename get<0, generators>::type first_generator;
192 typedef typename skip<1, generators>::type next_generators;
193 typedef type_list<first_generator> generators_done;
195 typedef dimino_first_step_elements_helper<Multiply, Equality, id, first_generator, first_generator, type_list<id>,
198 typedef typename helper::type type;
199 constexpr static int global_flags = helper::global_flags;
222template <
template <
typename,
typename>
class Multiply,
typename sub_group_elements,
typename new_coset_rep,
225struct dimino_get_coset_elements {
226 typedef typename apply_op_from_right<Multiply, new_coset_rep, sub_group_elements>::type type;
229template <
template <
typename,
typename>
class Multiply,
typename sub_group_elements,
typename new_coset_rep>
230struct dimino_get_coset_elements<Multiply, sub_group_elements, new_coset_rep, false> {
231 typedef type_list<> type;
248template <
template <
typename,
typename>
class Multiply,
template <
typename,
typename>
class Equality,
typename id,
249 typename sub_group_elements,
typename elements,
typename generators,
typename rep_element,
int sub_group_size>
250struct dimino_add_cosets_for_rep;
252template <
template <
typename,
typename>
class Multiply,
template <
typename,
typename>
class Equality,
typename id,
253 typename sub_group_elements,
typename elements,
typename g,
typename... gs,
typename rep_element,
255struct dimino_add_cosets_for_rep<Multiply, Equality, id, sub_group_elements, elements, type_list<g, gs...>, rep_element,
257 typedef typename Multiply<rep_element, g>::type new_coset_rep;
258 typedef contained_in_list_gf<Equality, new_coset_rep, elements> _cil;
259 constexpr static bool add_coset = !_cil::value;
262 typename dimino_get_coset_elements<Multiply, sub_group_elements, new_coset_rep, add_coset>::type coset_elements;
264 typedef dimino_add_cosets_for_rep<Multiply, Equality, id, sub_group_elements,
265 typename concat<elements, coset_elements>::type, type_list<gs...>, rep_element,
269 typedef typename _helper::type type;
270 constexpr static int global_flags = _cil::global_flags | _helper::global_flags;
280template <
template <
typename,
typename>
class Multiply,
template <
typename,
typename>
class Equality,
typename id,
281 typename sub_group_elements,
typename elements EIGEN_TPL_PP_SPEC_HACK_DEFC(
typename, empty),
282 typename rep_element,
int sub_group_size>
283struct dimino_add_cosets_for_rep<Multiply, Equality, id, sub_group_elements, elements,
284 type_list<EIGEN_TPL_PP_SPEC_HACK_USE(empty)>, rep_element, sub_group_size> {
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;
438 typedef typename first_step::type first_step_elements;
440 typedef dimino_add_remaining_generators<Multiply, Equality, id,
typename first_step::generators_done,
441 typename first_step::next_generators,
442 typename first_step::type
446 typedef typename _helper::type type;
447 constexpr static int global_flags = initial_global_flags | first_step::global_flags | _helper::global_flags;
451template <
template <
typename,
typename>
class Multiply,
template <
typename,
typename>
class Equality,
typename id,
452 int initial_global_flags>
453struct enumerate_group_elements_noid<Multiply, Equality, id, type_list<>, initial_global_flags> {
454 typedef type_list<id> type;
455 constexpr static int global_flags = initial_global_flags;
475template <
template <
typename,
typename>
class Multiply,
template <
typename,
typename>
class Equality,
typename id,
476 typename Generators_>
477struct enumerate_group_elements
478 :
public enumerate_group_elements_noid<Multiply, Equality, id,
479 typename strip_identities<Equality, id, Generators_>::type,
480 strip_identities<Equality, id, Generators_>::global_flags> {};
Namespace containing all symbols from the Eigen library.