20 #include <tensor/tensor.h>
25 static void trace_loop(n *C,
const n *D, index a1, index a2, index a3, index a4, index a5)
29 index a2b = std::min(a2, a4);
31 for (index m = 0; m < a5; m++) {
32 for (index l = 0; l < a2b; l++) {
33 for (index k = 0; k < a3; k++) {
35 D[l + a2 * (k + a3 * (l + a4 * m))];
40 for (index m = 0; m < a5; m++) {
41 for (index l = 0; l < a2b; l++) {
42 for (index k = 0; k < a3; k++) {
43 for (index i = 0; i < a1; i++) {
44 C[i + a1 * (k + a3 * m)] +=
45 D[i + a1 * (l + a2 * (k + a3 * (l + a4 * m)))];
53 template<
typename elt_t>
54 static const Tensor<elt_t> do_trace(
const Tensor<elt_t> &D, index i1, index i2)
56 assert(i1 < D.rank() && i1 > -D.rank());
57 assert(i2 < D.rank() && i2 > -D.rank());
64 }
else if (i2 == i1) {
65 std::cerr <<
"In trace(D, i, j), indices 'i' and 'j' are the same." << std::endl;
69 index a1, a2, a3, a4, a5, i, rank;
70 Indices dimensions(std::max(D.rank() - 2, 1));
71 dimensions.at(rank=0) = 1;
72 for (a1 = 1, i = 0; i < i1; ) {
73 a1 *= (dimensions.at(rank++) = D.dimension(i++));
75 a2 = D.dimension(i++);
76 for (a3 = 1; i < i2; )
77 a3 *= (dimensions.at(rank++) = D.dimension(i++));
78 a4 = D.dimension(i++);
79 for (a5 = 1; i < D.rank(); )
80 a5 *= (dimensions.at(rank++) = D.dimension(i++));
83 trace_loop<elt_t>(output.begin(), D.begin(), a1, a2, a3, a4, a5);
int rank() const
Number of Tensor indices.
static const Tensor< elt_t > zeros(index rows)
Matrix of zeros.