KIDS  ver-0.0.1
KIDS : Kernel Integrated Dynamics Simulator
Loading...
Searching...
No Matches
linalg.cpp
Go to the documentation of this file.
1#include "kids/linalg.h"
2
3#include <cmath>
4#include <complex>
5
6#define EIGEN_NO_STATIC_ASSERT
7
8#include "Eigen/Dense"
9#include "Eigen/QR"
10#include "kids/Types.h"
11
12#define EigMajor Eigen::RowMajor
13
14namespace PROJECT_NS {
15
16template <class T>
17using EigVX = Eigen::Matrix<T, Eigen::Dynamic, 1, EigMajor>;
18
19template <class T>
20using EigMX = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, EigMajor>;
21
22template <class T>
23using EigAX = Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic, EigMajor>;
24
31using MapVXr = Eigen::Map<EigVXr>;
32using MapVXc = Eigen::Map<EigVXc>;
33using MapMXr = Eigen::Map<EigMXr>;
34using MapMXc = Eigen::Map<EigMXc>;
35using MapAXr = Eigen::Map<EigAXr>;
36using MapAXc = Eigen::Map<EigAXc>;
37
38bool ARRAY_ISFINITE(kids_real* A, size_t n) {
39 for (int i = 0; i < n; ++i)
40 if (!std::isfinite((A[i]))) return false;
41 return true;
42}
43
44bool ARRAY_ISFINITE(kids_complex* A, size_t n) {
45 for (int i = 0; i < n; ++i)
46 if (!std::isfinite(std::abs(A[i]))) return false;
47 return true;
48}
49
50void ARRAY_CLEAR(kids_int* A, size_t N) { memset(A, 0, N * sizeof(kids_int)); }
51
52void ARRAY_CLEAR(kids_real* A, size_t N) { memset(A, 0, N * sizeof(kids_real)); }
53
54void ARRAY_CLEAR(kids_complex* A, size_t N) { memset(A, 0, N * sizeof(kids_complex)); }
55
56static void ARRAY_MATMUL_UNIVERSAL(kids_real* A, kids_real* B, kids_real* C, size_t N1, size_t N2, size_t N3,
57 bool ad1 = false, bool ad2 = false) {
58 size_t NB1 = (N2 == 0) ? ((!ad1) ? N1 : N3) : ((!ad1) ? N1 : N2);
59 size_t NB2 = (N2 == 0) ? ((!ad1) ? N3 : N1) : ((!ad1) ? N2 : N1);
60 size_t NC1 = (N2 == 0) ? N3 : ((!ad2) ? N2 : N3);
61 size_t NC2 = (N2 == 0) ? 1 : ((!ad2) ? N3 : N2);
62 MapMXr MapA(A, N1, N3);
63 MapMXr MapB(B, NB1, NB2);
64 MapMXr MapC(C, NC1, NC2);
65 auto M1 = (!ad1) ? MapB.eval() : MapB.adjoint();
66 auto M2 = (N2 == 0) ? MapC.asDiagonal() : ((!ad2) ? MapC.eval() : MapC.adjoint());
67 MapA = M1 * M2;
68}
69
71 size_t N1, size_t N2, size_t N3, bool ad1 = false, bool ad2 = false) {
72 size_t NB1 = (N2 == 0) ? ((!ad1) ? N1 : N3) : ((!ad1) ? N1 : N2);
73 size_t NB2 = (N2 == 0) ? ((!ad1) ? N3 : N1) : ((!ad1) ? N2 : N1);
74 size_t NC1 = (N2 == 0) ? N3 : ((!ad2) ? N2 : N3);
75 size_t NC2 = (N2 == 0) ? 1 : ((!ad2) ? N3 : N2);
76 MapMXc MapA(A, N1, N3);
77 MapMXc MapB(B, NB1, NB2);
78 MapMXc MapC(C, NC1, NC2);
79 auto M1 = (!ad1) ? MapB.eval() : MapB.adjoint();
80 auto M2 = (N2 == 0) ? MapC.asDiagonal() : ((!ad2) ? MapC.eval() : MapC.adjoint());
81 MapA = M1 * M2;
82}
83
85 size_t N1, size_t N2, size_t N3, bool ad1 = false, bool ad2 = false) {
86 size_t NB1 = (N2 == 0) ? ((!ad1) ? N1 : N3) : ((!ad1) ? N1 : N2);
87 size_t NB2 = (N2 == 0) ? ((!ad1) ? N3 : N1) : ((!ad1) ? N2 : N1);
88 size_t NC1 = (N2 == 0) ? N3 : ((!ad2) ? N2 : N3);
89 size_t NC2 = (N2 == 0) ? 1 : ((!ad2) ? N3 : N2);
90 MapMXc MapA(A, N1, N3);
91 MapMXr MapB(B, NB1, NB2);
92 MapMXc MapC(C, NC1, NC2);
93 auto M1 = (!ad1) ? MapB.eval() : MapB.adjoint();
94 auto M2 = (N2 == 0) ? MapC.asDiagonal() : ((!ad2) ? MapC.eval() : MapC.adjoint());
95 MapA = M1 * M2;
96}
97
99 size_t N1, size_t N2, size_t N3, bool ad1 = false, bool ad2 = false) {
100 size_t NB1 = (N2 == 0) ? ((!ad1) ? N1 : N3) : ((!ad1) ? N1 : N2);
101 size_t NB2 = (N2 == 0) ? ((!ad1) ? N3 : N1) : ((!ad1) ? N2 : N1);
102 size_t NC1 = (N2 == 0) ? N3 : ((!ad2) ? N2 : N3);
103 size_t NC2 = (N2 == 0) ? 1 : ((!ad2) ? N3 : N2);
104 MapMXc MapA(A, N1, N3);
105 MapMXc MapB(B, NB1, NB2);
106 MapMXr MapC(C, NC1, NC2);
107 auto M1 = (!ad1) ? MapB.eval() : MapB.adjoint();
108 auto M2 = (N2 == 0) ? MapC.asDiagonal() : ((!ad2) ? MapC.eval() : MapC.adjoint());
109 MapA = M1 * M2;
110}
111
112void ARRAY_MATMUL(kids_real* A, kids_real* B, kids_real* C, size_t N1, size_t N2, size_t N3) {
113 ARRAY_MATMUL_UNIVERSAL(A, B, C, N1, N2, N3, false, false);
114}
115
116void ARRAY_MATMUL(kids_complex* A, kids_complex* B, kids_complex* C, size_t N1, size_t N2, size_t N3) {
117 ARRAY_MATMUL_UNIVERSAL(A, B, C, N1, N2, N3, false, false);
118}
119
120void ARRAY_MATMUL(kids_complex* A, kids_real* B, kids_complex* C, size_t N1, size_t N2, size_t N3) {
121 ARRAY_MATMUL_UNIVERSAL(A, B, C, N1, N2, N3, false, false);
122}
123
124void ARRAY_MATMUL(kids_complex* A, kids_complex* B, kids_real* C, size_t N1, size_t N2, size_t N3) {
125 ARRAY_MATMUL_UNIVERSAL(A, B, C, N1, N2, N3, false, false);
126}
127
128void ARRAY_MATMUL_TRANS1(kids_real* A, kids_real* B, kids_real* C, size_t N1, size_t N2, size_t N3) {
129 ARRAY_MATMUL_UNIVERSAL(A, B, C, N1, N2, N3, true, false);
130}
131
132void ARRAY_MATMUL_TRANS1(kids_complex* A, kids_complex* B, kids_complex* C, size_t N1, size_t N2, size_t N3) {
133 ARRAY_MATMUL_UNIVERSAL(A, B, C, N1, N2, N3, true, false);
134}
135
136void ARRAY_MATMUL_TRANS1(kids_complex* A, kids_real* B, kids_complex* C, size_t N1, size_t N2, size_t N3) {
137 ARRAY_MATMUL_UNIVERSAL(A, B, C, N1, N2, N3, true, false);
138}
139
140void ARRAY_MATMUL_TRANS1(kids_complex* A, kids_complex* B, kids_real* C, size_t N1, size_t N2, size_t N3) {
141 ARRAY_MATMUL_UNIVERSAL(A, B, C, N1, N2, N3, true, false);
142}
143
144void ARRAY_MATMUL_TRANS2(kids_real* A, kids_real* B, kids_real* C, size_t N1, size_t N2, size_t N3) {
145 ARRAY_MATMUL_UNIVERSAL(A, B, C, N1, N2, N3, false, true);
146}
147
148void ARRAY_MATMUL_TRANS2(kids_complex* A, kids_complex* B, kids_complex* C, size_t N1, size_t N2, size_t N3) {
149 ARRAY_MATMUL_UNIVERSAL(A, B, C, N1, N2, N3, false, true);
150}
151
152void ARRAY_MATMUL_TRANS2(kids_complex* A, kids_real* B, kids_complex* C, size_t N1, size_t N2, size_t N3) {
153 ARRAY_MATMUL_UNIVERSAL(A, B, C, N1, N2, N3, false, true);
154}
155
156void ARRAY_MATMUL_TRANS2(kids_complex* A, kids_complex* B, kids_real* C, size_t N1, size_t N2, size_t N3) {
157 ARRAY_MATMUL_UNIVERSAL(A, B, C, N1, N2, N3, false, true);
158}
159
160void ARRAY_OUTER_TRANS2(kids_real* A, kids_real* B, kids_real* C, size_t N1, size_t N2) {
161 ARRAY_MATMUL_TRANS2(A, B, C, N1, 1, N2);
162}
163
164void ARRAY_OUTER_TRANS2(kids_complex* A, kids_complex* B, kids_complex* C, size_t N1, size_t N2) {
165 ARRAY_MATMUL_TRANS2(A, B, C, N1, 1, N2);
166}
167
169 size_t N1, size_t N2, size_t N0, size_t N3) {
170 // MapMXr MapA(A, N1, N3);
171 // MapMXr MapB(B, N2, N1);
172 // MapMXr MapD(D, N2, N3);
173 if (N0 == 0) { // assuming N1 == N2 == N3
174 ARRAY_MATMUL_TRANS1(A, B, C, N1, N0, N2);
175 ARRAY_MATMUL(A, A, D, N1, N2, N3);
176 // MapMXr MapC(C, N2, 1);
177 // MapA = (MapB.adjoint() * (MapC.asDiagonal() * MapD)).eval();
178 } else { // assuming N1 == N2 == N0 == N3
179 ARRAY_MATMUL_TRANS1(A, B, C, N1, N2, N2);
180 ARRAY_MATMUL(A, A, D, N1, N2, N3);
181 // MapMXr MapC(C, N2, N2);
182 // MapA = (MapB.adjoint() * (MapC * MapD)).eval();
183 }
184}
185
187 size_t N1, size_t N2, size_t N0, size_t N3) {
188 // MapMXc MapA(A, N1, N3);
189 // MapMXc MapB(B, N2, N1);
190 // MapMXc MapD(D, N2, N3);
191 if (N0 == 0) { // assuming N1 == N2 == N3
192 ARRAY_MATMUL_TRANS1(A, B, C, N1, N0, N2);
193 ARRAY_MATMUL(A, A, D, N1, N2, N3);
194 // MapMXc MapC(C, N2, 1);
195 // MapA = (MapB.adjoint() * (MapC.asDiagonal() * MapD)).eval();
196 } else { // assuming N1 == N2 == N0 == N3
197 ARRAY_MATMUL_TRANS1(A, B, C, N1, N2, N2);
198 ARRAY_MATMUL(A, A, D, N1, N2, N3);
199 // MapMXc MapC(C, N2, N2);
200 // MapA = (MapB.adjoint() * (MapC * MapD)).eval();
201 }
202}
203
205 size_t N1, size_t N2, size_t N0, size_t N3) {
206 // MapMXc MapA(A, N1, N3);
207 // MapMXr MapB(B, N2, N1);
208 // MapMXr MapD(D, N2, N3);
209 if (N0 == 0) { // assuming N1 == N2 == N3
210 ARRAY_MATMUL_TRANS1(A, B, C, N1, N0, N2);
211 ARRAY_MATMUL(A, A, D, N1, N2, N3);
212 // MapMXc MapC(C, N2, 1);
213 // MapA = (MapB.adjoint() * (MapC.asDiagonal() * MapD)).eval();
214 } else { // assuming N1 == N2 == N0 == N3
215 ARRAY_MATMUL_TRANS1(A, B, C, N1, N2, N2);
216 ARRAY_MATMUL(A, A, D, N1, N2, N3);
217 // MapMXc MapC(C, N2, N2);
218 // MapA = (MapB.adjoint() * (MapC * MapD)).eval();
219 }
220}
221
223 size_t N1, size_t N2, size_t N0, size_t N3) {
224 // MapMXc MapA(A, N1, N3);
225 // MapMXc MapB(B, N2, N1);
226 // MapMXc MapD(D, N2, N3);
227 if (N0 == 0) { // assuming N1 == N2 == N3
228 ARRAY_MATMUL_TRANS1(A, B, C, N1, N0, N2);
229 ARRAY_MATMUL(A, A, D, N1, N2, N3);
230 // MapMXr MapC(C, N2, 1);
231 // MapA = (MapB.adjoint() * (MapC.asDiagonal() * MapD)).eval();
232 } else { // assuming N1 == N2 == N0 == N3
233 ARRAY_MATMUL_TRANS1(A, B, C, N1, N2, N2);
234 ARRAY_MATMUL(A, A, D, N1, N2, N3);
235 // MapMXr MapC(C, N2, N2);
236 // MapA = (MapB.adjoint() * (MapC * MapD)).eval();
237 }
238}
239
241 size_t N1, size_t N2, size_t N0, size_t N3) {
242 // MapMXr MapA(A, N1, N3);
243 // MapMXr MapB(B, N1, N2);
244 // MapMXr MapD(D, N3, N2);
245 if (N0 == 0) { // assuming N1 == N2 == N3
246 ARRAY_MATMUL(A, B, C, N1, N0, N2);
247 ARRAY_MATMUL_TRANS2(A, A, D, N1, N2, N3);
248 // MapMXr MapC(C, N2, 1);
249 // MapA = (MapB * (MapC.asDiagonal() * MapD.adjoint())).eval();
250 } else { // assuming N1 == N2 == N0 == N3
251 ARRAY_MATMUL(A, B, C, N1, N2, N2);
252 ARRAY_MATMUL_TRANS2(A, A, D, N1, N2, N3);
253 // MapMXr MapC(C, N2, N2);
254 // MapA = (MapB * (MapC * MapD.adjoint())).eval();
255 }
256}
257
259 size_t N1, size_t N2, size_t N0, size_t N3) {
260 // MapMXc MapA(A, N1, N3);
261 // MapMXc MapB(B, N1, N2);
262 // MapMXc MapD(D, N3, N2);
263 if (N0 == 0) { // assuming N1 == N2 == N3
264 ARRAY_MATMUL(A, B, C, N1, N0, N2);
265 ARRAY_MATMUL_TRANS2(A, A, D, N1, N2, N3);
266 // MapMXc MapC(C, N2, 1);
267 // MapA = (MapB * (MapC.asDiagonal() * MapD.adjoint())).eval();
268 } else { // assuming N1 == N2 == N0 == N3
269 ARRAY_MATMUL(A, B, C, N1, N2, N2);
270 ARRAY_MATMUL_TRANS2(A, A, D, N1, N2, N3);
271 // MapMXc MapC(C, N2, N2);
272 // MapA = (MapB * (MapC * MapD.adjoint())).eval();
273 }
274}
275
277 size_t N1, size_t N2, size_t N0, size_t N3) {
278 // MapMXc MapA(A, N1, N3);
279 // MapMXr MapB(B, N1, N2);
280 // MapMXr MapD(D, N3, N2);
281 if (N0 == 0) { // assuming N1 == N2 == N3
282 ARRAY_MATMUL(A, B, C, N1, N0, N2);
283 ARRAY_MATMUL_TRANS2(A, A, D, N1, N2, N3);
284 // MapMXc MapC(C, N2, 1);
285 // MapA = (MapB * (MapC.asDiagonal() * MapD.adjoint())).eval();
286 } else { // assuming N1 == N2 == N0 == N3
287 ARRAY_MATMUL(A, B, C, N1, N2, N2);
288 ARRAY_MATMUL_TRANS2(A, A, D, N1, N2, N3);
289 // MapMXc MapC(C, N2, N2);
290 // MapA = (MapB * (MapC * MapD.adjoint())).eval();
291 }
292}
293
295 size_t N1, size_t N2, size_t N0, size_t N3) {
296 // MapMXc MapA(A, N1, N3);
297 // MapMXc MapB(B, N1, N2);
298 // MapMXc MapD(D, N3, N2);
299 if (N0 == 0) { // assuming N1 == N2 == N3
300 ARRAY_MATMUL(A, B, C, N1, N0, N2);
301 ARRAY_MATMUL_TRANS2(A, A, D, N1, N2, N3);
302 // MapMXr MapC(C, N2, 1);
303 // MapA = (MapB * (MapC.asDiagonal() * MapD.adjoint())).eval();
304 } else { // assuming N1 == N2 == N0 == N3
305 ARRAY_MATMUL(A, B, C, N1, N2, N2);
306 ARRAY_MATMUL_TRANS2(A, A, D, N1, N2, N3);
307 // MapMXr MapC(C, N2, N2);
308 // MapA = (MapB * (MapC * MapD.adjoint())).eval();
309 }
310}
311
312kids_real ARRAY_TRACE2(kids_real* B, kids_real* C, size_t N1, size_t N2) {
313 MapMXr MapB(B, N1, N2);
314 MapMXr MapC(C, N2, N1);
315 auto res = (MapB.array() * (MapC.transpose()).array()).sum();
316 return res;
317}
318
319kids_complex ARRAY_TRACE2(kids_complex* B, kids_complex* C, size_t N1, size_t N2) {
320 MapMXc MapB(B, N1, N2);
321 MapMXc MapC(C, N2, N1);
322 auto res = (MapB.array() * (MapC.transpose()).array()).sum();
323 return res;
324}
325
326kids_complex ARRAY_TRACE2(kids_complex* B, kids_real* C, size_t N1, size_t N2) {
327 MapMXc MapB(B, N1, N2);
328 MapMXr MapC(C, N2, N1);
329 auto res = (MapB.array() * (MapC.transpose()).array()).sum();
330 return res;
331}
332
333kids_complex ARRAY_TRACE2(kids_real* B, kids_complex* C, size_t N1, size_t N2) {
334 MapMXr MapB(B, N1, N2);
335 MapMXc MapC(C, N2, N1);
336 auto res = (MapB.array() * (MapC.transpose()).array()).sum();
337 return res;
338}
339
340kids_real ARRAY_TRACE2_DIAG(kids_real* B, kids_real* C, size_t N1, size_t N2) {
341 MapMXr MapB(B, N1, N2);
342 MapMXr MapC(C, N2, N1);
343 auto res = (MapB.diagonal().array() * MapC.diagonal().array()).sum();
344 return res;
345}
346
348 MapMXc MapB(B, N1, N2);
349 MapMXc MapC(C, N2, N1);
350 auto res = (MapB.diagonal().array() * MapC.diagonal().array()).sum();
351 return res;
352}
353
355 MapMXc MapB(B, N1, N2);
356 MapMXr MapC(C, N2, N1);
357 auto res = (MapB.diagonal().array() * MapC.diagonal().array()).sum();
358 return res;
359}
360
362 MapMXr MapB(B, N1, N2);
363 MapMXc MapC(C, N2, N1);
364 auto res = (MapB.diagonal().array() * MapC.diagonal().array()).sum();
365 return res;
366}
367
368kids_real ARRAY_TRACE2_OFFD(kids_real* B, kids_real* C, size_t N1, size_t N2) {
369 MapMXr MapB(B, N1, N2);
370 MapMXr MapC(C, N2, N1);
371 auto res = (MapB.array() * (MapC.transpose()).array()).sum() //
372 - (MapB.diagonal().array() * MapC.diagonal().array()).sum();
373 return res;
374}
375
377 MapMXc MapB(B, N1, N2);
378 MapMXc MapC(C, N2, N1);
379 auto res = (MapB.array() * (MapC.transpose()).array()).sum() //
380 - (MapB.diagonal().array() * MapC.diagonal().array()).sum();
381 return res;
382}
383
385 MapMXc MapB(B, N1, N2);
386 MapMXr MapC(C, N2, N1);
387 auto res = (MapB.array() * (MapC.transpose()).array()).sum() //
388 - (MapB.diagonal().array() * MapC.diagonal().array()).sum();
389 return res;
390}
391
393 MapMXr MapB(B, N1, N2);
394 MapMXc MapC(C, N2, N1);
395 auto res = (MapB.array() * (MapC.transpose()).array()).sum() //
396 - (MapB.diagonal().array() * MapC.diagonal().array()).sum();
397 return res;
398}
399
401 kids_real res;
402 ARRAY_MATMUL_TRANS1(&res, B, C, 1, N1, 1);
403 return res;
404}
405
407 kids_complex res;
408 ARRAY_MATMUL_TRANS1(&res, B, C, 1, N1, 1);
409 return res;
410}
411
413 kids_complex res;
414 ARRAY_MATMUL_TRANS1(&res, B, C, 1, N1, 1);
415 return res;
416}
417
419 kids_complex res;
420 ARRAY_MATMUL_TRANS1(&res, B, C, 1, N1, 1);
421 return res;
422}
423
425 kids_real res;
426 ARRAY_MATMUL3_TRANS1(&res, B, C, D, 1, N1, N2, 1);
427 return res;
428}
429
431 kids_complex res;
432 ARRAY_MATMUL3_TRANS1(&res, B, C, D, 1, N1, N2, 1);
433 return res;
434}
435
437 kids_complex res;
438 ARRAY_MATMUL3_TRANS1(&res, B, C, D, 1, N1, N2, 1);
439 return res;
440}
441
443 kids_complex res;
444 ARRAY_MATMUL3_TRANS1(&res, B, C, D, 1, N1, N2, 1);
445 return res;
446}
447
448void ARRAY_EYE(kids_real* A, size_t n) {
449 MapMXr MapA(A, n, n);
450 MapA = EigMX<kids_real>::Identity(n, n);
451}
452
453void ARRAY_EYE(kids_complex* A, size_t n) {
454 MapMXc MapA(A, n, n);
456}
457
458void ARRAY_MAT_DIAG(kids_real* A, kids_real* B, size_t N1) {
459 MapMXr MapA(A, N1, N1);
460 MapMXr MapB(B, N1, N1);
461 ARRAY_CLEAR(A, N1 * N1);
462 MapA.diagonal() = MapB.diagonal();
463}
464
465void ARRAY_MAT_DIAG(kids_complex* A, kids_complex* B, size_t N1) {
466 MapMXc MapA(A, N1, N1);
467 MapMXc MapB(B, N1, N1);
468 ARRAY_CLEAR(A, N1 * N1);
469 MapA.diagonal() = MapB.diagonal();
470}
471
472void ARRAY_MAT_DIAG(kids_complex* A, kids_real* B, size_t N1) {
473 MapMXc MapA(A, N1, N1);
474 MapMXr MapB(B, N1, N1);
475 ARRAY_CLEAR(A, N1 * N1);
476 MapA.diagonal() = MapB.diagonal();
477}
478
479void ARRAY_MAT_OFFD(kids_real* A, kids_real* B, size_t N1) {
480 MapMXr MapA(A, N1, N1);
481 MapMXr MapB(B, N1, N1);
482 MapA = MapB;
483 MapA.diagonal().array() = kids_real(0);
484}
485
486void ARRAY_MAT_OFFD(kids_complex* A, kids_complex* B, size_t N1) {
487 MapMXc MapA(A, N1, N1);
488 MapMXc MapB(B, N1, N1);
489 MapA = MapB;
490 MapA.diagonal().array() = kids_complex(0, 0);
491}
492
493void ARRAY_MAT_OFFD(kids_complex* A, kids_real* B, size_t N1) {
494 MapMXc MapA(A, N1, N1);
495 MapMXr MapB(B, N1, N1);
496 MapA = MapB;
497 MapA.diagonal().array() = kids_complex(0, 0);
498}
499
500void ARRAY_TRANSPOSE(kids_real* A, size_t N1, size_t N2) {
501 MapMXr Map_A(A, N1, N2);
502 MapMXr Map_Anew(A, N2, N1);
503 Map_Anew = Map_A.adjoint().eval();
504}
505
506void ARRAY_TRANSPOSE(kids_complex* A, size_t N1, size_t N2) {
507 MapMXc Map_A(A, N1, N2);
508 MapMXc Map_Anew(A, N2, N1);
509 Map_Anew = Map_A.adjoint().eval();
510}
511
512}; // namespace PROJECT_NS
definition of types in the project and some utiles for types
#define ARRAY_MATMUL_TRANS2(_A, _B, _C, _n1, _n2, _n3)
#define ARRAY_MATMUL3_TRANS1(_A, _B, _C, _D, _n1, _n2, _n0, _n3)
#define ARRAY_MATMUL3_TRANS2(_A, _B, _C, _D, _n1, _n2, _n0, _n3)
#define ARRAY_MATMUL(_A, _B, _C, _n1, _n2, _n3)
#define ARRAY_EYE(_A, _n)
Definition array_macro.h:75
#define ARRAY_MATMUL_TRANS1(_A, _B, _C, _n1, _n2, _n3)
#define ARRAY_TRACE2(_B, _C, _n1, _n2)
#define ARRAY_CLEAR(_A, _n)
Definition array_macro.h:36
Provide linalg APIs.
< http://warp.povusers.org/FunctionParser/fparser.html
Definition Context.h:39
bool ARRAY_ISFINITE(kids_real *A, size_t n)
Check if all elements of a real array are finite.
Definition linalg.cpp:38
Eigen::Map< EigVXc > MapVXc
Definition linalg.cpp:32
Eigen::Map< EigAXc > MapAXc
Definition linalg.cpp:36
void ARRAY_MAT_DIAG(kids_real *A, kids_real *B, size_t N1)
Copy the diagonal elements from matrix B to matrix A for real matrices.
Definition linalg.cpp:458
kids_real ARRAY_INNER_TRANS1(kids_real *B, kids_real *C, size_t N1)
Compute the inner product of the transpose of B with C for real matrices.
Definition linalg.cpp:400
Eigen::Matrix< T, Eigen::Dynamic, 1, EigMajor > EigVX
Definition linalg.cpp:17
EigMX< kids_complex > EigAXc
Definition linalg.cpp:30
EigVX< kids_complex > EigVXc
Definition linalg.cpp:26
EigMX< kids_real > EigMXr
Definition linalg.cpp:27
void ARRAY_TRANSPOSE(kids_real *A, size_t N1, size_t N2)
Definition linalg.cpp:500
void ARRAY_MAT_OFFD(kids_real *A, kids_real *B, size_t N1)
Copy the off-diagonal elements from matrix B to matrix A for real matrices.
Definition linalg.cpp:479
double kids_real
Alias for real number type.
Definition Types.h:59
std::complex< double > kids_complex
Alias for complex number type.
Definition Types.h:60
Eigen::Map< EigMXc > MapMXc
Definition linalg.cpp:34
void ARRAY_OUTER_TRANS2(kids_real *A, kids_real *B, kids_real *C, size_t N1, size_t N2)
Perform outer product with transpose where A = B^T * C for real matrices.
Definition linalg.cpp:160
kids_real ARRAY_INNER_VMV_TRANS1(kids_real *B, kids_real *C, kids_real *D, size_t N1, size_t N2)
Compute the inner product of the transpose of the real vector B with the matrix C,...
Definition linalg.cpp:424
EigMX< kids_complex > EigMXc
Definition linalg.cpp:28
Eigen::Map< EigMXr > MapMXr
Definition linalg.cpp:33
kids_real ARRAY_TRACE2_DIAG(kids_real *B, kids_real *C, size_t N1, size_t N2)
Compute the trace of the diagonal elements of the matrix product B * C for real matrices.
Definition linalg.cpp:340
static void ARRAY_MATMUL_UNIVERSAL(kids_real *A, kids_real *B, kids_real *C, size_t N1, size_t N2, size_t N3, bool ad1=false, bool ad2=false)
Definition linalg.cpp:56
EigMX< kids_real > EigAXr
Definition linalg.cpp:29
Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic, EigMajor > EigMX
Definition linalg.cpp:20
kids_real ARRAY_TRACE2_OFFD(kids_real *B, kids_real *C, size_t N1, size_t N2)
Compute the trace of the off-diagonal elements of the matrix product B * C for real matrices.
Definition linalg.cpp:368
Eigen::Map< EigAXr > MapAXr
Definition linalg.cpp:35
Eigen::Map< EigVXr > MapVXr
Definition linalg.cpp:31
EigVX< kids_real > EigVXr
Definition linalg.cpp:25
int kids_int
Alias for integer type.
Definition Types.h:57
Eigen::Array< T, Eigen::Dynamic, Eigen::Dynamic, EigMajor > EigAX
Definition linalg.cpp:23