10 #ifndef EIGEN_CXX11_TENSORSYMMETRY_SYMMETRY_H
11 #define EIGEN_CXX11_TENSORSYMMETRY_SYMMETRY_H
24 template <std::size_t NumIndices,
typename... Sym>
26 template <std::size_t NumIndices,
typename... Sym>
28 template <
bool instantiate, std::size_t NumIndices,
typename... Sym>
30 template <
typename Tensor_>
32 template <
typename Tensor_>
34 template <
typename... Sym>
39 template <
int One_,
int Two_>
41 static_assert(One_ != Two_,
"Symmetries must cover distinct indices.");
42 constexpr
static int One = One_;
43 constexpr
static int Two = Two_;
47 template <
int One_,
int Two_>
49 static_assert(One_ != Two_,
"Symmetries must cover distinct indices.");
50 constexpr
static int One = One_;
51 constexpr
static int Two = Two_;
55 template <
int One_,
int Two_>
57 static_assert(One_ != Two_,
"Symmetries must cover distinct indices.");
58 constexpr
static int One = One_;
59 constexpr
static int Two = Two_;
63 template <
int One_,
int Two_>
65 static_assert(One_ != Two_,
"Symmetries must cover distinct indices.");
66 constexpr
static int One = One_;
67 constexpr
static int Two = Two_;
96 template <
typename... Gen>
118 template <
typename... Gen>
133 template <
typename... Gen>
145 Base::operator=(other);
149 Base::operator=(other);
158 template <
typename... Sym>
160 constexpr
static std::size_t
value = 1;
163 template <
int One_,
int Two_,
typename... Sym>
166 constexpr
static std::size_t One =
static_cast<std::size_t
>(One_);
167 constexpr
static std::size_t Two =
static_cast<std::size_t
>(Two_);
171 constexpr
static std::size_t maxOneTwoPlusOne = ((One > Two) ? One : Two) + 1;
174 constexpr
static std::size_t
value = (maxOneTwoPlusOne > Three) ? maxOneTwoPlusOne : Three;
177 template <
int One_,
int Two_,
typename... Sym>
180 template <
int One_,
int Two_,
typename... Sym>
183 template <
int One_,
int Two_,
typename... Sym>
234 template <std::
size_t NumIndices>
239 template <std::size_t NumIndices,
typename Gen_,
typename... Gens_>
241 constexpr
static std::size_t max_static_generators = 4;
242 constexpr
static std::size_t max_static_elements = 16;
246 typedef std::conditional_t<possible_size == 0 || possible_size >= max_static_elements,
251 template <
bool instantiate, std::size_t NumIndices,
typename... Gens>
253 constexpr
static std::size_t
size = 0;
257 template <std::size_t NumIndices,
typename... Gens>
260 template <
typename Tensor_>
264 constexpr
static std::size_t
NumIndices = Tensor_::NumIndices;
266 static inline int run(
const std::array<Index, NumIndices>& transformed_indices,
int transformation_flags,
int dummy,
267 Tensor_& tensor,
const Scalar& value_) {
271 tensor.coeffRef(transformed_indices) =
value;
276 template <
typename Tensor_>
279 constexpr
static std::size_t
NumIndices = Tensor_::NumIndices;
281 static inline int run(
const std::array<Index, NumIndices>& transformed_indices,
int transform_flags,
282 int current_flags,
const std::array<Index, NumIndices>& orig_indices) {
283 if (transformed_indices == orig_indices) {
291 return current_flags;
295 template <
typename Tensor_,
typename Symmetry_,
int Flags = 0>
300 constexpr
static std::size_t
NumIndices = Tensor_::NumIndices;
303 std::array<Index, NumIndices>
const& indices)
317 #ifdef EIGEN_TENSOR_SYMMETRY_CHECK_VALUES
318 int value_flags =
m_symmetry.template apply<internal::tensor_symmetry_calculate_flags<Tensor_>,
int>(
AnnoyingScalar conj(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:133
AnnoyingScalar imag(const AnnoyingScalar &)
Definition: AnnoyingScalar.h:132
#define eigen_assert(x)
Definition: Macros.h:910
Scalar Scalar int size
Definition: benchVecAdd.cpp:17
SCALAR Scalar
Definition: bench_gemm.cpp:45
Dynamic symmetry group, initialized from template arguments.
Definition: DynamicSymmetry.h:166
Dynamic symmetry group.
Definition: DynamicSymmetry.h:18
Symmetry group, initialized from template arguments.
Definition: Symmetry.h:135
SGroup< Gen... > & operator=(const SGroup< Gen... > &other)
Definition: Symmetry.h:144
SGroup< Gen... > & operator=(SGroup< Gen... > &&other)
Definition: Symmetry.h:148
constexpr static std::size_t NumIndices
Definition: Symmetry.h:137
SGroup()
Definition: Symmetry.h:141
internal::tensor_symmetry_pre_analysis< NumIndices, Gen... >::root_type Base
Definition: Symmetry.h:138
SGroup(SGroup< Gen... > &&other)
Definition: Symmetry.h:143
SGroup(const SGroup< Gen... > &other)
Definition: Symmetry.h:142
Static symmetry group.
Definition: StaticSymmetry.h:172
Definition: Symmetry.h:296
Tensor_::Index Index
Definition: Symmetry.h:298
tensor_symmetry_value_setter< Tensor_, Symmetry_, Flags > & operator=(Scalar const &value)
Definition: Symmetry.h:306
void doAssign(Scalar const &value)
Definition: Symmetry.h:316
Tensor_ & m_tensor
Definition: Symmetry.h:312
tensor_symmetry_value_setter(Tensor_ &tensor, Symmetry_ const &symmetry, std::array< Index, NumIndices > const &indices)
Definition: Symmetry.h:302
std::array< Index, NumIndices > m_indices
Definition: Symmetry.h:314
Tensor_::Scalar Scalar
Definition: Symmetry.h:299
Symmetry_ m_symmetry
Definition: Symmetry.h:313
constexpr static std::size_t NumIndices
Definition: Symmetry.h:300
float real
Definition: datatypes.h:10
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
Extend namespace for flags.
Definition: fsi_chan_precond_driver.cc:56
Definition: Eigen_Colamd.h:49
Definition: Symmetry.h:64
constexpr static int One
Definition: Symmetry.h:66
constexpr static int Two
Definition: Symmetry.h:67
Definition: Symmetry.h:48
constexpr static int Two
Definition: Symmetry.h:51
constexpr static int One
Definition: Symmetry.h:50
Definition: Symmetry.h:56
constexpr static int Two
Definition: Symmetry.h:59
constexpr static int One
Definition: Symmetry.h:58
Definition: Symmetry.h:40
constexpr static int Two
Definition: Symmetry.h:43
constexpr static int One
Definition: Symmetry.h:42
Definition: Symmetry.h:252
void type
Definition: Symmetry.h:254
constexpr static std::size_t size
Definition: Symmetry.h:253
Definition: StaticSymmetry.h:104
Definition: Symmetry.h:261
constexpr static std::size_t NumIndices
Definition: Symmetry.h:264
Tensor_::Scalar Scalar
Definition: Symmetry.h:263
static int run(const std::array< Index, NumIndices > &transformed_indices, int transformation_flags, int dummy, Tensor_ &tensor, const Scalar &value_)
Definition: Symmetry.h:266
Tensor_::Index Index
Definition: Symmetry.h:262
Definition: Symmetry.h:277
Tensor_::Index Index
Definition: Symmetry.h:278
constexpr static std::size_t NumIndices
Definition: Symmetry.h:279
static int run(const std::array< Index, NumIndices > &transformed_indices, int transform_flags, int current_flags, const std::array< Index, NumIndices > &orig_indices)
Definition: Symmetry.h:281
Definition: Symmetry.h:159
constexpr static std::size_t value
Definition: Symmetry.h:160
tensor_static_symgroup_if<(sizeof...(Gens_)+1<=max_static_generators), NumIndices, Gen_, Gens_... > helper
Definition: Symmetry.h:243
helper::type root_type
Definition: Symmetry.h:248
StaticSGroup root_type
Definition: Symmetry.h:236
Pre-select whether to use a static or dynamic symmetry group.
Definition: Symmetry.h:25