|
- #include "igraph.h"
- #include "ruby.h"
- #include "cIGraph.h"
-
- /* call-seq:
- * graph.vertices -> Array
- *
- * Returns an Array containing all the vertices in the graph. Also aliased
- * to IGraph#all_vertices
- *
- * Example:
- *
- * g = IGraph.new([1,2,3,4],true)
- * g.vertices #returns [1,2,3,4]
- *
- */
- VALUE cIGraph_all_v(VALUE self){
- igraph_t *graph;
-
- Data_Get_Struct(self, igraph_t, graph);
- return ((VALUE*)graph->attr)[0];
-
- }
-
- /* call-seq:
- * graph.adjacent_vertices(v,mode) -> Array
- *
- * Returns an Array containing all the vertices in the graph that are
- * adjacent to vertex v. mode decides the type of the neighborhood for
- * directed graphs. Possible values: IGRAPH_OUT, all vertices to which
- * there is a directed edge from vid. IGRAPH_IN, all vertices from which
- * there is a directed edge from vid. IGRAPH_ALL, all vertices to which
- * or from which there is a directed edge from/to vid. This parameter is
- * ignored for undirected graphs.
- *
- * Example:
- *
- * g = IGraph.new([1,2,3,4],true)
- * g.adjacent_vertices(1,IGraph::ALL) #returns [2]
- *
- */
- VALUE cIGraph_adj_v(VALUE self, VALUE v, VALUE mode){
-
- igraph_t *graph;
- igraph_integer_t pnode;
- VALUE adjacent = rb_ary_new();
- igraph_neimode_t pmode = NUM2INT(mode);
- igraph_vs_t vs;
- igraph_vit_t vit;
-
- Data_Get_Struct(self, igraph_t, graph);
-
- pnode = cIGraph_get_vertex_id(self,v);
-
- igraph_vs_adj(&vs,pnode,pmode);
- igraph_vit_create(graph, vs, &vit);
-
- while(!IGRAPH_VIT_END(vit)) {
- rb_ary_push(adjacent,cIGraph_get_vertex_object(self,IGRAPH_VIT_GET(vit)));
- IGRAPH_VIT_NEXT(vit);
- }
-
- igraph_vit_destroy(&vit);
- igraph_vs_destroy(&vs);
-
- return adjacent;
-
- }
-
- /* call-seq:
- * graph.noadjacent_vertices(v,mode) -> Array
- *
- * Returns all non-neighboring vertices of a given vertex (v). The mode
- * argument controls the type of neighboring vertics not to select. Possible
- * values: IGRAPH_OUT, all vertices will be selected except those to which
- * there is a directed edge from vid. IGRAPH_IN, all vertices will be
- * selected except those from which there is a directed edge to vid.
- * IGRAPH_ALL, all vertices will be selected except those from or to which
- * there is a directed edge to or from vid.
- */
-
- VALUE cIGraph_nonadj_v(VALUE self, VALUE v, VALUE mode){
-
- igraph_t *graph;
- igraph_integer_t pnode;
- VALUE nonadjacent = rb_ary_new();
- igraph_neimode_t pmode = NUM2INT(mode);
- igraph_vs_t vs;
- igraph_vit_t vit;
-
- Data_Get_Struct(self, igraph_t, graph);
-
- pnode = cIGraph_get_vertex_id(self,v);
-
- igraph_vs_nonadj(&vs,pnode,pmode);
- igraph_vit_create(graph, vs, &vit);
-
- while(!IGRAPH_VIT_END(vit)) {
- rb_ary_push(nonadjacent,cIGraph_get_vertex_object(self,IGRAPH_VIT_GET(vit)));
- IGRAPH_VIT_NEXT(vit);
- }
-
- igraph_vit_destroy(&vit);
- igraph_vs_destroy(&vs);
-
- return nonadjacent;
-
- }
-
- /* call-seq:
- * graph.edges(mode) -> Array
- *
- * Returns an Array of all edge ids in the graph. The mode argument specifies
- * the order the eids are returned. Possible values: IGRAPH_EDGEORDER_ID,
- * edge id order. IGRAPH_EDGEORDER_FROM, vertex id order, the id of the
- * source vertex counts for directed graphs. The order of the adjacent edges
- * of a given vertex is arbitrary. IGRAPH_EDGEORDER_TO, vertex id order, the
- * id of the target vertex counts for directed graphs. The order of the
- * adjacent edges of a given vertex is arbitrary. For undirected graph the
- * latter two is the same.
- */
- VALUE cIGraph_all_e(VALUE self, VALUE mode){
-
- igraph_t *graph;
- igraph_es_t es;
- igraph_eit_t eit;
- igraph_edgeorder_type_t pmode = NUM2INT(mode);
- VALUE edge_ids = rb_ary_new();
-
- Data_Get_Struct(self, igraph_t, graph);
-
- igraph_es_all(&es,pmode);
- igraph_eit_create(graph, es, &eit);
-
- while(!IGRAPH_EIT_END(eit)) {
- rb_ary_push(edge_ids,INT2NUM(IGRAPH_EIT_GET(eit)));
- IGRAPH_EIT_NEXT(eit);
- }
-
- igraph_eit_destroy(&eit);
- igraph_es_destroy(&es);
-
- return edge_ids;
-
-
- }
-
- /* call-seq:
- * graph.adjacent_edges(v,mode) -> Array
- *
- * Returns an Array of the eids of the adjacent edges of a vertex (v). The
- * mode argument gives the type of edges to select. Possible values:
- * IGRAPH_OUT, outgoing edges IGRAPH_IN, incoming edges IGRAPH_ALL, all edges
- */
- VALUE cIGraph_adj_e(VALUE self, VALUE v, VALUE mode){
-
- igraph_t *graph;
- igraph_es_t es;
- igraph_eit_t eit;
-
- VALUE adjacent = rb_ary_new();
-
- Data_Get_Struct(self, igraph_t, graph);
-
- igraph_es_none(&es);
- igraph_es_adj(&es,cIGraph_get_vertex_id(self,v),NUM2INT(mode));
- igraph_eit_create(graph, es, &eit);
-
- while(!IGRAPH_EIT_END(eit)) {
- rb_ary_push(adjacent,INT2NUM(IGRAPH_EIT_GET(eit)));
- IGRAPH_EIT_NEXT(eit);
- }
-
- igraph_eit_destroy(&eit);
- igraph_es_destroy(&es);
-
- return adjacent;
-
- }
-
|