For using the igraph C library
Graph generators create graphs.
Almost all functions which create graph objects are documented
here. The exceptions are igraph_subgraph()
and alike, these
create graphs based on another graph.
igraph_create
— Creates a graph with the specified edges.igraph_small
— Shorthand to create a short graph, giving the edges as arguments.igraph_adjacency
— Creates a graph object from an adjacency matrix.igraph_weighted_adjacency
— Creates a graph object from a weighted adjacency matrix.igraph_adjlist
— Create a graph from an adjacency listigraph_star
— Creates a star graph, every vertex connects only to the center.igraph_lattice
— Creates most kinds of lattices.igraph_ring
— Creates a ring graph, a one dimensional lattice.igraph_tree
— Creates a tree in which almost all vertices have the same number of children.igraph_full
— Creates a full graph (directed or undirected, with or without loops). igraph_full_citation
— Creates a full citation graphigraph_famous
— Create a famous graph by simply providing its nameigraph_lcf
— Create a graph from LCF notationigraph_lcf_vector
— Create a graph from LCF notationigraph_atlas
— Create a small graph from the “Graph Atlas”.igraph_de_bruijn
— Generate a de Bruijn graph.igraph_kautz
— Generate a Kautz graph.igraph_extended_chordal_ring
— Create an extended chordal ringigraph_connect_neighborhood
— Connects every vertex to its neighborhood
int igraph_create(igraph_t *graph, const igraph_vector_t *edges, igraph_integer_t n, igraph_bool_t directed);
Arguments:

An uninitialized graph object. 

The edges to add, the first two elements are the first edge, etc. 

The number of vertices in the graph, if smaller or equal
to the highest vertex id in the 

Boolean, whether to create a directed graph or
not. If yes, then the first edge points from the first
vertex id in 
Returns:
Error code:

Time complexity: O(V+E), V is the number of vertices, E the number of edges in the graph.
Example 9.1. File examples/simple/igraph_create.c
/* * mode: C * */ /* IGraph library. Copyright (C) 20062012 Gabor Csardi <csardi.gabor@gmail.com> 334 Harvard street, Cambridge, MA 02139 USA This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301 USA */ #include <igraph.h> int main() { igraph_t g; igraph_vector_t v1, v2; int ret; /* simple use */ igraph_vector_init(&v1, 8); VECTOR(v1)[0]=0; VECTOR(v1)[1]=1; VECTOR(v1)[2]=1; VECTOR(v1)[3]=2; VECTOR(v1)[4]=2; VECTOR(v1)[5]=3; VECTOR(v1)[6]=2; VECTOR(v1)[7]=2; igraph_create(&g, &v1, 0, 0); if (igraph_vcount(&g) != 4) { return 1; } igraph_vector_init(&v2, 0); igraph_get_edgelist(&g, &v2, 0); igraph_vector_sort(&v1); igraph_vector_sort(&v2); if (!igraph_vector_all_e(&v1, &v2)) { return 2; } igraph_destroy(&g); /* higher number of vertices */ igraph_create(&g, &v1, 10, 0); if (igraph_vcount(&g) != 10) { return 1; } igraph_get_edgelist(&g, &v2, 0); igraph_vector_sort(&v1); igraph_vector_sort(&v2); if (!igraph_vector_all_e(&v1, &v2)) { return 3; } igraph_destroy(&g); /* error: IGRAPH_EINVEVECTOR */ igraph_set_error_handler(igraph_error_handler_ignore); igraph_vector_resize(&v1, 9); VECTOR(v1)[8]=0; ret=igraph_create(&g, &v1, 0, 0); if (ret != IGRAPH_EINVEVECTOR) { return 4; } /* error: IGRAPH_EINVVID */ igraph_vector_resize(&v1, 8); VECTOR(v1)[7]=1; ret=igraph_create(&g, &v1, 10, 1); if (ret != IGRAPH_EINVVID) { return 5; } igraph_vector_destroy(&v1); igraph_vector_destroy(&v2); return 0; }
int igraph_small(igraph_t *graph, igraph_integer_t n, igraph_bool_t directed, ...);
This function is handy when a relatively small graph needs to be created. Instead of giving the edges as a vector, they are given simply as arguments and a '1' needs to be given after the last meaningful edge argument.
Note that only graphs which have vertices less than the highest value of the 'int' type can be created this way. If you give larger values then the result is undefined.
Arguments:

Pointer to an uninitialized graph object. The result will be stored here. 


The number of vertices in the graph; a nonnegative integer. 


Logical constant; gives whether the graph should be directed. Supported values are:



The additional arguments giving the edges of the graph. Don't forget to supply an additional '1' after the last (meaningful) argument. 
Returns:
Error code. 
Time complexity: O(V+E), the number of vertices plus the number of edges in the graph to create.
Example 9.2. File examples/simple/igraph_small.c
/* * mode: C * */ /* IGraph library. Copyright (C) 20062012 Gabor Csardi <csardi.gabor@gmail.com> 334 Harvard st, Cambridge MA, 02139 USA This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301 USA */ #include <igraph.h> int main() { igraph_t g; igraph_small(&g, 0, IGRAPH_DIRECTED, 0,1, 1,2, 2,3, 3,4, 6,1, 1); igraph_write_graph_edgelist(&g, stdout); igraph_destroy(&g); return 0; }
int igraph_adjacency(igraph_t *graph, igraph_matrix_t *adjmatrix, igraph_adjacency_t mode);
The order of the vertices in the matrix is preserved, i.e. the vertex corresponding to the first row/column will be vertex with id 0, the next row is for vertex 1, etc.
Arguments:

Pointer to an uninitialized graph object. 


The adjacency matrix. How it is interpreted
depends on the 


