10#ifndef EIGEN_CXX11_TENSORSYMMETRY_STATICSYMMETRY_H
11#define EIGEN_CXX11_TENSORSYMMETRY_STATICSYMMETRY_H
22 constexpr static std::size_t
N =
sizeof...(nn);
25 constexpr static inline std::array<T, N>
run(
const std::array<T, N>& indices)
27 return {{indices[
nn]...}};
31template<
typename indices_,
int flags_>
38template<
typename Gen,
int N>
65template<
typename A,
typename B>
69 typedef typename A::indices iia;
70 typedef typename B::indices iib;
71 constexpr static int ffa = A::flags;
72 constexpr static int ffb = B::flags;
75 static_assert(iia::count == iib::count,
"Cannot multiply symmetry elements with different number of indices.");
83template<
typename A,
typename B>
86 typedef typename A::indices
iia;
87 typedef typename B::indices
iib;
88 constexpr static int ffa = A::flags;
89 constexpr static int ffb = B::flags;
90 static_assert(iia::count == iib::count,
"Cannot compare symmetry elements with different number of indices.");
98 constexpr static int flags_cmp_ =
ffa ^
ffb;
114template<std::size_t NumIndices,
typename...
Gen>
118 constexpr static std::size_t
size = type::static_size;
121template<
typename Index, std::size_t
N,
int...
ii,
int...
jj>
127template<
typename Index,
int... ii>
128static inline std::vector<Index> tensor_static_symgroup_index_permute(std::vector<Index> idx, internal::numeric_list<int, ii...>)
130 std::vector<Index> result{{ idx[ii]... }};
131 std::size_t target_size = idx.size();
132 for (std::size_t
i = result.size();
i < target_size;
i++)
133 result.push_back(idx[
i]);
139template<
typename first,
typename... next>
142 template<
typename Op,
typename RV, std::size_t
SGNumIndices,
typename Index, std::size_t NumIndices,
typename...
Args>
145 static_assert(NumIndices >=
SGNumIndices,
"Can only apply symmetry group to objects that have at least the required amount of indices.");
147 initial = Op::run(tensor_static_symgroup_index_permute(
idx,
typename first::indices(),
remaining_indices()), first::flags, initial, std::forward<Args>(
args)...);
154 eigen_assert(
idx.size() >=
SGNumIndices &&
"Can only apply symmetry group to objects that have at least the required amount of indices.");
155 initial = Op::run(tensor_static_symgroup_index_permute(
idx,
typename first::indices()), first::flags, initial, std::forward<Args>(
args)...);
160template<EIGEN_TPL_PP_SPEC_HACK_DEF(
typename, empty)>
163 template<
typename Op,
typename RV, std::size_t
SGNumIndices,
typename Index, std::size_t NumIndices,
typename...
Args>
164 static inline RV run(
const std::array<Index, NumIndices>&,
RV initial,
Args&&...)
171 static inline RV run(
const std::vector<Index>&,
RV initial,
Args&&...)
180template<
typename... Gen>
196 template<
typename Op,
typename RV,
typename Index, std::size_t
N,
typename... Args>
197 static inline RV
apply(
const std::array<Index, N>& idx, RV initial, Args&&... args)
202 template<
typename Op,
typename RV,
typename Index,
typename... Args>
203 static inline RV
apply(
const std::vector<Index>& idx, RV initial, Args&&... args)
211 constexpr static inline std::size_t
size() {
216 template<
typename Tensor_,
typename... IndexTypes>
219 static_assert(
sizeof...(otherIndices) + 1 == Tensor_::NumIndices,
"Number of indices used to access a tensor coefficient must be equal to the rank of the tensor.");
220 return operator()(tensor, std::array<typename Tensor_::Index, Tensor_::NumIndices>{{firstIndex, otherIndices...}});
223 template<
typename Tensor_>
int i
Definition BiCGSTAB_step_by_step.cpp:9
#define eigen_assert(x)
Definition Macros.h:1037
Static symmetry group.
Definition StaticSymmetry.h:182
internal::tensor_symmetry_value_setter< Tensor_, StaticSGroup< Gen... > > operator()(Tensor_ &tensor, std::array< typename Tensor_::Index, Tensor_::NumIndices > const &indices) const
Definition StaticSymmetry.h:224
static RV apply(const std::array< Index, N > &idx, RV initial, Args &&... args)
Definition StaticSymmetry.h:197
static constexpr int globalFlags()
Definition StaticSymmetry.h:214
internal::tensor_symmetry_value_setter< Tensor_, StaticSGroup< Gen... > > operator()(Tensor_ &tensor, typename Tensor_::Index firstIndex, IndexTypes... otherIndices) const
Definition StaticSymmetry.h:217
static constexpr std::size_t size()
Definition StaticSymmetry.h:211
constexpr StaticSGroup(const StaticSGroup< Gen... > &)
Definition StaticSymmetry.h:193
constexpr StaticSGroup()
Definition StaticSymmetry.h:192
static RV apply(const std::vector< Index > &idx, RV initial, Args &&... args)
Definition StaticSymmetry.h:203
constexpr StaticSGroup(StaticSGroup< Gen... > &&)
Definition StaticSymmetry.h:194
static constexpr std::size_t static_size
Definition StaticSymmetry.h:209
Definition Symmetry.h:298
@ N
Definition constructor.cpp:23
EIGEN_CONSTEXPR Index first(const T &x) EIGEN_NOEXCEPT
Definition IndexedViewHelper.h:81
Namespace containing all symbols from the Eigen library.
Definition bench_norm.cpp:85
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:74
@ NegationFlag
Definition Symmetry.h:16
@ ConjugationFlag
Definition Symmetry.h:17
@ GlobalZeroFlag
Definition Symmetry.h:23
@ GlobalRealFlag
Definition Symmetry.h:21
@ GlobalImagFlag
Definition Symmetry.h:22
Definition BandTriangularSolver.h:13
Definition CXX11Meta.h:57
Definition CXX11Meta.h:51
static constexpr int global_flags
Definition TemplateGroupTheory.h:606
_helper::type type
Definition TemplateGroupTheory.h:605
Definition TemplateGroupTheory.h:656
Definition CXX11Meta.h:35
static RV run(const std::vector< Index > &, RV initial, Args &&...)
Definition StaticSymmetry.h:171
static RV run(const std::array< Index, NumIndices > &, RV initial, Args &&...)
Definition StaticSymmetry.h:164
static RV run(const std::array< Index, NumIndices > &idx, RV initial, Args &&... args)
Definition StaticSymmetry.h:143
static RV run(const std::vector< Index > &idx, RV initial, Args &&... args)
Definition StaticSymmetry.h:152
Definition StaticSymmetry.h:137
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:44
Definition StaticSymmetry.h:33
static constexpr int flags
Definition StaticSymmetry.h:35
indices_ indices
Definition StaticSymmetry.h:34
Definition StaticSymmetry.h:85
A::indices iia
Definition StaticSymmetry.h:86
B::indices iib
Definition StaticSymmetry.h:87
static constexpr int ffa
Definition StaticSymmetry.h:88
static constexpr bool value
Definition StaticSymmetry.h:92
static constexpr int global_flags
Definition StaticSymmetry.h:108
static constexpr int ffb
Definition StaticSymmetry.h:89
Definition StaticSymmetry.h:49
tensor_static_symgroup_element< typename gen_numeric_list< int, N >::type, 0 > type
Definition StaticSymmetry.h:53
Definition StaticSymmetry.h:58
static constexpr numeric_list< int, get< iia, iib >::value... > helper(numeric_list< int, iia... >)
Definition StaticSymmetry.h:60
Definition StaticSymmetry.h:67
static constexpr std::array< T, N > run(const std::array< T, N > &indices)
Definition StaticSymmetry.h:25
Definition StaticSymmetry.h:17
Definition StaticSymmetry.h:116
StaticSGroup< Gen... > type
Definition StaticSymmetry.h:117
static constexpr std::size_t size
Definition StaticSymmetry.h:118
Definition Symmetry.h:155
Definition ForwardDeclarations.h:17
Definition CXX11Meta.h:29