From f97d2c48220f1bef36425003f62549372c6c737e Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Wed, 10 Apr 2013 12:19:59 +0200 Subject: [PATCH] polysign_isl.c: isl_constraints_opt: use isl_val Signed-off-by: Sven Verdoolaege --- polysign_isl.c | 58 ++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/polysign_isl.c b/polysign_isl.c index 2948d6b..1ea1fb0 100644 --- a/polysign_isl.c +++ b/polysign_isl.c @@ -4,14 +4,6 @@ #include #include "polysign.h" -static void values2isl(Value *src, isl_int *dst, int len) -{ - int i; - - for (i = 0; i < len; ++i) - isl_int_set_gmp(dst[i], src[i]); -} - static __isl_give isl_mat *extract_equalities(isl_ctx *ctx, Matrix *M) { int i, j; @@ -141,36 +133,50 @@ static enum lp_result isl_lp_result2lp_result(enum isl_lp_result res) enum lp_result isl_constraints_opt(Matrix *C, Value *obj, Value denom, enum lp_dir dir, Value *opt) { + int i; isl_ctx *ctx = isl_ctx_alloc(); isl_space *dim; + isl_local_space *ls; isl_mat *eq, *ineq; isl_basic_set *bset; - isl_int isl_denom, isl_opt; - isl_vec *aff; + isl_aff *aff; + isl_val *v; enum isl_lp_result res; int max = dir == lp_max; - isl_int_init(isl_denom); - isl_int_init(isl_opt); - eq = extract_equalities(ctx, C); ineq = extract_inequalities(ctx, C); dim = isl_space_set_alloc(ctx, 0, C->NbColumns - 2); + ls = isl_local_space_from_space(isl_space_copy(dim)); bset = isl_basic_set_from_constraint_matrices(dim, eq, ineq, isl_dim_set, isl_dim_div, isl_dim_param, isl_dim_cst); - aff = isl_vec_alloc(ctx, C->NbColumns - 1); - assert(aff); - values2isl(obj, aff->el + 1, aff->size - 1); - values2isl(obj + aff->size - 1, aff->el, 1); - isl_int_set_gmp(isl_denom, denom); - - res = isl_basic_set_solve_lp(bset, max, aff->el, isl_denom, &isl_opt, - NULL, NULL); - isl_int_get_gmp(isl_opt, *opt); - - isl_vec_free(aff); - isl_int_clear(isl_denom); - isl_int_clear(isl_opt); + aff = isl_aff_zero_on_domain(ls); + for (i = 0; i < C->NbColumns - 2; ++i) { + v = isl_val_int_from_gmp(ctx, obj[i]); + aff = isl_aff_set_coefficient_val(aff, isl_dim_in, i, v); + } + v = isl_val_int_from_gmp(ctx, obj[C->NbColumns - 2]); + aff = isl_aff_set_constant_val(aff, v); + v = isl_val_int_from_gmp(ctx, denom); + aff = isl_aff_scale_down_val(aff, v); + + if (max) + v = isl_val_floor(isl_basic_set_max_lp_val(bset, aff)); + else + v = isl_val_ceil(isl_basic_set_min_lp_val(bset, aff)); + if (!v) + res = isl_lp_error; + else if (isl_val_is_nan(v)) + res = isl_lp_empty; + else if (!isl_val_is_rat(v)) + res = isl_lp_unbounded; + else { + res = isl_lp_ok; + isl_val_get_num_gmp(v, *opt); + } + + isl_val_free(v); + isl_aff_free(aff); isl_basic_set_free(bset); isl_ctx_free(ctx); -- 2.11.4.GIT