Constant to specify how the given matrix is interpreted
as an adjacency matrix. Possible values
(A(i,j)
is the element in row i and column
j in the adjacency matrix

Returns:
Error code,

Time complexity: O(VV), V is the number of vertices in the graph.
Example 9.3. File examples/simple/igraph_adjacency.c
/* * mode: C * */ /* IGraph library. Copyright (C) 20062012 Gabor Csardi <csardi.gabor@gmail.com> 334 Harvard street, Cambridge, MA 02139 USA This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301 USA */ #include <igraph.h> int main() { return 0; }
int igraph_weighted_adjacency(igraph_t *graph, igraph_matrix_t *adjmatrix, igraph_adjacency_t mode, const char* attr, igraph_bool_t loops);
The order of the vertices in the matrix is preserved, i.e. the vertex corresponding to the first row/column will be vertex with id 0, the next row is for vertex 1, etc.
Arguments:

Pointer to an uninitialized graph object. 


The weighted adjacency matrix. How it is interpreted
depends on the 


Constant to specify how the given matrix is interpreted
as an adjacency matrix. Possible values
(A(i,j)
is the element in row i and column
j in the adjacency matrix



the name of the attribute that will store the edge weights.
If 


Logical scalar, whether to ignore the diagonal elements in the adjacency matrix. 
Returns:
Error code,

Time complexity: O(VV), V is the number of vertices in the graph.
Example 9.4. File examples/simple/igraph_weighted_adjacency.c
/* * mode: C * */ /* IGraph library. Copyright (C) 20062012 Gabor Csardi <csardi.gabor@gmail.com> 334 Harvard st, Cambridge MA, 02139 USA This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301 USA */ #include <igraph.h> #include <stdarg.h> void print(igraph_t *g) { igraph_vector_t el; long int i, j, n; char ch = igraph_is_directed(g) ? '>' : ''; igraph_vector_init(&el, 0); igraph_get_edgelist(g, &el, 0); n = igraph_ecount(g); for (i=0, j=0; i<n; i++, j+=2) { printf("%ld %c %ld: %ld\n", (long)VECTOR(el)[j], ch, (long)VECTOR(el)[j+1], (long)EAN(g, "weight", i)); } printf("\n"); igraph_vector_destroy(&el); } int main() { igraph_t g; igraph_matrix_t mat; int m[4][4] = { { 0, 1, 2, 0 }, { 2, 0, 0, 1 }, { 0, 0, 1, 0 }, { 0, 1, 0, 0 } }; long int i, j; igraph_matrix_init(&mat, 4, 4); for (i=0; i<4; i++) for (j=0; j<4; j++) MATRIX(mat, i, j) = m[i][j]; igraph_i_set_attribute_table(&igraph_cattribute_table); /* [ 0 1 2 0 ] [ 2 0 0 1 ] [ 0 0 1 0 ] [ 0 1 0 0 ] */ igraph_weighted_adjacency(&g, &mat, IGRAPH_ADJ_DIRECTED, 0, /*loops=*/ 1); print(&g); igraph_destroy(&g); /* [ 0 1 2 0 ] [  0 0 1 ] [   1 0 ] [    0 ] */ igraph_weighted_adjacency(&g, &mat, IGRAPH_ADJ_UPPER, 0, /*loops=*/ 1); print(&g); igraph_destroy(&g); /* [ 0    ] [ 2 0   ] [ 0 0 1  ] [ 0 1 0 0 ] */ igraph_weighted_adjacency(&g, &mat, IGRAPH_ADJ_LOWER, 0, /*loops=*/ 1); print(&g); igraph_destroy(&g); /* [ 0 1 0 0 ] [ 1 0 0 1 ] [ 0 0 1 0 ] [ 0 1 0 0 ] */ igraph_weighted_adjacency(&g, &mat, IGRAPH_ADJ_MIN, 0, /*loops=*/ 1); print(&g); igraph_destroy(&g); /* [ 0 2 2 0 ] [ 2 0 0 1 ] [ 2 0 1 0 ] [ 0 1 0 0 ] */ igraph_weighted_adjacency(&g, &mat, IGRAPH_ADJ_MAX, 0, /*loops=*/ 1); print(&g); igraph_destroy(&g); /* [ 0 3 2 0 ] [ 3 0 0 2 ] [ 2 0 1 0 ] [ 0 2 0 0 ] */ igraph_weighted_adjacency(&g, &mat, IGRAPH_ADJ_PLUS, 0, /*loops=*/ 1); print(&g); igraph_destroy(&g); igraph_matrix_destroy(&mat); if (IGRAPH_FINALLY_STACK_SIZE() != 0) return 1; return 0; }
int igraph_adjlist(igraph_t *graph, const igraph_adjlist_t *adjlist, igraph_neimode_t mode, igraph_bool_t duplicate);
An adjacency list is a list of vectors, containing the neighbors
of all vertices. For operations that involve many changes to the
graph structure, it is recommended that you convert the graph into
an adjacency list via igraph_adjlist_init()
, perform the
modifications (these are cheap for an adjacency list) and then
recreate the igraph graph via this function.
Arguments:

Pointer to an uninitialized graph object. 

The adjacency list. 

Whether or not to create a directed graph. 

Logical, for undirected graphs this specified whether each edge is included twice, in the vectors of both adjacent vertices. If this is false (0), then it is assumed that every edge is included only once. This argument is ignored for directed graphs. 
Returns:
Error code. 
See also:

Time complexity: O(V+E).
int igraph_star(igraph_t *graph, igraph_integer_t n, igraph_star_mode_t mode, igraph_integer_t center);
Arguments:

Pointer to an uninitialized graph object, this will be the result. 


Integer constant, the number of vertices in the graph. 


Constant, gives the type of the star graph to create. Possible values:



Id of the vertex which will be the center of the graph. 
Returns:
Error code:

Time complexity: O(V), the number of vertices in the graph.
See also:

Example 9.5. File examples/simple/igraph_star.c
/* * mode: C * */ /* IGraph library. Copyright (C) 20062012 Gabor Csardi <csardi.gabor@gmail.com> 334 Harvard st, Cambridge MA, 02139 USA This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301 USA */ #include <igraph.h> int main() { return 0; }
int igraph_lattice(igraph_t *graph, const igraph_vector_t *dimvector, igraph_integer_t nei, igraph_bool_t directed, igraph_bool_t mutual, igraph_bool_t circular);
Arguments:

An uninitialized graph object. 

Vector giving the sizes of the lattice in each of its dimensions. Ie. the dimension of the lattice will be the same as the length of this vector. 

Integer value giving the distance (number of steps) within which two vertices will be connected. 

Boolean, whether to create a directed graph. The direction of the edges is determined by the generation algorithm and is unlikely to suit you, so this isn't a very useful option. 

Boolean, if the graph is directed this gives whether to create all connections as mutual. 

Boolean, defines whether the generated lattice is periodic. 
Returns:
Error code:

Time complexity: if nei
is less than two then it is O(V+E) (as
far as I remember), V and E are the number of vertices
and edges in the generated graph. Otherwise it is O(V*d^o+E), d
is the average degree of the graph, o is the nei
argument.
int igraph_ring(igraph_t *graph, igraph_integer_t n, igraph_bool_t directed, igraph_bool_t mutual, igraph_bool_t circular);
An undirected (circular) ring on n vertices is commonly known in graph theory as the cycle graph C_n.
Arguments:

Pointer to an uninitialized graph object. 

The number of vertices in the ring. 

Logical, whether to create a directed ring. 

Logical, whether to create mutual edges in a directed ring. It is ignored for undirected graphs. 

Logical, if false, the ring will be open (this is not a real ring actually). 
Returns:
Error code:

Time complexity: O(V), the number of vertices in the graph.
See also:

Example 9.6. File examples/simple/igraph_ring.c
/* * mode: C * */ /* IGraph library. Copyright (C) 20062012 Gabor Csardi <csardi.gabor@gmail.com> 334 Harvard st, Cambridge MA, 02139 USA Ring test suite Copyright (C) 2011 Minh Van Nguyen <nguyenminh2@gmail.com> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301 USA */ #include <igraph.h> typedef struct { int n, m; igraph_bool_t directed, mutual, circular; igraph_real_t *edges; } ring_test_t; #define RING_TEST(id, n, m, di, mu, ci, ...) \ igraph_real_t ring_ ## id ## _edges[] = { __VA_ARGS__ }; \ ring_test_t ring_ ## id = { n, m, di, mu, ci, ring_ ## id ## _edges } /*nmdimuciedges*/ RING_TEST(uc_6, 6, 6, 0, 0, 1, 0,1, 1,2, 2,3, 3,4, 4,5, 5,0 ); RING_TEST(uc_0, 0, 0, 0, 0, 1, 1 ); RING_TEST(uc_1, 1, 0, 0, 0, 1, 1 ); RING_TEST(uc_2, 2, 1, 0, 0, 1, 0,1 ); RING_TEST(u_6, 6, 5, 0, 0, 0, 0,1, 1,2, 2,3, 3,4, 4,5 ); RING_TEST(u_0, 0, 0, 0, 0, 0, 1 ); RING_TEST(u_1, 1, 0, 0, 0, 0, 1 ); RING_TEST(u_2, 2, 1, 0, 0, 0, 0,1 ); RING_TEST(umc_6, 6, 6, 0, 1, 1, 0,1, 1,2, 2,3, 3,4, 4,5, 5,0 ); RING_TEST(umc_0, 0, 0, 0, 1, 1, 1 ); RING_TEST(umc_1, 1, 0, 0, 1, 1, 1 ); RING_TEST(umc_2, 2, 1, 0, 1, 1, 0,1 ); RING_TEST(um_6, 6, 5, 0, 1, 0, 0,1, 1,2, 2,3, 3,4, 4,5 ); RING_TEST(um_0, 0, 0, 0, 1, 0, 1 ); RING_TEST(um_1, 1, 0, 0, 1, 0, 1 ); RING_TEST(um_2, 2, 1, 0, 1, 0, 0,1 ); RING_TEST(dc_6, 6, 6, 1, 0, 1, 0,1, 1,2, 2,3, 3,4, 4,5, 5,0 ); RING_TEST(dc_0, 0, 0, 1, 0, 1, 1 ); RING_TEST(dc_1, 1, 0, 1, 0, 1, 1 ); RING_TEST(dc_2, 2, 2, 1, 0, 1, 0,1, 1,0 ); RING_TEST(d_6, 6, 5, 1, 0, 1, 0,1, 1,2, 2,3, 3,4, 4,5 ); RING_TEST(d_0, 0, 0, 1, 0, 1, 1 ); RING_TEST(d_1, 1, 0, 1, 0, 1, 1 ); RING_TEST(d_2, 2, 1, 1, 0, 1, 0,1 ); RING_TEST(dmc_6, 6,12, 1, 1, 1, 0,1, 1,2, 2,3, 3,4, 4,5, 5,0, 1,0, 2,1, 3,2, 4,3, 5,4, 0,5 ); RING_TEST(dmc_0, 0, 0, 1, 1, 1, 1 ); RING_TEST(dmc_1, 1, 0, 1, 1, 1, 1 ); RING_TEST(dmc_2, 2, 2, 1, 1, 1, 0,1, 1,0 ); RING_TEST(dm_6, 6,10, 1, 1, 0, 0,1, 1,2, 2,3, 3,4, 4,5, 1,0, 2,1, 3,2, 4,3, 5,4 ); RING_TEST(dm_0, 0, 0, 1, 1, 0, 1 ); RING_TEST(dm_1, 1, 0, 1, 1, 0, 1 ); RING_TEST(dm_2, 2, 2, 1, 1, 0, 0,1, 1,0 ); /*nmdimuciedges*/ ring_test_t *all_checks[] = { /* 1 */ &ring_uc_6, /* 2 */ &ring_uc_0, /* 3 */ &ring_uc_1, /* 4 */ &ring_uc_2, /* 5 */ &ring_u_6, /* 6 */ &ring_u_0, /* 7 */ &ring_u_1, /* 8 */ &ring_u_2, /* 9 */ &ring_umc_6, /* 10 */ &ring_umc_0, /* 11 */ &ring_umc_1, /* 12 */ &ring_umc_2, /* 13 */ &ring_um_6, /* 14 */ &ring_um_0, /* 15 */ &ring_um_1, /* 16 */ &ring_um_2, /* 17 */ &ring_dc_6, /* 18 */ &ring_dc_0, /* 19 */ &ring_dc_1, /* 20 */ &ring_dc_2, /* 21 */ &ring_dmc_6, /* 22 */ &ring_dmc_0, /* 23 */ &ring_dmc_1, /* 24 */ &ring_dmc_2, /* 25 */ &ring_dm_6, /* 26 */ &ring_dm_0, /* 27 */ &ring_dm_1, /* 28 */ &ring_dm_2, 0 }; int check_ring_properties(const igraph_t *ring, igraph_bool_t directed, igraph_bool_t mutual, igraph_bool_t circular) { igraph_bool_t res; /* Connected */ igraph_is_connected(ring, &res, IGRAPH_WEAK); if (!res) { printf("Not connected\n"); return 1; } /* Simple */ igraph_is_simple(ring, &res); if (!res) { printf("Not simple\n"); return 2; } /* Girth, for big enough circular graphs */ if (circular && igraph_vcount(ring) > 2) { igraph_integer_t girth; igraph_girth(ring, &girth, NULL); if (girth != igraph_vcount(ring)) { printf("Wrong girth\n"); return 3; } } return 0; } int check_ring(const ring_test_t *test) { igraph_t graph, othergraph; igraph_vector_t otheredges; igraph_bool_t iso; int ret; /* Create ring */ igraph_ring(&graph, test>n, test>directed, test>mutual, test>circular); /* Check its properties */ if ((ret=check_ring_properties(&graph, test>directed, test>mutual, test>circular))) { return ret;} /* Check that it is isomorphic to the stored graph */ igraph_vector_view(&otheredges, test>edges, test>m * 2); igraph_create(&othergraph, &otheredges, test>n, test>directed); igraph_isomorphic(&graph, &othergraph, &iso); if (!iso) { return 50; } /* Clean up */ igraph_destroy(&graph); igraph_destroy(&othergraph); return 0; } int main() { int i, ret; i=0; while (all_checks[i]) { if ((ret=check_ring(all_checks[i]))) { printf("Check no #%d failed.\n", (int) (i+1)); return ret; } i++; } return 0; }
int igraph_tree(igraph_t *graph, igraph_integer_t n, igraph_integer_t children, igraph_tree_mode_t type);
Arguments:

Pointer to an uninitialized graph object. 


Integer, the number of vertices in the graph. 


Integer, the number of children of a vertex in the tree. 


Constant, gives whether to create a directed tree, and if this is the case, also its orientation. Possible values:

Returns:
Error code:

Time complexity: O(V+E), the number of vertices plus the number of edges in the graph.
See also:

Example 9.7. File examples/simple/igraph_tree.c
/* * mode: C * */ /* IGraph library. Copyright (C) 20062012 Gabor Csardi <csardi.gabor@gmail.com> 334 Harvard st, Cambridge MA, 02139 USA This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301 USA */ #include <igraph.h> int main() { return 0; }
int igraph_full(igraph_t *graph, igraph_integer_t n, igraph_bool_t directed, igraph_bool_t loops);
In a full graph every possible edge is present, every vertex is
connected to every other vertex. A full graph in igraph
should be
distinguished from the concept of complete graphs as used in graph theory.
If n is a positive integer, then the complete graph K_n on n vertices is
the undirected simple graph with the following property. For any distinct
pair (u,v) of vertices in K_n, uv (or equivalently vu) is an edge of K_n.
In igraph
, a full graph on n vertices can be K_n, a directed version of
K_n, or K_n with at least one loop edge. In any case, if F is a full graph
on n vertices as generated by igraph
, then K_n is a subgraph of the
undirected version of F.
Arguments:

Pointer to an uninitialized graph object. 

Integer, the number of vertices in the graph. 

Logical, whether to create a directed graph. 

Logical, whether to include selfedges (loops). 
Returns:
Error code:

Time complexity: O(V+E), V is the number of vertices, E the number of edges in the graph. Of course this is the same as O(E)=O(VV) here.
See also:

Example 9.8. File examples/simple/igraph_full.c
/* * mode: C * */ /* IGraph library. Copyright (C) 20062012 Gabor Csardi <csardi.gabor@gmail.com> 334 Harvard st, Cambridge MA, 02139 USA This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301 USA */ #include <igraph.h> int main() { return 0; }
int igraph_full_citation(igraph_t *graph, igraph_integer_t n, igraph_bool_t directed);
This is a directed graph, where every i>j
edge is
present if and only if j<i
.
If the directed
argument is zero then an undirected graph is
created, and it is just a full graph.
Arguments:

Pointer to an uninitialized graph object, the result is stored here. 

The number of vertices. 

Whether to created a directed graph. If zero an undirected graph is created. 
Returns:
Error code. 
Time complexity: O(V^2), as we have many edges.
int igraph_famous(igraph_t *graph, const char *name);
The name of the graph can be simply supplied as a string.
Note that this function creates graphs which don't take any parameters,
there are separate functions for graphs with parameters, eg. igraph_full()
for creating a full graph.
The following graphs are supported:

The bull graph, 5 vertices, 5 edges, resembles the head of a bull if drawn properly. 

This is the smallest trianglefree graph that is both 4chromatic and 4regular. According to the Grunbaum conjecture there exists an mregular, mchromatic graph with n vertices for every m>1 and n>2. The Chvatal graph is an example for m=4 and n=12. It has 24 edges. 

A nonHamiltonian cubic symmetric graph with 28 vertices and 42 edges. 

The Platonic graph of the cube. A convex regular polyhedron with 8 vertices and 12 edges. 

A graph with 4 vertices and 5 edges, resembles a schematic diamond if drawn properly. 

Another Platonic solid with 20 vertices and 30 edges. 

The semisymmetric graph with minimum number of vertices, 20 and 40 edges. A semisymmetric graph is regular, edge transitive and not vertex transitive. 

This is a graph whose embedding to the Klein bottle can be colored with six colors, it is a counterexample to the necessity of the Heawood conjecture on a Klein bottle. It has 12 vertices and 18 edges. 

The Frucht Graph is the smallest cubical graph whose automorphism group consists only of the identity element. It has 12 vertices and 18 edges. 

The Grötzsch graph is a trianglefree graph with 11 vertices, 20 edges, and chromatic number 4. It is named after German mathematician Herbert Grötzsch, and its existence demonstrates that the assumption of planarity is necessary in Grötzsch's theorem that every trianglefree planar graph is 3colorable. 

The Heawood graph is an undirected graph with 14 vertices and 21 edges. The graph is cubic, and all cycles in the graph have six or more edges. Every smaller cubic graph has shorter cycles, so this graph is the 6cage, the smallest cubic graph of girth 6. 

The Herschel graph is the smallest nonhamiltonian polyhedral graph. It is the unique such graph on 11 nodes, and has 18 edges. 

The house graph is a 5vertex, 6edge graph, the schematic draw of a house if drawn properly, basically a triangle on top of a square. 

The same as the house graph with an X in the square. 5 vertices and 8 edges. 

A Platonic solid with 12 vertices and 30 edges. 

A social network with 10 vertices and 18 edges. Krackhardt, D. Assessing the Political Landscape: Structure, Cognition, and Power in Organizations. Admin. Sci. Quart. 35, 342369, 1990. 

The graph is a 4arc transitive cubic graph, it has 30 vertices and 45 edges. 

The McGee graph is the unique 3regular 7cage graph, it has 24 vertices and 36 edges. 

The Meredith graph is a quartic graph on 70 nodes and 140 edges that is a counterexample to the conjecture that every 4regular 4connected graph is Hamiltonian. 

A connected graph with 16 vertices and 27 edges containing no perfect matching. A matching in a graph is a set of pairwise nonincident edges; that is, no two edges share a common vertex. A perfect matching is a matching which covers all vertices of the graph. 

A graph whose connected components are the 9 graphs whose presence as a vertexinduced subgraph in a graph makes a nonline graph. It has 50 vertices and 72 edges. 

Platonic solid with 6 vertices and 12 edges. 

A 3regular graph with 10 vertices and 15 edges. It is the smallest hypohamiltonian graph, ie. it is nonhamiltonian but removing any single vertex from it makes it Hamiltonian. 

The unique (4,5)cage graph, ie. a 4regular graph of girth 5. It has 19 vertices and 38 edges. 

A smallest nontrivial graph whose automorphism group is cyclic. It has 9 vertices and 15 edges. 

Platonic solid with 4 vertices and 6 edges. 

The smallest hypotraceable graph, on 34 vertices and 52 edges. A hypotracable graph does not contain a Hamiltonian path but after removing any single vertex from it the remainder always contains a Hamiltonian path. A graph containing a Hamiltonian path is called traceable. 

Tait's Hamiltonian graph conjecture states that every 3connected 3regular planar graph is Hamiltonian. This graph is a counterexample. It has 46 vertices and 69 edges. 

Returns a 12vertex, trianglefree graph with chromatic number 3 that is uniquely 3colorable. 

An identity graph with 25 vertices and 31 edges. An identity graph has a single graph automorphism, the trivial one. 

Social network of friendships between 34 members of a karate club at a US university in the 1970s. See W. W. Zachary, An information flow model for conflict and fission in small groups, Journal of Anthropological Research 33, 452473 (1977). 
Arguments:

Pointer to an uninitialized graph object. 

Character constant, the name of the graph to be created, it is case insensitive. 
Returns:
Error code, IGRAPH_EINVAL if there is no graph with the given name. 
See also:
Other functions for creating graph structures:

Time complexity: O(V+E), the number of vertices plus the number of edges in the graph.
int igraph_lcf(igraph_t *graph, igraph_integer_t n, ...);
LCF is short for LederbergCoxeterFrucht, it is a concise notation for 3regular Hamiltonian graphs. It consists of three parameters: the number of vertices in the graph, a list of shifts giving additional edges to a cycle backbone, and another integer giving how many times the shifts should be performed. See http://mathworld.wolfram.com/LCFNotation.html for details.
Arguments:

Pointer to an uninitialized graph object. 

Integer, the number of vertices in the graph. 

The shifts and the number of repeats for the shifts, plus an additional 0 to mark the end of the arguments. 
Returns:
Error code. 
See also:
See 
Time complexity: O(V+E), the number of vertices plus the number of edges.
Example 9.9. File examples/simple/igraph_lcf.c
/* * mode: C * */ /* IGraph library. Copyright (C) 20072012 Gabor Csardi <csardi.gabor@gmail.com> 334 Harvard st, Cambridge MA, 02139 USA This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301 USA */ #include <igraph.h> int main() { igraph_t g, g2; igraph_bool_t iso; igraph_lcf(&g, 12, 5, 5, 6, 0); igraph_famous(&g2, "franklin"); igraph_isomorphic_vf2(&g, &g2, /*vertex.color1=*/ 0, /*vertex.color2=*/ 0, /*edge.color1=*/ 0, /*edge.color2=*/ 0, &iso, 0, 0, 0, 0, 0); if (!iso) { printf("OOOPS!\n"); return 1; } igraph_destroy(&g); igraph_destroy(&g2); return 0; }
int igraph_lcf_vector(igraph_t *graph, igraph_integer_t n, const igraph_vector_t *shifts, igraph_integer_t repeats);
This function is essentially the same as igraph_lcf()
, only
the way for giving the arguments is different. See igraph_lcf()
for details.
Arguments:

Pointer to an uninitialized graph object. 

Integer constant giving the number of vertices. 

A vector giving the shifts. 

An integer constant giving the number of repeats for the shifts. 
Returns:
Error code. 
See also:
Time complexity: O(V+E), linear in the number of vertices plus the number of edges.
int igraph_atlas(igraph_t *graph, int number);
The number of the graph is given as a parameter. The graphs are listed:
in increasing order of number of nodes;
for a fixed number of nodes, in increasing order of the number of edges;
for fixed numbers of nodes and edges, in increasing order of the degree sequence, for example 111223 < 112222;
for fixed degree sequence, in increasing number of automorphisms.
The data was converted from the NetworkX software package, see http://networkx.github.io .
See An Atlas of Graphs by Ronald C. Read and Robin J. Wilson, Oxford University Press, 1998.
Arguments:

Pointer to an uninitialized graph object. 

The number of the graph to generate. 
Added in version 0.2.
Time complexity: O(V+E), the number of vertices plus the number of edges.
Example 9.10. File examples/simple/igraph_atlas.c
/* * mode: C * */ /* IGraph library. Copyright (C) 20062012 Gabor Csardi <csardi.gabor@gmail.com> 334 Harvard street, Cambridge, MA 02139 USA This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301 USA */ #include <igraph.h> int main() { igraph_t g; int ret; igraph_atlas(&g, 45); igraph_write_graph_edgelist(&g, stdout); printf("\n"); igraph_destroy(&g); igraph_atlas(&g, 0); igraph_write_graph_edgelist(&g, stdout); printf("\n"); igraph_destroy(&g); igraph_atlas(&g, 1252); igraph_write_graph_edgelist(&g, stdout); printf("\n"); igraph_destroy(&g); igraph_set_error_handler(igraph_error_handler_ignore); ret=igraph_atlas(&g, 1); if (ret != IGRAPH_EINVAL) { return 1; } ret=igraph_atlas(&g, 1253); if (ret != IGRAPH_EINVAL) { return 2; } return 0; }
int igraph_de_bruijn(igraph_t *graph, igraph_integer_t m, igraph_integer_t n);
A de Bruijn graph represents relationships between strings. An alphabet
of m
letters are used and strings of length n
are considered.
A vertex corresponds to every possible string and there is a directed edge
from vertex v
to vertex w
if the string of v
can be transformed into
the string of w
by removing its first letter and appending a letter to it.
Please note that the graph will have m
to the power n
vertices and
even more edges, so probably you don't want to supply too big numbers for
m
and n
.
De Bruijn graphs have some interesting properties, please see another source, eg. Wikipedia for details.
Arguments:

Pointer to an uninitialized graph object, the result will be stored here. 

Integer, the number of letters in the alphabet. 

Integer, the length of the strings. 
Returns:
Error code. 
See also:
Time complexity: O(V+E), the number of vertices plus the number of edges.
int igraph_kautz(igraph_t *graph, igraph_integer_t m, igraph_integer_t n);
A Kautz graph is a labeled graph, vertices are labeled by strings
of length n
+1 above an alphabet with m
+1 letters, with
the restriction that every two consecutive letters in the string
must be different. There is a directed edge from a vertex v
to
another vertex w
if it is possible to transform the string of
v
into the string of w
by removing the first letter and
appending a letter to it.
Kautz graphs have some interesting properties, see eg. Wikipedia for details.
Vincent Matossian wrote the first version of this function in R, thanks.
Arguments:

Pointer to an uninitialized graph object, the result will be stored here. 

Integer, 

Integer, 
Returns:
Error code. 
See also:
Time complexity: O(V* [(m+1)/m]^n +E), in practice it is more
like O(V+E). V is the number of vertices, E is the number
of edges and m
and n
are the corresponding arguments.
int igraph_extended_chordal_ring(igraph_t *graph, igraph_integer_t nodes, const igraph_matrix_t *W);
An extended chordal ring is a regular graph, each node has the same
degree. It can be obtained from a simple ring by adding some extra
edges specified by a matrix. Let p denote the number of columns in
the W
matrix. The extra edges of vertex i
are added according to column (i mod p) in
W
. The number of extra edges is the number
of rows in W
: for each row j an edge
i>i+w[ij] is added if i+w[ij] is less than the number of total
nodes.
See also Kotsis, G: Interconnection Topologies for Parallel Processing Systems, PARS Mitteilungen 11, 16, 1993.
Arguments:

Pointer to an uninitialized graph object, the result will be stored here. The result is always an undirected graph. 

Integer constant, the number of vertices in the graph. It must be at least 3. 

The matrix specifying the extra edges. The number of columns should divide the number of total vertices. 
Returns:
Error code. 
See also:
Time complexity: O(V+E), the number of vertices plus the number of edges.
int igraph_connect_neighborhood(igraph_t *graph, igraph_integer_t order, igraph_neimode_t mode);
This function adds new edges to the input graph. For each vertex
vertices reachable by at most order
steps and not yet connected
to the vertex a new edge is created.
Note that the input graph is modified in place, no
new graph is created, call igraph_copy()
if you want to keep
the original graph as well.
For undirected graphs reachability is always
symmetric: if vertex A can be reached from vertex B in at
most order
steps, then the opposite is also true. Only one
undirected (A,B) edge will be added in this case.
Arguments:

The input graph, this is the output graph as well. 

Integer constant, it gives the distance within which the vertices will be connected to the source vertex. 

Constant, it specifies how the neighborhood search is
performed for directed graphs. If 
Returns:
Error code. 
See also:

Time complexity: O(V*d^o), V is the number of vertices in the
graph, d is the average degree and o is the order
argument.
igraph_grg_game
— Generating geometric random graphs.igraph_barabasi_game
— Generates a graph based on the BarabásiAlbert model.igraph_erdos_renyi_game
— Generates a random (ErdosRenyi) graph.igraph_watts_strogatz_game
— The WattsStrogatz smallworld modeligraph_rewire_edges
— Rewire the edges of a graph with constant probabilityigraph_degree_sequence_game
— Generates a random graph with a given degree sequence igraph_k_regular_game
— Generates a random graph where each vertex has the same degree.igraph_static_fitness_game
— Generates a nongrowing random graph with edge probabilitiesigraph_static_power_law_game
— Generates a nongrowing random graph with expected powerlaw degree distributions.igraph_forest_fire_game
— Generates a network according to the “forest fire game”igraph_rewire
— Randomly rewires a graph while preserving the degree distribution.igraph_growing_random_game
— Generates a growing random graph.igraph_callaway_traits_game
— Simulate a growing network with vertex types.igraph_establishment_game
— Generates a graph with a simple growing model with vertex types.igraph_preference_game
— Generates a graph with vertex types and connection preferences igraph_asymmetric_preference_game
— Generates a graph with asymmetric vertex types and connection preferences igraph_recent_degree_game
— Stochastic graph generator based on the number of incident edges a node has gained recentlyigraph_barabasi_aging_game
— Preferential attachment with aging of verticesigraph_recent_degree_aging_game
— Preferential attachment based on the number of edges gained recently, with aging of verticesigraph_cited_type_game
— Simulate a citation based on vertex types.igraph_citing_cited_type_game
— Simulate a citation network based on vertex types.igraph_sbm_game
— Sample from a stochastic block modelGames are randomized graph generators. Randomization means that they generate a different graph every time you call them.
int igraph_grg_game(igraph_t *graph, igraph_integer_t nodes, igraph_real_t radius, igraph_bool_t torus, igraph_vector_t *x, igraph_vector_t *y);
A geometric random graph is created by dropping points (=vertices)
randomly to the unit square and then connecting all those pairs
which are less than radius
apart in Euclidean norm.
Original code contributed by Keith Briggs, thanks Keith.
Arguments:

Pointer to an uninitialized graph object, 

The number of vertices in the graph. 

The radius within which the vertices will be connected. 

Logical constant, if true periodic boundary conditions will be used, ie. the vertices are assumed to be on a torus instead of a square. 
Returns:
Error code. 
Time complexity: TODO, less than O(V^2+E).
Example 9.11. File examples/simple/igraph_grg_game.c
/* * mode: C * */ /* IGraph library. Copyright (C) 20062012 Gabor Csardi <csardi.gabor@gmail.com> 334 Harvard st, Cambridge MA, 02139 USA This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301 USA */ #include <igraph.h> #include <unistd.h> #include <sys/times.h> #include <math.h> int main() { igraph_t g; /* long int i; */ /* struct tms time; */ /* clock_t current_time,start_time; */ /* long int runs=100, n=10000; */ /* igraph_real_t r=0.01; */ /* Empty graph */ igraph_grg_game(&g, 100, 0, 0, 0, 0); if (igraph_ecount(&g) != 0) { return 1; } igraph_destroy(&g); /* Full graph */ igraph_grg_game(&g, 10, sqrt(2.0)/2, 1, 0, 0); if (igraph_ecount(&g) != igraph_vcount(&g) * (igraph_vcount(&g)1)/2) { return 2; } igraph_destroy(&g); /* Measure running time */ /* tps=sysconf(_SC_CLK_TCK); // clock ticks per second */ /* times(&time); start_time=time.tms_utime; */ /* for (i=0; i<runs; i++) { */ /* igraph_grg_game2(&g, n, r, 1); */ /* igraph_destroy(&g); */ /* } */ /* times(&time); current_time=time.tms_utime; */ /* fprintf(stdout," sorted: time=%.3fs\n",(current_timestart_time)/(double)tps); */ /* tps=sysconf(_SC_CLK_TCK); // clock ticks per second */ /* times(&time); start_time=time.tms_utime; */ /* for (i=0; i<runs; i++) { */ /* igraph_grg_game(&g, n, r, 1); */ /* igraph_destroy(&g); */ /* } */ /* times(&time); current_time=time.tms_utime; */ /* fprintf(stdout,"nonsorted: time=%.3fs\n", */ /* (current_timestart_time)/(double)tps); */ return 0; }
int igraph_barabasi_game(igraph_t *graph, igraph_integer_t n, igraph_real_t power, igraph_integer_t m, const igraph_vector_t *outseq, igraph_bool_t outpref, igraph_real_t A, igraph_bool_t directed, igraph_barabasi_algorithm_t algo, const igraph_t *start_from);
Arguments:

An uninitialized graph object. 


The number of vertices in the graph. 


Power of the preferential attachment. The probability
that a vertex is cited is proportional to d^power+A, where
d is its degree (see also the 


The number of outgoing edges generated for each
vertex. (Only if 


Gives the (out)degrees of the vertices. If this is
constant, this can be a NULL pointer or an empty (but
initialized!) vector, in this case 


Boolean, if true not only the in but also the outdegree of a vertex increases its citation probability. Ie. the citation probability is determined by the total degree of the vertices. 


The probability that a vertex is cited is proportional to
d^power+A, where d is its degree (see also the 


Boolean, whether to generate a directed graph. 


The algorithm to use to generate the network. Possible values:



Either a null pointer, or a graph. In the latter
case the graph as a starting configuration. The graph must
be nonempty, i.e. it must have at least one vertex. If a
graph is supplied here and the 
Returns:
Error code:

Time complexity: O(V+E), the number of vertices plus the number of edges.
Example 9.12. File examples/simple/igraph_barabasi_game.c
/* * mode: C * */ /* IGraph library. Copyright (C) 20062012 Gabor Csardi <csardi.gabor@gmail.com> 334 Harvard street, Cambridge, MA 02139 USA This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301 USA */ #include <igraph.h> int main() { igraph_t g; igraph_vector_t v, v2; int i, ret; igraph_barabasi_game(&g, 10, /*power=*/ 1, 2, 0, 0, /*A=*/ 1, 1, IGRAPH_BARABASI_BAG, /*start_from=*/ 0); if (igraph_ecount(&g) != 18) { return 1; } if (igraph_vcount(&g) != 10) { return 2; } if (!igraph_is_directed(&g)) { return 3; } igraph_vector_init(&v, 0); igraph_get_edgelist(&g, &v, 0); for (i=0; i<igraph_ecount(&g); i++) { if (VECTOR(v)[2*i] <= VECTOR(v)[2*i+1]) { return 4; } } igraph_destroy(&g); /* out degree sequence */ igraph_vector_resize(&v, 10); VECTOR(v)[0]=0; VECTOR(v)[1]=1; VECTOR(v)[2]=3; VECTOR(v)[3]=3; VECTOR(v)[4]=4; VECTOR(v)[5]=5; VECTOR(v)[6]=6; VECTOR(v)[7]=7; VECTOR(v)[8]=8; VECTOR(v)[9]=9; igraph_barabasi_game(&g, 10, /*power=*/ 1, 0, &v, 0, /*A=*/ 1, 1, IGRAPH_BARABASI_BAG, /*start_from=*/ 0); if (igraph_ecount(&g) != igraph_vector_sum(&v)) { return 5; } igraph_vector_init(&v2, 0); igraph_degree(&g, &v2, igraph_vss_all(), IGRAPH_OUT, 1); for (i=0; i<igraph_vcount(&g); i++) { if (VECTOR(v)[i] != VECTOR(v2)[i]) { igraph_vector_print(&v); printf("\n"); igraph_vector_print(&v2); return 6; } } igraph_vector_destroy(&v); igraph_vector_destroy(&v2); igraph_destroy(&g); /* outpref, we cannot really test this quantitatively, would need to set random seed */ igraph_barabasi_game(&g, 10, /*power=*/ 1, 2, 0, 1, /*A=*/ 1, 1, IGRAPH_BARABASI_BAG, /*start_from=*/ 0); igraph_vector_init(&v, 0); igraph_get_edgelist(&g, &v, 0); for (i=0; i<igraph_ecount(&g); i++) { if (VECTOR(v)[2*i] <= VECTOR(v)[2*i+1]) { return 7; } } if (!igraph_is_directed(&g)) { return 8; } igraph_vector_destroy(&v); igraph_destroy(&g); /* Error tests */ igraph_set_error_handler(igraph_error_handler_ignore); ret=igraph_barabasi_game(&g, 10, /*power=*/ 1, 1, 0, 0, /*A=*/ 1, 0, IGRAPH_BARABASI_BAG, /*start_from=*/ 0); if (ret != IGRAPH_EINVAL) { return 9; } ret=igraph_barabasi_game(&g, 10, /*power=*/ 1, 2, 0, 0, /*A=*/ 1, 0, IGRAPH_BARABASI_BAG, /*start_from=*/ 0); if (ret != IGRAPH_EINVAL) { return 10; } igraph_vector_init(&v, 9); ret=igraph_barabasi_game(&g, 10, /*power=*/ 1, 0, &v, 0, /*A=*/ 1, 0, IGRAPH_BARABASI_BAG, /*start_from=*/ 0); if (ret != IGRAPH_EINVAL) { return 11; } igraph_vector_destroy(&v); return 0; }
Example 9.13. File examples/simple/igraph_barabasi_game2.c
/* * mode: C * */ /* IGraph library. Copyright (C) 20102012 Gabor Csardi <csardi.gabor@gmail.com> 334 Harvard street, Cambridge, MA 02139 USA This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301 USA */ #include <igraph.h> #include <stdio.h> int main() { igraph_t g; igraph_bool_t simple; igraph_barabasi_game(/* graph= */ &g, /* n= */ 100, /* power= */ 1.0, /* m= */ 2, /* outseq= */ 0, /* outpref= */ 0, /* A= */ 1.0, /* directed= */ IGRAPH_DIRECTED, /* algo= */ IGRAPH_BARABASI_PSUMTREE, /* start_from= */ 0); if (igraph_ecount(&g) != 197) { return 1; } if (igraph_vcount(&g) != 100) { return 2; } igraph_is_simple(&g, &simple); if (!simple) { return 3; } igraph_destroy(&g); /* ============================== */ igraph_barabasi_game(/* graph= */ &g, /* n= */ 100, /* power= */ 1.0, /* m= */ 2, /* outseq= */ 0, /* outpref= */ 0, /* A= */ 1.0, /* directed= */ IGRAPH_DIRECTED, /* algo= */ IGRAPH_BARABASI_PSUMTREE_MULTIPLE, /* start_from= */ 0); if (igraph_ecount(&g) != 198) { return 4; } if (igraph_vcount(&g) != 100) { return 5; } igraph_is_simple(&g, &simple); if (simple) { return 6; } igraph_destroy(&g); /* ============================== */ igraph_barabasi_game(/* graph= */ &g, /* n= */ 100, /* power= */ 1.0, /* m= */ 2, /* outseq= */ 0, /* outpref= */ 0, /* A= */ 1.0, /* directed= */ IGRAPH_DIRECTED, /* algo= */ IGRAPH_BARABASI_BAG, /* start_from= */ 0); if (igraph_ecount(&g) != 198) { return 7; } if (igraph_vcount(&g) != 100) { return 8; } igraph_is_simple(&g, &simple); if (simple) { return 9; } igraph_destroy(&g); return 0; }
int igraph_erdos_renyi_game(igraph_t *graph, igraph_erdos_renyi_t type, igraph_integer_t n, igraph_real_t p_or_m, igraph_bool_t directed, igraph_bool_t loops);
Arguments:

Pointer to an uninitialized graph object. 


The type of the random graph, possible values:



The number of vertices in the graph. 


This is the p parameter for G(n,p) graphs and the m parameter for G(n,m) graphs. 


Logical, whether to generate a directed graph. 


Logical, whether to generate loops (self) edges. 
Returns:
Error code:

Time complexity: O(V+E), the number of vertices plus the number of edges in the graph.
See also:
Example 9.14. File examples/simple/igraph_erdos_renyi_game.c
/* * mode: C * */ /* IGraph library. Copyright (C) 20062012 Gabor Csardi <csardi.gabor@gmail.com> 334 Harvard st, Cambridge MA, 02139 USA This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301 USA */ #include <igraph.h> int main() { igraph_t g; int i; igraph_bool_t simple; /* G(n,p) */ igraph_erdos_renyi_game(&g, IGRAPH_ERDOS_RENYI_GNP, 10, 0.0, IGRAPH_UNDIRECTED, IGRAPH_NO_LOOPS); if (igraph_ecount(&g) != 0) { return 1; } if (igraph_is_directed(&g)) { return 2; } igraph_destroy(&g); igraph_erdos_renyi_game(&g, IGRAPH_ERDOS_RENYI_GNP, 10, 1.0, IGRAPH_DIRECTED, IGRAPH_NO_LOOPS); if (igraph_ecount(&g) != 10*9) { return 3; } if (!igraph_is_directed(&g)) { return 4; } igraph_destroy(&g); /* More useful tests */ /* printf("directed with loops\n"); */ for (i=0; i<100; i++) { igraph_erdos_renyi_game(&g, IGRAPH_ERDOS_RENYI_GNP, 10, 0.9999999, IGRAPH_DIRECTED, IGRAPH_LOOPS); if (igraph_vcount(&g) != 10) { return 5; } if (igraph_ecount(&g) != 10*10) { return 77; } igraph_simplify(&g, /*multiple=*/0, /*loops=*/1, /*edge_comb=*/ 0); if (igraph_ecount(&g) != 10*9) { return 77; } igraph_destroy(&g); } /* printf("directed without loops\n"); */ for (i=0; i<100; i++) { igraph_erdos_renyi_game(&g, IGRAPH_ERDOS_RENYI_GNP, 10, 0.9999999, IGRAPH_DIRECTED, IGRAPH_NO_LOOPS); if (igraph_vcount(&g) != 10) { return 7; } if (igraph_ecount(&g) != 10*(101)) { return 77; } igraph_simplify(&g, /*multiple=*/0, /*loops=*/1, /*edge_comb=*/ 0); if (igraph_ecount(&g) != 10*9) { return 77; } igraph_destroy(&g); } /* printf("undirected with loops\n"); */ for (i=0; i<100; i++) { igraph_erdos_renyi_game(&g, IGRAPH_ERDOS_RENYI_GNP, 10, 0.9999999, IGRAPH_UNDIRECTED, IGRAPH_LOOPS); if (igraph_vcount(&g) != 10) { return 9; } if (igraph_ecount(&g) != 10*(10+1)/2) { return 77; } igraph_simplify(&g, /*multiple=*/0, /*loops=*/1, /*edge_comb=*/ 0); if (igraph_ecount(&g) != 10*(101)/2) { return 77; } igraph_destroy(&g); } /* printf("undirected without loops\n"); */ for (i=0; i<100; i++) { igraph_erdos_renyi_game(&g, IGRAPH_ERDOS_RENYI_GNP, 10, 0.9999999, IGRAPH_UNDIRECTED, IGRAPH_NO_LOOPS); if (igraph_vcount(&g) != 10) { return 11; } if (igraph_ecount(&g) != 10*(101)/2) { return 77; } igraph_simplify(&g, /*multiple=*/0, /*loops=*/1, /*edge_comb=*/ 0); if (igraph_ecount(&g) != 10*(101)/2) { return 77; } igraph_destroy(&g); } /* Create a couple of large graphs too */ igraph_erdos_renyi_game(&g, IGRAPH_ERDOS_RENYI_GNP, 100000, 2.0/100000, IGRAPH_UNDIRECTED, IGRAPH_NO_LOOPS); if (igraph_vcount(&g) != 100000) { return 25; } igraph_destroy(&g); igraph_erdos_renyi_game(&g, IGRAPH_ERDOS_RENYI_GNP, 100000, 2.0/100000, IGRAPH_DIRECTED, IGRAPH_NO_LOOPS); if (igraph_vcount(&g) != 100000) { return 25; } igraph_destroy(&g); igraph_erdos_renyi_game(&g, IGRAPH_ERDOS_RENYI_GNP, 100000, 2.0/100000, IGRAPH_UNDIRECTED, IGRAPH_LOOPS); if (igraph_vcount(&g) != 100000) { return 25; } igraph_destroy(&g); igraph_erdos_renyi_game(&g, IGRAPH_ERDOS_RENYI_GNP, 100000, 2.0/100000, IGRAPH_DIRECTED, IGRAPH_LOOPS); if (igraph_vcount(&g) != 100000) { return 25; } igraph_destroy(&g); /*  */ /* G(n,m) */ igraph_erdos_renyi_game(&g, IGRAPH_ERDOS_RENYI_GNM, 10, 0.5, IGRAPH_DIRECTED, IGRAPH_NO_LOOPS); igraph_destroy(&g); /* More useful tests */ /* printf("directed with loops\n"); */ for (i=0; i<100; i++) { long int ec; igraph_erdos_renyi_game(&g, IGRAPH_ERDOS_RENYI_GNM, 10, 10*101, IGRAPH_DIRECTED, IGRAPH_LOOPS); if (igraph_vcount(&g) != 10) { return 13; } if (igraph_ecount(&g) != 10*101) { return 14; } igraph_simplify(&g, /*multiple=*/0, /*loops=*/1, /*edge_comb=*/ 0); igraph_is_simple(&g, &simple); if (!simple) { return 27; } ec=igraph_ecount(&g); if (ec != 10*9 && ec != 10*91) { return 15; } igraph_destroy(&g); } /* printf("directed without loops\n"); */ for (i=0; i<100; i++) { igraph_erdos_renyi_game(&g, IGRAPH_ERDOS_RENYI_GNM, 10, 10*91, IGRAPH_DIRECTED, IGRAPH_NO_LOOPS); igraph_is_simple(&g, &simple); if (!simple) { return 28; } if (igraph_vcount(&g) != 10) { return 16; } if (igraph_ecount(&g) != 10*(101)1) { return 17; } igraph_simplify(&g, /*multiple=*/0, /*loops=*/1, /*edge_comb=*/ 0); if (igraph_ecount(&g) != 10*91) { return 18; } igraph_destroy(&g); } /* printf("undirected with loops\n"); */ for (i=0; i<100; i++) { long int ec; igraph_erdos_renyi_game(&g, IGRAPH_ERDOS_RENYI_GNM, 10, 10*11/21, IGRAPH_UNDIRECTED, IGRAPH_LOOPS); if (igraph_vcount(&g) != 10) { return 19; } if (igraph_ecount(&g) != 10*(10+1)/21) { return 20; } igraph_simplify(&g, /*multiple=*/0, /*loops=*/1, /*edge_comb=*/ 0); igraph_is_simple(&g, &simple); if (!simple) { return 29; } ec=igraph_ecount(&g); if (ec != 10*(101)/2 && ec != 10*9/21) { return 21; } igraph_destroy(&g); } /* printf("undirected without loops\n"); */ for (i=0; i<100; i++) { igraph_erdos_renyi_game(&g, IGRAPH_ERDOS_RENYI_GNM, 10, 10*9/21, IGRAPH_UNDIRECTED, IGRAPH_NO_LOOPS); igraph_is_simple(&g, &simple); if (!simple) { return 30; } if (igraph_vcount(&g) != 10) { return 22; } if (igraph_ecount(&g) != 10*(101)/21) { return 23; } igraph_simplify(&g, /*multiple=*/0, /*loops=*/1, /*edge_comb=*/ 0); if (igraph_ecount(&g) != 10*(101)/21) { return 24; } igraph_destroy(&g); } /* Create a couple of large graphs too */ igraph_erdos_renyi_game(&g, IGRAPH_ERDOS_RENYI_GNM, 100000, 2.0*100000, IGRAPH_UNDIRECTED, IGRAPH_NO_LOOPS); if (igraph_vcount(&g) != 100000) { return 26; } if (igraph_ecount(&g) != 200000) { return 26; } igraph_is_simple(&g, &simple); if (!simple) { return 31; } igraph_destroy(&g); igraph_erdos_renyi_game(&g, IGRAPH_ERDOS_RENYI_GNM, 100000, 2.0*100000, IGRAPH_DIRECTED, IGRAPH_NO_LOOPS); igraph_is_simple(&g, &simple); if (!simple) { return 32; } if (igraph_vcount(&g) != 100000) { return 26; } if (igraph_ecount(&g) != 200000) { return 26; } igraph_destroy(&g); igraph_erdos_renyi_game(&g, IGRAPH_ERDOS_RENYI_GNM, 100000, 2.0*100000, IGRAPH_UNDIRECTED, IGRAPH_LOOPS); if (igraph_vcount(&g) != 100000) { return 26; } if (igraph_ecount(&g) != 200000) { return 26; } igraph_simplify(&g, 0, 1, /*edge_comb=*/ 0); /* only remove loops */ igraph_is_simple(&g, &simple); if (!simple) { return 33; } igraph_destroy(&g); igraph_erdos_renyi_game(&g, IGRAPH_ERDOS_RENYI_GNM, 100000, 2.0*100000, IGRAPH_DIRECTED, IGRAPH_LOOPS); if (igraph_vcount(&g) != 100000) { return 26; } if (igraph_ecount(&g) != 200000) { return 26; } igraph_simplify(&g, 0, 1, /*edge_comb=*/ 0); /* only remove loops */ igraph_is_simple(&g, &simple); if (!simple) { return 34; } igraph_destroy(&g); return 0; }
int igraph_watts_strogatz_game(igraph_t *graph, igraph_integer_t dim, igraph_integer_t size, igraph_integer_t nei, igraph_real_t p, igraph_bool_t loops, igraph_bool_t multiple);
This function generates a graph according to the WattsStrogatz model of smallworld networks. The graph is obtained by creating a circular undirected lattice and then rewire the edges randomly with a constant probability.
See also: Duncan J Watts and Steven H Strogatz: Collective dynamics of “small world” networks, Nature 393, 440442, 1998.
Arguments:

The graph to initialize. 

The dimension of the lattice. 

The size of the lattice along each dimension. 

The size of the neighborhood for each vertex. This is
the same as the 

The rewiring probability. A real number between zero and one (inclusive). 

Logical, whether to generate loop edges. 

Logical, whether to allow multiple edges in the generated graph. 
Returns:
Error code. 
See also:

Time complexity: O(V*d^o+E), V and E are the number of
vertices and edges, d is the average degree, o is the nei
argument.
int igraph_rewire_edges(igraph_t *graph, igraph_real_t prob, igraph_bool_t loops, igraph_bool_t multiple);
This function rewires the edges of a graph with a constant
probability. More precisely each end point of each edge is rewired
to a uniformly randomly chosen vertex with constant probability prob
.
Note that this function modifies the input graph
,
call igraph_copy()
if you want to keep it.
Arguments:

The input graph, this will be rewired, it can be directed or undirected. 

The rewiring probability a constant between zero and one (inclusive). 

Boolean, whether loop edges are allowed in the new graph, or not. 

Boolean, whether multiple edges are allowed in the new graph. 
Returns:
Error code. 
See also:

Time complexity: O(V+E).
int igraph_degree_sequence_game(igraph_t *graph, const igraph_vector_t *out_deg, const igraph_vector_t *in_deg, igraph_degseq_t method);
Arguments:

Pointer to an uninitialized graph object. 


The degree sequence for an undirected graph (if



It is either a zerolength vector or



The method to generate the graph. Possible values:

Returns:
Error code:

Time complexity: O(V+E), the number of vertices plus the number of edges
for IGRAPH_DEGSEQ_SIMPLE
. The time complexity of the
other modes is not known.
See also:

Example 9.15. File examples/simple/igraph_degree_sequence_game.c
/* * mode: C * */ /* IGraph library. Copyright (C) 20062012 Gabor Csardi <csardi.gabor@gmail.com> 334 Harvard street, Cambridge, MA 02139 USA This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301 USA */ #include <igraph.h> int main() { igraph_t g; igraph_vector_t outdeg, indeg, vec; igraph_bool_t is_simple; igraph_vector_init_real(&outdeg, 10, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0); igraph_vector_init_real(&indeg, 10, 4.0, 4.0, 2.0, 2.0, 4.0, 4.0, 2.0, 2.0, 3.0, 3.0); igraph_vector_init(&vec, 0); /* checking the simple method, undirected graphs */ igraph_degree_sequence_game(&g, &outdeg, 0, IGRAPH_DEGSEQ_SIMPLE); if (igraph_is_directed(&g)  igraph_vcount(&g) != 10) return 1; if (igraph_degree(&g, &vec, igraph_vss_all(), IGRAPH_OUT, 1)) return 2; igraph_vector_print(&vec); igraph_destroy(&g); /* checking the VigerLatapy method, undirected graphs */ igraph_degree_sequence_game(&g, &outdeg, 0, IGRAPH_DEGSEQ_VL); if (igraph_is_directed(&g)  igraph_vcount(&g) != 10) return 3; if (igraph_is_simple(&g, &is_simple)  !is_simple) return 4; if (igraph_degree(&g, &vec, igraph_vss_all(), IGRAPH_OUT, 0)) return 5; igraph_vector_print(&vec); igraph_destroy(&g); /* checking the simple method, directed graphs */ igraph_degree_sequence_game(&g, &outdeg, &indeg, IGRAPH_DEGSEQ_SIMPLE); if (!igraph_is_directed(&g)  igraph_vcount(&g) != 10) return 6; if (igraph_degree(&g, &vec, igraph_vss_all(), IGRAPH_OUT, 1)) return 7; igraph_vector_print(&vec); if (igraph_degree(&g, &vec, igraph_vss_all(), IGRAPH_IN, 1)) return 8; igraph_vector_print(&vec); igraph_destroy(&g); /* checking the no multiple edges method, undirected graphs */ igraph_degree_sequence_game(&g, &outdeg, 0, IGRAPH_DEGSEQ_SIMPLE_NO_MULTIPLE); if (igraph_is_directed(&g)  igraph_vcount(&g) != 10) return 9; if (igraph_is_simple(&g, &is_simple)  !is_simple) return 10; if (igraph_degree(&g, &vec, igraph_vss_all(), IGRAPH_OUT, 1)) return 11; igraph_vector_print(&vec); igraph_destroy(&g); /* checking the no multiple edges method, directed graphs */ igraph_degree_sequence_game(&g, &outdeg, &indeg, IGRAPH_DEGSEQ_SIMPLE_NO_MULTIPLE); if (!igraph_is_directed(&g)  igraph_vcount(&g) != 10) return 12; if (igraph_is_simple(&g, &is_simple)  !is_simple) return 13; if (igraph_degree(&g, &vec, igraph_vss_all(), IGRAPH_OUT, 1)) return 14; igraph_vector_print(&vec); if (igraph_degree(&g, &vec, igraph_vss_all(), IGRAPH_IN, 1)) return 15; igraph_vector_print(&vec); igraph_destroy(&g); igraph_vector_destroy(&vec); igraph_vector_destroy(&outdeg); igraph_vector_destroy(&indeg); return 0; }
int igraph_k_regular_game(igraph_t *graph, igraph_integer_t no_of_nodes, igraph_integer_t k, igraph_bool_t directed, igraph_bool_t multiple);
This game generates a directed or undirected random graph where the degrees of vertices are equal to a predefined constant k. For undirected graphs, at least one of k and the number of vertices must be even.
The game simply uses igraph_degree_sequence_game
with appropriately
constructed degree sequences.
Arguments:

Pointer to an uninitialized graph object. 

The number of nodes in the generated graph. 

The degree of each vertex in an undirected graph, or the outdegree and indegree of each vertex in a directed graph. 

Whether the generated graph will be directed. 

Whether to allow multiple edges in the generated graph. 
Returns:
Error code:

Time complexity: O(V+E) if multiple
is true, otherwise not known.
int igraph_static_fitness_game(igraph_t *graph, igraph_integer_t no_of_edges, igraph_vector_t* fitness_out, igraph_vector_t* fitness_in, igraph_bool_t loops, igraph_bool_t multiple);
proportional to node fitness scores. This game generates a directed or undirected random graph where the probability of an edge between vertices i and j depends on the fitness scores of the two vertices involved. For undirected graphs, each vertex has a single fitness score. For directed graphs, each vertex has an out and an infitness, and the probability of an edge from i to j depends on the outfitness of vertex i and the infitness of vertex j.
The generation process goes as follows. We start from N disconnected nodes (where N is given by the length of the fitness vector). Then we randomly select two vertices i and j, with probabilities proportional to their fitnesses. (When the generated graph is directed, i is selected according to the outfitnesses and j is selected according to the infitnesses). If the vertices are not connected yet (or if multiple edges are allowed), we connect them; otherwise we select a new pair. This is repeated until the desired number of links are created.
It can be shown that the expected degree of each vertex will be
proportional to its fitness, although the actual, observed degree will not
be. If you need to generate a graph with an exact degree sequence, consider
igraph_degree_sequence_game
instead.
This model is commonly used to generate static scalefree networks. To
achieve this, you have to draw the fitness scores from the desired powerlaw
distribution. Alternatively, you may use igraph_static_power_law_game
which generates the fitnesses for you with a given exponent.
Reference: Goh KI, Kahng B, Kim D: Universal behaviour of load distribution in scalefree networks. Phys Rev Lett 87(27):278701, 2001.
Arguments:

Pointer to an uninitialized graph object. 

A numeric vector containing the fitness of each vertex. For directed graphs, this specifies the outfitness of each vertex. 

If 

The number of edges in the generated graph. 

Whether to allow loop edges in the generated graph. 

Whether to allow multiple edges in the generated graph. 
Returns:
Error code:

Time complexity: O(V + E log E).
int igraph_static_power_law_game(igraph_t *graph, igraph_integer_t no_of_nodes, igraph_integer_t no_of_edges, igraph_real_t exponent_out, igraph_real_t exponent_in, igraph_bool_t loops, igraph_bool_t multiple, igraph_bool_t finite_size_correction);
This game generates a directed or undirected random graph where the degrees of vertices follow powerlaw distributions with prescribed exponents. For directed graphs, the exponents of the in and outdegree distributions may be specified separately.
The game simply uses igraph_static_fitness_game
with appropriately
constructed fitness vectors. In particular, the fitness of vertex i
is i^{alpha}, where alpha = 1/(gamma1)
and gamma is the exponent given in the arguments.
To remove correlations between in and outdegrees in case of directed
graphs, the infitness vector will be shuffled after it has been set up
and before igraph_static_fitness_game
is called.
Note that significant finite size effects may be observed for exponents smaller than 3 in the original formulation of the game. This function provides an argument that lets you remove the finite size effects by assuming that the fitness of vertex i is (i+i01)^{alpha}, where i0 is a constant chosen appropriately to ensure that the maximum degree is less than the square root of the number of edges times the average degree; see the paper of Chung and Lu, and Cho et al for more details.
References:
Goh KI, Kahng B, Kim D: Universal behaviour of load distribution in scalefree networks. Phys Rev Lett 87(27):278701, 2001.
Chung F and Lu L: Connected components in a random graph with given degree sequences. Annals of Combinatorics 6, 125145, 2002.
Cho YS, Kim JS, Park J, Kahng B, Kim D: Percolation transitions in scalefree networks under the Achlioptas process. Phys Rev Lett 103:135702, 2009.
Arguments:

Pointer to an uninitialized graph object. 

The number of nodes in the generated graph. 

The number of edges in the generated graph. 

The power law exponent of the degree distribution.
For directed graphs, this specifies the exponent of the
outdegree distribution. It must be greater than or
equal to 2. If you pass 

If negative, the generated graph will be undirected. If greater than or equal to 2, this argument specifies the exponent of the indegree distribution. If nonnegative but less than 2, an error will be generated. 

Whether to allow loop edges in the generated graph. 

Whether to allow multiple edges in the generated graph. 

Whether to use the proposed finite size correction of Cho et al. 
Returns:
Error code:

Time complexity: O(V + E log E).
int igraph_forest_fire_game(igraph_t *graph, igraph_integer_t nodes, igraph_real_t fw_prob, igraph_real_t bw_factor, igraph_integer_t pambs, igraph_bool_t directed);
The forest fire model intends to reproduce the following network characteristics, observed in real networks:
Heavytailed indegree distribution.
Heavytailed outdegree distribution.
Communities.
Densification powerlaw. The network is densifying in time, according to a powerlaw rule.
Shrinking diameter. The diameter of the network decreases in time.
The network is generated in the following way. One vertex is added at
a time. This vertex connects to (cites) ambs
vertices already
present in the network, chosen uniformly random. Now, for each cited
vertex v
we do the following procedure:
We generate two random number, x
and y
, that are
geometrically distributed with means p/(1p)
and
rp(1rp)
. ( p
is fw_prob
, r
is
bw_factor
.) The new vertex cites x
outgoing neighbors
and y
incoming neighbors of v
, from those which are
not yet cited by the new vertex. If there are less than x
or
y
such vertices available then we cite all of them.
The same procedure is applied to all the newly cited vertices.
See also: Jure Leskovec, Jon Kleinberg and Christos Faloutsos. Graphs over time: densification laws, shrinking diameters and possible explanations. KDD '05: Proceeding of the eleventh ACM SIGKDD international conference on Knowledge discovery in data mining , 177187, 2005.
Note however, that the version of the model in the published paper is incorrect in the sense that it cannot generate the kind of graphs the authors claim. A corrected version is available from http://cs.stanford.edu/people/jure/pubs/powergrowthtkdd.pdf , our implementation is based on this.
Arguments:

Pointer to an uninitialized graph object. 

The number of vertices in the graph. 

The forward burning probability. 

The backward burning ratio. The backward burning
probability is calculated as 

The number of ambassador vertices. 

Whether to create a directed graph. 
Returns:
Error code. 
Time complexity: TODO.
int igraph_rewire(igraph_t *graph, igraph_integer_t n, igraph_rewiring_t mode);
This function generates a new graph based on the original one by randomly
rewiring edges while preserving the original graph's degree distribution.
Please note that the rewiring is done "in place", so no new graph will
be allocated. If you would like to keep the original graph intact, use
igraph_copy()
beforehand.
Arguments:

The graph object to be rewired. 


Number of rewiring trials to perform. 


The rewiring algorithm to be used. It can be one of the following:

Returns:
Error code:

Time complexity: TODO.
Example 9.16. File examples/simple/igraph_rewire.c
/* * mode: C * */ /* IGraph library. Copyright (C) 20062012 Gabor Csardi <csardi.gabor@gmail.com> 334 Harvard st, Cambridge MA, 02139 USA This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301 USA */ #include <igraph.h> int main() { igraph_t g; igraph_vector_t res; long i, n; igraph_tree(&g, 10, 3, IGRAPH_TREE_OUT); igraph_rewire(&g, 1000, IGRAPH_REWIRING_SIMPLE); n=igraph_vcount(&g); igraph_vector_init(&res, 0); igraph_degree(&g, &res, igraph_vss_all(), IGRAPH_IN, 0); for (i=0; i<n; i++) printf("%ld ", (long)igraph_vector_e(&res, i)); printf("\n"); igraph_degree(&g, &res, igraph_vss_all(), IGRAPH_OUT, 0); for (i=0; i<n; i++) printf("%ld ", (long)igraph_vector_e(&res, i)); printf("\n"); igraph_destroy(&g); igraph_vector_destroy(&res); return 0; }
int igraph_growing_random_game(igraph_t *graph, igraph_integer_t n, igraph_integer_t m, igraph_bool_t directed, igraph_bool_t citation);
This function simulates a growing random graph. In each discrete time step a new vertex is added and a number of new edges are also added. These graphs are known to be different from standard (not growing) random graphs.
Arguments:

Uninitialized graph object. 

The number of vertices in the graph. 

The number of edges to add in a time step (ie. after adding a vertex). 

Boolean, whether to generate a directed graph. 

Boolean, if 
Returns:
Error code:

Time complexity: O(V+E), the number of vertices plus the number of edges.
Example 9.17. File examples/simple/igraph_growing_random_game.c
/* * mode: C * */ /* IGraph library. Copyright (C) 20062012 Gabor Csardi <csardi.gabor@gmail.com> 334 Harvard st, Cambridge MA, 02139 USA This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301 USA */ #include <igraph.h> int main() { return 0; }
int igraph_callaway_traits_game (igraph_t *graph, igraph_integer_t nodes, igraph_integer_t types, igraph_integer_t edges_per_step, igraph_vector_t *type_dist, igraph_matrix_t *pref_matrix, igraph_bool_t directed);
The different types of vertices prefer to connect other types of vertices with a given probability.
The simulation goes like this: in each discrete time step a new
vertex is added to the graph. The type of this vertex is generated
based on type_dist
. Then two vertices are selected uniformly
randomly from the graph. The probability that they will be
connected depends on the types of these vertices and is taken from
pref_matrix
. Then another two vertices are selected and this is
repeated edges_per_step
times in each time step.
Arguments:

Pointer to an uninitialized graph. 

The number of nodes in the graph. 

Number of node types. 

The number of edges to be add per time step. 

Vector giving the distribution of the vertex types. 

Matrix giving the connection probabilities for the vertex types. 

Logical, whether to generate a directed graph. 
Returns:
Error code. 
Added in version 0.2.
Time complexity: O(Ve*log(V)), V is the number of vertices, e
is edges_per_step
.
int igraph_establishment_game(igraph_t *graph, igraph_integer_t nodes, igraph_integer_t types, igraph_integer_t k, igraph_vector_t *type_dist, igraph_matrix_t *pref_matrix, igraph_bool_t directed);
The simulation goes like this: a single vertex is added at each
time step. This new vertex tries to connect to k
vertices in the
graph. The probability that such a connection is realized depends
on the types of the vertices involved.
Arguments:

Pointer to an uninitialized graph. 

The number of vertices in the graph. 

The number of vertex types. 

The number of connections tried in each time step. 

Vector giving the distribution of vertex types. 

Matrix giving the connection probabilities for different vertex types. 

Logical, whether to generate a directed graph. 
Returns:
Error code. 
Added in version 0.2.
Time complexity: O(V*k*log(V)), V is the number of vertices
and k is the k
parameter.
int igraph_preference_game(igraph_t *graph, igraph_integer_t nodes, igraph_integer_t types, const igraph_vector_t *type_dist, igraph_bool_t fixed_sizes, const igraph_matrix_t *pref_matrix, igraph_vector_t *node_type_vec, igraph_bool_t directed, igraph_bool_t loops);
This is practically the nongrowing variant of igraph_establishment_game
. A given number of vertices are
generated. Every vertex is assigned to a vertex type according to
the given type probabilities. Finally, every
vertex pair is evaluated and an edge is created between them with a
probability depending on the types of the vertices involved.
In other words, this function generates a graph according to a blockmodel. Vertices are divided into groups (or blocks), and the probability the two vertices are connected depends on their groups only.
Arguments:

Pointer to an uninitialized graph. 

The number of vertices in the graph. 

The number of vertex types. 

Vector giving the distribution of vertex types. If


Boolean. If true, then the number of vertices with a
given vertex type is fixed and the 

Matrix giving the connection probabilities for different vertex types. This should be symmetric if the requested graph is undirected. 

A vector where the individual generated vertex types
will be stored. If 

Logical, whether to generate a directed graph. If undirected graphs are requested, only the lower left triangle of the preference matrix is considered. 

Logical, whether loop edges are allowed. 
Returns:
Error code. 
Added in version 0.3.
Time complexity: O(V+E), the number of vertices plus the number of edges in the graph.
See also:
igraph_establishment_game() 
Example 9.18. File examples/simple/igraph_preference_game.c
/* * mode: C * */ /* IGraph library. Copyright (C) 20062012 Gabor Csardi <csardi.gabor@gmail.com> 334 Harvard st, Cambridge MA, 02139 USA This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301 USA */ #include <igraph.h> #include <assert.h> int main() { igraph_t g; igraph_vector_t tdist; igraph_matrix_t pmat; igraph_bool_t conn; igraph_vector_bool_t bs; int i; /* Symmetric preference game */ igraph_vector_bool_init(&bs, 0); igraph_vector_init_real(&tdist, 3, 1.0, 1.0, 1.0); igraph_matrix_init(&pmat, 3, 3); for (i=0; i<3; i++) MATRIX(pmat, i, i) = 0.2; /* undirected, no loops */ IGRAPH_CHECK(igraph_preference_game(&g, 1000, 3, &tdist, /*fixed_sizes=*/ 0, &pmat, 0, 0, 0)); if (igraph_vcount(&g) != 1000) return 18; if (igraph_is_directed(&g)) return 2; igraph_is_connected(&g, &conn, IGRAPH_STRONG); if (conn) return 3; igraph_is_loop(&g, &bs, igraph_ess_all(IGRAPH_EDGEORDER_ID)); if (igraph_vector_bool_sum(&bs)) return 4; igraph_is_multiple(&g, &bs, igraph_ess_all(IGRAPH_EDGEORDER_ID)); if (igraph_vector_bool_sum(&bs)) return 5; igraph_destroy(&g); for (i=0; i<2; i++) MATRIX(pmat, i, i+1) = 0.1; /* directed, no loops */ IGRAPH_CHECK(igraph_preference_game(&g, 1000, 3, &tdist, /*fixed_sizes=*/0, &pmat, 0, 1, 0)); if (igraph_vcount(&g) != 1000) return 17; if (!igraph_is_directed(&g)) return 6; igraph_is_loop(&g, &bs, igraph_ess_all(IGRAPH_EDGEORDER_ID)); if (igraph_vector_bool_sum(&bs)) return 7; igraph_is_multiple(&g, &bs, igraph_ess_all(IGRAPH_EDGEORDER_ID)); if (igraph_vector_bool_sum(&bs)) return 8; igraph_destroy(&g); /* undirected, loops */ for (i=0; i<3; i++) MATRIX(pmat, i, i) = 1.0; IGRAPH_CHECK(igraph_preference_game(&g, 100, 3, &tdist, /*fixed_sizes=*/ 0, &pmat, 0, 0, 1)); if (igraph_vcount(&g) != 100) return 16; if (igraph_ecount(&g) < 1395) return 20; if (igraph_is_directed(&g)) return 9; igraph_is_loop(&g, &bs, igraph_ess_all(IGRAPH_EDGEORDER_ID)); if (igraph_vector_bool_sum(&bs) == 0) return 10; igraph_is_multiple(&g, &bs, igraph_ess_all(IGRAPH_EDGEORDER_ID)); if (igraph_vector_bool_sum(&bs)) return 11; igraph_destroy(&g); /* directed, loops */ IGRAPH_CHECK(igraph_preference_game(&g, 100, 3, &tdist, /*fixed_sizes=*/ 0, &pmat, 0, 1, 1)); if (igraph_vcount(&g) != 100) return 15; if (igraph_ecount(&g) < 2700) return 19; if (!igraph_is_directed(&g)) return 12; igraph_is_loop(&g, &bs, igraph_ess_all(IGRAPH_EDGEORDER_ID)); if (igraph_vector_bool_sum(&bs) == 0) return 13; igraph_is_multiple(&g, &bs, igraph_ess_all(IGRAPH_EDGEORDER_ID)); if (igraph_vector_bool_sum(&bs)) return 14; igraph_destroy(&g); /* Asymmetric preference game */ /* directed, no loops */ igraph_matrix_resize(&pmat, 2, 2); MATRIX(pmat, 0, 0) = 1; MATRIX(pmat, 0, 1) = 1; MATRIX(pmat, 1, 0) = 1; MATRIX(pmat, 1, 1) = 1; IGRAPH_CHECK(igraph_asymmetric_preference_game(&g, 100, 2, 0, &pmat, 0, 0, 0)); if (igraph_vcount(&g) != 100) return 21; if (igraph_ecount(&g) != 9900) return 22; if (!igraph_is_directed(&g)) return 23; igraph_is_loop(&g, &bs, igraph_ess_all(IGRAPH_EDGEORDER_ID)); if (igraph_vector_bool_sum(&bs)) return 24; igraph_is_multiple(&g, &bs, igraph_ess_all(IGRAPH_EDGEORDER_ID)); if (igraph_vector_bool_sum(&bs)) return 25; igraph_destroy(&g); /* directed, loops */ igraph_matrix_resize(&pmat, 2, 2); MATRIX(pmat, 0, 0) = 1; MATRIX(pmat, 0, 1) = 1; MATRIX(pmat, 1, 0) = 1; MATRIX(pmat, 1, 1) = 1; IGRAPH_CHECK(igraph_asymmetric_preference_game(&g, 100, 2, 0, &pmat, 0, 0, 1)); if (igraph_vcount(&g) != 100) return 26; if (igraph_ecount(&g) != 10000) return 27; if (!igraph_is_directed(&g)) return 28; igraph_is_loop(&g, &bs, igraph_ess_all(IGRAPH_EDGEORDER_ID)); if (igraph_vector_bool_sum(&bs) != 100) return 29; igraph_is_multiple(&g, &bs, igraph_ess_all(IGRAPH_EDGEORDER_ID)); if (igraph_vector_bool_sum(&bs)) return 30; igraph_destroy(&g); igraph_vector_destroy(&tdist); igraph_matrix_destroy(&pmat); igraph_vector_bool_destroy(&bs); assert(IGRAPH_FINALLY_STACK_EMPTY); return 0; }
int igraph_asymmetric_preference_game(igraph_t *graph, igraph_integer_t nodes, igraph_integer_t types, igraph_matrix_t *type_dist_matrix, igraph_matrix_t *pref_matrix, igraph_vector_t *node_type_in_vec, igraph_vector_t *node_type_out_vec, igraph_bool_t loops);
This is the asymmetric variant of igraph_preference_game()
.
A given number of vertices are generated. Every vertex is assigned to an
"incoming" and an "outgoing" vertex type according to the given joint
type probabilities. Finally, every vertex pair is evaluated and a
directed edge is created between them with a probability depending on the
"outgoing" type of the source vertex and the "incoming" type of the target
vertex.
Arguments:

Pointer to an uninitialized graph. 

The number of vertices in the graph. 

The number of vertex types. 

Matrix giving the joint distribution of vertex types. If null, incoming and outgoing vertex types are independent and uniformly distributed. 

Matrix giving the connection probabilities for different vertex types. 

A vector where the individual generated "incoming" vertex types will be stored. If NULL, the vertex types won't be saved. 

A vector where the individual generated "outgoing" vertex types will be stored. If NULL, the vertex types won't be saved. 

Logical, whether loop edges are allowed. 
Returns:
Error code. 
Added in version 0.3.
Time complexity: O(V+E), the number of vertices plus the number of edges in the graph.
See also:
int igraph_recent_degree_game(igraph_t *graph, igraph_integer_t n, igraph_real_t power, igraph_integer_t window, igraph_integer_t m, const igraph_vector_t *outseq, igraph_bool_t outpref, igraph_real_t zero_appeal, igraph_bool_t directed);
Arguments:

Pointer to an uninitialized graph object. 

The number of vertices in the graph, this is the same as the number of time steps. 

The exponent, the probability that a node gains a
new edge is proportional to the number of edges it has
gained recently (in the last 

Integer constant, the size of the time window to use to count the number of recent edges. 

Integer constant, the number of edges to add per time
step if the 

The number of edges to add in each time step. This
argument is ignored if it is a null pointer or a zero length
vector, is this case the constant 

Logical constant, if true the edges originated by a vertex also count as recent incident edges. It is false in most cases. 

Constant giving the attractiveness of the vertices which haven't gained any edge recently. 

Logical constant, whether to generate a directed graph. 
Returns:
Error code. 
Time complexity: O(V*log(V)+E), V is the number of vertices, E is the number of edges in the graph.
int igraph_barabasi_aging_game(igraph_t *graph, igraph_integer_t nodes, igraph_integer_t m, const igraph_vector_t *outseq, igraph_bool_t outpref, igraph_real_t pa_exp, igraph_real_t aging_exp, igraph_integer_t aging_bin, igraph_real_t zero_deg_appeal, igraph_real_t zero_age_appeal, igraph_real_t deg_coef, igraph_real_t age_coef, igraph_bool_t directed);
In this game, the probability that a node gains a new edge is
given by its (in)degree (k) and age (l). This probability has a
degree dependent component multiplied by an age dependent
component. The degree dependent part is: deg_coef
times k to the
power of pa_exp
plus zero_deg_appeal
; and the age dependent
part is age_coef
times l to the power of aging_exp
plus zero_age_appeal
.
The age is based on the number of vertices in the
network and the aging_bin
argument: vertices grew one unit older
after each aging_bin
vertices added to the network.
Arguments:

Pointer to an uninitialized graph object. 

The number of vertices in the graph. 

The number of edges to add in each time step. If the 

The number of edges to add in each time step. If it
is a null pointer or a zerolength vector then it is ignored
and the 

Logical constant, whether the edges initiated by a vertex contribute to the probability to gain a new edge. 

The exponent of the preferential attachment, a small positive number usually, the value 1 yields the classic linear preferential attachment. 

The exponent of the aging, this is a negative number usually. 

Integer constant, the number of vertices to add before vertices in the network grew one unit older. 

The degree dependent part of the attractiveness of the zero degree vertices. 

The age dependent part of the attractiveness of the vertices of age zero. This parameter is usually zero. 

The coefficient for the degree. 

The coefficient for the age. 

Logical constant, whether to generate a directed graph. 
Returns:
Error code. 
Time complexity: O((V+V/aging_bin)*log(V)+E). V is the number of vertices, E the number of edges.
int igraph_recent_degree_aging_game(igraph_t *graph, igraph_integer_t nodes, igraph_integer_t m, const igraph_vector_t *outseq, igraph_bool_t outpref, igraph_real_t pa_exp, igraph_real_t aging_exp, igraph_integer_t aging_bin, igraph_integer_t time_window, igraph_real_t zero_appeal, igraph_bool_t directed);
This game is very similar to igraph_barabasi_aging_game()
,
except that instead of the total number of incident edges the
number of edges gained in the last time_window
time steps are
counted.
The degree dependent part of the attractiveness is
given by k to the power of pa_exp
plus zero_appeal
; the age
dependent part is l to the power to aging_exp
.
k is the number of edges gained in the last time_window
time
steps, l is the age of the vertex.
Arguments:

Pointer to an uninitialized graph object. 

The number of vertices in the graph. 

The number of edges to add in each time step. If the 

Vector giving the number of edges to add in each time
step. If it is a null pointer or a zerolength vector then
it is ignored and the 

Logical constant, if true the edges initiated by a vertex are also counted. Normally it is false. 

The exponent for the preferential attachment. 

The exponent for the aging, normally it is negative: old vertices gain edges with less probability. 

Integer constant, gives the scale of the aging.
The age of the vertices is incremented by one after every 

The time window to use to count the number of incident edges for the vertices. 

The degree dependent part of the attractiveness for zero degree vertices. 

Logical constant, whether to create a directed graph. 
Returns:
Error code. 
Time complexity: O((V+V/aging_bin)*log(V)+E). V is the number of vertices, E the number of edges.
int igraph_cited_type_game(igraph_t *graph, igraph_integer_t nodes, const igraph_vector_t *types, const igraph_vector_t *pref, igraph_integer_t edges_per_step, igraph_bool_t directed);
Function to create a network based on some vertex categories. This
function creates a citation network, in each step a single vertex
and edges_per_step
citating edges are added, nodes with
different categories (may) have different probabilities to get
cited, as given by the pref
vector.
Note that this function might generate networks with multiple edges
if edges_per_step
is greater than one. You might want to call
igraph_simplify()
on the result to remove multiple edges.
Arguments:

Pointer to an uninitialized graph object. 

The number of vertices in the network. 

Numeric vector giving the categories of the vertices,
so it should contain 

The attractivity of the different vertex categories in
a vector. Its length should be the maximum element in 

Integer constant, the number of edges to add in each time step. 

Logical constant, whether to create a directed network. 
Returns:
Error code. 
See also:

Time complexity: O((V+E)logV), V and E are number of vertices and edges, respectively.
int igraph_citing_cited_type_game(igraph_t *graph, igraph_integer_t nodes, const igraph_vector_t *types, const igraph_matrix_t *pref, igraph_integer_t edges_per_step, igraph_bool_t directed);
This game is similar to igraph_cited_type_game()
but here the
category of the citing vertex is also considered.
An evolving citation network is modeled here, a single vertex and
its edges_per_step
citation are added in each time step. The
odds the a given vertex is cited by the new vertex depends on the
category of both the citing and the cited vertex and is given in
the pref
matrix. The categories of the citing vertex correspond
to the rows, the categories of the cited vertex to the columns of
this matrix. Ie. the element in row i
and column j
gives the
probability that a j
vertex is cited, if the category of the
citing vertex is i
.
Note that this function might generate networks with multiple edges
if edges_per_step
is greater than one. You might want to call
igraph_simplify()
on the result to remove multiple edges.
Arguments:

Pointer to an uninitialized graph object. 

The number of vertices in the network. 

A numeric matrix of length 

The preference matrix, a square matrix is required,
both the number of rows and columns should be the maximum
element in 

Logical constant, whether to create a directed network. 
Returns:
Error code. 
Time complexity: O((V+E)logV), V and E are number of vertices and edges, respectively.
int igraph_sbm_game(igraph_t *graph, igraph_integer_t n, const igraph_matrix_t *pref_matrix, const igraph_vector_int_t *block_sizes, igraph_bool_t directed, igraph_bool_t loops);
This function samples graphs from a stochastic block
model by (doing the equivalent of) Bernoulli
trials for each potential edge with the probabilities
given by the Bernoulli rate matrix, pref_matrix
.
See Faust, K., & Wasserman, S. (1992a). Blockmodels:
Interpretation and evaluation. Social Networks, 14, 5–61.
The order of the vertex ids in the generated graph corresponds to
the block_sizes
argument.
Arguments:

The output graph. 

Number of vertices. 

The matrix giving the Bernoulli rates. This is a KxK matrix, where K is the number of groups. The probability of creating an edge between vertices from groups i and j is given by element (i,j). 

An integer vector giving the number of vertices in each group. 

Boolean, whether to create a directed graph. If
this argument is false, then 

Boolean, whether to create selfloops. 
Returns:
Error code. 
Time complexity: O(V+E+K^2), where V is the number of vertices, E is the number of edges, and K is the number of groups.
See also:

← Chapter 8. Random numbers  Chapter 10. Games on Graphs → 