add isl_pw_qpolynomial_fold_{max,min}
authorSven Verdoolaege <skimo@kotnet.org>
Sat, 3 Apr 2010 08:49:39 +0000 (10:49 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Sat, 3 Apr 2010 17:00:00 +0000 (19:00 +0200)
include/isl_polynomial.h
isl_fold.c
isl_polynomial.c
isl_polynomial_private.h
isl_pw_templ.c

index 8a4a562..4cef47d 100644 (file)
@@ -227,6 +227,11 @@ __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_coalesce(
 __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
index 61a2884..f94ab64 100644 (file)
@@ -590,3 +590,42 @@ size_t isl_pw_qpolynomial_fold_size(__isl_keep isl_pw_qpolynomial_fold *pwf)
 
        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;
+}
index 4a96add..abecc7f 100644 (file)
@@ -2649,8 +2649,8 @@ static int opt_fn(__isl_take isl_point *pnt, void *user)
        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 };
 
@@ -2677,51 +2677,3 @@ error:
        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);
-}
index 8c68221..0209ad0 100644 (file)
@@ -142,6 +142,9 @@ __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add_piece(
        __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(
@@ -149,3 +152,6 @@ __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);
index ea556f6..3ebfb92 100644 (file)
@@ -504,3 +504,48 @@ error:
        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);
+}