1 #include "isl_sample.h"
2 #include "isl_sample_piplib.h"
6 #include "isl_map_private.h"
7 #include "isl_equalities.h"
9 static struct isl_vec *empty_sample(struct isl_basic_set *bset)
13 vec = isl_vec_alloc(bset->ctx, 0);
14 isl_basic_set_free(bset);
18 /* Construct a zero sample of the same dimension as bset.
19 * As a special case, if bset is zero-dimensional, this
20 * function creates a zero-dimensional sample point.
22 static struct isl_vec *zero_sample(struct isl_basic_set *bset)
25 struct isl_vec *sample;
27 dim = isl_basic_set_total_dim(bset);
28 sample = isl_vec_alloc(bset->ctx, 1 + dim);
30 isl_int_set_si(sample->el[0], 1);
31 isl_seq_clr(sample->el + 1, dim);
33 isl_basic_set_free(bset);
37 static struct isl_vec *interval_sample(struct isl_ctx *ctx,
38 struct isl_basic_set *bset)
42 struct isl_vec *sample;
44 bset = isl_basic_set_simplify(bset);
48 return isl_basic_set_sample(bset);
49 if (bset->n_ineq == 0)
50 return zero_sample(bset);
52 sample = isl_vec_alloc(ctx, 2);
53 isl_int_set_si(sample->block.data[0], 1);
55 if (isl_int_is_one(bset->ineq[0][1]))
56 isl_int_neg(sample->block.data[1], bset->ineq[0][0]);
58 isl_int_set(sample->block.data[1], bset->ineq[0][0]);
59 for (i = 1; i < bset->n_ineq; ++i) {
60 isl_seq_inner_product(sample->block.data,
61 bset->ineq[i], 2, &t);
62 if (isl_int_is_neg(t))
66 if (i < bset->n_ineq) {
68 return empty_sample(bset);
71 isl_basic_set_free(bset);
75 static struct isl_mat *independent_bounds(struct isl_ctx *ctx,
76 struct isl_basic_set *bset)
79 struct isl_mat *dirs = NULL;
85 dim = isl_basic_set_n_dim(bset);
86 if (bset->n_ineq == 0)
87 return isl_mat_alloc(ctx, 0, dim);
89 dirs = isl_mat_alloc(ctx, dim, dim);
92 isl_seq_cpy(dirs->row[0], bset->ineq[0]+1, dirs->n_col);
93 for (j = 1, n = 1; n < dim && j < bset->n_ineq; ++j) {
96 isl_seq_cpy(dirs->row[n], bset->ineq[j]+1, dirs->n_col);
98 pos = isl_seq_first_non_zero(dirs->row[n], dirs->n_col);
101 for (i = 0; i < n; ++i) {
103 pos_i = isl_seq_first_non_zero(dirs->row[i], dirs->n_col);
108 isl_seq_elim(dirs->row[n], dirs->row[i], pos,
110 pos = isl_seq_first_non_zero(dirs->row[n], dirs->n_col);
118 isl_int *t = dirs->row[n];
119 for (k = n; k > i; --k)
120 dirs->row[k] = dirs->row[k-1];
129 static struct isl_basic_set *remove_lineality(struct isl_ctx *ctx,
130 struct isl_basic_set *bset, struct isl_mat *bounds, struct isl_mat **T)
132 struct isl_mat *U = NULL;
133 unsigned old_dim, new_dim;
135 old_dim = isl_basic_set_n_dim(bset);
136 new_dim = bounds->n_row;
138 bounds = isl_mat_left_hermite(ctx, bounds, 0, &U, NULL);
141 U = isl_mat_lin_to_aff(ctx, U);
142 U = isl_mat_drop_cols(ctx, U, 1 + new_dim, old_dim - new_dim);
143 bset = isl_basic_set_preimage(bset, isl_mat_copy(ctx, U));
147 isl_mat_free(ctx, bounds);
150 isl_mat_free(ctx, bounds);
151 isl_mat_free(ctx, U);
152 isl_basic_set_free(bset);
156 struct isl_vec *isl_basic_set_sample(struct isl_basic_set *bset)
159 struct isl_mat *bounds;
165 if (isl_basic_set_fast_is_empty(bset))
166 return empty_sample(bset);
168 dim = isl_basic_set_n_dim(bset);
169 isl_assert(ctx, isl_basic_set_n_param(bset) == 0, goto error);
170 isl_assert(ctx, bset->n_div == 0, goto error);
172 if (bset->n_eq > 0) {
174 struct isl_vec *sample;
176 bset = isl_basic_set_remove_equalities(bset, &T, NULL);
177 sample = isl_basic_set_sample(bset);
178 if (sample && sample->size != 0)
179 sample = isl_mat_vec_product(ctx, T, sample);
181 isl_mat_free(ctx, T);
185 return zero_sample(bset);
187 return interval_sample(ctx, bset);
188 bounds = independent_bounds(ctx, bset);
191 if (bounds->n_row == dim)
192 isl_mat_free(ctx, bounds);
195 struct isl_vec *sample;
197 bset = remove_lineality(ctx, bset, bounds, &T);
198 sample = isl_basic_set_sample(bset);
199 if (sample && sample->size != 0)
200 sample = isl_mat_vec_product(ctx, T, sample);
202 isl_mat_free(ctx, T);
205 return isl_pip_basic_set_sample(bset);
207 isl_basic_set_free(bset);