1 
2 #include <igraph.h>
3 #include <stdlib.h>
4 
5 #include "test_utilities.inc"
6 
7 struct userdata {
8     int i;
9     igraph_vector_ptr_t *list;
10 };
11 
compare_vectors(const void * p1,const void * p2)12 int compare_vectors(const void *p1, const void *p2) {
13     igraph_vector_t *v1, *v2;
14     long s1, s2, i;
15 
16     v1 = *((igraph_vector_t **) p1);
17     v2 = *((igraph_vector_t **) p2);
18     s1 = igraph_vector_size(v1);
19     s2 = igraph_vector_size(v2);
20     if (s1 < s2) {
21         return -1;
22     }
23     if (s1 > s2) {
24         return 1;
25     }
26     for (i = 0; i < s1; ++i) {
27         if (VECTOR(*v1)[i] < VECTOR(*v2)[i]) {
28             return -1;
29         }
30         if (VECTOR(*v1)[i] > VECTOR(*v2)[i]) {
31             return 1;
32         }
33     }
34     return 0;
35 }
36 
37 
handler(igraph_vector_t * clique,void * arg)38 igraph_bool_t handler(igraph_vector_t *clique, void *arg) {
39     struct userdata *ud;
40     igraph_bool_t cont;
41 
42     ud = (struct userdata *) arg;
43     cont = 1; /* true */
44 
45     if (compare_vectors(&clique, &(VECTOR(*(ud->list))[ud->i])) != 0) {
46         printf("igraph_maximal_cliques() and igraph_maximal_cliques_callback() give different results.\n");
47         cont = 0; /* false */
48     }
49 
50     igraph_vector_destroy(clique);
51     igraph_free(clique);
52 
53     ud->i += 1;
54 
55     return cont;
56 }
57 
58 
handler_stop(igraph_vector_t * clique,void * arg)59 igraph_bool_t handler_stop(igraph_vector_t *clique, void *arg) {
60     /* Stop search as soon as a 3-clique is found. */
61     /* Since there are two 3-cliques in the test graph, this will stop the search before it is complete. */
62     if (igraph_vector_size(clique) == 3) {
63         igraph_vector_destroy(clique);
64         igraph_free(clique);
65 
66         return 0;    /* false */
67     }
68 
69     igraph_vector_destroy(clique);
70     igraph_free(clique);
71 
72     return 1 /* true */;
73 }
74 
75 
main()76 int main() {
77     igraph_t graph;
78     igraph_vector_ptr_t list;
79     struct userdata ud;
80 
81     igraph_small(&graph, 6, 0,
82                  1, 2, 2, 3, 3, 4, 4, 5, 5, 2, 2, 4,
83                  -1);
84 
85     igraph_vector_ptr_init(&list, 0);
86     igraph_maximal_cliques(&graph, &list, 0, 0);
87 
88     ud.i = 0;
89     ud.list = &list;
90 
91     /* Check that the callback function finds the same cliques as igraph_maximal_cliques() */
92     igraph_maximal_cliques_callback(&graph, &handler, (void *) &ud, 0, 0);
93 
94     /* Check that the search can be stopped correctly */
95     igraph_maximal_cliques_callback(&graph, &handler_stop, NULL, 0, 0);
96 
97     IGRAPH_VECTOR_PTR_SET_ITEM_DESTRUCTOR(&list, igraph_vector_destroy);
98     igraph_vector_ptr_destroy_all(&list);
99 
100     igraph_destroy(&graph);
101 
102     VERIFY_FINALLY_STACK();
103 
104     return 0;
105 }
106