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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_rangemap.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:42:49  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_rangemap.cpp,v 1000.1 2004/06/01 19:42:49 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.  * Author: Eugene Vasilchenko
  35.  *
  36.  * File Description:
  37.  *   Test program for CRangeMap<>
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <corelib/ncbistd.hpp>
  42. #include <corelib/ncbiapp.hpp>
  43. #include <corelib/ncbiargs.hpp>
  44. #include <corelib/ncbiutil.hpp>
  45. #include <util/rangemap.hpp>
  46. #include <util/itree.hpp>
  47. #include <stdlib.h>
  48. #include <test/test_assert.h>  /* This header must go last */
  49. BEGIN_NCBI_SCOPE
  50. class CTestRangeMap : public CNcbiApplication
  51. {
  52. public:
  53.     typedef CRange<int> TRange;
  54.     void Init(void);
  55.     int Run(void);
  56.     void TestRangeMap(void) const;
  57.     void TestIntervalTree(void) const;
  58.     void Filling(const char* type) const;
  59.     void Filled(size_t size) const;
  60.     void Stat(pair<double, size_t> stat) const;
  61.     void Added(TRange range) const;
  62.     void Old(TRange range) const;
  63.     void FromAll(TRange range) const;
  64.     void StartFrom(TRange search) const;
  65.     void From(TRange search, TRange range) const;
  66.     void End(void) const;
  67.     void PrintTotalScannedNumber(size_t number) const;
  68.     TRange RandomRange(void) const;
  69.     int m_Count;
  70.     int m_Length;
  71.     int m_RangeNumber;
  72.     int m_RangeLength;
  73.     int m_ScanCount;
  74.     int m_ScanStep;
  75.     int m_ScanLength;
  76.     
  77.     bool m_Silent;
  78.     bool m_PrintSize;
  79.     bool m_PrintTotalScannedNumber;
  80. };
  81. inline
  82. CNcbiOstream& operator<<(CNcbiOstream& out, CTestRangeMap::TRange range)
  83. {
  84.     return out <<
  85.         '('<<range.GetFrom()<<','<<range.GetTo()<<")="<<range.GetLength();
  86. }
  87. inline
  88. string ToString(CTestRangeMap::TRange range)
  89. {
  90.     CNcbiOstrstream b;
  91.     b << range;
  92.     return CNcbiOstrstreamToString(b);
  93. }
  94. inline
  95. void CTestRangeMap::Filling(const char* type) const
  96. {
  97.     if ( !m_Silent )
  98.         NcbiCout << "Filling " << type << ":" << NcbiEndl;
  99. }
  100. inline
  101. void CTestRangeMap::Filled(size_t size) const
  102. {
  103.     NcbiCout << "Filled: size=" << size << NcbiEndl;
  104. }
  105. inline
  106. void CTestRangeMap::Stat(pair<double, size_t> stat) const
  107. {
  108.     NcbiCout << "Stat: mean=" << stat.first << " max=" << stat.second << NcbiEndl;
  109. }
  110. inline
  111. void CTestRangeMap::Added(TRange range) const
  112. {
  113.     if ( !m_Silent )
  114.         NcbiCout << "Added " << range << NcbiEndl;
  115. }
  116. inline
  117. void CTestRangeMap::Old(TRange range) const
  118. {
  119.     if ( !m_Silent )
  120.         NcbiCout << "Old " << range << NcbiEndl;
  121. }
  122. inline
  123. void CTestRangeMap::FromAll(TRange range) const
  124. {
  125.     if ( !m_Silent )
  126.         NcbiCout << "All " << range << NcbiEndl;
  127. }
  128. inline
  129. void CTestRangeMap::StartFrom(TRange search) const
  130. {
  131.     if ( !m_Silent )
  132.         NcbiCout << "In range " << search << ":" << NcbiEndl;
  133. }
  134. inline
  135. void CTestRangeMap::From(TRange search, TRange range) const
  136. {
  137.     if ( !m_Silent )
  138.         NcbiCout << "In " << search << ": " << range << NcbiEndl;
  139. }
  140. inline
  141. void CTestRangeMap::End(void) const
  142. {
  143.     if ( !m_Silent )
  144.         NcbiCout << "End." << NcbiEndl;
  145. }
  146. inline
  147. void CTestRangeMap::PrintTotalScannedNumber(size_t number) const
  148. {
  149.     if ( m_PrintTotalScannedNumber )
  150.         NcbiCout << "Total scanned intervals: " << number << NcbiEndl;
  151. }
  152. inline
  153. CTestRangeMap::TRange CTestRangeMap::RandomRange(void) const
  154. {
  155.     int from = int(rand() % m_Length);
  156.     int to = from + int(rand() % m_RangeLength);
  157.     return TRange(from, to);
  158. }
  159. void CTestRangeMap::TestIntervalTree(void) const
  160. {
  161.     Filling("CIntervalTree");
  162.     typedef CIntervalTree TMap;
  163.     typedef TMap::const_iterator TMapCI;
  164.     TMap m;
  165.     // fill
  166.     for ( int count = 0; count < m_RangeNumber; ) {
  167.         TRange range = RandomRange();
  168.         m.Insert(range, CConstRef<CObject>(0));
  169.         ++count;
  170.         Added(range);
  171.     }
  172.     
  173.     if ( m_PrintSize ) {
  174.         Filled(m.Size());
  175.         Stat(m.Stat());
  176.     }
  177.     for ( TMapCI i = m.AllIntervals(); i; ++i ) {
  178.         FromAll(i.GetInterval());
  179.     }
  180.     size_t scannedCount = 0;
  181.     for ( int count = 0; count < m_ScanCount; ++count ) {
  182.         for ( int pos = 0; pos <= m_Length + 2*m_RangeLength;
  183.               pos += m_ScanStep ) {
  184.             TRange range(pos, pos + m_ScanLength - 1);
  185.             
  186.             StartFrom(range);
  187.             
  188.             for ( TMapCI i = m.IntervalsOverlapping(range); i; ++i ) {
  189.                 From(range, i.GetInterval());
  190.                 ++scannedCount;
  191.             }
  192.         }
  193.     }
  194.     PrintTotalScannedNumber(scannedCount);
  195.     End();
  196. }
  197. void CTestRangeMap::TestRangeMap(void) const
  198. {
  199.     Filling("CRangeMap");
  200.     typedef CRangeMultimap<CConstRef<CObject> > TMap;
  201.     typedef TMap::const_iterator TMapCI;
  202.     TMap m;
  203.     // fill
  204.     for ( int count = 0; count < m_RangeNumber; ) {
  205.         TRange range = RandomRange();
  206.         m.insert(TMap::value_type(range, CConstRef<CObject>(0)));
  207.         ++count;
  208.         Added(range);
  209.     }
  210.     
  211.     if ( m_PrintSize ) {
  212.         Filled(m.size());
  213.         Stat(m.stat());
  214.     }
  215.     for ( TMapCI i = m.begin(); i; ++i ) {
  216.         FromAll(i.GetInterval());
  217.     }
  218.     size_t scannedCount = 0;
  219.     for ( int count = 0; count < m_ScanCount; ++count ) {
  220.         for ( int pos = 0; pos <= m_Length + 2*m_RangeLength;
  221.               pos += m_ScanStep ) {
  222.             TRange range;
  223.             range.Set(pos, pos + m_ScanLength - 1);
  224.             
  225.             StartFrom(range);
  226.             
  227.             for ( TMapCI i = m.begin(range); i; ++i ) {
  228.                 From(range, i.GetInterval());
  229.                 ++scannedCount;
  230.             }
  231.         }
  232.     }
  233.     PrintTotalScannedNumber(scannedCount);
  234.     End();
  235. }
  236. void CTestRangeMap::Init(void)
  237. {
  238.     SetDiagPostLevel(eDiag_Warning);
  239.     auto_ptr<CArgDescriptions> d(new CArgDescriptions);
  240.     d->SetUsageContext("testrangemap",
  241.                        "test different interval search classes");
  242.     d->AddDefaultKey("t", "type",
  243.                      "type of container to use",
  244.                      CArgDescriptions::eString, "CIntervalTree");
  245.     d->SetConstraint("t", (new CArgAllow_Strings)->
  246.                      Allow("CIntervalTree")->Allow("i")->
  247.                      Allow("CRangeMap")->Allow("r"));
  248.     d->AddDefaultKey("c", "count",
  249.                      "how may times to run whole test",
  250.                      CArgDescriptions::eInteger, "1");
  251.     d->AddFlag("s",
  252.                "silent operation - do not print log");
  253.     d->AddFlag("ps",
  254.                "print total number of intervals");
  255.     d->AddFlag("psn",
  256.                "print total number of scanned intervals");
  257.     d->AddDefaultKey("n", "rangeNumber",
  258.                      "number of intervals to use",
  259.                      CArgDescriptions::eInteger, "10000");
  260.     d->AddDefaultKey("l", "length",
  261.                      "length of whole region",
  262.                      CArgDescriptions::eInteger, "1000");
  263.     d->AddDefaultKey("il", "intervalLength",
  264.                      "max length of intervals to use",
  265.                      CArgDescriptions::eInteger, "20")
  266. ;
  267.     d->AddDefaultKey("ss", "scanStep",
  268.                      "step of scan intervals",
  269.                      CArgDescriptions::eInteger, "10");
  270.     d->AddDefaultKey("sl", "scanLength",
  271.                      "length of scan intervals",
  272.                      CArgDescriptions::eInteger, "20");
  273.     d->AddDefaultKey("sc", "scanCount",
  274.                      "how may times to run scan test",
  275.                      CArgDescriptions::eInteger, "1");
  276.     SetupArgDescriptions(d.release());
  277. }
  278. int CTestRangeMap::Run(void)
  279. {
  280.     const CArgs& args = GetArgs();
  281.     m_Count = args["c"].AsInteger();
  282.     m_Silent = args["s"];
  283.     m_PrintSize = args["ps"];
  284.     m_PrintTotalScannedNumber = args["psn"];
  285.     m_RangeNumber = args["n"].AsInteger();
  286.     m_Length = args["l"].AsInteger();
  287.     m_RangeLength = args["il"].AsInteger();
  288.     m_ScanCount = args["sc"].AsInteger();
  289.     m_ScanStep = args["ss"].AsInteger();
  290.     m_ScanLength = args["sl"].AsInteger();
  291.     
  292.     bool intervalTree =
  293.         args["t"].AsString() == "CIntervalTree" ||
  294.         args["t"].AsString() == "i";
  295.     for ( int count = 0; count < m_Count; ++count ) {
  296.         if ( intervalTree )
  297.             TestIntervalTree();
  298.         else
  299.             TestRangeMap();
  300.     }
  301.     return 0;
  302. }
  303. END_NCBI_SCOPE
  304. int main(int argc, const char* argv[])
  305. {
  306.     return NCBI_NS_NCBI::CTestRangeMap().AppMain(argc, argv);
  307. }
  308. /*
  309.  * ===========================================================================
  310.  * $Log: test_rangemap.cpp,v $
  311.  * Revision 1000.1  2004/06/01 19:42:49  gouriano
  312.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  313.  *
  314.  * Revision 1.13  2004/05/17 21:09:26  gorelenk
  315.  * Added include of PCH ncbi_pch.hpp
  316.  *
  317.  * Revision 1.12  2002/12/19 20:24:56  grichenk
  318.  * Updated usage of CRange<>
  319.  *
  320.  * Revision 1.11  2002/11/08 19:43:39  grichenk
  321.  * CConstRef<> constructor made explicit
  322.  *
  323.  * Revision 1.10  2002/04/16 18:52:16  ivanov
  324.  * Centralize threatment of assert() in tests.
  325.  * Added #include <test/test_assert.h>. CVS log moved to end of file.
  326.  *
  327.  * Revision 1.9  2001/01/29 15:18:49  vasilche
  328.  * Cleaned CRangeMap and CIntervalTree classes.
  329.  *
  330.  * Revision 1.8  2001/01/16 20:52:31  vasilche
  331.  * Simplified some CRangeMap code.
  332.  *
  333.  * Revision 1.7  2001/01/11 15:00:47  vasilche
  334.  * Added CIntervalTree for seraching on set of intervals.
  335.  *
  336.  * Revision 1.6  2001/01/05 20:09:13  vasilche
  337.  * Added util directory for various algorithms and utility classes.
  338.  *
  339.  * Revision 1.5  2001/01/05 15:49:52  vasilche
  340.  * Fixed warning.
  341.  *
  342.  * Revision 1.4  2001/01/05 13:59:17  vasilche
  343.  * Reduced CRangeMap* templates size.
  344.  * Added CRangeMultimap template.
  345.  *
  346.  * Revision 1.3  2001/01/03 16:39:29  vasilche
  347.  * Added CAbstractObjectManager - stub for object manager.
  348.  * CRange extracted to separate file.
  349.  *
  350.  * Revision 1.2  2000/12/26 17:27:47  vasilche
  351.  * Implemented CRangeMap<> template for sorting Seq-loc objects.
  352.  *
  353.  * Revision 1.1  2000/12/21 21:52:53  vasilche
  354.  * Added CRangeMap<> template for sorting integral ranges (Seq-loc).
  355.  *
  356.  * Revision 1.1  2000/12/19 20:52:19  vasilche
  357.  * Test program of C++ object manager.
  358.  *
  359.  * ===========================================================================
  360.  */