From 5a5a9d0d5ab0ae5a7b45107f068ee90ccb10c959 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Fri, 10 Dec 2010 18:07:01 +0100 Subject: [PATCH] add isl_union_pw_qpolynomial_mul_isl_int Signed-off-by: Sven Verdoolaege --- include/isl/polynomial.h | 13 +++++++++++++ isl_fold.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ isl_polynomial.c | 34 +++++++++++++++++++++++++++------- isl_polynomial_private.h | 5 ++++- isl_pw_templ.c | 39 +++++++++++++++++++++++++++++++++++++++ isl_union_templ.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 174 insertions(+), 8 deletions(-) diff --git a/include/isl/polynomial.h b/include/isl/polynomial.h index 7c950c21..f029d823 100644 --- a/include/isl/polynomial.h +++ b/include/isl/polynomial.h @@ -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); diff --git a/isl_fold.c b/isl_fold.c index b6ca0ce5..5b846e1d 100644 --- a/isl_fold.c +++ b/isl_fold.c @@ -17,6 +17,18 @@ #include #include +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; +} diff --git a/isl_polynomial.c b/isl_polynomial.c index 4ae1bdfc..74f7bdf9 100644 --- a/isl_polynomial.c +++ b/isl_polynomial.c @@ -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; diff --git a/isl_polynomial_private.h b/isl_polynomial_private.h index 45e328a2..317519ff 100644 --- a/isl_polynomial_private.h +++ b/isl_polynomial_private.h @@ -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( diff --git a/isl_pw_templ.c b/isl_pw_templ.c index 0555091a..da4b53e5 100644 --- a/isl_pw_templ.c +++ b/isl_pw_templ.c @@ -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; +} diff --git a/isl_union_templ.c b/isl_union_templ.c index a04759fd..f2299ad7 100644 --- a/isl_union_templ.c +++ b/isl_union_templ.c @@ -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; +} -- 2.11.4.GIT