1 /* IGraph library.  Copyright (C) 2021  The igraph development team <igraph@igraph.org>
2 
3    This program is free software; you can redistribute it and/or modify
4    it under the terms of the GNU General Public License as published by
5    the Free Software Foundation; either version 2 of the License, or
6    (at your option) any later version.
7 
8    This program is distributed in the hope that it will be useful,
9    but WITHOUT ANY WARRANTY; without even the implied warranty of
10    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11    GNU General Public License for more details.
12 
13    You should have received a copy of the GNU General Public License
14    along with this program.  If not, see <https://www.gnu.org/licenses/>.
15 */
16 
17 #include <igraph.h>
18 #include "test_utilities.inc"
19 
call_and_print(igraph_t * graph,int k,igraph_vector_t * weights,igraph_neimode_t mode)20 void call_and_print(igraph_t *graph, int k, igraph_vector_t *weights, igraph_neimode_t mode) {
21     igraph_vector_t result;
22     igraph_vector_init(&result, 0);
23     IGRAPH_ASSERT(igraph_local_scan_k_ecount(graph, k, &result, weights, mode) == IGRAPH_SUCCESS);
24     print_vector(&result);
25     igraph_vector_destroy(&result);
26     printf("\n");
27 }
28 
29 
main()30 int main() {
31     igraph_t g_0, g_1, g_lmu, g_lm, g_lm_nl;
32     igraph_vector_t weights, result;
33 
34     igraph_vector_init_real(&weights, 8, -0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6);
35     igraph_vector_init(&result, 0);
36     igraph_small(&g_0, 0, 0, -1);
37     igraph_small(&g_1, 1, 0, -1);
38     igraph_small(&g_lm, 6, 1, 0,1, 0,2, 1,1, 1,3, 2,0, 2,3, 3,4, 3,4, -1);
39     igraph_small(&g_lmu, 6, 0, 0,1, 0,2, 1,1, 1,3, 2,0, 2,3, 3,4, 3,4, -1); //undirected
40     igraph_small(&g_lm_nl, 6, 1, 0,1, 0,2, 1,3, 2,0, 2,3, 3,4, 3,4, -1); // no loop
41 
42     printf("No vertices:\n");
43     call_and_print(&g_0, 2, NULL, IGRAPH_ALL);
44 
45     printf("One vertex:\n");
46     call_and_print(&g_1, 2, NULL, IGRAPH_ALL);
47 
48     printf("Directed disconnected graph with loops and multiple edges, no weights, k = 0, IGRAPH_IN:\n");
49     call_and_print(&g_lm, 0, NULL, IGRAPH_IN);
50 
51     printf("Same graph, k=1:\n");
52     call_and_print(&g_lm, 1, NULL, IGRAPH_IN);
53 
54     printf("Same graph, without loops, k=1:\n");
55     call_and_print(&g_lm_nl, 1, NULL, IGRAPH_IN);
56 
57     printf("Same graph with loop, k=1, undirected:\n");
58     call_and_print(&g_lmu, 1, NULL, IGRAPH_IN);
59 
60     printf("Checking if calling igraph_local_scan_1_ecount properly redirects:\n");
61     igraph_vector_clear(&result);
62     IGRAPH_ASSERT(igraph_local_scan_1_ecount(&g_lmu, &result, NULL, IGRAPH_IN) == IGRAPH_SUCCESS);
63     print_vector(&result);
64     printf("\n");
65 
66     printf("Same graph, directed, k=2:\n");
67     call_and_print(&g_lm, 2, NULL, IGRAPH_IN);
68 
69     printf("Same graph, undirected, k=2:\n");
70     call_and_print(&g_lmu, 2, NULL, IGRAPH_IN);
71 
72     printf("Same graph, weighted:\n");
73     call_and_print(&g_lmu, 2, &weights, IGRAPH_IN);
74 
75     VERIFY_FINALLY_STACK();
76 
77     printf("Wrong size weights.\n");
78     igraph_vector_clear(&weights);
79     CHECK_ERROR(igraph_local_scan_k_ecount(&g_lmu, 3, &result, &weights, IGRAPH_ALL), IGRAPH_EINVAL);
80 
81     printf("Negative k.\n");
82     CHECK_ERROR(igraph_local_scan_k_ecount(&g_lmu, -3, &result, NULL, IGRAPH_ALL), IGRAPH_EINVAL);
83 
84     igraph_destroy(&g_0);
85     igraph_destroy(&g_1);
86     igraph_destroy(&g_lmu);
87     igraph_destroy(&g_lm);
88     igraph_destroy(&g_lm_nl);
89     igraph_vector_destroy(&weights);
90     igraph_vector_destroy(&result);
91 
92     VERIFY_FINALLY_STACK();
93     return 0;
94 }
95