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
12 #include <isl/constraint.h>
13 #include "isl_set_polylib.h"
14 #include "isl_map_polylib.h"
16 static void copy_constraint_from(__isl_keep isl_constraint
*dst
, Value
*src
)
19 enum isl_dim_type types
[] = { isl_dim_in
, isl_dim_out
, isl_dim_param
};
22 for (i
= 0; i
< 3; ++i
) {
23 int n
= isl_constraint_dim(dst
, types
[i
]);
24 for (j
= 0; j
< n
; ++j
, ++k
)
25 isl_constraint_set_coefficient(dst
, types
[i
], j
, src
[k
]);
28 isl_constraint_set_constant(dst
, src
[k
]);
31 static __isl_give isl_basic_map
*add_equality(__isl_take isl_basic_map
*bmap
,
36 c
= isl_equality_alloc(isl_basic_map_get_local_space(bmap
));
38 copy_constraint_from(c
, constraint
);
40 bmap
= isl_basic_map_add_constraint(bmap
, c
);
45 static __isl_give isl_basic_map
*add_inequality(__isl_take isl_basic_map
*bmap
,
50 c
= isl_inequality_alloc(isl_basic_map_get_local_space(bmap
));
52 copy_constraint_from(c
, constraint
);
54 bmap
= isl_basic_map_add_constraint(bmap
, c
);
59 static __isl_give isl_basic_map
*copy_constraints(
60 __isl_take isl_basic_map
*bmap
, Polyhedron
*P
)
64 for (i
= 0; i
< P
->NbConstraints
; ++i
) {
65 if (value_zero_p(P
->Constraint
[i
][0]))
66 bmap
= add_equality(bmap
, P
->Constraint
[i
]);
68 bmap
= add_inequality(bmap
, P
->Constraint
[i
]);
74 struct isl_basic_set
*isl_basic_set_new_from_polylib(Polyhedron
*P
,
75 struct isl_space
*dim
)
81 ctx
= isl_space_get_ctx(dim
);
82 isl_assert(ctx
, isl_space_dim(dim
, isl_dim_in
) == 0, return NULL
);
84 return (struct isl_basic_set
*)
85 isl_basic_map_new_from_polylib(P
, dim
);
88 struct isl_basic_map
*isl_basic_map_new_from_polylib(Polyhedron
*P
,
89 struct isl_space
*dim
)
92 struct isl_basic_map
*bmap
;
99 ctx
= isl_space_get_ctx(dim
);
100 isl_assert(ctx
, P
, goto error
);
101 isl_assert(ctx
, P
->Dimension
>= isl_space_dim(dim
, isl_dim_all
),
104 n_out
= isl_space_dim(dim
, isl_dim_out
);
105 extra
= P
->Dimension
- isl_space_dim(dim
, isl_dim_all
);
106 dim
= isl_space_from_domain(isl_space_wrap(dim
));
107 dim
= isl_space_add_dims(dim
, isl_dim_out
, extra
);
108 bmap
= isl_basic_map_universe(dim
);
112 bmap
= copy_constraints(bmap
, P
);
113 bmap
= isl_basic_set_unwrap(isl_basic_map_domain(bmap
));
121 struct isl_set
*isl_set_new_from_polylib(Polyhedron
*D
, struct isl_space
*dim
)
124 struct isl_set
*set
= NULL
;
129 ctx
= isl_space_get_ctx(dim
);
130 isl_assert(ctx
, isl_space_dim(dim
, isl_dim_in
) == 0, return NULL
);
132 set
= isl_set_empty(isl_space_copy(dim
));
136 for (P
= D
; P
; P
= P
->next
)
137 set
= isl_set_union_disjoint(set
,
138 isl_set_from_basic_set(
139 isl_basic_set_new_from_polylib(P
, isl_space_copy(dim
))));
147 struct isl_map
*isl_map_new_from_polylib(Polyhedron
*D
, struct isl_space
*dim
)
149 struct isl_map
*map
= NULL
;
155 map
= isl_map_empty(isl_space_copy(dim
));
159 for (P
= D
; P
; P
= P
->next
)
160 map
= isl_map_union_disjoint(map
,
161 isl_map_from_basic_map(
162 isl_basic_map_new_from_polylib(P
, isl_space_copy(dim
))));
170 static int count_constraints(__isl_take isl_constraint
*c
, void *user
)
172 int *n
= (int *)user
;
174 isl_constraint_free(c
);
178 struct isl_poly_copy
{
183 static int copy_constraint_to(__isl_take isl_constraint
*c
, void *user
)
186 enum isl_dim_type types
[] = { isl_dim_in
, isl_dim_out
,
187 isl_dim_div
, isl_dim_param
};
188 struct isl_poly_copy
*data
= (struct isl_poly_copy
*)user
;
190 if (isl_constraint_is_equality(c
))
191 value_set_si(data
->M
->p
[data
->n
][0], 0);
193 value_set_si(data
->M
->p
[data
->n
][0], 1);
195 for (i
= 0; i
< 4; ++i
) {
196 int n
= isl_constraint_dim(c
, types
[i
]);
197 for (j
= 0; j
< n
; ++j
, ++k
)
198 isl_constraint_get_coefficient(c
, types
[i
], j
,
199 &data
->M
->p
[data
->n
][k
]);
201 isl_constraint_get_constant(c
, &data
->M
->p
[data
->n
][k
]);
202 isl_constraint_free(c
);
207 Polyhedron
*isl_basic_map_to_polylib(struct isl_basic_map
*bmap
)
217 struct isl_poly_copy data
;
222 if (isl_basic_map_is_rational(bmap
))
223 max_rays
= POL_NO_DUAL
;
225 max_rays
= POL_NO_DUAL
| POL_INTEGER
;
227 if (isl_basic_map_foreach_constraint(bmap
, &count_constraints
, &n
) < 0)
230 nparam
= isl_basic_map_n_param(bmap
);
231 n_in
= isl_basic_map_n_in(bmap
);
232 n_out
= isl_basic_map_n_out(bmap
);
233 n_div
= isl_basic_map_dim(bmap
, isl_dim_div
);
234 data
.M
= Matrix_Alloc(n
, 1 + n_in
+ n_out
+ n_div
+ nparam
+ 1);
236 if (isl_basic_map_foreach_constraint(bmap
,
237 ©_constraint_to
, &data
) < 0) {
241 P
= Constraints2Polyhedron(data
.M
, max_rays
);
247 static int add_basic_map(__isl_take isl_basic_map
*bmap
, void *user
)
249 Polyhedron
***next
= user
;
251 **next
= isl_basic_map_to_polylib(bmap
);
252 *next
= &(**next
)->next
;
254 isl_basic_map_free(bmap
);
258 Polyhedron
*isl_map_to_polylib(struct isl_map
*map
)
261 Polyhedron
*R
= NULL
;
262 Polyhedron
**next
= &R
;
267 if (isl_map_foreach_basic_map(map
, &add_basic_map
, &next
) < 0)
270 return R
? R
: Empty_Polyhedron(isl_map_dim(map
, isl_dim_all
));
276 Polyhedron
*isl_basic_set_to_polylib(struct isl_basic_set
*bset
)
278 return isl_basic_map_to_polylib((struct isl_basic_map
*)bset
);
281 Polyhedron
*isl_set_to_polylib(struct isl_set
*set
)
283 return isl_map_to_polylib((struct isl_map
*)set
);