polysign_isl.c: isl_constraints_opt: use isl_val
authorSven Verdoolaege <skimo@kotnet.org>
Wed, 10 Apr 2013 10:19:59 +0000 (10 12:19 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Fri, 31 May 2013 08:53:20 +0000 (31 10:53 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
polysign_isl.c

index 2948d6b..1ea1fb0 100644 (file)
@@ -4,14 +4,6 @@
 #include <isl_set_polylib.h>
 #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);