From 5bf5b302ef1086a2a4215323af7ee02faef6ade8 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Mon, 3 May 2010 22:52:51 +0200 Subject: [PATCH] add isl_qpolynomial_from_term --- include/isl_polynomial.h | 1 + isl_polynomial.c | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/include/isl_polynomial.h b/include/isl_polynomial.h index a75524d..b2e93d8 100644 --- a/include/isl_polynomial.h +++ b/include/isl_polynomial.h @@ -89,6 +89,7 @@ __isl_give isl_qpolynomial *isl_qpolynomial_eval( __isl_give isl_qpolynomial *isl_qpolynomial_from_constraint( __isl_take isl_constraint *c, enum isl_dim_type type, unsigned pos); +__isl_give isl_qpolynomial *isl_qpolynomial_from_term(__isl_take isl_term *term); __isl_give isl_printer *isl_printer_print_qpolynomial( __isl_take isl_printer *p, __isl_keep isl_qpolynomial *qp); diff --git a/isl_polynomial.c b/isl_polynomial.c index 0625cce..5cbf162 100644 --- a/isl_polynomial.c +++ b/isl_polynomial.c @@ -2694,6 +2694,41 @@ int isl_qpolynomial_foreach_term(__isl_keep isl_qpolynomial *qp, return term ? 0 : -1; } +__isl_give isl_qpolynomial *isl_qpolynomial_from_term(__isl_take isl_term *term) +{ + struct isl_upoly *up; + isl_qpolynomial *qp; + int i, n; + + if (!term) + return NULL; + + n = isl_dim_total(term->dim) + term->div->n_row; + + up = isl_upoly_rat_cst(term->dim->ctx, term->n, term->d); + for (i = 0; i < n; ++i) { + if (!term->pow[i]) + continue; + up = isl_upoly_mul(up, + isl_upoly_pow(term->dim->ctx, i, term->pow[i])); + } + + qp = isl_qpolynomial_alloc(isl_dim_copy(term->dim), term->div->n_row, up); + if (!qp) + goto error; + isl_mat_free(qp->div); + qp->div = isl_mat_copy(term->div); + if (!qp->div) + goto error; + + isl_term_free(term); + return qp; +error: + isl_qpolynomial_free(qp); + isl_term_free(term); + return NULL; +} + int isl_pw_qpolynomial_foreach_piece(__isl_keep isl_pw_qpolynomial *pwqp, int (*fn)(__isl_take isl_set *set, __isl_take isl_qpolynomial *qp, void *user), void *user) -- 2.7.4