add isl_union_map_range_map and isl_union_map_domain_map
authorSven Verdoolaege <skimo@kotnet.org>
Fri, 24 Sep 2010 06:48:24 +0000 (08:48 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Sat, 25 Sep 2010 16:49:47 +0000 (18:49 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl_map.h
include/isl_union_map.h
isl_map.c
isl_union_map.c

index 1356ca8..5f7f3b3 100644 (file)
@@ -1123,6 +1123,20 @@ The followning functions check whether the domain of the given
        __isl_give isl_union_set *isl_union_map_range(
                __isl_take isl_union_map *umap);
 
+       __isl_give isl_basic_map *isl_basic_map_domain_map(
+               __isl_take isl_basic_map *bmap);
+       __isl_give isl_basic_map *isl_basic_map_range_map(
+               __isl_take isl_basic_map *bmap);
+       __isl_give isl_map *isl_map_domain_map(__isl_take isl_map *map);
+       __isl_give isl_map *isl_map_range_map(__isl_take isl_map *map);
+       __isl_give isl_union_map *isl_union_map_domain_map(
+               __isl_take isl_union_map *umap);
+       __isl_give isl_union_map *isl_union_map_range_map(
+               __isl_take isl_union_map *umap);
+
+The functions above construct a (basic, regular or union) relation
+that maps (a wrapped version of) the input relation to its domain or range.
+
 =item * Deltas
 
        __isl_give isl_basic_set *isl_basic_map_deltas(
index c820200..ef7b209 100644 (file)
@@ -189,6 +189,10 @@ __isl_give isl_basic_map *isl_basic_map_affine_hull(
 __isl_give isl_basic_map *isl_basic_map_reverse(__isl_take isl_basic_map *bmap);
 __isl_give isl_basic_set *isl_basic_map_domain(__isl_take isl_basic_map *bmap);
 __isl_give isl_basic_set *isl_basic_map_range(__isl_take isl_basic_map *bmap);
+__isl_give isl_basic_map *isl_basic_map_domain_map(
+       __isl_take isl_basic_map *bmap);
+__isl_give isl_basic_map *isl_basic_map_range_map(
+       __isl_take isl_basic_map *bmap);
 struct isl_basic_map *isl_basic_map_remove(struct isl_basic_map *bmap,
        enum isl_dim_type type, unsigned first, unsigned n);
 struct isl_basic_map *isl_basic_map_from_basic_set(struct isl_basic_set *bset,
@@ -368,6 +372,8 @@ __isl_give isl_map *isl_set_unwrap(__isl_take isl_set *set);
 __isl_give isl_map *isl_map_flatten(__isl_take isl_map *map);
 __isl_give isl_set *isl_map_domain(__isl_take isl_map *bmap);
 __isl_give isl_set *isl_map_range(__isl_take isl_map *map);
+__isl_give isl_map *isl_map_domain_map(__isl_take isl_map *map);
+__isl_give isl_map *isl_map_range_map(__isl_take isl_map *map);
 __isl_give isl_map *isl_map_from_basic_map(__isl_take isl_basic_map *bmap);
 __isl_give isl_map *isl_map_from_domain(__isl_take isl_set *set);
 __isl_give isl_basic_map *isl_basic_map_from_domain(
index 708adab..5956653 100644 (file)
@@ -26,6 +26,10 @@ __isl_give isl_dim *isl_union_map_get_dim(__isl_keep isl_union_map *umap);
 
 __isl_give isl_union_set *isl_union_map_domain(__isl_take isl_union_map *umap);
 __isl_give isl_union_set *isl_union_map_range(__isl_take isl_union_map *umap);
+__isl_give isl_union_map *isl_union_map_domain_map(
+       __isl_take isl_union_map *umap);
+__isl_give isl_union_map *isl_union_map_range_map(
+       __isl_take isl_union_map *umap);
 
 __isl_give isl_union_map *isl_union_map_affine_hull(
        __isl_take isl_union_map *umap);
index c919e9b..cfeb94f 100644 (file)
--- a/isl_map.c
+++ b/isl_map.c
@@ -3634,6 +3634,84 @@ struct isl_basic_set *isl_basic_map_range(struct isl_basic_map *bmap)
        return isl_basic_map_domain(isl_basic_map_reverse(bmap));
 }
 
+__isl_give isl_basic_map *isl_basic_map_domain_map(
+       __isl_take isl_basic_map *bmap)
+{
+       int i, k;
+       isl_dim *dim;
+       isl_basic_map *domain;
+       isl_basic_set *bset;
+       int nparam, n_in, n_out;
+       unsigned total;
+
+       nparam = isl_basic_map_dim(bmap, isl_dim_param);
+       n_in = isl_basic_map_dim(bmap, isl_dim_in);
+       n_out = isl_basic_map_dim(bmap, isl_dim_out);
+
+       dim = isl_dim_from_range(isl_dim_domain(isl_basic_map_get_dim(bmap)));
+       domain = isl_basic_map_universe(dim);
+
+       bmap = isl_basic_map_from_domain(isl_basic_map_wrap(bmap));
+       bmap = isl_basic_map_apply_range(bmap, domain);
+       bmap = isl_basic_map_extend_constraints(bmap, n_in, 0);
+
+       total = isl_basic_map_total_dim(bmap);
+
+       for (i = 0; i < n_in; ++i) {
+               k = isl_basic_map_alloc_equality(bmap);
+               if (k < 0)
+                       goto error;
+               isl_seq_clr(bmap->eq[k], 1 + total);
+               isl_int_set_si(bmap->eq[k][1 + nparam + i], -1);
+               isl_int_set_si(bmap->eq[k][1 + nparam + n_in + n_out + i], 1);
+       }
+
+       bmap = isl_basic_map_gauss(bmap, NULL);
+       return isl_basic_map_finalize(bmap);
+error:
+       isl_basic_map_free(bmap);
+       return NULL;
+}
+
+__isl_give isl_basic_map *isl_basic_map_range_map(
+       __isl_take isl_basic_map *bmap)
+{
+       int i, k;
+       isl_dim *dim;
+       isl_basic_map *range;
+       isl_basic_set *bset;
+       int nparam, n_in, n_out;
+       unsigned total;
+
+       nparam = isl_basic_map_dim(bmap, isl_dim_param);
+       n_in = isl_basic_map_dim(bmap, isl_dim_in);
+       n_out = isl_basic_map_dim(bmap, isl_dim_out);
+
+       dim = isl_dim_from_range(isl_dim_range(isl_basic_map_get_dim(bmap)));
+       range = isl_basic_map_universe(dim);
+
+       bmap = isl_basic_map_from_domain(isl_basic_map_wrap(bmap));
+       bmap = isl_basic_map_apply_range(bmap, range);
+       bmap = isl_basic_map_extend_constraints(bmap, n_out, 0);
+
+       total = isl_basic_map_total_dim(bmap);
+
+       for (i = 0; i < n_out; ++i) {
+               k = isl_basic_map_alloc_equality(bmap);
+               if (k < 0)
+                       goto error;
+               isl_seq_clr(bmap->eq[k], 1 + total);
+               isl_int_set_si(bmap->eq[k][1 + nparam + n_in + i], -1);
+               isl_int_set_si(bmap->eq[k][1 + nparam + n_in + n_out + i], 1);
+       }
+
+       bmap = isl_basic_map_gauss(bmap, NULL);
+       return isl_basic_map_finalize(bmap);
+error:
+       isl_basic_map_free(bmap);
+       return NULL;
+}
+
 struct isl_set *isl_map_range(struct isl_map *map)
 {
        int i;
@@ -3665,6 +3743,60 @@ error:
        return NULL;
 }
 
+__isl_give isl_map *isl_map_domain_map(__isl_take isl_map *map)
+{
+       int i;
+       isl_dim *domain_dim;
+
+       map = isl_map_cow(map);
+       if (!map)
+               return NULL;
+
+       domain_dim = isl_dim_from_range(isl_dim_domain(isl_map_get_dim(map)));
+       map->dim = isl_dim_from_domain(isl_dim_wrap(map->dim));
+       map->dim = isl_dim_join(map->dim, domain_dim);
+       if (!map->dim)
+               goto error;
+       for (i = 0; i < map->n; ++i) {
+               map->p[i] = isl_basic_map_domain_map(map->p[i]);
+               if (!map->p[i])
+                       goto error;
+       }
+       ISL_F_CLR(map, ISL_MAP_DISJOINT);
+       ISL_F_CLR(map, ISL_MAP_NORMALIZED);
+       return map;
+error:
+       isl_map_free(map);
+       return NULL;
+}
+
+__isl_give isl_map *isl_map_range_map(__isl_take isl_map *map)
+{
+       int i;
+       isl_dim *range_dim;
+
+       map = isl_map_cow(map);
+       if (!map)
+               return NULL;
+
+       range_dim = isl_dim_range(isl_map_get_dim(map));
+       map->dim = isl_dim_from_domain(isl_dim_wrap(map->dim));
+       map->dim = isl_dim_join(map->dim, range_dim);
+       if (!map->dim)
+               goto error;
+       for (i = 0; i < map->n; ++i) {
+               map->p[i] = isl_basic_map_range_map(map->p[i]);
+               if (!map->p[i])
+                       goto error;
+       }
+       ISL_F_CLR(map, ISL_MAP_DISJOINT);
+       ISL_F_CLR(map, ISL_MAP_NORMALIZED);
+       return map;
+error:
+       isl_map_free(map);
+       return NULL;
+}
+
 struct isl_map *isl_map_from_set(struct isl_set *set, struct isl_dim *dim)
 {
        int i;
index 46a95a5..ede57f3 100644 (file)
@@ -1004,6 +1004,40 @@ __isl_give isl_union_set *isl_union_map_range(__isl_take isl_union_map *umap)
        return cond_un_op(umap, &range_entry);
 }
 
+static int domain_map_entry(void **entry, void *user)
+{
+       isl_map *map = *entry;
+       isl_union_set **res = user;
+
+       *res = isl_union_map_add_map(*res,
+                                       isl_map_domain_map(isl_map_copy(map)));
+
+       return 0;
+}
+
+__isl_give isl_union_map *isl_union_map_domain_map(
+       __isl_take isl_union_map *umap)
+{
+       return cond_un_op(umap, &domain_map_entry);
+}
+
+static int range_map_entry(void **entry, void *user)
+{
+       isl_map *map = *entry;
+       isl_union_set **res = user;
+
+       *res = isl_union_map_add_map(*res,
+                                       isl_map_range_map(isl_map_copy(map)));
+
+       return 0;
+}
+
+__isl_give isl_union_map *isl_union_map_range_map(
+       __isl_take isl_union_map *umap)
+{
+       return cond_un_op(umap, &range_map_entry);
+}
+
 static int deltas_entry(void **entry, void *user)
 {
        isl_map *map = *entry;