1 #include "isl_sample.h"
2 #include "isl_sample_piplib.h"
6 #include "isl_map_private.h"
7 #include "isl_equalities.h"
9 /* Construct a zero sample of the same dimension as bset.
10 * As a special case, if bset is zero-dimensional, this
11 * function creates a zero-dimensional sample point.
13 static struct isl_vec *zero_sample(struct isl_basic_set *bset)
16 struct isl_vec *sample;
18 dim = isl_basic_set_total_dim(bset);
19 sample = isl_vec_alloc(bset->ctx, 1 + dim);
21 isl_int_set_si(sample->el[0], 1);
22 isl_seq_clr(sample->el + 1, dim);
24 isl_basic_set_free(bset);
28 static struct isl_vec *interval_sample(struct isl_ctx *ctx,
29 struct isl_basic_set *bset)
33 struct isl_vec *sample;
35 bset = isl_basic_set_simplify(bset);
39 return isl_basic_set_sample(bset);
40 if (bset->n_ineq == 0)
41 return zero_sample(bset);
43 sample = isl_vec_alloc(ctx, 2);
44 isl_int_set_si(sample->block.data[0], 1);
46 if (isl_int_is_one(bset->ineq[0][1]))
47 isl_int_neg(sample->block.data[1], bset->ineq[0][0]);
49 isl_int_set(sample->block.data[1], bset->ineq[0][0]);
50 for (i = 1; i < bset->n_ineq; ++i) {
51 isl_seq_inner_product(sample->block.data,
52 bset->ineq[i], 2, &t);
53 if (isl_int_is_neg(t))
57 if (i < bset->n_ineq) {
59 sample = isl_vec_alloc(ctx, 0);
62 isl_basic_set_free(bset);
66 static struct isl_mat *independent_bounds(struct isl_ctx *ctx,
67 struct isl_basic_set *bset)
70 struct isl_mat *dirs = NULL;
76 dim = isl_basic_set_n_dim(bset);
77 if (bset->n_ineq == 0)
78 return isl_mat_alloc(ctx, 0, dim);
80 dirs = isl_mat_alloc(ctx, dim, dim);
83 isl_seq_cpy(dirs->row[0], bset->ineq[0]+1, dirs->n_col);
84 for (j = 1, n = 1; n < dim && j < bset->n_ineq; ++j) {
87 isl_seq_cpy(dirs->row[n], bset->ineq[j]+1, dirs->n_col);
89 pos = isl_seq_first_non_zero(dirs->row[n], dirs->n_col);
92 for (i = 0; i < n; ++i) {
94 pos_i = isl_seq_first_non_zero(dirs->row[i], dirs->n_col);
99 isl_seq_elim(dirs->row[n], dirs->row[i], pos,
101 pos = isl_seq_first_non_zero(dirs->row[n], dirs->n_col);
109 isl_int *t = dirs->row[n];
110 for (k = n; k > i; --k)
111 dirs->row[k] = dirs->row[k-1];
120 static struct isl_basic_set *remove_lineality(struct isl_ctx *ctx,
121 struct isl_basic_set *bset, struct isl_mat *bounds, struct isl_mat **T)
123 struct isl_mat *U = NULL;
124 unsigned old_dim, new_dim;
126 old_dim = isl_basic_set_n_dim(bset);
127 new_dim = bounds->n_row;
129 bounds = isl_mat_left_hermite(ctx, bounds, 0, &U, NULL);
132 U = isl_mat_lin_to_aff(ctx, U);
133 U = isl_mat_drop_cols(ctx, U, 1 + new_dim, old_dim - new_dim);
134 bset = isl_basic_set_preimage(bset, isl_mat_copy(ctx, U));
138 isl_mat_free(ctx, bounds);
141 isl_mat_free(ctx, bounds);
142 isl_mat_free(ctx, U);
143 isl_basic_set_free(bset);
147 struct isl_vec *isl_basic_set_sample(struct isl_basic_set *bset)
150 struct isl_mat *bounds;
156 if (ISL_F_ISSET(bset, ISL_BASIC_SET_EMPTY)) {
157 isl_basic_set_free(bset);
158 return isl_vec_alloc(ctx, 0);
161 dim = isl_basic_set_n_dim(bset);
162 isl_assert(ctx, isl_basic_set_n_param(bset) == 0, goto error);
163 isl_assert(ctx, bset->n_div == 0, goto error);
165 if (bset->n_eq > 0) {
167 struct isl_vec *sample;
169 bset = isl_basic_set_remove_equalities(bset, &T, NULL);
170 sample = isl_basic_set_sample(bset);
171 if (sample && sample->size != 0)
172 sample = isl_mat_vec_product(ctx, T, sample);
174 isl_mat_free(ctx, T);
178 return zero_sample(bset);
180 return interval_sample(ctx, bset);
181 bounds = independent_bounds(ctx, bset);
184 if (bounds->n_row == dim)
185 isl_mat_free(ctx, bounds);
188 struct isl_vec *sample;
190 bset = remove_lineality(ctx, bset, bounds, &T);
191 sample = isl_basic_set_sample(bset);
192 if (sample && sample->size != 0)
193 sample = isl_mat_vec_product(ctx, T, sample);
195 isl_mat_free(ctx, T);
198 return isl_pip_basic_set_sample(bset);
200 isl_basic_set_free(bset);