From 57b4c79a9aa64002a77d3efe659c49c9ecff9b66 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Sun, 23 May 2010 16:27:32 +0200 Subject: [PATCH] export isl_set_is_bounded --- include/isl_set.h | 2 ++ isl_convex_hull.c | 11 +++++++++-- isl_map_private.h | 2 -- isl_tab.c | 23 +++++++++++++++-------- isl_tab.h | 3 ++- isl_tab_pip.c | 4 ++-- isl_test.c | 22 ++++++++++++++++++++++ 7 files changed, 52 insertions(+), 15 deletions(-) diff --git a/include/isl_set.h b/include/isl_set.h index 945f97dd..e4313c4a 100644 --- a/include/isl_set.h +++ b/include/isl_set.h @@ -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); diff --git a/isl_convex_hull.c b/isl_convex_hull.c index 28958381..91ebba8f 100644 --- a/isl_convex_hull.c +++ b/isl_convex_hull.c @@ -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) diff --git a/isl_map_private.h b/isl_map_private.h index 21438db3..4b2b39af 100644 --- a/isl_map_private.h +++ b/isl_map_private.h @@ -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); diff --git a/isl_tab.c b/isl_tab.c index d0d9c26a..7792fea6 100644 --- 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; diff --git a/isl_tab.h b/isl_tab.h index 8945449a..71bc520c 100644 --- 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); diff --git a/isl_tab_pip.c b/isl_tab_pip.c index 01efc6c5..7b4eaa1d 100644 --- a/isl_tab_pip.c +++ b/isl_tab_pip.c @@ -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) diff --git a/isl_test.c b/isl_test.c index 2ea953a1..10db1621 100644 --- a/isl_test.c +++ b/isl_test.c @@ -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); -- 2.11.4.GIT