KIDS  ver-0.0.1
KIDS : Kernel Integrated Dynamics Simulator
Loading...
Searching...
No Matches
array_eigen.h
Go to the documentation of this file.
1#ifndef Array_Eigen_H
2#define Array_Eigen_H
3
4#include <Eigen/Dense>
5
6namespace ARRAY_EG {
7
8template <class T>
9using EigMX = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
10
11template <class T>
12void ARRAY_CLEAR(T* A, size_t N) {
13 memset(A, 0, N * sizeof(T));
14}
15
16template <class TA, class TB, class TC>
17void ARRAY_MATMUL(TA* A, TB* B, TC* C, size_t N1, size_t N2, size_t N3) {
18 Eigen::Map<EigMX<TA>> MapA(A, N1, N3);
19 Eigen::Map<EigMX<TB>> MapB(B, N1, N2);
20 Eigen::Map<EigMX<TC>> MapC(C, N2, N3);
21 MapA = MapB * MapC;
22}
23
24template <class TA, class TB, class TC>
25void ARRAY_MATMUL_TRANS1(TA* A, TB* B, TC* C, size_t N1, size_t N2, size_t N3) {
26 Eigen::Map<EigMX<TA>> MapA(A, N1, N3);
27 Eigen::Map<EigMX<TB>> MapB(B, N2, N1);
28 Eigen::Map<EigMX<TC>> MapC(C, N2, N3);
29 MapA = MapB.adjoint() * MapC;
30}
31
32template <class TA, class TB, class TC>
33void ARRAY_MATMUL_TRANS2(TA* A, TB* B, TC* C, size_t N1, size_t N2, size_t N3) {
34 Eigen::Map<EigMX<TA>> MapA(A, N1, N3);
35 Eigen::Map<EigMX<TB>> MapB(B, N1, N2);
36 Eigen::Map<EigMX<TC>> MapC(C, N3, N2);
37 MapA = MapB * MapC.adjoint();
38}
39
40template <class T>
41void ARRAY_OUTER_CONJ2(T* A, T* B, T* C, size_t N1, size_t N2) {
42 ARRAY_MATMUL_TRANS2(A, B, C, N1, 1, N2);
43}
44
45
46template <class TA, class T, class TC>
47void ARRAY_MATMUL3_TRANS1(TA* A, T* B, TC* C, T* D, size_t N1, size_t N2, size_t N0, size_t N3) {
48 if (N0 == 0) {
49 Eigen::Map<EigMX<TA>> MapA(A, N1, N3);
50 Eigen::Map<EigMX<T>> MapB(B, N2, N1);
51 Eigen::Map<EigMX<TC>> MapC(C, N2, 1);
52 Eigen::Map<EigMX<T>> MapD(D, N2, N3);
53 MapA = MapB.adjoint() * (MapC.asDiagonal() * MapD);
54 } else { // N0 == N2
55 Eigen::Map<EigMX<TA>> MapA(A, N1, N3);
56 Eigen::Map<EigMX<T>> MapB(B, N2, N1);
57 Eigen::Map<EigMX<TC>> MapC(C, N2, N2);
58 Eigen::Map<EigMX<T>> MapD(D, N2, N3);
59 MapA = MapB.adjoint() * (MapC * MapD);
60 }
61}
62
63template <class TA, class T, class TC>
64void ARRAY_MATMUL3_TRANS2(TA* A, T* B, TC* C, T* D, size_t N1, size_t N2, size_t N0, size_t N3) {
65 if (N0 == 0) {
66 Eigen::Map<EigMX<TA>> MapA(A, N1, N3);
67 Eigen::Map<EigMX<T>> MapB(B, N1, N2);
68 Eigen::Map<EigMX<TC>> MapC(C, N2, 1);
69 Eigen::Map<EigMX<T>> MapD(D, N3, N2);
70 MapA = MapB * (MapC.asDiagonal() * MapD.adjoint());
71 } else { // N0 == N2
72 Eigen::Map<EigMX<TA>> MapA(A, N1, N3);
73 Eigen::Map<EigMX<T>> MapB(B, N1, N2);
74 Eigen::Map<EigMX<TC>> MapC(C, N2, N2);
75 Eigen::Map<EigMX<T>> MapD(D, N3, N2);
76 MapA = MapB * (MapC * MapD.adjoint());
77 }
78}
79
80template <class TB, class TC>
81TB ARRAY_TRACE2(TB* B, TC* C, size_t N1, size_t N2) {
82 Eigen::Map<EigMX<TB>> MapB(B, N1, N2);
83 Eigen::Map<EigMX<TC>> MapC(C, N2, N1);
84 TB res = (MapB.array() * (MapC.transpose()).array()).sum();
85 return res;
86}
87
88template <class T>
89void ARRAY_EYE(T* A, size_t n) {
90 Eigen::Map<EigMX<T>> MapA(A, n, n);
91 MapA = EigMX<T>::Identity(n, n);
92}
93
94}; // namespace ARRAY_EG
95
96#endif // Array_Eigen_H
#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_OUTER_CONJ2(_A, _B, _C, _n1, _n2)
#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
Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > EigMX
Definition array_eigen.h:9