testmath.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:16k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: testmath.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 20:50:11  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: testmath.cpp,v 1000.2 2004/06/01 20:50:11 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbiapp.hpp>
  41. #include <corelib/ncbiargs.hpp>
  42. #include <corelib/ncbienv.hpp>
  43. #include <corelib/ncbitime.hpp>
  44. #include <gui/math/vect3.hpp>
  45. #include <gui/math/matrix3.hpp>
  46. #include <gui/math/matrix4.hpp>
  47. #include <util/math/matrix.hpp>
  48. USING_SCOPE(ncbi);
  49. /////////////////////////////////////////////////////////////////////////////
  50. //  CTestmathApp::
  51. class CTestmathApp : public CNcbiApplication
  52. {
  53. public:
  54.     CTestmathApp();
  55. private:
  56.     virtual void Init(void);
  57.     virtual int  Run(void);
  58.     virtual void Exit(void);
  59. };
  60. CTestmathApp::CTestmathApp()
  61. {
  62. }
  63. /////////////////////////////////////////////////////////////////////////////
  64. //  Init test for all different types of arguments
  65. void CTestmathApp::Init(void)
  66. {
  67.     // Create command - line argument descriptions class
  68.     auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);
  69.     // Specify USAGE context
  70.     arg_desc->SetUsageContext(GetArguments().GetProgramBasename(),
  71.                               "Math library test app");
  72.     arg_desc->AddDefaultKey("iters", "Iterations",
  73.                             "Number of iterations for timing tests",
  74.                             CArgDescriptions::eInteger,
  75. #ifdef _DEBUG
  76.                             "5"
  77. #else
  78.                             "500"
  79. #endif
  80.                            );
  81.     // Setup arg.descriptions for this application
  82.     SetupArgDescriptions(arg_desc.release());
  83. }
  84. ///
  85. /// test vector addition
  86. void testVectorAdd()
  87. {
  88.     cout << "testing vector addition...";
  89.     cout.flush();
  90.     {{
  91.          CVect3<float> vec0(1.0f, 1.0f, 1.0f);
  92.          CVect3<float> vec1(2.0f, 2.0f, 2.0f);
  93.          vec0 = vec0 + vec1;
  94.          _ASSERT(vec0[0] == 3.0f);
  95.          _ASSERT(vec0[1] == 3.0f);
  96.          _ASSERT(vec0[2] == 3.0f);
  97.          if (vec0[0] != 3.0f  ||
  98.              vec0[1] != 3.0f  ||
  99.              vec0[2] != 3.0f) {
  100.              string msg("vector addition of CVect3<> incorrect");
  101.              NCBI_THROW(CException, eUnknown, msg);
  102.          }
  103.      }}
  104.     {{
  105.          CVect4<float> vec0(1.0f, 1.0f, 1.0f, 1.0f);
  106.          CVect4<float> vec1(2.0f, 2.0f, 2.0f, 2.0f);
  107.          vec0 = vec0 + vec1;
  108.          _ASSERT(vec0[0] == 3.0f);
  109.          _ASSERT(vec0[1] == 3.0f);
  110.          _ASSERT(vec0[2] == 3.0f);
  111.          _ASSERT(vec0[3] == 3.0f);
  112.          if (vec0[0] != 3.0f  ||
  113.              vec0[1] != 3.0f  ||
  114.              vec0[2] != 3.0f  ||
  115.              vec0[3] != 3.0f) {
  116.              string msg("vector addition of CVect4<> incorrect");
  117.              NCBI_THROW(CException, eUnknown, msg);
  118.          }
  119.      }}
  120.     cout << "passed." << endl;
  121. }
  122. ///
  123. /// test matrix subtraction
  124. void testVectorSubtract()
  125. {
  126.     cout << "testing vector subtraction...";
  127.     cout.flush();
  128.     {{
  129.          CVect3<float> vec0(1.0f, 1.0f, 1.0f);
  130.          CVect3<float> vec1(2.0f, 2.0f, 2.0f);
  131.          vec0 = vec0 - vec1;
  132.          _ASSERT(vec0[0] == -1.0f);
  133.          _ASSERT(vec0[1] == -1.0f);
  134.          _ASSERT(vec0[2] == -1.0f);
  135.          if (vec0[0] != -1.0f  ||
  136.              vec0[1] != -1.0f  ||
  137.              vec0[2] != -1.0f) {
  138.              string msg("vector subtraction of CVect3<> incorrect");
  139.              NCBI_THROW(CException, eUnknown, msg);
  140.          }
  141.      }}
  142.     {{
  143.          CVect4<float> vec0(1.0f, 1.0f, 1.0f, 1.0f);
  144.          CVect4<float> vec1(2.0f, 2.0f, 2.0f, 2.0f);
  145.          vec0 = vec0 - vec1;
  146.          _ASSERT(vec0[0] == -1.0f);
  147.          _ASSERT(vec0[1] == -1.0f);
  148.          _ASSERT(vec0[2] == -1.0f);
  149.          _ASSERT(vec0[3] == -1.0f);
  150.          if (vec0[0] != -1.0f  ||
  151.              vec0[1] != -1.0f  ||
  152.              vec0[2] != -1.0f  ||
  153.              vec0[3] != -1.0f) {
  154.              string msg("vector subtraction of CVect4<> incorrect");
  155.              NCBI_THROW(CException, eUnknown, msg);
  156.          }
  157.      }}
  158.     cout << "passed." << endl;
  159. }
  160. ///
  161. /// test matrix addition
  162. void testMatrixAdd()
  163. {
  164.     cout << "testing matrix addition...";
  165.     cout.flush();
  166.     for (size_t r = 3;  r < 10;  ++r) {
  167.         for (size_t c = 3;  c < 10;  ++c) {
  168.             CNcbiMatrix<float> mat0(r, c, 1);
  169.             CNcbiMatrix<float> mat1(r, c, 2);
  170.             mat0 = mat0 + mat1;
  171.             ITERATE (CNcbiMatrix<float>::TData, iter, mat0.GetData()) {
  172.                 _ASSERT(*iter == 3);
  173.                 if (*iter != 3) {
  174.                     string msg("matrix addition of ");
  175.                     msg += NStr::IntToString(r) + "x";
  176.                     msg += NStr::IntToString(c) + " matrix incorrect";
  177.                     NCBI_THROW(CException, eUnknown, msg);
  178.                 }
  179.             }
  180.         }
  181.     }
  182.     cout << "passed." << endl;
  183. }
  184. ///
  185. /// test matrix subtraction
  186. void testMatrixSubtract()
  187. {
  188.     cout << "testing matrix subtraction...";
  189.     cout.flush();
  190.     for (size_t r = 3;  r < 10;  ++r) {
  191.         for (size_t c = 3;  c < 10;  ++c) {
  192.             CNcbiMatrix<float> mat0(r, c, 1);
  193.             CNcbiMatrix<float> mat1(r, c, 2);
  194.             mat0 = mat0 - mat1;
  195.             ITERATE (CNcbiMatrix<float>::TData, iter, mat0.GetData()) {
  196.                 _ASSERT(*iter == -1);
  197.                 if (*iter != -1) {
  198.                     string msg("matrix subtraction of ");
  199.                     msg += NStr::IntToString(r) + "x";
  200.                     msg += NStr::IntToString(c) + " matrix incorrect";
  201.                     NCBI_THROW(CException, eUnknown, msg);
  202.                 }
  203.             }
  204.         }
  205.     }
  206.     cout << "passed." << endl;
  207. }
  208. ///
  209. /// test vecrix multiplication
  210. void testMatrixMult()
  211. {
  212.     cout << "testing matrix multiplication...";
  213.     cout.flush();
  214.     for (size_t r = 3;  r < 10;  ++r) {
  215.         for (size_t c = 3;  c < 10;  ++c) {
  216.             const float lhs_val = 1;
  217.             const float rhs_val = 2;
  218.             CNcbiMatrix<float> mat0(r, c, lhs_val);
  219.             CNcbiMatrix<float> mat1(c, r, rhs_val);
  220.             mat0 = mat0 * mat1;
  221.             float val = 0;
  222.             for (size_t cc = 0;  cc < c;  ++cc) {
  223.                 val += lhs_val * rhs_val;
  224.             }
  225.             ITERATE (CNcbiMatrix<float>::TData, iter, mat0.GetData()) {
  226.                 _ASSERT(*iter == val);
  227.                 if (*iter != val) {
  228.                     string msg("matrix multiplication of ");
  229.                     msg += NStr::IntToString(r) + "x";
  230.                     msg += NStr::IntToString(c) + " matrix incorrect";
  231.                     NCBI_THROW(CException, eUnknown, msg);
  232.                 }
  233.             }
  234.         }
  235.     }
  236.     cout << "passed." << endl;
  237. }
  238. ///
  239. /// test determinant calculations
  240. void testDeterminant()
  241. {
  242.     CNcbiMatrix<float> mat4(4,4);
  243.     /**
  244.       mat4[ 0] =  1;
  245.       mat4[ 1] =  2;
  246.       mat4[ 2] =  0;
  247.       mat4[ 3] = -2;
  248.       mat4[ 4] =  0;
  249.       mat4[ 5] =  0;
  250.       mat4[ 6] =  2;
  251.       mat4[ 7] = -1;
  252.       mat4[ 8] =  0;
  253.       mat4[ 9] = -1;
  254.       mat4[10] =  1;
  255.       mat4[11] =  0;
  256.       mat4[12] =  1;
  257.       mat4[13] =  3;
  258.       mat4[14] =  4;
  259.       mat4[15] =  1;
  260.      **/
  261.     /// FIXME: implement determinants...
  262.     //float det = mat4.determinant();
  263.     //cout << "matrix is " << endl;
  264.     //cout << mat4;
  265.     //cout << "determinant is " << det << endl;
  266. }
  267. ///
  268. /// test the speed of matrix addition in the old and new matrix schemes
  269. void testMatrixAddTime(size_t iters)
  270. {
  271.     cout << "testing matrix addition time..." << endl;
  272.     CStopWatch sw;
  273.     {{
  274.          cout << "CMatrix3<>: ";
  275.          cout.flush();
  276.          CMatrix3<float> mat (1.0f, 1.0f, 1.0f,
  277.                               1.0f, 1.0f, 1.0f,
  278.                               1.0f, 1.0f, 1.0f);
  279.          sw.Start();
  280.          for (size_t i = 0;  i < iters;  ++i) {
  281.              for (size_t j = 0;  j < iters;  ++j) {
  282.                  mat += mat;
  283.              }
  284.          }
  285.          cout << "elapsed time: " << sw.Elapsed() << endl;
  286.      }}
  287.     {{
  288.          for (size_t r = 3;  r <= 10;  ++r) {
  289.              cout << "CNcbiMatrix<>(" << r << ", " << r << "): ";
  290.              cout.flush();
  291.              CNcbiMatrix<float> mat (r, r, 1.0f);
  292.              sw.Start();
  293.              for (size_t i = 0;  i < iters;  ++i) {
  294.                  for (size_t j = 0;  j < iters;  ++j) {
  295.                      mat += mat;
  296.                  }
  297.              }
  298.              cout << "elapsed time: " << sw.Elapsed() << endl;
  299.          }
  300.      }}
  301. }
  302. ///
  303. /// test the speed of vector addition in the old and new vector schemes
  304. void testVectorAddTime(size_t iters)
  305. {
  306.     cout << "testing vector addition time..." << endl;
  307.     CVect3<float> old_vect3 (1.0f, 1.0f, 1.0f);
  308.     CStopWatch sw;
  309.     sw.Start();
  310.     for (size_t i = 0;  i < iters;  ++i) {
  311.         for (size_t j = 0;  j < iters;  ++j) {
  312.             old_vect3 += old_vect3;
  313.         }
  314.     }
  315.     cout << "CVect3<>: elapsed time: " << sw.Elapsed() << endl;
  316. #if 0
  317.     std::vector<float> new_vect3 (3, 1.0f);
  318.     sw.Start();
  319.     for (size_t i = 0;  i < iters;  ++i) {
  320.         for (size_t j = 0;  j < iters;  ++j) {
  321.             new_vect3 += new_vect3;
  322.         }
  323.     }
  324.     cout << "new vector3:" << endl;
  325.     cout << "elapsed time: " << sw.Elapsed() << endl;
  326. #endif
  327. }
  328. ///
  329. /// test the speed of vector addition in the old and new vector schemes
  330. void testVectorDotTime(size_t iters)
  331. {
  332.     cout << "testing vector dot time..." << endl;
  333.     float random = rand();
  334.     CVect3<float> old_vect3 (random, random, random);
  335.     float temp;
  336.     CStopWatch sw;
  337.     temp = 0;
  338.     sw.Start();
  339.     for (size_t i = 0;  i < iters;  ++i) {
  340.         for (size_t j = 0;  j < iters;  ++j) {
  341.             temp += old_vect3.Dot(old_vect3);
  342.         }
  343.     }
  344.     cout << "CVect3<>: elapsed time: " << sw.Elapsed() << endl;
  345.     temp = 0;
  346. }
  347. ///
  348. /// test the speed of matrix multiplication in the old and new matrix schemes
  349. void testMatrixMultTime(size_t iters)
  350. {
  351.     cout << "testing matrix multiplication time..." << endl;
  352.     CStopWatch sw;
  353.     {{
  354.          cout << "CMatrix4<>: ";
  355.          cout.flush();
  356.          CMatrix4<float> old_mat4 (1.0f, 1.0f, 1.0f, 1.0f,
  357.                                    1.0f, 1.0f, 1.0f, 1.0f,
  358.                                    1.0f, 1.0f, 1.0f, 1.0f,
  359.                                    1.0f, 1.0f, 1.0f, 1.0f);
  360.          sw.Start();
  361.          for (size_t i = 0;  i < iters;  ++i) {
  362.              for (size_t j = 0;  j < iters;  ++j) {
  363.                  old_mat4 *= old_mat4;
  364.              }
  365.          }
  366.          cout << "elapsed time: " << sw.Elapsed() << endl;
  367.      }}
  368.     {{
  369.          for (size_t rc = 2;  rc <= 10;  ++rc) {
  370.              cout << "CNcbiMatrix<>(" << rc << ", " << rc << "): ";
  371.              cout.flush();
  372.              CNcbiMatrix<float> mat(rc, rc, 1.0f);
  373.              sw.Start();
  374.              for (size_t i = 0;  i < iters;  ++i) {
  375.                  for (size_t j = 0;  j < iters;  ++j) {
  376.                      mat *= mat;
  377.                  }
  378.              }
  379.              cout << "elapsed time: " << sw.Elapsed() << endl;
  380.          }
  381.      }}
  382. }
  383. ///
  384. /// test the speed of matrix multiplication in the old and new matrix schemes
  385. void testMatrixMultVectorTime(size_t iters)
  386. {
  387.     cout << "testing matrix * vector multiplication time..." << endl;
  388.     CStopWatch sw;
  389.     {{
  390.          CMatrix3<float> old_mat3 (1.0f, 1.0f, 1.0f,
  391.                                    1.0f, 1.0f, 1.0f,
  392.                                    1.0f, 1.0f, 1.0f);
  393.          CVect3<float> old_vec3 (1.0f, 1.0f, 1.0f);
  394.          cout << "CMatrx3<> * CVect3<>: ";
  395.          cout.flush();
  396.          sw.Start();
  397.          for (size_t i = 0;  i < iters;  ++i) {
  398.              for (size_t j = 0;  j < iters;  ++j) {
  399.                  old_vec3 = old_vec3 * old_mat3;
  400.              };
  401.          }
  402.          cout << "elapsed time: " << sw.Elapsed() << endl;
  403.      }}
  404.     {{
  405.          for (size_t rc = 2;  rc <= 10;  ++rc) {
  406.              std::vector<float> vec (rc, 1.0f);
  407.              CNcbiMatrix<float> mat (rc, rc, 1.0f);
  408.              cout << "CNcbiMatrix<>(" << rc << ", " << rc
  409.                  << ") * vector<>(" << rc << "): ";
  410.              cout.flush();
  411.              sw.Start();
  412.              for (size_t i = 0;  i < iters;  ++i) {
  413.                  for (size_t j = 0;  j < iters;  ++j) {
  414.                      vec = vec * mat;
  415.                  };
  416.              }
  417.              cout << "elapsed time: " << sw.Elapsed() << endl;
  418.          }
  419.      }}
  420. }
  421. ///
  422. /// test promotion rules
  423. void
  424. testPromotion()
  425. {
  426.     cout << "sizeof(Promote(char, int)): "
  427.         << sizeof(SPromoteTraits<char, int>::TPromote) << endl;
  428.     cout << "sizeof(Promote(char, float)): "
  429.         << sizeof(SPromoteTraits<char, float>::TPromote) << endl;
  430.     cout << "sizeof(Promote(float, CVect3<float>)): "
  431.         << sizeof(SPromoteTraits<float, CVect3<float> >::TPromote) << endl;
  432.     CVect3<float> float_vec(1.1f, 1.1f, 1.1f);
  433.     CVect3<int> int_vec(2, 3, 4);
  434.     CVect3<float> res;
  435.     res = int_vec + float_vec;
  436.     cout << "float vec: "
  437.         << float_vec[0] << ", " << float_vec[1] << ", " << float_vec[2] << endl;
  438.     cout << "int vec: "
  439.         << int_vec[0] << ", " << int_vec[1] << ", " << int_vec[2] << endl;
  440.     res = float_vec + int_vec;
  441.     cout << "f + i = "
  442.         << res[0] << ", " << res[1] << ", " << res[2] << endl;
  443.     res = int_vec + float_vec;
  444.     cout << "i + f = "
  445.         << res[0] << ", " << res[1] << ", " << res[2] << endl;
  446. }
  447. /////////////////////////////////////////////////////////////////////////////
  448. //  Run test(printout arguments obtained from command - line)
  449. int CTestmathApp::Run(void)
  450. {
  451.     // Get arguments
  452.     CArgs args = GetArgs();
  453.     size_t iters = args["iters"].AsInteger();
  454.     testVectorAdd();
  455.     testVectorSubtract();
  456.     testMatrixAdd();
  457.     testMatrixSubtract();
  458.     testMatrixMult();
  459.     testVectorAddTime(iters);
  460.     testVectorDotTime(iters);
  461.     testMatrixAddTime(iters);
  462.     testMatrixMultVectorTime(iters);
  463.     testMatrixMultTime(iters);
  464.     testDeterminant();
  465.     //testGaussJordan();
  466.     //testGaussJordanTime();
  467.     testPromotion();
  468.     return 0;
  469. }
  470. /////////////////////////////////////////////////////////////////////////////
  471. //  Cleanup
  472. void CTestmathApp::Exit(void)
  473. {
  474.     SetDiagStream(0);
  475. }
  476. /////////////////////////////////////////////////////////////////////////////
  477. //  MAIN
  478. int main(int argc, const char* argv[])
  479. {
  480.     // Execute main application function
  481.     return CTestmathApp().AppMain(argc, argv, 0, eDS_Default, 0);
  482. }
  483. /*
  484.  * ===========================================================================
  485.  * $Log: testmath.cpp,v $
  486.  * Revision 1000.2  2004/06/01 20:50:11  gouriano
  487.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  488.  *
  489.  * Revision 1.5  2004/05/21 22:27:43  gorelenk
  490.  * Added PCH ncbi_pch.hpp
  491.  *
  492.  * Revision 1.4  2004/04/07 12:51:14  dicuccio
  493.  * Removed unused variable
  494.  *
  495.  * Revision 1.3  2004/02/09 17:37:14  dicuccio
  496.  * Updated location of matrix class
  497.  *
  498.  * Revision 1.2  2004/01/23 13:57:07  dicuccio
  499.  * Revamped math test app
  500.  *
  501.  * Revision 1.1  2003/06/09 19:19:20  dicuccio
  502.  * Initial revision.  Test app disabled by default.
  503.  *
  504.  * ===========================================================================
  505.  */