1 /* -*- mode: C -*- */
2 /*
3 IGraph library.
4 Copyright (C) 2007-2012 Gabor Csardi <csardi.gabor@gmail.com>
5 334 Harvard st, Cambridge MA, 02139 USA
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 02110-1301 USA
21
22 */
23
24 #include <igraph.h>
25 #include <stdio.h>
26
27 #include "test_utilities.inc"
28
byrow(igraph_matrix_t * m)29 void byrow(igraph_matrix_t *m) {
30 long int r = igraph_matrix_nrow(m), c = igraph_matrix_ncol(m);
31 long int n = 0, i, j;
32 for (i = 0; i < r; i++) {
33 for (j = 0; j < c; j++) {
34 MATRIX(*m, i, j) = n++;
35 }
36 }
37 }
38
39 #define apply(m,a,b) \
40 for (i=0; i<igraph_matrix_nrow(&(m)); i++) { \
41 for (j=0; j<igraph_matrix_ncol(&(m)); j++) { \
42 (a); \
43 } \
44 (b); \
45 }
46
47
main()48 int main() {
49 igraph_matrix_t m, m2;
50 igraph_vector_t v;
51 long int i, j, i2, j2;
52 igraph_real_t r1, r2;
53
54 igraph_matrix_init(&m, 4, 3);
55 byrow(&m);
56
57 /* igraph_matrix_e */
58 printf("igraph_matrix_e\n");
59 apply(m, printf("%i ", (int)igraph_matrix_e(&m, i, j)), printf("\n"));
60
61 /* igraph_matrix_e_ptr */
62 printf("igraph_matrix_e_ptr\n");
63 apply(m, printf("%i ", (int)igraph_matrix_e_ptr(&m, i, j)[0]), printf("\n"));
64
65 /* igraph_matrix_set */
66 printf("igraph_matrix_set\n");
67 apply(m, igraph_matrix_set(&m, i, j, i), (void) 0 );
68 print_matrix(&m);
69 apply(m, igraph_matrix_set(&m, i, j, j), (void) 0 );
70 print_matrix(&m);
71
72 /* igraph_matrix_fill */
73 printf("igraph_matrix_fill\n");
74 igraph_matrix_fill(&m, 42);
75 print_matrix(&m);
76 igraph_matrix_fill(&m, -42.1);
77 print_matrix(&m);
78
79 /* igraph_matrix_update */
80 printf("igraph_matrix_update\n");
81 igraph_matrix_init(&m2, 0, 0);
82 byrow(&m);
83 igraph_matrix_update(&m2, &m);
84 print_matrix(&m2);
85
86 /* igraph_matrix_rbind */
87 printf("igraph_matrix_rbind\n");
88 igraph_matrix_rbind(&m2, &m);
89 print_matrix(&m2);
90 printf("\n");
91 igraph_matrix_resize(&m, 0, igraph_matrix_ncol(&m2));
92 igraph_matrix_rbind(&m2, &m);
93 print_matrix(&m2);
94 printf("\n");
95 igraph_matrix_rbind(&m, &m2);
96 print_matrix(&m);
97
98 /* igraph_matrix_cbind */
99 printf("igraph_matrix_cbind\n");
100 igraph_matrix_resize(&m, 4, 3);
101 igraph_matrix_resize(&m2, 4, 2);
102 byrow(&m);
103 byrow(&m2);
104 igraph_matrix_cbind(&m, &m2);
105 print_matrix(&m);
106
107 /* igraph_matrix_swap */
108 printf("igraph_matrix_swap\n");
109 igraph_matrix_update(&m, &m2);
110 igraph_matrix_null(&m);
111 igraph_matrix_swap(&m, &m2);
112 print_matrix(&m);
113 print_matrix(&m2);
114
115 /* igraph_matrix_get_row */
116 /* igraph_matrix_set_row */
117 printf("igraph_matrix_get_row\n");
118 printf("igraph_matrix_set_row\n");
119 igraph_vector_init(&v, 0);
120 for (i = 0; i < igraph_matrix_nrow(&m); i++) {
121 igraph_matrix_get_row(&m, &v, i);
122 igraph_matrix_set_row(&m2, &v, i);
123 }
124 print_matrix(&m2);
125
126 /* igraph_matrix_set_col */
127 printf("igraph_matrix_set_col\n");
128 igraph_matrix_null(&m2);
129 for (i = 0; i < igraph_matrix_ncol(&m); i++) {
130 igraph_matrix_get_col(&m, &v, i);
131 igraph_matrix_set_col(&m2, &v, i);
132 }
133 print_matrix(&m2);
134
135 /* igraph_matrix_swap_rows */
136 printf("igraph_matrix_swap_rows\n");
137 igraph_matrix_swap_rows(&m2, 0, 0);
138 igraph_matrix_swap_rows(&m2, 0, 2);
139 print_matrix(&m2);
140
141 /* igraph_matrix_swap_cols */
142 printf("igraph_matrix_swap_cols\n");
143 igraph_matrix_swap_cols(&m2, 0, 0);
144 igraph_matrix_swap_cols(&m2, 0, 1);
145 print_matrix(&m2);
146
147 /* igraph_matrix_add_constant */
148 printf("igraph_matrix_add_constant\n");
149 igraph_matrix_add_constant(&m2, 0);
150 print_matrix(&m2);
151 igraph_matrix_add_constant(&m2, -1);
152 print_matrix(&m2);
153
154 /* igraph_matrix_add */
155 printf("igraph_matrix_add\n");
156 byrow(&m2);
157 byrow(&m);
158 igraph_matrix_add(&m2, &m);
159 print_matrix(&m2);
160
161 /* igraph_matrix_sub */
162 printf("igraph_matrix_sub\n");
163 igraph_matrix_sub(&m2, &m);
164 print_matrix(&m2);
165
166 /* igraph_matrix_mul_elements */
167 printf("igraph_matrix_mul_elements\n");
168 igraph_matrix_mul_elements(&m2, &m);
169 print_matrix(&m2);
170
171 /* igraph_matrix_div_elements */
172 printf("igraph_matrix_div_elements\n");
173 igraph_matrix_fill(&m, 2);
174 igraph_matrix_div_elements(&m2, &m);
175 print_matrix(&m2);
176
177 /* igraph_matrix_min */
178 printf("igraph_matrix_min\n");
179 if (igraph_matrix_min(&m2) != 0) {
180 return 1;
181 }
182 if (igraph_matrix_min(&m) != 2) {
183 return 1;
184 }
185
186 /* igraph_matrix_which_min */
187 printf("igraph_matrix_which_min\n");
188 igraph_matrix_which_min(&m2, &i, &j);
189 if (i != 0 || j != 0) {
190 return 2;
191 }
192 MATRIX(m2, 0, 1) = -1;
193 igraph_matrix_which_min(&m2, &i, &j);
194 if (i != 0 || j != 1) {
195 return 2;
196 }
197 MATRIX(m2, 3, 1) = -2;
198 igraph_matrix_which_min(&m2, &i, &j);
199 if (i != 3 || j != 1) {
200 return 2;
201 }
202
203 /* igraph_matrix_which_max */
204 printf("igraph_matrix_which_max\n");
205 MATRIX(m2, 3, 0) = 100;
206 igraph_matrix_which_max(&m2, &i, &j);
207 if (i != 3 || j != 0) {
208 return 3;
209 }
210
211 /* igraph_matrix_minmax */
212 printf("igraph_matrix_minmax\n");
213 igraph_matrix_minmax(&m2, &r1, &r2);
214 printf("%g %g\n", r1, r2);
215
216 /* igraph_matrix_which_minmax */
217 printf("igraph_matrix_which_minmax\n");
218 igraph_matrix_which_minmax(&m2, &i, &j, &i2, &j2);
219 if (i != 3 || j != 1 || i2 != 3 || j2 != 0) {
220 return 4;
221 }
222
223 /* igraph_matrix_isnull */
224 printf("igraph_matrix_isnull\n");
225 if (igraph_matrix_isnull(&m2)) {
226 return 5;
227 }
228 igraph_matrix_null(&m);
229 if (!igraph_matrix_isnull(&m)) {
230 return 5;
231 }
232 igraph_matrix_resize(&m2, 5, 0);
233 if (!igraph_matrix_isnull(&m2)) {
234 return 5;
235 }
236
237 /* igraph_matrix_empty */
238 printf("igraph_matrix_empty\n");
239 if (!igraph_matrix_empty(&m2)) {
240 return 6;
241 }
242 igraph_matrix_resize(&m2, 5, 5);
243 if (igraph_matrix_empty(&m2)) {
244 return 6;
245 }
246
247 /* igraph_matrix_is_symmetric */
248 printf("igraph_matrix_is_symmetric\n");
249 byrow(&m2);
250 if (igraph_matrix_is_symmetric(&m2)) {
251 return 7;
252 }
253 igraph_matrix_update(&m, &m2);
254 igraph_matrix_transpose(&m);
255 igraph_matrix_add(&m, &m2);
256 if (!igraph_matrix_is_symmetric(&m)) {
257 return 7;
258 }
259
260 /* igraph_matrix_prod */
261 printf("igraph_matrix_prod\n");
262 igraph_matrix_resize(&m, 3, 2);
263 byrow(&m);
264 igraph_matrix_add_constant(&m, 1);
265 print_matrix(&m);
266 printf("product: %g\n", igraph_matrix_prod(&m));
267
268 /* igraph_matrix_rowsum */
269 printf("igraph_matrix_rowsum\n");
270 igraph_matrix_rowsum(&m, &v);
271 print_vector(&v);
272
273 /* igraph_matrix_colsum */
274 printf("igraph_matrix_colsum\n");
275 igraph_matrix_colsum(&m, &v);
276 print_vector(&v);
277
278 /* igraph_matrix_contains */
279 printf("igraph_matrix_contains\n");
280 if (igraph_matrix_contains(&m, 0)) {
281 return 8;
282 }
283 if (igraph_matrix_contains(&m, 6.0001)) {
284 return 8;
285 }
286 if (igraph_matrix_contains(&m, 7)) {
287 return 8;
288 }
289 if (!igraph_matrix_contains(&m, 1)) {
290 return 8;
291 }
292 if (!igraph_matrix_contains(&m, 6)) {
293 return 8;
294 }
295
296 /* igraph_matrix_search */
297 printf("igraph_matrix_search\n");
298 if (!igraph_matrix_search(&m, 0, 6.0, &i2, &i, &j)) {
299 return 9;
300 }
301 if (i2 != 5 || i != 2 || j != 1) {
302 return 9;
303 }
304
305 /* igraph_matrix_remove_row */
306 printf("igraph_matrix_remove_row\n");
307 igraph_matrix_remove_row(&m, 1);
308 print_matrix(&m);
309 igraph_matrix_resize(&m, 5, 4);
310 byrow(&m);
311 igraph_matrix_remove_row(&m, 4);
312 print_matrix(&m);
313 igraph_matrix_remove_row(&m, 0);
314 print_matrix(&m);
315
316 /* igraph_matrix_select_cols */
317 printf("igraph_matrix_select_cols\n");
318 igraph_matrix_resize(&m, 6, 5);
319 apply(m, igraph_matrix_set(&m, i, j, j), (void) 0 );
320 igraph_vector_resize(&v, 3);
321 VECTOR(v)[0] = 0;
322 VECTOR(v)[1] = 4;
323 VECTOR(v)[2] = 2;
324 igraph_matrix_select_cols(&m, &m2, &v);
325 print_matrix(&m2);
326 igraph_vector_resize(&v, 1);
327 igraph_matrix_select_cols(&m, &m2, &v);
328 print_matrix(&m2);
329 igraph_vector_clear(&v);
330 igraph_matrix_select_cols(&m, &m2, &v);
331 if (!igraph_matrix_empty(&m2)) {
332 return 9;
333 }
334
335 igraph_vector_destroy(&v);
336 igraph_matrix_destroy(&m2);
337 igraph_matrix_destroy(&m);
338
339 VERIFY_FINALLY_STACK();
340
341 return 0;
342 }
343