-#include <isl_constraint.h>
-#include <isl_set.h>
+#include <isl/constraint.h>
+#include <isl/set.h>
+#include <isl_map_private.h>
#include <isl_polynomial_private.h>
#include <isl_morph.h>
#include <isl_range.h>
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;
/* Add term "term" to data->poly if it has sign data->sign.
* The sign is determined based on the signs of the parameters
- * and variables in data->signs.
+ * and variables in data->signs. The integer divisions, if
+ * any, are assumed to be non-negative.
*/
static int collect_fixed_sign_terms(__isl_take isl_term *term, void *user)
{
struct isl_fixed_sign_data *data = (struct isl_fixed_sign_data *)user;
- isl_int n, d;
+ isl_int n;
int i;
int sign;
unsigned nparam;
nparam = isl_term_dim(term, isl_dim_param);
nvar = isl_term_dim(term, isl_dim_set);
- isl_assert(isl_term_get_ctx(term), isl_term_dim(term, isl_dim_div) == 0,
- return -1);
-
isl_int_init(n);
- isl_int_init(d);
isl_term_get_num(term, &n);
- isl_term_get_den(term, &d);
sign = isl_int_sgn(n);
for (i = 0; i < nparam; ++i) {
isl_term_free(term);
isl_int_clear(n);
- isl_int_clear(d);
return 0;
}
/* Construct and return a polynomial that consists of the terms
- * in "poly" that have sign "sign".
+ * in "poly" that have sign "sign". The integer divisions, if
+ * any, are assumed to be non-negative.
*/
-static __isl_give isl_qpolynomial *fixed_sign_terms(
+__isl_give isl_qpolynomial *isl_qpolynomial_terms_of_sign(
__isl_keep isl_qpolynomial *poly, int *signs, int sign)
{
struct isl_fixed_sign_data data = { signs, sign };
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);
u = bound2poly(upper, isl_dim_copy(dim), nvar, 1);
l = bound2poly(lower, dim, nvar, -1);
- pos = fixed_sign_terms(data->poly, data->signs, sign);
- neg = fixed_sign_terms(data->poly, data->signs, -sign);
+ pos = isl_qpolynomial_terms_of_sign(data->poly, data->signs, sign);
+ neg = isl_qpolynomial_terms_of_sign(data->poly, data->signs, -sign);
pos = isl_qpolynomial_substitute(pos, isl_dim_set, nvar, 1, &u);
neg = isl_qpolynomial_substitute(neg, isl_dim_set, nvar, 1, &l);