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);
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);
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
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;
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;
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;
}
(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(
/* 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);
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);