2 * Copyright 2008-2009 Katholieke Universiteit Leuven
4 * Use of this software is governed by the GNU GPLv2 license
6 * Written by Sven Verdoolaege, K.U.Leuven, Departement
7 * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
11 #include <isl/val_gmp.h>
12 #include <isl/space.h>
15 #include <isl/constraint.h>
16 #include "isl_set_polylib.h"
17 #include "isl_map_polylib.h"
19 static __isl_give isl_constraint
*copy_constraint_from(
20 __isl_take isl_constraint
*dst
, Value
*src
)
23 isl_ctx
*ctx
= isl_constraint_get_ctx(dst
);
25 enum isl_dim_type types
[] = { isl_dim_in
, isl_dim_out
, isl_dim_param
};
28 for (i
= 0; i
< 3; ++i
) {
29 int n
= isl_constraint_dim(dst
, types
[i
]);
30 for (j
= 0; j
< n
; ++j
, ++k
) {
31 v
= isl_val_int_from_gmp(ctx
, src
[k
]);
32 dst
= isl_constraint_set_coefficient_val(dst
, types
[i
],
37 v
= isl_val_int_from_gmp(ctx
, src
[k
]);
38 dst
= isl_constraint_set_constant_val(dst
, v
);
43 static __isl_give isl_basic_map
*add_equality(__isl_take isl_basic_map
*bmap
,
48 c
= isl_constraint_alloc_equality(isl_basic_map_get_local_space(bmap
));
50 c
= copy_constraint_from(c
, constraint
);
52 bmap
= isl_basic_map_add_constraint(bmap
, c
);
57 static __isl_give isl_basic_map
*add_inequality(__isl_take isl_basic_map
*bmap
,
63 ls
= isl_basic_map_get_local_space(bmap
);
64 c
= isl_constraint_alloc_inequality(ls
);
66 copy_constraint_from(c
, constraint
);
68 bmap
= isl_basic_map_add_constraint(bmap
, c
);
73 static __isl_give isl_basic_map
*copy_constraints(
74 __isl_take isl_basic_map
*bmap
, Polyhedron
*P
)
78 for (i
= 0; i
< P
->NbConstraints
; ++i
) {
79 if (value_zero_p(P
->Constraint
[i
][0]))
80 bmap
= add_equality(bmap
, P
->Constraint
[i
]);
82 bmap
= add_inequality(bmap
, P
->Constraint
[i
]);
88 struct isl_basic_set
*isl_basic_set_new_from_polylib(Polyhedron
*P
,
89 struct isl_space
*dim
)
95 ctx
= isl_space_get_ctx(dim
);
96 isl_assert(ctx
, isl_space_dim(dim
, isl_dim_in
) == 0, return NULL
);
98 return (struct isl_basic_set
*)
99 isl_basic_map_new_from_polylib(P
, dim
);
102 struct isl_basic_map
*isl_basic_map_new_from_polylib(Polyhedron
*P
,
103 struct isl_space
*dim
)
106 struct isl_basic_map
*bmap
;
113 ctx
= isl_space_get_ctx(dim
);
114 isl_assert(ctx
, P
, goto error
);
115 isl_assert(ctx
, P
->Dimension
>= isl_space_dim(dim
, isl_dim_all
),
118 n_out
= isl_space_dim(dim
, isl_dim_out
);
119 extra
= P
->Dimension
- isl_space_dim(dim
, isl_dim_all
);
120 dim
= isl_space_from_domain(isl_space_wrap(dim
));
121 dim
= isl_space_add_dims(dim
, isl_dim_out
, extra
);
122 bmap
= isl_basic_map_universe(dim
);
126 bmap
= copy_constraints(bmap
, P
);
127 bmap
= isl_basic_set_unwrap(isl_basic_map_domain(bmap
));
135 struct isl_set
*isl_set_new_from_polylib(Polyhedron
*D
, struct isl_space
*dim
)
138 struct isl_set
*set
= NULL
;
143 ctx
= isl_space_get_ctx(dim
);
144 isl_assert(ctx
, isl_space_dim(dim
, isl_dim_in
) == 0, return NULL
);
146 set
= isl_set_empty(isl_space_copy(dim
));
150 for (P
= D
; P
; P
= P
->next
)
151 set
= isl_set_union_disjoint(set
,
152 isl_set_from_basic_set(
153 isl_basic_set_new_from_polylib(P
, isl_space_copy(dim
))));
161 static isl_stat
count_constraints(__isl_take isl_constraint
*c
, void *user
)
163 int *n
= (int *)user
;
165 isl_constraint_free(c
);
169 struct isl_poly_copy
{
174 static isl_stat
copy_constraint_to(__isl_take isl_constraint
*c
, void *user
)
177 enum isl_dim_type types
[] = { isl_dim_in
, isl_dim_out
,
178 isl_dim_div
, isl_dim_param
};
179 struct isl_poly_copy
*data
= (struct isl_poly_copy
*)user
;
182 if (isl_constraint_is_equality(c
))
183 value_set_si(data
->M
->p
[data
->n
][0], 0);
185 value_set_si(data
->M
->p
[data
->n
][0], 1);
187 for (i
= 0; i
< 4; ++i
) {
188 int n
= isl_constraint_dim(c
, types
[i
]);
189 for (j
= 0; j
< n
; ++j
, ++k
) {
190 v
= isl_constraint_get_coefficient_val(c
, types
[i
], j
);
191 isl_val_get_num_gmp(v
, data
->M
->p
[data
->n
][k
]);
195 v
= isl_constraint_get_constant_val(c
);
196 isl_val_get_num_gmp(v
, data
->M
->p
[data
->n
][k
]);
198 isl_constraint_free(c
);
203 Polyhedron
*isl_basic_map_to_polylib(struct isl_basic_map
*bmap
)
212 struct isl_poly_copy data
;
217 if (isl_basic_map_is_rational(bmap
))
218 max_rays
= POL_NO_DUAL
;
220 max_rays
= POL_NO_DUAL
| POL_INTEGER
;
222 if (isl_basic_map_foreach_constraint(bmap
, &count_constraints
, &n
) < 0)
225 nparam
= isl_basic_map_n_param(bmap
);
226 n_in
= isl_basic_map_n_in(bmap
);
227 n_out
= isl_basic_map_n_out(bmap
);
228 n_div
= isl_basic_map_dim(bmap
, isl_dim_div
);
229 data
.M
= Matrix_Alloc(n
, 1 + n_in
+ n_out
+ n_div
+ nparam
+ 1);
231 if (isl_basic_map_foreach_constraint(bmap
,
232 ©_constraint_to
, &data
) < 0) {
236 P
= Constraints2Polyhedron(data
.M
, max_rays
);
242 static isl_stat
add_basic_map(__isl_take isl_basic_map
*bmap
, void *user
)
244 Polyhedron
***next
= user
;
246 **next
= isl_basic_map_to_polylib(bmap
);
247 *next
= &(**next
)->next
;
249 isl_basic_map_free(bmap
);
253 Polyhedron
*isl_map_to_polylib(struct isl_map
*map
)
255 Polyhedron
*R
= NULL
;
256 Polyhedron
**next
= &R
;
261 if (isl_map_foreach_basic_map(map
, &add_basic_map
, &next
) < 0)
264 return R
? R
: Empty_Polyhedron(isl_map_dim(map
, isl_dim_all
));
270 Polyhedron
*isl_basic_set_to_polylib(struct isl_basic_set
*bset
)
272 return isl_basic_map_to_polylib((struct isl_basic_map
*)bset
);
275 Polyhedron
*isl_set_to_polylib(struct isl_set
*set
)
277 return isl_map_to_polylib((struct isl_map
*)set
);