add a counter example for Theorem 1 of the COCOA paper
[isl.git] / isl_output.c
blob04c17c937f00ab8606b414b02e1710ffd8fcdca7
1 /*
2 * Copyright 2008-2009 Katholieke Universiteit Leuven
3 * Copyright 2010 INRIA Saclay
5 * Use of this software is governed by the GNU LGPLv2.1 license
7 * Written by Sven Verdoolaege, K.U.Leuven, Departement
8 * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
9 * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite,
10 * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France
13 #include <isl_set.h>
15 static void print_constraint_polylib(struct isl_basic_set *bset,
16 int ineq, int n,
17 FILE *out, int indent, const char *prefix, const char *suffix)
19 int i;
20 unsigned dim = isl_basic_set_n_dim(bset);
21 unsigned nparam = isl_basic_set_n_param(bset);
22 isl_int *c = ineq ? bset->ineq[n] : bset->eq[n];
24 fprintf(out, "%*s%s", indent, "", prefix ? prefix : "");
25 fprintf(out, "%d", ineq);
26 for (i = 0; i < dim; ++i) {
27 fprintf(out, " ");
28 isl_int_print(out, c[1+nparam+i], 5);
30 for (i = 0; i < bset->n_div; ++i) {
31 fprintf(out, " ");
32 isl_int_print(out, c[1+nparam+dim+i], 5);
34 for (i = 0; i < nparam; ++i) {
35 fprintf(out, " ");
36 isl_int_print(out, c[1+i], 5);
38 fprintf(out, " ");
39 isl_int_print(out, c[0], 5);
40 fprintf(out, "%s\n", suffix ? suffix : "");
43 static void print_constraints_polylib(struct isl_basic_set *bset,
44 FILE *out, int indent, const char *prefix, const char *suffix)
46 int i;
48 for (i = 0; i < bset->n_eq; ++i)
49 print_constraint_polylib(bset, 0, i, out,
50 indent, prefix, suffix);
51 for (i = 0; i < bset->n_ineq; ++i)
52 print_constraint_polylib(bset, 1, i, out,
53 indent, prefix, suffix);
56 static void isl_basic_set_print_polylib(struct isl_basic_set *bset, FILE *out,
57 int indent, const char *prefix, const char *suffix)
59 unsigned total = isl_basic_set_total_dim(bset);
60 fprintf(out, "%*s%s", indent, "", prefix ? prefix : "");
61 fprintf(out, "%d %d", bset->n_eq + bset->n_ineq, 1 + total + 1);
62 fprintf(out, "%s\n", suffix ? suffix : "");
63 print_constraints_polylib(bset, out, indent, prefix, suffix);
66 static void isl_set_print_polylib(struct isl_set *set, FILE *out, int indent)
68 int i;
70 fprintf(out, "%*s", indent, "");
71 fprintf(out, "%d\n", set->n);
72 for (i = 0; i < set->n; ++i) {
73 fprintf(out, "\n");
74 isl_basic_set_print_polylib(set->p[i], out, indent, NULL, NULL);
78 static print_name(struct isl_dim *dim, FILE *out,
79 enum isl_dim_type type, unsigned pos, int set)
81 const char *name;
83 name = type == isl_dim_div ? NULL : isl_dim_get_name(dim, type, pos);
85 if (name)
86 fprintf(out, "%s", name);
87 else {
88 const char *prefix;
89 if (type == isl_dim_param)
90 prefix = "p";
91 else if (type == isl_dim_div)
92 prefix = "e";
93 else if (set || type == isl_dim_in)
94 prefix = "i";
95 else
96 prefix = "o";
97 fprintf(out, "%s%d", prefix, pos);
101 static void print_var_list(struct isl_dim *dim, FILE *out,
102 enum isl_dim_type type, int set)
104 int i;
106 for (i = 0; i < isl_dim_size(dim, type); ++i) {
107 if (i)
108 fprintf(out, ", ");
109 print_name(dim, out, type, i, set);
113 static void print_tuple(__isl_keep isl_dim *dim, FILE *out,
114 enum isl_dim_type type, int set)
116 fprintf(out, "[");
117 print_var_list(dim, out, type, set);
118 fprintf(out, "]");
121 static void print_omega_parameters(struct isl_dim *dim, FILE *out,
122 int indent, const char *prefix, const char *suffix)
124 if (isl_dim_size(dim, isl_dim_param) == 0)
125 return;
127 fprintf(out, "%*s%ssymbolic ", indent, "", prefix ? prefix : "");
128 print_var_list(dim, out, isl_dim_param, 0);
129 fprintf(out, ";%s\n", suffix ? suffix : "");
132 static void print_term(__isl_keep isl_dim *dim,
133 isl_int c, int pos, FILE *out, int set)
135 enum isl_dim_type type;
136 unsigned n_in = isl_dim_size(dim, isl_dim_in);
137 unsigned n_out = isl_dim_size(dim, isl_dim_out);
138 unsigned nparam = isl_dim_size(dim, isl_dim_param);
140 if (pos == 0) {
141 isl_int_print(out, c, 0);
142 return;
145 if (!isl_int_is_one(c))
146 isl_int_print(out, c, 0);
147 if (pos < 1 + nparam) {
148 type = isl_dim_param;
149 pos -= 1;
150 } else if (pos < 1 + nparam + n_in) {
151 type = isl_dim_in;
152 pos -= 1 + nparam;
153 } else if (pos < 1 + nparam + n_in + n_out) {
154 type = isl_dim_out;
155 pos -= 1 + nparam + n_in;
156 } else {
157 type = isl_dim_div;
158 pos -= 1 + nparam + n_in + n_out;
160 print_name(dim, out, type, pos, set);
163 static void print_affine(__isl_keep isl_basic_map *bmap, FILE *out,
164 isl_int *c, int set)
166 int i;
167 int first;
168 unsigned len = 1 + isl_basic_map_total_dim(bmap);
170 for (i = 0, first = 1; i < len; ++i) {
171 if (isl_int_is_zero(c[i]))
172 continue;
173 if (!first && isl_int_is_pos(c[i]))
174 fprintf(out, " + ");
175 first = 0;
176 print_term(bmap->dim, c[i], i, out, set);
178 if (first)
179 fprintf(out, "0");
182 static void print_constraint(struct isl_basic_map *bmap, FILE *out,
183 isl_int *c, const char *suffix, int first_constraint, int set)
185 if (!first_constraint)
186 fprintf(out, " and ");
188 print_affine(bmap, out, c, set);
190 fprintf(out, " %s", suffix);
193 static void print_constraints(__isl_keep isl_basic_map *bmap, FILE *out,
194 int set)
196 int i;
198 for (i = 0; i < bmap->n_eq; ++i)
199 print_constraint(bmap, out, bmap->eq[i], "= 0", !i, set);
200 for (i = 0; i < bmap->n_ineq; ++i)
201 print_constraint(bmap, out, bmap->ineq[i], ">= 0",
202 !bmap->n_eq && !i, set);
205 static void print_omega_constraints(__isl_keep isl_basic_map *bmap, FILE *out,
206 int set)
208 if (bmap->n_eq + bmap->n_ineq == 0)
209 return;
211 fprintf(out, ": ");
212 if (bmap->n_div > 0) {
213 int i;
214 fprintf(out, "exists (");
215 for (i = 0; i < bmap->n_div; ++i) {
216 if (i)
217 fprintf(out, ", ");
218 print_name(bmap->dim, out, isl_dim_div, i, 0);
220 fprintf(out, ": ");
222 print_constraints(bmap, out, set);
223 if (bmap->n_div > 0)
224 fprintf(out, ")");
227 static void basic_map_print_omega(struct isl_basic_map *bmap, FILE *out)
229 fprintf(out, "{ [");
230 print_var_list(bmap->dim, out, isl_dim_in, 0);
231 fprintf(out, "] -> [");
232 print_var_list(bmap->dim, out, isl_dim_out, 0);
233 fprintf(out, "] ");
234 print_omega_constraints(bmap, out, 0);
235 fprintf(out, " }");
238 static void isl_basic_map_print_omega(struct isl_basic_map *bmap, FILE *out,
239 int indent, const char *prefix, const char *suffix)
241 print_omega_parameters(bmap->dim, out, indent, prefix, suffix);
243 fprintf(out, "%*s%s", indent, "", prefix ? prefix : "");
244 basic_map_print_omega(bmap, out);
245 fprintf(out, "%s\n", suffix ? suffix : "");
248 static void basic_set_print_omega(struct isl_basic_set *bset, FILE *out)
250 fprintf(out, "{ [");
251 print_var_list(bset->dim, out, isl_dim_set, 1);
252 fprintf(out, "] ");
253 print_omega_constraints((isl_basic_map *)bset, out, 1);
254 fprintf(out, " }");
257 static void isl_basic_set_print_omega(struct isl_basic_set *bset, FILE *out,
258 int indent, const char *prefix, const char *suffix)
260 print_omega_parameters(bset->dim, out, indent, prefix, suffix);
262 fprintf(out, "%*s%s", indent, "", prefix ? prefix : "");
263 basic_set_print_omega(bset, out);
264 fprintf(out, "%s\n", suffix ? suffix : "");
267 static void isl_map_print_omega(struct isl_map *map, FILE *out, int indent)
269 int i;
271 print_omega_parameters(map->dim, out, indent, "", "");
273 fprintf(out, "%*s", indent, "");
274 for (i = 0; i < map->n; ++i) {
275 if (i)
276 fprintf(out, " union ");
277 basic_map_print_omega(map->p[i], out);
279 fprintf(out, "\n");
282 static void isl_set_print_omega(struct isl_set *set, FILE *out, int indent)
284 int i;
286 print_omega_parameters(set->dim, out, indent, "", "");
288 fprintf(out, "%*s", indent, "");
289 for (i = 0; i < set->n; ++i) {
290 if (i)
291 fprintf(out, " union ");
292 basic_set_print_omega(set->p[i], out);
294 fprintf(out, "\n");
297 static void print_disjunct(__isl_keep isl_basic_map *bmap, FILE *out, int set)
299 if (bmap->n_div > 0) {
300 int i;
301 fprintf(out, "exists (");
302 for (i = 0; i < bmap->n_div; ++i) {
303 if (i)
304 fprintf(out, ", ");
305 print_name(bmap->dim, out, isl_dim_div, i, 0);
306 if (isl_int_is_zero(bmap->div[i][0]))
307 continue;
308 fprintf(out, " = [(");
309 print_affine(bmap, out, bmap->div[i] + 1, set);
310 fprintf(out, ")/");
311 isl_int_print(out, bmap->div[i][0], 0);
312 fprintf(out, "]");
314 fprintf(out, ": ");
317 print_constraints(bmap, out, set);
319 if (bmap->n_div > 0)
320 fprintf(out, ")");
323 static void isl_basic_map_print_isl(__isl_keep isl_basic_map *bmap, FILE *out,
324 int indent, const char *prefix, const char *suffix)
326 int i;
328 fprintf(out, "%*s%s", indent, "", prefix ? prefix : "");
329 if (isl_basic_map_dim(bmap, isl_dim_param) > 0) {
330 print_tuple(bmap->dim, out, isl_dim_param, 0);
331 fprintf(out, " -> ");
333 fprintf(out, "{ ");
334 print_tuple(bmap->dim, out, isl_dim_in, 0);
335 fprintf(out, " -> ");
336 print_tuple(bmap->dim, out, isl_dim_out, 0);
337 fprintf(out, " : ");
338 print_disjunct(bmap, out, 0);
339 fprintf(out, " }%s\n", suffix ? suffix : "");
342 static void isl_basic_set_print_isl(__isl_keep isl_basic_set *bset, FILE *out,
343 int indent, const char *prefix, const char *suffix)
345 int i;
347 fprintf(out, "%*s%s", indent, "", prefix ? prefix : "");
348 if (isl_basic_set_dim(bset, isl_dim_param) > 0) {
349 print_tuple(bset->dim, out, isl_dim_param, 0);
350 fprintf(out, " -> ");
352 fprintf(out, "{ ");
353 print_tuple(bset->dim, out, isl_dim_set, 1);
354 fprintf(out, " : ");
355 print_disjunct((isl_basic_map *)bset, out, 1);
356 fprintf(out, " }%s\n", suffix ? suffix : "");
359 static void isl_map_print_isl(__isl_keep isl_map *map, FILE *out, int indent)
361 int i;
363 fprintf(out, "%*s", indent, "");
364 if (isl_map_dim(map, isl_dim_param) > 0) {
365 print_tuple(map->dim, out, isl_dim_param, 0);
366 fprintf(out, " -> ");
368 fprintf(out, "{ ");
369 print_tuple(map->dim, out, isl_dim_in, 0);
370 fprintf(out, " -> ");
371 print_tuple(map->dim, out, isl_dim_out, 0);
372 fprintf(out, " : ");
373 if (map->n == 0)
374 fprintf(out, "1 = 0");
375 for (i = 0; i < map->n; ++i) {
376 if (i)
377 fprintf(out, " or ");
378 print_disjunct(map->p[i], out, 0);
380 fprintf(out, " }\n");
383 static void isl_set_print_isl(__isl_keep isl_set *set, FILE *out, int indent)
385 int i;
387 fprintf(out, "%*s", indent, "");
388 if (isl_set_dim(set, isl_dim_param) > 0) {
389 print_tuple(set->dim, out, isl_dim_param, 0);
390 fprintf(out, " -> ");
392 fprintf(out, "{ ");
393 print_tuple(set->dim, out, isl_dim_set, 1);
394 fprintf(out, " : ");
395 if (set->n == 0)
396 fprintf(out, "1 = 0");
397 for (i = 0; i < set->n; ++i) {
398 if (i)
399 fprintf(out, " or ");
400 print_disjunct((isl_basic_map *)set->p[i], out, 1);
402 fprintf(out, " }\n");
405 void isl_basic_map_print(__isl_keep isl_basic_map *bmap, FILE *out, int indent,
406 const char *prefix, const char *suffix, unsigned output_format)
408 if (!bmap)
409 return;
410 if (output_format == ISL_FORMAT_ISL)
411 isl_basic_map_print_isl(bmap, out, indent, prefix, suffix);
412 else if (output_format == ISL_FORMAT_OMEGA)
413 isl_basic_map_print_omega(bmap, out, indent, prefix, suffix);
414 else
415 isl_assert(bmap->ctx, 0, return);
418 void isl_basic_set_print(struct isl_basic_set *bset, FILE *out, int indent,
419 const char *prefix, const char *suffix, unsigned output_format)
421 if (!bset)
422 return;
423 if (output_format == ISL_FORMAT_ISL)
424 isl_basic_set_print_isl(bset, out, indent, prefix, suffix);
425 else if (output_format == ISL_FORMAT_POLYLIB)
426 isl_basic_set_print_polylib(bset, out, indent, prefix, suffix);
427 else if (output_format == ISL_FORMAT_POLYLIB_CONSTRAINTS)
428 print_constraints_polylib(bset, out, indent, prefix, suffix);
429 else if (output_format == ISL_FORMAT_OMEGA)
430 isl_basic_set_print_omega(bset, out, indent, prefix, suffix);
431 else
432 isl_assert(bset->ctx, 0, return);
435 void isl_set_print(struct isl_set *set, FILE *out, int indent,
436 unsigned output_format)
438 if (!set)
439 return;
440 if (output_format == ISL_FORMAT_ISL)
441 isl_set_print_isl(set, out, indent);
442 else if (output_format == ISL_FORMAT_POLYLIB)
443 isl_set_print_polylib(set, out, indent);
444 else if (output_format == ISL_FORMAT_OMEGA)
445 isl_set_print_omega(set, out, indent);
446 else
447 isl_assert(set->ctx, 0, return);
450 void isl_map_print(__isl_keep isl_map *map, FILE *out, int indent,
451 unsigned output_format)
453 if (!map)
454 return;
455 if (output_format == ISL_FORMAT_ISL)
456 isl_map_print_isl(map, out, indent);
457 else if (output_format == ISL_FORMAT_OMEGA)
458 isl_map_print_omega(map, out, indent);
459 else
460 isl_assert(map->ctx, 0, return);