示例#1
0
VALUE cIGraph_community_spinglass(VALUE self, VALUE weights, VALUE spins, VALUE parupdate, VALUE starttemp, VALUE stoptemp, VALUE coolfact, VALUE update_rule, VALUE gamma){

  igraph_t *graph;

  igraph_vector_t weights_vec;
  igraph_vector_t membership;
  igraph_real_t temperature;
  igraph_real_t modularity;
  igraph_bool_t parupdate_b;

  VALUE group;
  VALUE groups;
  VALUE res;

  VALUE str;

  int i,groupid,max_groupid;

  if(parupdate)
    parupdate_b = 1;

  Data_Get_Struct(self, igraph_t, graph);

  igraph_vector_init(&membership,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(graph,
			     igraph_vector_size(&weights_vec) > 0 ? &weights_vec : NULL,
			     &modularity,&temperature,
			     &membership,NULL,NUM2INT(spins),parupdate_b,
			     NUM2DBL(starttemp),NUM2DBL(stoptemp),
			     NUM2DBL(coolfact),NUM2INT(update_rule),
			     NUM2DBL(gamma));
  
  max_groupid = 0;
  for(i=0;i<igraph_vector_size(&membership);i++){
    if(VECTOR(membership)[i] > max_groupid)
      max_groupid = VECTOR(membership)[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);i++){

    groupid = VECTOR(membership)[i];

    if(groupid == -1)
      groupid = 0;

    group = RARRAY_PTR(groups)[groupid];
    rb_ary_push(group,cIGraph_get_vertex_object(self, i));
  }

  res = rb_ary_new3(3,groups,
		    rb_float_new(modularity),
		    rb_float_new(temperature));

  igraph_vector_destroy(&membership);
  igraph_vector_destroy(&weights_vec);

  return res;

}
示例#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;
}