X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fpapers%2Fuse_case%2Fstats%2Fstats.cc;h=f2b128faf89540d53d93ac115f6161923c53a6e6;hb=4167cea65ca58897d1a3dbb81ff95de5074700cc;hp=9892e12b67948113de7f7d61c833a7accf89e194;hpb=8fce28cde4e422993148e1fca011cae7ea230c16;p=helm.git diff --git a/helm/papers/use_case/stats/stats.cc b/helm/papers/use_case/stats/stats.cc index 9892e12b6..f2b128faf 100644 --- a/helm/papers/use_case/stats/stats.cc +++ b/helm/papers/use_case/stats/stats.cc @@ -1,39 +1,54 @@ +#include #include #include +#include +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; +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 depths; +std::vector widths; bool is_blank(const std::string& s) { for (int i = 0; i < s.length(); i++) - if (!isblank(s[i])) return false; + if (!isspace(s[i])) return false; return true; } void -visit(DOM::Node node, unsigned depth) +add_depth(int depth) +{ + stdx::hash_map::iterator p = depths.find(depth); + if (p != depths.end()) + p->second++; + else + depths[depth] = 1; +} + +void +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++; @@ -47,20 +62,45 @@ 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); n_children++; } max_children = std::max(max_children, n_children); + + if (node.get_firstChild()) + widths.push_back(n_children); } void -print_results(const std::string& URI) +print_results(const std::string& URI, long size) { + int n_depths = 0; + int tot_depth = 0; + int max_depth = 0; + for (stdx::hash_map::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::const_iterator p = widths.begin(); p != widths.end(); p++) + tot_width += *p; + std::cout << "" << std::endl; - std::cout << " " << max_depth << "" << std::endl; + std::cout << " " << size << "" << std::endl; + std::cout << " " << std::endl; + std::cout << " " << max_depth << "" << std::endl; + std::cout << " " << tot_depth / ((double) n_depths) << "" << std::endl; + std::cout << " " << std::endl; + std::cout << " " << std::endl; + std::cout << " " << max_children << "" << std::endl; + std::cout << " " << tot_width / ((double) widths.size()) << "" << std::endl; + std::cout << " " << std::endl; std::cout << " " << std::endl; std::cout << " " << n_elements << "" << std::endl; std::cout << " " << n_leaf_elements << "" << std::endl; @@ -73,17 +113,19 @@ print_results(const std::string& URI) std::cout << " " << n_attributes << "" << std::endl; std::cout << " " << max_attributes << "" << std::endl; std::cout << " " << std::endl; - std::cout << " " << std::endl; - std::cout << " " << max_children << "" << std::endl; - std::cout << " " << std::endl; std::cout << "" << std::endl; } int main(int argc, char* argv[]) { + if (argc != 3) { + std::cerr << "Usage: stats " << std::endl; + return -1; + } + DOM::DOMImplementation di; DOM::Document doc = di.createDocumentFromURI(argv[1]); visit(doc, 0); - print_results(argv[1]); + print_results(argv[1], atoi(argv[2])); }