]> matita.cs.unibo.it Git - helm.git/commitdiff
* depths now in hash table
authorLuca Padovani <luca.padovani@unito.it>
Tue, 9 Nov 2004 07:55:31 +0000 (07:55 +0000)
committerLuca Padovani <luca.padovani@unito.it>
Tue, 9 Nov 2004 07:55:31 +0000 (07:55 +0000)
helm/papers/use_case/stats/stats.cc

index cab4326ceff2270dcccd234ea4f73df2d2d1a327..a7016f0ee83cdc44454ac42d5f4b402cf9d52399 100644 (file)
@@ -4,19 +4,19 @@
 #include <GdomeSmartDOM.hh>
 
 #include <ext/hash_map>
+namespace stdx = __gnu_cxx;
 
 namespace DOM = GdomeSmartDOM;
 
-unsigned n_elements;
-unsigned n_leaf_elements;
-unsigned n_text_nodes;
-unsigned n_blank_text_nodes;
-unsigned n_attributes;
-unsigned max_attributes;
-unsigned max_depth;
-unsigned max_children;
-std::hash_map<unsigned,unsigned> depths;
-std::vector<unsigned> widths;
+int n_elements;
+int n_leaf_elements;
+int n_text_nodes;
+int n_blank_text_nodes;
+int n_attributes;
+int max_attributes;
+int max_children;
+stdx::hash_map<int,int> depths;
+std::vector<int> widths;
 
 bool
 is_blank(const std::string& s)
@@ -27,28 +27,28 @@ is_blank(const std::string& s)
 }
 
 void
-add_depth(unsigned depth)
+add_depth(int depth)
 {
-       std::hash_map<unsigned,unsigned>::iterator p = depths.find(depth);
-       if (p != depths.end())
-               p->end++;
-       else
-               depths[depth] = 1;
+  stdx::hash_map<int,int>::iterator p = depths.find(depth);
+  if (p != depths.end())
+    p->second++;
+  else
+    depths[depth] = 1;
 }
 
 void
-visit(DOM::Node node, unsigned depth)
+visit(DOM::Node node, int depth)
 {
   assert(node);
 
-  max_depth = std::max(max_depth, depth);
+  add_depth(depth);
 
   switch (node.get_nodeType())
     {
     case DOM::Node::ELEMENT_NODE:
       {
        n_elements++;
-       const unsigned n_attrs = node.get_attributes().get_length();
+       const int n_attrs = node.get_attributes().get_length();
        n_attributes += n_attrs;
        max_attributes = std::max(max_attributes, n_attrs);
        if (!node.get_firstChild()) n_leaf_elements++;
@@ -62,7 +62,7 @@ visit(DOM::Node node, unsigned depth)
       break;
     }
 
-  unsigned n_children = 0;
+  int n_children = 0;
   for (DOM::Node p = node.get_firstChild(); p; p = p.get_nextSibling())
     {
       visit(p, depth + 1);
@@ -70,27 +70,31 @@ visit(DOM::Node node, unsigned depth)
     }
   max_children = std::max(max_children, n_children);
 
-  if (!node.get_firstChild())
-    depths.push_back(depth);
-  else
+  if (node.get_firstChild())
     widths.push_back(n_children);
 }
 
 void
 print_results(const std::string& URI)
 {
-  unsigned tot_depth = 0;
-  for (std::vector<unsigned>::const_iterator p = depths.begin(); p != depths.end(); p++)
-         tot_depth += *p;
-  
-  unsigned tot_width = 0;
-  for (std::vector<unsigned>::const_iterator p = widths.begin(); p != widths.end(); p++)
-         tot_width += *p;
+  int n_depths = 0;
+  int tot_depth = 0;
+  int max_depth = 0;
+  for (stdx::hash_map<int,int>::const_iterator p = depths.begin(); p != depths.end(); p++)
+    {
+      n_depths += p->second;
+      tot_depth += p->first * p->second;
+      max_depth = std::max(max_depth, p->first);
+    }
+
+  int tot_width = 0;
+  for (std::vector<int>::const_iterator p = widths.begin(); p != widths.end(); p++)
+    tot_width += *p;
 
   std::cout << "<stats for=\"" << URI << "\">" << std::endl;
   std::cout << "  <depth>" << std::endl;
   std::cout << "    <max>" << max_depth << "</max>" << std::endl;
-  std::cout << "    <leaf-avg>" << tot_depth / ((double) depths.size()) << "</leaf-avg>" << std::endl;
+  std::cout << "    <leaf-avg>" << tot_depth / ((double) n_depths) << "</leaf-avg>" << std::endl;
   std::cout << "  </depth>" << std::endl;
   std::cout << "  <width>" << std::endl;
   std::cout << "    <max>" << max_children << "</max>" << std::endl;