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 isl_basic_set_n_param(constraint.bset);
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 isl_basic_set_n_dim(constraint.bset);
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)
105 if (!isl_basic_set_constraint_is_valid(constraint))
107 nparam = isl_basic_set_n_param(constraint.bset);
108 dim = isl_basic_set_n_dim(constraint.bset);
109 isl_assert(constraint.bset->ctx, pos < dim, return);
110 isl_int_set(*v, constraint.line[0][1 + nparam + pos]);
113 void isl_basic_set_constraint_get_div(
114 struct isl_basic_set_constraint constraint, int pos, isl_int *v)
118 if (!isl_basic_set_constraint_is_valid(constraint))
120 nparam = isl_basic_set_n_param(constraint.bset);
121 dim = isl_basic_set_n_dim(constraint.bset);
122 isl_assert(constraint.bset->ctx, pos < constraint.bset->n_div, return);
123 isl_int_set(*v, constraint.line[0][1 + nparam + dim + pos]);
126 void isl_basic_set_constraint_get_param(
127 struct isl_basic_set_constraint constraint, int pos, isl_int *v)
130 if (!isl_basic_set_constraint_is_valid(constraint))
132 nparam = isl_basic_set_n_param(constraint.bset);
133 isl_assert(constraint.bset->ctx, pos < nparam, return);
134 isl_int_set(*v, constraint.line[0][1 + pos]);
137 void isl_basic_set_constraint_set_dim(
138 struct isl_basic_set_constraint constraint, int pos, isl_int v)
142 if (!isl_basic_set_constraint_is_valid(constraint))
144 isl_assert(constraint.bset->ctx, constraint.bset->ref == 1, return);
145 nparam = isl_basic_set_n_param(constraint.bset);
146 dim = isl_basic_set_n_dim(constraint.bset);
147 isl_assert(constraint.bset->ctx, pos < dim, return);
148 isl_int_set(constraint.line[0][1 + nparam + pos], v);
151 void isl_basic_set_constraint_set_param(
152 struct isl_basic_set_constraint constraint, int pos, isl_int v)
155 if (!isl_basic_set_constraint_is_valid(constraint))
157 isl_assert(constraint.bset->ctx, constraint.bset->ref == 1, return);
158 nparam = isl_basic_set_n_param(constraint.bset);
159 isl_assert(constraint.bset->ctx, pos < nparam, return);
160 isl_int_set(constraint.line[0][1 + pos], v);
163 void isl_basic_set_constraint_clear(struct isl_basic_set_constraint constraint)
165 struct isl_basic_set *bset = constraint.bset;
168 if (!isl_basic_set_constraint_is_valid(constraint))
170 total = isl_basic_set_total_dim(bset);
171 isl_seq_clr(constraint.line[0], 1 + total);
174 int isl_basic_set_constraint_is_equality(
175 struct isl_basic_set_constraint constraint)
177 if (!isl_basic_set_constraint_is_valid(constraint))
179 return constraint.line < constraint.bset->eq + constraint.bset->n_eq;
182 int isl_basic_set_constraint_is_dim_lower_bound(
183 struct isl_basic_set_constraint constraint, int pos)
187 if (!isl_basic_set_constraint_is_valid(constraint))
189 nparam = isl_basic_set_n_param(constraint.bset);
190 dim = isl_basic_set_n_dim(constraint.bset);
191 isl_assert(constraint.bset->ctx, pos < dim, return -1);
192 return isl_int_is_pos(constraint.line[0][1+nparam+pos]);
195 int isl_basic_set_constraint_is_dim_upper_bound(
196 struct isl_basic_set_constraint constraint, int pos)
200 if (!isl_basic_set_constraint_is_valid(constraint))
202 nparam = isl_basic_set_n_param(constraint.bset);
203 dim = isl_basic_set_n_dim(constraint.bset);
204 isl_assert(constraint.bset->ctx, pos < dim, return -1);
205 return isl_int_is_neg(constraint.line[0][1+nparam+pos]);
209 struct isl_basic_set *isl_basic_set_from_constraint(
210 struct isl_basic_set_constraint constraint)
213 struct isl_basic_set *bset;
219 if (!isl_basic_set_constraint_is_valid(constraint))
222 bset = isl_basic_set_universe_like(constraint.bset);
223 bset = isl_basic_set_align_divs(bset, constraint.bset);
224 nparam = isl_basic_set_n_param(bset);
225 dim = isl_basic_set_n_dim(bset);
226 bset = isl_basic_set_extend(bset, nparam, dim, 0, 1, 1);
227 if (isl_basic_set_constraint_is_equality(constraint)) {
228 k = isl_basic_set_alloc_equality(bset);
234 k = isl_basic_set_alloc_inequality(bset);
239 total = isl_basic_set_total_dim(bset);
240 isl_seq_cpy(c, constraint.line[0], 1 + total);
243 isl_basic_set_free(bset);
247 int isl_basic_set_has_defining_equality(
248 struct isl_basic_set *bset, int pos,
249 struct isl_basic_set_constraint *constraint)
252 unsigned dim, nparam;
256 nparam = isl_basic_set_n_param(bset);
257 dim = isl_basic_set_n_dim(bset);
258 isl_assert(bset->ctx, pos < dim, return -1);
259 for (i = 0; i < bset->n_eq; ++i)
260 if (!isl_int_is_zero(bset->eq[i][1 + nparam + pos]) &&
261 isl_seq_first_non_zero(bset->eq[i]+1+nparam+pos+1,
263 constraint->bset = bset;
264 constraint->line = &bset->eq[i];
270 int isl_basic_set_has_defining_inequalities(
271 struct isl_basic_set *bset, int pos,
272 struct isl_basic_set_constraint *lower,
273 struct isl_basic_set_constraint *upper)
283 nparam = isl_basic_set_n_param(bset);
284 dim = isl_basic_set_n_dim(bset);
285 total = isl_basic_set_total_dim(bset);
286 isl_assert(bset->ctx, pos < dim, return -1);
288 for (i = 0; i < bset->n_ineq; ++i) {
289 if (isl_int_is_zero(bset->ineq[i][1 + nparam + pos]))
291 if (isl_int_is_one(bset->ineq[i][1 + nparam + pos]))
293 if (isl_int_is_negone(bset->ineq[i][1 + nparam + pos]))
295 if (isl_seq_first_non_zero(bset->ineq[i]+1+nparam+pos+1,
298 for (j = i + i; j < bset->n_ineq; ++j) {
299 if (!isl_seq_is_neg(bset->ineq[i]+1, bset->ineq[j]+1,
302 isl_int_add(m, bset->ineq[i][0], bset->ineq[j][0]);
303 if (isl_int_abs_ge(m, bset->ineq[i][1+nparam+pos]))
308 if (isl_int_is_pos(bset->ineq[i][1+nparam+pos])) {
309 lower->line = &bset->ineq[i];
310 upper->line = &bset->ineq[j];
312 lower->line = &bset->ineq[j];
313 upper->line = &bset->ineq[i];