add isl_basic_set_add_constraint for adding manually constructed constraints
authorSven Verdoolaege <skimo@kotnet.org>
Sun, 14 Dec 2008 22:45:51 +0000 (23:45 +0100)
committerSven Verdoolaege <skimo@kotnet.org>
Sun, 14 Dec 2008 22:45:51 +0000 (23:45 +0100)
The interface is still pretty rudimentary and subject to change.

include/isl_constraint.h
isl_constraint.c
isl_test.c

index dc3163d..5a021df 100644 (file)
@@ -15,6 +15,8 @@ struct isl_constraint {
        isl_int                 **line;
 };
 
+struct isl_constraint *isl_equality_alloc(struct isl_dim *dim);
+struct isl_constraint *isl_inequality_alloc(struct isl_dim *dim);
 struct isl_constraint *isl_basic_set_constraint(struct isl_basic_set *bset,
        isl_int **line);
 
@@ -28,6 +30,9 @@ struct isl_constraint *isl_constraint_next(struct isl_constraint *c);
 int isl_constraint_is_equal(struct isl_constraint *constraint1,
                            struct isl_constraint *constraint2);
 
+struct isl_basic_set *isl_basic_set_add_constraint(
+       struct isl_basic_set *bset, struct isl_constraint *constraint);
+
 int isl_basic_set_has_defining_equality(
        struct isl_basic_set *bset, int pos,
        struct isl_constraint **constraint);
index 50a6d53..ad2a467 100644 (file)
@@ -54,6 +54,38 @@ struct isl_constraint *isl_basic_set_constraint(struct isl_basic_set *bset,
        return isl_basic_map_constraint((struct isl_basic_map *)bset, line);
 }
 
+struct isl_constraint *isl_equality_alloc(struct isl_dim *dim)
+{
+       struct isl_basic_map *bmap;
+
+       if (!dim)
+               return NULL;
+
+       bmap = isl_basic_map_alloc_dim(dim->ctx, dim, 0, 1, 0);
+       if (!bmap)
+               return NULL;
+
+       isl_basic_map_alloc_equality(bmap);
+       isl_seq_clr(bmap->eq[0], 1 + isl_basic_map_total_dim(bmap));
+       return isl_basic_map_constraint(bmap, &bmap->eq[0]);
+}
+
+struct isl_constraint *isl_inequality_alloc(struct isl_dim *dim)
+{
+       struct isl_basic_map *bmap;
+
+       if (!dim)
+               return NULL;
+
+       bmap = isl_basic_map_alloc_dim(dim->ctx, dim, 0, 0, 1);
+       if (!bmap)
+               return NULL;
+
+       isl_basic_map_alloc_inequality(bmap);
+       isl_seq_clr(bmap->ineq[0], 1 + isl_basic_map_total_dim(bmap));
+       return isl_basic_map_constraint(bmap, &bmap->ineq[0]);
+}
+
 struct isl_constraint *isl_constraint_dup(struct isl_constraint *c)
 {
        if (!c)
@@ -134,6 +166,25 @@ int isl_constraint_is_equal(struct isl_constraint *constraint1,
               constraint1->line == constraint2->line;
 }
 
+struct isl_basic_set *isl_basic_set_add_constraint(
+       struct isl_basic_set *bset, struct isl_constraint *constraint)
+{
+       if (!bset || !constraint)
+               goto error;
+
+       isl_assert(constraint->ctx,
+               isl_dim_equal(bset->dim, constraint->bmap->dim), goto error);
+
+       bset = isl_basic_set_intersect(bset,
+               isl_basic_set_copy((struct isl_basic_set *)constraint->bmap));
+       isl_constraint_free(constraint);
+       return bset;
+error:
+       isl_basic_set_free(bset);
+       isl_constraint_free(constraint);
+       return NULL;
+}
+
 int isl_constraint_dim(struct isl_constraint *constraint,
        enum isl_dim_type type)
 {
index 07d4de8..3ca3879 100644 (file)
@@ -3,9 +3,40 @@
 #include <limits.h>
 #include <isl_ctx.h>
 #include <isl_set.h>
+#include <isl_constraint.h>
 
 static char *srcdir;
 
+/* Construct the basic set { [i] : 5 <= i <= N } */
+void test_construction(struct isl_ctx *ctx)
+{
+       isl_int v;
+       struct isl_basic_set *bset;
+       struct isl_constraint *c;
+
+       isl_int_init(v);
+
+       bset = isl_basic_set_universe(ctx, 1, 1);
+
+       c = isl_inequality_alloc(isl_dim_copy(bset->dim));
+       isl_int_set_si(v, -1);
+       isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
+       isl_int_set_si(v, 1);
+       isl_constraint_set_coefficient(c, isl_dim_param, 0, v);
+       bset = isl_basic_set_add_constraint(bset, c);
+
+       c = isl_inequality_alloc(isl_dim_copy(bset->dim));
+       isl_int_set_si(v, 1);
+       isl_constraint_set_coefficient(c, isl_dim_set, 0, v);
+       isl_int_set_si(v, -5);
+       isl_constraint_set_constant(c, v);
+       bset = isl_basic_set_add_constraint(bset, c);
+
+       isl_basic_set_free(bset);
+
+       isl_int_clear(v);
+}
+
 void test_application_case(struct isl_ctx *ctx, const char *name)
 {
        char filename[PATH_MAX];
@@ -160,6 +191,7 @@ int main()
        srcdir = getenv("srcdir");
 
        ctx = isl_ctx_alloc();
+       test_construction(ctx);
        test_application(ctx);
        test_affine_hull(ctx);
        test_convex_hull(ctx);