|
| 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 | + //EXPECT_DEATH(ModuleBase::matrix m(0,1),""); |
| 69 | + //EXPECT_DEATH(ModuleBase::matrix m(1,0),""); |
| 70 | + //EXPECT_DEATH(ModuleBase::matrix m(-1,1),""); |
| 71 | + //EXPECT_DEATH(ModuleBase::matrix m(1,-1),""); |
| 72 | +} |
| 73 | + |
| 74 | +TEST_F(matrixTest,constructorMatrix) |
| 75 | +{ |
| 76 | + ModuleBase::matrix m(m33a); |
| 77 | + int mnr = m.nr; |
| 78 | + EXPECT_EQ(mnr,m33a.nr); |
| 79 | + EXPECT_EQ(m.nc,m33a.nc); |
| 80 | + for (int i=0;i<9;++i) |
| 81 | + { |
| 82 | + EXPECT_DOUBLE_EQ(m.c[i],m33a.c[i]); |
| 83 | + } |
| 84 | +} |
| 85 | + |
| 86 | +TEST_F(matrixTest,constructorMtrixRvalue) |
| 87 | +{ |
| 88 | + |
| 89 | + ModuleBase::matrix m(3.0*m33a); |
| 90 | + EXPECT_EQ(m.nr,m33a.nr); |
| 91 | + EXPECT_EQ(m.nc,m33a.nc); |
| 92 | + for (int i=0;i<9;++i) |
| 93 | + { |
| 94 | + EXPECT_DOUBLE_EQ(m.c[i],m33a.c[i] * 3.0); |
| 95 | + } |
| 96 | +} |
| 97 | + |
| 98 | +TEST_F(matrixTest,create) |
| 99 | +{ |
| 100 | + m33a.create(13,14,true); |
| 101 | + EXPECT_EQ(m33a.nr,13); |
| 102 | + EXPECT_EQ(m33a.nc,14); |
| 103 | + for(int i=0;i<13*14;++i) |
| 104 | + { |
| 105 | + EXPECT_DOUBLE_EQ(m33a.c[i],0.0); |
| 106 | + } |
| 107 | +} |
| 108 | + |
| 109 | +TEST_F(matrixTest,operatorEqualMatrix) |
| 110 | +{ |
| 111 | + ModuleBase::matrix m; |
| 112 | + m = m33a; |
| 113 | + EXPECT_EQ(m.nr,m33a.nr); |
| 114 | + EXPECT_EQ(m.nc,m33a.nc); |
| 115 | + for (int i=0;i<9;++i) |
| 116 | + { |
| 117 | + EXPECT_DOUBLE_EQ(m.c[i],m33a.c[i]); |
| 118 | + } |
| 119 | + |
| 120 | + m23a = m33a; |
| 121 | + EXPECT_EQ(m23a.nr,m33a.nr); |
| 122 | + EXPECT_EQ(m23a.nc,m33a.nc); |
| 123 | +} |
| 124 | + |
| 125 | +TEST_F(matrixTest,operatorEqualMatrixRvalue) |
| 126 | +{ |
| 127 | + ModuleBase::matrix m; |
| 128 | + m = 3.0 * m33a; |
| 129 | + EXPECT_EQ(m.nr,m33a.nr); |
| 130 | + EXPECT_EQ(m.nc,m33a.nc); |
| 131 | + for (int i=0;i<9;++i) |
| 132 | + { |
| 133 | + EXPECT_DOUBLE_EQ(m.c[i],m33a.c[i] * 3.0); |
| 134 | + } |
| 135 | +} |
| 136 | + |
| 137 | +TEST_F(matrixTest,operatorParentheses) |
| 138 | +{ |
| 139 | + //EXPECT_DEATH(m33a(3,3),""); |
| 140 | + //EXPECT_DEATH(m33a(-1,0),""); |
| 141 | + m33a(0,0) = 1.1; |
| 142 | + EXPECT_DOUBLE_EQ(m33a(0,0),1.1); |
| 143 | +} |
| 144 | + |
| 145 | +TEST_F(matrixTest,operatorMultiplyEqual) |
| 146 | +{ |
| 147 | + m33b = m33a; |
| 148 | + m33a *= 11.1; |
| 149 | + for (int i=0;i<m33a.nr;++i) |
| 150 | + { |
| 151 | + for (int j=0;j<m33a.nc;++j) |
| 152 | + { |
| 153 | + EXPECT_DOUBLE_EQ(m33a(i,j),m33b(i,j)*11.1); |
| 154 | + } |
| 155 | + } |
| 156 | +} |
| 157 | + |
| 158 | +TEST_F(matrixTest,operatorPlusEqual) |
| 159 | +{ |
| 160 | + EXPECT_DEATH(m33a += m34a,""); |
| 161 | + |
| 162 | + m33c = m33a; |
| 163 | + m33a += m33b; |
| 164 | + for (int i=0;i<m33a.nr;++i) |
| 165 | + { |
| 166 | + for (int j=0;j<m33a.nc;++j) |
| 167 | + { |
| 168 | + EXPECT_DOUBLE_EQ(m33a(i,j),m33b(i,j)+m33c(i,j)); |
| 169 | + } |
| 170 | + } |
| 171 | +} |
| 172 | + |
| 173 | +TEST_F(matrixTest,operatorMinusEqual) |
| 174 | +{ |
| 175 | + EXPECT_DEATH(m33a -= m34a,""); |
| 176 | + |
| 177 | + m33c = m33a; |
| 178 | + m33a -= m33b; |
| 179 | + for (int i=0;i<m33a.nr;++i) |
| 180 | + { |
| 181 | + for (int j=0;j<m33a.nc;++j) |
| 182 | + { |
| 183 | + EXPECT_DOUBLE_EQ(m33a(i,j),m33c(i,j)-m33b(i,j)); |
| 184 | + } |
| 185 | + } |
| 186 | +} |
| 187 | + |
| 188 | +TEST_F(matrixTest,classMatrixTraceOn) |
| 189 | +{ |
| 190 | + m33a(0,0) = 1.1; |
| 191 | + m33a(1,1) = 2.2; |
| 192 | + m33a(2,2) = 5.5; |
| 193 | + EXPECT_DOUBLE_EQ(m33a.trace_on(),8.8); |
| 194 | +} |
| 195 | + |
| 196 | +TEST_F(matrixTest,classMatrixZeroOut) |
| 197 | +{ |
| 198 | + m33a.zero_out(); |
| 199 | + for (int i=0;i<m33a.nr;++i) |
| 200 | + { |
| 201 | + for (int j=0;j<m33a.nc;++j) |
| 202 | + { |
| 203 | + EXPECT_DOUBLE_EQ(m33a(i,j),0.0); |
| 204 | + } |
| 205 | + } |
| 206 | +} |
| 207 | + |
| 208 | +TEST_F(matrixTest,classMatrixMaxMinAbsmax) |
| 209 | +{ |
| 210 | + m33a(1,0) = 9999.9; |
| 211 | + m33a(0,0) = -999999.9; |
| 212 | + EXPECT_DOUBLE_EQ(m33a.max(),9999.9); |
| 213 | + EXPECT_DOUBLE_EQ(m33a.min(),-999999.9); |
| 214 | + EXPECT_DOUBLE_EQ(m33a.absmax(),999999.9); |
| 215 | +} |
| 216 | + |
| 217 | +TEST_F(matrixTest,classMatrixNorm) |
| 218 | +{ |
| 219 | + EXPECT_NEAR(m33a.norm(),16.881943016134133728,1E-12); |
| 220 | + EXPECT_NEAR(m33b.norm(),187.38956747908889611,1E-12); |
| 221 | +} |
| 222 | + |
| 223 | +TEST_F(matrixTest,operatorPlus) |
| 224 | +{ |
| 225 | + m33c = m33a + m33b; |
| 226 | + for (int i=0;i<m33a.nr;++i) |
| 227 | + { |
| 228 | + for (int j=0;j<m33a.nc;++j) |
| 229 | + { |
| 230 | + EXPECT_DOUBLE_EQ(m33c(i,j),m33a(i,j) + m33b(i,j)); |
| 231 | + } |
| 232 | + } |
| 233 | + //m33c = m33a + m34a; |
| 234 | + EXPECT_DEATH(m33a+m34a,""); |
| 235 | +} |
| 236 | + |
| 237 | + |
| 238 | +TEST_F(matrixTest,operatorMinus) |
| 239 | +{ |
| 240 | + m33c = m33a - m33b; |
| 241 | + for (int i=0;i<m33a.nr;++i) |
| 242 | + { |
| 243 | + for (int j=0;j<m33a.nc;++j) |
| 244 | + { |
| 245 | + EXPECT_DOUBLE_EQ(m33c(i,j),m33a(i,j) - m33b(i,j)); |
| 246 | + } |
| 247 | + } |
| 248 | + EXPECT_DEATH(m33a-m34a,""); |
| 249 | +} |
| 250 | + |
| 251 | +TEST_F(matrixTest,operatorMultiplyTwoMatrix) |
| 252 | +{ |
| 253 | + EXPECT_DEATH(m34a*m33a,""); |
| 254 | + |
| 255 | + m33a(0,0) = 1.0; m33a(0,1) = 2.0; m33a(0,2) = 3.0; |
| 256 | + m33a(1,0) = 4.0; m33a(1,1) = 5.0; m33a(1,2) = 6.0; |
| 257 | + m33a(2,0) = 7.0; m33a(2,1) = 8.0; m33a(2,2) = 9.0; |
| 258 | + |
| 259 | + m33b(0,0) = -3.0; m33b(0,1) = -2.0; m33b(0,2) = -1.0; |
| 260 | + m33b(1,0) = -6.0; m33b(1,1) = -5.0; m33b(1,2) = -4.0; |
| 261 | + m33b(2,0) = -9.0; m33b(2,1) = -8.0; m33b(2,2) = -7.0; |
| 262 | + |
| 263 | + m33c = m33a * m33b; |
| 264 | + EXPECT_DOUBLE_EQ(m33c(0,0),-42.0); |
| 265 | + EXPECT_DOUBLE_EQ(m33c(0,1),-36.0); |
| 266 | + EXPECT_DOUBLE_EQ(m33c(0,2),-30.0); |
| 267 | + EXPECT_DOUBLE_EQ(m33c(1,0),-96.0); |
| 268 | + EXPECT_DOUBLE_EQ(m33c(1,1),-81.0); |
| 269 | + EXPECT_DOUBLE_EQ(m33c(1,2),-66.0); |
| 270 | + EXPECT_DOUBLE_EQ(m33c(2,0),-150.0); |
| 271 | + EXPECT_DOUBLE_EQ(m33c(2,1),-126.0); |
| 272 | + EXPECT_DOUBLE_EQ(m33c(2,2),-102.0); |
| 273 | + |
| 274 | + m33c = m33b * m33a; |
| 275 | + EXPECT_DOUBLE_EQ(m33c(0,0),-18.0); |
| 276 | + EXPECT_DOUBLE_EQ(m33c(0,1),-24.0); |
| 277 | + EXPECT_DOUBLE_EQ(m33c(0,2),-30.0); |
| 278 | + EXPECT_DOUBLE_EQ(m33c(1,0),-54.0); |
| 279 | + EXPECT_DOUBLE_EQ(m33c(1,1),-69.0); |
| 280 | + EXPECT_DOUBLE_EQ(m33c(1,2),-84.0); |
| 281 | + EXPECT_DOUBLE_EQ(m33c(2,0),-90.0); |
| 282 | + EXPECT_DOUBLE_EQ(m33c(2,1),-114.0); |
| 283 | + EXPECT_DOUBLE_EQ(m33c(2,2),-138.0); |
| 284 | +} |
| 285 | + |
| 286 | +TEST_F(matrixTest,operatorMultiplyDouble) |
| 287 | +{ |
| 288 | + m33b = 3.0 * m33a; |
| 289 | + m33c = m33a * 3.0; |
| 290 | + for(int i=1;i<=9;++i) |
| 291 | + { |
| 292 | + EXPECT_DOUBLE_EQ(m33b.c[i-1],m33a.c[i-1] * 3.0); |
| 293 | + EXPECT_DOUBLE_EQ(m33c.c[i-1],m33a.c[i-1] * 3.0); |
| 294 | + } |
| 295 | +} |
| 296 | + |
| 297 | +TEST_F(matrixTest,transpose) |
| 298 | +{ |
| 299 | + m23a(0,0) = 1.0; m23a(0,1) = 2.0; m23a(0,2) = 3.0; |
| 300 | + m23a(1,0) = 4.0; m23a(1,1) = 5.0; m23a(1,2) = 6.0; |
| 301 | + ModuleBase::matrix m32a = transpose(m23a); |
| 302 | + |
| 303 | + EXPECT_DOUBLE_EQ(m32a(0,0),1.0); |
| 304 | + EXPECT_DOUBLE_EQ(m32a(0,1),4.0); |
| 305 | + EXPECT_DOUBLE_EQ(m32a(1,0),2.0); |
| 306 | + EXPECT_DOUBLE_EQ(m32a(1,1),5.0); |
| 307 | + EXPECT_DOUBLE_EQ(m32a(2,0),3.0); |
| 308 | + EXPECT_DOUBLE_EQ(m32a(2,1),6.0); |
| 309 | +} |
| 310 | + |
| 311 | +TEST_F(matrixTest,TraceOn) |
| 312 | +{ |
| 313 | + EXPECT_DEATH(trace_on(m23a,m33a),""); |
| 314 | + EXPECT_DEATH(trace_on(m34a,m33a),""); |
| 315 | + |
| 316 | + ModuleBase::matrix m32(3,2), m23(2,3); |
| 317 | + m23(0,0) = 1.0; m23(0,1) = 2.0; m23(0,2) = 3.0; |
| 318 | + m23(1,0) = 4.0; m23(1,1) = 5.0; m23(1,2) = 6.0; |
| 319 | + |
| 320 | + m32(0,0) = 12.0; m32(0,1) = 23.0; |
| 321 | + m32(1,0) = 34.0; m32(1,1) = 45.0; |
| 322 | + m32(2,0) = 56.0; m32(2,1) = 67.0; |
| 323 | + |
| 324 | + EXPECT_DOUBLE_EQ(trace_on(m23,m32),967.0); |
| 325 | + EXPECT_DOUBLE_EQ(trace_on(m32,m23),967.0); |
| 326 | +} |
| 327 | + |
| 328 | +TEST_F(matrixTest,mdot) |
| 329 | +{ |
| 330 | + EXPECT_DEATH(mdot(m23a,m33a),""); |
| 331 | + EXPECT_DEATH(mdot(m34a,m33a),""); |
| 332 | + EXPECT_DOUBLE_EQ(mdot(m33a,m33b),3163.5); |
| 333 | +} |
| 334 | + |
0 commit comments