1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
// (C) Copyright 2007-2009 Andrew Sutton
//
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0 (See accompanying file
// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_GRAPH_DEGREE_CENTRALITY_HPP
#define BOOST_GRAPH_DEGREE_CENTRALITY_HPP
#include <boost/graph/graph_concepts.hpp>
#include <boost/concept/assert.hpp>
namespace boost
{
template < typename Graph > struct degree_centrality_measure
{
typedef typename graph_traits< Graph >::degree_size_type degree_type;
typedef typename graph_traits< Graph >::vertex_descriptor vertex_type;
};
template < typename Graph >
struct influence_measure : public degree_centrality_measure< Graph >
{
typedef degree_centrality_measure< Graph > base_type;
typedef typename base_type::degree_type degree_type;
typedef typename base_type::vertex_type vertex_type;
inline degree_type operator()(vertex_type v, const Graph& g)
{
BOOST_CONCEPT_ASSERT((IncidenceGraphConcept< Graph >));
return out_degree(v, g);
}
};
template < typename Graph >
inline influence_measure< Graph > measure_influence(const Graph&)
{
return influence_measure< Graph >();
}
template < typename Graph >
struct prestige_measure : public degree_centrality_measure< Graph >
{
typedef degree_centrality_measure< Graph > base_type;
typedef typename base_type::degree_type degree_type;
typedef typename base_type::vertex_type vertex_type;
inline degree_type operator()(vertex_type v, const Graph& g)
{
BOOST_CONCEPT_ASSERT((BidirectionalGraphConcept< Graph >));
return in_degree(v, g);
}
};
template < typename Graph >
inline prestige_measure< Graph > measure_prestige(const Graph&)
{
return prestige_measure< Graph >();
}
template < typename Graph, typename Vertex, typename Measure >
inline typename Measure::degree_type degree_centrality(
const Graph& g, Vertex v, Measure measure)
{
BOOST_CONCEPT_ASSERT((DegreeMeasureConcept< Measure, Graph >));
return measure(v, g);
}
template < typename Graph, typename Vertex >
inline typename graph_traits< Graph >::degree_size_type degree_centrality(
const Graph& g, Vertex v)
{
return degree_centrality(g, v, measure_influence(g));
}
// These are alias functions, intended to provide a more expressive interface.
template < typename Graph, typename Vertex >
inline typename graph_traits< Graph >::degree_size_type influence(
const Graph& g, Vertex v)
{
return degree_centrality(g, v, measure_influence(g));
}
template < typename Graph, typename Vertex >
inline typename graph_traits< Graph >::degree_size_type prestige(
const Graph& g, Vertex v)
{
return degree_centrality(g, v, measure_prestige(g));
}
template < typename Graph, typename CentralityMap, typename Measure >
inline void all_degree_centralities(
const Graph& g, CentralityMap cent, Measure measure)
{
BOOST_CONCEPT_ASSERT((VertexListGraphConcept< Graph >));
typedef typename graph_traits< Graph >::vertex_descriptor Vertex;
typedef typename graph_traits< Graph >::vertex_iterator VertexIterator;
BOOST_CONCEPT_ASSERT((WritablePropertyMapConcept< CentralityMap, Vertex >));
typedef typename property_traits< CentralityMap >::value_type Centrality;
VertexIterator i, end;
for (boost::tie(i, end) = vertices(g); i != end; ++i)
{
Centrality c = degree_centrality(g, *i, measure);
put(cent, *i, c);
}
}
template < typename Graph, typename CentralityMap >
inline void all_degree_centralities(const Graph& g, CentralityMap cent)
{
all_degree_centralities(g, cent, measure_influence(g));
}
// More helper functions for computing influence and prestige.
// I hate the names of these functions, but influence and prestige
// don't pluralize too well.
template < typename Graph, typename CentralityMap >
inline void all_influence_values(const Graph& g, CentralityMap cent)
{
all_degree_centralities(g, cent, measure_influence(g));
}
template < typename Graph, typename CentralityMap >
inline void all_prestige_values(const Graph& g, CentralityMap cent)
{
all_degree_centralities(g, cent, measure_prestige(g));
}
} /* namespace boost */
#endif
|