add isl_qpolynomial_from_constraint
authorSven Verdoolaege <skimo@kotnet.org>
Mon, 3 May 2010 20:03:39 +0000 (22:03 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Thu, 13 May 2010 16:53:54 +0000 (18:53 +0200)
include/isl_polynomial.h
isl_polynomial.c

index 71115fc..a75524d 100644 (file)
@@ -2,6 +2,7 @@
 #define ISL_POLYNOMIAL_H
 
 #include <isl_ctx.h>
+#include <isl_constraint.h>
 #include <isl_dim.h>
 #include <isl_div.h>
 #include <isl_set.h>
@@ -86,6 +87,9 @@ int isl_qpolynomial_foreach_term(__isl_keep isl_qpolynomial *qp,
 __isl_give isl_qpolynomial *isl_qpolynomial_eval(
        __isl_take isl_qpolynomial *qp, __isl_take isl_point *pnt);
 
+__isl_give isl_qpolynomial *isl_qpolynomial_from_constraint(
+       __isl_take isl_constraint *c, enum isl_dim_type type, unsigned pos);
+
 __isl_give isl_printer *isl_printer_print_qpolynomial(
        __isl_take isl_printer *p, __isl_keep isl_qpolynomial *qp);
 void isl_qpolynomial_print(__isl_keep isl_qpolynomial *qp, FILE *out,
index 18c8ea3..0625cce 100644 (file)
@@ -2263,6 +2263,41 @@ __isl_give struct isl_upoly *isl_upoly_from_affine(isl_ctx *ctx, isl_int *f,
        return up;
 }
 
+__isl_give isl_qpolynomial *isl_qpolynomial_from_constraint(
+       __isl_take isl_constraint *c, enum isl_dim_type type, unsigned pos)
+{
+       isl_int denom;
+       isl_dim *dim;
+       struct isl_upoly *up;
+       isl_qpolynomial *qp;
+       int sgn;
+
+       if (!c)
+               return NULL;
+
+       isl_int_init(denom);
+
+       isl_constraint_get_coefficient(c, type, pos, &denom);
+       isl_constraint_set_coefficient(c, type, pos, c->ctx->zero);
+       sgn = isl_int_sgn(denom);
+       isl_int_abs(denom, denom);
+       up = isl_upoly_from_affine(c->ctx, c->line[0], denom,
+                                       1 + isl_constraint_dim(c, isl_dim_all));
+       if (sgn < 0)
+               isl_int_neg(denom, denom);
+       isl_constraint_set_coefficient(c, type, pos, denom);
+
+       dim = isl_dim_copy(c->bmap->dim);
+
+       isl_int_clear(denom);
+       isl_constraint_free(c);
+
+       qp = isl_qpolynomial_alloc(dim, 0, up);
+       if (sgn > 0)
+               qp = isl_qpolynomial_neg(qp);
+       return qp;
+}
+
 __isl_give struct isl_upoly *isl_upoly_subs(__isl_take struct isl_upoly *up,
        unsigned first, unsigned n, __isl_keep struct isl_upoly **subs)
 {