17 const auto node_count = boost::num_vertices(g);
18 std::vector<double> centrality_by_index(
static_cast<std::size_t
>(node_count), 0.0);
19 if (node_count == 0) {
22 for (
auto [v, vend] = boost::vertices(g); v != vend; ++v) {
23 centrality_by_index[get_vertex_index(*v)] = 0.0;
25 if (node_count <= 1) {
26 return build_node_indexed_result<double>([&](VertexDesc v) {
27 return centrality_by_index[get_vertex_index(v)];
30 const double scale = 1.0 /
static_cast<double>(node_count - 1);
31 for (
auto [v, vend] = boost::vertices(g); v != vend; ++v) {
33 if constexpr (Directed) {
34 degree =
static_cast<double>(boost::in_degree(*v, g) + boost::out_degree(*v, g));
36 degree =
static_cast<double>(boost::degree(*v, g));
38 centrality_by_index[get_vertex_index(*v)] = degree * scale;
40 return build_node_indexed_result<double>([&](VertexDesc v) {
41 return centrality_by_index[get_vertex_index(v)];
47 const auto node_count = boost::num_vertices(g);
48 if (node_count == 0) {
52 const double n =
static_cast<double>(node_count);
53 const double damping = 0.85;
54 std::vector<double> rank(
static_cast<std::size_t
>(node_count), 1.0 / n);
55 std::vector<double> next(
static_cast<std::size_t
>(node_count), 0.0);
57 for (
int iteration = 0; iteration < 20; ++iteration) {
58 const double base = (1.0 - damping) / n;
59 std::fill(next.begin(), next.end(), base);
61 double dangling_sum = 0.0;
62 for (
auto [u, uend] = boost::vertices(g); u != uend; ++u) {
63 const auto out = boost::out_degree(*u, g);
64 const auto index = get_vertex_index(*u);
66 dangling_sum += rank[index];
70 const double share = damping * rank[index] /
static_cast<double>(out);
71 for (
auto [adj, adj_end] = boost::adjacent_vertices(*u, g); adj != adj_end; ++adj) {
72 next[get_vertex_index(*adj)] += share;
76 if (dangling_sum > 0.0) {
77 const double dangling_share = damping * dangling_sum / n;
78 for (
double& value : next) {
79 value += dangling_share;
86 return build_node_indexed_result<double>([&](VertexDesc v) {
87 return rank[get_vertex_index(v)];
119 const auto node_count = boost::num_vertices(g);
120 if (node_count == 0) {
124 const std::size_t n =
static_cast<std::size_t
>(node_count);
125 std::vector<double> bc(n, 0.0);
129 for (
auto [s_it, s_end] = boost::vertices(g); s_it != s_end; ++s_it) {
130 const VertexDesc s = *s_it;
131 const std::size_t s_idx = get_vertex_index(s);
134 std::vector<std::size_t> stack;
138 std::vector<std::vector<std::size_t>> pred(n);
141 std::vector<double> sigma(n, 0.0);
145 std::vector<int> dist(n, -1);
148 std::queue<VertexDesc> bfs_queue;
151 while (!bfs_queue.empty()) {
152 const VertexDesc v = bfs_queue.front();
154 const std::size_t v_idx = get_vertex_index(v);
155 stack.push_back(v_idx);
157 for (
auto [w_it, w_end] = boost::adjacent_vertices(v, g); w_it != w_end; ++w_it) {
158 const std::size_t w_idx = get_vertex_index(*w_it);
160 if (dist[w_idx] < 0) {
161 bfs_queue.push(*w_it);
162 dist[w_idx] = dist[v_idx] + 1;
164 if (dist[w_idx] == dist[v_idx] + 1) {
165 sigma[w_idx] += sigma[v_idx];
166 pred[w_idx].push_back(v_idx);
172 std::vector<double> delta(n, 0.0);
173 while (!stack.empty()) {
174 const std::size_t w_idx = stack.back();
176 for (
const std::size_t v_idx : pred[w_idx]) {
177 if (sigma[w_idx] > 0.0) {
178 delta[v_idx] += (sigma[v_idx] / sigma[w_idx]) * (1.0 + delta[w_idx]);
181 if (w_idx != s_idx) {
182 bc[w_idx] += delta[w_idx];
189 if (node_count > 2) {
190 const double denom =
static_cast<double>(node_count - 1) *
static_cast<double>(node_count - 2);
191 const double scale = Directed ? 1.0 / denom : 2.0 / denom;
192 for (
double& v : bc) v *= scale;
195 return build_node_indexed_result<double>([&](VertexDesc v) {
196 return bc[get_vertex_index(v)];
auto degree_centrality(const GraphWrapper &G)
Deprecated free-function alias for G.degree_centrality().
Definition centrality.hpp:113
auto betweenness_centrality(const GraphWrapper &G)
Deprecated free-function alias for G.betweenness_centrality().
Definition centrality.hpp:209
auto pagerank(const GraphWrapper &G)
Deprecated free-function alias for G.pagerank().
Definition centrality.hpp:100