1 #include <isl_constraint.h>
2 #include "isl_map_private.h"
4 static unsigned n(struct isl_constraint *c, enum isl_dim_type type)
6 struct isl_dim *dim = c->bmap->dim;
8 case isl_dim_param: return dim->nparam;
9 case isl_dim_in: return dim->n_in;
10 case isl_dim_out: return dim->n_out;
11 case isl_dim_div: return c->bmap->n_div;
12 case isl_dim_all: return isl_basic_map_total_dim(c->bmap);
16 static unsigned offset(struct isl_constraint *c, enum isl_dim_type type)
18 struct isl_dim *dim = c->bmap->dim;
20 case isl_dim_param: return 1;
21 case isl_dim_in: return 1 + dim->nparam;
22 case isl_dim_out: return 1 + dim->nparam + dim->n_in;
23 case isl_dim_div: return 1 + dim->nparam + dim->n_in + dim->n_out;
27 struct isl_constraint *isl_basic_map_constraint(struct isl_basic_map *bmap,
30 struct isl_constraint *constraint;
35 constraint = isl_alloc_type(bmap->ctx, struct isl_constraint);
39 constraint->ctx = bmap->ctx;
40 isl_ctx_ref(constraint->ctx);
42 constraint->bmap = bmap;
43 constraint->line = line;
47 isl_basic_map_free(bmap);
51 struct isl_constraint *isl_basic_set_constraint(struct isl_basic_set *bset,
54 return isl_basic_map_constraint((struct isl_basic_map *)bset, line);
57 struct isl_constraint *isl_constraint_dup(struct isl_constraint *c)
62 return isl_basic_map_constraint(isl_basic_map_copy(c->bmap), c->line);
65 struct isl_constraint *isl_constraint_cow(struct isl_constraint *c)
73 return isl_constraint_dup(c);
76 struct isl_constraint *isl_constraint_copy(struct isl_constraint *constraint)
85 struct isl_constraint *isl_constraint_free(struct isl_constraint *c)
93 isl_basic_map_free(c->bmap);
94 isl_ctx_deref(c->ctx);
98 struct isl_constraint *isl_basic_set_first_constraint(
99 struct isl_basic_set *bset)
101 struct isl_constraint *c;
107 return isl_basic_set_constraint(bset, &bset->eq[0]);
109 if (bset->n_ineq > 0)
110 return isl_basic_set_constraint(bset, &bset->ineq[0]);
112 isl_basic_set_free(bset);
116 struct isl_constraint *isl_constraint_next(struct isl_constraint *c)
118 c = isl_constraint_cow(c);
120 if (c->line >= c->bmap->eq + c->bmap->n_eq && c->line < c->bmap->ineq)
121 c->line = c->bmap->ineq;
122 if (c->line < c->bmap->ineq + c->bmap->n_ineq)
124 isl_constraint_free(c);
128 int isl_constraint_is_equal(struct isl_constraint *constraint1,
129 struct isl_constraint *constraint2)
131 if (!constraint1 || !constraint2)
133 return constraint1->bmap == constraint2->bmap &&
134 constraint1->line == constraint2->line;
137 int isl_constraint_dim(struct isl_constraint *constraint,
138 enum isl_dim_type type)
142 return n(constraint, type);
145 void isl_constraint_get_constant(struct isl_constraint *constraint, isl_int *v)
149 isl_int_set(*v, constraint->line[0][0]);
152 void isl_constraint_get_coefficient(struct isl_constraint *constraint,
153 enum isl_dim_type type, int pos, isl_int *v)
158 isl_assert(constraint->ctx, pos < n(constraint, type), return);
159 isl_int_set(*v, constraint->line[0][offset(constraint, type) + pos]);
162 void isl_constraint_set_constant(struct isl_constraint *constraint, isl_int v)
166 isl_int_set(constraint->line[0][0], v);
169 void isl_constraint_set_coefficient(struct isl_constraint *constraint,
170 enum isl_dim_type type, int pos, isl_int v)
175 isl_assert(constraint->ctx, pos < n(constraint, type), return);
176 isl_int_set(constraint->line[0][offset(constraint, type) + pos], v);
179 void isl_constraint_clear(struct isl_constraint *constraint)
181 struct isl_basic_set *bset;
186 total = isl_basic_map_total_dim(constraint->bmap);
187 isl_seq_clr(constraint->line[0], 1 + total);
190 int isl_constraint_is_equality(struct isl_constraint *constraint)
194 return constraint->line < constraint->bmap->eq + constraint->bmap->n_eq;
198 struct isl_basic_set *isl_basic_set_from_constraint(
199 struct isl_constraint *constraint)
202 struct isl_basic_set *constraint_bset, *bset;
211 isl_assert(constraint->ctx,n(constraint, isl_dim_in) == 0, goto error);
213 constraint_bset = (struct isl_basic_set *)constraint->bmap;
214 bset = isl_basic_set_universe_like(constraint_bset);
215 bset = isl_basic_set_align_divs(bset, constraint_bset);
216 nparam = isl_basic_set_n_param(bset);
217 dim = isl_basic_set_n_dim(bset);
218 bset = isl_basic_set_extend(bset, nparam, dim, 0, 1, 1);
219 if (isl_constraint_is_equality(constraint)) {
220 k = isl_basic_set_alloc_equality(bset);
226 k = isl_basic_set_alloc_inequality(bset);
231 total = isl_basic_set_total_dim(bset);
232 isl_seq_cpy(c, constraint->line[0], 1 + total);
233 isl_constraint_free(constraint);
236 isl_constraint_free(constraint);
237 isl_basic_set_free(bset);
241 int isl_basic_set_has_defining_equality(
242 struct isl_basic_set *bset, int pos,
243 struct isl_constraint **c)
246 unsigned dim, nparam;
250 nparam = isl_basic_set_n_param(bset);
251 dim = isl_basic_set_n_dim(bset);
252 isl_assert(bset->ctx, pos < dim, return -1);
253 for (i = 0; i < bset->n_eq; ++i)
254 if (!isl_int_is_zero(bset->eq[i][1 + nparam + pos]) &&
255 isl_seq_first_non_zero(bset->eq[i]+1+nparam+pos+1,
257 *c= isl_basic_set_constraint(isl_basic_set_copy(bset),
264 int isl_basic_set_has_defining_inequalities(
265 struct isl_basic_set *bset, int pos,
266 struct isl_constraint **lower,
267 struct isl_constraint **upper)
274 isl_int **lower_line, **upper_line;
278 nparam = isl_basic_set_n_param(bset);
279 dim = isl_basic_set_n_dim(bset);
280 total = isl_basic_set_total_dim(bset);
281 isl_assert(bset->ctx, pos < dim, return -1);
283 for (i = 0; i < bset->n_ineq; ++i) {
284 if (isl_int_is_zero(bset->ineq[i][1 + nparam + pos]))
286 if (isl_int_is_one(bset->ineq[i][1 + nparam + pos]))
288 if (isl_int_is_negone(bset->ineq[i][1 + nparam + pos]))
290 if (isl_seq_first_non_zero(bset->ineq[i]+1+nparam+pos+1,
293 for (j = i + i; j < bset->n_ineq; ++j) {
294 if (!isl_seq_is_neg(bset->ineq[i]+1, bset->ineq[j]+1,
297 isl_int_add(m, bset->ineq[i][0], bset->ineq[j][0]);
298 if (isl_int_abs_ge(m, bset->ineq[i][1+nparam+pos]))
301 if (isl_int_is_pos(bset->ineq[i][1+nparam+pos])) {
302 lower_line = &bset->ineq[i];
303 upper_line = &bset->ineq[j];
305 lower_line = &bset->ineq[j];
306 upper_line = &bset->ineq[i];
308 *lower = isl_basic_set_constraint(
309 isl_basic_set_copy(bset), lower_line);
310 *upper = isl_basic_set_constraint(
311 isl_basic_set_copy(bset), upper_line);