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);
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);
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;
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)
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);
/* 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);
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;
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);
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)
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)
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)
{
test_sv(ctx);
test_dep(ctx);
test_read(ctx);
+ test_bounded(ctx);
test_construction(ctx);
test_dim(ctx);
test_div(ctx);