10 #ifndef EIGEN_CXX11_TENSORSYMMETRY_SYMMETRY_H 11 #define EIGEN_CXX11_TENSORSYMMETRY_SYMMETRY_H 17 ConjugationFlag = 0x02
21 GlobalRealFlag = 0x01,
22 GlobalImagFlag = 0x02,
37 template<
int One_,
int Two_>
40 static_assert(One_ != Two_,
"Symmetries must cover distinct indices.");
41 constexpr
static int One = One_;
42 constexpr
static int Two = Two_;
43 constexpr
static int Flags = 0;
46 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_;
52 constexpr
static int Flags = NegationFlag;
55 template<
int One_,
int Two_>
58 static_assert(One_ != Two_,
"Symmetries must cover distinct indices.");
59 constexpr
static int One = One_;
60 constexpr
static int Two = Two_;
61 constexpr
static int Flags = ConjugationFlag;
64 template<
int One_,
int Two_>
67 static_assert(One_ != Two_,
"Symmetries must cover distinct indices.");
68 constexpr
static int One = One_;
69 constexpr
static int Two = Two_;
70 constexpr
static int Flags = ConjugationFlag | NegationFlag;
98 template<
typename... Gen>
120 template<
typename... Gen>
135 template<
typename... Gen>
143 inline SGroup() : Base() { }
146 inline SGroup<Gen...>& operator=(
const SGroup<Gen...>& other) { Base::operator=(other);
return *
this; }
147 inline SGroup<Gen...>& operator=(
SGroup<Gen...>&& other) { Base::operator=(other);
return *
this; }
154 template<
typename... Sym>
struct tensor_symmetry_num_indices
156 constexpr
static std::size_t value = 1;
162 constexpr
static std::size_t One =
static_cast<std::size_t
>(One_);
163 constexpr
static std::size_t Two =
static_cast<std::size_t
>(Two_);
167 constexpr
static std::size_t maxOneTwoPlusOne = ((One > Two) ? One : Two) + 1;
169 constexpr
static std::size_t value = (maxOneTwoPlusOne > Three) ? maxOneTwoPlusOne : Three;
226 template<std::
size_t NumIndices>
232 template<std::size_t NumIndices,
typename Gen_,
typename... Gens_>
235 constexpr
static std::size_t max_static_generators = 4;
236 constexpr
static std::size_t max_static_elements = 16;
238 constexpr
static std::size_t possible_size = helper::size;
241 possible_size == 0 || possible_size >= max_static_elements,
243 typename helper::type
247 template<
bool instantiate, std::size_t NumIndices,
typename... Gens>
250 constexpr
static std::size_t size = 0;
254 template<std::size_t NumIndices,
typename... Gens>
257 template<
typename Tensor_>
260 typedef typename Tensor_::Index
Index;
261 typedef typename Tensor_::Scalar Scalar;
262 constexpr
static std::size_t NumIndices = Tensor_::NumIndices;
264 static inline int run(
const std::array<Index, NumIndices>& transformed_indices,
int transformation_flags,
int dummy, Tensor_& tensor,
const Scalar& value_)
266 Scalar value(value_);
267 if (transformation_flags & ConjugationFlag)
268 value = numext::conj(value);
269 if (transformation_flags & NegationFlag)
271 tensor.coeffRef(transformed_indices) = value;
276 template<
typename Tensor_>
279 typedef typename Tensor_::Index
Index;
280 constexpr
static std::size_t NumIndices = Tensor_::NumIndices;
282 static inline int run(
const std::array<Index, NumIndices>& transformed_indices,
int transform_flags,
int current_flags,
const std::array<Index, NumIndices>& orig_indices)
284 if (transformed_indices == orig_indices) {
285 if (transform_flags & (ConjugationFlag | NegationFlag))
286 return current_flags | GlobalImagFlag;
287 else if (transform_flags & ConjugationFlag)
288 return current_flags | GlobalRealFlag;
289 else if (transform_flags & NegationFlag)
290 return current_flags | GlobalZeroFlag;
292 return current_flags;
296 template<
typename Tensor_,
typename Symmetry_,
int Flags = 0>
300 typedef typename Tensor_::Index
Index;
301 typedef typename Tensor_::Scalar Scalar;
302 constexpr
static std::size_t NumIndices = Tensor_::NumIndices;
305 : m_tensor(tensor), m_symmetry(symmetry), m_indices(indices) { }
314 Symmetry_ m_symmetry;
315 std::array<Index, NumIndices> m_indices;
317 inline void doAssign(Scalar
const& value)
319 #ifdef EIGEN_TENSOR_SYMMETRY_CHECK_VALUES 320 int value_flags = m_symmetry.template apply<internal::tensor_symmetry_calculate_flags<Tensor_>,
int>(m_indices, m_symmetry.globalFlags(), m_indices);
321 if (value_flags & GlobalRealFlag)
322 eigen_assert(numext::imag(value) == 0);
323 if (value_flags & GlobalImagFlag)
324 eigen_assert(numext::real(value) == 0);
326 m_symmetry.template apply<internal::tensor_symmetry_assign_value<Tensor_>,
int>(m_indices, 0, m_tensor, value);
334 #endif // EIGEN_CXX11_TENSORSYMMETRY_SYMMETRY_H Definition: Symmetry.h:32
Symmetry group, initialized from template arguments.
Definition: Symmetry.h:136
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:85
Definition: Symmetry.h:30
Definition: Symmetry.h:38
Definition: Symmetry.h:28
Static symmetry group.
Definition: StaticSymmetry.h:181
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:33
Definition: Symmetry.h:33
Definition: Symmetry.h:31
Definition: Symmetry.h:297
Definition: Symmetry.h:56
Definition: Symmetry.h:47
Definition: BandTriangularSolver.h:13
Definition: StaticSymmetry.h:115
Dynamic symmetry group.
Definition: DynamicSymmetry.h:15
Definition: DynamicSymmetry.h:154
Definition: Symmetry.h:65