add isl_pw_qpolynomial_fold_morph
authorSven Verdoolaege <skimo@kotnet.org>
Wed, 12 May 2010 20:58:02 +0000 (22:58 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Thu, 13 May 2010 18:40:39 +0000 (20:40 +0200)
isl_fold.c
isl_polynomial.c
isl_polynomial_private.h
isl_pw_templ.c

index a0bdab3..99f5fa4 100644 (file)
@@ -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;
+}
index 7269224..74982c2 100644 (file)
@@ -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;
+}
index c68a94f..a91574b 100644 (file)
@@ -2,6 +2,7 @@
 #include <isl_div.h>
 #include <isl_map.h>
 #include <isl_mat.h>
+#include <isl_morph.h>
 #include <isl_polynomial.h>
 
 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);
index edf6a54..7f1af48 100644 (file)
@@ -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;
+}