annotate DEPENDENCIES/generic/include/boost/graph/graph_stats.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 // Copyright 2005 The Trustees of Indiana University.
Chris@16 2
Chris@16 3 // Use, modification and distribution is subject to the Boost Software
Chris@16 4 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 5 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 6
Chris@16 7 // Authors: Alex Breuer
Chris@16 8 // Andrew Lumsdaine
Chris@16 9 #ifndef BOOST_GRAPH_GRAPH_STATS_HPP
Chris@16 10 #define BOOST_GRAPH_GRAPH_STATS_HPP
Chris@16 11
Chris@16 12 #include <map>
Chris@16 13 #include <list>
Chris@16 14 #include <boost/graph/iteration_macros.hpp>
Chris@16 15 #include <boost/assert.hpp>
Chris@16 16
Chris@16 17 namespace boost { namespace graph {
Chris@16 18
Chris@16 19 template<typename Graph>
Chris@16 20 struct sort_edge_by_origin {
Chris@16 21 public:
Chris@16 22 typedef typename graph_traits<Graph>::edge_descriptor edge_type;
Chris@16 23
Chris@16 24 explicit sort_edge_by_origin( Graph& g ) : g(g) {}
Chris@16 25
Chris@16 26 inline bool operator()( edge_type a, edge_type b ) {
Chris@16 27 return source( a, g ) == source( b, g ) ? target( a, g ) < target( b, g ) :
Chris@16 28 source( a, g ) < source( b, g );
Chris@16 29 }
Chris@16 30
Chris@16 31 private:
Chris@16 32 Graph& g;
Chris@16 33 };
Chris@16 34
Chris@16 35 template<typename Graph>
Chris@16 36 struct equal_edge {
Chris@16 37 public:
Chris@16 38 typedef typename graph_traits<Graph>::edge_descriptor edge_type;
Chris@16 39
Chris@16 40 explicit equal_edge( Graph& g ) : g(g) {}
Chris@16 41
Chris@16 42 inline bool operator()( edge_type a, edge_type b ) {
Chris@16 43 return source( a, g ) == source( b, g ) &&
Chris@16 44 target( a, g ) == target( b, g );
Chris@16 45 }
Chris@16 46
Chris@16 47 private:
Chris@16 48 Graph& g;
Chris@16 49 };
Chris@16 50
Chris@16 51 template<typename Graph>
Chris@16 52 unsigned long num_dup_edges( Graph& g ) {
Chris@16 53 typedef typename graph_traits<Graph>::edge_iterator e_iterator_type;
Chris@16 54 typedef typename graph_traits<Graph>::edge_descriptor edge_type;
Chris@16 55
Chris@16 56 std::list<edge_type> all_edges;
Chris@16 57
Chris@16 58 BGL_FORALL_EDGES_T( e, g, Graph ) {
Chris@16 59 all_edges.push_back( e );
Chris@16 60 }
Chris@16 61
Chris@16 62 sort_edge_by_origin<Graph> cmp1( g );
Chris@16 63 all_edges.sort( cmp1 );
Chris@16 64 equal_edge<Graph> cmp2( g );
Chris@16 65 all_edges.unique( cmp2 );
Chris@16 66
Chris@16 67 return num_edges( g ) - all_edges.size();
Chris@16 68 }
Chris@16 69
Chris@16 70
Chris@16 71 template<typename Graph>
Chris@16 72 std::map<unsigned long, unsigned long> dup_edge_dist( Graph& g ) {
Chris@16 73 std::map<unsigned long, unsigned long> dist;
Chris@16 74 typedef typename graph_traits<Graph>::adjacency_iterator a_iterator_type;
Chris@16 75 typedef typename graph_traits<Graph>::vertex_descriptor vertex_type;
Chris@16 76
Chris@16 77
Chris@16 78 BGL_FORALL_VERTICES_T( v, g, Graph ) {
Chris@16 79 std::list<vertex_type> front_neighbors;
Chris@16 80 a_iterator_type a_iter, a_end;
Chris@16 81 for( boost::tie( a_iter, a_end ) = adjacent_vertices( v, g );
Chris@16 82 a_iter != a_end; ++a_iter ) {
Chris@16 83 front_neighbors.push_back( *a_iter );
Chris@16 84 }
Chris@16 85
Chris@16 86 front_neighbors.sort();
Chris@16 87 front_neighbors.unique();
Chris@16 88 dist[out_degree( v, g ) - front_neighbors.size()] += 1;
Chris@16 89 }
Chris@16 90 return dist;
Chris@16 91 }
Chris@16 92
Chris@16 93 template<typename Graph>
Chris@16 94 std::map<unsigned long, unsigned long> degree_dist( Graph& g ) {
Chris@16 95 std::map<unsigned long, unsigned long> dist;
Chris@16 96 typedef typename graph_traits<Graph>::adjacency_iterator a_iterator_type;
Chris@16 97 typedef typename graph_traits<Graph>::vertex_descriptor vertex_type;
Chris@16 98
Chris@16 99 BGL_FORALL_VERTICES_T( v, g, Graph ) {
Chris@16 100 dist[out_degree( v, g )] += 1;
Chris@16 101 }
Chris@16 102
Chris@16 103 return dist;
Chris@16 104 }
Chris@16 105
Chris@16 106 template<typename Graph>
Chris@16 107 std::map<unsigned long, double> weight_degree_dist( Graph& g ) {
Chris@16 108 std::map<unsigned long, double> dist, n;
Chris@16 109 typedef typename graph_traits<Graph>::adjacency_iterator a_iterator_type;
Chris@16 110 typedef typename graph_traits<Graph>::vertex_descriptor vertex_type;
Chris@16 111 typedef typename property_map<Graph, edge_weight_t>::const_type edge_map_type;
Chris@16 112 typedef typename property_traits<edge_map_type>::value_type
Chris@16 113 edge_weight_type;
Chris@16 114
Chris@16 115 typename property_map<Graph, edge_weight_t>::type em = get( edge_weight, g );
Chris@16 116
Chris@16 117 BGL_FORALL_VERTICES_T( v, g, Graph ) {
Chris@16 118 edge_weight_type tmp = 0;
Chris@16 119 BGL_FORALL_OUTEDGES_T( v, e, g, Graph ) {
Chris@16 120 tmp += em[e];
Chris@16 121 }
Chris@16 122 n[out_degree( v, g )] += 1.;
Chris@16 123 dist[out_degree( v, g )] += tmp;
Chris@16 124 }
Chris@16 125
Chris@16 126 for( std::map<unsigned long, double>::iterator iter = dist.begin();
Chris@16 127 iter != dist.end(); ++iter ) {
Chris@16 128 BOOST_ASSERT( n[iter->first] != 0 );
Chris@16 129 dist[iter->first] /= n[iter->first];
Chris@16 130 }
Chris@16 131
Chris@16 132 return dist;
Chris@16 133 }
Chris@16 134
Chris@16 135 }}
Chris@16 136
Chris@16 137 #endif