enum isl_fold type, __isl_take isl_pw_qpolynomial *pwqp);
__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_alloc(
+ enum isl_fold type,
__isl_take isl_set *set, __isl_take isl_qpolynomial_fold *fold);
__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_copy(
__isl_keep isl_pw_qpolynomial_fold *pwf);
size_t isl_pw_qpolynomial_fold_size(__isl_keep isl_pw_qpolynomial_fold *pwf);
__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_zero(
- __isl_take isl_dim *dim);
+ __isl_take isl_dim *dim, enum isl_fold type);
__isl_give isl_set *isl_pw_qpolynomial_fold_domain(
__isl_take isl_pw_qpolynomial_fold *pwf);
__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_from_pw_qpolynomial_fold(__isl_take isl_pw_qpolynomial_fold *pwf);
__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_zero(
- __isl_take isl_dim *dim);
+ __isl_take isl_dim *dim, enum isl_fold type);
__isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_fold_pw_qpolynomial_fold(
__isl_take isl_union_pw_qpolynomial_fold *upwqp,
__isl_take isl_pw_qpolynomial_fold *pwqp);
data->fold_tight = isl_qpolynomial_fold_empty(data->type, dim_param);
extract_coefficients(poly, dom, data);
- pwf = isl_pw_qpolynomial_fold_alloc(isl_set_copy(dom), data->fold);
+ pwf = isl_pw_qpolynomial_fold_alloc(data->type, isl_set_copy(dom),
+ data->fold);
data->pwf = isl_pw_qpolynomial_fold_fold(data->pwf, pwf);
- pwf = isl_pw_qpolynomial_fold_alloc(dom, data->fold_tight);
+ pwf = isl_pw_qpolynomial_fold_alloc(data->type, dom, data->fold_tight);
data->pwf_tight = isl_pw_qpolynomial_fold_fold(data->pwf_tight, pwf);
isl_qpolynomial_free(poly);
dom = isl_set_from_basic_set(bset);
if (tight)
*tight = 1;
- return isl_pw_qpolynomial_fold_alloc(dom, fold);
+ return isl_pw_qpolynomial_fold_alloc(data->type, dom, fold);
}
if (isl_qpolynomial_is_zero(poly)) {
isl_qpolynomial_fold *fold;
fold = isl_qpolynomial_fold_alloc(data->type, poly);
dom = isl_set_from_basic_set(bset);
- pwf = isl_pw_qpolynomial_fold_alloc(dom, fold);
+ pwf = isl_pw_qpolynomial_fold_alloc(data->type, dom, fold);
if (tight)
*tight = 1;
return isl_pw_qpolynomial_fold_drop_dims(pwf,
dim = isl_basic_set_get_dim(bset);
dim = isl_dim_drop(dim, isl_dim_set, 0, nvar);
- data->pwf = isl_pw_qpolynomial_fold_zero(isl_dim_copy(dim));
- data->pwf_tight = isl_pw_qpolynomial_fold_zero(dim);
+ data->pwf = isl_pw_qpolynomial_fold_zero(isl_dim_copy(dim), data->type);
+ data->pwf_tight = isl_pw_qpolynomial_fold_zero(dim, data->type);
data->poly = isl_qpolynomial_homogenize(isl_qpolynomial_copy(poly));
vertices = isl_basic_set_compute_vertices(bset);
isl_vertices_foreach_disjoint_cell(vertices,
top_pwf = bound->pwf;
top_pwf_tight = bound->pwf_tight;
- bound->pwf = isl_pw_qpolynomial_fold_zero(isl_dim_copy(dim));
- bound->pwf_tight = isl_pw_qpolynomial_fold_zero(dim);
+ bound->pwf = isl_pw_qpolynomial_fold_zero(isl_dim_copy(dim),
+ bound->type);
+ bound->pwf_tight = isl_pw_qpolynomial_fold_zero(dim, bound->type);
r = compressed_guarded_poly_bound(bset, poly, user);
top_pwf = bound->pwf;
top_pwf_tight = bound->pwf_tight;
- bound->pwf = isl_pw_qpolynomial_fold_zero(isl_dim_copy(dim));
- bound->pwf_tight = isl_pw_qpolynomial_fold_zero(dim);
+ bound->pwf = isl_pw_qpolynomial_fold_zero(isl_dim_copy(dim),
+ bound->type);
+ bound->pwf_tight = isl_pw_qpolynomial_fold_zero(dim, bound->type);
r = unwrapped_guarded_poly_bound(bset, poly, user);
dim = isl_dim_drop(dim, isl_dim_set, 0, nvar);
if (tight)
*tight = 1;
- return isl_pw_qpolynomial_fold_zero(dim);
+ return isl_pw_qpolynomial_fold_zero(dim, pwf->type);
}
if (nvar == 0) {
} else
dim = isl_dim_drop(dim, isl_dim_set, 0, nvar);
- bound.pwf = isl_pw_qpolynomial_fold_zero(isl_dim_copy(dim));
- bound.pwf_tight = isl_pw_qpolynomial_fold_zero(isl_dim_copy(dim));
+ bound.pwf = isl_pw_qpolynomial_fold_zero(isl_dim_copy(dim), pwf->type);
+ bound.pwf_tight = isl_pw_qpolynomial_fold_zero(isl_dim_copy(dim),
+ pwf->type);
bound.check_tight = !!tight;
if (isl_pw_qpolynomial_fold_foreach_lifted_piece(pwf,
data.tight = 0;
dim = isl_union_pw_qpolynomial_get_dim(upwqp);
- data.res = isl_union_pw_qpolynomial_fold_zero(dim);
+ data.res = isl_union_pw_qpolynomial_fold_zero(dim, type);
if (isl_union_pw_qpolynomial_foreach_pw_qpolynomial(upwqp,
&bound_pw, &data) < 0)
goto error;
return NULL;
}
+#define HAS_TYPE
+
#undef PW
#define PW isl_pw_qpolynomial_fold
#undef EL
return pw1;
}
+ if (pw1->type != pw2->type)
+ isl_die(set->ctx, isl_error_invalid, "fold types don't match",
+ goto error);
+
n = (pw1->n + 1) * (pw2->n + 1);
- res = isl_pw_qpolynomial_fold_alloc_(isl_dim_copy(pw1->dim), n);
+ res = isl_pw_qpolynomial_fold_alloc_(isl_dim_copy(pw1->dim),
+ pw1->type, n);
for (i = 0; i < pw1->n; ++i) {
set = isl_set_copy(pw1->p[i].set);
if (!pwqp)
return NULL;
- pwf = isl_pw_qpolynomial_fold_alloc_(isl_dim_copy(pwqp->dim), pwqp->n);
+ pwf = isl_pw_qpolynomial_fold_alloc_(isl_dim_copy(pwqp->dim), type,
+ pwqp->n);
for (i = 0; i < pwqp->n; ++i)
pwf = isl_pw_qpolynomial_fold_add_piece(pwf,
map = read_optional_disjuncts(s, bmap, v);
set = isl_map_range(map);
- pwf = isl_pw_qpolynomial_fold_alloc(set, fold);
+ pwf = isl_pw_qpolynomial_fold_alloc(isl_fold_max, set, fold);
vars_drop(v, v->n - n);
struct isl_pw_qpolynomial_fold {
int ref;
+ enum isl_fold type;
struct isl_dim *dim;
int n;
#define xS(TYPE,NAME) struct TYPE ## _ ## NAME
#define S(TYPE,NAME) xS(TYPE,NAME)
+#ifdef HAS_TYPE
+static __isl_give PW *FN(PW,alloc_)(__isl_take isl_dim *dim,
+ enum isl_fold type, int n)
+#else
static __isl_give PW *FN(PW,alloc_)(__isl_take isl_dim *dim, int n)
+#endif
{
struct PW *pw;
goto error;
pw->ref = 1;
+#ifdef HAS_TYPE
+ pw->type = type;
+#endif
pw->size = n;
pw->n = 0;
pw->dim = dim;
return NULL;
}
+#ifdef HAS_TYPE
+__isl_give PW *FN(PW,zero)(__isl_take isl_dim *dim, enum isl_fold type)
+{
+ return FN(PW,alloc_)(dim, type, 0);
+}
+#else
__isl_give PW *FN(PW,zero)(__isl_take isl_dim *dim)
{
return FN(PW,alloc_)(dim, 0);
}
+#endif
__isl_give PW *FN(PW,add_piece)(__isl_take PW *pw,
__isl_take isl_set *set, __isl_take EL *el)
return pw;
}
+#ifdef HAS_TYPE
+ if (pw->type != el->type)
+ isl_die(set->ctx, isl_error_invalid, "fold types don't match",
+ goto error);
+#endif
isl_assert(set->ctx, isl_dim_equal(pw->dim, el->dim), goto error);
isl_assert(set->ctx, pw->n < pw->size, goto error);
return NULL;
}
+#ifdef HAS_TYPE
+__isl_give PW *FN(PW,alloc)(enum isl_fold type,
+ __isl_take isl_set *set, __isl_take EL *el)
+#else
__isl_give PW *FN(PW,alloc)(__isl_take isl_set *set, __isl_take EL *el)
+#endif
{
PW *pw;
if (!set || !el)
goto error;
+#ifdef HAS_TYPE
+ pw = FN(PW,alloc_)(isl_set_get_dim(set), type, 1);
+#else
pw = FN(PW,alloc_)(isl_set_get_dim(set), 1);
+#endif
return FN(PW,add_piece)(pw, set, el);
error:
if (!pw)
return NULL;
+#ifdef HAS_TYPE
+ dup = FN(PW,alloc_)(isl_dim_copy(pw->dim), pw->type, pw->n);
+#else
dup = FN(PW,alloc_)(isl_dim_copy(pw->dim), pw->n);
+#endif
if (!dup)
return NULL;
if (!pw1 || !pw2)
goto error;
+#ifdef HAS_TYPE
+ if (pw1->type != pw2->type)
+ isl_die(pw1->dim->ctx, isl_error_invalid,
+ "fold types don't match", goto error);
+#endif
isl_assert(pw1->dim->ctx, isl_dim_equal(pw1->dim, pw2->dim), goto error);
if (FN(PW,is_zero)(pw1)) {
}
n = (pw1->n + 1) * (pw2->n + 1);
+#ifdef HAS_TYPE
+ res = FN(PW,alloc_)(isl_dim_copy(pw1->dim), pw1->type, n);
+#else
res = FN(PW,alloc_)(isl_dim_copy(pw1->dim), n);
+#endif
for (i = 0; i < pw1->n; ++i) {
set = isl_set_copy(pw1->p[i].set);
if (!pw1 || !pw2)
goto error;
+#ifdef HAS_TYPE
+ if (pw1->type != pw2->type)
+ isl_die(pw1->dim->ctx, isl_error_invalid,
+ "fold types don't match", goto error);
+#endif
isl_assert(pw1->dim->ctx, isl_dim_equal(pw1->dim, pw2->dim), goto error);
if (FN(PW,is_zero)(pw1)) {
return pw1;
}
+#ifdef HAS_TYPE
+ res = FN(PW,alloc_)(isl_dim_copy(pw1->dim), pw1->type, pw1->n + pw2->n);
+#else
res = FN(PW,alloc_)(isl_dim_copy(pw1->dim), pw1->n + pw2->n);
+#endif
for (i = 0; i < pw1->n; ++i)
res = FN(PW,add_piece)(res,
isl_dim *dim;
isl_qpolynomial *opt;
int r;
+ enum isl_fold type;
nparam = isl_basic_set_dim(bset, isl_dim_param);
nvar = isl_basic_set_dim(bset, isl_dim_set);
data_m.test_monotonicity = 0;
data_m.signs = signs;
- data_m.pwf = isl_pw_qpolynomial_fold_zero(dim);
data_m.sign = -sign;
+ type = data_m.sign < 0 ? isl_fold_min : isl_fold_max;
+ data_m.pwf = isl_pw_qpolynomial_fold_zero(dim, type);
data_m.tight = 0;
data_m.pwf_tight = NULL;
fold = isl_qpolynomial_fold_alloc(type, poly);
set = isl_set_from_basic_set(bset);
- pwf = isl_pw_qpolynomial_fold_alloc(set, fold);
+ pwf = isl_pw_qpolynomial_fold_alloc(type, set, fold);
if (data->tight)
data->pwf_tight = isl_pw_qpolynomial_fold_fold(
data->pwf_tight, pwf);
struct UNION {
int ref;
+#ifdef HAS_TYPE
+ enum isl_fold type;
+#endif
isl_dim *dim;
struct isl_hash_table table;
return isl_dim_copy(u->dim);
}
+#ifdef HAS_TYPE
+static __isl_give UNION *FN(UNION,alloc)(__isl_take isl_dim *dim,
+ enum isl_fold type, int size)
+#else
static __isl_give UNION *FN(UNION,alloc)(__isl_take isl_dim *dim, int size)
+#endif
{
UNION *u;
return NULL;
u->ref = 1;
+#ifdef HAS_TYPE
+ u->type = type;
+#endif
u->dim = dim;
if (isl_hash_table_init(dim->ctx, &u->table, size) < 0)
goto error;
return NULL;
}
+#ifdef HAS_TYPE
+__isl_give UNION *FN(UNION,zero)(__isl_take isl_dim *dim, enum isl_fold type)
+{
+ return FN(UNION,alloc)(dim, type, 16);
+}
+#else
__isl_give UNION *FN(UNION,zero)(__isl_take isl_dim *dim)
{
return FN(UNION,alloc)(dim, 16);
}
+#endif
__isl_give UNION *FN(UNION,copy)(__isl_keep UNION *u)
{
if (!u)
return NULL;
+#ifdef HAS_TYPE
+ dup = FN(UNION,zero)(isl_dim_copy(u->dim), u->type);
+#else
dup = FN(UNION,zero)(isl_dim_copy(u->dim));
+#endif
if (FN(FN(UNION,foreach),PARTS)(u, &add_part, &dup) < 0)
goto error;
return dup;
dim = FN(PART,get_dim)(part);
dim = isl_dim_drop(dim, isl_dim_in, 0, isl_dim_size(dim, isl_dim_in));
dim = isl_dim_drop(dim, isl_dim_out, 0, isl_dim_size(dim, isl_dim_out));
+#ifdef HAS_TYPE
+ u = FN(UNION,zero)(dim, part->type);
+#else
u = FN(UNION,zero)(dim);
+#endif
u = FN(FN(UNION,add),PARTS)(u, part);
return u;
if (!u1 || !u2)
goto error;
+#ifdef HAS_TYPE
+ data.res = FN(UNION,alloc)(isl_dim_copy(u1->dim), u1->type, u1->table.n);
+#else
data.res = FN(UNION,alloc)(isl_dim_copy(u1->dim), u1->table.n);
+#endif
if (isl_hash_table_foreach(u1->dim->ctx, &u1->table, fn, &data) < 0)
goto error;
if (!u || !uset)
goto error;
+#ifdef HAS_TYPE
+ data.res = FN(UNION,alloc)(isl_dim_copy(u->dim), u->type, u->table.n);
+#else
data.res = FN(UNION,alloc)(isl_dim_copy(u->dim), u->table.n);
+#endif
if (isl_hash_table_foreach(u->dim->ctx, &u->table,
&match_set_entry, &data) < 0)
goto error;