1 #ifdef HAS_MATLAB_ENABLED
2 
3 #include "gtest/gtest.h"
4 #include "qpp.h"
5 
6 #include "MATLAB/matlab.hpp"
7 
8 using namespace qpp;
9 
10 // Unit testing "MATLAB/matlab.hpp"
11 
12 /******************************************************************************/
13 /// BEGIN template <typename Derived> dyn_mat<typename Derived::Scalar>
14 ///       load_MATLAB(const std::string& mat_file,
15 ///                       const std::string& var_name)
16 ///
17 ///       template <typename Derived> dyn_mat<typename Derived::Scalar>
18 ///       void save_MATLAB(const Eigen::MatrixBase <Derived>& A,
19 ///                            const std::string& mat_file,
20 ///                            const std::string& var_name,
21 ///                            const std::string& mode)
TEST(qpp_MATLAB_load_save_MATLAB,Matrix)22 TEST(qpp_MATLAB_load_save_MATLAB, Matrix) {
23     // matrices, complex, real and integer
24 
25     // DA = 1, DB = 1 degenerate case
26     idx DA = 1, DB = 1;
27     cmat A = rand<cmat>(DA, DB);
28     dmat B = rand<dmat>(DA, DB);
29     dyn_mat<int> C = Eigen::MatrixXi::Random(DA, DB);
30 
31     save_MATLAB(A, "out.mat", "A", "w");
32     cmat loadA = load_MATLAB<cmat>("out.mat", "A");
33     EXPECT_NEAR(0, norm(loadA - A), 1e-7);
34 
35     save_MATLAB(B, "out.mat", "B", "w");
36     dmat loadB = load_MATLAB<dmat>("out.mat", "B");
37     EXPECT_NEAR(0, norm(loadB - B), 1e-7);
38 
39     save_MATLAB(C, "out.mat", "C", "w");
40     Eigen::MatrixXi loadC = load_MATLAB<Eigen::MatrixXi>("out.mat", "C");
41     EXPECT_NEAR(0, norm(loadC - C), 1e-7);
42 
43     // DA = 1, DB = 10
44     DA = 1, DB = 10;
45     A = rand<cmat>(DA, DB);
46     B = rand<dmat>(DA, DB);
47     C = Eigen::MatrixXi::Random(DA, DB);
48 
49     save_MATLAB(A, "out.mat", "A", "w");
50     loadA = load_MATLAB<cmat>("out.mat", "A");
51     EXPECT_NEAR(0, norm(loadA - A), 1e-7);
52 
53     save_MATLAB(B, "out.mat", "B", "w");
54     loadB = load_MATLAB<dmat>("out.mat", "B");
55     EXPECT_NEAR(0, norm(loadB - B), 1e-7);
56 
57     save_MATLAB(C, "out.mat", "C", "w");
58     loadC = load_MATLAB<Eigen::MatrixXi>("out.mat", "C");
59     EXPECT_NEAR(0, norm(loadC - C), 1e-7);
60 
61     // DA = 32, DB = 24
62     DA = 32, DB = 24;
63     A = rand<cmat>(DA, DB);
64     B = rand<dmat>(DA, DB);
65     C = Eigen::MatrixXi::Random(DA, DB);
66 
67     save_MATLAB(A, "out.mat", "A", "w");
68     loadA = load_MATLAB<cmat>("out.mat", "A");
69     EXPECT_NEAR(0, norm(loadA - A), 1e-7);
70 
71     save_MATLAB(B, "out.mat", "B", "w");
72     loadB = load_MATLAB<dmat>("out.mat", "B");
73     EXPECT_NEAR(0, norm(loadB - B), 1e-7);
74 
75     save_MATLAB(C, "out.mat", "C", "w");
76     loadC = load_MATLAB<Eigen::MatrixXi>("out.mat", "C");
77     EXPECT_NEAR(0, norm(loadC - C), 1e-7);
78 
79     // expression
80     A = rand<cmat>(5, 5);
81     cmat expression = A * A + A;
82     save_MATLAB(A * A + A, "out.mat", "expression", "w");
83     cmat load_expression = load_MATLAB<cmat>("out.mat", "expression");
84     EXPECT_NEAR(0, norm(load_expression - expression), 1e-7);
85 }
86 /******************************************************************************/
TEST(qpp_MATLAB_load_save_MATLAB,Vector)87 TEST(qpp_MATLAB_load_save_MATLAB, Vector) {
88     // kets/row vectors, complex, real and integer
89 
90     // D = 1 degenerate case
91     idx D = 1;
92     ket A = randket(D);
93     dyn_row_vect<double> B = dyn_row_vect<double>::Random(D);
94     dyn_row_vect<int> C = dyn_row_vect<int>::Random(D);
95 
96     save_MATLAB(A, "out.mat", "A", "w");
97     ket loadA = load_MATLAB<ket>("out.mat", "A");
98     EXPECT_NEAR(0, norm(loadA - A), 1e-7);
99 
100     save_MATLAB(B, "out.mat", "B", "w");
101     dyn_row_vect<double> loadB =
102         load_MATLAB<dyn_row_vect<double>>("out.mat", "B");
103     EXPECT_NEAR(0, norm(loadB - B), 1e-7);
104 
105     save_MATLAB(C, "out.mat", "C", "w");
106     dyn_row_vect<int> loadC = load_MATLAB<dyn_row_vect<int>>("out.mat", "C");
107     EXPECT_NEAR(0, norm(loadC - C), 1e-7);
108 
109     // D = 32
110     D = 32;
111     A = randket(D);
112     B = dyn_row_vect<double>::Random(D);
113     C = dyn_row_vect<int>::Random(D);
114 
115     save_MATLAB(A, "out.mat", "A", "w");
116     loadA = load_MATLAB<ket>("out.mat", "A");
117     EXPECT_NEAR(0, norm(loadA - A), 1e-7);
118 
119     save_MATLAB(B, "out.mat", "B", "w");
120     loadB = load_MATLAB<dyn_row_vect<double>>("out.mat", "B");
121     EXPECT_NEAR(0, norm(loadB - B), 1e-7);
122 
123     save_MATLAB(C, "out.mat", "C", "w");
124     loadC = load_MATLAB<dyn_row_vect<int>>("out.mat", "C");
125     EXPECT_NEAR(0, norm(loadC - C), 1e-7);
126 
127     // expression
128     dyn_row_vect<int> expression = 3 * C + C;
129     save_MATLAB(3 * C + C, "out.mat", "expression", "w");
130     dyn_row_vect<int> load_expression =
131         load_MATLAB<dyn_row_vect<int>>("out.mat", "expression");
132     EXPECT_NEAR(0, norm(load_expression - expression), 1e-7);
133 }
134 /******************************************************************************/
135 
136 #endif // HAS_MATLAB_ENABLED
137