Go to the documentation of this file.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
00018 namespace NEWMAT {
00019 #endif
00020
00021
00022
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
00154
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
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
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
00206
00207 void TestTypeAdd();
00208 void TestTypeMult();
00209 void TestTypeConcat();
00210 void TestTypeSP();
00211 void TestTypeKP();
00212 void TestTypeOrder();
00213
00214
00215 int main()
00216 {
00217 time_lapse tl;
00218 Real* s1; Real* s2; Real* s3; Real* s4;
00219 cout << "\nBegin test\n";
00220 cout << "Now print a real number: " << 3.14159265 << endl;
00221
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
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
00305
00306
00307
00308
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
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