|
| 1 | +#include"../matrix.h" |
| 2 | +#include"gtest/gtest.h" |
| 3 | + |
| 4 | +/************************************************ |
| 5 | +* unit test of class matrix and related functions |
| 6 | +***********************************************/ |
| 7 | + |
| 8 | +/** |
| 9 | + * - Tested functions of class matrix: |
| 10 | + * - constructor: |
| 11 | + * - constructed by nrow and ncloumn |
| 12 | + * - constructed by a matrix |
| 13 | + * - constructed by the rvalue of a matrix |
| 14 | + * - function create |
| 15 | + * - operator "=": assigned by a matrix or the rvalue of a matrix |
| 16 | + * - operator "()": access the element |
| 17 | + * - operator "*=", "+=", "-=" |
| 18 | + * - function trace_on |
| 19 | + * - function zero_out |
| 20 | + * - function max/min/absmax |
| 21 | + * - function norm |
| 22 | + * - function print (not called in abacus, no need to test) |
| 23 | + * |
| 24 | + * - Tested functions related to class matrix |
| 25 | + * - operator "+", "-", "*" between two matrixs |
| 26 | + * - operator "*" between a double and a matrix, and reverse. |
| 27 | + * - function transpose |
| 28 | + * - function trace_on |
| 29 | + * - function mdot |
| 30 | + * |
| 31 | + */ |
| 32 | + |
| 33 | +//a mock function of WARNING_QUIT, to avoid the uncorrected call by matrix.cpp at line 37. |
| 34 | +namespace ModuleBase |
| 35 | +{ |
| 36 | + void WARNING_QUIT(const std::string &file,const std::string &description) {return ;} |
| 37 | +} |
| 38 | + |
| 39 | +class matrixTest : public testing::Test |
| 40 | +{ |
| 41 | + protected: |
| 42 | + ModuleBase::matrix m23a,m33a,m33b,m33c,m34a,m34b; |
| 43 | + |
| 44 | + void SetUp() |
| 45 | + { |
| 46 | + m23a.create(2,3); |
| 47 | + for (int i=1;i<=6;++i) {m23a.c[i-1] = i*1.0;} |
| 48 | + |
| 49 | + m33a.create(3,3); |
| 50 | + for (int i=1;i<=9;++i) {m33a.c[i-1] = i*1.0;} |
| 51 | + |
| 52 | + m33b.create(3,3); |
| 53 | + for (int i=1;i<=9;++i) {m33b.c[i-1] = i*11.1;} |
| 54 | + |
| 55 | + m33c.create(3,3,true); |
| 56 | + m34a.create(3,4,true); |
| 57 | + m34b.create(3,4,true); |
| 58 | + } |
| 59 | + |
| 60 | +}; |
| 61 | + |
| 62 | +TEST(matrix,ConstructorNrNc) |
| 63 | +{ |
| 64 | + ModuleBase::matrix m(3,4,true); |
| 65 | + EXPECT_EQ(m.nr,3); |
| 66 | + EXPECT_EQ(m.nc,4); |
| 67 | + EXPECT_DOUBLE_EQ(m(0,0),0.0); |
| 68 | +} |
| 69 | + |
| 70 | +TEST_F(matrixTest,ConstructorMatrix) |
| 71 | +{ |
| 72 | + ModuleBase::matrix m(m33a); |
| 73 | + int mnr = m.nr; |
| 74 | + EXPECT_EQ(mnr,m33a.nr); |
| 75 | + EXPECT_EQ(m.nc,m33a.nc); |
| 76 | + for (int i=0;i<9;++i) |
| 77 | + { |
| 78 | + EXPECT_DOUBLE_EQ(m.c[i],m33a.c[i]); |
| 79 | + } |
| 80 | +} |
| 81 | + |
| 82 | +TEST_F(matrixTest,ConstructorMtrixRValue) |
| 83 | +{ |
| 84 | + |
| 85 | + ModuleBase::matrix m(3.0*m33a); |
| 86 | + EXPECT_EQ(m.nr,m33a.nr); |
| 87 | + EXPECT_EQ(m.nc,m33a.nc); |
| 88 | + for (int i=0;i<9;++i) |
| 89 | + { |
| 90 | + EXPECT_DOUBLE_EQ(m.c[i],m33a.c[i] * 3.0); |
| 91 | + } |
| 92 | +} |
| 93 | + |
| 94 | +TEST_F(matrixTest,Create) |
| 95 | +{ |
| 96 | + m33a.create(13,14,true); |
| 97 | + EXPECT_EQ(m33a.nr,13); |
| 98 | + EXPECT_EQ(m33a.nc,14); |
| 99 | + for(int i=0;i<13*14;++i) |
| 100 | + { |
| 101 | + EXPECT_DOUBLE_EQ(m33a.c[i],0.0); |
| 102 | + } |
| 103 | +} |
| 104 | + |
| 105 | +TEST_F(matrixTest,OperatorEqualMatrix) |
| 106 | +{ |
| 107 | + ModuleBase::matrix m; |
| 108 | + m = m33a; |
| 109 | + EXPECT_EQ(m.nr,m33a.nr); |
| 110 | + EXPECT_EQ(m.nc,m33a.nc); |
| 111 | + for (int i=0;i<9;++i) |
| 112 | + { |
| 113 | + EXPECT_DOUBLE_EQ(m.c[i],m33a.c[i]); |
| 114 | + } |
| 115 | + |
| 116 | + m23a = m33a; |
| 117 | + EXPECT_EQ(m23a.nr,m33a.nr); |
| 118 | + EXPECT_EQ(m23a.nc,m33a.nc); |
| 119 | +} |
| 120 | + |
| 121 | +TEST_F(matrixTest,OperatorEqualMatrixRvalue) |
| 122 | +{ |
| 123 | + ModuleBase::matrix m; |
| 124 | + m = 3.0 * m33a; |
| 125 | + EXPECT_EQ(m.nr,m33a.nr); |
| 126 | + EXPECT_EQ(m.nc,m33a.nc); |
| 127 | + for (int i=0;i<9;++i) |
| 128 | + { |
| 129 | + EXPECT_DOUBLE_EQ(m.c[i],m33a.c[i] * 3.0); |
| 130 | + } |
| 131 | +} |
| 132 | + |
| 133 | +TEST_F(matrixTest,OperatorParentheses) |
| 134 | +{ |
| 135 | + //EXPECT_DEATH(m33a(3,3),""); |
| 136 | + //EXPECT_DEATH(m33a(-1,0),""); |
| 137 | + m33a(0,0) = 1.1; |
| 138 | + EXPECT_DOUBLE_EQ(m33a(0,0),1.1); |
| 139 | +} |
| 140 | + |
| 141 | +TEST_F(matrixTest,OperatorMultiplyEqual) |
| 142 | +{ |
| 143 | + m33b = m33a; |
| 144 | + m33a *= 11.1; |
| 145 | + for (int i=0;i<m33a.nr;++i) |
| 146 | + { |
| 147 | + for (int j=0;j<m33a.nc;++j) |
| 148 | + { |
| 149 | + EXPECT_DOUBLE_EQ(m33a(i,j),m33b(i,j)*11.1); |
| 150 | + } |
| 151 | + } |
| 152 | +} |
| 153 | + |
| 154 | +TEST_F(matrixTest,OperatorPlusEqual) |
| 155 | +{ |
| 156 | + EXPECT_DEATH(m33a += m34a,""); |
| 157 | + |
| 158 | + m33c = m33a; |
| 159 | + m33a += m33b; |
| 160 | + for (int i=0;i<m33a.nr;++i) |
| 161 | + { |
| 162 | + for (int j=0;j<m33a.nc;++j) |
| 163 | + { |
| 164 | + EXPECT_DOUBLE_EQ(m33a(i,j),m33b(i,j)+m33c(i,j)); |
| 165 | + } |
| 166 | + } |
| 167 | +} |
| 168 | + |
| 169 | +TEST_F(matrixTest,OperatorMinusEqual) |
| 170 | +{ |
| 171 | + EXPECT_DEATH(m33a -= m34a,""); |
| 172 | + |
| 173 | + m33c = m33a; |
| 174 | + m33a -= m33b; |
| 175 | + for (int i=0;i<m33a.nr;++i) |
| 176 | + { |
| 177 | + for (int j=0;j<m33a.nc;++j) |
| 178 | + { |
| 179 | + EXPECT_DOUBLE_EQ(m33a(i,j),m33c(i,j)-m33b(i,j)); |
| 180 | + } |
| 181 | + } |
| 182 | +} |
| 183 | + |
| 184 | +TEST_F(matrixTest,ClassMatrixTraceOn) |
| 185 | +{ |
| 186 | + m33a(0,0) = 1.1; |
| 187 | + m33a(1,1) = 2.2; |
| 188 | + m33a(2,2) = 5.5; |
| 189 | + EXPECT_DOUBLE_EQ(m33a.trace_on(),8.8); |
| 190 | +} |
| 191 | + |
| 192 | +TEST_F(matrixTest,ClassMatrixZeroOut) |
| 193 | +{ |
| 194 | + m33a.zero_out(); |
| 195 | + for (int i=0;i<m33a.nr;++i) |
| 196 | + { |
| 197 | + for (int j=0;j<m33a.nc;++j) |
| 198 | + { |
| 199 | + EXPECT_DOUBLE_EQ(m33a(i,j),0.0); |
| 200 | + } |
| 201 | + } |
| 202 | +} |
| 203 | + |
| 204 | +TEST_F(matrixTest,ClassMatrixMaxMinAbsmax) |
| 205 | +{ |
| 206 | + m33a(1,0) = 9999.9; |
| 207 | + m33a(0,0) = -999999.9; |
| 208 | + EXPECT_DOUBLE_EQ(m33a.max(),9999.9); |
| 209 | + EXPECT_DOUBLE_EQ(m33a.min(),-999999.9); |
| 210 | + EXPECT_DOUBLE_EQ(m33a.absmax(),999999.9); |
| 211 | +} |
| 212 | + |
| 213 | +TEST_F(matrixTest,ClassMatrixNorm) |
| 214 | +{ |
| 215 | + EXPECT_NEAR(m33a.norm(),16.881943016134133728,1E-12); |
| 216 | + EXPECT_NEAR(m33b.norm(),187.38956747908889611,1E-12); |
| 217 | +} |
| 218 | + |
| 219 | +TEST_F(matrixTest,OperatorPlus) |
| 220 | +{ |
| 221 | + m33c = m33a + m33b; |
| 222 | + for (int i=0;i<m33a.nr;++i) |
| 223 | + { |
| 224 | + for (int j=0;j<m33a.nc;++j) |
| 225 | + { |
| 226 | + EXPECT_DOUBLE_EQ(m33c(i,j),m33a(i,j) + m33b(i,j)); |
| 227 | + } |
| 228 | + } |
| 229 | + //m33c = m33a + m34a; |
| 230 | + EXPECT_DEATH(m33a+m34a,""); |
| 231 | +} |
| 232 | + |
| 233 | + |
| 234 | +TEST_F(matrixTest,OperatorMinus) |
| 235 | +{ |
| 236 | + m33c = m33a - m33b; |
| 237 | + for (int i=0;i<m33a.nr;++i) |
| 238 | + { |
| 239 | + for (int j=0;j<m33a.nc;++j) |
| 240 | + { |
| 241 | + EXPECT_DOUBLE_EQ(m33c(i,j),m33a(i,j) - m33b(i,j)); |
| 242 | + } |
| 243 | + } |
| 244 | + EXPECT_DEATH(m33a-m34a,""); |
| 245 | +} |
| 246 | + |
| 247 | +TEST_F(matrixTest,OperatorMultiplyTwoMatrix) |
| 248 | +{ |
| 249 | + EXPECT_DEATH(m34a*m33a,""); |
| 250 | + |
| 251 | + m33a(0,0) = 1.0; m33a(0,1) = 2.0; m33a(0,2) = 3.0; |
| 252 | + m33a(1,0) = 4.0; m33a(1,1) = 5.0; m33a(1,2) = 6.0; |
| 253 | + m33a(2,0) = 7.0; m33a(2,1) = 8.0; m33a(2,2) = 9.0; |
| 254 | + |
| 255 | + m33b(0,0) = -3.0; m33b(0,1) = -2.0; m33b(0,2) = -1.0; |
| 256 | + m33b(1,0) = -6.0; m33b(1,1) = -5.0; m33b(1,2) = -4.0; |
| 257 | + m33b(2,0) = -9.0; m33b(2,1) = -8.0; m33b(2,2) = -7.0; |
| 258 | + |
| 259 | + m33c = m33a * m33b; |
| 260 | + EXPECT_DOUBLE_EQ(m33c(0,0),-42.0); |
| 261 | + EXPECT_DOUBLE_EQ(m33c(0,1),-36.0); |
| 262 | + EXPECT_DOUBLE_EQ(m33c(0,2),-30.0); |
| 263 | + EXPECT_DOUBLE_EQ(m33c(1,0),-96.0); |
| 264 | + EXPECT_DOUBLE_EQ(m33c(1,1),-81.0); |
| 265 | + EXPECT_DOUBLE_EQ(m33c(1,2),-66.0); |
| 266 | + EXPECT_DOUBLE_EQ(m33c(2,0),-150.0); |
| 267 | + EXPECT_DOUBLE_EQ(m33c(2,1),-126.0); |
| 268 | + EXPECT_DOUBLE_EQ(m33c(2,2),-102.0); |
| 269 | + |
| 270 | + m33c = m33b * m33a; |
| 271 | + EXPECT_DOUBLE_EQ(m33c(0,0),-18.0); |
| 272 | + EXPECT_DOUBLE_EQ(m33c(0,1),-24.0); |
| 273 | + EXPECT_DOUBLE_EQ(m33c(0,2),-30.0); |
| 274 | + EXPECT_DOUBLE_EQ(m33c(1,0),-54.0); |
| 275 | + EXPECT_DOUBLE_EQ(m33c(1,1),-69.0); |
| 276 | + EXPECT_DOUBLE_EQ(m33c(1,2),-84.0); |
| 277 | + EXPECT_DOUBLE_EQ(m33c(2,0),-90.0); |
| 278 | + EXPECT_DOUBLE_EQ(m33c(2,1),-114.0); |
| 279 | + EXPECT_DOUBLE_EQ(m33c(2,2),-138.0); |
| 280 | +} |
| 281 | + |
| 282 | +TEST_F(matrixTest,OperatorMultiplyDouble) |
| 283 | +{ |
| 284 | + m33b = 3.0 * m33a; |
| 285 | + m33c = m33a * 3.0; |
| 286 | + for(int i=1;i<=9;++i) |
| 287 | + { |
| 288 | + EXPECT_DOUBLE_EQ(m33b.c[i-1],m33a.c[i-1] * 3.0); |
| 289 | + EXPECT_DOUBLE_EQ(m33c.c[i-1],m33a.c[i-1] * 3.0); |
| 290 | + } |
| 291 | +} |
| 292 | + |
| 293 | +TEST_F(matrixTest,Transpose) |
| 294 | +{ |
| 295 | + m23a(0,0) = 1.0; m23a(0,1) = 2.0; m23a(0,2) = 3.0; |
| 296 | + m23a(1,0) = 4.0; m23a(1,1) = 5.0; m23a(1,2) = 6.0; |
| 297 | + ModuleBase::matrix m32a = transpose(m23a); |
| 298 | + |
| 299 | + EXPECT_DOUBLE_EQ(m32a(0,0),1.0); |
| 300 | + EXPECT_DOUBLE_EQ(m32a(0,1),4.0); |
| 301 | + EXPECT_DOUBLE_EQ(m32a(1,0),2.0); |
| 302 | + EXPECT_DOUBLE_EQ(m32a(1,1),5.0); |
| 303 | + EXPECT_DOUBLE_EQ(m32a(2,0),3.0); |
| 304 | + EXPECT_DOUBLE_EQ(m32a(2,1),6.0); |
| 305 | +} |
| 306 | + |
| 307 | +TEST_F(matrixTest,TraceOn) |
| 308 | +{ |
| 309 | + EXPECT_DEATH(trace_on(m23a,m33a),""); |
| 310 | + EXPECT_DEATH(trace_on(m34a,m33a),""); |
| 311 | + |
| 312 | + ModuleBase::matrix m32(3,2), m23(2,3); |
| 313 | + m23(0,0) = 1.0; m23(0,1) = 2.0; m23(0,2) = 3.0; |
| 314 | + m23(1,0) = 4.0; m23(1,1) = 5.0; m23(1,2) = 6.0; |
| 315 | + |
| 316 | + m32(0,0) = 12.0; m32(0,1) = 23.0; |
| 317 | + m32(1,0) = 34.0; m32(1,1) = 45.0; |
| 318 | + m32(2,0) = 56.0; m32(2,1) = 67.0; |
| 319 | + |
| 320 | + EXPECT_DOUBLE_EQ(trace_on(m23,m32),967.0); |
| 321 | + EXPECT_DOUBLE_EQ(trace_on(m32,m23),967.0); |
| 322 | +} |
| 323 | + |
| 324 | +TEST_F(matrixTest,MDot) |
| 325 | +{ |
| 326 | + EXPECT_DEATH(mdot(m23a,m33a),""); |
| 327 | + EXPECT_DEATH(mdot(m34a,m33a),""); |
| 328 | + EXPECT_DOUBLE_EQ(mdot(m33a,m33b),3163.5); |
| 329 | +} |
| 330 | + |
0 commit comments