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
|