add isl_pw_qpolynomial_drop_dims
authorSven Verdoolaege <sven@nestor.cs.kuleuven.be>
Fri, 19 Mar 2010 16:51:21 +0000 (17:51 +0100)
committerSven Verdoolaege <sven@nestor.cs.kuleuven.be>
Fri, 19 Mar 2010 17:02:47 +0000 (18:02 +0100)
include/isl_polynomial.h
isl_polynomial.c
isl_polynomial_private.h
isl_pw_templ.c

index 1abd196..a7558a4 100644 (file)
@@ -84,6 +84,10 @@ __isl_give isl_set *isl_pw_qpolynomial_domain(__isl_take isl_pw_qpolynomial *pwq
 __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_intersect_domain(
        __isl_take isl_pw_qpolynomial *pwpq, __isl_take isl_set *set);
 
+__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_add(
        __isl_take isl_pw_qpolynomial *pwqp1,
        __isl_take isl_pw_qpolynomial *pwqp2);
index 1b38b82..4334ee5 100644 (file)
@@ -467,7 +467,6 @@ static __isl_give struct isl_upoly *replace_by_constant_term(
        rec = isl_upoly_as_rec(up);
        if (!rec)
                goto error;
-       isl_assert(up->ctx, rec->n == 1, goto error);
        cst = isl_upoly_copy(rec->p[0]);
        isl_upoly_free(up);
        return cst;
@@ -1477,6 +1476,110 @@ int isl_qpolynomial_fold_involves_dims(__isl_keep isl_qpolynomial_fold *fold,
        return 0;
 }
 
+__isl_give struct isl_upoly *isl_upoly_drop(__isl_take struct isl_upoly *up,
+       unsigned first, unsigned n)
+{
+       int i;
+       struct isl_upoly_rec *rec;
+
+       if (!up)
+               return NULL;
+       if (n == 0 || up->var < 0 || up->var < first)
+               return up;
+       if (up->var < first + n) {
+               up = replace_by_constant_term(up);
+               return isl_upoly_drop(up, first, n);
+       }
+       up = isl_upoly_cow(up);
+       if (!up)
+               return NULL;
+       up->var -= n;
+       rec = isl_upoly_as_rec(up);
+       if (!rec)
+               goto error;
+
+       for (i = 0; i < rec->n; ++i) {
+               rec->p[i] = isl_upoly_drop(rec->p[i], first, n);
+               if (!rec->p[i])
+                       goto error;
+       }
+
+       return up;
+error:
+       isl_upoly_free(up);
+       return NULL;
+}
+
+__isl_give isl_qpolynomial *isl_qpolynomial_drop_dims(
+       __isl_take isl_qpolynomial *qp,
+       enum isl_dim_type type, unsigned first, unsigned n)
+{
+       if (!qp)
+               return NULL;
+       if (n == 0)
+               return qp;
+
+       qp = isl_qpolynomial_cow(qp);
+       if (!qp)
+               return NULL;
+
+       isl_assert(qp->dim->ctx, first + n <= isl_dim_size(qp->dim, type),
+                       goto error);
+       isl_assert(qp->dim->ctx, type == isl_dim_param ||
+                                type == isl_dim_set, goto error);
+
+       qp->dim = isl_dim_drop(qp->dim, type, first, n);
+       if (!qp->dim)
+               goto error;
+
+       if (type == isl_dim_set)
+               first += isl_dim_size(qp->dim, isl_dim_param);
+
+       qp->div = isl_mat_drop_cols(qp->div, 2 + first, n);
+       if (!qp->div)
+               goto error;
+
+       qp->upoly = isl_upoly_drop(qp->upoly, first, n);
+       if (!qp->upoly)
+               goto error;
+
+       return qp;
+error:
+       isl_qpolynomial_free(qp);
+       return NULL;
+}
+
+__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_drop_dims(
+       __isl_take isl_qpolynomial_fold *fold,
+       enum isl_dim_type type, unsigned first, unsigned n)
+{
+       int i;
+
+       if (!fold)
+               return NULL;
+       if (n == 0)
+               return fold;
+
+       fold = isl_qpolynomial_fold_cow(fold);
+       if (!fold)
+               return NULL;
+       fold->dim = isl_dim_drop(fold->dim, type, first, n);
+       if (!fold->dim)
+               goto error;
+
+       for (i = 0; i < fold->n; ++i) {
+               fold->qp[i] = isl_qpolynomial_drop_dims(fold->qp[i],
+                                                           type, first, n);
+               if (!fold->qp[i])
+                       goto error;
+       }
+
+       return fold;
+error:
+       isl_qpolynomial_fold_free(fold);
+       return NULL;
+}
+
 #undef PW
 #define PW isl_pw_qpolynomial
 #undef EL
@@ -2348,6 +2451,43 @@ __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_copy(
        return fold;
 }
 
+__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_dup(
+       __isl_keep isl_qpolynomial_fold *fold)
+{
+       int i;
+       isl_qpolynomial_fold *dup;
+
+       if (!fold)
+               return NULL;
+       dup = qpolynomial_fold_alloc(fold->type,
+                                       isl_dim_copy(fold->dim), fold->n);
+       if (!dup)
+               return NULL;
+       
+       for (i = 0; i < fold->n; ++i) {
+               dup->qp[i] = isl_qpolynomial_copy(fold->qp[i]);
+               if (!dup->qp[i])
+                       goto error;
+       }
+
+       return dup;
+error:
+       isl_qpolynomial_fold_free(dup);
+       return NULL;
+}
+
+__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_cow(
+       __isl_take isl_qpolynomial_fold *fold)
+{
+       if (!fold)
+               return NULL;
+
+       if (fold->ref == 1)
+               return fold;
+       fold->ref--;
+       return isl_qpolynomial_fold_dup(fold);
+}
+
 void isl_qpolynomial_fold_free(__isl_take isl_qpolynomial_fold *fold)
 {
        int i;
index b13b86e..8f4472d 100644 (file)
@@ -134,5 +134,10 @@ __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add_piece(
 int isl_pw_qpolynomial_is_zero(__isl_keep isl_pw_qpolynomial *pwqp);
 int isl_pw_qpolynomial_is_one(__isl_keep isl_pw_qpolynomial *pwqp);
 
+__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_cow(
+       __isl_take isl_qpolynomial_fold *fold);
+__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_dup(
+       __isl_keep isl_qpolynomial_fold *fold);
+
 __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_cow(
        __isl_take isl_pw_qpolynomial_fold *pwf);
index f682897..e81c8d9 100644 (file)
@@ -418,3 +418,34 @@ int FN(PW,involves_dims)(__isl_keep PW *pw, enum isl_dim_type type,
        }
        return 0;
 }
+
+__isl_give PW *FN(PW,drop_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;
+       pw->dim = isl_dim_drop(pw->dim, type, first, n);
+       if (!pw->dim)
+               goto error;
+       for (i = 0; i < pw->n; ++i) {
+               pw->p[i].set = isl_set_drop(pw->p[i].set, type, first, n);
+               if (!pw->p[i].set)
+                       goto error;
+               pw->p[i].FIELD = FN(EL,drop_dims)(pw->p[i].FIELD, type, first, n);
+               if (!pw->p[i].FIELD)
+                       goto error;
+       }
+
+       return pw;
+error:
+       FN(PW,free)(pw);
+       return NULL;
+}