isl_basic_map_from_constraint: only return copy of bmap on equality constraints
[isl.git] / isl_test.c
blobfe966ba2a0ed028a8e53125bf5b5679be0dec6ff
1 /*
2 * Copyright 2008-2009 Katholieke Universiteit Leuven
4 * Use of this software is governed by the GNU LGPLv2.1 license
6 * Written by Sven Verdoolaege, K.U.Leuven, Departement
7 * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
8 */
10 #include <assert.h>
11 #include <stdio.h>
12 #include <limits.h>
13 #include <isl_ctx.h>
14 #include <isl_set.h>
15 #include <isl_flow.h>
16 #include <isl_constraint.h>
18 static char *srcdir;
20 void test_read(struct isl_ctx *ctx)
22 char filename[PATH_MAX];
23 FILE *input;
24 int n;
25 struct isl_basic_set *bset1, *bset2;
26 const char *str = "{[y]: Exists ( alpha : 2alpha = y)}";
28 n = snprintf(filename, sizeof(filename),
29 "%s/test_inputs/set.omega", srcdir);
30 assert(n < sizeof(filename));
31 input = fopen(filename, "r");
32 assert(input);
34 bset1 = isl_basic_set_read_from_file(ctx, input, 0);
35 bset2 = isl_basic_set_read_from_str(ctx, str, 0);
37 assert(isl_basic_set_is_equal(bset1, bset2) == 1);
39 isl_basic_set_free(bset1);
40 isl_basic_set_free(bset2);
42 fclose(input);
45 void test_bounded(struct isl_ctx *ctx)
47 isl_set *set;
48 int bounded;
50 set = isl_set_read_from_str(ctx, "[n] -> {[i] : 0 <= i <= n }", -1);
51 bounded = isl_set_is_bounded(set);
52 assert(bounded);
53 isl_set_free(set);
55 set = isl_set_read_from_str(ctx, "{[n, i] : 0 <= i <= n }", -1);
56 bounded = isl_set_is_bounded(set);
57 assert(!bounded);
58 isl_set_free(set);
60 set = isl_set_read_from_str(ctx, "[n] -> {[i] : i <= n }", -1);
61 bounded = isl_set_is_bounded(set);
62 assert(!bounded);
63 isl_set_free(set);
66 /* Construct the basic set { [i] : 5 <= i <= N } */
67 void test_construction(struct isl_ctx *ctx)
69 isl_int v;
70 struct isl_dim *dim;
71 struct isl_basic_set *bset;
72 struct isl_constraint *c;
74 isl_int_init(v);
76 dim = isl_dim_set_alloc(ctx, 1, 1);
77 bset = isl_basic_set_universe(dim);
79 c = isl_inequality_alloc(isl_basic_set_get_dim(bset));
80 isl_int_set_si(v, -1);
81 isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
82 isl_int_set_si(v, 1);
83 isl_constraint_set_coefficient(c, isl_dim_param, 0, v);
84 bset = isl_basic_set_add_constraint(bset, c);
86 c = isl_inequality_alloc(isl_basic_set_get_dim(bset));
87 isl_int_set_si(v, 1);
88 isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
89 isl_int_set_si(v, -5);
90 isl_constraint_set_constant(c, v);
91 bset = isl_basic_set_add_constraint(bset, c);
93 isl_basic_set_free(bset);
95 isl_int_clear(v);
98 void test_dim(struct isl_ctx *ctx)
100 isl_map *map1, *map2;
102 map1 = isl_map_read_from_str(ctx,
103 "[n] -> { [i] -> [j] : exists (a = [i/10] : i - 10a <= n ) }", -1);
104 map1 = isl_map_add(map1, isl_dim_in, 1);
105 map2 = isl_map_read_from_str(ctx,
106 "[n] -> { [i,k] -> [j] : exists (a = [i/10] : i - 10a <= n ) }", -1);
107 assert(isl_map_is_equal(map1, map2));
108 isl_map_free(map2);
110 map1 = isl_map_project_out(map1, isl_dim_in, 0, 1);
111 map2 = isl_map_read_from_str(ctx, "[n] -> { [i] -> [j] : n >= 0 }", -1);
112 assert(isl_map_is_equal(map1, map2));
114 isl_map_free(map1);
115 isl_map_free(map2);
118 void test_div(struct isl_ctx *ctx)
120 isl_int v;
121 int pos;
122 struct isl_dim *dim;
123 struct isl_div *div;
124 struct isl_basic_set *bset;
125 struct isl_constraint *c;
127 isl_int_init(v);
129 /* test 1 */
130 dim = isl_dim_set_alloc(ctx, 0, 1);
131 bset = isl_basic_set_universe(dim);
133 c = isl_equality_alloc(isl_basic_set_get_dim(bset));
134 isl_int_set_si(v, -1);
135 isl_constraint_set_constant(c, v);
136 isl_int_set_si(v, 1);
137 isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
138 div = isl_div_alloc(isl_basic_set_get_dim(bset));
139 c = isl_constraint_add_div(c, div, &pos);
140 isl_int_set_si(v, 3);
141 isl_constraint_set_coefficient(c, isl_dim_div, pos, v);
142 bset = isl_basic_set_add_constraint(bset, c);
144 c = isl_equality_alloc(isl_basic_set_get_dim(bset));
145 isl_int_set_si(v, 1);
146 isl_constraint_set_constant(c, v);
147 isl_int_set_si(v, -1);
148 isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
149 div = isl_div_alloc(isl_basic_set_get_dim(bset));
150 c = isl_constraint_add_div(c, div, &pos);
151 isl_int_set_si(v, 3);
152 isl_constraint_set_coefficient(c, isl_dim_div, pos, v);
153 bset = isl_basic_set_add_constraint(bset, c);
155 assert(bset && bset->n_div == 1);
156 isl_basic_set_free(bset);
158 /* test 2 */
159 dim = isl_dim_set_alloc(ctx, 0, 1);
160 bset = isl_basic_set_universe(dim);
162 c = isl_equality_alloc(isl_basic_set_get_dim(bset));
163 isl_int_set_si(v, 1);
164 isl_constraint_set_constant(c, v);
165 isl_int_set_si(v, -1);
166 isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
167 div = isl_div_alloc(isl_basic_set_get_dim(bset));
168 c = isl_constraint_add_div(c, div, &pos);
169 isl_int_set_si(v, 3);
170 isl_constraint_set_coefficient(c, isl_dim_div, pos, v);
171 bset = isl_basic_set_add_constraint(bset, c);
173 c = isl_equality_alloc(isl_basic_set_get_dim(bset));
174 isl_int_set_si(v, -1);
175 isl_constraint_set_constant(c, v);
176 isl_int_set_si(v, 1);
177 isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
178 div = isl_div_alloc(isl_basic_set_get_dim(bset));
179 c = isl_constraint_add_div(c, div, &pos);
180 isl_int_set_si(v, 3);
181 isl_constraint_set_coefficient(c, isl_dim_div, pos, v);
182 bset = isl_basic_set_add_constraint(bset, c);
184 assert(bset && bset->n_div == 1);
185 isl_basic_set_free(bset);
187 /* test 3 */
188 dim = isl_dim_set_alloc(ctx, 0, 1);
189 bset = isl_basic_set_universe(dim);
191 c = isl_equality_alloc(isl_basic_set_get_dim(bset));
192 isl_int_set_si(v, 1);
193 isl_constraint_set_constant(c, v);
194 isl_int_set_si(v, -1);
195 isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
196 div = isl_div_alloc(isl_basic_set_get_dim(bset));
197 c = isl_constraint_add_div(c, div, &pos);
198 isl_int_set_si(v, 3);
199 isl_constraint_set_coefficient(c, isl_dim_div, pos, v);
200 bset = isl_basic_set_add_constraint(bset, c);
202 c = isl_equality_alloc(isl_basic_set_get_dim(bset));
203 isl_int_set_si(v, -3);
204 isl_constraint_set_constant(c, v);
205 isl_int_set_si(v, 1);
206 isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
207 div = isl_div_alloc(isl_basic_set_get_dim(bset));
208 c = isl_constraint_add_div(c, div, &pos);
209 isl_int_set_si(v, 4);
210 isl_constraint_set_coefficient(c, isl_dim_div, pos, v);
211 bset = isl_basic_set_add_constraint(bset, c);
213 assert(bset && bset->n_div == 1);
214 isl_basic_set_free(bset);
216 /* test 4 */
217 dim = isl_dim_set_alloc(ctx, 0, 1);
218 bset = isl_basic_set_universe(dim);
220 c = isl_equality_alloc(isl_basic_set_get_dim(bset));
221 isl_int_set_si(v, 2);
222 isl_constraint_set_constant(c, v);
223 isl_int_set_si(v, -1);
224 isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
225 div = isl_div_alloc(isl_basic_set_get_dim(bset));
226 c = isl_constraint_add_div(c, div, &pos);
227 isl_int_set_si(v, 3);
228 isl_constraint_set_coefficient(c, isl_dim_div, pos, v);
229 bset = isl_basic_set_add_constraint(bset, c);
231 c = isl_equality_alloc(isl_basic_set_get_dim(bset));
232 isl_int_set_si(v, -1);
233 isl_constraint_set_constant(c, v);
234 isl_int_set_si(v, 1);
235 isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
236 div = isl_div_alloc(isl_basic_set_get_dim(bset));
237 c = isl_constraint_add_div(c, div, &pos);
238 isl_int_set_si(v, 6);
239 isl_constraint_set_coefficient(c, isl_dim_div, pos, v);
240 bset = isl_basic_set_add_constraint(bset, c);
242 assert(isl_basic_set_is_empty(bset));
243 isl_basic_set_free(bset);
245 /* test 5 */
246 dim = isl_dim_set_alloc(ctx, 0, 2);
247 bset = isl_basic_set_universe(dim);
249 c = isl_equality_alloc(isl_basic_set_get_dim(bset));
250 isl_int_set_si(v, -1);
251 isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
252 div = isl_div_alloc(isl_basic_set_get_dim(bset));
253 c = isl_constraint_add_div(c, div, &pos);
254 isl_int_set_si(v, 3);
255 isl_constraint_set_coefficient(c, isl_dim_div, pos, v);
256 bset = isl_basic_set_add_constraint(bset, c);
258 c = isl_equality_alloc(isl_basic_set_get_dim(bset));
259 isl_int_set_si(v, 1);
260 isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
261 isl_int_set_si(v, -3);
262 isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
263 bset = isl_basic_set_add_constraint(bset, c);
265 assert(bset && bset->n_div == 0);
266 isl_basic_set_free(bset);
268 /* test 6 */
269 dim = isl_dim_set_alloc(ctx, 0, 2);
270 bset = isl_basic_set_universe(dim);
272 c = isl_equality_alloc(isl_basic_set_get_dim(bset));
273 isl_int_set_si(v, -1);
274 isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
275 div = isl_div_alloc(isl_basic_set_get_dim(bset));
276 c = isl_constraint_add_div(c, div, &pos);
277 isl_int_set_si(v, 6);
278 isl_constraint_set_coefficient(c, isl_dim_div, pos, v);
279 bset = isl_basic_set_add_constraint(bset, c);
281 c = isl_equality_alloc(isl_basic_set_get_dim(bset));
282 isl_int_set_si(v, 1);
283 isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
284 isl_int_set_si(v, -3);
285 isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
286 bset = isl_basic_set_add_constraint(bset, c);
288 assert(bset && bset->n_div == 1);
289 isl_basic_set_free(bset);
291 /* test 7 */
292 /* This test is a bit tricky. We set up an equality
293 * a + 3b + 3c = 6 e0
294 * Normalization of divs creates _two_ divs
295 * a = 3 e0
296 * c - b - e0 = 2 e1
297 * Afterwards e0 is removed again because it has coefficient -1
298 * and we end up with the original equality and div again.
299 * Perhaps we can avoid the introduction of this temporary div.
301 dim = isl_dim_set_alloc(ctx, 0, 3);
302 bset = isl_basic_set_universe(dim);
304 c = isl_equality_alloc(isl_basic_set_get_dim(bset));
305 isl_int_set_si(v, -1);
306 isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
307 isl_int_set_si(v, -3);
308 isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
309 isl_int_set_si(v, -3);
310 isl_constraint_set_coefficient(c, isl_dim_set, 2, v);
311 div = isl_div_alloc(isl_basic_set_get_dim(bset));
312 c = isl_constraint_add_div(c, div, &pos);
313 isl_int_set_si(v, 6);
314 isl_constraint_set_coefficient(c, isl_dim_div, pos, v);
315 bset = isl_basic_set_add_constraint(bset, c);
317 /* Test disabled for now */
319 assert(bset && bset->n_div == 1);
321 isl_basic_set_free(bset);
323 /* test 8 */
324 dim = isl_dim_set_alloc(ctx, 0, 4);
325 bset = isl_basic_set_universe(dim);
327 c = isl_equality_alloc(isl_basic_set_get_dim(bset));
328 isl_int_set_si(v, -1);
329 isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
330 isl_int_set_si(v, -3);
331 isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
332 isl_int_set_si(v, -3);
333 isl_constraint_set_coefficient(c, isl_dim_set, 3, v);
334 div = isl_div_alloc(isl_basic_set_get_dim(bset));
335 c = isl_constraint_add_div(c, div, &pos);
336 isl_int_set_si(v, 6);
337 isl_constraint_set_coefficient(c, isl_dim_div, pos, v);
338 bset = isl_basic_set_add_constraint(bset, c);
340 c = isl_equality_alloc(isl_basic_set_get_dim(bset));
341 isl_int_set_si(v, -1);
342 isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
343 isl_int_set_si(v, 1);
344 isl_constraint_set_coefficient(c, isl_dim_set, 2, v);
345 isl_int_set_si(v, 1);
346 isl_constraint_set_constant(c, v);
347 bset = isl_basic_set_add_constraint(bset, c);
349 /* Test disabled for now */
351 assert(bset && bset->n_div == 1);
353 isl_basic_set_free(bset);
355 /* test 9 */
356 dim = isl_dim_set_alloc(ctx, 0, 2);
357 bset = isl_basic_set_universe(dim);
359 c = isl_equality_alloc(isl_basic_set_get_dim(bset));
360 isl_int_set_si(v, 1);
361 isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
362 isl_int_set_si(v, -1);
363 isl_constraint_set_coefficient(c, isl_dim_set, 1, v);
364 div = isl_div_alloc(isl_basic_set_get_dim(bset));
365 c = isl_constraint_add_div(c, div, &pos);
366 isl_int_set_si(v, -2);
367 isl_constraint_set_coefficient(c, isl_dim_div, pos, v);
368 bset = isl_basic_set_add_constraint(bset, c);
370 c = isl_equality_alloc(isl_basic_set_get_dim(bset));
371 isl_int_set_si(v, -1);
372 isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
373 div = isl_div_alloc(isl_basic_set_get_dim(bset));
374 c = isl_constraint_add_div(c, div, &pos);
375 isl_int_set_si(v, 3);
376 isl_constraint_set_coefficient(c, isl_dim_div, pos, v);
377 isl_int_set_si(v, 2);
378 isl_constraint_set_constant(c, v);
379 bset = isl_basic_set_add_constraint(bset, c);
381 bset = isl_basic_set_fix_si(bset, isl_dim_set, 0, 2);
383 assert(!isl_basic_set_is_empty(bset));
385 isl_basic_set_free(bset);
387 /* test 10 */
388 dim = isl_dim_set_alloc(ctx, 0, 2);
389 bset = isl_basic_set_universe(dim);
391 c = isl_equality_alloc(isl_basic_set_get_dim(bset));
392 isl_int_set_si(v, 1);
393 isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
394 div = isl_div_alloc(isl_basic_set_get_dim(bset));
395 c = isl_constraint_add_div(c, div, &pos);
396 isl_int_set_si(v, -2);
397 isl_constraint_set_coefficient(c, isl_dim_div, pos, v);
398 bset = isl_basic_set_add_constraint(bset, c);
400 bset = isl_basic_set_fix_si(bset, isl_dim_set, 0, 2);
402 isl_basic_set_free(bset);
404 isl_int_clear(v);
407 void test_application_case(struct isl_ctx *ctx, const char *name)
409 char filename[PATH_MAX];
410 FILE *input;
411 int n;
412 struct isl_basic_set *bset1, *bset2;
413 struct isl_basic_map *bmap;
415 n = snprintf(filename, sizeof(filename),
416 "%s/test_inputs/%s.omega", srcdir, name);
417 assert(n < sizeof(filename));
418 input = fopen(filename, "r");
419 assert(input);
421 bset1 = isl_basic_set_read_from_file(ctx, input, 0);
422 bmap = isl_basic_map_read_from_file(ctx, input, 0);
424 bset1 = isl_basic_set_apply(bset1, bmap);
426 bset2 = isl_basic_set_read_from_file(ctx, input, 0);
428 assert(isl_basic_set_is_equal(bset1, bset2) == 1);
430 isl_basic_set_free(bset1);
431 isl_basic_set_free(bset2);
433 fclose(input);
436 void test_application(struct isl_ctx *ctx)
438 test_application_case(ctx, "application");
439 test_application_case(ctx, "application2");
442 void test_affine_hull_case(struct isl_ctx *ctx, const char *name)
444 char filename[PATH_MAX];
445 FILE *input;
446 int n;
447 struct isl_basic_set *bset1, *bset2;
449 n = snprintf(filename, sizeof(filename),
450 "%s/test_inputs/%s.polylib", srcdir, name);
451 assert(n < sizeof(filename));
452 input = fopen(filename, "r");
453 assert(input);
455 bset1 = isl_basic_set_read_from_file(ctx, input, 0);
456 bset2 = isl_basic_set_read_from_file(ctx, input, 0);
458 bset1 = isl_basic_set_affine_hull(bset1);
460 assert(isl_basic_set_is_equal(bset1, bset2) == 1);
462 isl_basic_set_free(bset1);
463 isl_basic_set_free(bset2);
465 fclose(input);
468 void test_affine_hull(struct isl_ctx *ctx)
470 test_affine_hull_case(ctx, "affine2");
471 test_affine_hull_case(ctx, "affine");
472 test_affine_hull_case(ctx, "affine3");
475 void test_convex_hull_case(struct isl_ctx *ctx, const char *name)
477 char filename[PATH_MAX];
478 FILE *input;
479 int n;
480 struct isl_basic_set *bset1, *bset2;
481 struct isl_set *set;
483 n = snprintf(filename, sizeof(filename),
484 "%s/test_inputs/%s.polylib", srcdir, name);
485 assert(n < sizeof(filename));
486 input = fopen(filename, "r");
487 assert(input);
489 bset1 = isl_basic_set_read_from_file(ctx, input, 0);
490 bset2 = isl_basic_set_read_from_file(ctx, input, 0);
492 set = isl_basic_set_union(bset1, bset2);
493 bset1 = isl_set_convex_hull(set);
495 bset2 = isl_basic_set_read_from_file(ctx, input, 0);
497 assert(isl_basic_set_is_equal(bset1, bset2) == 1);
499 isl_basic_set_free(bset1);
500 isl_basic_set_free(bset2);
502 fclose(input);
505 void test_convex_hull(struct isl_ctx *ctx)
507 const char *str1, *str2;
508 isl_set *set1, *set2;
510 test_convex_hull_case(ctx, "convex0");
511 test_convex_hull_case(ctx, "convex1");
512 test_convex_hull_case(ctx, "convex2");
513 test_convex_hull_case(ctx, "convex3");
514 test_convex_hull_case(ctx, "convex4");
515 test_convex_hull_case(ctx, "convex5");
516 test_convex_hull_case(ctx, "convex6");
517 test_convex_hull_case(ctx, "convex7");
518 test_convex_hull_case(ctx, "convex8");
519 test_convex_hull_case(ctx, "convex9");
520 test_convex_hull_case(ctx, "convex10");
521 test_convex_hull_case(ctx, "convex11");
522 test_convex_hull_case(ctx, "convex12");
523 test_convex_hull_case(ctx, "convex13");
524 test_convex_hull_case(ctx, "convex14");
525 test_convex_hull_case(ctx, "convex15");
527 str1 = "{ [i0, i1, i2] : (i2 = 1 and i0 = 0 and i1 >= 0) or "
528 "(i0 = 1 and i1 = 0 and i2 = 1) or "
529 "(i0 = 0 and i1 = 0 and i2 = 0) }";
530 str2 = "{ [i0, i1, i2] : i0 >= 0 and i2 >= i0 and i2 <= 1 and i1 >= 0 }";
531 set1 = isl_set_read_from_str(ctx, str1, -1);
532 set2 = isl_set_read_from_str(ctx, str2, -1);
533 set1 = isl_set_from_basic_set(isl_set_convex_hull(set1));
534 assert(isl_set_is_equal(set1, set2));
535 isl_set_free(set1);
536 isl_set_free(set2);
539 void test_gist_case(struct isl_ctx *ctx, const char *name)
541 char filename[PATH_MAX];
542 FILE *input;
543 int n;
544 struct isl_basic_set *bset1, *bset2;
546 n = snprintf(filename, sizeof(filename),
547 "%s/test_inputs/%s.polylib", srcdir, name);
548 assert(n < sizeof(filename));
549 input = fopen(filename, "r");
550 assert(input);
552 bset1 = isl_basic_set_read_from_file(ctx, input, 0);
553 bset2 = isl_basic_set_read_from_file(ctx, input, 0);
555 bset1 = isl_basic_set_gist(bset1, bset2);
557 bset2 = isl_basic_set_read_from_file(ctx, input, 0);
559 assert(isl_basic_set_is_equal(bset1, bset2) == 1);
561 isl_basic_set_free(bset1);
562 isl_basic_set_free(bset2);
564 fclose(input);
567 void test_gist(struct isl_ctx *ctx)
569 test_gist_case(ctx, "gist1");
572 void test_coalesce_set(isl_ctx *ctx, const char *str, int check_one)
574 isl_set *set, *set2;
576 set = isl_set_read_from_str(ctx, str, -1);
577 set = isl_set_coalesce(set);
578 set2 = isl_set_read_from_str(ctx, str, -1);
579 assert(isl_set_is_equal(set, set2));
580 if (check_one)
581 assert(set && set->n == 1);
582 isl_set_free(set);
583 isl_set_free(set2);
586 void test_coalesce(struct isl_ctx *ctx)
588 const char *str;
589 struct isl_set *set, *set2;
590 struct isl_map *map, *map2;
592 set = isl_set_read_from_str(ctx,
593 "{[x,y]: x >= 0 & x <= 10 & y >= 0 & y <= 10 or "
594 "y >= x & x >= 2 & 5 >= y }", -1);
595 set = isl_set_coalesce(set);
596 assert(set && set->n == 1);
597 isl_set_free(set);
599 set = isl_set_read_from_str(ctx,
600 "{[x,y]: y >= 0 & 2x + y <= 30 & y <= 10 & x >= 0 or "
601 "x + y >= 10 & y <= x & x + y <= 20 & y >= 0}", -1);
602 set = isl_set_coalesce(set);
603 assert(set && set->n == 1);
604 isl_set_free(set);
606 set = isl_set_read_from_str(ctx,
607 "{[x,y]: y >= 0 & 2x + y <= 30 & y <= 10 & x >= 0 or "
608 "x + y >= 10 & y <= x & x + y <= 19 & y >= 0}", -1);
609 set = isl_set_coalesce(set);
610 assert(set && set->n == 2);
611 isl_set_free(set);
613 set = isl_set_read_from_str(ctx,
614 "{[x,y]: y >= 0 & x <= 5 & y <= x or "
615 "y >= 0 & x >= 6 & x <= 10 & y <= x}", -1);
616 set = isl_set_coalesce(set);
617 assert(set && set->n == 1);
618 isl_set_free(set);
620 set = isl_set_read_from_str(ctx,
621 "{[x,y]: y >= 0 & x <= 5 & y <= x or "
622 "y >= 0 & x >= 7 & x <= 10 & y <= x}", -1);
623 set = isl_set_coalesce(set);
624 assert(set && set->n == 2);
625 isl_set_free(set);
627 set = isl_set_read_from_str(ctx,
628 "{[x,y]: y >= 0 & x <= 5 & y <= x or "
629 "y >= 0 & x >= 6 & x <= 10 & y + 1 <= x}", -1);
630 set = isl_set_coalesce(set);
631 assert(set && set->n == 2);
632 isl_set_free(set);
634 set = isl_set_read_from_str(ctx,
635 "{[x,y]: y >= 0 & x <= 5 & y <= x or "
636 "y >= 0 & x = 6 & y <= 6}", -1);
637 set = isl_set_coalesce(set);
638 assert(set && set->n == 1);
639 isl_set_free(set);
641 set = isl_set_read_from_str(ctx,
642 "{[x,y]: y >= 0 & x <= 5 & y <= x or "
643 "y >= 0 & x = 7 & y <= 6}", -1);
644 set = isl_set_coalesce(set);
645 assert(set && set->n == 2);
646 isl_set_free(set);
648 set = isl_set_read_from_str(ctx,
649 "{[x,y]: y >= 0 & x <= 5 & y <= x or "
650 "y >= 0 & x = 6 & y <= 5}", -1);
651 set = isl_set_coalesce(set);
652 assert(set && set->n == 1);
653 set2 = isl_set_read_from_str(ctx,
654 "{[x,y]: y >= 0 & x <= 5 & y <= x or "
655 "y >= 0 & x = 6 & y <= 5}", -1);
656 assert(isl_set_is_equal(set, set2));
657 isl_set_free(set);
658 isl_set_free(set2);
660 set = isl_set_read_from_str(ctx,
661 "{[x,y]: y >= 0 & x <= 5 & y <= x or "
662 "y >= 0 & x = 6 & y <= 7}", -1);
663 set = isl_set_coalesce(set);
664 assert(set && set->n == 2);
665 isl_set_free(set);
667 set = isl_set_read_from_str(ctx,
668 "[n] -> { [i] : i = 1 and n >= 2 or 2 <= i and i <= n }", -1);
669 set = isl_set_coalesce(set);
670 assert(set && set->n == 1);
671 set2 = isl_set_read_from_str(ctx,
672 "[n] -> { [i] : i = 1 and n >= 2 or 2 <= i and i <= n }", -1);
673 assert(isl_set_is_equal(set, set2));
674 isl_set_free(set);
675 isl_set_free(set2);
677 set = isl_set_read_from_str(ctx,
678 "{[x,y] : x >= 0 and y >= 0 or 0 <= y and y <= 5 and x = -1}", -1);
679 set = isl_set_coalesce(set);
680 set2 = isl_set_read_from_str(ctx,
681 "{[x,y] : x >= 0 and y >= 0 or 0 <= y and y <= 5 and x = -1}", -1);
682 assert(isl_set_is_equal(set, set2));
683 isl_set_free(set);
684 isl_set_free(set2);
686 set = isl_set_read_from_str(ctx,
687 "[n] -> { [i] : 1 <= i and i <= n - 1 or "
688 "2 <= i and i <= n }", -1);
689 set = isl_set_coalesce(set);
690 assert(set && set->n == 1);
691 set2 = isl_set_read_from_str(ctx,
692 "[n] -> { [i] : 1 <= i and i <= n - 1 or "
693 "2 <= i and i <= n }", -1);
694 assert(isl_set_is_equal(set, set2));
695 isl_set_free(set);
696 isl_set_free(set2);
698 map = isl_map_read_from_str(ctx,
699 "[n] -> { [i0] -> [o0] : exists (e0 = [(i0)/4], e1 = [(o0)/4], "
700 "e2 = [(n)/2], e3 = [(-2 + i0)/4], e4 = [(-2 + o0)/4], "
701 "e5 = [(-2n + i0)/4]: 2e2 = n and 4e3 = -2 + i0 and "
702 "4e4 = -2 + o0 and i0 >= 8 + 2n and o0 >= 2 + i0 and "
703 "o0 <= 56 + 2n and o0 <= -12 + 4n and i0 <= 57 + 2n and "
704 "i0 <= -11 + 4n and o0 >= 6 + 2n and 4e0 <= i0 and "
705 "4e0 >= -3 + i0 and 4e1 <= o0 and 4e1 >= -3 + o0 and "
706 "4e5 <= -2n + i0 and 4e5 >= -3 - 2n + i0);"
707 "[i0] -> [o0] : exists (e0 = [(i0)/4], e1 = [(o0)/4], "
708 "e2 = [(n)/2], e3 = [(-2 + i0)/4], e4 = [(-2 + o0)/4], "
709 "e5 = [(-2n + i0)/4]: 2e2 = n and 4e3 = -2 + i0 and "
710 "4e4 = -2 + o0 and 2e0 >= 3 + n and e0 <= -4 + n and "
711 "2e0 <= 27 + n and e1 <= -4 + n and 2e1 <= 27 + n and "
712 "2e1 >= 2 + n and e1 >= 1 + e0 and i0 >= 7 + 2n and "
713 "i0 <= -11 + 4n and i0 <= 57 + 2n and 4e0 <= -2 + i0 and "
714 "4e0 >= -3 + i0 and o0 >= 6 + 2n and o0 <= -11 + 4n and "
715 "o0 <= 57 + 2n and 4e1 <= -2 + o0 and 4e1 >= -3 + o0 and "
716 "4e5 <= -2n + i0 and 4e5 >= -3 - 2n + i0 ) }", -1);
717 map = isl_map_coalesce(map);
718 map2 = isl_map_read_from_str(ctx,
719 "[n] -> { [i0] -> [o0] : exists (e0 = [(i0)/4], e1 = [(o0)/4], "
720 "e2 = [(n)/2], e3 = [(-2 + i0)/4], e4 = [(-2 + o0)/4], "
721 "e5 = [(-2n + i0)/4]: 2e2 = n and 4e3 = -2 + i0 and "
722 "4e4 = -2 + o0 and i0 >= 8 + 2n and o0 >= 2 + i0 and "
723 "o0 <= 56 + 2n and o0 <= -12 + 4n and i0 <= 57 + 2n and "
724 "i0 <= -11 + 4n and o0 >= 6 + 2n and 4e0 <= i0 and "
725 "4e0 >= -3 + i0 and 4e1 <= o0 and 4e1 >= -3 + o0 and "
726 "4e5 <= -2n + i0 and 4e5 >= -3 - 2n + i0);"
727 "[i0] -> [o0] : exists (e0 = [(i0)/4], e1 = [(o0)/4], "
728 "e2 = [(n)/2], e3 = [(-2 + i0)/4], e4 = [(-2 + o0)/4], "
729 "e5 = [(-2n + i0)/4]: 2e2 = n and 4e3 = -2 + i0 and "
730 "4e4 = -2 + o0 and 2e0 >= 3 + n and e0 <= -4 + n and "
731 "2e0 <= 27 + n and e1 <= -4 + n and 2e1 <= 27 + n and "
732 "2e1 >= 2 + n and e1 >= 1 + e0 and i0 >= 7 + 2n and "
733 "i0 <= -11 + 4n and i0 <= 57 + 2n and 4e0 <= -2 + i0 and "
734 "4e0 >= -3 + i0 and o0 >= 6 + 2n and o0 <= -11 + 4n and "
735 "o0 <= 57 + 2n and 4e1 <= -2 + o0 and 4e1 >= -3 + o0 and "
736 "4e5 <= -2n + i0 and 4e5 >= -3 - 2n + i0 ) }", -1);
737 assert(isl_map_is_equal(map, map2));
738 isl_map_free(map);
739 isl_map_free(map2);
741 str = "[n, m] -> { [] -> [o0, o2, o3] : (o3 = 1 and o0 >= 1 + m and "
742 "o0 <= n + m and o2 <= m and o0 >= 2 + n and o2 >= 3) or "
743 "(o0 >= 2 + n and o0 >= 1 + m and o0 <= n + m and n >= 1 and "
744 "o3 <= -1 + o2 and o3 >= 1 - m + o2 and o3 >= 2 and o3 <= n) }";
745 map = isl_map_read_from_str(ctx, str, -1);
746 map = isl_map_coalesce(map);
747 map2 = isl_map_read_from_str(ctx, str, -1);
748 assert(isl_map_is_equal(map, map2));
749 isl_map_free(map);
750 isl_map_free(map2);
752 str = "[M, N] -> { [i0, i1, i2, i3, i4, i5, i6] -> "
753 "[o0, o1, o2, o3, o4, o5, o6] : "
754 "(o6 <= -4 + 2M - 2N + i0 + i1 - i2 + i6 - o0 - o1 + o2 and "
755 "o3 <= -2 + i3 and o6 >= 2 + i0 + i3 + i6 - o0 - o3 and "
756 "o6 >= 2 - M + N + i3 + i4 + i6 - o3 - o4 and o0 <= -1 + i0 and "
757 "o4 >= 4 - 3M + 3N - i0 - i1 + i2 + 2i3 + i4 + o0 + o1 - o2 - 2o3 "
758 "and o6 <= -3 + 2M - 2N + i3 + i4 - i5 + i6 - o3 - o4 + o5 and "
759 "2o6 <= -5 + 5M - 5N + 2i0 + i1 - i2 - i5 + 2i6 - 2o0 - o1 + o2 + o5 "
760 "and o6 >= 2i0 + i1 + i6 - 2o0 - o1 and "
761 "3o6 <= -5 + 4M - 4N + 2i0 + i1 - i2 + 2i3 + i4 - i5 + 3i6 "
762 "- 2o0 - o1 + o2 - 2o3 - o4 + o5) or "
763 "(N >= 2 and o3 <= -1 + i3 and o0 <= -1 + i0 and "
764 "o6 >= i3 + i6 - o3 and M >= 0 and "
765 "2o6 >= 1 + i0 + i3 + 2i6 - o0 - o3 and "
766 "o6 >= 1 - M + i0 + i6 - o0 and N >= 2M and o6 >= i0 + i6 - o0) }";
767 map = isl_map_read_from_str(ctx, str, -1);
768 map = isl_map_coalesce(map);
769 map2 = isl_map_read_from_str(ctx, str, -1);
770 assert(isl_map_is_equal(map, map2));
771 isl_map_free(map);
772 isl_map_free(map2);
774 str = "[M, N] -> { [] -> [o0] : (o0 = 0 and M >= 1 and N >= 2) or "
775 "(o0 = 0 and M >= 1 and N >= 2M and N >= 2 + M) or "
776 "(o0 = 0 and M >= 2 and N >= 3) or "
777 "(M = 0 and o0 = 0 and N >= 3) }";
778 map = isl_map_read_from_str(ctx, str, -1);
779 map = isl_map_coalesce(map);
780 map2 = isl_map_read_from_str(ctx, str, -1);
781 assert(isl_map_is_equal(map, map2));
782 isl_map_free(map);
783 isl_map_free(map2);
785 str = "{ [i0, i1, i2, i3] : (i1 = 10i0 and i0 >= 1 and 10i0 <= 100 and "
786 "i3 <= 9 + 10 i2 and i3 >= 1 + 10i2 and i3 >= 0) or "
787 "(i1 <= 9 + 10i0 and i1 >= 1 + 10i0 and i2 >= 0 and "
788 "i0 >= 0 and i1 <= 100 and i3 <= 9 + 10i2 and i3 >= 1 + 10i2) }";
789 map = isl_map_read_from_str(ctx, str, -1);
790 map = isl_map_coalesce(map);
791 map2 = isl_map_read_from_str(ctx, str, -1);
792 assert(isl_map_is_equal(map, map2));
793 isl_map_free(map);
794 isl_map_free(map2);
796 test_coalesce_set(ctx,
797 "[M] -> { [i1] : (i1 >= 2 and i1 <= M) or "
798 "(i1 = M and M >= 1) }", 0);
799 test_coalesce_set(ctx,
800 "{[x,y] : x,y >= 0; [x,y] : 10 <= x <= 20 and y >= -1 }", 0);
801 test_coalesce_set(ctx,
802 "{ [x, y] : (x >= 1 and y >= 1 and x <= 2 and y <= 2) or "
803 "(y = 3 and x = 1) }", 1);
804 test_coalesce_set(ctx,
805 "[M] -> { [i0, i1, i2, i3, i4] : (i1 >= 3 and i4 >= 2 + i2 and "
806 "i2 >= 2 and i0 >= 2 and i3 >= 1 + i2 and i0 <= M and "
807 "i1 <= M and i3 <= M and i4 <= M) or "
808 "(i1 >= 2 and i4 >= 1 + i2 and i2 >= 2 and i0 >= 2 and "
809 "i3 >= 1 + i2 and i0 <= M and i1 <= -1 + M and i3 <= M and "
810 "i4 <= -1 + M) }", 1);
811 test_coalesce_set(ctx,
812 "{ [x, y] : (x >= 0 and y >= 0 and x <= 10 and y <= 10) or "
813 "(x >= 1 and y >= 1 and x <= 11 and y <= 11) }", 1);
814 test_coalesce_set(ctx,
815 "{[x,y,z] : y + 2 >= 0 and x - y + 1 >= 0 and "
816 "-x - y + 1 >= 0 and -3 <= z <= 3;"
817 "[x,y,z] : -x+z + 20 >= 0 and -x-z + 20 >= 0 and "
818 "x-z + 20 >= 0 and x+z + 20 >= 0 and -10 <= y <= 0}", 1);
819 test_coalesce_set(ctx,
820 "{[x,y] : 0 <= x,y <= 10; [5,y]: 4 <=y <= 11}", 1);
823 void test_closure(struct isl_ctx *ctx)
825 const char *str;
826 isl_set *dom;
827 isl_map *up, *right;
828 isl_map *map, *map2;
829 int exact;
831 /* COCOA example 1 */
832 map = isl_map_read_from_str(ctx,
833 "[n,k] -> { [i,j] -> [i2,j2] : i2 = i + 1 and j2 = j + 1 and "
834 "1 <= i and i < n and 1 <= j and j < n or "
835 "i2 = i + 1 and j2 = j - 1 and "
836 "1 <= i and i < n and 2 <= j and j <= n }", -1);
837 map = isl_map_power(map, 1, &exact);
838 assert(exact);
839 isl_map_free(map);
841 /* COCOA example 1 */
842 map = isl_map_read_from_str(ctx,
843 "[n] -> { [i,j] -> [i2,j2] : i2 = i + 1 and j2 = j + 1 and "
844 "1 <= i and i < n and 1 <= j and j < n or "
845 "i2 = i + 1 and j2 = j - 1 and "
846 "1 <= i and i < n and 2 <= j and j <= n }", -1);
847 map = isl_map_transitive_closure(map, &exact);
848 assert(exact);
849 map2 = isl_map_read_from_str(ctx,
850 "[n] -> { [i,j] -> [i2,j2] : exists (k1,k2,k : "
851 "1 <= i and i < n and 1 <= j and j <= n and "
852 "2 <= i2 and i2 <= n and 1 <= j2 and j2 <= n and "
853 "i2 = i + k1 + k2 and j2 = j + k1 - k2 and "
854 "k1 >= 0 and k2 >= 0 and k1 + k2 = k and k >= 1 )}", -1);
855 assert(isl_map_is_equal(map, map2));
856 isl_map_free(map2);
857 isl_map_free(map);
859 map = isl_map_read_from_str(ctx,
860 "[n] -> { [x] -> [y] : y = x + 1 and 0 <= x and x <= n and "
861 " 0 <= y and y <= n }", -1);
862 map = isl_map_transitive_closure(map, &exact);
863 map2 = isl_map_read_from_str(ctx,
864 "[n] -> { [x] -> [y] : y > x and 0 <= x and x <= n and "
865 " 0 <= y and y <= n }", -1);
866 assert(isl_map_is_equal(map, map2));
867 isl_map_free(map2);
868 isl_map_free(map);
870 /* COCOA example 2 */
871 map = isl_map_read_from_str(ctx,
872 "[n] -> { [i,j] -> [i2,j2] : i2 = i + 2 and j2 = j + 2 and "
873 "1 <= i and i < n - 1 and 1 <= j and j < n - 1 or "
874 "i2 = i + 2 and j2 = j - 2 and "
875 "1 <= i and i < n - 1 and 3 <= j and j <= n }", -1);
876 map = isl_map_transitive_closure(map, &exact);
877 assert(exact);
878 map2 = isl_map_read_from_str(ctx,
879 "[n] -> { [i,j] -> [i2,j2] : exists (k1,k2,k : "
880 "1 <= i and i < n - 1 and 1 <= j and j <= n and "
881 "3 <= i2 and i2 <= n and 1 <= j2 and j2 <= n and "
882 "i2 = i + 2 k1 + 2 k2 and j2 = j + 2 k1 - 2 k2 and "
883 "k1 >= 0 and k2 >= 0 and k1 + k2 = k and k >= 1) }", -1);
884 assert(isl_map_is_equal(map, map2));
885 isl_map_free(map);
886 isl_map_free(map2);
888 /* COCOA Fig.2 left */
889 map = isl_map_read_from_str(ctx,
890 "[n] -> { [i,j] -> [i2,j2] : i2 = i + 2 and j2 = j and "
891 "i <= 2 j - 3 and i <= n - 2 and j <= 2 i - 1 and "
892 "j <= n or "
893 "i2 = i and j2 = j + 2 and i <= 2 j - 1 and i <= n and "
894 "j <= 2 i - 3 and j <= n - 2 or "
895 "i2 = i + 1 and j2 = j + 1 and i <= 2 j - 1 and "
896 "i <= n - 1 and j <= 2 i - 1 and j <= n - 1 }", -1);
897 map = isl_map_transitive_closure(map, &exact);
898 assert(exact);
899 isl_map_free(map);
901 /* COCOA Fig.2 right */
902 map = isl_map_read_from_str(ctx,
903 "[n,k] -> { [i,j] -> [i2,j2] : i2 = i + 3 and j2 = j and "
904 "i <= 2 j - 4 and i <= n - 3 and j <= 2 i - 1 and "
905 "j <= n or "
906 "i2 = i and j2 = j + 3 and i <= 2 j - 1 and i <= n and "
907 "j <= 2 i - 4 and j <= n - 3 or "
908 "i2 = i + 1 and j2 = j + 1 and i <= 2 j - 1 and "
909 "i <= n - 1 and j <= 2 i - 1 and j <= n - 1 }", -1);
910 map = isl_map_power(map, 1, &exact);
911 assert(exact);
912 isl_map_free(map);
914 /* COCOA Fig.2 right */
915 map = isl_map_read_from_str(ctx,
916 "[n] -> { [i,j] -> [i2,j2] : i2 = i + 3 and j2 = j and "
917 "i <= 2 j - 4 and i <= n - 3 and j <= 2 i - 1 and "
918 "j <= n or "
919 "i2 = i and j2 = j + 3 and i <= 2 j - 1 and i <= n and "
920 "j <= 2 i - 4 and j <= n - 3 or "
921 "i2 = i + 1 and j2 = j + 1 and i <= 2 j - 1 and "
922 "i <= n - 1 and j <= 2 i - 1 and j <= n - 1 }", -1);
923 map = isl_map_transitive_closure(map, &exact);
924 assert(exact);
925 map2 = isl_map_read_from_str(ctx,
926 "[n] -> { [i,j] -> [i2,j2] : exists (k1,k2,k3,k : "
927 "i <= 2 j - 1 and i <= n and j <= 2 i - 1 and "
928 "j <= n and 3 + i + 2 j <= 3 n and "
929 "3 + 2 i + j <= 3n and i2 <= 2 j2 -1 and i2 <= n and "
930 "i2 <= 3 j2 - 4 and j2 <= 2 i2 -1 and j2 <= n and "
931 "13 + 4 j2 <= 11 i2 and i2 = i + 3 k1 + k3 and "
932 "j2 = j + 3 k2 + k3 and k1 >= 0 and k2 >= 0 and "
933 "k3 >= 0 and k1 + k2 + k3 = k and k > 0) }", -1);
934 assert(isl_map_is_equal(map, map2));
935 isl_map_free(map2);
936 isl_map_free(map);
938 /* COCOA Fig.1 right */
939 dom = isl_set_read_from_str(ctx,
940 "{ [x,y] : x >= 0 and -2 x + 3 y >= 0 and x <= 3 and "
941 "2 x - 3 y + 3 >= 0 }", -1);
942 right = isl_map_read_from_str(ctx,
943 "{ [x,y] -> [x2,y2] : x2 = x + 1 and y2 = y }", -1);
944 up = isl_map_read_from_str(ctx,
945 "{ [x,y] -> [x2,y2] : x2 = x and y2 = y + 1 }", -1);
946 right = isl_map_intersect_domain(right, isl_set_copy(dom));
947 right = isl_map_intersect_range(right, isl_set_copy(dom));
948 up = isl_map_intersect_domain(up, isl_set_copy(dom));
949 up = isl_map_intersect_range(up, dom);
950 map = isl_map_union(up, right);
951 map = isl_map_transitive_closure(map, &exact);
952 assert(exact);
953 map2 = isl_map_read_from_str(ctx,
954 "{ [0,0] -> [0,1]; [0,0] -> [1,1]; [0,1] -> [1,1]; "
955 " [2,2] -> [3,2]; [2,2] -> [3,3]; [3,2] -> [3,3] }", -1);
956 assert(isl_map_is_equal(map, map2));
957 isl_map_free(map2);
958 isl_map_free(map);
960 /* COCOA Theorem 1 counter example */
961 map = isl_map_read_from_str(ctx,
962 "{ [i,j] -> [i2,j2] : i = 0 and 0 <= j and j <= 1 and "
963 "i2 = 1 and j2 = j or "
964 "i = 0 and j = 0 and i2 = 0 and j2 = 1 }", -1);
965 map = isl_map_transitive_closure(map, &exact);
966 assert(exact);
967 isl_map_free(map);
969 map = isl_map_read_from_str(ctx,
970 "[m,n] -> { [i,j] -> [i2,j2] : i2 = i and j2 = j + 2 and "
971 "1 <= i,i2 <= n and 1 <= j,j2 <= m or "
972 "i2 = i + 1 and 3 <= j2 - j <= 4 and "
973 "1 <= i,i2 <= n and 1 <= j,j2 <= m }", -1);
974 map = isl_map_transitive_closure(map, &exact);
975 assert(exact);
976 isl_map_free(map);
978 /* Kelly et al 1996, fig 12 */
979 map = isl_map_read_from_str(ctx,
980 "[n] -> { [i,j] -> [i2,j2] : i2 = i and j2 = j + 1 and "
981 "1 <= i,j,j+1 <= n or "
982 "j = n and j2 = 1 and i2 = i + 1 and "
983 "1 <= i,i+1 <= n }", -1);
984 map = isl_map_transitive_closure(map, &exact);
985 assert(exact);
986 map2 = isl_map_read_from_str(ctx,
987 "[n] -> { [i,j] -> [i2,j2] : 1 <= j < j2 <= n and "
988 "1 <= i <= n and i = i2 or "
989 "1 <= i < i2 <= n and 1 <= j <= n and "
990 "1 <= j2 <= n }", -1);
991 assert(isl_map_is_equal(map, map2));
992 isl_map_free(map2);
993 isl_map_free(map);
995 /* Omega's closure4 */
996 map = isl_map_read_from_str(ctx,
997 "[m,n] -> { [x,y] -> [x2,y2] : x2 = x and y2 = y + 1 and "
998 "1 <= x,y <= 10 or "
999 "x2 = x + 1 and y2 = y and "
1000 "1 <= x <= 20 && 5 <= y <= 15 }", -1);
1001 map = isl_map_transitive_closure(map, &exact);
1002 assert(exact);
1003 isl_map_free(map);
1005 map = isl_map_read_from_str(ctx,
1006 "[n] -> { [x] -> [y]: 1 <= n <= y - x <= 10 }", -1);
1007 map = isl_map_transitive_closure(map, &exact);
1008 assert(!exact);
1009 map2 = isl_map_read_from_str(ctx,
1010 "[n] -> { [x] -> [y] : 1 <= n <= 10 and y >= n + x }", -1);
1011 assert(isl_map_is_equal(map, map2));
1012 isl_map_free(map);
1013 isl_map_free(map2);
1015 str = "[n, m] -> { [i0, i1, i2, i3] -> [o0, o1, o2, o3] : "
1016 "i3 = 1 and o0 = i0 and o1 = -1 + i1 and o2 = -1 + i2 and "
1017 "o3 = -2 + i2 and i1 <= -1 + i0 and i1 >= 1 - m + i0 and "
1018 "i1 >= 2 and i1 <= n and i2 >= 3 and i2 <= 1 + n and i2 <= m }";
1019 map = isl_map_read_from_str(ctx, str, -1);
1020 map = isl_map_transitive_closure(map, &exact);
1021 assert(exact);
1022 map2 = isl_map_read_from_str(ctx, str, -1);
1023 assert(isl_map_is_equal(map, map2));
1024 isl_map_free(map);
1025 isl_map_free(map2);
1027 str = "{[0] -> [1]; [2] -> [3]}";
1028 map = isl_map_read_from_str(ctx, str, -1);
1029 map = isl_map_transitive_closure(map, &exact);
1030 assert(exact);
1031 map2 = isl_map_read_from_str(ctx, str, -1);
1032 assert(isl_map_is_equal(map, map2));
1033 isl_map_free(map);
1034 isl_map_free(map2);
1037 void test_lexmin(struct isl_ctx *ctx)
1039 const char *str;
1040 isl_map *map;
1041 isl_set *set;
1042 isl_set *set2;
1044 str = "[p0, p1] -> { [] -> [] : "
1045 "exists (e0 = [(2p1)/3], e1, e2, e3 = [(3 - p1 + 3e0)/3], "
1046 "e4 = [(p1)/3], e5 = [(p1 + 3e4)/3]: "
1047 "3e0 >= -2 + 2p1 and 3e0 >= p1 and 3e3 >= 1 - p1 + 3e0 and "
1048 "3e0 <= 2p1 and 3e3 >= -2 + p1 and 3e3 <= -1 + p1 and p1 >= 3 and "
1049 "3e5 >= -2 + 2p1 and 3e5 >= p1 and 3e5 <= -1 + p1 + 3e4 and "
1050 "3e4 <= p1 and 3e4 >= -2 + p1 and e3 <= -1 + e0 and "
1051 "3e4 >= 6 - p1 + 3e1 and 3e1 >= p1 and 3e5 >= -2 + p1 + 3e4 and "
1052 "2e4 >= 3 - p1 + 2e1 and e4 <= e1 and 3e3 <= 2 - p1 + 3e0 and "
1053 "e5 >= 1 + e1 and 3e4 >= 6 - 2p1 + 3e1 and "
1054 "p0 >= 2 and p1 >= p0 and 3e2 >= p1 and 3e4 >= 6 - p1 + 3e2 and "
1055 "e2 <= e1 and e3 >= 1 and e4 <= e2) }";
1056 map = isl_map_read_from_str(ctx, str, -1);
1057 map = isl_map_lexmin(map);
1058 isl_map_free(map);
1060 str = "[C] -> { [obj,a,b,c] : obj <= 38 a + 7 b + 10 c and "
1061 "a + b <= 1 and c <= 10 b and c <= C and a,b,c,C >= 0 }";
1062 set = isl_set_read_from_str(ctx, str, -1);
1063 set = isl_set_lexmax(set);
1064 str = "[C] -> { [obj,a,b,c] : C = 8 }";
1065 set2 = isl_set_read_from_str(ctx, str, -1);
1066 set = isl_set_intersect(set, set2);
1067 assert(!isl_set_is_empty(set));
1068 isl_set_free(set);
1071 struct must_may {
1072 isl_map *must;
1073 isl_map *may;
1076 static int collect_must_may(__isl_take isl_map *dep, int must,
1077 void *dep_user, void *user)
1079 struct must_may *mm = (struct must_may *)user;
1081 if (must)
1082 mm->must = isl_map_union(mm->must, dep);
1083 else
1084 mm->may = isl_map_union(mm->may, dep);
1086 return 0;
1089 static int common_space(void *first, void *second)
1091 int depth = *(int *)first;
1092 return 2 * depth;
1095 static int map_is_equal(__isl_keep isl_map *map, const char *str)
1097 isl_map *map2;
1098 int equal;
1100 if (!map)
1101 return -1;
1103 map2 = isl_map_read_from_str(map->ctx, str, -1);
1104 equal = isl_map_is_equal(map, map2);
1105 isl_map_free(map2);
1107 return equal;
1110 void test_dep(struct isl_ctx *ctx)
1112 const char *str;
1113 isl_dim *dim;
1114 isl_map *map;
1115 isl_access_info *ai;
1116 isl_flow *flow;
1117 int depth;
1118 struct must_may mm;
1120 depth = 3;
1122 str = "{ [2,i,0] -> [i] : 0 <= i <= 10 }";
1123 map = isl_map_read_from_str(ctx, str, -1);
1124 ai = isl_access_info_alloc(map, &depth, &common_space, 2);
1126 str = "{ [0,i,0] -> [i] : 0 <= i <= 10 }";
1127 map = isl_map_read_from_str(ctx, str, -1);
1128 ai = isl_access_info_add_source(ai, map, 1, &depth);
1130 str = "{ [1,i,0] -> [5] : 0 <= i <= 10 }";
1131 map = isl_map_read_from_str(ctx, str, -1);
1132 ai = isl_access_info_add_source(ai, map, 1, &depth);
1134 flow = isl_access_info_compute_flow(ai);
1135 dim = isl_dim_alloc(ctx, 0, 3, 3);
1136 mm.must = isl_map_empty(isl_dim_copy(dim));
1137 mm.may = isl_map_empty(dim);
1139 isl_flow_foreach(flow, collect_must_may, &mm);
1141 str = "{ [0,i,0] -> [2,i,0] : (0 <= i <= 4) or (6 <= i <= 10); "
1142 " [1,10,0] -> [2,5,0] }";
1143 assert(map_is_equal(mm.must, str));
1144 str = "{ [i,j,k] -> [l,m,n] : 1 = 0 }";
1145 assert(map_is_equal(mm.may, str));
1147 isl_map_free(mm.must);
1148 isl_map_free(mm.may);
1149 isl_flow_free(flow);
1152 str = "{ [2,i,0] -> [i] : 0 <= i <= 10 }";
1153 map = isl_map_read_from_str(ctx, str, -1);
1154 ai = isl_access_info_alloc(map, &depth, &common_space, 2);
1156 str = "{ [0,i,0] -> [i] : 0 <= i <= 10 }";
1157 map = isl_map_read_from_str(ctx, str, -1);
1158 ai = isl_access_info_add_source(ai, map, 1, &depth);
1160 str = "{ [1,i,0] -> [5] : 0 <= i <= 10 }";
1161 map = isl_map_read_from_str(ctx, str, -1);
1162 ai = isl_access_info_add_source(ai, map, 0, &depth);
1164 flow = isl_access_info_compute_flow(ai);
1165 dim = isl_dim_alloc(ctx, 0, 3, 3);
1166 mm.must = isl_map_empty(isl_dim_copy(dim));
1167 mm.may = isl_map_empty(dim);
1169 isl_flow_foreach(flow, collect_must_may, &mm);
1171 str = "{ [0,i,0] -> [2,i,0] : (0 <= i <= 4) or (6 <= i <= 10) }";
1172 assert(map_is_equal(mm.must, str));
1173 str = "{ [0,5,0] -> [2,5,0]; [1,i,0] -> [2,5,0] : 0 <= i <= 10 }";
1174 assert(map_is_equal(mm.may, str));
1176 isl_map_free(mm.must);
1177 isl_map_free(mm.may);
1178 isl_flow_free(flow);
1181 str = "{ [2,i,0] -> [i] : 0 <= i <= 10 }";
1182 map = isl_map_read_from_str(ctx, str, -1);
1183 ai = isl_access_info_alloc(map, &depth, &common_space, 2);
1185 str = "{ [0,i,0] -> [i] : 0 <= i <= 10 }";
1186 map = isl_map_read_from_str(ctx, str, -1);
1187 ai = isl_access_info_add_source(ai, map, 0, &depth);
1189 str = "{ [1,i,0] -> [5] : 0 <= i <= 10 }";
1190 map = isl_map_read_from_str(ctx, str, -1);
1191 ai = isl_access_info_add_source(ai, map, 0, &depth);
1193 flow = isl_access_info_compute_flow(ai);
1194 dim = isl_dim_alloc(ctx, 0, 3, 3);
1195 mm.must = isl_map_empty(isl_dim_copy(dim));
1196 mm.may = isl_map_empty(dim);
1198 isl_flow_foreach(flow, collect_must_may, &mm);
1200 str = "{ [0,i,0] -> [2,i,0] : 0 <= i <= 10; "
1201 " [1,i,0] -> [2,5,0] : 0 <= i <= 10 }";
1202 assert(map_is_equal(mm.may, str));
1203 str = "{ [i,j,k] -> [l,m,n] : 1 = 0 }";
1204 assert(map_is_equal(mm.must, str));
1206 isl_map_free(mm.must);
1207 isl_map_free(mm.may);
1208 isl_flow_free(flow);
1211 str = "{ [0,i,2] -> [i] : 0 <= i <= 10 }";
1212 map = isl_map_read_from_str(ctx, str, -1);
1213 ai = isl_access_info_alloc(map, &depth, &common_space, 2);
1215 str = "{ [0,i,0] -> [i] : 0 <= i <= 10 }";
1216 map = isl_map_read_from_str(ctx, str, -1);
1217 ai = isl_access_info_add_source(ai, map, 0, &depth);
1219 str = "{ [0,i,1] -> [5] : 0 <= i <= 10 }";
1220 map = isl_map_read_from_str(ctx, str, -1);
1221 ai = isl_access_info_add_source(ai, map, 0, &depth);
1223 flow = isl_access_info_compute_flow(ai);
1224 dim = isl_dim_alloc(ctx, 0, 3, 3);
1225 mm.must = isl_map_empty(isl_dim_copy(dim));
1226 mm.may = isl_map_empty(dim);
1228 isl_flow_foreach(flow, collect_must_may, &mm);
1230 str = "{ [0,i,0] -> [0,i,2] : 0 <= i <= 10; "
1231 " [0,i,1] -> [0,5,2] : 0 <= i <= 5 }";
1232 assert(map_is_equal(mm.may, str));
1233 str = "{ [i,j,k] -> [l,m,n] : 1 = 0 }";
1234 assert(map_is_equal(mm.must, str));
1236 isl_map_free(mm.must);
1237 isl_map_free(mm.may);
1238 isl_flow_free(flow);
1241 str = "{ [0,i,1] -> [i] : 0 <= i <= 10 }";
1242 map = isl_map_read_from_str(ctx, str, -1);
1243 ai = isl_access_info_alloc(map, &depth, &common_space, 2);
1245 str = "{ [0,i,0] -> [i] : 0 <= i <= 10 }";
1246 map = isl_map_read_from_str(ctx, str, -1);
1247 ai = isl_access_info_add_source(ai, map, 0, &depth);
1249 str = "{ [0,i,2] -> [5] : 0 <= i <= 10 }";
1250 map = isl_map_read_from_str(ctx, str, -1);
1251 ai = isl_access_info_add_source(ai, map, 0, &depth);
1253 flow = isl_access_info_compute_flow(ai);
1254 dim = isl_dim_alloc(ctx, 0, 3, 3);
1255 mm.must = isl_map_empty(isl_dim_copy(dim));
1256 mm.may = isl_map_empty(dim);
1258 isl_flow_foreach(flow, collect_must_may, &mm);
1260 str = "{ [0,i,0] -> [0,i,1] : 0 <= i <= 10; "
1261 " [0,i,2] -> [0,5,1] : 0 <= i <= 4 }";
1262 assert(map_is_equal(mm.may, str));
1263 str = "{ [i,j,k] -> [l,m,n] : 1 = 0 }";
1264 assert(map_is_equal(mm.must, str));
1266 isl_map_free(mm.must);
1267 isl_map_free(mm.may);
1268 isl_flow_free(flow);
1271 depth = 5;
1273 str = "{ [1,i,0,0,0] -> [i,j] : 0 <= i <= 10 and 0 <= j <= 10 }";
1274 map = isl_map_read_from_str(ctx, str, -1);
1275 ai = isl_access_info_alloc(map, &depth, &common_space, 1);
1277 str = "{ [0,i,0,j,0] -> [i,j] : 0 <= i <= 10 and 0 <= j <= 10 }";
1278 map = isl_map_read_from_str(ctx, str, -1);
1279 ai = isl_access_info_add_source(ai, map, 1, &depth);
1281 flow = isl_access_info_compute_flow(ai);
1282 dim = isl_dim_alloc(ctx, 0, 5, 5);
1283 mm.must = isl_map_empty(isl_dim_copy(dim));
1284 mm.may = isl_map_empty(dim);
1286 isl_flow_foreach(flow, collect_must_may, &mm);
1288 str = "{ [0,i,0,j,0] -> [1,i,0,0,0] : 0 <= i,j <= 10 }";
1289 assert(map_is_equal(mm.must, str));
1290 str = "{ [0,0,0,0,0] -> [0,0,0,0,0] : 1 = 0 }";
1291 assert(map_is_equal(mm.may, str));
1293 isl_map_free(mm.must);
1294 isl_map_free(mm.may);
1295 isl_flow_free(flow);
1298 void test_sv(struct isl_ctx *ctx)
1300 const char *str;
1301 isl_map *map;
1303 str = "[N] -> { [i] -> [f] : 0 <= i <= N and 0 <= i - 10 f <= 9 }";
1304 map = isl_map_read_from_str(ctx, str, -1);
1305 assert(isl_map_is_single_valued(map));
1306 isl_map_free(map);
1308 str = "[N] -> { [i] -> [f] : 0 <= i <= N and 0 <= i - 10 f <= 10 }";
1309 map = isl_map_read_from_str(ctx, str, -1);
1310 assert(!isl_map_is_single_valued(map));
1311 isl_map_free(map);
1314 int main()
1316 struct isl_ctx *ctx;
1318 srcdir = getenv("srcdir");
1319 assert(srcdir);
1321 ctx = isl_ctx_alloc();
1322 test_sv(ctx);
1323 test_dep(ctx);
1324 test_read(ctx);
1325 test_bounded(ctx);
1326 test_construction(ctx);
1327 test_dim(ctx);
1328 test_div(ctx);
1329 test_application(ctx);
1330 test_affine_hull(ctx);
1331 test_convex_hull(ctx);
1332 test_gist(ctx);
1333 test_coalesce(ctx);
1334 test_closure(ctx);
1335 test_lexmin(ctx);
1336 isl_ctx_free(ctx);
1337 return 0;