add isl_basic_map_is_single_valued
authorSven Verdoolaege <skimo@kotnet.org>
Wed, 29 Feb 2012 11:50:38 +0000 (12:50 +0100)
committerSven Verdoolaege <skimo@kotnet.org>
Sun, 6 May 2012 12:33:06 +0000 (14:33 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl/map.h
isl_map.c

index 9926195..2f9e387 100644 (file)
@@ -1675,6 +1675,8 @@ is already known to be empty.
 
 =item * Single-valuedness
 
+       int isl_basic_map_is_single_valued(
+               __isl_keep isl_basic_map *bmap);
        int isl_map_plain_is_single_valued(
                __isl_keep isl_map *map);
        int isl_map_is_single_valued(__isl_keep isl_map *map);
index a8c1497..0c6142f 100644 (file)
@@ -488,6 +488,7 @@ __isl_export
 int isl_map_is_strict_subset(__isl_keep isl_map *map1, __isl_keep isl_map *map2);
 __isl_export
 int isl_map_is_equal(__isl_keep isl_map *map1, __isl_keep isl_map *map2);
+int isl_basic_map_is_single_valued(__isl_keep isl_basic_map *bmap);
 int isl_map_plain_is_single_valued(__isl_keep isl_map *map);
 __isl_export
 int isl_map_is_single_valued(__isl_keep isl_map *map);
index 64f27c4..691c88c 100644 (file)
--- a/isl_map.c
+++ b/isl_map.c
@@ -8968,6 +8968,39 @@ int isl_basic_map_plain_is_single_valued(__isl_keep isl_basic_map *bmap)
        return 1;
 }
 
+/* Check if the given basic map is single-valued.
+ * We simply compute
+ *
+ *     M \circ M^-1
+ *
+ * and check if the result is a subset of the identity mapping.
+ */
+int isl_basic_map_is_single_valued(__isl_keep isl_basic_map *bmap)
+{
+       isl_space *space;
+       isl_basic_map *test;
+       isl_basic_map *id;
+       int sv;
+
+       sv = isl_basic_map_plain_is_single_valued(bmap);
+       if (sv < 0 || sv)
+               return sv;
+
+       test = isl_basic_map_reverse(isl_basic_map_copy(bmap));
+       test = isl_basic_map_apply_range(test, isl_basic_map_copy(bmap));
+
+       space = isl_basic_map_get_space(bmap);
+       space = isl_space_map_from_set(isl_space_range(space));
+       id = isl_basic_map_identity(space);
+
+       sv = isl_basic_map_is_subset(test, id);
+
+       isl_basic_map_free(test);
+       isl_basic_map_free(id);
+
+       return sv;
+}
+
 /* Check if the given map is obviously single-valued.
  */
 int isl_map_plain_is_single_valued(__isl_keep isl_map *map)