X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=isl_sample.c;h=9c9fb6d6971de53ec2c7fb377f1960dbf78e98be;hb=70185cc4cd287c58ae523cf139ed359561330755;hp=e12fb9c5a4b1b00398ee4762d07f8dc48ad502e7;hpb=f3c292bf31fbb13ce50a8877ee71910897276a24;p=platform%2Fupstream%2Fisl.git diff --git a/isl_sample.c b/isl_sample.c index e12fb9c..9c9fb6d 100644 --- a/isl_sample.c +++ b/isl_sample.c @@ -7,15 +7,17 @@ * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium */ +#include +#include #include "isl_sample.h" #include "isl_sample_piplib.h" #include #include #include -#include "isl_map_private.h" #include "isl_equalities.h" #include "isl_tab.h" #include "isl_basis_reduction.h" +#include #include static struct isl_vec *empty_sample(struct isl_basic_set *bset) @@ -55,7 +57,7 @@ static struct isl_vec *interval_sample(struct isl_basic_set *bset) bset = isl_basic_set_simplify(bset); if (!bset) return NULL; - if (isl_basic_set_fast_is_empty(bset)) + if (isl_basic_set_plain_is_empty(bset)) return empty_sample(bset); if (bset->n_eq == 0 && bset->n_ineq == 0) return zero_sample(bset); @@ -546,6 +548,76 @@ error: return NULL; } +static struct isl_vec *sample_bounded(struct isl_basic_set *bset); + +/* Compute a sample point of the given basic set, based on the given, + * non-trivial factorization. + */ +static __isl_give isl_vec *factored_sample(__isl_take isl_basic_set *bset, + __isl_take isl_factorizer *f) +{ + int i, n; + isl_vec *sample = NULL; + isl_ctx *ctx; + unsigned nparam; + unsigned nvar; + + ctx = isl_basic_set_get_ctx(bset); + if (!ctx) + goto error; + + nparam = isl_basic_set_dim(bset, isl_dim_param); + nvar = isl_basic_set_dim(bset, isl_dim_set); + + sample = isl_vec_alloc(ctx, 1 + isl_basic_set_total_dim(bset)); + if (!sample) + goto error; + isl_int_set_si(sample->el[0], 1); + + bset = isl_morph_basic_set(isl_morph_copy(f->morph), bset); + + for (i = 0, n = 0; i < f->n_group; ++i) { + isl_basic_set *bset_i; + isl_vec *sample_i; + + bset_i = isl_basic_set_copy(bset); + bset_i = isl_basic_set_drop_constraints_involving(bset_i, + nparam + n + f->len[i], nvar - n - f->len[i]); + bset_i = isl_basic_set_drop_constraints_involving(bset_i, + nparam, n); + bset_i = isl_basic_set_drop(bset_i, isl_dim_set, + n + f->len[i], nvar - n - f->len[i]); + bset_i = isl_basic_set_drop(bset_i, isl_dim_set, 0, n); + + sample_i = sample_bounded(bset_i); + if (!sample_i) + goto error; + if (sample_i->size == 0) { + isl_basic_set_free(bset); + isl_factorizer_free(f); + isl_vec_free(sample); + return sample_i; + } + isl_seq_cpy(sample->el + 1 + nparam + n, + sample_i->el + 1, f->len[i]); + isl_vec_free(sample_i); + + n += f->len[i]; + } + + f->morph = isl_morph_inverse(f->morph); + sample = isl_morph_vec(isl_morph_copy(f->morph), sample); + + isl_basic_set_free(bset); + isl_factorizer_free(f); + return sample; +error: + isl_basic_set_free(bset); + isl_factorizer_free(f); + isl_vec_free(sample); + return NULL; +} + /* Given a basic set that is known to be bounded, find and return * an integer point in the basic set, if there is any. * @@ -559,11 +631,12 @@ static struct isl_vec *sample_bounded(struct isl_basic_set *bset) struct isl_ctx *ctx; struct isl_vec *sample; struct isl_tab *tab = NULL; + isl_factorizer *f; if (!bset) return NULL; - if (isl_basic_set_fast_is_empty(bset)) + if (isl_basic_set_plain_is_empty(bset)) return empty_sample(bset); dim = isl_basic_set_total_dim(bset); @@ -574,6 +647,13 @@ static struct isl_vec *sample_bounded(struct isl_basic_set *bset) if (bset->n_eq > 0) return sample_eq(bset, sample_bounded); + f = isl_basic_set_factorizer(bset); + if (!f) + goto error; + if (f->n_group != 0) + return factored_sample(bset, f); + isl_factorizer_free(f); + ctx = bset->ctx; tab = isl_tab_from_basic_set(bset); @@ -883,7 +963,7 @@ __isl_give isl_vec *isl_basic_set_sample_with_cone( total = isl_basic_set_total_dim(cone); cone_dim = total - cone->n_eq; - M = isl_mat_sub_alloc(bset->ctx, cone->eq, 0, cone->n_eq, 1, total); + M = isl_mat_sub_alloc6(bset->ctx, cone->eq, 0, cone->n_eq, 1, total); M = isl_mat_left_hermite(M, 0, &U, NULL); if (!M) goto error; @@ -1098,7 +1178,7 @@ static struct isl_vec *basic_set_sample(struct isl_basic_set *bset, int bounded) return NULL; ctx = bset->ctx; - if (isl_basic_set_fast_is_empty(bset)) + if (isl_basic_set_plain_is_empty(bset)) return empty_sample(bset); dim = isl_basic_set_n_dim(bset);