#include "igraph.h" #include "ruby.h" #include "cIGraph.h" /* call-seq: * graph.st_edge_connectivity(source,target) -> Integer * * Edge connectivity of a pair of vertices * * The edge connectivity of two vertices (source and target) in a graph is * the minimum number of edges that have to be deleted from the graph to * eliminate all paths from source to target. * * This function uses the maximum flow algorithm to calculate the edge * connectivity. * */ VALUE cIGraph_st_edge_connectivity(VALUE self, VALUE source, VALUE target){ igraph_t *graph; igraph_integer_t from_i; igraph_integer_t to_i; igraph_integer_t value; Data_Get_Struct(self, igraph_t, graph); from_i = cIGraph_get_vertex_id(self,source); to_i = cIGraph_get_vertex_id(self,target); igraph_st_edge_connectivity(graph,&value,from_i,to_i); return INT2NUM(value); } /* call-seq: * graph.edge_connectivity() -> Integer * * This is the minimum of the edge connectivity over all pairs of vertices * in the graph. * */ VALUE cIGraph_edge_connectivity(VALUE self){ igraph_t *graph; igraph_integer_t value; Data_Get_Struct(self, igraph_t, graph); igraph_edge_connectivity(graph,&value,1); return INT2NUM(value); } /* call-seq: * graph.st_vertex_connectivity(source,target,neigh) -> Integer * * The vertex connectivity of two vertices (source and target) is the minimum * number of vertices that have to be deleted to eliminate all paths from * source to target. Directed paths are considered in directed graphs. * * A constant giving what to do if the two vertices are connected. Possible * values: IGraph::VCONN_NEI_ERROR, stop with an error message, * IGraph::VCONN_INFINITY, return infinity (ie. 1.0/0.0). * IGraph::VCONN_IGNORE, ignore the fact that the two vertices are connected * and calculated the number of vertices needed to aliminate all paths except * for the trivial (direct) paths between source and vertex. * */ VALUE cIGraph_st_vertex_connectivity(VALUE self, VALUE source, VALUE target, VALUE neighbours){ igraph_t *graph; igraph_integer_t from_i; igraph_integer_t to_i; igraph_integer_t value; Data_Get_Struct(self, igraph_t, graph); from_i = cIGraph_get_vertex_id(self,source); to_i = cIGraph_get_vertex_id(self,target); igraph_st_vertex_connectivity(graph,&value,from_i,to_i,NUM2INT(neighbours)); return INT2NUM(value); } /* call-seq: * graph.vertex_connectivity() -> Integer * * This is the minimum of the vertex connectivity over all pairs of vertices * in the graph. * */ VALUE cIGraph_vertex_connectivity(VALUE self){ igraph_t *graph; igraph_integer_t value; Data_Get_Struct(self, igraph_t, graph); igraph_vertex_connectivity(graph,&value,1); return INT2NUM(value); } /* call-seq: * graph.edge_disjoint_paths(source,target) -> Integer * * The maximum number of edge-disjoint paths between two vertices. * * A set of paths between two vertices is called edge-disjoint if they do not * share any edges. The maximum number of edge-disjoint paths are calculated * by this function using maximum flow techniques. Directed paths are * considered in directed graphs. * */ VALUE cIGraph_edge_disjoint_paths(VALUE self, VALUE source, VALUE target){ igraph_t *graph; igraph_integer_t from_i; igraph_integer_t to_i; igraph_integer_t value; Data_Get_Struct(self, igraph_t, graph); from_i = cIGraph_get_vertex_id(self,source); to_i = cIGraph_get_vertex_id(self,target); igraph_edge_disjoint_paths(graph,&value,from_i,to_i); return INT2NUM(value); } /* call-seq: * graph.vertex_disjoint_paths(source,target) -> Integer * * The maximum number of vertex-disjoint paths between two vertices. * * A set of paths between two vertices is called vertex-disjoint if they do * not share any vertexs. The maximum number of vertex-disjoint paths are * calculated by this function using maximum flow techniques. Directed paths * are considered in directed graphs. * */ VALUE cIGraph_vertex_disjoint_paths(VALUE self, VALUE source, VALUE target){ igraph_t *graph; igraph_integer_t from_i; igraph_integer_t to_i; igraph_integer_t value; Data_Get_Struct(self, igraph_t, graph); from_i = cIGraph_get_vertex_id(self,source); to_i = cIGraph_get_vertex_id(self,target); igraph_vertex_disjoint_paths(graph,&value,from_i,to_i); return INT2NUM(value); } /* call-seq: * graph.adhesion() -> Integer * * Graph adhesion, this is (almost) the same as edge connectivity. * * This quantity is defined by White and Harary in The cohesiveness of * blocks in social networks: node connectivity and conditional density, * (Sociological Methodology 31:305--359, 2001) and basically it is the * edge connectivity of the graph with uniform edge weights. * */ VALUE cIGraph_adhesion(VALUE self){ igraph_t *graph; igraph_integer_t value; Data_Get_Struct(self, igraph_t, graph); igraph_adhesion(graph,&value,1); return INT2NUM(value); } /* call-seq: * graph.cohesion() -> Integer * * Graph cohesion, this is the same as vertex connectivity. * * This quantity is defined by White and Harary in The cohesiveness of * blocks in social networks: node connectivity and conditional density, * (Sociological Methodology 31:305--359, 2001) and basically it is the * edge connectivity of the graph with uniform edge weights. * */ VALUE cIGraph_cohesion(VALUE self){ igraph_t *graph; igraph_integer_t value; Data_Get_Struct(self, igraph_t, graph); igraph_cohesion(graph,&value,1); return INT2NUM(value); }