Go to the documentation of this file. 1
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
30 TreeStats()
31 {
32 reset();
33 }
34
35
39 ErrorCode compute_stats( Interface* impl, EntityHandle root_node );
40
41
42 void reset_trav_stats();
43
44
45 void reset();
46
47
48 void print() const;
49
50
51 void output_all_stats( const bool with_endl = true ) const;
52
53
54 void output_trav_stats( const bool with_endl = true ) const;
55
56
57 double initTime;
58
59
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
68 unsigned int nodesVisited;
69 unsigned int leavesVisited;
70 unsigned int numTraversals;
71 unsigned int constructLeafObjectTests;
72
73 unsigned int traversalLeafObjectTests;
74 unsigned int boxElemTests;
75
76
77 private:
78 ErrorCode traverse( Interface* impl, EntityHandle node, unsigned int& depth );
79 };
80
81 inline ErrorCode TreeStats::compute_stats( Interface* impl, EntityHandle root_node )
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;
132 constructLeafObjectTests = 0;
133 boxElemTests = 0;
134 avgObjPerLeaf = 0.0;
135 minObjPerLeaf = 0.0;
136 maxObjPerLeaf = 0.0;
137
138 reset_trav_stats();
139 }
140
141 inline void TreeStats::reset_trav_stats()
142 {
143 nodesVisited = 0;
144 leavesVisited = 0;
145 numTraversals = 0;
146 traversalLeafObjectTests = 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 }
184
185 #endif