10 #ifndef EIGEN_CXX11_TENSORSYMMETRY_STATICSYMMETRY_H 11 #define EIGEN_CXX11_TENSORSYMMETRY_STATICSYMMETRY_H 25 constexpr
static inline std::array<T, N>
run(
const std::array<T, N>& indices)
27 return {{indices[
nn]...}};
31 template<
typename indices_,
int flags_>
35 constexpr
static int flags = flags_;
38 template<
typename Gen,
int N>
56 template<
typename iib>
65 template<
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.");
83 template<
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;
108 constexpr
static int global_flags =
124 return {{ idx[ii]..., idx[jj]... }};
127 template<
typename Index,
int... ii>
130 std::vector<Index>
result{{ idx[ii]... }};
139 template<
typename first,
typename... next>
143 static inline RV
run(
const std::array<Index, NumIndices>& idx, RV
initial, Args&&...
args)
145 static_assert(NumIndices >= SGNumIndices,
"Can only apply symmetry group to objects that have at least the required amount of indices.");
151 template<
typename Op,
typename RV,
std::size_t SGNumIndices,
typename Index,
typename... Args>
154 eigen_assert(idx.size() >= SGNumIndices &&
"Can only apply symmetry group to objects that have at least the required amount of indices.");
160 template<EIGEN_TPL_PP_SPEC_HACK_DEF(
typename, empty)>
164 static inline RV
run(
const std::array<Index, NumIndices>&, RV
initial, Args&&...)
170 template<
typename Op,
typename RV,
std::size_t SGNumIndices,
typename Index,
typename... Args>
171 static inline RV
run(
const std::vector<Index>&, RV
initial, Args&&...)
180 template<
typename... Gen>
196 template<
typename Op,
typename RV,
typename Index,
std::size_t N,
typename... Args>
202 template<
typename Op,
typename RV,
typename Index,
typename... Args>
214 constexpr
static inline int globalFlags() {
return group_elements::global_flags; }
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_>
232 #endif // EIGEN_CXX11_TENSORSYMMETRY_STATICSYMMETRY_H internal::tensor_symmetry_value_setter< Tensor_, StaticSGroup< Gen... > > operator()(Tensor_ &tensor, typename Tensor_::Index firstIndex, IndexTypes... otherIndices) const
tensor_static_symgroup_element< typename gen_numeric_list< int, N >::type, 0 > type
tensor_static_symgroup_element< decltype(tensor_static_symgroup_multiply_helper< iib >::helper(iia())), ffa ^ ffb > type
StaticSGroup< Gen... > type
static constexpr int globalFlags()
static constexpr std::array< T, N > run(const std::array< T, N > &indices)
Namespace containing all symbols from the Eigen library.
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
EIGEN_CONSTEXPR Index first(const T &x) EIGEN_NOEXCEPT
constexpr StaticSGroup(const StaticSGroup< Gen... > &)
static constexpr numeric_list< int, get< iia, iib >::value... > helper(numeric_list< int, iia... >)
static RV run(const std::array< Index, NumIndices > &, RV initial, Args &&...)
static RV apply(const std::vector< Index > &idx, RV initial, Args &&... args)
static RV run(const std::array< Index, NumIndices > &idx, RV initial, Args &&... args)
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
static RV apply(const std::array< Index, N > &idx, RV initial, Args &&... args)
static RV run(const std::vector< Index > &idx, RV initial, Args &&... args)
static RV run(const std::vector< Index > &, RV initial, Args &&...)
EIGEN_CONSTEXPR Index size(const T &x)
constexpr StaticSGroup(StaticSGroup< Gen... > &&)
internal::tensor_symmetry_value_setter< Tensor_, StaticSGroup< Gen... > > operator()(Tensor_ &tensor, std::array< typename Tensor_::Index, Tensor_::NumIndices > const &indices) const
static constexpr std::array< Index, N > tensor_static_symgroup_index_permute(std::array< Index, N > idx, internal::numeric_list< int, ii... >, internal::numeric_list< int, jj... >)
static constexpr std::size_t size()
internal::enable_if< internal::valid_indexed_view_overload< RowIndices, ColIndices >::value &&internal::traits< typename EIGEN_INDEXED_VIEW_METHOD_TYPE< RowIndices, ColIndices >::type >::ReturnAsIndexedView, typename EIGEN_INDEXED_VIEW_METHOD_TYPE< RowIndices, ColIndices >::type >::type operator()(const RowIndices &rowIndices, const ColIndices &colIndices) EIGEN_INDEXED_VIEW_METHOD_CONST
tensor_static_symgroup_element< typename gen_numeric_list_swapped_pair< int, N, Gen::One, Gen::Two >::type, Gen::Flags > type