Mesh Oriented datABase  (version 5.5.0)
An array-based unstructured mesh library
TreeStats.hpp
Go to the documentation of this file.
1 /**\file TreeStats.hpp
2  * \class moab::TreeStats
3  * \brief Traversal statistics accumulating and reporting
4  *
5  * Class to accumulate statistics on traversal performance. This structure contains the
6  * count of nodes visited at each level in a tree, and the count of traversals that ended
7  * at each level. One TrvStats structure can be used with multiple trees or multiple
8  * queries, or used on only a single tree or a single query.
9  *
10  * Note that these traversal statistics are not related to the stats() query below,
11  * which calculates static information about a tree. These statistics relate
12  * to a tree's dynamic behavior on particular operations.
13  */
14 
15 #ifndef TREESTATS_HPP
16 #define TREESTATS_HPP
17 
18 #include "moab/Interface.hpp"
19 
20 #include <vector>
21 #include <iostream>
22 #include <string>
23 
24 namespace moab
25 {
26 class TreeStats
27 {
28  public:
29  //! constructor
31  {
32  reset();
33  }
34 
35  /** \brief Given a root node, compute the stats for a tree
36  * \param impl MOAB instance pointer
37  * \param root_node Root entity set for the tree
38  */
39  ErrorCode compute_stats( Interface* impl, EntityHandle root_node );
40 
41  //! reset traversal counters
42  void reset_trav_stats();
43 
44  //! reset all counters
45  void reset();
46 
47  //! print the contents of this structure
48  void print() const;
49 
50  //! output all the contents of this structure on a single line
51  void output_all_stats( const bool with_endl = true ) const;
52 
53  //! output just the traversal stats of this structure on a single line
54  void output_trav_stats( const bool with_endl = true ) const;
55 
56  // times
57  double initTime;
58 
59  // tree stats that depend only on structure (not traversal)
60  unsigned int maxDepth;
61  unsigned int numNodes;
62  unsigned int numLeaves;
63  double avgObjPerLeaf;
64  unsigned int minObjPerLeaf;
65  unsigned int maxObjPerLeaf;
66 
67  // traversal statistics
68  unsigned int nodesVisited; // number of tree nodes visited since last reset
69  unsigned int leavesVisited; // number of tree leaves visited since last reset
70  unsigned int numTraversals; // number of tree traversals since last reset
71  unsigned int constructLeafObjectTests; // during construction, number of tests of objects (e.g.
72  // elements)
73  unsigned int traversalLeafObjectTests; // during traversals, number of tests of objects (e.g. elements)
74  unsigned int boxElemTests; // during construction, number of calls to
75  // GeomUtil::box_elem_overlap (KD tree only)
76 
77  private:
78  ErrorCode traverse( Interface* impl, EntityHandle node, unsigned int& depth );
79 };
80 
82 {
83  maxDepth = 0;
84  numNodes = 0;
85  numLeaves = 0;
86  avgObjPerLeaf = 0.0;
87  minObjPerLeaf = 0;
88  maxObjPerLeaf = 0;
89 
90  ErrorCode rval = traverse( impl, root_node, maxDepth );
91  avgObjPerLeaf = ( avgObjPerLeaf > 0 ? avgObjPerLeaf / (double)numLeaves : 0.0 );
92  return rval;
93 }
94 
95 inline ErrorCode TreeStats::traverse( Interface* impl, EntityHandle node, unsigned int& depth )
96 {
97  depth++;
98  numNodes++;
99  std::vector< EntityHandle > children;
100  children.reserve( 2 );
101  ErrorCode rval = impl->get_child_meshsets( node, children );
102  if( MB_SUCCESS != rval ) return rval;
103  if( children.empty() )
104  {
105  numLeaves++;
106  rval = impl->get_entities_by_handle( node, children );
107  if( MB_SUCCESS != rval ) return rval;
108  avgObjPerLeaf += children.size();
109  minObjPerLeaf = std::min( (unsigned int)children.size(), minObjPerLeaf );
110  maxObjPerLeaf = std::max( (unsigned int)children.size(), maxObjPerLeaf );
111  return MB_SUCCESS;
112  }
113  else
114  {
115  unsigned int right_depth = depth, left_depth = depth;
116  rval = traverse( impl, children[0], left_depth );
117  if( MB_SUCCESS != rval ) return rval;
118  rval = traverse( impl, children[1], right_depth );
119  if( MB_SUCCESS != rval ) return rval;
120  depth = std::max( left_depth, right_depth );
121  return MB_SUCCESS;
122  }
123 }
124 
125 inline void TreeStats::reset()
126 {
127  initTime = 0.0;
128 
129  maxDepth = 0;
130  numNodes = 0;
131  numLeaves = 0;
133  boxElemTests = 0;
134  avgObjPerLeaf = 0.0;
135  minObjPerLeaf = 0.0;
136  maxObjPerLeaf = 0.0;
137 
139 }
140 
142 {
143  nodesVisited = 0;
144  leavesVisited = 0;
145  numTraversals = 0;
147 }
148 
149 inline void TreeStats::print() const
150 {
151  std::cout << "Tree initialization time = " << initTime << " seconds" << std::endl;
152 
153  std::cout << "Num nodes = " << numNodes << std::endl;
154  std::cout << "Num leaves = " << numLeaves << std::endl;
155  std::cout << "Max depth = " << maxDepth << std::endl << std::endl;
156 
157  std::cout << "Avg objs per leaf = " << avgObjPerLeaf << std::endl;
158  std::cout << "Min objs per leaf = " << minObjPerLeaf << std::endl;
159  std::cout << "Max objs per leaf = " << maxObjPerLeaf << std::endl;
160 
161  std::cout << "Construction Leaf Object Tests = " << constructLeafObjectTests << std::endl;
162  std::cout << "Box-Element Tests = " << boxElemTests << std::endl;
163 
164  std::cout << "NodesVisited = " << nodesVisited << std::endl;
165  std::cout << "LeavesVisited = " << leavesVisited << std::endl;
166  std::cout << "Num Traversals = " << numTraversals << std::endl;
167  std::cout << "Traversal Leaf Object Tests = " << traversalLeafObjectTests << std::endl;
168 }
169 
170 inline void TreeStats::output_all_stats( const bool with_endl ) const
171 {
172  std::cout << initTime << " " << numNodes << " " << numLeaves << " " << maxDepth << " " << avgObjPerLeaf << " "
173  << minObjPerLeaf << " " << maxObjPerLeaf << " " << constructLeafObjectTests << " " << boxElemTests << " "
174  << nodesVisited << " " << leavesVisited << " " << numTraversals << " " << traversalLeafObjectTests << " ";
175  if( with_endl ) std::cout << std::endl;
176 }
177 
178 inline void TreeStats::output_trav_stats( const bool with_endl ) const
179 {
180  std::cout << nodesVisited << " " << leavesVisited << " " << numTraversals << " " << traversalLeafObjectTests << " ";
181  if( with_endl ) std::cout << std::endl;
182 }
183 } // namespace moab
184 
185 #endif