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

index f5be4ed..1abd196 100644 (file)
@@ -77,6 +77,8 @@ __isl_give isl_dim *isl_pw_qpolynomial_get_dim(
        __isl_keep isl_pw_qpolynomial *pwqp);
 unsigned isl_pw_qpolynomial_dim(__isl_keep isl_pw_qpolynomial *pwqp,
        enum isl_dim_type type);
+int isl_pw_qpolynomial_involves_dims(__isl_keep isl_pw_qpolynomial *pwqp,
+       enum isl_dim_type type, unsigned first, unsigned n);
 
 __isl_give isl_set *isl_pw_qpolynomial_domain(__isl_take isl_pw_qpolynomial *pwqp);
 __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_intersect_domain(
index f73d83f..1b38b82 100644 (file)
@@ -1380,6 +1380,103 @@ error:
        return NULL;
 }
 
+static int up_set_active(__isl_keep struct isl_upoly *up, int *active, int d)
+{
+       struct isl_upoly_rec *rec;
+       int i;
+
+       if (!up)
+               return -1;
+
+       if (isl_upoly_is_cst(up))
+               return 0;
+
+       if (up->var < d)
+               active[up->var] = 1;
+
+       rec = isl_upoly_as_rec(up);
+       for (i = 0; i < rec->n; ++i)
+               if (up_set_active(rec->p[i], active, d) < 0)
+                       return -1;
+
+       return 0;
+}
+
+static int set_active(__isl_keep isl_qpolynomial *qp, int *active)
+{
+       int i, j;
+       int d = isl_dim_total(qp->dim);
+
+       if (!qp || !active)
+               return -1;
+
+       for (i = 0; i < d; ++i)
+               for (j = 0; j < qp->div->n_row; ++j) {
+                       if (isl_int_is_zero(qp->div->row[j][2 + i]))
+                               continue;
+                       active[i] = 1;
+                       break;
+               }
+
+       return up_set_active(qp->upoly, active, d);
+}
+
+int isl_qpolynomial_involves_dims(__isl_keep isl_qpolynomial *qp,
+       enum isl_dim_type type, unsigned first, unsigned n)
+{
+       int i;
+       int *active = NULL;
+       int involves = 0;
+
+       if (!qp)
+               return -1;
+       if (n == 0)
+               return 0;
+
+       isl_assert(qp->dim->ctx, first + n <= isl_dim_size(qp->dim, type),
+                       return -1);
+       isl_assert(qp->dim->ctx, type == isl_dim_param ||
+                                type == isl_dim_set, return -1);
+
+       active = isl_calloc_array(set->ctx, int, isl_dim_total(qp->dim));
+       if (set_active(qp, active) < 0)
+               goto error;
+
+       if (type == isl_dim_set)
+               first += isl_dim_size(qp->dim, isl_dim_param);
+       for (i = 0; i < n; ++i)
+               if (active[first + i]) {
+                       involves = 1;
+                       break;
+               }
+
+       free(active);
+
+       return involves;
+error:
+       free(active);
+       return -1;
+}
+
+int isl_qpolynomial_fold_involves_dims(__isl_keep isl_qpolynomial_fold *fold,
+       enum isl_dim_type type, unsigned first, unsigned n)
+{
+       int i;
+
+       if (!fold)
+               return -1;
+       if (fold->n == 0 || n == 0)
+               return 0;
+
+       for (i = 0; i < fold->n; ++i) {
+               int involves = isl_qpolynomial_involves_dims(fold->qp[i],
+                                                           type, first, n);
+               if (involves < 0 || involves)
+                       return involves;
+       }
+       return 0;
+}
+
 #undef PW
 #define PW isl_pw_qpolynomial
 #undef EL
@@ -2350,44 +2447,6 @@ __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_from_pw_qpolynomial(
        return pwf;
 }
 
-static int up_set_active(__isl_keep struct isl_upoly *up, int *active, int d)
-{
-       struct isl_upoly_rec *rec;
-       int i;
-
-       if (!up)
-               return -1;
-
-       if (isl_upoly_is_cst(up))
-               return 0;
-
-       if (up->var < d)
-               active[up->var] = 1;
-
-       rec = isl_upoly_as_rec(up);
-       for (i = 0; i < rec->n; ++i)
-               if (up_set_active(rec->p[i], active, d) < 0)
-                       return -1;
-
-       return 0;
-}
-
-static int set_active(__isl_keep isl_qpolynomial *qp, int *active)
-{
-       int i, j;
-       int d = isl_dim_total(qp->dim);
-
-       for (i = 0; i < d; ++i)
-               for (j = 0; j < qp->div->n_row; ++j) {
-                       if (isl_int_is_zero(qp->div->row[j][2 + i]))
-                               continue;
-                       active[i] = 1;
-                       break;
-               }
-
-       return up_set_active(qp->upoly, active, d);
-}
-
 /* For each parameter or variable that does not appear in qp,
  * first eliminate the variable from all constraints and then set it to zero.
  */
index db7e1d7..f682897 100644 (file)
@@ -400,3 +400,21 @@ isl_ctx *FN(PW,get_ctx)(__isl_keep PW *pw)
 {
        return pw ? pw->dim->ctx : NULL;
 }
+
+int FN(PW,involves_dims)(__isl_keep PW *pw, enum isl_dim_type type,
+       unsigned first, unsigned n)
+{
+       int i;
+
+       if (!pw)
+               return -1;
+       if (pw->n == 0 || n == 0)
+               return 0;
+       for (i = 0; i < pw->n; ++i) {
+               int involves = FN(EL,involves_dims)(pw->p[i].FIELD,
+                                                       type, first, n);
+               if (involves < 0 || involves)
+                       return involves;
+       }
+       return 0;
+}