From bf1e9ef6790824bbf7c887ffdea87951563b97f0 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Wed, 12 May 2010 22:58:02 +0200 Subject: [PATCH] add isl_pw_qpolynomial_fold_morph --- isl_fold.c | 37 ++++++++++++++++++++++++++++++++++++ isl_polynomial.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ isl_polynomial_private.h | 8 ++++++++ isl_pw_templ.c | 37 ++++++++++++++++++++++++++++++++++++ 4 files changed, 131 insertions(+) diff --git a/isl_fold.c b/isl_fold.c index a0bdab3..99f5fa4 100644 --- a/isl_fold.c +++ b/isl_fold.c @@ -718,3 +718,40 @@ int isl_pw_qpolynomial_fold_covers(__isl_keep isl_pw_qpolynomial_fold *pwf1, return 1; } + +__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_morph( + __isl_take isl_qpolynomial_fold *fold, __isl_take isl_morph *morph) +{ + int i; + isl_ctx *ctx; + + if (!fold || !morph) + goto error; + + ctx = fold->dim->ctx; + isl_assert(ctx, isl_dim_equal(fold->dim, morph->dom->dim), goto error); + + fold = isl_qpolynomial_fold_cow(fold); + if (!fold) + goto error; + + isl_dim_free(fold->dim); + fold->dim = isl_dim_copy(morph->ran->dim); + if (!fold->dim) + goto error; + + for (i = 0; i < fold->n; ++i) { + fold->qp[i] = isl_qpolynomial_morph(fold->qp[i], + isl_morph_copy(morph)); + if (!fold->qp[i]) + goto error; + } + + isl_morph_free(morph); + + return fold; +error: + isl_qpolynomial_fold_free(fold); + isl_morph_free(morph); + return NULL; +} diff --git a/isl_polynomial.c b/isl_polynomial.c index 7269224..74982c2 100644 --- a/isl_polynomial.c +++ b/isl_polynomial.c @@ -2999,3 +2999,52 @@ error: isl_qpolynomial_free(data.opt); return NULL; } + +__isl_give isl_qpolynomial *isl_qpolynomial_morph(__isl_take isl_qpolynomial *qp, + __isl_take isl_morph *morph) +{ + int i; + isl_ctx *ctx; + struct isl_upoly *up; + unsigned n_div; + struct isl_upoly **subs; + isl_mat *mat; + + qp = isl_qpolynomial_cow(qp); + if (!qp || !morph) + goto error; + + ctx = qp->dim->ctx; + isl_assert(ctx, isl_dim_equal(qp->dim, morph->dom->dim), goto error); + + subs = isl_calloc_array(ctx, struct isl_upoly *, morph->inv->n_row - 1); + if (!subs) + goto error; + + for (i = 0; 1 + i < morph->inv->n_row; ++i) + subs[i] = isl_upoly_from_affine(ctx, morph->inv->row[1 + i], + morph->inv->row[0][0], morph->inv->n_col); + + qp->upoly = isl_upoly_subs(qp->upoly, 0, morph->inv->n_row - 1, subs); + + for (i = 0; 1 + i < morph->inv->n_row; ++i) + isl_upoly_free(subs[i]); + free(subs); + + mat = isl_mat_diagonal(isl_mat_identity(ctx, 1), isl_mat_copy(morph->inv)); + mat = isl_mat_diagonal(mat, isl_mat_identity(ctx, qp->div->n_row)); + qp->div = isl_mat_product(qp->div, mat); + isl_dim_free(qp->dim); + qp->dim = isl_dim_copy(morph->ran->dim); + + if (!qp->upoly || !qp->div || !qp->dim) + goto error; + + isl_morph_free(morph); + + return qp; +error: + isl_qpolynomial_free(qp); + isl_morph_free(morph); + return NULL; +} diff --git a/isl_polynomial_private.h b/isl_polynomial_private.h index c68a94f..a91574b 100644 --- a/isl_polynomial_private.h +++ b/isl_polynomial_private.h @@ -2,6 +2,7 @@ #include #include #include +#include #include struct isl_upoly { @@ -157,3 +158,10 @@ __isl_give isl_qpolynomial *isl_qpolynomial_fold_opt_on_domain( int isl_pw_qpolynomial_fold_covers(__isl_keep isl_pw_qpolynomial_fold *pwf1, __isl_keep isl_pw_qpolynomial_fold *pwf2); + +__isl_give isl_qpolynomial *isl_qpolynomial_morph(__isl_take isl_qpolynomial *qp, + __isl_take isl_morph *morph); +__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_morph( + __isl_take isl_qpolynomial_fold *fold, __isl_take isl_morph *morph); +__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_morph( + __isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_morph *morph); diff --git a/isl_pw_templ.c b/isl_pw_templ.c index edf6a54..7f1af48 100644 --- a/isl_pw_templ.c +++ b/isl_pw_templ.c @@ -554,3 +554,40 @@ __isl_give isl_dim *FN(PW,get_dim)(__isl_keep PW *pw) { return pw ? isl_dim_copy(pw->dim) : NULL; } + +__isl_give PW *FN(PW,morph)(__isl_take PW *pw, __isl_take isl_morph *morph) +{ + int i; + + if (!pw || !morph) + goto error; + + isl_assert(pw->dim->ctx, isl_dim_equal(pw->dim, morph->dom->dim), + goto error); + + pw = FN(PW,cow)(pw); + if (!pw) + goto error; + isl_dim_free(pw->dim); + pw->dim = isl_dim_copy(morph->ran->dim); + if (!pw->dim) + goto error; + + for (i = 0; i < pw->n; ++i) { + pw->p[i].set = isl_morph_set(isl_morph_copy(morph), pw->p[i].set); + if (!pw->p[i].set) + goto error; + pw->p[i].FIELD = FN(EL,morph)(pw->p[i].FIELD, + isl_morph_copy(morph)); + if (!pw->p[i].FIELD) + goto error; + } + + isl_morph_free(morph); + + return pw; +error: + FN(PW,free)(pw); + isl_morph_free(morph); + return NULL; +} -- 2.7.4