export isl_set_is_bounded
authorSven Verdoolaege <skimo@kotnet.org>
Sun, 23 May 2010 14:27:32 +0000 (16:27 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Sat, 12 Jun 2010 11:16:36 +0000 (13:16 +0200)
include/isl_set.h
isl_convex_hull.c
isl_map_private.h
isl_tab.c
isl_tab.h
isl_tab_pip.c
isl_test.c

index 945f97d..e4313c4 100644 (file)
@@ -193,6 +193,7 @@ int isl_basic_set_dims_get_sign(__isl_keep isl_basic_set *bset,
 int isl_basic_set_is_universe(__isl_keep isl_basic_set *bset);
 int isl_basic_set_fast_is_empty(__isl_keep isl_basic_set *bset);
 int isl_basic_set_is_empty(__isl_keep isl_basic_set *bset);
+int isl_basic_set_is_bounded(__isl_keep isl_basic_set *bset);
 
 struct isl_set *isl_set_alloc(struct isl_ctx *ctx,
                unsigned nparam, unsigned dim, int n, unsigned flags);
@@ -273,6 +274,7 @@ struct isl_set *isl_set_swap_vars(struct isl_set *set, unsigned n);
 int isl_set_fast_is_empty(__isl_keep isl_set *set);
 int isl_set_fast_is_universe(__isl_keep isl_set *set);
 int isl_set_is_empty(__isl_keep isl_set *set);
+int isl_set_is_bounded(__isl_keep isl_set *set);
 int isl_set_is_subset(__isl_keep isl_set *set1, __isl_keep isl_set *set2);
 int isl_set_is_strict_subset(__isl_keep isl_set *set1, __isl_keep isl_set *set2);
 int isl_set_is_equal(__isl_keep isl_set *set1, __isl_keep isl_set *set2);
index 2895838..91ebba8 100644 (file)
@@ -863,7 +863,9 @@ error:
        return NULL;
 }
 
-static int isl_basic_set_is_bounded(struct isl_basic_set *bset)
+/* Is the set bounded for each value of the parameters?
+ */
+int isl_basic_set_is_bounded(__isl_keep isl_basic_set *bset)
 {
        struct isl_tab *tab;
        int bounded;
@@ -873,16 +875,21 @@ static int isl_basic_set_is_bounded(struct isl_basic_set *bset)
        if (isl_basic_set_fast_is_empty(bset))
                return 1;
 
-       tab = isl_tab_from_recession_cone(bset);
+       tab = isl_tab_from_recession_cone(bset, 1);
        bounded = isl_tab_cone_is_bounded(tab);
        isl_tab_free(tab);
        return bounded;
 }
 
+/* Is the set bounded for each value of the parameters?
+ */
 int isl_set_is_bounded(__isl_keep isl_set *set)
 {
        int i;
 
+       if (!set)
+               return -1;
+
        for (i = 0; i < set->n; ++i) {
                int bounded = isl_basic_set_is_bounded(set->p[i]);
                if (!bounded || bounded < 0)
index 21438db..4b2b39a 100644 (file)
@@ -169,5 +169,3 @@ int isl_basic_set_vars_get_sign(__isl_keep isl_basic_set *bset,
 
 int isl_basic_set_add_div_constraints_var(__isl_keep isl_basic_set *bset,
        unsigned pos, isl_int *div);
-
-int isl_set_is_bounded(__isl_keep isl_set *set);
index d0d9c26..7792fea 100644 (file)
--- a/isl_tab.c
+++ b/isl_tab.c
@@ -2134,16 +2134,20 @@ struct isl_tab *isl_tab_from_basic_set(struct isl_basic_set *bset)
 
 /* Construct a tableau corresponding to the recession cone of "bset".
  */
-struct isl_tab *isl_tab_from_recession_cone(struct isl_basic_set *bset)
+struct isl_tab *isl_tab_from_recession_cone(__isl_keep isl_basic_set *bset,
+       int parametric)
 {
        isl_int cst;
        int i;
        struct isl_tab *tab;
+       unsigned offset = 0;
 
        if (!bset)
                return NULL;
+       if (parametric)
+               offset = isl_basic_set_dim(bset, isl_dim_param);
        tab = isl_tab_alloc(bset->ctx, bset->n_eq + bset->n_ineq,
-                               isl_basic_set_total_dim(bset), 0);
+                               isl_basic_set_total_dim(bset) - offset, 0);
        if (!tab)
                return NULL;
        tab->rational = ISL_F_ISSET(bset, ISL_BASIC_SET_RATIONAL);
@@ -2151,17 +2155,20 @@ struct isl_tab *isl_tab_from_recession_cone(struct isl_basic_set *bset)
 
        isl_int_init(cst);
        for (i = 0; i < bset->n_eq; ++i) {
-               isl_int_swap(bset->eq[i][0], cst);
-               tab = add_eq(tab, bset->eq[i]);
-               isl_int_swap(bset->eq[i][0], cst);
+               isl_int_swap(bset->eq[i][offset], cst);
+               if (offset > 0)
+                       tab = isl_tab_add_eq(tab, bset->eq[i] + offset);
+               else
+                       tab = add_eq(tab, bset->eq[i]);
+               isl_int_swap(bset->eq[i][offset], cst);
                if (!tab)
                        goto done;
        }
        for (i = 0; i < bset->n_ineq; ++i) {
                int r;
-               isl_int_swap(bset->ineq[i][0], cst);
-               r = isl_tab_add_row(tab, bset->ineq[i]);
-               isl_int_swap(bset->ineq[i][0], cst);
+               isl_int_swap(bset->ineq[i][offset], cst);
+               r = isl_tab_add_row(tab, bset->ineq[i] + offset);
+               isl_int_swap(bset->ineq[i][offset], cst);
                if (r < 0)
                        goto error;
                tab->con[r].is_nonneg = 1;
index 8945449..71bc520 100644 (file)
--- a/isl_tab.h
+++ b/isl_tab.h
@@ -175,7 +175,8 @@ void isl_tab_free(struct isl_tab *tab);
 
 struct isl_tab *isl_tab_from_basic_map(struct isl_basic_map *bmap);
 struct isl_tab *isl_tab_from_basic_set(struct isl_basic_set *bset);
-struct isl_tab *isl_tab_from_recession_cone(struct isl_basic_set *bset);
+struct isl_tab *isl_tab_from_recession_cone(struct isl_basic_set *bset,
+       int parametric);
 int isl_tab_cone_is_bounded(struct isl_tab *tab);
 struct isl_basic_map *isl_basic_map_update_from_tab(struct isl_basic_map *bmap,
        struct isl_tab *tab);
index 01efc6c..7b4eaa1 100644 (file)
@@ -2603,7 +2603,7 @@ static struct isl_vec *gbr_get_sample(struct isl_context_gbr *cgbr)
 
        if (!cgbr->cone) {
                bset = isl_tab_peek_bset(cgbr->tab);
-               cgbr->cone = isl_tab_from_recession_cone(bset);
+               cgbr->cone = isl_tab_from_recession_cone(bset, 0);
                if (!cgbr->cone)
                        return NULL;
                if (isl_tab_track_bset(cgbr->cone, isl_basic_set_dup(bset)) < 0)
@@ -2968,7 +2968,7 @@ static int context_gbr_detect_equalities(struct isl_context *context,
 
        if (!cgbr->cone) {
                struct isl_basic_set *bset = isl_tab_peek_bset(cgbr->tab);
-               cgbr->cone = isl_tab_from_recession_cone(bset);
+               cgbr->cone = isl_tab_from_recession_cone(bset, 0);
                if (!cgbr->cone)
                        goto error;
                if (isl_tab_track_bset(cgbr->cone, isl_basic_set_dup(bset)) < 0)
index 2ea953a..10db162 100644 (file)
@@ -42,6 +42,27 @@ void test_read(struct isl_ctx *ctx)
        fclose(input);
 }
 
+void test_bounded(struct isl_ctx *ctx)
+{
+       isl_set *set;
+       int bounded;
+
+       set = isl_set_read_from_str(ctx, "[n] -> {[i] : 0 <= i <= n }", -1);
+       bounded = isl_set_is_bounded(set);
+       assert(bounded);
+       isl_set_free(set);
+
+       set = isl_set_read_from_str(ctx, "{[n, i] : 0 <= i <= n }", -1);
+       bounded = isl_set_is_bounded(set);
+       assert(!bounded);
+       isl_set_free(set);
+
+       set = isl_set_read_from_str(ctx, "[n] -> {[i] : i <= n }", -1);
+       bounded = isl_set_is_bounded(set);
+       assert(!bounded);
+       isl_set_free(set);
+}
+
 /* Construct the basic set { [i] : 5 <= i <= N } */
 void test_construction(struct isl_ctx *ctx)
 {
@@ -1286,6 +1307,7 @@ int main()
        test_sv(ctx);
        test_dep(ctx);
        test_read(ctx);
+       test_bounded(ctx);
        test_construction(ctx);
        test_dim(ctx);
        test_div(ctx);