From 77db762d5bcd0266848d0a8def7c060335acf495 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Fri, 19 Sep 2008 11:50:36 +0200 Subject: [PATCH] add isl_set_remove_dims --- include/isl_set.h | 4 ++-- isl_convex_hull.c | 18 +----------------- isl_map.c | 33 ++++++++++++++++++++++++++++++--- isl_map_piplib.c | 2 +- isl_map_private.h | 2 ++ 5 files changed, 36 insertions(+), 23 deletions(-) diff --git a/include/isl_set.h b/include/isl_set.h index 1a322a3..37627b0 100644 --- a/include/isl_set.h +++ b/include/isl_set.h @@ -78,8 +78,6 @@ void isl_basic_set_dump(struct isl_basic_set *bset, FILE *out, int indent); struct isl_basic_set *isl_basic_set_swap_vars( struct isl_basic_set *bset, unsigned n); -struct isl_basic_set *isl_basic_set_drop_vars( - struct isl_basic_set *bset, unsigned first, unsigned n); struct isl_basic_set *isl_basic_set_intersect( struct isl_basic_set *bset1, struct isl_basic_set *bset2); @@ -131,6 +129,8 @@ struct isl_set *isl_set_subtract(struct isl_set *set1, struct isl_set *set2); struct isl_set *isl_set_apply(struct isl_set *set, struct isl_map *map); struct isl_set *isl_set_fix_dim_si(struct isl_set *set, unsigned dim, int value); +struct isl_set *isl_set_remove_dims(struct isl_set *set, + unsigned first, unsigned n); void isl_set_dump(struct isl_set *set, FILE *out, int indent); struct isl_set *isl_set_swap_vars(struct isl_set *set, unsigned n); diff --git a/isl_convex_hull.c b/isl_convex_hull.c index cf06434..6dbddf3 100644 --- a/isl_convex_hull.c +++ b/isl_convex_hull.c @@ -818,23 +818,7 @@ error: static struct isl_set *set_project_out(struct isl_ctx *ctx, struct isl_set *set, unsigned n) { - int i; - - set = isl_set_cow(set); - if (!set) - return NULL; - - for (i = 0; i < set->n; ++i) { - set->p[i] = isl_basic_set_eliminate_vars(set->p[i], - set->dim - n, n); - if (!set->p[i]) - goto error; - } - set = isl_set_drop_vars(set, set->dim - n, n); - return set; -error: - isl_set_free(set); - return NULL; + return isl_set_remove_dims(set, set->dim - n, n); } /* If the number of linearly independent bounds we found is smaller diff --git a/isl_map.c b/isl_map.c index 2dae3f1..54eb8ed 100644 --- a/isl_map.c +++ b/isl_map.c @@ -610,7 +610,7 @@ static void constraint_drop_vars(isl_int *c, unsigned n, unsigned rem) isl_seq_clr(c + rem, n); } -struct isl_basic_set *isl_basic_set_drop_vars( +struct isl_basic_set *isl_basic_set_drop_dims( struct isl_basic_set *bset, unsigned first, unsigned n) { int i; @@ -648,7 +648,7 @@ error: return NULL; } -struct isl_set *isl_set_drop_vars( +static struct isl_set *isl_set_drop_dims( struct isl_set *set, unsigned first, unsigned n) { int i; @@ -665,7 +665,7 @@ struct isl_set *isl_set_drop_vars( goto error; for (i = 0; i < set->n; ++i) { - set->p[i] = isl_basic_set_drop_vars(set->p[i], first, n); + set->p[i] = isl_basic_set_drop_dims(set->p[i], first, n); if (!set->p[i]) goto error; } @@ -1222,6 +1222,33 @@ struct isl_basic_set *isl_basic_set_eliminate_vars( (struct isl_basic_map *)bset, pos, n); } +/* Project out n dimensions starting at first using Fourier-Motzkin */ +struct isl_set *isl_set_remove_dims(struct isl_set *set, + unsigned first, unsigned n) +{ + int i; + + if (n == 0) + return set; + + set = isl_set_cow(set); + if (!set) + return NULL; + isl_assert(set->ctx, first+n <= set->dim, goto error); + + for (i = 0; i < set->n; ++i) { + set->p[i] = isl_basic_set_eliminate_vars(set->p[i], + set->nparam + first, n); + if (!set->p[i]) + goto error; + } + set = isl_set_drop_dims(set, first, n); + return set; +error: + isl_set_free(set); + return NULL; +} + /* Elimininate divs based on inequalities */ static struct isl_basic_map *eliminate_divs_ineq( diff --git a/isl_map_piplib.c b/isl_map_piplib.c index 95879ed..062a4b2 100644 --- a/isl_map_piplib.c +++ b/isl_map_piplib.c @@ -215,7 +215,7 @@ static struct isl_map *scan_quast_r(struct scan_data *data, PipQuast *q, /* not interested in rest if no sol */ struct isl_basic_set *bset; bset = isl_basic_set_from_basic_map(isl_basic_map_copy(bmap)); - bset = isl_basic_set_drop_vars(bset, bmap->n_in, bmap->n_out); + bset = isl_basic_set_drop_dims(bset, bmap->n_in, bmap->n_out); if (!bset) goto error; *data->rest = isl_set_add(*data->rest, bset); diff --git a/isl_map_private.h b/isl_map_private.h index 6d7c302..9cf195f 100644 --- a/isl_map_private.h +++ b/isl_map_private.h @@ -41,6 +41,8 @@ struct isl_basic_set *isl_basic_map_underlying_set(struct isl_basic_map *bmap); struct isl_set *isl_map_underlying_set(struct isl_map *map); struct isl_basic_map *isl_basic_map_overlying_set(struct isl_basic_set *bset, struct isl_basic_map *like); +struct isl_basic_set *isl_basic_set_drop_dims( + struct isl_basic_set *bset, unsigned first, unsigned n); struct isl_map *isl_map_remove_empty_parts(struct isl_map *map); struct isl_set *isl_set_remove_empty_parts(struct isl_set *set); -- 2.7.4