17void ARRAY_MATMUL(TA* A, TB* B, TC* C,
size_t N1,
size_t N2,
size_t N3) {
18 std::array<size_t, 2> shapeA = {N1, N3};
19 std::array<size_t, 2> shapeB = {N1, N2};
20 std::array<size_t, 2> shapeC = {N2, N3};
21 auto a = xt::adapt(A, N1 * N3, xt::no_ownership(), shapeA);
22 auto b = xt::adapt(B, N1 * N2, xt::no_ownership(), shapeB);
23 auto c = xt::adapt(C, N2 * N3, xt::no_ownership(), shapeC);
24 a = xt::linalg::dot(b, c);
29 std::array<size_t, 2> shapeA = {N1, N3};
30 std::array<size_t, 2> shapeB = {N2, N1};
31 std::array<size_t, 2> shapeC = {N2, N3};
32 auto a = xt::adapt(A, N1 * N3, xt::no_ownership(), shapeA);
33 auto b = xt::adapt(B, N1 * N2, xt::no_ownership(), shapeB);
34 auto c = xt::adapt(C, N2 * N3, xt::no_ownership(), shapeC);
35 a = xt::linalg::dot(xt::transpose(b), c);
40 std::array<size_t, 2> shapeA = {N1, N3};
41 std::array<size_t, 2> shapeB = {N2, N1};
42 std::array<size_t, 2> shapeC = {N2, N3};
43 auto a = xt::adapt(A, N1 * N3, xt::no_ownership(), shapeA);
44 auto b = xt::adapt(B, N1 * N2, xt::no_ownership(), shapeB);
45 auto c = xt::adapt(C, N2 * N3, xt::no_ownership(), shapeC);
46 a = xt::linalg::dot(xt::transpose(xt::conj(b)), c);
51 std::array<size_t, 2> shapeA = {N1, N3};
52 std::array<size_t, 2> shapeB = {N1, N2};
53 std::array<size_t, 2> shapeC = {N3, N2};
54 auto a = xt::adapt(A, N1 * N3, xt::no_ownership(), shapeA);
55 auto b = xt::adapt(B, N1 * N2, xt::no_ownership(), shapeB);
56 auto c = xt::adapt(C, N2 * N3, xt::no_ownership(), shapeC);
57 a = xt::linalg::dot(b, xt::transpose(c));
62 std::array<size_t, 2> shapeA = {N1, N3};
63 std::array<size_t, 2> shapeB = {N1, N2};
64 std::array<size_t, 2> shapeC = {N3, N2};
65 auto a = xt::adapt(A, N1 * N3, xt::no_ownership(), shapeA);
66 auto b = xt::adapt(B, N1 * N2, xt::no_ownership(), shapeB);
67 auto c = xt::adapt(C, N2 * N3, xt::no_ownership(), shapeC);
68 a = xt::linalg::dot(b, xt::transpose(xt::conj(c)));
77void ARRAY_MATMUL3_TRANS1(TA* A, num_real* B, TC* C, num_real* D,
size_t N1,
size_t N2,
size_t N0,
size_t N3) {
79 std::array<size_t, 2> shapeA = {N1, N3};
80 std::array<size_t, 2> shapeB = {N2, N1};
81 std::array<size_t, 2> shapeC = {N2, 1};
82 std::array<size_t, 2> shapeD = {N2, N3};
83 auto a = xt::adapt(A, N1 * N3, xt::no_ownership(), shapeA);
84 auto b = xt::adapt(B, N1 * N2, xt::no_ownership(), shapeB);
85 auto c = xt::adapt(C, N2 * 1, xt::no_ownership(), shapeC);
86 auto d = xt::adapt(D, N2 * N3, xt::no_ownership(), shapeD);
88 a = xt::linalg::dot(xt::transpose(b), xt::linalg::dot(xt::diag(c), d));
91 std::array<size_t, 2> shapeA = {N1, N3};
92 std::array<size_t, 2> shapeB = {N2, N1};
93 std::array<size_t, 2> shapeC = {N2, N2};
94 std::array<size_t, 2> shapeD = {N2, N3};
95 auto a = xt::adapt(A, N1 * N3, xt::no_ownership(), shapeA);
96 auto b = xt::adapt(B, N1 * N2, xt::no_ownership(), shapeB);
97 auto c = xt::adapt(C, N2 * N2, xt::no_ownership(), shapeC);
98 auto d = xt::adapt(D, N2 * N3, xt::no_ownership(), shapeD);
100 a = xt::linalg::dot(xt::transpose(b), xt::linalg::dot(c, d));
105void ARRAY_MATMUL3_TRANS1(TA* A, num_complex* B, TC* C, num_complex* D,
size_t N1,
size_t N2,
size_t N0,
size_t N3) {
107 std::array<size_t, 2> shapeA = {N1, N3};
108 std::array<size_t, 2> shapeB = {N2, N1};
109 std::array<size_t, 2> shapeC = {N2, 1};
110 std::array<size_t, 2> shapeD = {N2, N3};
111 auto a = xt::adapt(A, N1 * N3, xt::no_ownership(), shapeA);
112 auto b = xt::adapt(B, N1 * N2, xt::no_ownership(), shapeB);
113 auto c = xt::adapt(C, N2 * 1, xt::no_ownership(), shapeC);
114 auto d = xt::adapt(D, N2 * N3, xt::no_ownership(), shapeD);
116 a = xt::linalg::dot(xt::transpose(xt::conj(b)), xt::linalg::dot(xt::diag(c), d));
119 std::array<size_t, 2> shapeA = {N1, N3};
120 std::array<size_t, 2> shapeB = {N2, N1};
121 std::array<size_t, 2> shapeC = {N2, N2};
122 std::array<size_t, 2> shapeD = {N2, N3};
123 auto a = xt::adapt(A, N1 * N3, xt::no_ownership(), shapeA);
124 auto b = xt::adapt(B, N1 * N2, xt::no_ownership(), shapeB);
125 auto c = xt::adapt(C, N2 * N2, xt::no_ownership(), shapeC);
126 auto d = xt::adapt(D, N2 * N3, xt::no_ownership(), shapeD);
128 a = xt::linalg::dot(xt::transpose(xt::conj(b)), xt::linalg::dot(c, d));
135 std::array<size_t, 2> shapeA = {N1, N3};
136 std::array<size_t, 2> shapeB = {N1, N2};
137 std::array<size_t, 2> shapeC = {N2, 1};
138 std::array<size_t, 2> shapeD = {N3, N2};
139 auto a = xt::adapt(A, N1 * N3, xt::no_ownership(), shapeA);
140 auto b = xt::adapt(B, N1 * N2, xt::no_ownership(), shapeB);
141 auto c = xt::adapt(C, N2 * 1, xt::no_ownership(), shapeC);
142 auto d = xt::adapt(D, N2 * N3, xt::no_ownership(), shapeD);
144 a = xt::linalg::dot(b, xt::linalg::dot(xt::diag(c), xt::transpose(d)));
146 std::array<size_t, 2> shapeA = {N1, N3};
147 std::array<size_t, 2> shapeB = {N1, N2};
148 std::array<size_t, 2> shapeC = {N2, N2};
149 std::array<size_t, 2> shapeD = {N3, N2};
150 auto a = xt::adapt(A, N1 * N3, xt::no_ownership(), shapeA);
151 auto b = xt::adapt(B, N1 * N2, xt::no_ownership(), shapeB);
152 auto c = xt::adapt(C, N2 * N2, xt::no_ownership(), shapeC);
153 auto d = xt::adapt(D, N2 * N3, xt::no_ownership(), shapeD);
155 a = xt::linalg::dot(b, xt::linalg::dot(c, xt::transpose(d)));
160void ARRAY_MATMUL3_TRANS2(TA* A, num_complex* B, TC* C, num_complex* D,
size_t N1,
size_t N2,
size_t N0,
size_t N3) {
162 std::array<size_t, 2> shapeA = {N1, N3};
163 std::array<size_t, 2> shapeB = {N1, N2};
164 std::array<size_t, 2> shapeC = {N2, 1};
165 std::array<size_t, 2> shapeD = {N3, N2};
166 auto a = xt::adapt(A, N1 * N3, xt::no_ownership(), shapeA);
167 auto b = xt::adapt(B, N1 * N2, xt::no_ownership(), shapeB);
168 auto c = xt::adapt(C, N2 * 1, xt::no_ownership(), shapeC);
169 auto d = xt::adapt(D, N2 * N3, xt::no_ownership(), shapeD);
171 a = xt::linalg::dot(b, xt::linalg::dot(xt::diag(c), xt::transpose(xt::conj(d))));
173 std::array<size_t, 2> shapeA = {N1, N3};
174 std::array<size_t, 2> shapeB = {N1, N2};
175 std::array<size_t, 2> shapeC = {N2, N2};
176 std::array<size_t, 2> shapeD = {N3, N2};
177 auto a = xt::adapt(A, N1 * N3, xt::no_ownership(), shapeA);
178 auto b = xt::adapt(B, N1 * N2, xt::no_ownership(), shapeB);
179 auto c = xt::adapt(C, N2 * N2, xt::no_ownership(), shapeC);
180 auto d = xt::adapt(D, N2 * N3, xt::no_ownership(), shapeD);
182 a = xt::linalg::dot(b, xt::linalg::dot(c, xt::transpose(xt::conj(d))));
188 std::array<size_t, 2> shapeB = {N1, N2};
189 std::array<size_t, 2> shapeC = {N2, N1};
190 auto b = xt::adapt(B, N1 * N2, xt::no_ownership(), shapeB);
191 auto c = xt::adapt(C, N2 * N1, xt::no_ownership(), shapeC);
193 TB res = xt::sum(b * xt::transpose(c))();