15 namespace TestHelpers::TensorExpressions {
48 template <
typename DataType,
typename RhsSymmetry,
49 typename RhsTensorIndexTypeList,
auto& TensorIndexA,
50 auto& TensorIndexB,
auto& TensorIndexC,
auto& TensorIndexD>
52 Tensor<DataType, RhsSymmetry, RhsTensorIndexTypeList> R_abcd(5_st);
53 std::iota(R_abcd.begin(), R_abcd.end(), 0.0);
57 const std::int32_t rhs_symmetry_element_a = tmpl::at_c<RhsSymmetry, 0>::value;
58 const std::int32_t rhs_symmetry_element_b = tmpl::at_c<RhsSymmetry, 1>::value;
59 const std::int32_t rhs_symmetry_element_c = tmpl::at_c<RhsSymmetry, 2>::value;
60 const std::int32_t rhs_symmetry_element_d = tmpl::at_c<RhsSymmetry, 3>::value;
61 using rhs_tensorindextype_a = tmpl::at_c<RhsTensorIndexTypeList, 0>;
62 using rhs_tensorindextype_b = tmpl::at_c<RhsTensorIndexTypeList, 1>;
63 using rhs_tensorindextype_c = tmpl::at_c<RhsTensorIndexTypeList, 2>;
64 using rhs_tensorindextype_d = tmpl::at_c<RhsTensorIndexTypeList, 3>;
69 const Tensor<DataType, RhsSymmetry, RhsTensorIndexTypeList> L_abcd =
72 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
75 using L_abdc_symmetry =
76 Symmetry<rhs_symmetry_element_a, rhs_symmetry_element_b,
77 rhs_symmetry_element_d, rhs_symmetry_element_c>;
78 using L_abdc_tensorindextype_list =
79 tmpl::list<rhs_tensorindextype_a, rhs_tensorindextype_b,
80 rhs_tensorindextype_d, rhs_tensorindextype_c>;
81 const Tensor<DataType, L_abdc_symmetry, L_abdc_tensorindextype_list> L_abdc =
84 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
87 using L_acbd_symmetry =
88 Symmetry<rhs_symmetry_element_a, rhs_symmetry_element_c,
89 rhs_symmetry_element_b, rhs_symmetry_element_d>;
90 using L_acbd_tensorindextype_list =
91 tmpl::list<rhs_tensorindextype_a, rhs_tensorindextype_c,
92 rhs_tensorindextype_b, rhs_tensorindextype_d>;
93 const Tensor<DataType, L_acbd_symmetry, L_acbd_tensorindextype_list> L_acbd =
96 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
99 using L_acdb_symmetry =
100 Symmetry<rhs_symmetry_element_a, rhs_symmetry_element_c,
101 rhs_symmetry_element_d, rhs_symmetry_element_b>;
102 using L_acdb_tensorindextype_list =
103 tmpl::list<rhs_tensorindextype_a, rhs_tensorindextype_c,
104 rhs_tensorindextype_d, rhs_tensorindextype_b>;
105 const Tensor<DataType, L_acdb_symmetry, L_acdb_tensorindextype_list> L_acdb =
108 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
111 using L_adbc_symmetry =
112 Symmetry<rhs_symmetry_element_a, rhs_symmetry_element_d,
113 rhs_symmetry_element_b, rhs_symmetry_element_c>;
114 using L_adbc_tensorindextype_list =
115 tmpl::list<rhs_tensorindextype_a, rhs_tensorindextype_d,
116 rhs_tensorindextype_b, rhs_tensorindextype_c>;
117 const Tensor<DataType, L_adbc_symmetry, L_adbc_tensorindextype_list> L_adbc =
120 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
123 using L_adcb_symmetry =
124 Symmetry<rhs_symmetry_element_a, rhs_symmetry_element_d,
125 rhs_symmetry_element_c, rhs_symmetry_element_b>;
126 using L_adcb_tensorindextype_list =
127 tmpl::list<rhs_tensorindextype_a, rhs_tensorindextype_d,
128 rhs_tensorindextype_c, rhs_tensorindextype_b>;
129 const Tensor<DataType, L_adcb_symmetry, L_adcb_tensorindextype_list> L_adcb =
132 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
135 using L_bacd_symmetry =
136 Symmetry<rhs_symmetry_element_b, rhs_symmetry_element_a,
137 rhs_symmetry_element_c, rhs_symmetry_element_d>;
138 using L_bacd_tensorindextype_list =
139 tmpl::list<rhs_tensorindextype_b, rhs_tensorindextype_a,
140 rhs_tensorindextype_c, rhs_tensorindextype_d>;
141 const Tensor<DataType, L_bacd_symmetry, L_bacd_tensorindextype_list> L_bacd =
144 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
147 using L_badc_symmetry =
148 Symmetry<rhs_symmetry_element_b, rhs_symmetry_element_a,
149 rhs_symmetry_element_d, rhs_symmetry_element_c>;
150 using L_badc_tensorindextype_list =
151 tmpl::list<rhs_tensorindextype_b, rhs_tensorindextype_a,
152 rhs_tensorindextype_d, rhs_tensorindextype_c>;
153 const Tensor<DataType, L_badc_symmetry, L_badc_tensorindextype_list> L_badc =
156 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
159 using L_bcad_symmetry =
160 Symmetry<rhs_symmetry_element_b, rhs_symmetry_element_c,
161 rhs_symmetry_element_a, rhs_symmetry_element_d>;
162 using L_bcad_tensorindextype_list =
163 tmpl::list<rhs_tensorindextype_b, rhs_tensorindextype_c,
164 rhs_tensorindextype_a, rhs_tensorindextype_d>;
165 const Tensor<DataType, L_bcad_symmetry, L_bcad_tensorindextype_list> L_bcad =
168 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
171 using L_bcda_symmetry =
172 Symmetry<rhs_symmetry_element_b, rhs_symmetry_element_c,
173 rhs_symmetry_element_d, rhs_symmetry_element_a>;
174 using L_bcda_tensorindextype_list =
175 tmpl::list<rhs_tensorindextype_b, rhs_tensorindextype_c,
176 rhs_tensorindextype_d, rhs_tensorindextype_a>;
177 const Tensor<DataType, L_bcda_symmetry, L_bcda_tensorindextype_list> L_bcda =
180 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
183 using L_bdac_symmetry =
184 Symmetry<rhs_symmetry_element_b, rhs_symmetry_element_d,
185 rhs_symmetry_element_a, rhs_symmetry_element_c>;
186 using L_bdac_tensorindextype_list =
187 tmpl::list<rhs_tensorindextype_b, rhs_tensorindextype_d,
188 rhs_tensorindextype_a, rhs_tensorindextype_c>;
189 const Tensor<DataType, L_bdac_symmetry, L_bdac_tensorindextype_list> L_bdac =
192 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
195 using L_bdca_symmetry =
196 Symmetry<rhs_symmetry_element_b, rhs_symmetry_element_d,
197 rhs_symmetry_element_c, rhs_symmetry_element_a>;
198 using L_bdca_tensorindextype_list =
199 tmpl::list<rhs_tensorindextype_b, rhs_tensorindextype_d,
200 rhs_tensorindextype_c, rhs_tensorindextype_a>;
201 const Tensor<DataType, L_bdca_symmetry, L_bdca_tensorindextype_list> L_bdca =
204 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
207 using L_cabd_symmetry =
208 Symmetry<rhs_symmetry_element_c, rhs_symmetry_element_a,
209 rhs_symmetry_element_b, rhs_symmetry_element_d>;
210 using L_cabd_tensorindextype_list =
211 tmpl::list<rhs_tensorindextype_c, rhs_tensorindextype_a,
212 rhs_tensorindextype_b, rhs_tensorindextype_d>;
213 const Tensor<DataType, L_cabd_symmetry, L_cabd_tensorindextype_list> L_cabd =
216 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
219 using L_cadb_symmetry =
220 Symmetry<rhs_symmetry_element_c, rhs_symmetry_element_a,
221 rhs_symmetry_element_d, rhs_symmetry_element_b>;
222 using L_cadb_tensorindextype_list =
223 tmpl::list<rhs_tensorindextype_c, rhs_tensorindextype_a,
224 rhs_tensorindextype_d, rhs_tensorindextype_b>;
225 const Tensor<DataType, L_cadb_symmetry, L_cadb_tensorindextype_list> L_cadb =
228 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
231 using L_cbad_symmetry =
232 Symmetry<rhs_symmetry_element_c, rhs_symmetry_element_b,
233 rhs_symmetry_element_a, rhs_symmetry_element_d>;
234 using L_cbad_tensorindextype_list =
235 tmpl::list<rhs_tensorindextype_c, rhs_tensorindextype_b,
236 rhs_tensorindextype_a, rhs_tensorindextype_d>;
237 const Tensor<DataType, L_cbad_symmetry, L_cbad_tensorindextype_list> L_cbad =
240 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
243 using L_cbda_symmetry =
244 Symmetry<rhs_symmetry_element_c, rhs_symmetry_element_b,
245 rhs_symmetry_element_d, rhs_symmetry_element_a>;
246 using L_cbda_tensorindextype_list =
247 tmpl::list<rhs_tensorindextype_c, rhs_tensorindextype_b,
248 rhs_tensorindextype_d, rhs_tensorindextype_a>;
249 const Tensor<DataType, L_cbda_symmetry, L_cbda_tensorindextype_list> L_cbda =
252 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
255 using L_cdab_symmetry =
256 Symmetry<rhs_symmetry_element_c, rhs_symmetry_element_d,
257 rhs_symmetry_element_a, rhs_symmetry_element_b>;
258 using L_cdab_tensorindextype_list =
259 tmpl::list<rhs_tensorindextype_c, rhs_tensorindextype_d,
260 rhs_tensorindextype_a, rhs_tensorindextype_b>;
261 const Tensor<DataType, L_cdab_symmetry, L_cdab_tensorindextype_list> L_cdab =
264 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
267 using L_cdba_symmetry =
268 Symmetry<rhs_symmetry_element_c, rhs_symmetry_element_d,
269 rhs_symmetry_element_b, rhs_symmetry_element_a>;
270 using L_cdba_tensorindextype_list =
271 tmpl::list<rhs_tensorindextype_c, rhs_tensorindextype_d,
272 rhs_tensorindextype_b, rhs_tensorindextype_a>;
273 const Tensor<DataType, L_cdba_symmetry, L_cdba_tensorindextype_list> L_cdba =
276 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
279 using L_dabc_symmetry =
280 Symmetry<rhs_symmetry_element_d, rhs_symmetry_element_a,
281 rhs_symmetry_element_b, rhs_symmetry_element_c>;
282 using L_dabc_tensorindextype_list =
283 tmpl::list<rhs_tensorindextype_d, rhs_tensorindextype_a,
284 rhs_tensorindextype_b, rhs_tensorindextype_c>;
285 const Tensor<DataType, L_dabc_symmetry, L_dabc_tensorindextype_list> L_dabc =
288 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
291 using L_dacb_symmetry =
292 Symmetry<rhs_symmetry_element_d, rhs_symmetry_element_a,
293 rhs_symmetry_element_c, rhs_symmetry_element_b>;
294 using L_dacb_tensorindextype_list =
295 tmpl::list<rhs_tensorindextype_d, rhs_tensorindextype_a,
296 rhs_tensorindextype_c, rhs_tensorindextype_b>;
297 const Tensor<DataType, L_dacb_symmetry, L_dacb_tensorindextype_list> L_dacb =
300 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
303 using L_dbac_symmetry =
304 Symmetry<rhs_symmetry_element_d, rhs_symmetry_element_b,
305 rhs_symmetry_element_a, rhs_symmetry_element_c>;
306 using L_dbac_tensorindextype_list =
307 tmpl::list<rhs_tensorindextype_d, rhs_tensorindextype_b,
308 rhs_tensorindextype_a, rhs_tensorindextype_c>;
309 const Tensor<DataType, L_dbac_symmetry, L_dbac_tensorindextype_list> L_dbac =
312 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
315 using L_dbca_symmetry =
316 Symmetry<rhs_symmetry_element_d, rhs_symmetry_element_b,
317 rhs_symmetry_element_c, rhs_symmetry_element_a>;
318 using L_dbca_tensorindextype_list =
319 tmpl::list<rhs_tensorindextype_d, rhs_tensorindextype_b,
320 rhs_tensorindextype_c, rhs_tensorindextype_a>;
321 const Tensor<DataType, L_dbca_symmetry, L_dbca_tensorindextype_list> L_dbca =
324 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
327 using L_dcab_symmetry =
328 Symmetry<rhs_symmetry_element_d, rhs_symmetry_element_c,
329 rhs_symmetry_element_a, rhs_symmetry_element_b>;
330 using L_dcab_tensorindextype_list =
331 tmpl::list<rhs_tensorindextype_d, rhs_tensorindextype_c,
332 rhs_tensorindextype_a, rhs_tensorindextype_b>;
333 const Tensor<DataType, L_dcab_symmetry, L_dcab_tensorindextype_list> L_dcab =
336 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
339 using L_dcba_symmetry =
340 Symmetry<rhs_symmetry_element_d, rhs_symmetry_element_c,
341 rhs_symmetry_element_b, rhs_symmetry_element_a>;
342 using L_dcba_tensorindextype_list =
343 tmpl::list<rhs_tensorindextype_d, rhs_tensorindextype_c,
344 rhs_tensorindextype_b, rhs_tensorindextype_a>;
345 const Tensor<DataType, L_dcba_symmetry, L_dcba_tensorindextype_list> L_dcba =
348 R_abcd(TensorIndexA, TensorIndexB, TensorIndexC, TensorIndexD));
350 const size_t dim_a = tmpl::at_c<RhsTensorIndexTypeList, 0>::dim;
351 const size_t dim_b = tmpl::at_c<RhsTensorIndexTypeList, 1>::dim;
352 const size_t dim_c = tmpl::at_c<RhsTensorIndexTypeList, 2>::dim;
353 const size_t dim_d = tmpl::at_c<RhsTensorIndexTypeList, 3>::dim;
355 for (
size_t i = 0; i < dim_a; ++i) {
356 for (
size_t j = 0; j < dim_b; ++j) {
357 for (
size_t k = 0; k < dim_c; ++k) {
358 for (
size_t l = 0; l < dim_d; ++l) {
360 CHECK(L_abcd.get(i, j, k, l) == R_abcd.get(i, j, k, l));
362 CHECK(L_abdc.get(i, j, l, k) == R_abcd.get(i, j, k, l));
364 CHECK(L_acbd.get(i, k, j, l) == R_abcd.get(i, j, k, l));
366 CHECK(L_acdb.get(i, k, l, j) == R_abcd.get(i, j, k, l));
368 CHECK(L_adbc.get(i, l, j, k) == R_abcd.get(i, j, k, l));
370 CHECK(L_adcb.get(i, l, k, j) == R_abcd.get(i, j, k, l));
372 CHECK(L_bacd.get(j, i, k, l) == R_abcd.get(i, j, k, l));
374 CHECK(L_badc.get(j, i, l, k) == R_abcd.get(i, j, k, l));
376 CHECK(L_bcad.get(j, k, i, l) == R_abcd.get(i, j, k, l));
378 CHECK(L_bcda.get(j, k, l, i) == R_abcd.get(i, j, k, l));
380 CHECK(L_bdac.get(j, l, i, k) == R_abcd.get(i, j, k, l));
382 CHECK(L_bdca.get(j, l, k, i) == R_abcd.get(i, j, k, l));
384 CHECK(L_cabd.get(k, i, j, l) == R_abcd.get(i, j, k, l));
386 CHECK(L_cadb.get(k, i, l, j) == R_abcd.get(i, j, k, l));
388 CHECK(L_cbad.get(k, j, i, l) == R_abcd.get(i, j, k, l));
390 CHECK(L_cbda.get(k, j, l, i) == R_abcd.get(i, j, k, l));
392 CHECK(L_cdab.get(k, l, i, j) == R_abcd.get(i, j, k, l));
394 CHECK(L_cdba.get(k, l, j, i) == R_abcd.get(i, j, k, l));
396 CHECK(L_dabc.get(l, i, j, k) == R_abcd.get(i, j, k, l));
398 CHECK(L_dacb.get(l, i, k, j) == R_abcd.get(i, j, k, l));
400 CHECK(L_dbac.get(l, j, i, k) == R_abcd.get(i, j, k, l));
402 CHECK(L_dbca.get(l, j, k, i) == R_abcd.get(i, j, k, l));
404 CHECK(L_dcab.get(l, k, i, j) == R_abcd.get(i, j, k, l));
406 CHECK(L_dcba.get(l, k, j, i) == R_abcd.get(i, j, k, l));