1 /* -*- mode: C -*-  */
2 /* vim:set ts=4 sw=4 sts=4 et: */
3 /*
4    IGraph library.
5    Copyright (C) 2007-2012  Gabor Csardi <csardi.gabor@gmail.com>
6    334 Harvard street, Cambridge, MA 02139 USA
7 
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12 
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17 
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc.,  51 Franklin Street, Fifth Floor, Boston, MA
21    02110-1301 USA
22 
23 */
24 
25 #include <igraph.h>
26 
27 #include "test_utilities.inc"
28 
main()29 int main() {
30     igraph_t g;
31     igraph_vector_t membership, weights, initial;
32     igraph_vector_bool_t fixed;
33     long int i;
34 
35     /* label propagation is a stochastic method */
36     igraph_rng_seed(igraph_rng_default(), 765);
37 
38     /* Zachary Karate club -- this is just a quick smoke test */
39     igraph_small(&g, 0, IGRAPH_UNDIRECTED,
40                  0,  1,  0,  2,  0,  3,  0,  4,  0,  5,
41                  0,  6,  0,  7,  0,  8,  0, 10,  0, 11,
42                  0, 12,  0, 13,  0, 17,  0, 19,  0, 21,
43                  0, 31,  1,  2,  1,  3,  1,  7,  1, 13,
44                  1, 17,  1, 19,  1, 21,  1, 30,  2,  3,
45                  2,  7,  2,  8,  2,  9,  2, 13,  2, 27,
46                  2, 28,  2, 32,  3,  7,  3, 12,  3, 13,
47                  4,  6,  4, 10,  5,  6,  5, 10,  5, 16,
48                  6, 16,  8, 30,  8, 32,  8, 33,  9, 33,
49                  13, 33, 14, 32, 14, 33, 15, 32, 15, 33,
50                  18, 32, 18, 33, 19, 33, 20, 32, 20, 33,
51                  22, 32, 22, 33, 23, 25, 23, 27, 23, 29,
52                  23, 32, 23, 33, 24, 25, 24, 27, 24, 31,
53                  25, 31, 26, 29, 26, 33, 27, 33, 28, 31,
54                  28, 33, 29, 32, 29, 33, 30, 32, 30, 33,
55                  31, 32, 31, 33, 32, 33,
56                  -1);
57 
58     igraph_vector_init(&membership, 0);
59     igraph_community_label_propagation(&g, &membership, 0, 0, 0,
60                                        /*modularity=*/ 0);
61 
62     igraph_destroy(&g);
63 
64     /* Simple star graph to test weights */
65     igraph_small(&g, 0, IGRAPH_UNDIRECTED,
66                  0,  1,  0,  2,  0,  3,  0,  4,  0,  5,
67                  2,  3,  2,  4,  3,  4,  3,  5,  4,  5,  -1);
68     igraph_vector_init_int_end(&weights, -1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1);
69     igraph_vector_init_int_end(&initial, -1, 0, 0, 1, 1, 1, 1, -1);
70     igraph_vector_bool_init(&fixed, 6);
71     VECTOR(fixed)[3] = 1;
72     VECTOR(fixed)[4] = 1;
73     VECTOR(fixed)[5] = 1;
74     igraph_community_label_propagation(&g, &membership, &weights,
75                                        &initial, &fixed, /*modularity=*/ 0);
76     for (i = 0; i < igraph_vcount(&g); i++)
77         if (VECTOR(membership)[i] != (i < 2 ? 0 : 1)) {
78             return 3;
79         }
80     igraph_community_label_propagation(&g, &membership, 0,
81                                        &initial, &fixed, /*modularity=*/ 0);
82     for (i = 0; i < igraph_vcount(&g); i++)
83         if (VECTOR(membership)[i] != 0) {
84             return 4;
85         }
86 
87     /* Check whether it works with no fixed vertices at all
88      * while an initial configuration is given -- see bug
89      * #570902 in Launchpad. This is a simple smoke test only. */
90     igraph_community_label_propagation(&g, &membership, &weights,
91                                        &initial, 0, /*modularity=*/ 0);
92 
93     igraph_vector_bool_destroy(&fixed);
94     igraph_vector_destroy(&weights);
95     igraph_vector_destroy(&initial);
96     igraph_destroy(&g);
97 
98     igraph_vector_destroy(&membership);
99 
100     VERIFY_FINALLY_STACK();
101 
102     return 0;
103 }
104