$search
00001 00002 00003 00006 00007 #define WANT_STREAM 00008 #define WANT_TIME 00009 00010 #include "include.h" 00011 00012 #include "newmat.h" 00013 00014 #include "tmt.h" 00015 00016 #ifdef use_namespace 00017 //using namespace NEWMAT; 00018 namespace NEWMAT { 00019 #endif 00020 00021 00022 /**************************** test program ******************************/ 00023 00024 00025 class PrintCounter 00026 { 00027 int count; 00028 const char* s; 00029 public: 00030 ~PrintCounter(); 00031 PrintCounter(const char * sx) : count(0), s(sx) {} 00032 void operator++() { count++; } 00033 }; 00034 00035 PrintCounter PCZ("Number of non-zero matrices (should be 1) = "); 00036 PrintCounter PCN("Number of matrices tested = "); 00037 00038 PrintCounter::~PrintCounter() 00039 { cout << s << count << "\n"; } 00040 00041 00042 void Print(const Matrix& X) 00043 { 00044 ++PCN; 00045 cout << "\nMatrix type: " << X.Type().Value() << " ("; 00046 cout << X.Nrows() << ", "; 00047 cout << X.Ncols() << ")\n\n"; 00048 if (X.IsZero()) { cout << "All elements are zero\n" << flush; return; } 00049 int nr=X.Nrows(); int nc=X.Ncols(); 00050 for (int i=1; i<=nr; i++) 00051 { 00052 for (int j=1; j<=nc; j++) cout << X(i,j) << "\t"; 00053 cout << "\n"; 00054 } 00055 cout << flush; ++PCZ; 00056 } 00057 00058 void Print(const UpperTriangularMatrix& X) 00059 { 00060 ++PCN; 00061 cout << "\nMatrix type: " << X.Type().Value() << " ("; 00062 cout << X.Nrows() << ", "; 00063 cout << X.Ncols() << ")\n\n"; 00064 if (X.IsZero()) { cout << "All elements are zero\n" << flush; return; } 00065 int nr=X.Nrows(); int nc=X.Ncols(); 00066 for (int i=1; i<=nr; i++) 00067 { 00068 int j; 00069 for (j=1; j<i; j++) cout << "\t"; 00070 for (j=i; j<=nc; j++) cout << X(i,j) << "\t"; 00071 cout << "\n"; 00072 } 00073 cout << flush; ++PCZ; 00074 } 00075 00076 void Print(const DiagonalMatrix& X) 00077 { 00078 ++PCN; 00079 cout << "\nMatrix type: " << X.Type().Value() << " ("; 00080 cout << X.Nrows() << ", "; 00081 cout << X.Ncols() << ")\n\n"; 00082 if (X.IsZero()) { cout << "All elements are zero\n" << flush; return; } 00083 int nr=X.Nrows(); int nc=X.Ncols(); 00084 for (int i=1; i<=nr; i++) 00085 { 00086 for (int j=1; j<i; j++) cout << "\t"; 00087 if (i<=nc) cout << X(i,i) << "\t"; 00088 cout << "\n"; 00089 } 00090 cout << flush; ++PCZ; 00091 } 00092 00093 void Print(const SymmetricMatrix& X) 00094 { 00095 ++PCN; 00096 cout << "\nMatrix type: " << X.Type().Value() << " ("; 00097 cout << X.Nrows() << ", "; 00098 cout << X.Ncols() << ")\n\n"; 00099 if (X.IsZero()) { cout << "All elements are zero\n" << flush; return; } 00100 int nr=X.Nrows(); int nc=X.Ncols(); 00101 for (int i=1; i<=nr; i++) 00102 { 00103 int j; 00104 for (j=1; j<i; j++) cout << X(j,i) << "\t"; 00105 for (j=i; j<=nc; j++) cout << X(i,j) << "\t"; 00106 cout << "\n"; 00107 } 00108 cout << flush; ++PCZ; 00109 } 00110 00111 void Print(const LowerTriangularMatrix& X) 00112 { 00113 ++PCN; 00114 cout << "\nMatrix type: " << X.Type().Value() << " ("; 00115 cout << X.Nrows() << ", "; 00116 cout << X.Ncols() << ")\n\n"; 00117 if (X.IsZero()) { cout << "All elements are zero\n" << flush; return; } 00118 int nr=X.Nrows(); 00119 for (int i=1; i<=nr; i++) 00120 { 00121 for (int j=1; j<=i; j++) cout << X(i,j) << "\t"; 00122 cout << "\n"; 00123 } 00124 cout << flush; ++PCZ; 00125 } 00126 00127 00128 void Clean(Matrix& A, Real c) 00129 { 00130 int nr = A.Nrows(); int nc = A.Ncols(); 00131 for (int i=1; i<=nr; i++) 00132 { 00133 for (int j=1; j<=nc; j++) 00134 { Real a = A(i,j); if ((a < c) && (a > -c)) A(i,j) = 0.0; } 00135 } 00136 } 00137 00138 void Clean(DiagonalMatrix& A, Real c) 00139 { 00140 int nr = A.Nrows(); 00141 for (int i=1; i<=nr; i++) 00142 { Real a = A(i,i); if ((a < c) && (a > -c)) A(i,i) = 0.0; } 00143 } 00144 00145 void PentiumCheck(Real N, Real D) 00146 { 00147 Real R = N / D; 00148 R = R * D - N; 00149 if ( R > 1 || R < -1) 00150 cout << "Pentium error detected: % error = " << 100 * R / N << "\n"; 00151 } 00152 00153 // random number generator class 00154 // See newran03 documentation for details 00155 00156 MultWithCarry::MultWithCarry(double s) 00157 { 00158 if (s>=1.0 || s<=0.0) 00159 Throw(Logic_error("MultWithCarry: seed out of range")); 00160 x = (unsigned long)(s * 4294967296.0); 00161 crry = 1234567; 00162 } 00163 00164 00165 // carry out 32bit * 32bit multiply in software 00166 00167 void MultWithCarry::NextValue() 00168 { 00169 unsigned long mult = 2083801278; 00170 unsigned long m_hi = mult >> 16; 00171 unsigned long m_lo = mult & 0xFFFF; 00172 00173 unsigned long x_hi = x >> 16; 00174 unsigned long x_lo = x & 0xFFFF; 00175 00176 unsigned long c_hi = crry >> 16; 00177 unsigned long c_lo = crry & 0xFFFF; 00178 00179 x = x_lo * m_lo + c_lo; 00180 unsigned long axc = x_lo * m_hi + x_hi * m_lo + c_hi + (x >> 16); 00181 crry = x_hi * m_hi + (axc >> 16); 00182 00183 x = (x & 0xFFFF) + (axc << 16); 00184 00185 } 00186 00187 Real MultWithCarry::Next() { NextValue(); return ((double)x + 0.5) / 4294967296.0; } 00188 00189 // fill a matrix with values from the MultWithCarry random number generator 00190 void FillWithValues(MultWithCarry&MWC, Matrix& M) 00191 { 00192 int nr = M.nrows(); 00193 int nc = M.ncols(); 00194 for (int i = 1; i <= nr; ++i) for (int j = 1; j <= nc; ++ j) 00195 M(i, j) = MWC.Next(); 00196 } 00197 00198 00199 #ifdef use_namespace 00200 } 00201 using namespace NEWMAT; 00202 #endif 00203 00204 00205 //*************************** main program ********************************** 00206 00207 void TestTypeAdd(); // test + 00208 void TestTypeMult(); // test * 00209 void TestTypeConcat(); // test | 00210 void TestTypeSP(); // test SP 00211 void TestTypeKP(); // test KP 00212 void TestTypeOrder(); // test >= 00213 00214 00215 int main() 00216 { 00217 time_lapse tl; // measure program run time 00218 Real* s1; Real* s2; Real* s3; Real* s4; 00219 cout << "\nBegin test\n"; // Forces cout to allocate memory at beginning 00220 cout << "Now print a real number: " << 3.14159265 << endl; 00221 // Throw exception to set up exception buffer 00222 #ifndef DisableExceptions 00223 Try { Throw(BaseException("Just a dummy\n")); } 00224 CatchAll {} 00225 #else 00226 cout << "Not doing exceptions\n"; 00227 #endif 00228 { Matrix A1(40,200); s1 = A1.Store(); } 00229 { Matrix A1(1,1); s3 = A1.Store(); } 00230 { 00231 Tracer et("Matrix test program"); 00232 00233 Matrix A(25,150); 00234 { 00235 int i; 00236 RowVector A(8); 00237 for (i=1;i<=7;i++) A(i)=0.0; A(8)=1.0; 00238 Print(A); 00239 } 00240 cout << "\n"; 00241 00242 TestTypeAdd(); TestTypeMult(); TestTypeConcat(); 00243 TestTypeSP(); TestTypeKP(); TestTypeOrder(); 00244 00245 Try { 00246 trymat1(); 00247 trymat2(); 00248 trymat3(); 00249 trymat4(); 00250 trymat5(); 00251 trymat6(); 00252 trymat7(); 00253 trymat8(); 00254 trymat9(); 00255 trymata(); 00256 trymatb(); 00257 trymatc(); 00258 trymatd(); 00259 trymate(); 00260 trymatf(); 00261 trymatg(); 00262 trymath(); 00263 trymati(); 00264 trymatj(); 00265 trymatk(); 00266 trymatl(); 00267 trymatm(); 00268 00269 cout << "\nEnd of tests\n"; 00270 } 00271 CatchAll 00272 { 00273 cout << "\nTest program fails - exception generated\n\n"; 00274 cout << BaseException::what(); 00275 } 00276 00277 00278 } 00279 00280 { Matrix A1(40,200); s2 = A1.Store(); } 00281 cout << "\n(The following memory checks are probably not valid with all\n"; 00282 cout << "compilers - see documentation)\n"; 00283 cout << "\nChecking for lost memory (large block): " 00284 << (unsigned long)s1 << " " << (unsigned long)s2 << " "; 00285 if (s1 != s2) cout << " - see section 2.8\n\n"; else cout << " - ok\n\n"; 00286 { Matrix A1(1,1); s4 = A1.Store(); } 00287 cout << "\nChecking for lost memory (small block): " 00288 << (unsigned long)s3 << " " << (unsigned long)s4 << " "; 00289 if (s3 != s4) cout << " - see section 2.8\n\n"; else cout << " - ok\n\n"; 00290 00291 // check for Pentium bug 00292 PentiumCheck(4195835L,3145727L); 00293 PentiumCheck(5244795L,3932159L); 00294 00295 #ifdef DO_FREE_CHECK 00296 FreeCheck::Status(); 00297 #endif 00298 return 0; 00299 } 00300 00301 00302 00303 00304 //************************ test type manipulation **************************/ 00305 00306 00307 // These functions may cause problems for Glockenspiel 2.0c; they are used 00308 // only for testing so you can delete them 00309 00310 00311 void TestTypeAdd() 00312 { 00313 MatrixType list[13]; 00314 list[0] = MatrixType::UT; 00315 list[1] = MatrixType::LT; 00316 list[2] = MatrixType::Rt; 00317 list[3] = MatrixType::Sq; 00318 list[4] = MatrixType::Sm; 00319 list[5] = MatrixType::Sk; 00320 list[6] = MatrixType::Dg; 00321 list[7] = MatrixType::Id; 00322 list[8] = MatrixType::BM; 00323 list[9] = MatrixType::UB; 00324 list[10] = MatrixType::LB; 00325 list[11] = MatrixType::SB; 00326 list[12] = MatrixType::KB; 00327 00328 cout << "+ "; 00329 int i; 00330 for (i=0; i<MatrixType::nTypes(); i++) cout << list[i].Value() << " "; 00331 cout << "\n"; 00332 for (i=0; i<MatrixType::nTypes(); i++) 00333 { 00334 cout << list[i].Value() << " "; 00335 for (int j=0; j<MatrixType::nTypes(); j++) 00336 cout << (list[j]+list[i]).Value() << " "; 00337 cout << "\n"; 00338 } 00339 cout << "\n"; 00340 } 00341 00342 void TestTypeMult() 00343 { 00344 MatrixType list[13]; 00345 list[0] = MatrixType::UT; 00346 list[1] = MatrixType::LT; 00347 list[2] = MatrixType::Rt; 00348 list[3] = MatrixType::Sq; 00349 list[4] = MatrixType::Sm; 00350 list[5] = MatrixType::Sk; 00351 list[6] = MatrixType::Dg; 00352 list[7] = MatrixType::Id; 00353 list[8] = MatrixType::BM; 00354 list[9] = MatrixType::UB; 00355 list[10] = MatrixType::LB; 00356 list[11] = MatrixType::SB; 00357 list[12] = MatrixType::KB; 00358 00359 cout << "* "; 00360 int i; 00361 for (i=0; i<MatrixType::nTypes(); i++) 00362 cout << list[i].Value() << " "; 00363 cout << "\n"; 00364 for (i=0; i<MatrixType::nTypes(); i++) 00365 { 00366 cout << list[i].Value() << " "; 00367 for (int j=0; j<MatrixType::nTypes(); j++) 00368 cout << (list[j]*list[i]).Value() << " "; 00369 cout << "\n"; 00370 } 00371 cout << "\n"; 00372 } 00373 00374 void TestTypeConcat() 00375 { 00376 MatrixType list[13]; 00377 list[0] = MatrixType::UT; 00378 list[1] = MatrixType::LT; 00379 list[2] = MatrixType::Rt; 00380 list[3] = MatrixType::Sq; 00381 list[4] = MatrixType::Sm; 00382 list[5] = MatrixType::Sk; 00383 list[6] = MatrixType::Dg; 00384 list[7] = MatrixType::Id; 00385 list[8] = MatrixType::BM; 00386 list[9] = MatrixType::UB; 00387 list[10] = MatrixType::LB; 00388 list[11] = MatrixType::SB; 00389 list[12] = MatrixType::KB; 00390 00391 cout << "| "; 00392 int i; 00393 for (i=0; i<MatrixType::nTypes(); i++) 00394 cout << list[i].Value() << " "; 00395 cout << "\n"; 00396 for (i=0; i<MatrixType::nTypes(); i++) 00397 { 00398 cout << list[i].Value() << " "; 00399 for (int j=0; j<MatrixType::nTypes(); j++) 00400 cout << (list[j] | list[i]).Value() << " "; 00401 cout << "\n"; 00402 } 00403 cout << "\n"; 00404 } 00405 00406 void TestTypeSP() 00407 { 00408 MatrixType list[13]; 00409 list[0] = MatrixType::UT; 00410 list[1] = MatrixType::LT; 00411 list[2] = MatrixType::Rt; 00412 list[3] = MatrixType::Sq; 00413 list[4] = MatrixType::Sm; 00414 list[5] = MatrixType::Sk; 00415 list[6] = MatrixType::Dg; 00416 list[7] = MatrixType::Id; 00417 list[8] = MatrixType::BM; 00418 list[9] = MatrixType::UB; 00419 list[10] = MatrixType::LB; 00420 list[11] = MatrixType::SB; 00421 list[12] = MatrixType::KB; 00422 00423 cout << "SP "; 00424 int i; 00425 for (i=0; i<MatrixType::nTypes(); i++) 00426 cout << list[i].Value() << " "; 00427 cout << "\n"; 00428 for (i=0; i<MatrixType::nTypes(); i++) 00429 { 00430 cout << list[i].Value() << " "; 00431 for (int j=0; j<MatrixType::nTypes(); j++) 00432 cout << (list[j].SP(list[i])).Value() << " "; 00433 cout << "\n"; 00434 } 00435 cout << "\n"; 00436 } 00437 00438 void TestTypeKP() 00439 { 00440 MatrixType list[13]; 00441 list[0] = MatrixType::UT; 00442 list[1] = MatrixType::LT; 00443 list[2] = MatrixType::Rt; 00444 list[3] = MatrixType::Sq; 00445 list[4] = MatrixType::Sm; 00446 list[5] = MatrixType::Sk; 00447 list[6] = MatrixType::Dg; 00448 list[7] = MatrixType::Id; 00449 list[8] = MatrixType::BM; 00450 list[9] = MatrixType::UB; 00451 list[10] = MatrixType::LB; 00452 list[11] = MatrixType::SB; 00453 list[12] = MatrixType::KB; 00454 00455 cout << "KP "; 00456 int i; 00457 for (i=0; i<MatrixType::nTypes(); i++) 00458 cout << list[i].Value() << " "; 00459 cout << "\n"; 00460 for (i=0; i<MatrixType::nTypes(); i++) 00461 { 00462 cout << list[i].Value() << " "; 00463 for (int j=0; j<MatrixType::nTypes(); j++) 00464 cout << (list[j].KP(list[i])).Value() << " "; 00465 cout << "\n"; 00466 } 00467 cout << "\n"; 00468 } 00469 00470 void TestTypeOrder() 00471 { 00472 MatrixType list[13]; 00473 list[0] = MatrixType::UT; 00474 list[1] = MatrixType::LT; 00475 list[2] = MatrixType::Rt; 00476 list[3] = MatrixType::Sq; 00477 list[4] = MatrixType::Sm; 00478 list[5] = MatrixType::Sk; 00479 list[6] = MatrixType::Dg; 00480 list[7] = MatrixType::Id; 00481 list[8] = MatrixType::BM; 00482 list[9] = MatrixType::UB; 00483 list[10] = MatrixType::LB; 00484 list[11] = MatrixType::SB; 00485 list[12] = MatrixType::KB; 00486 00487 cout << ">= "; 00488 int i; 00489 for (i = 0; i<MatrixType::nTypes(); i++) 00490 cout << list[i].Value() << " "; 00491 cout << "\n"; 00492 for (i=0; i<MatrixType::nTypes(); i++) 00493 { 00494 cout << list[i].Value() << " "; 00495 for (int j=0; j<MatrixType::nTypes(); j++) 00496 cout << ((list[j]>=list[i]) ? "Yes " : "No "); 00497 cout << "\n"; 00498 } 00499 cout << "\n"; 00500 } 00501 00502 00503 //************** elapsed time class **************** 00504 00505 time_lapse::time_lapse() 00506 { 00507 start_time = ((double)clock())/(double)CLOCKS_PER_SEC; 00508 } 00509 00510 time_lapse::~time_lapse() 00511 { 00512 double time = ((double)clock())/(double)CLOCKS_PER_SEC - start_time; 00513 cout << "Elapsed (processor) time = " << setprecision(2) << time << " seconds" << endl; 00514 cout << endl; 00515 } 00516 00517 00518 00519 00521 00522 00523