add isl_union_pw_qpolynomial_mul_isl_int
authorSven Verdoolaege <skimo@kotnet.org>
Fri, 10 Dec 2010 17:07:01 +0000 (18:07 +0100)
committerSven Verdoolaege <skimo@kotnet.org>
Sun, 23 Jan 2011 14:12:58 +0000 (15:12 +0100)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
include/isl/polynomial.h
isl_fold.c
isl_polynomial.c
isl_polynomial_private.h
isl_pw_templ.c
isl_union_templ.c

index 7c950c2..f029d82 100644 (file)
@@ -65,6 +65,8 @@ __isl_give isl_qpolynomial *isl_qpolynomial_pow(__isl_take isl_qpolynomial *qp,
        unsigned power);
 __isl_give isl_qpolynomial *isl_qpolynomial_add_isl_int(
        __isl_take isl_qpolynomial *qp, isl_int v);
+__isl_give isl_qpolynomial *isl_qpolynomial_mul_isl_int(
+       __isl_take isl_qpolynomial *qp, isl_int v);
 
 __isl_give isl_qpolynomial *isl_qpolynomial_insert_dims(
        __isl_take isl_qpolynomial *qp, enum isl_dim_type type,
@@ -176,6 +178,8 @@ __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_neg(
 __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_mul(
        __isl_take isl_pw_qpolynomial *pwqp1,
        __isl_take isl_pw_qpolynomial *pwqp2);
+__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_mul_isl_int(
+       __isl_take isl_pw_qpolynomial *pwqp, isl_int v);
 
 __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_insert_dims(
        __isl_take isl_pw_qpolynomial *pwqp, enum isl_dim_type type,
@@ -258,6 +262,9 @@ __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_fold(
        __isl_take isl_qpolynomial_fold *fold1,
        __isl_take isl_qpolynomial_fold *fold2);
 
+__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_mul_isl_int(
+       __isl_take isl_qpolynomial_fold *fold, isl_int v);
+
 __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_move_dims(
        __isl_take isl_qpolynomial_fold *fold,
        enum isl_dim_type dst_type, unsigned dst_pos,
@@ -331,6 +338,8 @@ __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_fold(
 __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_add_disjoint(
        __isl_take isl_pw_qpolynomial_fold *pwf1,
        __isl_take isl_pw_qpolynomial_fold *pwf2);
+__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_mul_isl_int(
+       __isl_take isl_pw_qpolynomial_fold *pwf, isl_int v);
 
 __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_drop_dims(
        __isl_take isl_pw_qpolynomial_fold *pwf,
@@ -411,6 +420,8 @@ __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_sub(
 __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_mul(
        __isl_take isl_union_pw_qpolynomial *upwqp1,
        __isl_take isl_union_pw_qpolynomial *upwqp2);
+__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_mul_isl_int(
+       __isl_take isl_union_pw_qpolynomial *upwqp, isl_int v);
 
 __isl_give isl_union_set *isl_union_pw_qpolynomial_domain(
        __isl_take isl_union_pw_qpolynomial *upwqp);
@@ -466,6 +477,8 @@ __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_fold(
 __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_add_union_pw_qpolynomial(
        __isl_take isl_union_pw_qpolynomial_fold *upwf,
        __isl_take isl_union_pw_qpolynomial *upwqp);
+__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_mul_isl_int(
+       __isl_take isl_union_pw_qpolynomial_fold *upwf, isl_int v);
 
 __isl_give isl_union_set *isl_union_pw_qpolynomial_fold_domain(
        __isl_take isl_union_pw_qpolynomial_fold *upwf);
index b6ca0ce..5b846e1 100644 (file)
 #include <isl/seq.h>
 #include <isl_mat_private.h>
 
+enum isl_fold isl_fold_type_negate(enum isl_fold type)
+{
+       switch (type) {
+       case isl_fold_min:
+               return isl_fold_max;
+       case isl_fold_max:
+               return isl_fold_min;
+       case isl_fold_list:
+               return isl_fold_list;
+       }
+}
+
 static __isl_give isl_qpolynomial_fold *qpolynomial_fold_alloc(
        enum isl_fold type, __isl_take isl_dim *dim, int n)
 {
@@ -1516,3 +1528,36 @@ error:
        isl_reordering_free(r);
        return NULL;
 }
+
+__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_mul_isl_int(
+       __isl_take isl_qpolynomial_fold *fold, isl_int v)
+{
+       int i;
+
+       if (isl_int_is_one(v))
+               return fold;
+       if (fold && isl_int_is_zero(v)) {
+               isl_qpolynomial_fold *zero;
+               isl_dim *dim = isl_dim_copy(fold->dim);
+               zero = isl_qpolynomial_fold_empty(fold->type, dim);
+               isl_qpolynomial_fold_free(fold);
+               return zero;
+       }
+
+       fold = isl_qpolynomial_fold_cow(fold);
+       if (!fold)
+               return NULL;
+
+       if (isl_int_is_neg(v))
+               fold->type = isl_fold_type_negate(fold->type);
+       for (i = 0; i < fold->n; ++i) {
+               fold->qp[i] = isl_qpolynomial_mul_isl_int(fold->qp[i], v);
+               if (!fold->qp[i])
+                       goto error;
+       }
+
+       return fold;
+error:
+       isl_qpolynomial_fold_free(fold);
+       return NULL;
+}
index 4ae1bdf..74f7bdf 100644 (file)
@@ -716,7 +716,8 @@ error:
        return NULL;
 }
 
-__isl_give struct isl_upoly *isl_upoly_neg_cst(__isl_take struct isl_upoly *up)
+__isl_give struct isl_upoly *isl_upoly_cst_mul_isl_int(
+       __isl_take struct isl_upoly *up, isl_int v)
 {
        struct isl_upoly_cst *cst;
 
@@ -729,12 +730,13 @@ __isl_give struct isl_upoly *isl_upoly_neg_cst(__isl_take struct isl_upoly *up)
 
        cst = isl_upoly_as_cst(up);
 
-       isl_int_neg(cst->n, cst->n);
+       isl_int_mul(cst->n, cst->n, v);
 
        return up;
 }
 
-__isl_give struct isl_upoly *isl_upoly_neg(__isl_take struct isl_upoly *up)
+__isl_give struct isl_upoly *isl_upoly_mul_isl_int(
+       __isl_take struct isl_upoly *up, isl_int v)
 {
        int i;
        struct isl_upoly_rec *rec;
@@ -743,7 +745,7 @@ __isl_give struct isl_upoly *isl_upoly_neg(__isl_take struct isl_upoly *up)
                return NULL;
 
        if (isl_upoly_is_cst(up))
-               return isl_upoly_neg_cst(up);
+               return isl_upoly_cst_mul_isl_int(up, v);
 
        up = isl_upoly_cow(up);
        rec = isl_upoly_as_rec(up);
@@ -751,7 +753,7 @@ __isl_give struct isl_upoly *isl_upoly_neg(__isl_take struct isl_upoly *up)
                goto error;
 
        for (i = 0; i < rec->n; ++i) {
-               rec->p[i] = isl_upoly_neg(rec->p[i]);
+               rec->p[i] = isl_upoly_mul_isl_int(rec->p[i], v);
                if (!rec->p[i])
                        goto error;
        }
@@ -1438,12 +1440,30 @@ error:
 
 __isl_give isl_qpolynomial *isl_qpolynomial_neg(__isl_take isl_qpolynomial *qp)
 {
-       qp = isl_qpolynomial_cow(qp);
+       if (!qp)
+               return NULL;
+
+       return isl_qpolynomial_mul_isl_int(qp, qp->dim->ctx->negone);
+}
 
+__isl_give isl_qpolynomial *isl_qpolynomial_mul_isl_int(
+       __isl_take isl_qpolynomial *qp, isl_int v)
+{
+       if (isl_int_is_one(v))
+               return qp;
+
+       if (qp && isl_int_is_zero(v)) {
+               isl_qpolynomial *zero;
+               zero = isl_qpolynomial_zero(isl_dim_copy(qp->dim));
+               isl_qpolynomial_free(qp);
+               return zero;
+       }
+       
+       qp = isl_qpolynomial_cow(qp);
        if (!qp)
                return NULL;
 
-       qp->upoly = isl_upoly_neg(qp->upoly);
+       qp->upoly = isl_upoly_mul_isl_int(qp->upoly, v);
        if (!qp->upoly)
                goto error;
 
index 45e328a..317519f 100644 (file)
@@ -109,7 +109,8 @@ __isl_keep struct isl_upoly_rec *isl_upoly_as_rec(__isl_keep struct isl_upoly *u
 
 __isl_give struct isl_upoly *isl_upoly_sum(__isl_take struct isl_upoly *up1,
        __isl_take struct isl_upoly *up2);
-__isl_give struct isl_upoly *isl_upoly_neg(__isl_take struct isl_upoly *up);
+__isl_give struct isl_upoly *isl_upoly_mul_isl_int(
+       __isl_take struct isl_upoly *up, isl_int v);
 
 __isl_give isl_qpolynomial *isl_qpolynomial_alloc(__isl_take isl_dim *dim,
        unsigned n_div, __isl_take struct isl_upoly *up);
@@ -158,6 +159,8 @@ int isl_pw_qpolynomial_is_one(__isl_keep isl_pw_qpolynomial *pwqp);
 __isl_give isl_qpolynomial *isl_qpolynomial_opt_on_domain(
        __isl_take isl_qpolynomial *qp, __isl_take isl_set *set, int max);
 
+enum isl_fold isl_fold_type_negate(enum isl_fold type);
+
 __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_cow(
        __isl_take isl_qpolynomial_fold *fold);
 __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_dup(
index 0555091..da4b53e 100644 (file)
@@ -918,3 +918,42 @@ error:
        FN(PW,free)(pw);
        return NULL;
 }
+
+__isl_give PW *FN(PW,mul_isl_int)(__isl_take PW *pw, isl_int v)
+{
+       int i;
+
+       if (isl_int_is_one(v))
+               return pw;
+       if (pw && isl_int_is_zero(v)) {
+               PW *zero;
+               isl_dim *dim = FN(PW,get_dim)(pw);
+#ifdef HAS_TYPE
+               zero = FN(PW,zero)(dim, pw->type);
+#else
+               zero = FN(PW,zero)(dim);
+#endif
+               FN(PW,free)(pw);
+               return zero;
+       }
+       pw = FN(PW,cow)(pw);
+       if (!pw)
+               return NULL;
+       if (pw->n == 0)
+               return pw;
+
+#ifdef HAS_TYPE
+       if (isl_int_is_neg(v))
+               pw->type = isl_fold_type_negate(pw->type);
+#endif
+       for (i = 0; i < pw->n; ++i) {
+               pw->p[i].FIELD = FN(EL,mul_isl_int)(pw->p[i].FIELD, v);
+               if (!pw->p[i].FIELD)
+                       goto error;
+       }
+
+       return pw;
+error:
+       FN(PW,free)(pw);
+       return NULL;
+}
index a04759f..f2299ad 100644 (file)
@@ -562,3 +562,49 @@ error:
        FN(UNION,free)(u);
        return NULL;
 }
+
+static int mul_isl_int(void **entry, void *user)
+{
+       PW **pw = (PW **)entry;
+       isl_int *v = user;
+
+       *pw = FN(PW,mul_isl_int)(*pw, *v);
+       if (!*pw)
+               return -1;
+
+       return 0;
+}
+
+__isl_give UNION *FN(UNION,mul_isl_int)(__isl_take UNION *u, isl_int v)
+{
+       if (isl_int_is_one(v))
+               return u;
+
+       if (u && isl_int_is_zero(v)) {
+               UNION *zero;
+               isl_dim *dim = FN(UNION,get_dim)(u);
+#ifdef HAS_TYPE
+               zero = FN(UNION,zero)(dim, u->type);
+#else
+               zero = FN(UNION,zero)(dim);
+#endif
+               FN(UNION,free)(u);
+               return zero;
+       }
+
+       u = FN(UNION,cow)(u);
+       if (!u)
+               return NULL;
+
+#ifdef HAS_TYPE
+       if (isl_int_is_neg(v))
+               u->type = isl_fold_type_negate(u->type);
+#endif
+       if (isl_hash_table_foreach(u->dim->ctx, &u->table, &mul_isl_int, v) < 0)
+               goto error;
+
+       return u;
+error:
+       FN(UNION,free)(u);
+       return NULL;
+}