int main() { igraph_t g; igraph_matrix_t merges; igraph_vector_t membership; long int i, j; igraph_bool_t split; igraph_vector_t x; igraph_real_t val; igraph_arpack_options_t options; /* Zachary Karate club */ igraph_small(&g, 0, IGRAPH_UNDIRECTED, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 10, 0, 11, 0, 12, 0, 13, 0, 17, 0, 19, 0, 21, 0, 31, 1, 2, 1, 3, 1, 7, 1, 13, 1, 17, 1, 19, 1, 21, 1, 30, 2, 3, 2, 7, 2, 8, 2, 9, 2, 13, 2, 27, 2, 28, 2, 32, 3, 7, 3, 12, 3, 13, 4, 6, 4, 10, 5, 6, 5, 10, 5, 16, 6, 16, 8, 30, 8, 32, 8, 33, 9, 33, 13, 33, 14, 32, 14, 33, 15, 32, 15, 33, 18, 32, 18, 33, 19, 33, 20, 32, 20, 33, 22, 32, 22, 33, 23, 25, 23, 27, 23, 29, 23, 32, 23, 33, 24, 25, 24, 27, 24, 31, 25, 31, 26, 29, 26, 33, 27, 33, 28, 31, 28, 33, 29, 32, 29, 33, 30, 32, 30, 33, 31, 32, 31, 33, 32, 33, -1); /* Make one step with all methods */ igraph_matrix_init(&merges, 0, 0); igraph_vector_init(&membership, 0); igraph_vector_init(&x, 0); igraph_arpack_options_init(&options); igraph_community_leading_eigenvector_naive(&g, &merges, &membership, 1, &options); print_matrix(&merges); print_vector(&membership); igraph_community_leading_eigenvector(&g, &merges, &membership, 1, &options); print_matrix(&merges); print_vector(&membership); igraph_vector_null(&membership); igraph_community_leading_eigenvector_step(&g, &membership, 0, &split, &x, &val, &options, 0); print_vector(&membership); print_vector(&x); printf("\n"); /* Make all the steps */ igraph_community_leading_eigenvector(&g, &merges, &membership, igraph_vcount(&g), &options); print_matrix(&merges); print_vector(&membership); /* Try to make one more step from here, should fail */ for (i=0; i<igraph_matrix_nrow(&merges)+1; i++) { igraph_community_leading_eigenvector_step(&g, &membership, i, &split, &x, &val, &options, 0); if (split) { printf("Impossible, community %li splitted.\n", i); return 1; } } igraph_vector_destroy(&x); igraph_vector_destroy(&membership); igraph_matrix_destroy(&merges); igraph_destroy(&g); return 0; }
VALUE cIGraph_community_leading_eigenvector_step(VALUE self, VALUE membership, VALUE community){ igraph_t *graph; igraph_vector_t membership_vec; igraph_vector_t eigenvector; igraph_real_t eigenvalue; igraph_bool_t split; int i,j,groupid,max_groupid,vid; igraph_arpack_options_t arpack_opt; igraph_arpack_options_init(&arpack_opt); VALUE groups, group, res, eigenvector_a, obj; Data_Get_Struct(self, igraph_t, graph); igraph_vector_init(&membership_vec,igraph_vcount(graph)); igraph_vector_init(&eigenvector,0); for(i=0;i<RARRAY_LEN(membership);i++){ group = RARRAY_PTR(membership)[i]; for(j=0;j<RARRAY_LEN(group);j++){ obj = RARRAY_PTR(group)[j]; vid = cIGraph_get_vertex_id(self,obj); VECTOR(membership_vec)[vid] = i; } } igraph_community_leading_eigenvector_step(graph,&membership_vec, NUM2INT(community), &split,&eigenvector,&eigenvalue,&arpack_opt,NULL); max_groupid = 0; for(i=0;i<igraph_vector_size(&membership_vec);i++){ if(VECTOR(membership_vec)[i] > max_groupid) max_groupid = VECTOR(membership_vec)[i]; } groups = rb_ary_new(); for(i=0;i<max_groupid+1;i++){ rb_ary_push(groups,rb_ary_new()); } for(i=0;i<igraph_vector_size(&membership_vec);i++){ groupid = VECTOR(membership_vec)[i]; if(groupid == -1) groupid = 0; group = RARRAY_PTR(groups)[groupid]; rb_ary_push(group,cIGraph_get_vertex_object(self, i)); } eigenvector_a = rb_ary_new(); for(i=0;i<igraph_vector_size(&eigenvector);i++){ rb_ary_push(eigenvector_a,rb_float_new(VECTOR(eigenvector)[i])); } res = rb_ary_new3(4,groups,split==0 ? Qfalse : Qtrue, eigenvector_a,rb_float_new(eigenvalue)); igraph_vector_destroy(&membership_vec); igraph_vector_destroy(&eigenvector); return res; }