6#define EIGEN_NO_STATIC_ASSERT
12#define EigMajor Eigen::RowMajor
17using EigVX = Eigen::Matrix<T, Eigen::Dynamic, 1, EigMajor>;
20using EigMX = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, EigMajor>;
23using EigAX = Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic, EigMajor>;
39 for (
int i = 0; i < n; ++i)
40 if (!std::isfinite((A[i])))
return false;
45 for (
int i = 0; i < n; ++i)
46 if (!std::isfinite(std::abs(A[i])))
return false;
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);
65 auto M1 = (!ad1) ? MapB.eval() : MapB.adjoint();
66 auto M2 = (N2 == 0) ? MapC.asDiagonal() : ((!ad2) ? MapC.eval() : MapC.adjoint());
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);
79 auto M1 = (!ad1) ? MapB.eval() : MapB.adjoint();
80 auto M2 = (N2 == 0) ? MapC.asDiagonal() : ((!ad2) ? MapC.eval() : MapC.adjoint());
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);
93 auto M1 = (!ad1) ? MapB.eval() : MapB.adjoint();
94 auto M2 = (N2 == 0) ? MapC.asDiagonal() : ((!ad2) ? MapC.eval() : MapC.adjoint());
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);
107 auto M1 = (!ad1) ? MapB.eval() : MapB.adjoint();
108 auto M2 = (N2 == 0) ? MapC.asDiagonal() : ((!ad2) ? MapC.eval() : MapC.adjoint());
169 size_t N1,
size_t N2,
size_t N0,
size_t N3) {
187 size_t N1,
size_t N2,
size_t N0,
size_t N3) {
205 size_t N1,
size_t N2,
size_t N0,
size_t N3) {
223 size_t N1,
size_t N2,
size_t N0,
size_t N3) {
241 size_t N1,
size_t N2,
size_t N0,
size_t N3) {
259 size_t N1,
size_t N2,
size_t N0,
size_t N3) {
277 size_t N1,
size_t N2,
size_t N0,
size_t N3) {
295 size_t N1,
size_t N2,
size_t N0,
size_t N3) {
315 auto res = (MapB.array() * (MapC.transpose()).array()).sum();
322 auto res = (MapB.array() * (MapC.transpose()).array()).sum();
329 auto res = (MapB.array() * (MapC.transpose()).array()).sum();
336 auto res = (MapB.array() * (MapC.transpose()).array()).sum();
343 auto res = (MapB.diagonal().array() * MapC.diagonal().array()).sum();
350 auto res = (MapB.diagonal().array() * MapC.diagonal().array()).sum();
357 auto res = (MapB.diagonal().array() * MapC.diagonal().array()).sum();
364 auto res = (MapB.diagonal().array() * MapC.diagonal().array()).sum();
371 auto res = (MapB.array() * (MapC.transpose()).array()).sum()
372 - (MapB.diagonal().array() * MapC.diagonal().array()).sum();
379 auto res = (MapB.array() * (MapC.transpose()).array()).sum()
380 - (MapB.diagonal().array() * MapC.diagonal().array()).sum();
387 auto res = (MapB.array() * (MapC.transpose()).array()).sum()
388 - (MapB.diagonal().array() * MapC.diagonal().array()).sum();
395 auto res = (MapB.array() * (MapC.transpose()).array()).sum()
396 - (MapB.diagonal().array() * MapC.diagonal().array()).sum();
462 MapA.diagonal() = MapB.diagonal();
469 MapA.diagonal() = MapB.diagonal();
476 MapA.diagonal() = MapB.diagonal();
502 MapMXr Map_Anew(A, N2, N1);
503 Map_Anew = Map_A.adjoint().eval();
508 MapMXc Map_Anew(A, N2, N1);
509 Map_Anew = Map_A.adjoint().eval();
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)
#define ARRAY_MATMUL_TRANS1(_A, _B, _C, _n1, _n2, _n3)
#define ARRAY_TRACE2(_B, _C, _n1, _n2)
#define ARRAY_CLEAR(_A, _n)
< http://warp.povusers.org/FunctionParser/fparser.html
bool ARRAY_ISFINITE(kids_real *A, size_t n)
Check if all elements of a real array are finite.
Eigen::Map< EigVXc > MapVXc
Eigen::Map< EigAXc > MapAXc
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.
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.
Eigen::Matrix< T, Eigen::Dynamic, 1, EigMajor > EigVX
EigMX< kids_complex > EigAXc
EigVX< kids_complex > EigVXc
EigMX< kids_real > EigMXr
void ARRAY_TRANSPOSE(kids_real *A, size_t N1, size_t N2)
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.
double kids_real
Alias for real number type.
std::complex< double > kids_complex
Alias for complex number type.
Eigen::Map< EigMXc > MapMXc
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.
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,...
EigMX< kids_complex > EigMXc
Eigen::Map< EigMXr > MapMXr
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.
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)
EigMX< kids_real > EigAXr
Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic, EigMajor > EigMX
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.
Eigen::Map< EigAXr > MapAXr
Eigen::Map< EigVXr > MapVXr
EigVX< kids_real > EigVXr
int kids_int
Alias for integer type.
Eigen::Array< T, Eigen::Dynamic, Eigen::Dynamic, EigMajor > EigAX