unsigned power);
__isl_give isl_qpolynomial *isl_qpolynomial_add_isl_int(
__isl_take isl_qpolynomial *qp, isl_int v);
+__isl_give isl_qpolynomial *isl_qpolynomial_mul_isl_int(
+ __isl_take isl_qpolynomial *qp, isl_int v);
__isl_give isl_qpolynomial *isl_qpolynomial_insert_dims(
__isl_take isl_qpolynomial *qp, enum isl_dim_type type,
__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_mul(
__isl_take isl_pw_qpolynomial *pwqp1,
__isl_take isl_pw_qpolynomial *pwqp2);
+__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_mul_isl_int(
+ __isl_take isl_pw_qpolynomial *pwqp, isl_int v);
__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_insert_dims(
__isl_take isl_pw_qpolynomial *pwqp, enum isl_dim_type type,
__isl_take isl_qpolynomial_fold *fold1,
__isl_take isl_qpolynomial_fold *fold2);
+__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_mul_isl_int(
+ __isl_take isl_qpolynomial_fold *fold, isl_int v);
+
__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_move_dims(
__isl_take isl_qpolynomial_fold *fold,
enum isl_dim_type dst_type, unsigned dst_pos,
__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_add_disjoint(
__isl_take isl_pw_qpolynomial_fold *pwf1,
__isl_take isl_pw_qpolynomial_fold *pwf2);
+__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_mul_isl_int(
+ __isl_take isl_pw_qpolynomial_fold *pwf, isl_int v);
__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_drop_dims(
__isl_take isl_pw_qpolynomial_fold *pwf,
__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_mul(
__isl_take isl_union_pw_qpolynomial *upwqp1,
__isl_take isl_union_pw_qpolynomial *upwqp2);
+__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_mul_isl_int(
+ __isl_take isl_union_pw_qpolynomial *upwqp, isl_int v);
__isl_give isl_union_set *isl_union_pw_qpolynomial_domain(
__isl_take isl_union_pw_qpolynomial *upwqp);
__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_add_union_pw_qpolynomial(
__isl_take isl_union_pw_qpolynomial_fold *upwf,
__isl_take isl_union_pw_qpolynomial *upwqp);
+__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_mul_isl_int(
+ __isl_take isl_union_pw_qpolynomial_fold *upwf, isl_int v);
__isl_give isl_union_set *isl_union_pw_qpolynomial_fold_domain(
__isl_take isl_union_pw_qpolynomial_fold *upwf);
#include <isl/seq.h>
#include <isl_mat_private.h>
+enum isl_fold isl_fold_type_negate(enum isl_fold type)
+{
+ switch (type) {
+ case isl_fold_min:
+ return isl_fold_max;
+ case isl_fold_max:
+ return isl_fold_min;
+ case isl_fold_list:
+ return isl_fold_list;
+ }
+}
+
static __isl_give isl_qpolynomial_fold *qpolynomial_fold_alloc(
enum isl_fold type, __isl_take isl_dim *dim, int n)
{
isl_reordering_free(r);
return NULL;
}
+
+__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_mul_isl_int(
+ __isl_take isl_qpolynomial_fold *fold, isl_int v)
+{
+ int i;
+
+ if (isl_int_is_one(v))
+ return fold;
+ if (fold && isl_int_is_zero(v)) {
+ isl_qpolynomial_fold *zero;
+ isl_dim *dim = isl_dim_copy(fold->dim);
+ zero = isl_qpolynomial_fold_empty(fold->type, dim);
+ isl_qpolynomial_fold_free(fold);
+ return zero;
+ }
+
+ fold = isl_qpolynomial_fold_cow(fold);
+ if (!fold)
+ return NULL;
+
+ if (isl_int_is_neg(v))
+ fold->type = isl_fold_type_negate(fold->type);
+ for (i = 0; i < fold->n; ++i) {
+ fold->qp[i] = isl_qpolynomial_mul_isl_int(fold->qp[i], v);
+ if (!fold->qp[i])
+ goto error;
+ }
+
+ return fold;
+error:
+ isl_qpolynomial_fold_free(fold);
+ return NULL;
+}
return NULL;
}
-__isl_give struct isl_upoly *isl_upoly_neg_cst(__isl_take struct isl_upoly *up)
+__isl_give struct isl_upoly *isl_upoly_cst_mul_isl_int(
+ __isl_take struct isl_upoly *up, isl_int v)
{
struct isl_upoly_cst *cst;
cst = isl_upoly_as_cst(up);
- isl_int_neg(cst->n, cst->n);
+ isl_int_mul(cst->n, cst->n, v);
return up;
}
-__isl_give struct isl_upoly *isl_upoly_neg(__isl_take struct isl_upoly *up)
+__isl_give struct isl_upoly *isl_upoly_mul_isl_int(
+ __isl_take struct isl_upoly *up, isl_int v)
{
int i;
struct isl_upoly_rec *rec;
return NULL;
if (isl_upoly_is_cst(up))
- return isl_upoly_neg_cst(up);
+ return isl_upoly_cst_mul_isl_int(up, v);
up = isl_upoly_cow(up);
rec = isl_upoly_as_rec(up);
goto error;
for (i = 0; i < rec->n; ++i) {
- rec->p[i] = isl_upoly_neg(rec->p[i]);
+ rec->p[i] = isl_upoly_mul_isl_int(rec->p[i], v);
if (!rec->p[i])
goto error;
}
__isl_give isl_qpolynomial *isl_qpolynomial_neg(__isl_take isl_qpolynomial *qp)
{
- qp = isl_qpolynomial_cow(qp);
+ if (!qp)
+ return NULL;
+
+ return isl_qpolynomial_mul_isl_int(qp, qp->dim->ctx->negone);
+}
+__isl_give isl_qpolynomial *isl_qpolynomial_mul_isl_int(
+ __isl_take isl_qpolynomial *qp, isl_int v)
+{
+ if (isl_int_is_one(v))
+ return qp;
+
+ if (qp && isl_int_is_zero(v)) {
+ isl_qpolynomial *zero;
+ zero = isl_qpolynomial_zero(isl_dim_copy(qp->dim));
+ isl_qpolynomial_free(qp);
+ return zero;
+ }
+
+ qp = isl_qpolynomial_cow(qp);
if (!qp)
return NULL;
- qp->upoly = isl_upoly_neg(qp->upoly);
+ qp->upoly = isl_upoly_mul_isl_int(qp->upoly, v);
if (!qp->upoly)
goto error;
__isl_give struct isl_upoly *isl_upoly_sum(__isl_take struct isl_upoly *up1,
__isl_take struct isl_upoly *up2);
-__isl_give struct isl_upoly *isl_upoly_neg(__isl_take struct isl_upoly *up);
+__isl_give struct isl_upoly *isl_upoly_mul_isl_int(
+ __isl_take struct isl_upoly *up, isl_int v);
__isl_give isl_qpolynomial *isl_qpolynomial_alloc(__isl_take isl_dim *dim,
unsigned n_div, __isl_take struct isl_upoly *up);
__isl_give isl_qpolynomial *isl_qpolynomial_opt_on_domain(
__isl_take isl_qpolynomial *qp, __isl_take isl_set *set, int max);
+enum isl_fold isl_fold_type_negate(enum isl_fold type);
+
__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_cow(
__isl_take isl_qpolynomial_fold *fold);
__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_dup(
FN(PW,free)(pw);
return NULL;
}
+
+__isl_give PW *FN(PW,mul_isl_int)(__isl_take PW *pw, isl_int v)
+{
+ int i;
+
+ if (isl_int_is_one(v))
+ return pw;
+ if (pw && isl_int_is_zero(v)) {
+ PW *zero;
+ isl_dim *dim = FN(PW,get_dim)(pw);
+#ifdef HAS_TYPE
+ zero = FN(PW,zero)(dim, pw->type);
+#else
+ zero = FN(PW,zero)(dim);
+#endif
+ FN(PW,free)(pw);
+ return zero;
+ }
+ pw = FN(PW,cow)(pw);
+ if (!pw)
+ return NULL;
+ if (pw->n == 0)
+ return pw;
+
+#ifdef HAS_TYPE
+ if (isl_int_is_neg(v))
+ pw->type = isl_fold_type_negate(pw->type);
+#endif
+ for (i = 0; i < pw->n; ++i) {
+ pw->p[i].FIELD = FN(EL,mul_isl_int)(pw->p[i].FIELD, v);
+ if (!pw->p[i].FIELD)
+ goto error;
+ }
+
+ return pw;
+error:
+ FN(PW,free)(pw);
+ return NULL;
+}
FN(UNION,free)(u);
return NULL;
}
+
+static int mul_isl_int(void **entry, void *user)
+{
+ PW **pw = (PW **)entry;
+ isl_int *v = user;
+
+ *pw = FN(PW,mul_isl_int)(*pw, *v);
+ if (!*pw)
+ return -1;
+
+ return 0;
+}
+
+__isl_give UNION *FN(UNION,mul_isl_int)(__isl_take UNION *u, isl_int v)
+{
+ if (isl_int_is_one(v))
+ return u;
+
+ if (u && isl_int_is_zero(v)) {
+ UNION *zero;
+ isl_dim *dim = FN(UNION,get_dim)(u);
+#ifdef HAS_TYPE
+ zero = FN(UNION,zero)(dim, u->type);
+#else
+ zero = FN(UNION,zero)(dim);
+#endif
+ FN(UNION,free)(u);
+ return zero;
+ }
+
+ u = FN(UNION,cow)(u);
+ if (!u)
+ return NULL;
+
+#ifdef HAS_TYPE
+ if (isl_int_is_neg(v))
+ u->type = isl_fold_type_negate(u->type);
+#endif
+ if (isl_hash_table_foreach(u->dim->ctx, &u->table, &mul_isl_int, v) < 0)
+ goto error;
+
+ return u;
+error:
+ FN(UNION,free)(u);
+ return NULL;
+}