summaryrefslogtreecommitdiff
path: root/basis_reduction_tab.c
diff options
context:
space:
mode:
Diffstat (limited to 'basis_reduction_tab.c')
-rw-r--r--basis_reduction_tab.c39
1 files changed, 31 insertions, 8 deletions
diff --git a/basis_reduction_tab.c b/basis_reduction_tab.c
index cd975485..b42f6773 100644
--- a/basis_reduction_tab.c
+++ b/basis_reduction_tab.c
@@ -45,6 +45,8 @@ struct tab_lp {
#define GBR_denref(a) mpq_denref(a)
#define GBR_floor(a,b) mpz_fdiv_q(a,GBR_numref(b),GBR_denref(b))
#define GBR_ceil(a,b) mpz_cdiv_q(a,GBR_numref(b),GBR_denref(b))
+#define GBR_set_num_neg(a, b) mpz_neg(GBR_numref(*a), b);
+#define GBR_set_den(a, b) mpz_set(GBR_denref(*a), b);
#endif /* USE_GMP_FOR_MP */
#ifdef USE_IMATH_FOR_MP
@@ -58,10 +60,31 @@ struct tab_lp {
#define GBR_mul(a,b,c) mp_rat_mul(b,c,a)
#define GBR_lt(a,b) (mp_rat_compare(a,b) < 0)
#define GBR_is_zero(a) (mp_rat_compare_zero(a) == 0)
-#define GBR_numref(a) mp_rat_numer_ref(a)
-#define GBR_denref(a) mp_rat_denom_ref(a)
-#define GBR_floor(a,b) impz_fdiv_q(a,GBR_numref(b),GBR_denref(b))
-#define GBR_ceil(a,b) impz_cdiv_q(a,GBR_numref(b),GBR_denref(b))
+#ifdef USE_SMALL_INT_OPT
+#define GBR_numref(a) isl_sioimath_encode_big(mp_rat_numer_ref(a))
+#define GBR_denref(a) isl_sioimath_encode_big(mp_rat_denom_ref(a))
+#define GBR_floor(a, b) isl_sioimath_fdiv_q((a), GBR_numref(b), GBR_denref(b))
+#define GBR_ceil(a, b) isl_sioimath_cdiv_q((a), GBR_numref(b), GBR_denref(b))
+#define GBR_set_num_neg(a, b) \
+ do { \
+ isl_sioimath_scratchspace_t scratch; \
+ impz_neg(mp_rat_numer_ref(*a), \
+ isl_sioimath_bigarg_src(*b, &scratch));\
+ } while (0)
+#define GBR_set_den(a, b) \
+ do { \
+ isl_sioimath_scratchspace_t scratch; \
+ impz_set(mp_rat_denom_ref(*a), \
+ isl_sioimath_bigarg_src(*b, &scratch));\
+ } while (0)
+#else /* USE_SMALL_INT_OPT */
+#define GBR_numref(a) mp_rat_numer_ref(a)
+#define GBR_denref(a) mp_rat_denom_ref(a)
+#define GBR_floor(a,b) impz_fdiv_q(a,GBR_numref(b),GBR_denref(b))
+#define GBR_ceil(a,b) impz_cdiv_q(a,GBR_numref(b),GBR_denref(b))
+#define GBR_set_num_neg(a, b) impz_neg(GBR_numref(*a), b)
+#define GBR_set_den(a, b) impz_set(GBR_denref(*a), b)
+#endif /* USE_SMALL_INT_OPT */
#endif /* USE_IMATH_FOR_MP */
static struct tab_lp *init_lp(struct isl_tab *tab);
@@ -222,8 +245,8 @@ static int cut_lp_to_hyperplane(struct tab_lp *lp, isl_int *row)
static void get_obj_val(struct tab_lp* lp, GBR_type *F)
{
- isl_int_neg(GBR_numref(*F), lp->opt);
- isl_int_set(GBR_denref(*F), lp->opt_denom);
+ GBR_set_num_neg(F, lp->opt);
+ GBR_set_den(F, lp->opt_denom);
}
static void delete_lp(struct tab_lp *lp)
@@ -259,8 +282,8 @@ static int add_lp_row(struct tab_lp *lp, isl_int *row, int dim)
static void get_alpha(struct tab_lp* lp, int row, GBR_type *alpha)
{
row += lp->con_offset;
- isl_int_neg(GBR_numref(*alpha), lp->tab->dual->el[1 + row]);
- isl_int_set(GBR_denref(*alpha), lp->tab->dual->el[0]);
+ GBR_set_num_neg(alpha, lp->tab->dual->el[1 + row]);
+ GBR_set_den(alpha, lp->tab->dual->el[0]);
}
static int del_lp_row(struct tab_lp *lp)