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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_ncbi_tree.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:09:53  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.16
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_ncbi_tree.cpp,v 1000.2 2004/06/01 19:09:53 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:  Anatoliy Kuznetov
  35.  *
  36.  * File Description:
  37.  *   TEST for:  NCBI C++ core tree related API
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <corelib/ncbiapp.hpp>
  42. #include <corelib/ncbienv.hpp>
  43. #include <corelib/ncbireg.hpp>
  44. #include <corelib/ncbi_tree.hpp>
  45. #include <util/bitset/bitset_debug.hpp>
  46. #include <algo/tree/tree_algo.hpp>
  47. #include <util/bitset/ncbi_bitset.hpp>
  48. #include <algorithm>
  49. #include <test/test_assert.h>  /* This header must go last */
  50. // This is to use the ANSI C++ standard templates without the "std::" prefix
  51. // and to use NCBI C++ entities without the "ncbi::" prefix
  52. USING_NCBI_SCOPE;
  53. /////////////////////////////////
  54. // Test application
  55. //
  56. class CTestApplication : public CNcbiApplication
  57. {
  58. public:
  59.     void Init(void);
  60.     int Run(void);
  61. };
  62. void CTestApplication::Init(void)
  63. {
  64.     // Set err.-posting and tracing to maximum
  65.     SetDiagTrace(eDT_Enable);
  66.     SetDiagPostFlag(eDPF_All);
  67.     SetDiagPostLevel(eDiag_Info);
  68. }
  69. ETreeTraverseCode TestFunctor1(CTreeNode<int>& tr, int delta)
  70. {
  71.     cout << tr.GetValue() << " :" << delta << endl;
  72.     return eTreeTraverse;
  73. }
  74. static string s_IntToStr(int i)
  75. {
  76.     return NStr::IntToString(i);
  77. }
  78. static void s_TEST_Tree()
  79. {
  80.     typedef CTreeNode<int>  TTree;
  81.     
  82.     TTree* tr = new TTree(0);
  83.     
  84.     TTree* tr10 = tr->AddNode(10);
  85.     tr->AddNode(11);
  86. //    TreePrint(cout, *tr, (IntConvType) NStr::IntToString);
  87. //    TreeReRoot(*tr10);
  88. //    TreePrint(cout, *tr10, (IntConvType) NStr::IntToString);
  89.     TreeDepthFirstTraverse(*tr, TestFunctor1);
  90.     cout << endl;
  91.     {{
  92.     unsigned int cnt;
  93.     TTree::TNodeList_CI it = tr->SubNodeBegin();
  94.     TTree::TNodeList_CI it_end = tr->SubNodeEnd();
  95.     
  96.     for (cnt = 0; it != it_end; ++it, ++cnt) {
  97.         const TTree* t = *it;
  98.         int v = t->GetValue();
  99.         assert(v == 10 || v == 11);
  100.     }
  101.     assert(cnt == 2);
  102.     }}
  103.     
  104.     {{
  105.     TTree* tr2 = new TTree(*tr);
  106.     unsigned int cnt;
  107.     TTree::TNodeList_CI it = tr2->SubNodeBegin();
  108.     TTree::TNodeList_CI it_end = tr2->SubNodeEnd();
  109.     
  110.     for (cnt = 0; it != it_end; ++it, ++cnt) {
  111.         const TTree* t = *it;
  112.         int v = t->GetValue();
  113.         assert(v == 10 || v == 11);
  114.     }
  115.     assert(cnt == 2);
  116.     delete tr2;
  117.     }}
  118.     
  119.     
  120.     {{
  121.     TTree::TNodeList_I it = tr->SubNodeBegin();
  122.     TTree::TNodeList_I it_end = tr->SubNodeEnd();
  123.     
  124.     for (; it != it_end; ++it) {
  125.         TTree* t = *it;
  126.         int v = t->GetValue();
  127.         if (v == 10)
  128.         {
  129.             tr->RemoveNode(t);
  130.             break;
  131.         }
  132.     }
  133.     }}
  134.     TreeDepthFirstTraverse(*tr, TestFunctor1);
  135.     cout << endl;
  136.     {{
  137.     unsigned int cnt;
  138.     TTree::TNodeList_CI it = tr->SubNodeBegin();
  139.     TTree::TNodeList_CI it_end = tr->SubNodeEnd();
  140.     
  141.     for (cnt = 0; it != it_end; ++it, ++cnt) {
  142.         const TTree* t = *it;
  143.         int v = t->GetValue();
  144.         assert(v == 11);
  145.     }
  146.     assert(cnt == 1);
  147.     }}
  148.     
  149.     delete tr;
  150.     TTree* str = tr = new TTree(0);
  151.     
  152.     //
  153.     // 0 - 2 
  154.     //       - 4
  155.     //   - 3 
  156.     //       - 5
  157.     //       - 6
  158.     //
  159.     TTree* tr4 = tr->AddNode(2)->AddNode(4);
  160.     tr = tr->AddNode(3);
  161.     TTree* tr5 = tr->AddNode(5);
  162.     TTree* tr6 = tr->AddNode(6);
  163.     cout << "Test Tree: " << endl;
  164.     TreeDepthFirstTraverse(*str, TestFunctor1);
  165.     cout << endl;
  166.     vector<const TTree*> trace_vec;
  167.     TreeTraceToRoot(*tr6, trace_vec);
  168.     assert(trace_vec.size() == 3);
  169.     {{
  170.     cout << "Trace to root: ";
  171.     ITERATE(vector<const TTree*>, it, trace_vec) {
  172.         cout << (*it)->GetValue() << "; ";
  173.     }
  174.     cout << endl;
  175.     }}
  176.     const TTree* parent_node = TreeFindCommonParent(*tr4, *tr6);
  177.     assert(tr4->IsParent(*parent_node));
  178.     assert(tr6->IsParent(*parent_node));
  179.     assert(!tr4->IsParent(*tr6));
  180.     assert(parent_node);
  181.     cout << "parent: " << parent_node->GetValue() << endl;
  182.     assert(parent_node->GetValue() == 0);
  183.     parent_node = TreeFindCommonParent(*tr5, *tr6);
  184.     assert(parent_node);
  185.     assert(parent_node->GetValue() == 3);
  186.     TreePrint(cout, *str, s_IntToStr);
  187.     cout << endl;
  188.     TreeReRoot(*tr5);
  189.     TreePrint(cout, *tr5, s_IntToStr);
  190.     tr5->MoveSubnodes(str);
  191.     TreePrint(cout, *tr5, s_IntToStr);
  192.     delete tr5;
  193. }
  194. struct IdValue
  195. {
  196.     int id;
  197.     
  198.     IdValue() : id(0) {}
  199.     IdValue(int v) : id(v) {}
  200.     operator int() const { return id; }
  201.     int GetId() const { return id; }
  202. };
  203. static string s_IdValueToStr(const IdValue& idv)
  204. {
  205.     return NStr::IntToString(idv.id);
  206. }
  207. static void s_TEST_IdTreeOperations()
  208. {
  209.     cout << "--------------------- s_TEST_IdTreeOperations " << endl;
  210.     typedef CTreeNode<IdValue> TTree;
  211.     TTree* tr = new TTree(0);
  212.     TTree* tr10 = tr->AddNode(10);
  213.     TTree* tr11 = tr->AddNode(11);
  214.     TTree* tr110 = tr10->AddNode(110);
  215.     TTree* tr1100 = tr110->AddNode(1100);
  216.     TreePrint(cout, *tr, s_IdValueToStr);
  217.     bm::bvector<> bv;
  218.     TreeMakeSubNodesSet(*tr, bv.inserter());
  219.     assert(bv.count() == 2);
  220.     assert(bv[10]);
  221.     assert(bv[11]);
  222.     typedef vector<TTree*> TNodeList;
  223.     TNodeList node_list;
  224.     node_list.push_back(tr10);
  225.     node_list.push_back(tr11);
  226.     node_list.push_back(tr110);
  227.     node_list.push_back(tr1100);
  228.     TNodeList res_node_list;
  229.     CTreeNonRedundantSet<TTree, bm::bvector<>, TNodeList> nr_func;
  230.     nr_func(node_list, res_node_list);
  231.     cout << "Non-redundant set:" << endl;
  232.     ITERATE(TNodeList, it, res_node_list) {
  233.         cout << (*it)->GetValue().GetId() << "; ";
  234.     }
  235.     cout << endl;
  236.     assert(res_node_list.size() == 2);
  237.     res_node_list.clear();
  238.     node_list.clear();
  239.     node_list.push_back(tr110);
  240.     node_list.push_back(tr1100);
  241.     CTreeMinimalSet<TTree, bm::bvector<>, TNodeList> min_func;
  242.     min_func(node_list, res_node_list);
  243.     
  244.     cout << "Minimal set:" << endl;
  245.     ITERATE(TNodeList, it, res_node_list) {
  246.         cout << (*it)->GetValue().GetId() << "; ";
  247.     }
  248.     cout << endl;
  249.     cout << "-----" << endl;
  250.     assert(res_node_list.size() == 1);
  251.     res_node_list.clear();
  252.     node_list.clear();
  253.     node_list.push_back(tr110);
  254.     node_list.push_back(tr1100);
  255.     node_list.push_back(tr11);
  256.     min_func(node_list, res_node_list);
  257.     
  258.     cout << "Minimal set:" << endl;
  259.     ITERATE(TNodeList, it, res_node_list) {
  260.         cout << (*it)->GetValue().GetId() << "; ";
  261.     }
  262.     cout << endl;
  263.     cout << "-----" << endl;
  264.     assert(res_node_list.size() == 1);
  265.     res_node_list.clear();
  266.     node_list.clear();
  267.     
  268.     TNodeList node_list_a;
  269.     TNodeList node_list_b;
  270.     TNodeList node_list_c;
  271.     node_list_a.push_back(tr10);
  272.     node_list_a.push_back(tr11);
  273.     node_list_a.push_back(tr110);
  274.     node_list_a.push_back(tr1100);
  275.     
  276.     node_list_b.push_back(tr10);
  277.     node_list_b.push_back(tr11);
  278.     node_list_b.push_back(tr110);
  279.     CTreeNodesAnd<TTree, bm::bvector<>, TNodeList> and_func;
  280.     and_func(node_list_a, node_list_b, node_list_c);
  281.     ITERATE(TNodeList, it, node_list_c) {
  282.         cout << (*it)->GetValue().GetId() << "; ";
  283.     }
  284.     cout << endl;
  285.     assert(node_list_c.size() == 3);
  286.     node_list_c.clear();
  287.     CTreeNodesOr<TTree, bm::bvector<>, TNodeList> or_func;
  288.     or_func(node_list_a, node_list_b, node_list_c);
  289.     ITERATE(TNodeList, it, node_list_c) {
  290.         cout << (*it)->GetValue().GetId() << "; ";
  291.     }
  292.     cout << endl;
  293.     assert(node_list_c.size() == 4);
  294.     delete tr;
  295.     cout << "--------------------- s_TEST_IdTreeOperations ok" << endl;
  296. }
  297. static void s_TEST_IdTree()
  298. {
  299.     typedef CTreePairNode<int, int> TTree;
  300.     TTree* tr = new TTree(0, 0);
  301.     
  302.     tr->AddNode(1, 10);
  303.     tr->AddNode(100, 110);
  304.     TTree* tr2 = tr->AddNode(2, 20);
  305.     tr2->AddNode(20, 21);    
  306.     TTree* tr3 =tr2->AddNode(22, 22);
  307.     tr3->AddNode(222, 222);
  308.     {{
  309.     list<int> npath;
  310.     npath.push_back(2);
  311.     npath.push_back(22);
  312.     TTree::TConstPairTreeNodeList res;
  313.     tr->FindNodes(npath, &res);
  314.     assert(!res.empty());
  315.     TTree::TConstPairTreeNodeList::const_iterator it = res.begin();
  316.     const TTree* ftr = *it;
  317.     assert(ftr->GetValue() == 22);
  318.     }}
  319.     {{
  320.     list<int> npath;
  321.     npath.push_back(2);
  322.     npath.push_back(32);
  323.     TTree::TConstPairTreeNodeList res;
  324.     tr->FindNodes(npath, &res);
  325.     assert(res.empty());
  326.     }}
  327.     {{
  328.     list<int> npath;
  329.     npath.push_back(2);
  330.     npath.push_back(22);
  331.     npath.push_back(222);
  332.     npath.push_back(100);
  333.     const TTree* node = PairTreeTraceNode(*tr, npath);
  334.     assert(node);
  335.     cout << node->GetId() << " " << node->GetValue() << endl;
  336.     assert(node->GetValue() == 110);
  337.     node = PairTreeBackTraceNode(*tr3, 1);
  338.     assert(node);
  339.     cout << node->GetId() << " " << node->GetValue() << endl;
  340.     assert(node->GetValue() == 10);
  341.     }}
  342.     {{
  343.     list<int> npath;
  344.     npath.push_back(2);
  345.     npath.push_back(22);
  346.     npath.push_back(222);
  347.     const TTree* node = PairTreeTraceNode(*tr, npath);
  348.     assert(node);
  349.     cout << node->GetId() << " " << node->GetValue() << endl;
  350.     assert(node->GetValue() == 222);
  351.     }}
  352.     delete tr;
  353. }
  354. int CTestApplication::Run(void)
  355. {
  356.     //        CExceptionReporterStream reporter(cerr);
  357.     //        CExceptionReporter::SetDefault(&reporter);
  358.     //        CExceptionReporter::EnableDefault(false);
  359.     //        CExceptionReporter::EnableDefault(true);
  360.     //        CExceptionReporter::SetDefault(0);
  361.     
  362.     SetupDiag(eDS_ToStdout);
  363.     /*      
  364.     CExceptionReporter::EnableDefault(true);
  365.     cerr << endl;
  366.     NCBI_REPORT_EXCEPTION(
  367.     "****** default reporter (stream) ******",e);
  368.     CExceptionReporter::SetDefault(0);
  369.     cerr << endl;
  370.     NCBI_REPORT_EXCEPTION(
  371.     "****** default reporter (diag) ******",e);
  372.     */
  373.     
  374.     s_TEST_Tree();
  375.     s_TEST_IdTree();
  376.     s_TEST_IdTreeOperations();
  377.     return 0;
  378. }
  379.   
  380. /////////////////////////////////
  381. // APPLICATION OBJECT and MAIN
  382. //
  383. int main(int argc, const char* argv[] /*, const char* envp[]*/)
  384. {
  385.     CTestApplication theTestApplication;
  386.     return theTestApplication.AppMain(argc, argv, 0 /*envp*/, eDS_ToMemory);
  387. }
  388. /*
  389.  * ==========================================================================
  390.  * $Log: test_ncbi_tree.cpp,v $
  391.  * Revision 1000.2  2004/06/01 19:09:53  gouriano
  392.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.16
  393.  *
  394.  * Revision 1.16  2004/05/14 13:59:51  gorelenk
  395.  * Added include of ncbi_pch.hpp
  396.  *
  397.  * Revision 1.15  2004/04/22 13:53:15  kuznets
  398.  * + test for minimal set
  399.  *
  400.  * Revision 1.14  2004/04/21 16:43:08  kuznets
  401.  * + test cases for AND, OR (tree node lists)
  402.  *
  403.  * Revision 1.13  2004/04/21 12:58:32  kuznets
  404.  * + s_TEST_IdTreeOperations
  405.  *
  406.  * Revision 1.12  2004/04/19 16:01:30  kuznets
  407.  * + #include <algo/tree/tree_algo.hpp>
  408.  *
  409.  * Revision 1.11  2004/04/09 14:40:33  kuznets
  410.  * TreeReRoot tested
  411.  *
  412.  * Revision 1.10  2004/04/08 21:46:35  ucko
  413.  * Use a more foolproof method of supplying NStr::IntToString to TreePrint.
  414.  *
  415.  * Revision 1.9  2004/04/08 18:35:50  kuznets
  416.  * + tree print test
  417.  *
  418.  * Revision 1.8  2004/04/08 11:48:22  kuznets
  419.  * + TreeTraceToRoot test
  420.  *
  421.  * Revision 1.7  2004/01/14 17:38:27  kuznets
  422.  * Reflecting changed in ncbi_tree
  423.  *
  424.  * Revision 1.6  2004/01/14 17:03:28  kuznets
  425.  * + test case for PairTreeTraceNode
  426.  *
  427.  * Revision 1.5  2004/01/14 15:26:24  kuznets
  428.  * Added test case for PairTreeTraceNode
  429.  *
  430.  * Revision 1.4  2004/01/14 14:20:08  kuznets
  431.  * + test for for depth first traversal
  432.  *
  433.  * Revision 1.3  2004/01/12 20:09:41  kuznets
  434.  * Renamed CTreeNWay to CTreeNode
  435.  *
  436.  * Revision 1.2  2004/01/12 15:02:48  kuznets
  437.  * + test for CTreePairNode
  438.  *
  439.  * Revision 1.1  2004/01/09 19:00:40  kuznets
  440.  * Added test for tree
  441.  *
  442.  *
  443.  * ==========================================================================
  444.  */