From e9ac9c48ab2ca26e3b88ac30e8886db2336e4ac8 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Wed, 18 Aug 2010 10:11:25 +0200 Subject: [PATCH] rename isl_pw_qpolynomial_fold_add to isl_pw_qpolynomial_fold_fold The new name is more consistent with the naming of isl_qpolynomial_fold_fold. Furthermore, it makes sense to perform addition on isl_pw_qpolynomial_folds, so we prefer to use the name isl_pw_qpolynomial_fold_add for such a function. Signed-off-by: Sven Verdoolaege --- doc/user.pod | 15 +++- include/isl_polynomial.h | 6 +- isl_bernstein.c | 10 +-- isl_bound.c | 12 +-- isl_fold.c | 225 ++++++++++++++++++++++++++++++++++++++++++++++- isl_obj.c | 4 +- isl_polynomial.c | 10 ++- isl_polynomial_private.h | 9 ++ isl_pw_templ.c | 5 +- isl_range.c | 4 +- 10 files changed, 274 insertions(+), 26 deletions(-) diff --git a/doc/user.pod b/doc/user.pod index e4a4c53..c649943 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -35,6 +35,17 @@ should be given the value 1. See L. =back +=head3 Changes since isl-0.03 + +=over + +=item * The function C has been +renamed to C. +Similarly, C has been +renamed to C. + +=back + =head1 Installation The source of C can be obtained either as a tarball @@ -1842,11 +1853,11 @@ To iterate over all quasipolynomials in a reduction, use =head3 Operations on Piecewise Quasipolynomial Reductions - __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_add( + __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_fold( __isl_take isl_pw_qpolynomial_fold *pwf1, __isl_take isl_pw_qpolynomial_fold *pwf2); - __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_add( + __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_fold( __isl_take isl_union_pw_qpolynomial_fold *upwf1, __isl_take isl_union_pw_qpolynomial_fold *upwf2); diff --git a/include/isl_polynomial.h b/include/isl_polynomial.h index f2564c6..66c9241 100644 --- a/include/isl_polynomial.h +++ b/include/isl_polynomial.h @@ -291,7 +291,7 @@ __isl_give isl_set *isl_pw_qpolynomial_fold_domain( __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_intersect_domain( __isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_set *set); -__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_add( +__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_fold( __isl_take isl_pw_qpolynomial_fold *pwf1, __isl_take isl_pw_qpolynomial_fold *pwf2); __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_add_disjoint( @@ -398,7 +398,7 @@ isl_ctx *isl_union_pw_qpolynomial_fold_get_ctx( __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_from_pw_qpolynomial_fold(__isl_take isl_pw_qpolynomial_fold *pwf); __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_zero( __isl_take isl_dim *dim); -__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_add_pw_qpolynomial_fold( +__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_fold_pw_qpolynomial_fold( __isl_take isl_union_pw_qpolynomial_fold *upwqp, __isl_take isl_pw_qpolynomial_fold *pwqp); void isl_union_pw_qpolynomial_fold_free( @@ -406,7 +406,7 @@ void isl_union_pw_qpolynomial_fold_free( __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_copy( __isl_keep isl_union_pw_qpolynomial_fold *upwf); -__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_add( +__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_fold( __isl_take isl_union_pw_qpolynomial_fold *upwf1, __isl_take isl_union_pw_qpolynomial_fold *upwf2); diff --git a/isl_bernstein.c b/isl_bernstein.c index 868bb3c..12c1615 100644 --- a/isl_bernstein.c +++ b/isl_bernstein.c @@ -298,9 +298,9 @@ static int bernstein_coefficients_cell(__isl_take isl_cell *cell, void *user) extract_coefficients(poly, dom, data); pwf = isl_pw_qpolynomial_fold_alloc(isl_set_copy(dom), data->fold); - data->pwf = isl_pw_qpolynomial_fold_add(data->pwf, pwf); + data->pwf = isl_pw_qpolynomial_fold_fold(data->pwf, pwf); pwf = isl_pw_qpolynomial_fold_alloc(dom, data->fold_tight); - data->pwf_tight = isl_pw_qpolynomial_fold_add(data->pwf_tight, pwf); + data->pwf_tight = isl_pw_qpolynomial_fold_fold(data->pwf_tight, pwf); isl_qpolynomial_free(poly); isl_cell_free(cell); @@ -378,7 +378,7 @@ static __isl_give isl_pw_qpolynomial_fold *bernstein_coefficients_base( return data->pwf_tight; } - data->pwf = isl_pw_qpolynomial_fold_add(data->pwf, data->pwf_tight); + data->pwf = isl_pw_qpolynomial_fold_fold(data->pwf, data->pwf_tight); return data->pwf; error: @@ -528,9 +528,9 @@ int isl_qpolynomial_bound_on_domain_bernstein(__isl_take isl_basic_set *bset, pwf = bernstein_coefficients_base(bset, poly, &data, tp); if (tight) - bound->pwf_tight = isl_pw_qpolynomial_fold_add(bound->pwf_tight, pwf); + bound->pwf_tight = isl_pw_qpolynomial_fold_fold(bound->pwf_tight, pwf); else - bound->pwf = isl_pw_qpolynomial_fold_add(bound->pwf, pwf); + bound->pwf = isl_pw_qpolynomial_fold_fold(bound->pwf, pwf); return 0; error: diff --git a/isl_bound.c b/isl_bound.c index f3b3173..cbd2e8d 100644 --- a/isl_bound.c +++ b/isl_bound.c @@ -92,8 +92,8 @@ static int unwrapped_guarded_poly_bound(__isl_take isl_basic_set *bset, isl_morph_copy(morph)); bound->pwf_tight = isl_pw_qpolynomial_fold_morph(bound->pwf_tight, morph); - bound->pwf = isl_pw_qpolynomial_fold_add(top_pwf, bound->pwf); - bound->pwf_tight = isl_pw_qpolynomial_fold_add(top_pwf_tight, + bound->pwf = isl_pw_qpolynomial_fold_fold(top_pwf, bound->pwf); + bound->pwf_tight = isl_pw_qpolynomial_fold_fold(top_pwf_tight, bound->pwf_tight); return r; @@ -146,8 +146,8 @@ static int guarded_poly_bound(__isl_take isl_basic_set *bset, bound->pwf_tight = isl_pw_qpolynomial_fold_reset_dim(bound->pwf_tight, target_dim); - bound->pwf = isl_pw_qpolynomial_fold_add(top_pwf, bound->pwf); - bound->pwf_tight = isl_pw_qpolynomial_fold_add(top_pwf_tight, + bound->pwf = isl_pw_qpolynomial_fold_fold(top_pwf, bound->pwf); + bound->pwf_tight = isl_pw_qpolynomial_fold_fold(top_pwf_tight, bound->pwf_tight); return r; @@ -266,7 +266,7 @@ __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_bound( return bound.pwf_tight; } - bound.pwf = isl_pw_qpolynomial_fold_add(bound.pwf, bound.pwf_tight); + bound.pwf = isl_pw_qpolynomial_fold_fold(bound.pwf, bound.pwf_tight); return bound.pwf; error: @@ -299,7 +299,7 @@ static int bound_pw(__isl_take isl_pw_qpolynomial *pwqp, void *user) pwf = isl_pw_qpolynomial_bound(pwqp, data->type, data->tight ? &data->tight : NULL); - data->res = isl_union_pw_qpolynomial_fold_add_pw_qpolynomial_fold( + data->res = isl_union_pw_qpolynomial_fold_fold_pw_qpolynomial_fold( data->res, pwf); return 0; diff --git a/isl_fold.c b/isl_fold.c index 3286bd7..fd50f90 100644 --- a/isl_fold.c +++ b/isl_fold.c @@ -350,6 +350,91 @@ error: return NULL; } +__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_add_qpolynomial( + __isl_take isl_qpolynomial_fold *fold, __isl_take isl_qpolynomial *qp) +{ + int i; + + if (!fold || !qp) + goto error; + + if (isl_qpolynomial_is_zero(qp)) { + isl_qpolynomial_free(qp); + return fold; + } + + fold = isl_qpolynomial_fold_cow(fold); + if (!fold) + goto error; + + for (i = 0; i < fold->n; ++i) { + fold->qp[i] = isl_qpolynomial_add(fold->qp[i], + isl_qpolynomial_copy(qp)); + if (!fold->qp[i]) + goto error; + } + + isl_qpolynomial_free(qp); + return fold; +error: + isl_qpolynomial_fold_free(fold); + isl_qpolynomial_free(qp); + return NULL; +} + +__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_add_on_domain( + __isl_keep isl_set *dom, + __isl_take isl_qpolynomial_fold *fold1, + __isl_take isl_qpolynomial_fold *fold2) +{ + int i; + isl_qpolynomial_fold *res = NULL; + + if (!fold1 || !fold2) + goto error; + + if (isl_qpolynomial_fold_is_empty(fold1)) { + isl_qpolynomial_fold_free(fold1); + return fold2; + } + + if (isl_qpolynomial_fold_is_empty(fold2)) { + isl_qpolynomial_fold_free(fold2); + return fold1; + } + + if (fold1->n == 1 && fold2->n != 1) + return isl_qpolynomial_fold_add_on_domain(dom, fold2, fold1); + + if (fold2->n == 1) { + res = isl_qpolynomial_fold_add_qpolynomial(fold1, + isl_qpolynomial_copy(fold2->qp[0])); + isl_qpolynomial_fold_free(fold2); + return res; + } + + res = isl_qpolynomial_fold_add_qpolynomial( + isl_qpolynomial_fold_copy(fold1), + isl_qpolynomial_copy(fold2->qp[0])); + + for (i = 1; i < fold2->n; ++i) { + isl_qpolynomial_fold *res_i; + res_i = isl_qpolynomial_fold_add_qpolynomial( + isl_qpolynomial_fold_copy(fold1), + isl_qpolynomial_copy(fold2->qp[i])); + res = isl_qpolynomial_fold_fold_on_domain(dom, res, res_i); + } + + isl_qpolynomial_fold_free(fold1); + isl_qpolynomial_fold_free(fold2); + return res; +error: + isl_qpolynomial_fold_free(res); + isl_qpolynomial_fold_free(fold1); + isl_qpolynomial_fold_free(fold2); + return NULL; +} + __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_substitute_equalities( __isl_take isl_qpolynomial_fold *fold, __isl_take isl_basic_set *eq) { @@ -385,8 +470,6 @@ error: #define IS_ZERO is_empty #undef FIELD #define FIELD fold -#undef ADD -#define ADD(d,e1,e2) isl_qpolynomial_fold_fold_on_domain(d,e1,e2) #include @@ -552,6 +635,144 @@ error: return NULL; } +__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_fold( + __isl_take isl_pw_qpolynomial_fold *pw1, + __isl_take isl_pw_qpolynomial_fold *pw2) +{ + int i, j, n; + struct isl_pw_qpolynomial_fold *res; + isl_set *set; + + if (!pw1 || !pw2) + goto error; + + isl_assert(pw1->dim->ctx, isl_dim_equal(pw1->dim, pw2->dim), goto error); + + if (isl_pw_qpolynomial_fold_is_zero(pw1)) { + isl_pw_qpolynomial_fold_free(pw1); + return pw2; + } + + if (isl_pw_qpolynomial_fold_is_zero(pw2)) { + isl_pw_qpolynomial_fold_free(pw2); + return pw1; + } + + n = (pw1->n + 1) * (pw2->n + 1); + res = isl_pw_qpolynomial_fold_alloc_(isl_dim_copy(pw1->dim), n); + + for (i = 0; i < pw1->n; ++i) { + set = isl_set_copy(pw1->p[i].set); + for (j = 0; j < pw2->n; ++j) { + struct isl_set *common; + isl_qpolynomial_fold *sum; + set = isl_set_subtract(set, + isl_set_copy(pw2->p[j].set)); + common = isl_set_intersect(isl_set_copy(pw1->p[i].set), + isl_set_copy(pw2->p[j].set)); + if (isl_set_fast_is_empty(common)) { + isl_set_free(common); + continue; + } + + sum = isl_qpolynomial_fold_fold_on_domain(common, + isl_qpolynomial_fold_copy(pw1->p[i].fold), + isl_qpolynomial_fold_copy(pw2->p[j].fold)); + + res = isl_pw_qpolynomial_fold_add_piece(res, common, sum); + } + res = isl_pw_qpolynomial_fold_add_piece(res, set, + isl_qpolynomial_fold_copy(pw1->p[i].fold)); + } + + for (j = 0; j < pw2->n; ++j) { + set = isl_set_copy(pw2->p[j].set); + for (i = 0; i < pw1->n; ++i) + set = isl_set_subtract(set, isl_set_copy(pw1->p[i].set)); + res = isl_pw_qpolynomial_fold_add_piece(res, set, + isl_qpolynomial_fold_copy(pw2->p[j].fold)); + } + + isl_pw_qpolynomial_fold_free(pw1); + isl_pw_qpolynomial_fold_free(pw2); + + return res; +error: + isl_pw_qpolynomial_fold_free(pw1); + isl_pw_qpolynomial_fold_free(pw2); + return NULL; +} + +__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_fold_pw_qpolynomial_fold( + __isl_take isl_union_pw_qpolynomial_fold *u, + __isl_take isl_pw_qpolynomial_fold *part) +{ + uint32_t hash; + struct isl_hash_table_entry *entry; + + u = isl_union_pw_qpolynomial_fold_cow(u); + + if (!part || !u) + goto error; + + isl_assert(u->dim->ctx, isl_dim_match(part->dim, isl_dim_param, u->dim, + isl_dim_param), goto error); + + hash = isl_dim_get_hash(part->dim); + entry = isl_hash_table_find(u->dim->ctx, &u->table, hash, + &has_dim, part->dim, 1); + if (!entry) + goto error; + + if (!entry->data) + entry->data = part; + else { + entry->data = isl_pw_qpolynomial_fold_fold(entry->data, + isl_pw_qpolynomial_fold_copy(part)); + if (!entry->data) + goto error; + isl_pw_qpolynomial_fold_free(part); + } + + return u; +error: + isl_pw_qpolynomial_fold_free(part); + isl_union_pw_qpolynomial_fold_free(u); + return NULL; +} + +static int fold_part(__isl_take isl_pw_qpolynomial_fold *part, void *user) +{ + isl_union_pw_qpolynomial_fold **u; + u = (isl_union_pw_qpolynomial_fold **)user; + + *u = isl_union_pw_qpolynomial_fold_fold_pw_qpolynomial_fold(*u, part); + + return 0; +} + +__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_fold( + __isl_take isl_union_pw_qpolynomial_fold *u1, + __isl_take isl_union_pw_qpolynomial_fold *u2) +{ + u1 = isl_union_pw_qpolynomial_fold_cow(u1); + + if (!u1 || !u2) + goto error; + + if (isl_union_pw_qpolynomial_fold_foreach_pw_qpolynomial_fold(u2, + &fold_part, &u1) < 0) + goto error; + + isl_union_pw_qpolynomial_fold_free(u2); + + return u1; +error: + isl_union_pw_qpolynomial_fold_free(u1); + isl_union_pw_qpolynomial_fold_free(u2); + return NULL; +} + __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_from_pw_qpolynomial( enum isl_fold type, __isl_take isl_pw_qpolynomial *pwqp) { diff --git a/isl_obj.c b/isl_obj.c index 7438146..5fa218e 100644 --- a/isl_obj.c +++ b/isl_obj.c @@ -229,7 +229,7 @@ static __isl_give isl_printer *isl_obj_pw_qpf_print(__isl_take isl_printer *p, static void *isl_obj_pw_qpf_add(void *v1, void *v2) { - return isl_pw_qpolynomial_fold_add((struct isl_pw_qpolynomial_fold *)v1, + return isl_pw_qpolynomial_fold_fold((struct isl_pw_qpolynomial_fold *)v1, (struct isl_pw_qpolynomial_fold *)v2); } @@ -259,7 +259,7 @@ static __isl_give isl_printer *isl_obj_union_pw_qpf_print( static void *isl_obj_union_pw_qpf_add(void *v1, void *v2) { - return isl_union_pw_qpolynomial_fold_add( + return isl_union_pw_qpolynomial_fold_fold( (struct isl_union_pw_qpolynomial_fold *)v1, (struct isl_union_pw_qpolynomial_fold *)v2); } diff --git a/isl_polynomial.c b/isl_polynomial.c index 4d9bfce..777c701 100644 --- a/isl_polynomial.c +++ b/isl_polynomial.c @@ -1293,6 +1293,14 @@ error: return NULL; } +__isl_give isl_qpolynomial *isl_qpolynomial_add_on_domain( + __isl_keep isl_set *dom, + __isl_take isl_qpolynomial *qp1, + __isl_take isl_qpolynomial *qp2) +{ + return isl_qpolynomial_add(qp1, qp2); +} + __isl_give isl_qpolynomial *isl_qpolynomial_sub(__isl_take isl_qpolynomial *qp1, __isl_take isl_qpolynomial *qp2) { @@ -1947,8 +1955,6 @@ error: #define IS_ZERO is_zero #undef FIELD #define FIELD qp -#undef ADD -#define ADD(d,e1,e2) isl_qpolynomial_add(e1,e2) #include diff --git a/isl_polynomial_private.h b/isl_polynomial_private.h index 6c28065..0c41c1b 100644 --- a/isl_polynomial_private.h +++ b/isl_polynomial_private.h @@ -123,6 +123,11 @@ __isl_give isl_qpolynomial *isl_qpolynomial_div_pow(__isl_take isl_div *div, int isl_qpolynomial_is_one(__isl_keep isl_qpolynomial *qp); int isl_qpolynomial_is_affine(__isl_keep isl_qpolynomial *qp); +__isl_give isl_qpolynomial *isl_qpolynomial_add_on_domain( + __isl_keep isl_set *dom, + __isl_take isl_qpolynomial *qp1, + __isl_take isl_qpolynomial *qp2); + int isl_qpolynomial_le_cst(__isl_keep isl_qpolynomial *qp1, __isl_keep isl_qpolynomial *qp2); __isl_give isl_qpolynomial *isl_qpolynomial_max_cst( @@ -159,6 +164,10 @@ __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_dup( __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_cow( __isl_take isl_pw_qpolynomial_fold *pwf); +__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_add_on_domain( + __isl_keep isl_set *set, + __isl_take isl_qpolynomial_fold *fold1, + __isl_take isl_qpolynomial_fold *fold2); __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_fold_on_domain( __isl_keep isl_set *set, __isl_take isl_qpolynomial_fold *fold1, diff --git a/isl_pw_templ.c b/isl_pw_templ.c index bff9466..b176693 100644 --- a/isl_pw_templ.c +++ b/isl_pw_templ.c @@ -178,8 +178,9 @@ __isl_give PW *FN(PW,add)(__isl_take PW *pw1, __isl_take PW *pw2) continue; } - sum = ADD(common, FN(EL,copy)(pw1->p[i].FIELD), - FN(EL,copy)(pw2->p[j].FIELD)); + sum = FN(EL,add_on_domain)(common, + FN(EL,copy)(pw1->p[i].FIELD), + FN(EL,copy)(pw2->p[j].FIELD)); res = FN(PW,add_piece)(res, common, sum); } diff --git a/isl_range.c b/isl_range.c index 140ca50..1658805 100644 --- a/isl_range.c +++ b/isl_range.c @@ -257,10 +257,10 @@ static int add_guarded_poly(__isl_take isl_basic_set *bset, set = isl_set_from_basic_set(bset); pwf = isl_pw_qpolynomial_fold_alloc(set, fold); if (data->tight) - data->pwf_tight = isl_pw_qpolynomial_fold_add( + data->pwf_tight = isl_pw_qpolynomial_fold_fold( data->pwf_tight, pwf); else - data->pwf = isl_pw_qpolynomial_fold_add(data->pwf, pwf); + data->pwf = isl_pw_qpolynomial_fold_fold(data->pwf, pwf); return 0; } -- 2.7.4