add isl_pw_qpolynomial_split_dims
authorSven Verdoolaege <skimo@kotnet.org>
Sun, 28 Mar 2010 11:10:40 +0000 (13:10 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Tue, 30 Mar 2010 10:05:14 +0000 (12:05 +0200)
include/isl_polynomial.h
isl_map.c
isl_map_private.h
isl_pw_templ.c

index a028f65..f824f92 100644 (file)
@@ -93,6 +93,9 @@ __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_intersect_domain(
 __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_drop_dims(
        __isl_take isl_pw_qpolynomial *pwqp,
        enum isl_dim_type type, unsigned first, unsigned n);
+__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_split_dims(
+       __isl_take isl_pw_qpolynomial *pwqp,
+       enum isl_dim_type type, unsigned first, unsigned n);
 
 __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add(
        __isl_take isl_pw_qpolynomial *pwqp1,
index f62c0be..7df4bcf 100644 (file)
--- a/isl_map.c
+++ b/isl_map.c
@@ -4837,6 +4837,50 @@ error:
        return NULL;
 }
 
+__isl_give isl_set *isl_set_split_dims(__isl_take isl_set *set,
+       enum isl_dim_type type, unsigned first, unsigned n)
+{
+       int i;
+       isl_basic_set *nonneg = NULL;
+       isl_basic_set *neg = NULL;
+
+       if (!set)
+               return NULL;
+       if (n == 0)
+               return set;
+
+       isl_assert(set->ctx, first + n <= isl_set_dim(set, type), goto error);
+
+       for (i = 0; i < n; ++i) {
+               int k;
+
+               neg = NULL;
+               nonneg = isl_basic_set_alloc_dim(isl_set_get_dim(set), 0, 0, 1);
+               k = isl_basic_set_alloc_inequality(nonneg);
+               if (k < 0)
+                       goto error;
+               isl_seq_clr(nonneg->ineq[k], 1 + isl_basic_set_total_dim(nonneg));
+               isl_int_set_si(nonneg->ineq[k][pos(set->dim, type) + first + i], 1);
+
+               neg = isl_basic_set_alloc_dim(isl_set_get_dim(set), 0, 0, 1);
+               k = isl_basic_set_alloc_inequality(neg);
+               if (k < 0)
+                       goto error;
+               isl_seq_clr(neg->ineq[k], 1 + isl_basic_set_total_dim(neg));
+               isl_int_set_si(neg->ineq[k][0], -1);
+               isl_int_set_si(neg->ineq[k][pos(set->dim, type) + first + i], -1);
+
+               set = isl_set_intersect(set, isl_basic_set_union(nonneg, neg));
+       }
+
+       return set;
+error:
+       isl_basic_set_free(nonneg);
+       isl_basic_set_free(neg);
+       isl_set_free(set);
+       return NULL;
+}
+
 int isl_set_is_equal(struct isl_set *set1, struct isl_set *set2)
 {
        return isl_map_is_equal((struct isl_map *)set1, (struct isl_map *)set2);
index b462eb2..db176d8 100644 (file)
@@ -108,6 +108,8 @@ struct isl_basic_map *isl_basic_map_drop(struct isl_basic_map *bmap,
        enum isl_dim_type type, unsigned first, unsigned n);
 struct isl_set *isl_set_drop(struct isl_set *set,
        enum isl_dim_type type, unsigned first, unsigned n);
+__isl_give isl_set *isl_set_split_dims(__isl_take isl_set *set,
+       enum isl_dim_type type, unsigned first, unsigned n);
 struct isl_basic_set *isl_basic_set_drop_dims(
                struct isl_basic_set *bset, unsigned first, unsigned n);
 struct isl_set *isl_set_drop_dims(
index b65dfcb..ea556f6 100644 (file)
@@ -477,3 +477,30 @@ unsigned FN(PW,dim)(__isl_keep PW *pw, enum isl_dim_type type)
 {
        return pw ? isl_dim_size(pw->dim, type) : 0;
 }
+
+__isl_give PW *FN(PW,split_dims)(__isl_take PW *pw,
+       enum isl_dim_type type, unsigned first, unsigned n)
+{
+       int i;
+
+       if (!pw)
+               return NULL;
+       if (n == 0)
+               return pw;
+
+       pw = FN(PW,cow)(pw);
+       if (!pw)
+               return NULL;
+       if (!pw->dim)
+               goto error;
+       for (i = 0; i < pw->n; ++i) {
+               pw->p[i].set = isl_set_split_dims(pw->p[i].set, type, first, n);
+               if (!pw->p[i].set)
+                       goto error;
+       }
+
+       return pw;
+error:
+       FN(PW,free)(pw);
+       return NULL;
+}