add isl_qpolynomial_degree
authorSven Verdoolaege <skimo@kotnet.org>
Sun, 6 Jun 2010 12:12:47 +0000 (14:12 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Sat, 12 Jun 2010 11:16:36 +0000 (13:16 +0200)
isl_polynomial.c
isl_polynomial_private.h

index 757ed25..3f6785c 100644 (file)
@@ -2450,6 +2450,55 @@ error:
        return -1;
 }
 
+/* Return total degree in variables first (inclusive) up to last (exclusive).
+ */
+int isl_upoly_degree(__isl_keep struct isl_upoly *up, int first, int last)
+{
+       int deg = -1;
+       int i;
+       struct isl_upoly_rec *rec;
+
+       if (!up)
+               return -2;
+       if (isl_upoly_is_zero(up))
+               return -1;
+       if (isl_upoly_is_cst(up) || up->var < first)
+               return 0;
+
+       rec = isl_upoly_as_rec(up);
+       if (!rec)
+               return -2;
+
+       for (i = 0; i < rec->n; ++i) {
+               int d;
+
+               if (isl_upoly_is_zero(rec->p[i]))
+                       continue;
+               d = isl_upoly_degree(rec->p[i], first, last);
+               if (up->var < last)
+                       d += i;
+               if (d > deg)
+                       deg = d;
+       }
+
+       return deg;
+}
+
+/* Return total degree in set variables.
+ */
+int isl_qpolynomial_degree(__isl_keep isl_qpolynomial *poly)
+{
+       unsigned ovar;
+       unsigned nvar;
+
+       if (!poly)
+               return -2;
+
+       ovar = isl_dim_offset(poly->dim, isl_dim_set);
+       nvar = isl_dim_size(poly->dim, isl_dim_set);
+       return isl_upoly_degree(poly->upoly, ovar, ovar + nvar);
+}
+
 __isl_give isl_term *isl_term_alloc(__isl_take isl_dim *dim,
        __isl_take isl_mat *div)
 {
index efba8b1..2e3261e 100644 (file)
@@ -131,6 +131,8 @@ __isl_give isl_qpolynomial *isl_qpolynomial_max_cst(
 __isl_give isl_qpolynomial *isl_qpolynomial_min_cst(
        __isl_take isl_qpolynomial *qp1, __isl_take isl_qpolynomial *qp2);
 
+int isl_qpolynomial_degree(__isl_keep isl_qpolynomial *poly);
+
 __isl_give isl_vec *isl_qpolynomial_extract_affine(
        __isl_keep isl_qpolynomial *qp);