isl_basic_set_sample: special case 0D and 1D sets
authorSven Verdoolaege <skimo@kotnet.org>
Mon, 11 Aug 2008 13:15:43 +0000 (15:15 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Mon, 25 Aug 2008 08:15:06 +0000 (10:15 +0200)
isl_sample.c

index 2dfaa0a..75514d2 100644 (file)
@@ -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);