From d19b0cd16a1789365fa091555733290ff4b6650d Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Sat, 20 Sep 2008 20:37:27 +0200 Subject: [PATCH] isl_basic_map_affine_hull: allow computation of affine hull of rational sets --- isl_affine_hull.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/isl_affine_hull.c b/isl_affine_hull.c index 038f4cc..ea08d02 100644 --- a/isl_affine_hull.c +++ b/isl_affine_hull.c @@ -11,7 +11,9 @@ struct isl_basic_map *isl_basic_map_implicit_equalities( struct isl_basic_map *bmap) { int i; + int rational; isl_int opt; + isl_int opt_denom; struct isl_ctx *ctx; if (!bmap) @@ -23,10 +25,15 @@ struct isl_basic_map *isl_basic_map_implicit_equalities( return bmap; ctx = bmap->ctx; + rational = F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL); isl_int_init(opt); + isl_int_init(opt_denom); + if (!rational) + isl_int_set_si(opt_denom, 1); for (i = 0; i < bmap->n_ineq; ++i) { enum isl_lp_result res; - res = isl_solve_lp(bmap, 1, bmap->ineq[i]+1, ctx->one, &opt, NULL); + res = isl_solve_lp(bmap, 1, bmap->ineq[i]+1, ctx->one, + &opt, rational ? &opt_denom : NULL); if (res == isl_lp_unbounded) continue; if (res == isl_lp_error) @@ -35,12 +42,15 @@ struct isl_basic_map *isl_basic_map_implicit_equalities( bmap = isl_basic_map_set_to_empty(bmap); break; } + if (!isl_int_is_one(opt_denom)) + continue; isl_int_add(opt, opt, bmap->ineq[i][0]); if (isl_int_is_zero(opt)) { isl_basic_map_inequality_to_equality(bmap, i); --i; } } + isl_int_clear(opt_denom); isl_int_clear(opt); F_SET(bmap, ISL_BASIC_MAP_NO_IMPLICIT); @@ -304,6 +314,12 @@ struct isl_basic_map *isl_basic_map_affine_hull(struct isl_basic_map *bmap) if (bmap->n_ineq == 0) return bmap; + if (F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL)) { + bmap = isl_basic_map_cow(bmap); + isl_basic_map_free_inequality(bmap, bmap->n_ineq); + return bmap; + } + bset = isl_basic_map_underlying_set(isl_basic_map_copy(bmap)); bset = isl_basic_set_remove_equalities(bset, NULL, &T2); -- 2.7.4