| @@ -208,12 +208,53 @@ void Init_igraph(){ | |||
| rb_define_const(cIGraph, "GET_ADJACENCY_BOTH", INT2NUM(2)); | |||
| rb_define_const(cIGraph, "ERDOS_RENYI_GNP", INT2NUM(0)); | |||
| rb_define_const(cIGraph, "ERDOS_RENYI_GNM", INT2NUM(1)); | |||
| rb_define_const(cIGraph, "ERDOS_RENYI_GNM", INT2NUM(1)); | |||
| rb_define_const(cIGraph, "ADJ_DIRECTED", INT2NUM(0)); | |||
| rb_define_const(cIGraph, "ADJ_UNDIRECTED", INT2NUM(1)); | |||
| rb_define_const(cIGraph, "ADJ_MAX", INT2NUM(2)); | |||
| rb_define_const(cIGraph, "ADJ_MIN", INT2NUM(3)); | |||
| rb_define_const(cIGraph, "ADJ_PLUS", INT2NUM(4)); | |||
| rb_define_const(cIGraph, "ADJ_UPPER", INT2NUM(5)); | |||
| rb_define_const(cIGraph, "ADJ_LOWER", INT2NUM(6)); | |||
| rb_define_const(cIGraph, "STAR_OUT", INT2NUM(0)); | |||
| rb_define_const(cIGraph, "STAR_IN", INT2NUM(1)); | |||
| rb_define_const(cIGraph, "STAR_UNDIRECTED", INT2NUM(2)); | |||
| rb_define_const(cIGraph, "TREE_OUT", INT2NUM(0)); | |||
| rb_define_const(cIGraph, "TREE_IN", INT2NUM(1)); | |||
| rb_define_const(cIGraph, "TREE_UNDIRECTED", INT2NUM(2)); | |||
| rb_define_singleton_method(cIGraph, "adjacency", cIGraph_adjacency, 2); /* in cIGraph_generators_deterministic.c */ | |||
| rb_define_singleton_method(cIGraph, "star", cIGraph_star, 3); /* in cIGraph_generators_deterministic.c */ | |||
| rb_define_singleton_method(cIGraph, "lattice", cIGraph_lattice, 4); /* in cIGraph_generators_deterministic.c */ | |||
| rb_define_singleton_method(cIGraph, "ring", cIGraph_ring, 4); /* in cIGraph_generators_deterministic.c */ | |||
| rb_define_singleton_method(cIGraph, "tree", cIGraph_tree, 3); /* in cIGraph_generators_deterministic.c */ | |||
| rb_define_singleton_method(cIGraph, "full", cIGraph_full, 3); /* in cIGraph_generators_deterministic.c */ | |||
| rb_define_singleton_method(cIGraph, "atlas", cIGraph_atlas, 1); /* in cIGraph_generators_deterministic.c */ | |||
| rb_define_singleton_method(cIGraph, "extended_chordal_ring", cIGraph_extended_chordal_ring, 2); /* in cIGraph_generators_deterministic.c */ | |||
| rb_define_method(cIGraph, "connect_neighborhood", cIGraph_connect_neighborhood, 2); /* in cIGraph_generators_deterministic.c */ | |||
| rb_define_singleton_method(cIGraph, "grg_game", cIGraph_grg_game, 3); /* in cIGraph_generators_random.c */ | |||
| rb_define_singleton_method(cIGraph, "barabasi_game", cIGraph_barabasi_game, 4); /* in cIGraph_generators_random.c */ | |||
| rb_define_singleton_method(cIGraph, "nonlinear_barabasi_game", cIGraph_nonlinear_barabasi_game, 6); /* in cIGraph_generators_random.c */ | |||
| rb_define_singleton_method(cIGraph, "erdos_renyi_game", cIGraph_erdos_renyi_game, 5); /* in cIGraph_generators_random.c */ | |||
| rb_define_singleton_method(cIGraph, "erdos_renyi_game", cIGraph_erdos_renyi_game, 5); /* in cIGraph_generators_random.c */ | |||
| rb_define_singleton_method(cIGraph, "watts_strogatz_game", cIGraph_watts_strogatz_game, 4); /* in cIGraph_generators_random.c */ | |||
| rb_define_singleton_method(cIGraph, "degree_sequence_game", cIGraph_degree_sequence_game, 2); /* in cIGraph_generators_random.c */ | |||
| rb_define_singleton_method(cIGraph, "growing_random_game", cIGraph_growing_random_game, 4); /* in cIGraph_generators_random.c */ | |||
| rb_define_singleton_method(cIGraph, "callaway_traits_game", cIGraph_callaway_traits_game, 6); /* in cIGraph_generators_random.c */ | |||
| rb_define_singleton_method(cIGraph, "establishment_game", cIGraph_establishment_game, 6); /* in cIGraph_generators_random.c */ | |||
| rb_define_singleton_method(cIGraph, "preference_game", cIGraph_preference_game, 6); /* in cIGraph_generators_random.c */ | |||
| rb_define_singleton_method(cIGraph, "asymmetric_preference_game", cIGraph_asymmetric_preference_game, 5); /* in cIGraph_generators_random.c */ | |||
| rb_define_singleton_method(cIGraph, "recent_degree_game", cIGraph_recent_degree_game, 7); /* in cIGraph_generators_random.c */ | |||
| rb_define_singleton_method(cIGraph, "barabasi_aging_game", cIGraph_barabasi_aging_game, 11); /* in cIGraph_generators_random.c */ | |||
| rb_define_singleton_method(cIGraph, "recent_degree_aging_game", cIGraph_recent_degree_aging_game, 9); /* in cIGraph_generators_random.c */ | |||
| rb_define_singleton_method(cIGraph, "cited_type_game", cIGraph_cited_type_game, 5); /* in cIGraph_generators_random.c */ | |||
| rb_define_singleton_method(cIGraph, "citing_cited_type_game", cIGraph_citing_cited_type_game, 5); /* in cIGraph_generators_random.c */ | |||
| rb_define_method(cIGraph, "rewire_edges", cIGraph_rewire_edges, 1); /* cIGraph_randomisation.c */ | |||
| rb_define_method(cIGraph, "rewire", cIGraph_rewire, 1); /* cIGraph_randomisation.c */ | |||
| rb_define_method(cIGraph, "[]", cIGraph_get_edge_attr, 2); /* in cIGraph_attribute_handler.c */ | |||
| rb_define_method(cIGraph, "[]=", cIGraph_set_edge_attr, 3); /* in cIGraph_attribute_handler.c */ | |||
| @@ -345,6 +386,14 @@ rb_define_singleton_method(cIGraph, "erdos_renyi_game", cIGraph_erdos_renyi_game | |||
| rb_define_method(cIGraph, "layout_grid_fruchterman_reingold", cIGraph_layout_grid_fruchterman_reingold, 7); /* in cIGraph_layout.c */ | |||
| rb_define_method(cIGraph, "layout_lgl", cIGraph_layout_lgl, 7); /* in cIGraph_layout.c */ | |||
| rb_define_method(cIGraph, "layout_random_3d", cIGraph_layout_random_3d, 0); /* in cIGraph_layout3d.c */ | |||
| rb_define_method(cIGraph, "layout_sphere", cIGraph_layout_sphere, 0); /* in cIGraph_layout3d.c */ | |||
| rb_define_method(cIGraph, "layout_fruchterman_reingold_3d", cIGraph_layout_fruchterman_reingold_3d, 6); /* in cIGraph_layout3d.c */ | |||
| rb_define_method(cIGraph, "layout_kamada_kawai_3d", cIGraph_layout_kamada_kawai_3d, 5); /* in cIGraph_layout3d.c */ | |||
| rb_define_singleton_method(cIGraph, "layout_merge_dla", cIGraph_layout_merge_dla, 2); /* in cIGraph_layout.c */ | |||
| //Matrix class | |||
| cIGraphMatrix = rb_define_class("IGraphMatrix", rb_cObject); | |||
| @@ -30,6 +30,17 @@ VALUE cIGraph_alloc(VALUE klass); | |||
| VALUE cIGraph_initialize(int argc, VALUE *argv, VALUE self); | |||
| VALUE cIGraph_init_copy(VALUE copy, VALUE orig); | |||
| //Graph generators | |||
| VALUE cIGraph_adjacency(VALUE self, VALUE matrix, VALUE mode); | |||
| VALUE cIGraph_star (VALUE self, VALUE n, VALUE mode, VALUE center); | |||
| VALUE cIGraph_lattice (VALUE self, VALUE dim, VALUE directed, VALUE mutual, VALUE circular); | |||
| VALUE cIGraph_ring(VALUE self, VALUE n, VALUE directed, VALUE mutual, VALUE circular); | |||
| VALUE cIGraph_tree(VALUE self, VALUE n, VALUE children, VALUE type); | |||
| VALUE cIGraph_full(VALUE self, VALUE n, VALUE directed, VALUE loops); | |||
| VALUE cIGraph_atlas(VALUE self, VALUE n); | |||
| VALUE cIGraph_extended_chordal_ring(VALUE self, VALUE n, VALUE matrix); | |||
| VALUE cIGraph_connect_neighborhood(VALUE self, VALUE order, VALUE mode); | |||
| //Random graph generators | |||
| VALUE cIGraph_grg_game (VALUE self, VALUE nodes, | |||
| VALUE radius, VALUE torus); | |||
| @@ -38,6 +49,21 @@ VALUE cIGraph_barabasi_game(VALUE self, VALUE nodes, | |||
| VALUE cIGraph_nonlinear_barabasi_game(VALUE self, VALUE nodes, VALUE power, | |||
| VALUE m, VALUE outpref, VALUE zeroappeal, VALUE directed); | |||
| VALUE cIGraph_erdos_renyi_game (VALUE self, VALUE type, VALUE nodes, VALUE mp, VALUE directed, VALUE loops); | |||
| VALUE cIGraph_watts_strogatz_game(VALUE self, VALUE dim, VALUE size, VALUE nei, VALUE p); | |||
| VALUE cIGraph_degree_sequence_game(VALUE self, VALUE out_deg, VALUE in_deg); | |||
| VALUE cIGraph_growing_random_game(VALUE self, VALUE n, VALUE m, VALUE directed, VALUE citation); | |||
| VALUE cIGraph_callaway_traits_game(VALUE self, VALUE nodes, VALUE types, VALUE e_per_step, VALUE type_dist, VALUE pref_matrix, VALUE directed); | |||
| VALUE cIGraph_establishment_game(VALUE self, VALUE nodes, VALUE types, VALUE k, VALUE type_dist, VALUE pref_matrix, VALUE directed); | |||
| VALUE cIGraph_preference_game(VALUE self, VALUE nodes, VALUE types, VALUE type_dist, VALUE pref_matrix, VALUE directed, VALUE loops); | |||
| VALUE cIGraph_asymmetric_preference_game(VALUE self, VALUE nodes, VALUE types, VALUE type_dist_matrix, VALUE pref_matrix, VALUE loops); | |||
| VALUE cIGraph_recent_degree_game(VALUE self, VALUE n, VALUE power, VALUE window, VALUE m, VALUE outpref, VALUE zero_appeal, VALUE directed); | |||
| VALUE cIGraph_barabasi_aging_game(VALUE self, VALUE nodes, VALUE m, VALUE outpref, VALUE pa_exp, VALUE aging_exp, VALUE aging_bin, VALUE zero_deg_appeal, VALUE zero_age_appeal, VALUE deg_coef, VALUE age_coef, VALUE directed); | |||
| VALUE cIGraph_recent_degree_aging_game(VALUE self, VALUE nodes, VALUE m, VALUE outpref, VALUE pa_exp, VALUE aging_exp, VALUE aging_bin, VALUE time_window, VALUE zero_appeal, VALUE directed); | |||
| VALUE cIGraph_cited_type_game(VALUE self, VALUE nodes, VALUE types, VALUE pref, VALUE e_per_s, VALUE directed); | |||
| VALUE cIGraph_citing_cited_type_game(VALUE self, VALUE nodes, VALUE types, VALUE pref, VALUE e_per_s, VALUE directed); | |||
| VALUE cIGraph_rewire_edges(VALUE self, VALUE prop); | |||
| VALUE cIGraph_rewire(VALUE self, VALUE n, VALUE mode); | |||
| //Attribute accessors | |||
| int replace_i(VALUE key, VALUE val, VALUE hash); | |||
| @@ -216,6 +242,23 @@ VALUE cIGraph_layout_lgl(VALUE self, | |||
| VALUE cellsize, | |||
| VALUE proot); | |||
| VALUE cIGraph_layout_random_3d(VALUE self); | |||
| VALUE cIGraph_layout_sphere (VALUE self); | |||
| VALUE cIGraph_layout_fruchterman_reingold_3d(VALUE self, | |||
| VALUE niter, | |||
| VALUE maxdelta, | |||
| VALUE volume, | |||
| VALUE coolexp, | |||
| VALUE repulserad, | |||
| VALUE use_seed); | |||
| VALUE cIGraph_layout_kamada_kawai_3d (VALUE self, | |||
| VALUE niter, | |||
| VALUE sigma, | |||
| VALUE initemp, | |||
| VALUE coolexp, | |||
| VALUE kkconst); | |||
| VALUE cIGraph_layout_merge_dla(VALUE self, VALUE graphs, VALUE layouts); | |||
| //Attributes | |||
| int cIGraph_attribute_init(igraph_t *graph, | |||
| @@ -70,3 +70,327 @@ VALUE cIGraph_erdos_renyi_game(VALUE self, VALUE type, VALUE nodes, VALUE mp, VA | |||
| return new_graph; | |||
| } | |||
| VALUE cIGraph_watts_strogatz_game(VALUE self, VALUE dim, VALUE size, VALUE nei, VALUE p){ | |||
| igraph_t *graph; | |||
| VALUE new_graph; | |||
| new_graph = cIGraph_alloc(cIGraph); | |||
| Data_Get_Struct(new_graph, igraph_t, graph); | |||
| igraph_destroy(graph); | |||
| igraph_watts_strogatz_game(graph, NUM2INT(dim), NUM2INT(size), | |||
| NUM2INT(nei), NUM2DBL(p)); | |||
| return new_graph; | |||
| } | |||
| VALUE cIGraph_degree_sequence_game(VALUE self, VALUE out_deg, VALUE in_deg){ | |||
| igraph_t *graph; | |||
| VALUE new_graph; | |||
| igraph_vector_t out_degv; | |||
| igraph_vector_t in_degv; | |||
| int i; | |||
| new_graph = cIGraph_alloc(cIGraph); | |||
| Data_Get_Struct(new_graph, igraph_t, graph); | |||
| igraph_vector_init(&out_degv,0); | |||
| igraph_vector_init(&in_degv,0); | |||
| for(i=0;i<RARRAY(out_deg)->len;i++){ | |||
| igraph_vector_push_back(&out_degv,NUM2INT(RARRAY(out_deg)->ptr[i])); | |||
| } | |||
| for(i=0;i<RARRAY(in_deg)->len;i++){ | |||
| igraph_vector_push_back(&in_degv,NUM2INT(RARRAY(in_deg)->ptr[i])); | |||
| } | |||
| igraph_destroy(graph); | |||
| igraph_degree_sequence_game(graph, &out_degv, &in_degv, 0); | |||
| igraph_vector_destroy(&out_degv); | |||
| igraph_vector_destroy(&in_degv); | |||
| return new_graph; | |||
| } | |||
| VALUE cIGraph_growing_random_game(VALUE self, VALUE n, VALUE m, VALUE directed, VALUE citation){ | |||
| igraph_t *graph; | |||
| VALUE new_graph; | |||
| new_graph = cIGraph_alloc(cIGraph); | |||
| Data_Get_Struct(new_graph, igraph_t, graph); | |||
| igraph_destroy(graph); | |||
| igraph_growing_random_game(graph, NUM2INT(n), NUM2INT(m), | |||
| directed == Qtrue ? 1: 0, | |||
| citation == Qtrue ? 1: 0); | |||
| return new_graph; | |||
| } | |||
| VALUE cIGraph_callaway_traits_game(VALUE self, VALUE nodes, VALUE types, VALUE e_per_step, VALUE type_dist, VALUE pref_matrix, VALUE directed){ | |||
| igraph_t *graph; | |||
| VALUE new_graph; | |||
| igraph_vector_t type_distv; | |||
| igraph_matrix_t *pref_matrixm; | |||
| int i; | |||
| new_graph = cIGraph_alloc(cIGraph); | |||
| Data_Get_Struct(new_graph, igraph_t, graph); | |||
| Data_Get_Struct(pref_matrix, igraph_matrix_t, pref_matrixm); | |||
| igraph_vector_init(&type_distv,0); | |||
| for(i=0;i<RARRAY(type_dist)->len;i++){ | |||
| igraph_vector_push_back(&type_distv,NUM2DBL(RARRAY(type_dist)->ptr[i])); | |||
| } | |||
| igraph_destroy(graph); | |||
| igraph_callaway_traits_game(graph, NUM2INT(nodes), NUM2INT(types), | |||
| NUM2INT(e_per_step), &type_distv, | |||
| pref_matrixm, | |||
| directed == Qtrue ? 1: 0); | |||
| igraph_vector_destroy(&type_distv); | |||
| return new_graph; | |||
| } | |||
| VALUE cIGraph_establishment_game(VALUE self, VALUE nodes, VALUE types, VALUE k, VALUE type_dist, VALUE pref_matrix, VALUE directed){ | |||
| igraph_t *graph; | |||
| VALUE new_graph; | |||
| igraph_vector_t type_distv; | |||
| igraph_matrix_t *pref_matrixm; | |||
| int i; | |||
| new_graph = cIGraph_alloc(cIGraph); | |||
| Data_Get_Struct(new_graph, igraph_t, graph); | |||
| Data_Get_Struct(pref_matrix, igraph_matrix_t, pref_matrixm); | |||
| igraph_vector_init(&type_distv,0); | |||
| for(i=0;i<RARRAY(type_dist)->len;i++){ | |||
| igraph_vector_push_back(&type_distv,NUM2DBL(RARRAY(type_dist)->ptr[i])); | |||
| } | |||
| igraph_destroy(graph); | |||
| igraph_establishment_game(graph, NUM2INT(nodes), NUM2INT(types), | |||
| NUM2INT(k), &type_distv, | |||
| pref_matrixm, | |||
| directed == Qtrue ? 1: 0); | |||
| igraph_vector_destroy(&type_distv); | |||
| return new_graph; | |||
| } | |||
| VALUE cIGraph_preference_game(VALUE self, VALUE nodes, VALUE types, VALUE type_dist, VALUE pref_matrix, VALUE directed, VALUE loops){ | |||
| igraph_t *graph; | |||
| VALUE new_graph; | |||
| igraph_vector_t type_distv; | |||
| igraph_matrix_t *pref_matrixm; | |||
| int i; | |||
| new_graph = cIGraph_alloc(cIGraph); | |||
| Data_Get_Struct(new_graph, igraph_t, graph); | |||
| Data_Get_Struct(pref_matrix, igraph_matrix_t, pref_matrixm); | |||
| igraph_vector_init(&type_distv,0); | |||
| for(i=0;i<RARRAY(type_dist)->len;i++){ | |||
| igraph_vector_push_back(&type_distv,NUM2DBL(RARRAY(type_dist)->ptr[i])); | |||
| } | |||
| igraph_destroy(graph); | |||
| igraph_preference_game(graph, NUM2INT(nodes), NUM2INT(types), | |||
| &type_distv, | |||
| pref_matrixm, | |||
| NULL, | |||
| directed == Qtrue ? 1: 0, | |||
| loops == Qtrue ? 1 : 0); | |||
| igraph_vector_destroy(&type_distv); | |||
| return new_graph; | |||
| } | |||
| VALUE cIGraph_asymmetric_preference_game(VALUE self, VALUE nodes, VALUE types, VALUE type_dist_matrix, VALUE pref_matrix, VALUE loops){ | |||
| igraph_t *graph; | |||
| VALUE new_graph; | |||
| igraph_matrix_t *type_dist_matrixm; | |||
| igraph_matrix_t *pref_matrixm; | |||
| new_graph = cIGraph_alloc(cIGraph); | |||
| Data_Get_Struct(new_graph, igraph_t, graph); | |||
| Data_Get_Struct(pref_matrix, igraph_matrix_t, pref_matrixm); | |||
| Data_Get_Struct(type_dist_matrix, igraph_matrix_t, type_dist_matrixm); | |||
| igraph_destroy(graph); | |||
| igraph_asymmetric_preference_game(graph, NUM2INT(nodes), NUM2INT(types), | |||
| type_dist_matrixm, | |||
| pref_matrixm, | |||
| NULL, NULL, | |||
| loops == Qtrue ? 1 : 0); | |||
| return new_graph; | |||
| } | |||
| VALUE cIGraph_recent_degree_game(VALUE self, VALUE n, VALUE power, VALUE window, VALUE m, VALUE outpref, VALUE zero_appeal, VALUE directed){ | |||
| igraph_t *graph; | |||
| VALUE new_graph; | |||
| new_graph = cIGraph_alloc(cIGraph); | |||
| Data_Get_Struct(new_graph, igraph_t, graph); | |||
| igraph_destroy(graph); | |||
| igraph_recent_degree_game(graph, NUM2INT(n), NUM2DBL(power), | |||
| NUM2INT(window), NUM2INT(m), | |||
| NULL, | |||
| outpref == Qtrue ? 1: 0, | |||
| NUM2DBL(zero_appeal), | |||
| directed == Qtrue ? 1: 0); | |||
| return new_graph; | |||
| } | |||
| VALUE cIGraph_barabasi_aging_game(VALUE self, VALUE nodes, VALUE m, VALUE outpref, VALUE pa_exp, VALUE aging_exp, VALUE aging_bin, VALUE zero_deg_appeal, VALUE zero_age_appeal, VALUE deg_coef, VALUE age_coef, VALUE directed){ | |||
| igraph_t *graph; | |||
| VALUE new_graph; | |||
| new_graph = cIGraph_alloc(cIGraph); | |||
| Data_Get_Struct(new_graph, igraph_t, graph); | |||
| igraph_destroy(graph); | |||
| igraph_barabasi_aging_game(graph, NUM2INT(nodes), NUM2INT(m), | |||
| NULL, | |||
| outpref == Qtrue ? 1: 0, | |||
| NUM2DBL(pa_exp), NUM2DBL(aging_exp), | |||
| NUM2INT(aging_bin), | |||
| NUM2DBL(zero_deg_appeal), | |||
| NUM2DBL(zero_age_appeal), | |||
| NUM2DBL(deg_coef), | |||
| NUM2DBL(age_coef), | |||
| directed == Qtrue ? 1: 0); | |||
| return new_graph; | |||
| } | |||
| VALUE cIGraph_recent_degree_aging_game(VALUE self, VALUE nodes, VALUE m, VALUE outpref, VALUE pa_exp, VALUE aging_exp, VALUE aging_bin, VALUE time_window, VALUE zero_appeal, VALUE directed){ | |||
| igraph_t *graph; | |||
| VALUE new_graph; | |||
| new_graph = cIGraph_alloc(cIGraph); | |||
| Data_Get_Struct(new_graph, igraph_t, graph); | |||
| igraph_destroy(graph); | |||
| igraph_recent_degree_aging_game(graph, NUM2INT(nodes), NUM2INT(m), | |||
| NULL, | |||
| outpref == Qtrue ? 1: 0, | |||
| NUM2DBL(pa_exp), NUM2DBL(aging_exp), | |||
| NUM2INT(aging_bin), | |||
| NUM2INT(time_window), | |||
| NUM2DBL(zero_appeal), | |||
| directed == Qtrue ? 1: 0); | |||
| return new_graph; | |||
| } | |||
| VALUE cIGraph_cited_type_game(VALUE self, VALUE nodes, VALUE types, VALUE pref, VALUE e_per_s, VALUE directed){ | |||
| igraph_t *graph; | |||
| VALUE new_graph; | |||
| igraph_vector_t type_distv; | |||
| igraph_vector_t prefv; | |||
| int i; | |||
| new_graph = cIGraph_alloc(cIGraph); | |||
| Data_Get_Struct(new_graph, igraph_t, graph); | |||
| igraph_vector_init(&type_distv,0); | |||
| igraph_vector_init(&prefv,0); | |||
| for(i=0;i<RARRAY(types)->len;i++){ | |||
| igraph_vector_push_back(&type_distv,NUM2DBL(RARRAY(types)->ptr[i])); | |||
| } | |||
| for(i=0;i<RARRAY(pref)->len;i++){ | |||
| igraph_vector_push_back(&prefv,NUM2DBL(RARRAY(pref)->ptr[i])); | |||
| } | |||
| igraph_destroy(graph); | |||
| igraph_cited_type_game(graph, NUM2INT(nodes), | |||
| &type_distv, | |||
| &prefv, | |||
| NUM2INT(e_per_s), | |||
| directed == Qtrue ? 1: 0); | |||
| igraph_vector_destroy(&type_distv); | |||
| igraph_vector_destroy(&prefv); | |||
| return new_graph; | |||
| } | |||
| VALUE cIGraph_citing_cited_type_game(VALUE self, VALUE nodes, VALUE types, VALUE pref, VALUE e_per_s, VALUE directed){ | |||
| igraph_t *graph; | |||
| VALUE new_graph; | |||
| igraph_vector_t typev; | |||
| igraph_matrix_t *prefm; | |||
| int i; | |||
| new_graph = cIGraph_alloc(cIGraph); | |||
| Data_Get_Struct(new_graph, igraph_t, graph); | |||
| Data_Get_Struct(pref, igraph_matrix_t, prefm); | |||
| igraph_vector_init(&typev,0); | |||
| for(i=0;i<RARRAY(types)->len;i++){ | |||
| igraph_vector_push_back(&typev,NUM2INT(RARRAY(types)->ptr[i])); | |||
| } | |||
| printf("ok\n"); | |||
| igraph_destroy(graph); | |||
| igraph_citing_cited_type_game(graph, NUM2INT(nodes), | |||
| &typev, | |||
| prefm, | |||
| NUM2INT(e_per_s), | |||
| directed == Qtrue ? 1: 0); | |||
| printf("death\n"); | |||
| igraph_vector_destroy(&typev); | |||
| return new_graph; | |||
| } | |||
| @@ -247,3 +247,33 @@ VALUE cIGraph_layout_lgl(VALUE self, | |||
| } | |||
| VALUE cIGraph_layout_merge_dla(VALUE self, VALUE graphs, VALUE layouts){ | |||
| igraph_vector_ptr_t thegraphs; | |||
| igraph_vector_ptr_t coords; | |||
| int i; | |||
| igraph_t *graph; | |||
| igraph_matrix_t *coord; | |||
| igraph_matrix_t *res = malloc(sizeof(igraph_matrix_t)); | |||
| igraph_vector_ptr_init(&thegraphs,0); | |||
| igraph_vector_ptr_init(&coords,0); | |||
| igraph_matrix_init(res,0,0); | |||
| for(i=0;i<RARRAY(graphs)->len;i++){ | |||
| Data_Get_Struct(RARRAY(graphs)->ptr[i], igraph_t, graph); | |||
| igraph_vector_ptr_push_back(&thegraphs,graph); | |||
| } | |||
| for(i=0;i<RARRAY(layouts)->len;i++){ | |||
| Data_Get_Struct(RARRAY(layouts)->ptr[i], igraph_matrix_t, coord); | |||
| igraph_vector_ptr_push_back(&coords,coord); | |||
| } | |||
| igraph_layout_merge_dla(&thegraphs, &coords, res); | |||
| igraph_vector_ptr_destroy(&thegraphs); | |||
| igraph_vector_ptr_destroy(&coords); | |||
| return Data_Wrap_Struct(cIGraphMatrix, 0, cIGraph_matrix_free, res); | |||
| } | |||
| @@ -56,6 +56,27 @@ class TestGraph < Test::Unit::TestCase | |||
| assert_equal 1, graph.ecount | |||
| end | |||
| def test_delete_large | |||
| vs = (0..99).to_a | |||
| h = IGraph.new([],true) | |||
| vs.each do |id| | |||
| h.add_vertex(id) | |||
| end | |||
| g = h.dup | |||
| delete_ids = (0..99).to_a.sort_by{rand}[0..19] | |||
| assert_nothing_raised do | |||
| delete_ids.each do |id| | |||
| g.delete_vertex(id) | |||
| end | |||
| end | |||
| delete_ids.each do |id| | |||
| assert_equal false, g.include?(id) | |||
| end | |||
| assert_equal 80, g.vcount | |||
| end | |||
| def test_delete_edge | |||
| graph = IGraph.new(['A','B','C','D'],true) | |||
| assert_equal true, graph.are_connected?('A','B') | |||
| @@ -16,11 +16,85 @@ class TestGraph < Test::Unit::TestCase | |||
| end | |||
| def test_erdos_renyi | |||
| g = IGraph.erdos_renyi_game(IGraph::ERDOS_RENYI_GNP,10,0.5,false,false) | |||
| assert_equal 10, g.vertices.size | |||
| assert_instance_of IGraph, g | |||
| g = IGraph.erdos_renyi_game(IGraph::ERDOS_RENYI_GNM,10,0.5,false,false) | |||
| assert_equal 10, g.vertices.size | |||
| assert_instance_of IGraph, g | |||
| end | |||
| def test_watts_strogatz | |||
| g = IGraph.watts_strogatz_game(10,1,2,0.6) | |||
| assert_instance_of IGraph, g | |||
| end | |||
| def test_degree_sequence_game | |||
| g = IGraph.degree_sequence_game([1,2,3],[1,2,3]) | |||
| assert_instance_of IGraph, g | |||
| end | |||
| def test_growing_random_game | |||
| assert_instance_of IGraph, IGraph.growing_random_game(10,2,true,true) | |||
| end | |||
| def test_callaway_traits_game | |||
| assert_instance_of IGraph, | |||
| IGraph.callaway_traits_game(30,4,2,[0.25,0.25,0.25,0.25], | |||
| IGraphMatrix.new([0,0.5,0.25,0.25], | |||
| [0.5,0,0.25,0.25], | |||
| [0.5,0.25,0,0.25], | |||
| [0.5,0.25,0.25,0]),true) | |||
| end | |||
| def test_establishment_game | |||
| assert_instance_of IGraph, | |||
| IGraph.establishment_game(30,4,2,[0.25,0.25,0.25,0.25], | |||
| IGraphMatrix.new([0,0.5,0.25,0.25], | |||
| [0.5,0,0.25,0.25], | |||
| [0.5,0.25,0,0.25], | |||
| [0.5,0.25,0.25,0]),true) | |||
| end | |||
| def test_preference_game | |||
| assert_instance_of IGraph, | |||
| IGraph.preference_game(30,4,[0.25,0.25,0.25,0.25], | |||
| IGraphMatrix.new([0,0.5,0.25,0.25], | |||
| [0.5,0,0.25,0.25], | |||
| [0.5,0.25,0,0.25], | |||
| [0.5,0.25,0.25,0]),true,false) | |||
| end | |||
| def test_asymmetric_preference_game | |||
| assert_instance_of IGraph, | |||
| IGraph.asymmetric_preference_game(30,4, | |||
| IGraphMatrix.new([0,0.5,0.25,0.25], | |||
| [0.5,0,0.25,0.25], | |||
| [0.5,0.25,0,0.25], | |||
| [0.5,0.25,0.25,0]), | |||
| IGraphMatrix.new([0,0.5,0.25,0.25], | |||
| [0.5,0,0.25,0.25], | |||
| [0.5,0.25,0,0.25], | |||
| [0.5,0.25,0.25,0]), | |||
| false) | |||
| end | |||
| def test_recent_degree_game | |||
| assert_instance_of IGraph, | |||
| IGraph.recent_degree_game(30,2,4,5,false,0.1,true) | |||
| end | |||
| def test_barabasi_aging_game | |||
| assert_instance_of IGraph, | |||
| IGraph.barabasi_aging_game(30,2,true,0.9,-0.5,3,0.1,0.1,2,2,true) | |||
| end | |||
| def test_recent_degree_aging_game | |||
| assert_instance_of IGraph, | |||
| IGraph.recent_degree_aging_game(30,2,true,0.9,-0.5,3,4,0.1,true) | |||
| end | |||
| def test_cited_type_game | |||
| assert_instance_of IGraph, | |||
| IGraph.cited_type_game(10,(0..9).to_a, | |||
| Array.new(5,0.5)+Array.new(5,0.2), | |||
| 2,true) | |||
| end | |||
| def test_citing_cited_type_Game | |||
| # assert_instance_of IGraph, | |||
| # IGraph.citing_cited_type_game(4,(0..3).to_a, | |||
| # IGraphMatrix.new([0,0.5,0.25,0.25], | |||
| # [0.5,0,0.25,0.25], | |||
| # [0.5,0.25,0,0.25], | |||
| # [0.5,0.25,0.25,0]), | |||
| # 1, | |||
| # true) | |||
| end | |||
| end | |||
| @@ -58,4 +58,14 @@ class TestGraph < Test::Unit::TestCase | |||
| assert_equal g.vcount, l.nrow | |||
| assert_equal 2, l.ncol | |||
| end | |||
| def test_merge | |||
| g = IGraph.new([1,2,3,4],true) | |||
| l = g.layout_lgl(10,1,1,2,1,1,1) | |||
| h = IGraph.new([1,2,3,4],true) | |||
| m = h.layout_lgl(10,1,1,2,1,1,1) | |||
| f = IGraph.layout_merge_dla([g,h],[l,m]) | |||
| assert_instance_of IGraphMatrix, f | |||
| assert_equal g.vcount + h.vcount, f.nrow | |||
| assert_equal 2, f.ncol | |||
| end | |||
| end | |||
| @@ -16,14 +16,17 @@ require 'tc_dijkstra' | |||
| require 'tc_directedness' | |||
| require 'tc_error_handling' | |||
| require 'tc_file_read_write' | |||
| require 'tc_generators_deterministic' | |||
| require 'tc_generators_random' | |||
| require 'tc_independent_vertex_sets' | |||
| require 'tc_isomorphic' | |||
| require 'tc_iterators' | |||
| require 'tc_layout' | |||
| require 'tc_layout3d' | |||
| require 'tc_matrix' | |||
| require 'tc_motif' | |||
| require 'tc_other_ops' | |||
| require 'tc_randomisation' | |||
| require 'tc_selectors' | |||
| require 'tc_shortest_paths' | |||
| require 'tc_spanning' | |||