10 #ifndef EIGEN_CXX11_TENSORSYMMETRY_STATICSYMMETRY_H
11 #define EIGEN_CXX11_TENSORSYMMETRY_STATICSYMMETRY_H
20 template <
typename list>
25 constexpr
static std::size_t
N =
sizeof...(nn);
28 constexpr
static inline std::array<T, N>
run(
const std::array<T, N>& indices) {
29 return {{indices[nn]...}};
33 template <
typename indices_,
int flags_>
36 constexpr
static int flags = flags_;
39 template <
typename Gen,
int N>
51 template <
typename iib>
59 template <
typename A,
typename B>
62 typedef typename A::indices
iia;
63 typedef typename B::indices
iib;
64 constexpr
static int ffa = A::flags;
65 constexpr
static int ffb = B::flags;
68 static_assert(iia::count == iib::count,
"Cannot multiply symmetry elements with different number of indices.");
75 template <
typename A,
typename B>
77 typedef typename A::indices
iia;
78 typedef typename B::indices
iib;
79 constexpr
static int ffa = A::flags;
80 constexpr
static int ffb = B::flags;
81 static_assert(iia::count == iib::count,
"Cannot compare symmetry elements with different number of indices.");
103 template <std::size_t NumIndices,
typename... Gen>
109 template <
typename Index, std::size_t
N,
int... ii,
int... jj>
113 return {{idx[ii]..., idx[jj]...}};
116 template <
typename Index,
int... ii>
119 std::vector<Index> result{{idx[ii]...}};
120 std::size_t target_size = idx.size();
121 for (std::size_t
i = result.size();
i < target_size;
i++) result.push_back(idx[
i]);
125 template <
typename T>
128 template <
typename first,
typename... next>
130 template <
typename Op,
typename RV, std::size_t SGNumIndices,
typename Index, std::size_t NumIndices,
132 static inline RV
run(
const std::array<Index, NumIndices>& idx, RV initial, Args&&...
args) {
133 static_assert(NumIndices >= SGNumIndices,
134 "Can only apply symmetry group to objects that have at least the required amount of indices.");
137 first::flags, initial, std::forward<Args>(
args)...);
139 idx, initial,
args...);
142 template <
typename Op,
typename RV, std::size_t SGNumIndices,
typename Index,
typename... Args>
143 static inline RV
run(
const std::vector<Index>& idx, RV initial, Args&&...
args) {
145 "Can only apply symmetry group to objects that have at least the required amount of indices.");
147 std::forward<Args>(
args)...);
149 idx, initial,
args...);
153 template <EIGEN_TPL_PP_SPEC_HACK_DEF(
typename, empty)>
155 template <
typename Op,
typename RV, std::size_t SGNumIndices,
typename Index, std::size_t NumIndices,
157 static inline RV
run(
const std::array<Index, NumIndices>&, RV initial, Args&&...) {
162 template <
typename Op,
typename RV, std::size_t SGNumIndices,
typename Index,
typename... Args>
163 static inline RV
run(
const std::vector<Index>&, RV initial, Args&&...) {
171 template <
typename... Gen>
186 template <
typename Op,
typename RV,
typename Index, std::size_t
N,
typename... Args>
187 static inline RV
apply(
const std::array<Index, N>& idx, RV initial, Args&&...
args) {
191 template <
typename Op,
typename RV,
typename Index,
typename... Args>
192 static inline RV
apply(
const std::vector<Index>& idx, RV initial, Args&&...
args) {
199 constexpr
static inline std::size_t
size() {
return ge::count; }
202 template <
typename Tensor_,
typename... IndexTypes>
204 Tensor_& tensor,
typename Tensor_::Index firstIndex, IndexTypes... otherIndices)
const {
205 static_assert(
sizeof...(otherIndices) + 1 == Tensor_::NumIndices,
206 "Number of indices used to access a tensor coefficient must be equal to the rank of the tensor.");
207 return operator()(tensor, std::array<typename Tensor_::Index, Tensor_::NumIndices>{{firstIndex, otherIndices...}});
210 template <
typename Tensor_>
212 Tensor_& tensor, std::array<typename Tensor_::Index, Tensor_::NumIndices>
const& indices)
const {
int i
Definition: BiCGSTAB_step_by_step.cpp:9
#define eigen_assert(x)
Definition: Macros.h:910
Static symmetry group.
Definition: StaticSymmetry.h:172
constexpr static std::size_t static_size
Definition: StaticSymmetry.h:197
static RV apply(const std::array< Index, N > &idx, RV initial, Args &&... args)
Definition: StaticSymmetry.h:187
internal::tensor_symmetry_value_setter< Tensor_, StaticSGroup< Gen... > > operator()(Tensor_ &tensor, typename Tensor_::Index firstIndex, IndexTypes... otherIndices) const
Definition: StaticSymmetry.h:203
constexpr static std::size_t size()
Definition: StaticSymmetry.h:199
constexpr static std::size_t NumIndices
Definition: StaticSymmetry.h:173
group_elements::type ge
Definition: StaticSymmetry.h:179
internal::group_theory::enumerate_group_elements< internal::tensor_static_symgroup_multiply, internal::tensor_static_symgroup_equality, typename internal::tensor_static_symgroup_identity_ctor< NumIndices >::type, internal::type_list< typename internal::tensor_static_symgroup_element_ctor< Gen, NumIndices >::type... > > group_elements
Definition: StaticSymmetry.h:178
constexpr StaticSGroup(const StaticSGroup< Gen... > &)
Definition: StaticSymmetry.h:183
internal::tensor_symmetry_value_setter< Tensor_, StaticSGroup< Gen... > > operator()(Tensor_ &tensor, std::array< typename Tensor_::Index, Tensor_::NumIndices > const &indices) const
Definition: StaticSymmetry.h:211
constexpr StaticSGroup()
Definition: StaticSymmetry.h:182
static RV apply(const std::vector< Index > &idx, RV initial, Args &&... args)
Definition: StaticSymmetry.h:192
constexpr StaticSGroup(StaticSGroup< Gen... > &&)
Definition: StaticSymmetry.h:184
constexpr static int globalFlags()
Definition: StaticSymmetry.h:200
Definition: Symmetry.h:296
@ N
Definition: constructor.cpp:22
constexpr static std::array< Index, N > tensor_static_symgroup_index_permute(std::array< Index, N > idx, internal::numeric_list< int, ii... >, internal::numeric_list< int, jj... >)
Definition: StaticSymmetry.h:110
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
squared absolute value
Definition: GlobalFunctions.h:87
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
@ GlobalZeroFlag
Definition: Symmetry.h:20
@ GlobalRealFlag
Definition: Symmetry.h:20
@ GlobalImagFlag
Definition: Symmetry.h:20
@ NegationFlag
Definition: Symmetry.h:18
@ ConjugationFlag
Definition: Symmetry.h:18
args
Definition: compute_granudrum_aor.py:143
type
Definition: compute_granudrum_aor.py:141
Definition: Eigen_Colamd.h:49
Definition: MoreMeta.h:55
_helper::type type
Definition: TemplateGroupTheory.h:446
constexpr static int global_flags
Definition: TemplateGroupTheory.h:447
Enumerate all elements in a finite group.
Definition: TemplateGroupTheory.h:480
Definition: MoreMeta.h:33
static RV run(const std::vector< Index > &, RV initial, Args &&...)
Definition: StaticSymmetry.h:163
static RV run(const std::array< Index, NumIndices > &, RV initial, Args &&...)
Definition: StaticSymmetry.h:157
static RV run(const std::array< Index, NumIndices > &idx, RV initial, Args &&... args)
Definition: StaticSymmetry.h:132
static RV run(const std::vector< Index > &idx, RV initial, Args &&... args)
Definition: StaticSymmetry.h:143
Definition: StaticSymmetry.h:126
Definition: StaticSymmetry.h:40
tensor_static_symgroup_element< typename gen_numeric_list_swapped_pair< int, N, Gen::One, Gen::Two >::type, Gen::Flags > type
Definition: StaticSymmetry.h:43
Definition: StaticSymmetry.h:34
indices_ indices
Definition: StaticSymmetry.h:35
constexpr static int flags
Definition: StaticSymmetry.h:36
Definition: StaticSymmetry.h:76
constexpr static bool is_imag
Definition: StaticSymmetry.h:96
A::indices iia
Definition: StaticSymmetry.h:77
constexpr static int global_flags
Definition: StaticSymmetry.h:99
constexpr static int ffb
Definition: StaticSymmetry.h:80
constexpr static bool is_real
Definition: StaticSymmetry.h:95
constexpr static bool is_zero
Definition: StaticSymmetry.h:94
B::indices iib
Definition: StaticSymmetry.h:78
constexpr static int ffa
Definition: StaticSymmetry.h:79
constexpr static int flags_cmp_
Definition: StaticSymmetry.h:89
constexpr static bool value
Definition: StaticSymmetry.h:83
Definition: StaticSymmetry.h:47
tensor_static_symgroup_element< typename gen_numeric_list< int, N >::type, 0 > type
Definition: StaticSymmetry.h:48
Definition: StaticSymmetry.h:52
constexpr static numeric_list< int, get< iia, iib >::value... > helper(numeric_list< int, iia... >)
Definition: StaticSymmetry.h:54
Definition: StaticSymmetry.h:60
B::indices iib
Definition: StaticSymmetry.h:63
tensor_static_symgroup_element< decltype(tensor_static_symgroup_multiply_helper< iib >::helper(iia())), ffa ^ ffb > type
Definition: StaticSymmetry.h:68
constexpr static int ffb
Definition: StaticSymmetry.h:65
constexpr static int ffa
Definition: StaticSymmetry.h:64
A::indices iia
Definition: StaticSymmetry.h:62
constexpr static std::array< T, N > run(const std::array< T, N > &indices)
Definition: StaticSymmetry.h:28
Definition: StaticSymmetry.h:21
Definition: StaticSymmetry.h:104
StaticSGroup< Gen... > type
Definition: StaticSymmetry.h:105
constexpr static std::size_t size
Definition: StaticSymmetry.h:106
Definition: Symmetry.h:159
Definition: MoreMeta.h:22
void run(const string &dir_name, LinearSolver *linear_solver_pt, const unsigned nel_1d, bool mess_up_order)
Definition: two_d_poisson_compare_solvers.cc:317