add isl_basic_set_dims_get_sign
authorSven Verdoolaege <skimo@kotnet.org>
Sat, 24 Apr 2010 17:13:17 +0000 (19:13 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Thu, 13 May 2010 15:12:22 +0000 (17:12 +0200)
include/isl_set.h
isl_map.c
isl_map_private.h

index fc5a776..7a2c66d 100644 (file)
@@ -187,6 +187,9 @@ int isl_basic_set_compare_at(struct isl_basic_set *bset1,
 int isl_set_follows_at(__isl_keep isl_set *set1,
        __isl_keep isl_set *set2, int pos);
 
+int isl_basic_set_dims_get_sign(__isl_keep isl_basic_set *bset,
+       enum isl_dim_type type, unsigned pos, unsigned n, int *signs);
+
 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);
index d87df03..02c3f0b 100644 (file)
--- a/isl_map.c
+++ b/isl_map.c
@@ -6609,3 +6609,79 @@ int isl_set_dim_is_bounded(__isl_keep isl_set *set,
 {
        return isl_map_dim_is_bounded((isl_map *)set, type, pos);
 }
+
+/* For each of the "n" variables starting at "first", determine
+ * the sign of the variable and put the results in the first "n"
+ * elements of the array "signs".
+ * Sign
+ *     1 means that the variable is non-negative
+ *     -1 means that the variable is non-positive
+ *     0 means the variable attains both positive and negative values.
+ */
+int isl_basic_set_vars_get_sign(__isl_keep isl_basic_set *bset,
+       unsigned first, unsigned n, int *signs)
+{
+       isl_vec *bound = NULL;
+       struct isl_tab *tab = NULL;
+       struct isl_tab_undo *snap;
+       int i;
+
+       if (!bset || !signs)
+               return -1;
+
+       bound = isl_vec_alloc(bset->ctx, 1 + isl_basic_set_total_dim(bset));
+       tab = isl_tab_from_basic_set(bset);
+       if (!bound || !tab)
+               goto error;
+
+       isl_seq_clr(bound->el, bound->size);
+       isl_int_set_si(bound->el[0], -1);
+
+       snap = isl_tab_snap(tab);
+       for (i = 0; i < n; ++i) {
+               int empty;
+
+               isl_int_set_si(bound->el[1 + first + i], -1);
+               if (isl_tab_add_ineq(tab, bound->el) < 0)
+                       goto error;
+               empty = tab->empty;
+               isl_int_set_si(bound->el[1 + first + i], 0);
+               if (isl_tab_rollback(tab, snap) < 0)
+                       goto error;
+
+               if (empty) {
+                       signs[i] = 1;
+                       continue;
+               }
+
+               isl_int_set_si(bound->el[1 + first + i], 1);
+               if (isl_tab_add_ineq(tab, bound->el) < 0)
+                       goto error;
+               empty = tab->empty;
+               isl_int_set_si(bound->el[1 + first + i], 0);
+               if (isl_tab_rollback(tab, snap) < 0)
+                       goto error;
+
+               signs[i] = empty ? -1 : 0;
+       }
+
+       isl_tab_free(tab);
+       isl_vec_free(bound);
+       return 0;
+error:
+       isl_tab_free(tab);
+       isl_vec_free(bound);
+       return -1;
+}
+
+int isl_basic_set_dims_get_sign(__isl_keep isl_basic_set *bset,
+       enum isl_dim_type type, unsigned first, unsigned n, int *signs)
+{
+       if (!bset || !signs)
+               return -1;
+       isl_assert(bset->ctx, first + n <= isl_basic_set_dim(bset, type),
+               return -1);
+
+       first += pos(bset->dim, type) - 1;
+       return isl_basic_set_vars_get_sign(bset, first, n, signs);
+}
index 2824996..bf39e98 100644 (file)
@@ -163,3 +163,6 @@ isl_int *isl_set_wrap_facet(__isl_keep isl_set *set,
 int isl_basic_map_contains_point(__isl_keep isl_basic_map *bmap,
        __isl_keep isl_point *point);
 int isl_set_contains_point(__isl_keep isl_set *set, __isl_keep isl_point *point);
+
+int isl_basic_set_vars_get_sign(__isl_keep isl_basic_set *bset,
+       unsigned first, unsigned n, int *signs);