1 /*
2    IGraph library.
3    Copyright (C) 2021  The igraph development team <igraph@igraph.org>
4 
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 2 of the License, or
8    (at your option) any later version.
9 
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14 
15    You should have received a copy of the GNU General Public License
16    along with this program.  If not, see <https://www.gnu.org/licenses/>.
17 */
18 
19 #include <igraph.h>
20 #include "test_utilities.inc"
21 
main()22 int main() {
23     igraph_vector_t comm1, comm2;
24     igraph_integer_t distance12, distance21;
25 
26     printf("No vertices:\n");
27     igraph_vector_init_int(&comm1, 0);
28     igraph_vector_init_int(&comm2, 0);
29     IGRAPH_ASSERT(igraph_split_join_distance(&comm1, &comm2, &distance12, &distance21) == IGRAPH_SUCCESS);
30     printf("%" IGRAPH_PRId ", %" IGRAPH_PRId "\n", distance12, distance21);
31     igraph_vector_destroy(&comm1);
32     igraph_vector_destroy(&comm2);
33 
34     printf("Comparing 5 separate vertices and one 5-element cluster:\n");
35     igraph_vector_init_int(&comm1, 5, 0, 1, 2, 3, 4);
36     igraph_vector_init_int(&comm2, 5, 0, 0, 0, 0, 0);
37     IGRAPH_ASSERT(igraph_split_join_distance(&comm1, &comm2, &distance12, &distance21) == IGRAPH_SUCCESS);
38     printf("%" IGRAPH_PRId ", %" IGRAPH_PRId "\n", distance12, distance21);
39     igraph_vector_destroy(&comm1);
40     igraph_vector_destroy(&comm2);
41 
42     printf("Comparing ((6, 1), (2,4), (3,5,0)) with ((2), (6,0,3), (4,5), (1)):\n");
43     igraph_vector_init_int(&comm1, 7, 2, 0, 1, 2, 1, 2, 0);
44     igraph_vector_init_int(&comm2, 7, 1, 3, 0, 1, 2, 2, 1);
45     IGRAPH_ASSERT(igraph_split_join_distance(&comm1, &comm2, &distance12, &distance21) == IGRAPH_SUCCESS);
46     printf("%" IGRAPH_PRId ", %" IGRAPH_PRId "\n", distance12, distance21);
47     igraph_vector_destroy(&comm1);
48     igraph_vector_destroy(&comm2);
49 
50     printf("Comparing ((0,1), (), 2) with ((0), (), (1,2))\n");
51     igraph_vector_init_int(&comm1, 3, 0, 0, 2);
52     igraph_vector_init_int(&comm2, 3, 0, 2, 2);
53     IGRAPH_ASSERT(igraph_split_join_distance(&comm1, &comm2, &distance12, &distance21) == IGRAPH_SUCCESS);
54     printf("%" IGRAPH_PRId ", %" IGRAPH_PRId "\n", distance12, distance21);
55     igraph_vector_destroy(&comm1);
56     igraph_vector_destroy(&comm2);
57 
58     VERIFY_FINALLY_STACK();
59     igraph_set_error_handler(igraph_error_handler_ignore);
60 
61     printf("\nExpected to fail nicely:\n\n");
62 
63     printf("Differently sized clusterings\n");
64     igraph_vector_init_int(&comm1, 3, 0, 1, 2);
65     igraph_vector_init_int(&comm2, 5, 0, 0, 0, 0, 0);
66     IGRAPH_ASSERT(igraph_split_join_distance(&comm1, &comm2, &distance12, &distance21) == IGRAPH_EINVAL);
67     igraph_vector_destroy(&comm1);
68     igraph_vector_destroy(&comm2);
69 
70     printf("Member index too high\n");
71     igraph_vector_init_int(&comm1, 3, 0, 1, 2);
72     igraph_vector_init_int(&comm2, 3, 9, 0, 0);
73     IGRAPH_ASSERT(igraph_split_join_distance(&comm1, &comm2, &distance12, &distance21) == IGRAPH_EINVAL);
74     igraph_vector_destroy(&comm1);
75     igraph_vector_destroy(&comm2);
76 
77     VERIFY_FINALLY_STACK();
78     return 0;
79 }
80