Ejemplo n.º 1
0
VALUE cIGraph_community_spinglass_single(VALUE self, VALUE weights, VALUE vertex, VALUE spins, VALUE update_rule, VALUE gamma){

  igraph_t *graph;

  igraph_vector_t weights_vec;
  igraph_vector_t community;
  igraph_real_t cohesion;
  igraph_real_t adhesion;

  VALUE group;
  VALUE res;

  int i;

  Data_Get_Struct(self, igraph_t, graph);

  igraph_vector_init(&community,0);

  igraph_vector_init(&weights_vec,RARRAY_LEN(weights));
  for(i=0;i<RARRAY_LEN(weights);i++){
    VECTOR(weights_vec)[i] = NUM2DBL(RARRAY_PTR(weights)[i]);
  }

  igraph_community_spinglass_single(graph,
				    igraph_vector_size(&weights_vec) > 0 ? &weights_vec : NULL,
				    cIGraph_get_vertex_id(self, vertex),   
				    &community, &cohesion, &adhesion,
				    NULL, NULL,
				    NUM2INT(spins),NUM2INT(update_rule),
				    NUM2DBL(gamma));
  
  group = rb_ary_new();

  for(i=0;i<igraph_vector_size(&community);i++){
    rb_ary_push(group,cIGraph_get_vertex_object(self, i));
  }

  res = rb_ary_new3(3,group,
		    rb_float_new(cohesion),
		    rb_float_new(adhesion));

  igraph_vector_destroy(&community);
  igraph_vector_destroy(&weights_vec);

  return res;

}
Ejemplo n.º 2
0
int main() {
  igraph_t g;
  igraph_real_t  modularity, temperature;
  igraph_vector_t membership, csize;
  long int i;
  igraph_real_t cohesion, adhesion;
  igraph_integer_t inner_links;
  igraph_integer_t outer_links;
  
  igraph_small(&g, 5, IGRAPH_UNDIRECTED, 
	       0,1,0,2,0,3,0,4, 1,2,1,3,1,4, 2,3,2,4, 3,4,
	       5,6,5,7,5,8,5,9, 6,7,6,8,6,9, 7,8,7,9, 8,9, 0,5, -1);
  igraph_vector_init(&membership, 0);
  igraph_vector_init(&csize, 0);
  igraph_community_spinglass(&g, 
			     0, /* no weights */
			     &modularity,
			     &temperature,
			     &membership,
			     &csize,
			     2,	   /* no of spins */
			     0,    /* parallel update */
			     1.0,  /* start temperature */
			     0.01, /* stop temperature */
			     0.99, /* cooling factor */
			     IGRAPH_SPINCOMM_UPDATE_CONFIG,
			     1.0, /* gamma */
			     IGRAPH_SPINCOMM_IMP_ORIG,
			     /*gamma-=*/ 0);

/*   printf("Modularity:  %f\n", modularity); */
/*   printf("Temperature: %f\n", temperature); */
/*   printf("Cluster sizes: "); */
/*   for (i=0; i<igraph_vector_size(&csize); i++) { */
/*     printf("%li ", (long int)VECTOR(csize)[i]); */
/*   } */
/*   printf("\n"); */
/*   printf("Membership: "); */
/*   for (i=0; i<igraph_vector_size(&membership); i++) { */
/*     printf("%li ", (long int)VECTOR(membership)[i]); */
/*   } */
/*   printf("\n"); */

  if (igraph_vector_size(&csize) != 2) {
    igraph_vector_destroy(&membership);
    igraph_vector_destroy(&csize);  
    return 77;
  }
  if (VECTOR(csize)[0] != 5) {
    igraph_vector_destroy(&membership);
    igraph_vector_destroy(&csize);  
    return 77;
  }

  /* Try to call this as well, we don't check the results currently.... */
  
  igraph_community_spinglass_single(&g, 
				    /*weights=  */ 0,
				    /*vertex=   */ 0,
				    /*community=*/ &membership,
				    /*cohesion= */ &cohesion,
				    /*adhesion= */ &adhesion,
				    /*inner_links= */ &inner_links,
				    /*outer_links= */ &outer_links,
				    /*spins=       */ 2,
				    /*update_rule= */ IGRAPH_SPINCOMM_UPDATE_CONFIG,
				    /*gamma=       */ 1.0);
  
  igraph_destroy(&g);
  igraph_vector_destroy(&membership);
  igraph_vector_destroy(&csize);  
  
  return 0;
}