__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_gist(
__isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_set *context);
+__isl_give isl_qpolynomial *isl_pw_qpolynomial_fold_max(
+ __isl_take isl_pw_qpolynomial_fold *pwf);
+__isl_give isl_qpolynomial *isl_pw_qpolynomial_fold_min(
+ __isl_take isl_pw_qpolynomial_fold *pwf);
+
#if defined(__cplusplus)
}
#endif
return n;
}
+
+__isl_give isl_qpolynomial *isl_qpolynomial_fold_opt_on_domain(
+ __isl_take isl_qpolynomial_fold *fold, __isl_take isl_set *set, int max)
+{
+ int i;
+ isl_qpolynomial *opt;
+
+ if (!set || !fold)
+ goto error;
+
+ if (fold->n == 0) {
+ isl_dim *dim = isl_dim_copy(fold->dim);
+ isl_set_free(set);
+ isl_qpolynomial_fold_free(fold);
+ return isl_qpolynomial_zero(dim);
+ }
+
+ opt = isl_qpolynomial_opt_on_domain(isl_qpolynomial_copy(fold->qp[i]),
+ isl_set_copy(set), max);
+ for (i = 1; i < fold->n; ++i) {
+ isl_qpolynomial *opt_i;
+ opt_i = isl_qpolynomial_opt_on_domain(
+ isl_qpolynomial_copy(fold->qp[i]),
+ isl_set_copy(set), max);
+ if (max)
+ opt = isl_qpolynomial_max_cst(opt, opt_i);
+ else
+ opt = isl_qpolynomial_min_cst(opt, opt_i);
+ }
+
+ isl_set_free(set);
+ isl_qpolynomial_fold_free(fold);
+
+ return opt;
+error:
+ isl_set_free(set);
+ isl_qpolynomial_fold_free(fold);
+ return NULL;
+}
return 0;
}
-static __isl_give isl_qpolynomial *guarded_qpolynomial_opt(
- __isl_take isl_set *set, __isl_take isl_qpolynomial *qp, int max)
+__isl_give isl_qpolynomial *isl_qpolynomial_opt_on_domain(
+ __isl_take isl_qpolynomial *qp, __isl_take isl_set *set, int max)
{
struct isl_opt_data data = { NULL, 1, NULL, max };
isl_qpolynomial_free(data.opt);
return NULL;
}
-
-/* Compute the maximal value attained by the piecewise quasipolynomial
- * on its domain or zero if the domain is empty.
- * In the worst case, the domain is scanned completely,
- * so the domain is assumed to be bounded.
- */
-__isl_give isl_qpolynomial *isl_pw_qpolynomial_opt(
- __isl_take isl_pw_qpolynomial *pwqp, int max)
-{
- int i;
- isl_qpolynomial *opt;
-
- if (!pwqp)
- return NULL;
-
- if (pwqp->n == 0) {
- isl_dim *dim = isl_dim_copy(pwqp->dim);
- isl_pw_qpolynomial_free(pwqp);
- return isl_qpolynomial_zero(dim);
- }
-
- opt = guarded_qpolynomial_opt(isl_set_copy(pwqp->p[0].set),
- isl_qpolynomial_copy(pwqp->p[0].qp), max);
- for (i = 1; i < pwqp->n; ++i) {
- isl_qpolynomial *opt_i;
- opt_i = guarded_qpolynomial_opt(isl_set_copy(pwqp->p[i].set),
- isl_qpolynomial_copy(pwqp->p[i].qp), max);
- if (max)
- opt = isl_qpolynomial_max_cst(opt, opt_i);
- else
- opt = isl_qpolynomial_min_cst(opt, opt_i);
- }
-
- isl_pw_qpolynomial_free(pwqp);
- return opt;
-}
-
-__isl_give isl_qpolynomial *isl_pw_qpolynomial_max(
- __isl_take isl_pw_qpolynomial *pwqp)
-{
- return isl_pw_qpolynomial_opt(pwqp, 1);
-}
-
-__isl_give isl_qpolynomial *isl_pw_qpolynomial_min(
- __isl_take isl_pw_qpolynomial *pwqp)
-{
- return isl_pw_qpolynomial_opt(pwqp, 0);
-}
__isl_take isl_set *set, __isl_take isl_qpolynomial *qp);
int isl_pw_qpolynomial_is_one(__isl_keep isl_pw_qpolynomial *pwqp);
+__isl_give isl_qpolynomial *isl_qpolynomial_opt_on_domain(
+ __isl_take isl_qpolynomial *qp, __isl_take isl_set *set, int max);
+
__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_cow(
__isl_take isl_qpolynomial_fold *fold);
__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_dup(
__isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_cow(
__isl_take isl_pw_qpolynomial_fold *pwf);
+
+__isl_give isl_qpolynomial *isl_qpolynomial_fold_opt_on_domain(
+ __isl_take isl_qpolynomial_fold *fold, __isl_take isl_set *set, int max);
FN(PW,free)(pw);
return NULL;
}
+
+/* Compute the maximal value attained by the piecewise quasipolynomial
+ * on its domain or zero if the domain is empty.
+ * In the worst case, the domain is scanned completely,
+ * so the domain is assumed to be bounded.
+ */
+__isl_give isl_qpolynomial *FN(PW,opt)(__isl_take PW *pw, int max)
+{
+ int i;
+ isl_qpolynomial *opt;
+
+ if (!pw)
+ return NULL;
+
+ if (pw->n == 0) {
+ isl_dim *dim = isl_dim_copy(pw->dim);
+ FN(PW,free)(pw);
+ return isl_qpolynomial_zero(dim);
+ }
+
+ opt = FN(EL,opt_on_domain)(FN(EL,copy)(pw->p[0].FIELD),
+ isl_set_copy(pw->p[0].set), max);
+ for (i = 1; i < pw->n; ++i) {
+ isl_qpolynomial *opt_i;
+ opt_i = FN(EL,opt_on_domain)(FN(EL,copy)(pw->p[i].FIELD),
+ isl_set_copy(pw->p[i].set), max);
+ if (max)
+ opt = isl_qpolynomial_max_cst(opt, opt_i);
+ else
+ opt = isl_qpolynomial_min_cst(opt, opt_i);
+ }
+
+ FN(PW,free)(pw);
+ return opt;
+}
+
+__isl_give isl_qpolynomial *FN(PW,max)(__isl_take PW *pw)
+{
+ return FN(PW,opt)(pw, 1);
+}
+
+__isl_give isl_qpolynomial *FN(PW,min)(__isl_take PW *pw)
+{
+ return FN(PW,opt)(pw, 0);
+}