add isl_map_flat_domain_product
authorSven Verdoolaege <skimo@kotnet.org>
Tue, 9 Aug 2011 20:37:52 +0000 (22:37 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Sat, 3 Sep 2011 10:04:54 +0000 (12:04 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl/map.h
include/isl/space.h
isl_map.c
isl_space.c
isl_space_private.h

index 3d9a007..45e6a98 100644 (file)
@@ -1942,10 +1942,14 @@ then the name of the space is also removed.
                __isl_take isl_basic_set *bset);
        __isl_give isl_set *isl_set_flatten(
                __isl_take isl_set *set);
+       __isl_give isl_basic_map *isl_basic_map_flatten_domain(
+               __isl_take isl_basic_map *bmap);
        __isl_give isl_basic_map *isl_basic_map_flatten_range(
                __isl_take isl_basic_map *bmap);
        __isl_give isl_map *isl_map_flatten_range(
                __isl_take isl_map *map);
+       __isl_give isl_map *isl_map_flatten_domain(
+               __isl_take isl_map *map);
        __isl_give isl_basic_map *isl_basic_map_flatten(
                __isl_take isl_basic_map *bmap);
        __isl_give isl_map *isl_map_flatten(
@@ -2151,9 +2155,15 @@ the same (number of) parameters.
        __isl_give isl_union_set *isl_union_set_product(
                __isl_take isl_union_set *uset1,
                __isl_take isl_union_set *uset2);
+       __isl_give isl_basic_map *isl_basic_map_domain_product(
+               __isl_take isl_basic_map *bmap1,
+               __isl_take isl_basic_map *bmap2);
        __isl_give isl_basic_map *isl_basic_map_range_product(
                __isl_take isl_basic_map *bmap1,
                __isl_take isl_basic_map *bmap2);
+       __isl_give isl_map *isl_map_domain_product(
+               __isl_take isl_map *map1,
+               __isl_take isl_map *map2);
        __isl_give isl_map *isl_map_range_product(
                __isl_take isl_map *map1,
                __isl_take isl_map *map2);
@@ -2182,6 +2192,9 @@ instead.
        __isl_give isl_basic_map *isl_basic_map_flat_range_product(
                __isl_take isl_basic_map *bmap1,
                __isl_take isl_basic_map *bmap2);
+       __isl_give isl_map *isl_map_flat_domain_product(
+               __isl_take isl_map *map1,
+               __isl_take isl_map *map2);
        __isl_give isl_map *isl_map_flat_range_product(
                __isl_take isl_map *map1,
                __isl_take isl_map *map2);
index 179427f..84db68a 100644 (file)
@@ -301,8 +301,12 @@ __isl_give isl_map *isl_map_apply_range(
                __isl_take isl_map *map2);
 __isl_give isl_map *isl_map_product(__isl_take isl_map *map1,
        __isl_take isl_map *map2);
+__isl_give isl_basic_map *isl_basic_map_domain_product(
+       __isl_take isl_basic_map *bmap1, __isl_take isl_basic_map *bmap2);
 __isl_give isl_basic_map *isl_basic_map_range_product(
        __isl_take isl_basic_map *bmap1, __isl_take isl_basic_map *bmap2);
+__isl_give isl_map *isl_map_domain_product(__isl_take isl_map *map1,
+       __isl_take isl_map *map2);
 __isl_give isl_map *isl_map_range_product(__isl_take isl_map *map1,
        __isl_take isl_map *map2);
 __isl_give isl_basic_map *isl_basic_map_flat_product(
@@ -311,6 +315,8 @@ __isl_give isl_map *isl_map_flat_product(__isl_take isl_map *map1,
        __isl_take isl_map *map2);
 __isl_give isl_basic_map *isl_basic_map_flat_range_product(
        __isl_take isl_basic_map *bmap1, __isl_take isl_basic_map *bmap2);
+__isl_give isl_map *isl_map_flat_domain_product(__isl_take isl_map *map1,
+       __isl_take isl_map *map2);
 __isl_give isl_map *isl_map_flat_range_product(__isl_take isl_map *map1,
        __isl_take isl_map *map2);
 __isl_give isl_map *isl_map_intersect(__isl_take isl_map *map1,
@@ -376,8 +382,11 @@ __isl_give isl_basic_map *isl_basic_set_unwrap(__isl_take isl_basic_set *bset);
 __isl_give isl_map *isl_set_unwrap(__isl_take isl_set *set);
 __isl_give isl_basic_map *isl_basic_map_flatten(__isl_take isl_basic_map *bmap);
 __isl_give isl_map *isl_map_flatten(__isl_take isl_map *map);
+__isl_give isl_basic_map *isl_basic_map_flatten_domain(
+       __isl_take isl_basic_map *bmap);
 __isl_give isl_basic_map *isl_basic_map_flatten_range(
        __isl_take isl_basic_map *bmap);
+__isl_give isl_map *isl_map_flatten_domain(__isl_take isl_map *map);
 __isl_give isl_map *isl_map_flatten_range(__isl_take isl_map *map);
 __isl_give isl_basic_set *isl_basic_set_flatten(__isl_take isl_basic_set *bset);
 __isl_give isl_set *isl_set_flatten(__isl_take isl_set *set);
index 8a859ae..92ee6b1 100644 (file)
@@ -80,6 +80,8 @@ __isl_give isl_space *isl_space_join(__isl_take isl_space *left,
        __isl_take isl_space *right);
 __isl_give isl_space *isl_space_product(__isl_take isl_space *left,
        __isl_take isl_space *right);
+__isl_give isl_space *isl_space_domain_product(__isl_take isl_space *left,
+       __isl_take isl_space *right);
 __isl_give isl_space *isl_space_range_product(__isl_take isl_space *left,
        __isl_take isl_space *right);
 __isl_give isl_space *isl_space_map_from_set(__isl_take isl_space *dim);
index 7e91137..bb242e7 100644 (file)
--- a/isl_map.c
+++ b/isl_map.c
@@ -7763,6 +7763,51 @@ __isl_give isl_basic_set *isl_basic_set_flat_product(
        return isl_basic_map_flat_range_product(bset1, bset2);
 }
 
+__isl_give isl_basic_map *isl_basic_map_domain_product(
+       __isl_take isl_basic_map *bmap1, __isl_take isl_basic_map *bmap2)
+{
+       isl_space *space_result = NULL;
+       isl_basic_map *bmap;
+       unsigned in1, in2, out, nparam, total, pos;
+       struct isl_dim_map *dim_map1, *dim_map2;
+
+       if (!bmap1 || !bmap2)
+               goto error;
+
+       space_result = isl_space_domain_product(isl_space_copy(bmap1->dim),
+                                               isl_space_copy(bmap2->dim));
+
+       in1 = isl_basic_map_dim(bmap1, isl_dim_in);
+       in2 = isl_basic_map_dim(bmap2, isl_dim_in);
+       out = isl_basic_map_dim(bmap1, isl_dim_out);
+       nparam = isl_basic_map_dim(bmap1, isl_dim_param);
+
+       total = nparam + in1 + in2 + out + bmap1->n_div + bmap2->n_div;
+       dim_map1 = isl_dim_map_alloc(bmap1->ctx, total);
+       dim_map2 = isl_dim_map_alloc(bmap1->ctx, total);
+       isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_param, pos = 0);
+       isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_param, pos = 0);
+       isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_in, pos += nparam);
+       isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_in, pos += in1);
+       isl_dim_map_dim(dim_map1, bmap1->dim, isl_dim_out, pos += in2);
+       isl_dim_map_dim(dim_map2, bmap2->dim, isl_dim_out, pos);
+       isl_dim_map_div(dim_map1, bmap1, pos += out);
+       isl_dim_map_div(dim_map2, bmap2, pos += bmap1->n_div);
+
+       bmap = isl_basic_map_alloc_space(space_result,
+                       bmap1->n_div + bmap2->n_div,
+                       bmap1->n_eq + bmap2->n_eq,
+                       bmap1->n_ineq + bmap2->n_ineq);
+       bmap = isl_basic_map_add_constraints_dim_map(bmap, bmap1, dim_map1);
+       bmap = isl_basic_map_add_constraints_dim_map(bmap, bmap2, dim_map2);
+       bmap = isl_basic_map_simplify(bmap);
+       return isl_basic_map_finalize(bmap);
+error:
+       isl_basic_map_free(bmap1);
+       isl_basic_map_free(bmap2);
+       return NULL;
+}
+
 __isl_give isl_basic_map *isl_basic_map_range_product(
        __isl_take isl_basic_map *bmap1, __isl_take isl_basic_map *bmap2)
 {
@@ -7904,6 +7949,15 @@ __isl_give isl_set *isl_set_flat_product(__isl_take isl_set *set1,
        return isl_map_flat_range_product(set1, set2);
 }
 
+/* Given two maps A -> B and C -> D, construct a map [A -> C] -> (B * D)
+ */
+static __isl_give isl_map *map_domain_product_aligned(__isl_take isl_map *map1,
+       __isl_take isl_map *map2)
+{
+       return map_product(map1, map2, &isl_space_domain_product,
+                               &isl_basic_map_domain_product);
+}
+
 /* Given two maps A -> B and C -> D, construct a map (A * C) -> [B -> D]
  */
 static __isl_give isl_map *map_range_product_aligned(__isl_take isl_map *map1,
@@ -7913,6 +7967,13 @@ static __isl_give isl_map *map_range_product_aligned(__isl_take isl_map *map1,
                                &isl_basic_map_range_product);
 }
 
+__isl_give isl_map *isl_map_domain_product(__isl_take isl_map *map1,
+       __isl_take isl_map *map2)
+{
+       return isl_map_align_params_map_map_and(map1, map2,
+                                               &map_domain_product_aligned);
+}
+
 __isl_give isl_map *isl_map_range_product(__isl_take isl_map *map1,
        __isl_take isl_map *map2)
 {
@@ -7920,6 +7981,18 @@ __isl_give isl_map *isl_map_range_product(__isl_take isl_map *map1,
                                                &map_range_product_aligned);
 }
 
+/* Given two maps A -> B and C -> D, construct a map (A, C) -> (B * D)
+ */
+__isl_give isl_map *isl_map_flat_domain_product(__isl_take isl_map *map1,
+       __isl_take isl_map *map2)
+{
+       isl_map *prod;
+
+       prod = isl_map_domain_product(map1, map2);
+       prod = isl_map_flatten_domain(prod);
+       return prod;
+}
+
 /* Given two maps A -> B and C -> D, construct a map (A * C) -> (B, D)
  */
 __isl_give isl_map *isl_map_flat_range_product(__isl_take isl_map *map1,
@@ -8810,6 +8883,31 @@ __isl_give isl_basic_set *isl_basic_set_flatten(__isl_take isl_basic_set *bset)
        return (isl_basic_set *)isl_basic_map_flatten((isl_basic_map *)bset);
 }
 
+__isl_give isl_basic_map *isl_basic_map_flatten_domain(
+       __isl_take isl_basic_map *bmap)
+{
+       if (!bmap)
+               return NULL;
+
+       if (!bmap->dim->nested[0])
+               return bmap;
+
+       bmap = isl_basic_map_cow(bmap);
+       if (!bmap)
+               return NULL;
+
+       bmap->dim = isl_space_flatten_domain(bmap->dim);
+       if (!bmap->dim)
+               goto error;
+
+       bmap = isl_basic_map_finalize(bmap);
+
+       return bmap;
+error:
+       isl_basic_map_free(bmap);
+       return NULL;
+}
+
 __isl_give isl_basic_map *isl_basic_map_flatten_range(
        __isl_take isl_basic_map *bmap)
 {
@@ -8882,6 +8980,35 @@ __isl_give isl_map *isl_set_flatten_map(__isl_take isl_set *set)
        return map;
 }
 
+__isl_give isl_map *isl_map_flatten_domain(__isl_take isl_map *map)
+{
+       int i;
+
+       if (!map)
+               return NULL;
+
+       if (!map->dim->nested[0])
+               return map;
+
+       map = isl_map_cow(map);
+       if (!map)
+               return NULL;
+
+       for (i = 0; i < map->n; ++i) {
+               map->p[i] = isl_basic_map_flatten_domain(map->p[i]);
+               if (!map->p[i])
+                       goto error;
+       }
+       map->dim = isl_space_flatten_domain(map->dim);
+       if (!map->dim)
+               goto error;
+
+       return map;
+error:
+       isl_map_free(map);
+       return NULL;
+}
+
 __isl_give isl_map *isl_map_flatten_range(__isl_take isl_map *map)
 {
        int i;
index b6e6b5a..6a9e9d7 100644 (file)
@@ -869,6 +869,37 @@ error:
        return NULL;
 }
 
+/* Given two spaces { A -> C } and { B -> C }, construct the space
+ * { [A -> B] -> C }
+ */
+__isl_give isl_space *isl_space_domain_product(__isl_take isl_space *left,
+       __isl_take isl_space *right)
+{
+       isl_space *ran, *dom1, *dom2, *nest;
+
+       if (!left || !right)
+               goto error;
+
+       if (!match(left, isl_dim_param, right, isl_dim_param))
+               isl_die(left->ctx, isl_error_invalid,
+                       "parameters need to match", goto error);
+       if (!isl_space_tuple_match(left, isl_dim_out, right, isl_dim_out))
+               isl_die(left->ctx, isl_error_invalid,
+                       "ranges need to match", goto error);
+
+       ran = isl_space_range(isl_space_copy(left));
+
+       dom1 = isl_space_domain(left);
+       dom2 = isl_space_domain(right);
+       nest = isl_space_wrap(isl_space_join(isl_space_reverse(dom1), dom2));
+
+       return isl_space_join(isl_space_reverse(nest), ran);
+error:
+       isl_space_free(left);
+       isl_space_free(right);
+       return NULL;
+}
+
 __isl_give isl_space *isl_space_range_product(__isl_take isl_space *left,
        __isl_take isl_space *right)
 {
@@ -1316,6 +1347,16 @@ __isl_give isl_space *isl_space_flatten(__isl_take isl_space *dim)
        return dim;
 }
 
+__isl_give isl_space *isl_space_flatten_domain(__isl_take isl_space *dim)
+{
+       if (!dim)
+               return NULL;
+       if (!dim->nested[0])
+               return dim;
+
+       return isl_space_reset(dim, isl_dim_in);
+}
+
 __isl_give isl_space *isl_space_flatten_range(__isl_take isl_space *dim)
 {
        if (!dim)
index 1232440..74480d6 100644 (file)
@@ -36,6 +36,7 @@ int isl_space_has_named_params(__isl_keep isl_space *dim);
 __isl_give isl_space *isl_space_reset(__isl_take isl_space *dim,
        enum isl_dim_type type);
 __isl_give isl_space *isl_space_flatten(__isl_take isl_space *dim);
+__isl_give isl_space *isl_space_flatten_domain(__isl_take isl_space *dim);
 __isl_give isl_space *isl_space_flatten_range(__isl_take isl_space *dim);
 
 __isl_give isl_space *isl_space_replace(__isl_take isl_space *dst,