293 lines
7.8 KiB
C
293 lines
7.8 KiB
C
#include "igraph.h"
|
|
#include "ruby.h"
|
|
#include "cIGraph.h"
|
|
|
|
/* call-seq:
|
|
* graph.layout_random -> IGraphMatrix
|
|
*
|
|
* Returns a random layout
|
|
*/
|
|
VALUE cIGraph_layout_random(VALUE self){
|
|
|
|
igraph_t *graph;
|
|
igraph_matrix_t *res = malloc(sizeof(igraph_matrix_t));
|
|
|
|
Data_Get_Struct(self, igraph_t, graph);
|
|
|
|
igraph_matrix_init(res,0,0);
|
|
igraph_layout_random(graph,res);
|
|
|
|
return Data_Wrap_Struct(cIGraphMatrix, 0, cIGraph_matrix_free, res);
|
|
|
|
}
|
|
|
|
/* call-seq:
|
|
* graph.layout_circle -> IGraphMatrix
|
|
*
|
|
* Returns a layout with nodes laid out around a circle.
|
|
*/
|
|
VALUE cIGraph_layout_circle(VALUE self){
|
|
|
|
igraph_t *graph;
|
|
igraph_matrix_t *res = malloc(sizeof(igraph_matrix_t));
|
|
|
|
Data_Get_Struct(self, igraph_t, graph);
|
|
|
|
igraph_matrix_init(res,0,0);
|
|
igraph_layout_circle(graph,res);
|
|
|
|
return Data_Wrap_Struct(cIGraphMatrix, 0, cIGraph_matrix_free, res);
|
|
|
|
}
|
|
|
|
/* call-seq:
|
|
* graph.layout_fruchterman_reingold -> IGraphMatrix
|
|
*
|
|
* Places the vertices on a plane according to the Fruchterman-Reingold
|
|
* algorithm.
|
|
*
|
|
* This is a force-directed layout, see Fruchterman, T.M.J. and Reingold,
|
|
* E.M.: Graph Drawing by Force-directed Placement. Software -- Practice and
|
|
* Experience, 21/11, 1129--1164, 1991.
|
|
*/
|
|
VALUE cIGraph_layout_fruchterman_reingold(VALUE self,
|
|
VALUE niter,
|
|
VALUE maxdelta,
|
|
VALUE area,
|
|
VALUE coolexp,
|
|
VALUE repulserad,
|
|
VALUE use_seed){
|
|
|
|
igraph_t *graph;
|
|
igraph_matrix_t *res = malloc(sizeof(igraph_matrix_t));
|
|
|
|
Data_Get_Struct(self, igraph_t, graph);
|
|
|
|
igraph_matrix_init(res,0,0);
|
|
igraph_layout_fruchterman_reingold(graph,res,
|
|
NUM2INT(niter),
|
|
NUM2DBL(maxdelta),
|
|
NUM2DBL(area),
|
|
NUM2DBL(coolexp),
|
|
NUM2DBL(repulserad),
|
|
use_seed == Qtrue ? 1: 0, NULL);
|
|
|
|
return Data_Wrap_Struct(cIGraphMatrix, 0, cIGraph_matrix_free, res);
|
|
|
|
}
|
|
|
|
/* call-seq:
|
|
* graph.layout_kamada_kawai -> IGraphMatrix
|
|
*
|
|
* Places the vertices on a plane according the Kamada-Kawai algorithm.
|
|
*
|
|
* This is a force directed layout, see Kamada, T. and Kawai, S.: An
|
|
* Algorithm for Drawing General Undirected Graphs. Information Processing
|
|
* Letters, 31/1, 7--15, 1989.
|
|
*/
|
|
VALUE cIGraph_layout_kamada_kawai(VALUE self,
|
|
VALUE niter,
|
|
VALUE sigma,
|
|
VALUE initemp,
|
|
VALUE coolexp,
|
|
VALUE kkconst){
|
|
|
|
igraph_t *graph;
|
|
igraph_matrix_t *res = malloc(sizeof(igraph_matrix_t));
|
|
|
|
Data_Get_Struct(self, igraph_t, graph);
|
|
|
|
igraph_matrix_init(res,0,0);
|
|
igraph_layout_kamada_kawai(graph,res,
|
|
NUM2INT(niter),
|
|
NUM2DBL(sigma),
|
|
NUM2DBL(initemp),
|
|
NUM2DBL(coolexp),
|
|
NUM2DBL(kkconst),0);
|
|
|
|
return Data_Wrap_Struct(cIGraphMatrix, 0, cIGraph_matrix_free, res);
|
|
|
|
}
|
|
|
|
/* call-seq:
|
|
* graph.layout_reingold_tilford -> IGraphMatrix
|
|
*
|
|
* Reingold-Tilford layout for tree graphs
|
|
*
|
|
* Arranges the nodes in a tree where the given node is used as the root.
|
|
* The tree is directed downwards and the parents are centered above its
|
|
* children. For the exact algorithm, see:
|
|
*
|
|
* Reingold, E and Tilford, J: Tidier drawing of trees. IEEE Trans. Softw.
|
|
* Eng., SE-7(2):223--228, 1981
|
|
*
|
|
* If the given graph is not a tree, a breadth-first search is executed
|
|
* first to obtain a possible spanning tree.
|
|
*/
|
|
VALUE cIGraph_layout_reingold_tilford(VALUE self,
|
|
VALUE root){
|
|
|
|
igraph_t *graph;
|
|
igraph_matrix_t *res = malloc(sizeof(igraph_matrix_t));
|
|
|
|
Data_Get_Struct(self, igraph_t, graph);
|
|
|
|
igraph_matrix_init(res,0,0);
|
|
igraph_layout_reingold_tilford(graph,res,
|
|
cIGraph_get_vertex_id(self, root));
|
|
|
|
return Data_Wrap_Struct(cIGraphMatrix, 0, cIGraph_matrix_free, res);
|
|
|
|
}
|
|
|
|
/* call-seq:
|
|
* graph.layout_reingold_tilford_circular -> IGraphMatrix
|
|
*
|
|
* Reingold-Tilford layout for tree graphs, drawn in a circular style
|
|
*
|
|
* Arranges the nodes in a tree where the given node is used as the root.
|
|
* The tree is directed downwards and the parents are centered above its
|
|
* children. For the exact algorithm, see:
|
|
*
|
|
* Reingold, E and Tilford, J: Tidier drawing of trees. IEEE Trans. Softw.
|
|
* Eng., SE-7(2):223--228, 1981
|
|
*
|
|
* If the given graph is not a tree, a breadth-first search is executed
|
|
* first to obtain a possible spanning tree.
|
|
*/
|
|
VALUE cIGraph_layout_reingold_tilford_circular(VALUE self,
|
|
VALUE root){
|
|
|
|
igraph_t *graph;
|
|
igraph_matrix_t *res = malloc(sizeof(igraph_matrix_t));
|
|
|
|
Data_Get_Struct(self, igraph_t, graph);
|
|
|
|
igraph_matrix_init(res,0,0);
|
|
igraph_layout_reingold_tilford_circular(graph,res,
|
|
cIGraph_get_vertex_id(self, root));
|
|
|
|
return Data_Wrap_Struct(cIGraphMatrix, 0, cIGraph_matrix_free, res);
|
|
|
|
}
|
|
|
|
/* call-seq:
|
|
* graph.layout_grid_fruchterman_reingold -> IGraphMatrix
|
|
*
|
|
* Places the vertices on a plane according to the Fruchterman-Reingold
|
|
* algorithm.
|
|
*
|
|
* This is a force-directed layout, see Fruchterman, T.M.J. and Reingold,
|
|
* E.M.: Graph Drawing by Force-directed Placement. Software -- Practice and
|
|
* Experience, 21/11, 1129--1164, 1991.
|
|
*/
|
|
VALUE cIGraph_layout_grid_fruchterman_reingold(VALUE self,
|
|
VALUE niter,
|
|
VALUE maxdelta,
|
|
VALUE area,
|
|
VALUE coolexp,
|
|
VALUE repulserad,
|
|
VALUE cellsize,
|
|
VALUE use_seed){
|
|
|
|
igraph_t *graph;
|
|
igraph_matrix_t *res = malloc(sizeof(igraph_matrix_t));
|
|
|
|
Data_Get_Struct(self, igraph_t, graph);
|
|
|
|
igraph_matrix_init(res,0,0);
|
|
igraph_layout_grid_fruchterman_reingold(graph,res,
|
|
NUM2INT(niter),
|
|
NUM2DBL(maxdelta),
|
|
NUM2DBL(area),
|
|
NUM2DBL(coolexp),
|
|
NUM2DBL(repulserad),
|
|
NUM2DBL(cellsize),
|
|
use_seed == Qtrue ? 1: 0);
|
|
|
|
return Data_Wrap_Struct(cIGraphMatrix, 0, cIGraph_matrix_free, res);
|
|
|
|
}
|
|
|
|
/* call-seq:
|
|
* graph.layout_lgl -> IGraphMatrix
|
|
*
|
|
* Places the vertices on a plane according to the Fruchterman-Reingold
|
|
* algorithm.
|
|
*
|
|
* This is a force-directed layout, see Fruchterman, T.M.J. and Reingold,
|
|
* E.M.: Graph Drawing by Force-directed Placement. Software -- Practice and
|
|
* Experience, 21/11, 1129--1164, 1991.
|
|
*/
|
|
VALUE cIGraph_layout_lgl(VALUE self,
|
|
VALUE maxit,
|
|
VALUE maxdelta,
|
|
VALUE area,
|
|
VALUE coolexp,
|
|
VALUE repulserad,
|
|
VALUE cellsize,
|
|
VALUE proot){
|
|
|
|
igraph_t *graph;
|
|
igraph_matrix_t *res = malloc(sizeof(igraph_matrix_t));
|
|
|
|
Data_Get_Struct(self, igraph_t, graph);
|
|
|
|
igraph_matrix_init(res,0,0);
|
|
igraph_layout_lgl(graph,res,
|
|
NUM2INT(maxit),
|
|
NUM2DBL(maxdelta),
|
|
NUM2DBL(area),
|
|
NUM2DBL(coolexp),
|
|
NUM2DBL(repulserad),
|
|
NUM2DBL(cellsize),
|
|
cIGraph_get_vertex_id(self, proot));
|
|
|
|
return Data_Wrap_Struct(cIGraphMatrix, 0, cIGraph_matrix_free, res);
|
|
|
|
}
|
|
|
|
/* call-seq:
|
|
* graph.layout_merge_dla(graphs,layouts) -> IGraphMatrix
|
|
*
|
|
* Merge multiple layouts by using a DLA algorithm
|
|
*
|
|
* First each layout is covered by a circle. Then the layout of the largest
|
|
* graph is placed at the origin. Then the other layouts are placed by the
|
|
* DLA algorithm, larger ones first and smaller ones last.
|
|
*
|
|
* graphs: Array of IGraph objects
|
|
*
|
|
* layouts: Array of IGraphMatrix layouts
|
|
*/
|
|
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_LEN(graphs);i++){
|
|
Data_Get_Struct(RARRAY_PTR(graphs)[i], igraph_t, graph);
|
|
igraph_vector_ptr_push_back(&thegraphs,graph);
|
|
}
|
|
for(i=0;i<RARRAY_LEN(layouts);i++){
|
|
Data_Get_Struct(RARRAY_PTR(layouts)[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);
|
|
|
|
}
|