1 #include <isl_constraint.h>
2 #include "isl_map_private.h"
4 struct isl_basic_set *isl_basic_set_constraint_set(
5 struct isl_basic_set_constraint constraint)
7 return constraint.bset;
10 struct isl_basic_set_constraint isl_basic_set_constraint_invalid()
12 struct isl_basic_set_constraint c;
18 struct isl_basic_set_constraint isl_basic_set_first_constraint(
19 struct isl_basic_set *bset)
21 struct isl_basic_set_constraint c;
24 return isl_basic_set_constraint_invalid();
28 c.line = &bset->eq[0];
32 if (bset->n_ineq > 0) {
34 c.line = &bset->ineq[0];
38 return isl_basic_set_constraint_invalid();
41 struct isl_basic_set_constraint isl_basic_set_constraint_next(
42 struct isl_basic_set_constraint constraint)
44 struct isl_basic_set_constraint c = constraint;
47 if (c.line >= c.bset->eq + c.bset->n_eq && c.line < c.bset->ineq)
48 c.line = c.bset->ineq;
49 if (c.line >= c.bset->ineq + c.bset->n_ineq)
50 return isl_basic_set_constraint_invalid();
54 int isl_basic_set_constraint_is_valid(
55 struct isl_basic_set_constraint constraint)
57 return constraint.bset != NULL && constraint.line != NULL;
60 int isl_basic_set_constraint_is_equal(
61 struct isl_basic_set_constraint constraint1,
62 struct isl_basic_set_constraint constraint2)
64 return constraint1.bset == constraint2.bset &&
65 constraint1.line == constraint2.line;
68 int isl_basic_set_constraint_nparam(
69 struct isl_basic_set_constraint constraint)
71 if (!isl_basic_set_constraint_is_valid(constraint))
73 return constraint.bset->nparam;
76 int isl_basic_set_constraint_dim(
77 struct isl_basic_set_constraint constraint)
79 if (!isl_basic_set_constraint_is_valid(constraint))
81 return constraint.bset->dim;
84 int isl_basic_set_constraint_n_div(
85 struct isl_basic_set_constraint constraint)
87 if (!isl_basic_set_constraint_is_valid(constraint))
89 return constraint.bset->n_div;
92 void isl_basic_set_constraint_get_constant(
93 struct isl_basic_set_constraint constraint, isl_int *v)
95 if (!isl_basic_set_constraint_is_valid(constraint))
97 isl_int_set(*v, constraint.line[0][0]);
100 void isl_basic_set_constraint_get_dim(
101 struct isl_basic_set_constraint constraint, int pos, isl_int *v)
103 if (!isl_basic_set_constraint_is_valid(constraint))
105 isl_assert(constraint.bset->ctx, pos < constraint.bset->dim, return);
106 isl_int_set(*v, constraint.line[0][1 + constraint.bset->nparam + pos]);
109 void isl_basic_set_constraint_get_div(
110 struct isl_basic_set_constraint constraint, int pos, isl_int *v)
112 if (!isl_basic_set_constraint_is_valid(constraint))
114 isl_assert(constraint.bset->ctx, pos < constraint.bset->n_div, return);
115 isl_int_set(*v, constraint.line[0][1 + constraint.bset->nparam +
116 constraint.bset->dim + pos]);
119 void isl_basic_set_constraint_get_param(
120 struct isl_basic_set_constraint constraint, int pos, isl_int *v)
122 if (!isl_basic_set_constraint_is_valid(constraint))
124 isl_assert(constraint.bset->ctx, pos < constraint.bset->nparam, return);
125 isl_int_set(*v, constraint.line[0][1 + pos]);
128 void isl_basic_set_constraint_set_dim(
129 struct isl_basic_set_constraint constraint, int pos, isl_int v)
131 if (!isl_basic_set_constraint_is_valid(constraint))
133 isl_assert(constraint.bset->ctx, constraint.bset->ref == 1, return);
134 isl_assert(constraint.bset->ctx, pos < constraint.bset->dim, return);
135 isl_int_set(constraint.line[0][1 + constraint.bset->nparam + pos], v);
138 void isl_basic_set_constraint_set_param(
139 struct isl_basic_set_constraint constraint, int pos, isl_int v)
141 if (!isl_basic_set_constraint_is_valid(constraint))
143 isl_assert(constraint.bset->ctx, constraint.bset->ref == 1, return);
144 isl_assert(constraint.bset->ctx, pos < constraint.bset->nparam, return);
145 isl_int_set(constraint.line[0][1 + pos], v);
148 void isl_basic_set_constraint_clear(struct isl_basic_set_constraint constraint)
150 struct isl_basic_set *bset = constraint.bset;
153 if (!isl_basic_set_constraint_is_valid(constraint))
155 total = bset->nparam + bset->dim + bset->n_div;
156 isl_seq_clr(constraint.line[0], 1 + total);
159 int isl_basic_set_constraint_is_equality(
160 struct isl_basic_set_constraint constraint)
162 if (!isl_basic_set_constraint_is_valid(constraint))
164 return constraint.line < constraint.bset->eq + constraint.bset->n_eq;
167 int isl_basic_set_constraint_is_dim_lower_bound(
168 struct isl_basic_set_constraint constraint, int pos)
170 if (!isl_basic_set_constraint_is_valid(constraint))
172 isl_assert(constraint.bset->ctx, pos < constraint.bset->dim, return -1);
173 return isl_int_is_pos(constraint.line[0][1+constraint.bset->nparam+pos]);
176 int isl_basic_set_constraint_is_dim_upper_bound(
177 struct isl_basic_set_constraint constraint, int pos)
179 if (!isl_basic_set_constraint_is_valid(constraint))
181 isl_assert(constraint.bset->ctx, pos < constraint.bset->dim, return -1);
182 return isl_int_is_neg(constraint.line[0][1+constraint.bset->nparam+pos]);
186 struct isl_basic_set *isl_basic_set_from_constraint(
187 struct isl_basic_set_constraint constraint)
190 struct isl_basic_set *bset;
194 if (!isl_basic_set_constraint_is_valid(constraint))
197 bset = isl_basic_set_universe(constraint.bset->ctx,
198 constraint.bset->nparam, constraint.bset->dim);
199 bset = isl_basic_set_align_divs(bset, constraint.bset);
200 bset = isl_basic_set_extend(bset, bset->nparam, bset->dim, 0, 1, 1);
201 if (isl_basic_set_constraint_is_equality(constraint)) {
202 k = isl_basic_set_alloc_equality(bset);
208 k = isl_basic_set_alloc_inequality(bset);
213 total = bset->nparam + bset->dim + bset->n_div;
214 isl_seq_cpy(c, constraint.line[0], 1 + total);
217 isl_basic_set_free(bset);
221 int isl_basic_set_has_defining_equality(
222 struct isl_basic_set *bset, int pos,
223 struct isl_basic_set_constraint *constraint)
229 isl_assert(bset->ctx, pos < bset->dim, return -1);
230 for (i = 0; i < bset->n_eq; ++i)
231 if (!isl_int_is_zero(bset->eq[i][1 + bset->nparam + pos]) &&
232 isl_seq_first_non_zero(bset->eq[i]+1+bset->nparam+pos+1,
233 bset->dim-pos-1) == -1) {
234 constraint->bset = bset;
235 constraint->line = &bset->eq[i];
241 int isl_basic_set_has_defining_inequalities(
242 struct isl_basic_set *bset, int pos,
243 struct isl_basic_set_constraint *lower,
244 struct isl_basic_set_constraint *upper)
252 isl_assert(bset->ctx, pos < bset->dim, return -1);
253 total = bset->nparam + bset->dim + bset->n_div;
255 for (i = 0; i < bset->n_ineq; ++i) {
256 if (isl_int_is_zero(bset->ineq[i][1 + bset->nparam + pos]))
258 if (isl_int_is_one(bset->ineq[i][1 + bset->nparam + pos]))
260 if (isl_int_is_negone(bset->ineq[i][1 + bset->nparam + pos]))
262 if (isl_seq_first_non_zero(bset->ineq[i]+1+bset->nparam+pos+1,
263 bset->dim-pos-1) != -1)
265 for (j = i + i; j < bset->n_ineq; ++j) {
266 if (!isl_seq_is_neg(bset->ineq[i]+1, bset->ineq[j]+1,
269 isl_int_add(m, bset->ineq[i][0], bset->ineq[j][0]);
270 if (isl_int_abs_ge(m, bset->ineq[i][1+bset->nparam+pos]))
275 if (isl_int_is_pos(bset->ineq[i][1+bset->nparam+pos])) {
276 lower->line = &bset->ineq[i];
277 upper->line = &bset->ineq[j];
279 lower->line = &bset->ineq[j];
280 upper->line = &bset->ineq[i];