add isl_set_remove_dims
authorSven Verdoolaege <skimo@kotnet.org>
Fri, 19 Sep 2008 09:50:36 +0000 (11:50 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Sat, 11 Oct 2008 21:39:21 +0000 (23:39 +0200)
include/isl_set.h
isl_convex_hull.c
isl_map.c
isl_map_piplib.c
isl_map_private.h

index 1a322a3..37627b0 100644 (file)
@@ -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);
index cf06434..6dbddf3 100644 (file)
@@ -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
index 2dae3f1..54eb8ed 100644 (file)
--- 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(
index 95879ed..062a4b2 100644 (file)
@@ -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);
index 6d7c302..9cf195f 100644 (file)
@@ -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);