std::vector<double> Graph::betweenness() const { igraph_vector_t results; igraph_vs_t allnods; std::vector<double> bet; igraph_vector_init(&results, size); igraph_vector_null(&results); igraph_vs_all(&allnods); igraph_betweenness(graph, &results, allnods, false); bet.insert(bet.begin(), VECTOR(results), VECTOR(results) + size); igraph_vector_destroy(&results); igraph_vs_destroy(&allnods); return bet; }
/* call-seq: * graph.betweenness(vs,mode) -> Array * * Returns an Array of betweenness centrality measures for the vertices given * in the vs Array. mode defines whether directed paths or considered for * directed graphs. */ VALUE cIGraph_betweenness(VALUE self, VALUE vs, VALUE directed){ igraph_t *graph; igraph_vs_t vids; igraph_vector_t vidv; igraph_bool_t dir = 0; igraph_vector_t res; int i; VALUE betweenness = rb_ary_new(); if(directed == Qtrue) dir = 1; //vector to hold the results of the degree calculations IGRAPH_FINALLY(igraph_vector_destroy, &res); IGRAPH_FINALLY(igraph_vector_destroy, &vidv); IGRAPH_FINALLY(igraph_vs_destroy,&vids); IGRAPH_CHECK(igraph_vector_init(&res,0)); Data_Get_Struct(self, igraph_t, graph); //Convert an array of vertices to a vector of vertex ids IGRAPH_CHECK(igraph_vector_init_int(&vidv,0)); cIGraph_vertex_arr_to_id_vec(self,vs,&vidv); //create vertex selector from the vecotr of ids IGRAPH_CHECK(igraph_vs_vector(&vids,&vidv)); IGRAPH_CHECK(igraph_betweenness(graph,&res,vids,dir)); for(i=0;i<igraph_vector_size(&res);i++){ rb_ary_push(betweenness,rb_float_new((float)VECTOR(res)[i])); } igraph_vector_destroy(&vidv); igraph_vector_destroy(&res); igraph_vs_destroy(&vids); IGRAPH_FINALLY_CLEAN(3); return betweenness; }
int main() { igraph_t g; igraph_vector_t bet, bet2, weights, edges; igraph_vector_t bbet, bbet2; igraph_real_t nontriv[] = { 0, 19, 0, 16, 0, 20, 1, 19, 2, 5, 3, 7, 3, 8, 4, 15, 4, 11, 5, 8, 5, 19, 6, 7, 6, 10, 6, 8, 6, 9, 7, 20, 9, 10, 9, 20, 10, 19, 11, 12, 11, 20, 12, 15, 13, 15, 14, 18, 14, 16, 14, 17, 15, 16, 17, 18 }; igraph_real_t nontriv_weights[] = { 0.5249, 1, 0.1934, 0.6274, 0.5249, 0.0029, 0.3831, 0.05, 0.6274, 0.3831, 0.5249, 0.0587, 0.0579, 0.0562, 0.0562, 0.1934, 0.6274, 0.6274, 0.6274, 0.0418, 0.6274, 0.3511, 0.3511, 0.1486, 1, 1, 0.0711, 0.2409 }; igraph_real_t nontriv_res[] = { 20, 0, 0, 0, 0, 19, 80, 85, 32, 0, 10, 75, 70, 0, 36, 81, 60, 0, 19, 19, 86 }; /*******************************************************/ igraph_barabasi_game(/* graph= */ &g, /* n= */ 1000, /* power= */ 1, /* m= */ 3, /* outseq= */ 0, /* outpref= */ 0, /* A= */ 1, /* directed= */ 0, /* algo= */ IGRAPH_BARABASI_BAG, /* start_from= */ 0); igraph_simplify(&g, /* multiple= */ 1, /* loops= */ 1, /*edge_comb=*/ 0); igraph_vector_init(&bet, 0); igraph_vector_init(&bbet, 0); igraph_betweenness_estimate(/* graph= */ &g, /* res= */ &bet, /* vids= */ igraph_vss_all(), /* directed = */ 0, /* cutoff= */ 2, /* weights= */ 0, /* nobigint= */ 1); igraph_betweenness_estimate(/* graph= */ &g, /* res= */ &bbet, /* vids= */ igraph_vss_all(), /* directed = */ 0, /* cutoff= */ 2, /* weights= */ 0, /* nobigint= */ 0); check(&bet, &bbet, 10); igraph_vector_destroy(&bet); igraph_vector_destroy(&bbet); igraph_destroy(&g); /*******************************************************/ igraph_tree(&g, 20000, 10, IGRAPH_TREE_UNDIRECTED); igraph_vector_init(&bet, 0); igraph_vector_init(&bbet, 0); igraph_betweenness_estimate(/* graph= */ &g, /* res= */ &bet, /* vids= */ igraph_vss_all(), /* directed = */ 0, /* cutoff= */ 3, /* weights= */ 0, /* nobigint= */ 1); igraph_betweenness_estimate(/* graph= */ &g, /* res= */ &bbet, /* vids= */ igraph_vss_all(), /* directed = */ 0, /* cutoff= */ 3, /* weights= */ 0, /* nobigint= */ 0); check(&bet, &bbet, 20); igraph_vector_init(&bet2, 0); igraph_vector_init(&bbet2, 0); igraph_vector_init(&weights, igraph_ecount(&g)); igraph_vector_fill(&weights, 1.0); igraph_betweenness_estimate(/* graph= */ &g, /* res= */ &bet2, /* vids= */ igraph_vss_all(), /* directed = */ 0, /* cutoff= */ 3, /* weights= */ &weights, /* nobigint= */ 1); igraph_betweenness_estimate(/* graph= */ &g, /* res= */ &bbet2, /* vids= */ igraph_vss_all(), /* directed = */ 0, /* cutoff= */ 3, /* weights= */ &weights, /* nobigint= */ 0); if (!igraph_vector_all_e(&bet, &bet2)) { return 1; } /* if (!igraph_vector_all_e(&bbet, &bbet2)) { */ /* return 2; */ /* } */ check(&bet, &bbet, 30); check(&bet2, &bbet2, 40); igraph_vector_destroy(&bet); igraph_vector_destroy(&bet2); igraph_vector_destroy(&bbet); igraph_vector_destroy(&bbet2); igraph_vector_destroy(&weights); igraph_destroy(&g); /* Non-trivial weighted graph */ igraph_vector_view(&edges, nontriv, sizeof(nontriv)/sizeof(igraph_real_t)); igraph_create(&g, &edges, 0, /* directed= */ 0); igraph_vector_view(&weights, nontriv_weights, sizeof(nontriv_weights)/sizeof(igraph_real_t)); igraph_vector_init(&bet, 0); igraph_vector_init(&bbet, 0); igraph_betweenness(/*graph=*/ &g, /*res=*/ &bet, /*vids=*/ igraph_vss_all(), /*directed=*/0, /*weights=*/ &weights, /*nobigint=*/ 1); igraph_betweenness(/*graph=*/ &g, /*res=*/ &bbet, /*vids=*/ igraph_vss_all(), /*directed=*/0, /*weights=*/ &weights, /*nobigint=*/ 0); igraph_vector_view(&bet2, nontriv_res, sizeof(nontriv_res)/sizeof(igraph_real_t)); if (!igraph_vector_all_e(&bet, &bet2)) { return 2; } check(&bet, &bbet, 50); igraph_vector_destroy(&bet); igraph_vector_destroy(&bbet); igraph_destroy(&g); if (IGRAPH_FINALLY_STACK_SIZE() != 0) return 3; return 0; }