add tiny test program
[isl-ppl.git] / isl_map_ppl.c
blob353d75feb1d55909f5a708e56298e12ec079498c
1 #include "isl_constraint.h"
2 #include "isl_dim.h"
3 #include "isl_set_ppl.h"
5 static void ppl_dim_to_isl_dim(isl_basic_map *bmap, int pos,
6 enum isl_dim_type *type, int *i_pos)
8 if (pos < isl_basic_map_dim(bmap, isl_dim_out)) {
9 *type = isl_dim_out;
10 *i_pos = pos;
11 return;
13 pos -= isl_basic_map_dim(bmap, isl_dim_out);
15 if (pos < isl_basic_map_dim(bmap, isl_dim_in)) {
16 *type = isl_dim_in;
17 *i_pos = pos;
18 return;
20 pos -= isl_basic_map_dim(bmap, isl_dim_in);
22 if (pos < isl_basic_map_dim(bmap, isl_dim_div)) {
23 *type = isl_dim_div;
24 *i_pos = pos;
25 return;
27 pos -= isl_basic_map_dim(bmap, isl_dim_div);
29 *type = isl_dim_param;
30 *i_pos = pos;
33 ppl_Polyhedron_t isl_basic_map_to_ppl(__isl_keep isl_basic_map *bmap)
35 unsigned dim;
36 ppl_Polyhedron_t pol;
37 isl_constraint *c;
38 isl_dim *dims = NULL;
39 ppl_Coefficient_t coeff;
40 int allocated_coeff = 0;
41 isl_int v;
43 if (!bmap)
44 return NULL;
46 dim = isl_basic_map_dim(bmap, isl_dim_all);
47 if (ppl_new_C_Polyhedron_from_space_dimension(&pol, dim, 0) < 0)
48 return NULL;
50 isl_int_init(v);
52 if (ppl_new_Coefficient(&coeff) < 0)
53 goto error;
54 allocated_coeff = 1;
56 bmap = isl_basic_map_copy(bmap);
57 for (c = isl_basic_map_first_constraint(bmap); c;
58 c = isl_constraint_next(c)) {
59 int i;
60 int err = 0;
61 ppl_Linear_Expression_t le;
62 ppl_Constraint_t con;
63 int eq = isl_constraint_is_equality(c);
65 if (ppl_new_Linear_Expression_with_dimension(&le, dim) < 0)
66 goto error;
68 for (i = 0; i < dim; ++i) {
69 int j;
70 enum isl_dim_type type;
72 ppl_dim_to_isl_dim(bmap, i, &type, &j);
73 isl_constraint_get_coefficient(c, type, j, &v);
74 ppl_assign_Coefficient_from_mpz_t(coeff, v);
76 if (ppl_Linear_Expression_add_to_coefficient(le, i, coeff) < 0)
77 break;
79 if (i < dim)
80 err = 1;
82 isl_constraint_get_constant(c, &v);
83 ppl_assign_Coefficient_from_mpz_t(coeff, v);
84 if (ppl_Linear_Expression_add_to_inhomogeneous(le, coeff) < 0)
85 err = 1;
87 if (ppl_new_Constraint(&con, le,
88 eq ? PPL_CONSTRAINT_TYPE_EQUAL :
89 PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL) < 0)
90 err = 1;
92 ppl_delete_Linear_Expression(le);
94 if (!err && ppl_Polyhedron_add_constraint(pol, con) < 0)
95 err = 1;
97 ppl_delete_Constraint(con);
98 if (err)
99 goto error;
102 ppl_delete_Coefficient(coeff);
103 isl_int_clear(v);
105 return pol;
106 error:
107 isl_int_clear(v);
108 if (allocated_coeff)
109 ppl_delete_Coefficient(coeff);
110 isl_dim_free(dims);
111 ppl_delete_Polyhedron(pol);
112 return NULL;
115 static add_basic_map(isl_basic_map *bmap, void *user)
117 ppl_Polyhedron_t pol;
118 ppl_Pointset_Powerset_C_Polyhedron_t ps;
120 ps = (ppl_Pointset_Powerset_C_Polyhedron_t) user;
122 pol = isl_basic_map_to_ppl(bmap);
123 isl_basic_map_free(bmap);
125 if (!pol)
126 return -1;
128 if (ppl_Pointset_Powerset_C_Polyhedron_add_disjunct(ps, pol))
129 goto error;
131 ppl_delete_Polyhedron(pol);
132 return 0;
133 error:
134 ppl_delete_Polyhedron(pol);
135 return -1;
138 static get_total_dim(isl_basic_map *bmap, void *user)
140 unsigned *dim = (unsigned *)user;
142 *dim = isl_basic_map_total_dim(bmap);
143 isl_basic_map_free(bmap);
145 return 0;
148 ppl_Pointset_Powerset_C_Polyhedron_t isl_map_to_ppl(__isl_keep isl_map *map)
150 unsigned dim;
151 ppl_Pointset_Powerset_C_Polyhedron_t ps;
153 map = isl_map_align_divs(map);
154 if (!map)
155 return NULL;
157 if (isl_map_foreach_basic_map(map, &get_total_dim, &dim) < 0)
158 return NULL;
160 if (ppl_new_Pointset_Powerset_C_Polyhedron_from_space_dimension(&ps, dim, 1) < 0)
161 return NULL;
163 if (isl_map_foreach_basic_map(map, &add_basic_map, ps) < 0)
164 goto error;
166 return ps;
167 error:
168 ppl_delete_Pointset_Powerset_C_Polyhedron(ps);
169 return NULL;
172 __isl_give isl_basic_map *isl_basic_map_new_from_ppl(
173 ppl_const_Polyhedron_t pol, __isl_take isl_dim *dim)
175 unsigned d;
176 isl_int v;
177 ppl_Coefficient_t coeff;
178 ppl_const_Constraint_System_t cs;
179 ppl_Constraint_System_const_iterator_t cit, cit_end;
180 isl_basic_map *bmap = NULL;
181 ppl_dimension_type ppl_dim;
182 int extra;
184 isl_int_init(v);
186 if (ppl_Polyhedron_get_minimized_constraints(pol, &cs) < 0)
187 goto error;
188 if (ppl_Constraint_System_space_dimension(cs, &ppl_dim) < 0)
189 goto error;
191 if (ppl_new_Constraint_System_const_iterator(&cit) < 0)
192 goto error;
193 if (ppl_new_Constraint_System_const_iterator(&cit_end) < 0)
194 goto error1;
195 if (ppl_Constraint_System_begin(cs, cit) < 0)
196 goto error2;
197 if (ppl_Constraint_System_end(cs, cit_end) < 0)
198 goto error2;
200 if (ppl_new_Coefficient(&coeff) < 0)
201 goto error2;
203 extra = ppl_dim - isl_dim_total(dim);
204 dim = isl_dim_add(dim, isl_dim_in, extra);
205 bmap = isl_basic_map_universe(isl_dim_copy(dim));
207 d = isl_dim_total(dim);
209 while (!ppl_Constraint_System_const_iterator_equal_test(cit, cit_end)) {
210 struct isl_constraint *c;
211 ppl_const_Constraint_t con;
212 int i;
213 int eq;
215 if (ppl_Constraint_System_const_iterator_dereference(cit, &con) < 0)
216 goto error3;
218 eq = ppl_Constraint_type(con) == PPL_CONSTRAINT_TYPE_EQUAL;
219 if (eq)
220 c = isl_equality_alloc(isl_dim_copy(dim));
221 else
222 c = isl_inequality_alloc(isl_dim_copy(dim));
224 for (i = 0; i < d; ++i) {
225 int j;
226 enum isl_dim_type type;
228 ppl_dim_to_isl_dim(bmap, i, &type, &j);
229 if (ppl_Constraint_coefficient(con, i, coeff) < 0)
230 goto error3;
231 if (ppl_Coefficient_to_mpz_t(coeff, v) < 0)
232 goto error3;
233 isl_constraint_set_coefficient(c, type, j, v);
235 if (ppl_Constraint_inhomogeneous_term(con, coeff) < 0)
236 goto error3;
237 if (ppl_Coefficient_to_mpz_t(coeff, v) < 0)
238 goto error3;
239 isl_constraint_set_constant(c, v);
241 bmap = isl_basic_map_add_constraint(bmap, c);
243 if (ppl_Constraint_System_const_iterator_increment(cit) < 0)
244 goto error3;
247 ppl_delete_Coefficient(coeff);
248 ppl_delete_Constraint_System_const_iterator(cit_end);
249 ppl_delete_Constraint_System_const_iterator(cit);
251 isl_int_clear(v);
253 isl_dim_free(dim);
255 bmap = isl_basic_map_project_out(bmap, isl_dim_in,
256 isl_basic_map_dim(bmap, isl_dim_in) - extra, extra);
258 return bmap;
259 error3:
260 ppl_delete_Coefficient(coeff);
261 error2:
262 ppl_delete_Constraint_System_const_iterator(cit_end);
263 error1:
264 ppl_delete_Constraint_System_const_iterator(cit);
265 error:
266 isl_int_clear(v);
267 isl_dim_free(dim);
268 isl_basic_map_free(bmap);
269 return NULL;
272 __isl_give isl_map *isl_map_new_from_ppl(
273 ppl_const_Pointset_Powerset_C_Polyhedron_t ps, __isl_take isl_dim *dim)
275 isl_map *map;
276 ppl_Pointset_Powerset_C_Polyhedron_const_iterator_t pit, pit_end;
278 map = isl_map_empty(isl_dim_copy(dim));
279 if (!map)
280 goto error;
282 if (ppl_new_Pointset_Powerset_C_Polyhedron_const_iterator(&pit) < 0)
283 goto error;
284 if (ppl_Pointset_Powerset_C_Polyhedron_const_iterator_begin(ps, pit) < 0)
285 goto error1;
286 if (ppl_new_Pointset_Powerset_C_Polyhedron_const_iterator(&pit_end) < 0)
287 goto error1;
288 if (ppl_Pointset_Powerset_C_Polyhedron_const_iterator_end(ps, pit_end) < 0)
289 goto error2;
291 while (!ppl_Pointset_Powerset_C_Polyhedron_const_iterator_equal_test(pit, pit_end)) {
292 ppl_const_Polyhedron_t pol;
293 isl_basic_map *bmap;
295 if (ppl_Pointset_Powerset_C_Polyhedron_const_iterator_dereference(pit, &pol) < 0)
296 goto error2;
298 bmap = isl_basic_map_new_from_ppl(pol, isl_dim_copy(dim));
300 map = isl_map_union(map, isl_map_from_basic_map(bmap));
302 if (ppl_Pointset_Powerset_C_Polyhedron_const_iterator_increment(pit) < 0)
303 goto error2;
306 ppl_delete_Pointset_Powerset_C_Polyhedron_const_iterator(pit);
307 ppl_delete_Pointset_Powerset_C_Polyhedron_const_iterator(pit_end);
309 isl_dim_free(dim);
311 return map;
312 error2:
313 ppl_delete_Pointset_Powerset_C_Polyhedron_const_iterator(pit_end);
314 error1:
315 ppl_delete_Pointset_Powerset_C_Polyhedron_const_iterator(pit);
316 error:
317 isl_map_free(map);
318 isl_dim_free(dim);
319 return NULL;
322 ppl_Pointset_Powerset_C_Polyhedron_t isl_set_to_ppl(__isl_keep isl_set *set)
324 return isl_map_to_ppl((isl_map *)set);
327 __isl_give isl_set *isl_set_new_from_ppl(
328 ppl_const_Pointset_Powerset_C_Polyhedron_t ps, __isl_take isl_dim *dim)
330 return (isl_set *)isl_map_new_from_ppl(ps, dim);