From 5b3080d2d66d27da70fc248d6820541bfed419ce Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Mon, 11 Aug 2008 15:15:43 +0200 Subject: [PATCH] isl_basic_set_sample: special case 0D and 1D sets --- isl_sample.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/isl_sample.c b/isl_sample.c index 2dfaa0a..75514d2 100644 --- a/isl_sample.c +++ b/isl_sample.c @@ -5,6 +5,56 @@ #include "isl_map_private.h" #include "isl_equalities.h" +static struct isl_vec *point_sample(struct isl_ctx *ctx, + struct isl_basic_set *bset) +{ + struct isl_vec *sample; + isl_basic_set_free(ctx, bset); + sample = isl_vec_alloc(ctx, 1); + if (!sample) + return NULL; + isl_int_set_si(sample->block.data[0], 1); + return sample; +} + +static struct isl_vec *interval_sample(struct isl_ctx *ctx, + struct isl_basic_set *bset) +{ + struct isl_vec *sample; + + bset = isl_basic_set_simplify(ctx, bset); + if (!bset) + return NULL; + if (bset->n_eq > 0) + return isl_basic_set_sample(ctx, bset); + sample = isl_vec_alloc(ctx, 2); + isl_int_set_si(sample->block.data[0], 1); + if (bset->n_ineq == 0) + isl_int_set_si(sample->block.data[1], 0); + else { + int i; + isl_int t; + isl_int_init(t); + if (isl_int_is_one(bset->ineq[0][1])) + isl_int_neg(sample->block.data[1], bset->ineq[0][0]); + else + isl_int_set(sample->block.data[1], bset->ineq[0][0]); + for (i = 1; i < bset->n_ineq; ++i) { + isl_seq_inner_product(sample->block.data, + bset->ineq[i], 2, &t); + if (isl_int_is_neg(t)) + break; + } + isl_int_clear(t); + if (i < bset->n_ineq) { + isl_vec_free(ctx, sample); + sample = isl_vec_alloc(ctx, 0); + } + } + isl_basic_set_free(ctx, bset); + return sample; +} + struct isl_vec *isl_basic_set_sample(struct isl_ctx *ctx, struct isl_basic_set *bset) { @@ -31,6 +81,10 @@ struct isl_vec *isl_basic_set_sample(struct isl_ctx *ctx, isl_mat_free(ctx, T); return sample; } + if (bset->dim == 0) + return point_sample(ctx, bset); + if (bset->dim == 1) + return interval_sample(ctx, bset); return isl_pip_basic_set_sample(ctx, bset); error: isl_basic_set_free(ctx, bset); -- 2.7.4