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