10 #ifndef EIGEN_CXX11_TENSORSYMMETRY_DYNAMICSYMMETRY_H
11 #define EIGEN_CXX11_TENSORSYMMETRY_DYNAMICSYMMETRY_H
47 void add(
int one,
int two,
int flags = 0);
49 template <
typename Gen_>
50 inline void add(Gen_) {
51 add(Gen_::One, Gen_::Two, Gen_::Flags);
58 template <
typename Op,
typename RV,
typename Index, std::size_t
N,
typename... Args>
59 inline RV
apply(
const std::array<Index, N>& idx, RV initial, Args&&...
args)
const {
61 "Can only apply symmetry group to objects that have at least the required amount of indices.");
62 for (std::size_t
i = 0;
i <
size();
i++)
64 initial, std::forward<Args>(
args)...);
68 template <
typename Op,
typename RV,
typename Index,
typename... Args>
69 inline RV
apply(
const std::vector<Index>& idx, RV initial, Args&&...
args)
const {
71 "Can only apply symmetry group to objects that have at least the required amount of indices.");
72 for (std::size_t
i = 0;
i <
size();
i++)
80 template <
typename Tensor_,
typename... IndexTypes>
83 IndexTypes... otherIndices)
const {
84 static_assert(
sizeof...(otherIndices) + 1 == Tensor_::NumIndices,
85 "Number of indices used to access a tensor coefficient must be equal to the rank of the tensor.");
86 return operator()(tensor, std::array<typename Tensor_::Index, Tensor_::NumIndices>{{firstIndex, otherIndices...}});
89 template <
typename Tensor_>
91 Tensor_& tensor, std::array<typename Tensor_::Index, Tensor_::NumIndices>
const& indices)
const {
117 template <
typename Index, std::size_t
N,
int...
n>
118 inline std::array<Index, N>
h_permute(std::size_t which,
const std::array<Index, N>& idx,
123 template <
typename Index>
124 inline std::vector<Index>
h_permute(std::size_t which, std::vector<Index> idx)
const {
125 std::vector<Index> result;
126 result.reserve(idx.size());
127 for (
auto k :
m_elements[which].representation) result.push_back(idx[
k]);
128 for (std::size_t
i =
m_numIndices;
i < idx.size();
i++) result.push_back(idx[
i]);
137 if (
k == (std::size_t)g.
one)
139 else if (
k == (std::size_t)g.
two)
147 GroupElement
mul(GroupElement, GroupElement)
const;
156 if (ee.representation ==
e.representation)
return ee.flags ^
e.flags;
165 template <
typename... Gen>
181 template <
typename Gen1,
typename... GenNext>
211 std::size_t newNumIndices = (one > two) ? one : two + 1;
213 gelem.representation.reserve(newNumIndices);
214 for (std::size_t
i =
m_numIndices;
i < newNumIndices;
i++) gelem.representation.push_back(
i);
247 std::size_t coset_rep = coset_order;
260 coset_rep += coset_order;
265 switch (flagDiffOfSameGenerator) {
Array< int, Dynamic, 1 > v
Definition: Array_initializer_list_vector_cxx11.cpp:1
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
Array< double, 1, 3 > e(1./3., 0.5, 2.)
#define eigen_internal_assert(x)
Definition: Macros.h:916
#define eigen_assert(x)
Definition: Macros.h:910
float * p
Definition: Tutorial_Map_using.cpp:9
Dynamic symmetry group, initialized from template arguments.
Definition: DynamicSymmetry.h:166
DynamicSGroupFromTemplateArgs(DynamicSGroupFromTemplateArgs const &other)
Definition: DynamicSymmetry.h:169
void add_all(internal::type_list< Gen1, GenNext... >)
Definition: DynamicSymmetry.h:182
DynamicSGroupFromTemplateArgs< Gen... > & operator=(DynamicSGroupFromTemplateArgs< Gen... > &&o)
Definition: DynamicSymmetry.h:175
DynamicSGroupFromTemplateArgs()
Definition: DynamicSymmetry.h:168
DynamicSGroupFromTemplateArgs< Gen... > & operator=(const DynamicSGroupFromTemplateArgs< Gen... > &o)
Definition: DynamicSymmetry.h:171
void add_all(internal::type_list<>)
Definition: DynamicSymmetry.h:187
DynamicSGroupFromTemplateArgs(DynamicSGroupFromTemplateArgs &&other)
Definition: DynamicSymmetry.h:170
Dynamic symmetry group.
Definition: DynamicSymmetry.h:18
GroupElement mul(GroupElement g1, Generator g2) const
Definition: DynamicSymmetry.h:150
internal::tensor_symmetry_value_setter< Tensor_, DynamicSGroup > operator()(Tensor_ &tensor, typename Tensor_::Index firstIndex, IndexTypes... otherIndices) const
Definition: DynamicSymmetry.h:81
std::vector< Index > h_permute(std::size_t which, std::vector< Index > idx) const
Definition: DynamicSymmetry.h:124
void add(Gen_)
Definition: DynamicSymmetry.h:50
DynamicSGroup & operator=(const DynamicSGroup &o)
Definition: DynamicSymmetry.h:32
std::array< Index, N > h_permute(std::size_t which, const std::array< Index, N > &idx, internal::numeric_list< int, n... >) const
Definition: DynamicSymmetry.h:118
std::size_t m_numIndices
Definition: DynamicSymmetry.h:112
void updateGlobalFlags(int flagDiffOfSameGenerator)
Definition: DynamicSymmetry.h:264
internal::tensor_symmetry_value_setter< Tensor_, DynamicSGroup > operator()(Tensor_ &tensor, std::array< typename Tensor_::Index, Tensor_::NumIndices > const &indices) const
Definition: DynamicSymmetry.h:90
void addSymmetry(int one, int two)
Definition: DynamicSymmetry.h:53
void addHermiticity(int one, int two)
Definition: DynamicSymmetry.h:55
GroupElement mul(Generator g1, Generator g2) const
Definition: DynamicSymmetry.h:152
void addAntiHermiticity(int one, int two)
Definition: DynamicSymmetry.h:56
std::vector< Generator > m_generators
Definition: DynamicSymmetry.h:114
DynamicSGroup()
Definition: DynamicSymmetry.h:20
DynamicSGroup(const DynamicSGroup &o)
Definition: DynamicSymmetry.h:23
int globalFlags() const
Definition: DynamicSymmetry.h:77
DynamicSGroup & operator=(DynamicSGroup &&o)
Definition: DynamicSymmetry.h:39
DynamicSGroup(DynamicSGroup &&o)
Definition: DynamicSymmetry.h:28
void add(int one, int two, int flags=0)
Definition: DynamicSymmetry.h:205
GroupElement mul(GroupElement, GroupElement) const
Definition: DynamicSymmetry.h:190
int m_globalFlags
Definition: DynamicSymmetry.h:115
void addAntiSymmetry(int one, int two)
Definition: DynamicSymmetry.h:54
std::size_t size() const
Definition: DynamicSymmetry.h:78
int findElement(GroupElement e) const
Definition: DynamicSymmetry.h:154
RV apply(const std::array< Index, N > &idx, RV initial, Args &&... args) const
Definition: DynamicSymmetry.h:59
std::vector< GroupElement > m_elements
Definition: DynamicSymmetry.h:113
RV apply(const std::vector< Index > &idx, RV initial, Args &&... args) const
Definition: DynamicSymmetry.h:69
GroupElement ge(Generator const &g) const
Definition: DynamicSymmetry.h:132
GroupElement mul(Generator g1, GroupElement g2) const
Definition: DynamicSymmetry.h:148
Definition: Symmetry.h:296
@ N
Definition: constructor.cpp:22
EIGEN_BLAS_FUNC() swap(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy)
Definition: level1_impl.h:117
char char char int int * k
Definition: level2_impl.h:374
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
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
Definition: DynamicSymmetry.h:105
constexpr Generator(int one_, int two_, int flags_)
Definition: DynamicSymmetry.h:109
int two
Definition: DynamicSymmetry.h:107
int flags
Definition: DynamicSymmetry.h:108
int one
Definition: DynamicSymmetry.h:106
Definition: DynamicSymmetry.h:96
int flags
Definition: DynamicSymmetry.h:98
bool isId() const
Definition: DynamicSymmetry.h:99
std::vector< int > representation
Definition: DynamicSymmetry.h:97
Definition: MoreMeta.h:55
Definition: MoreMeta.h:33
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