add isl_map_is_bijective
authorSven Verdoolaege <skimo@kotnet.org>
Fri, 11 Jun 2010 20:03:32 +0000 (22:03 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Tue, 29 Jun 2010 06:55:40 +0000 (08:55 +0200)
Tests cases from Tomofumi Yuki <tomofumi.yuki@gmail.com>

doc/user.pod
include/isl_map.h
isl_map.c
isl_test.c

index fea0b01..8bb1044 100644 (file)
@@ -852,6 +852,10 @@ is already known to be empty.
 
        int isl_map_is_single_valued(__isl_keep isl_map *map);
 
+=item * Bijectivity
+
+       int isl_map_is_bijective(__isl_keep isl_map *map);
+
 =back
 
 =head3 Binary Properties
index 8637cd5..bcb6581 100644 (file)
@@ -364,6 +364,7 @@ int isl_map_is_subset(__isl_keep isl_map *map1, __isl_keep isl_map *map2);
 int isl_map_is_strict_subset(__isl_keep isl_map *map1, __isl_keep isl_map *map2);
 int isl_map_is_equal(__isl_keep isl_map *map1, __isl_keep isl_map *map2);
 int isl_map_is_single_valued(__isl_keep isl_map *map);
+int isl_map_is_bijective(__isl_keep isl_map *map);
 int isl_map_is_translation(__isl_keep isl_map *map);
 
 __isl_give isl_map *isl_map_make_disjoint(__isl_take isl_map *map);
index e152cdc..3fe5f70 100644 (file)
--- a/isl_map.c
+++ b/isl_map.c
@@ -6815,6 +6815,22 @@ int isl_map_is_single_valued(__isl_keep isl_map *map)
        return sv;
 }
 
+int isl_map_is_bijective(__isl_keep isl_map *map)
+{
+       int sv;
+
+       sv = isl_map_is_single_valued(map);
+       if (sv < 0 || !sv)
+               return sv;
+
+       map = isl_map_copy(map);
+       map = isl_map_reverse(map);
+       sv = isl_map_is_single_valued(map);
+       isl_map_free(map);
+
+       return sv;
+}
+
 int isl_set_is_singleton(__isl_keep isl_set *set)
 {
        return isl_map_is_single_valued((isl_map *)set);
index fe966ba..5b7a9ea 100644 (file)
@@ -1311,6 +1311,35 @@ void test_sv(struct isl_ctx *ctx)
        isl_map_free(map);
 }
 
+void test_bijective_case(struct isl_ctx *ctx, const char *str, int bijective)
+{
+       isl_map *map;
+
+       map = isl_map_read_from_str(ctx, str, -1);
+       if (bijective)
+               assert(isl_map_is_bijective(map));
+       else
+               assert(!isl_map_is_bijective(map));
+       isl_map_free(map);
+}
+
+void test_bijective(struct isl_ctx *ctx)
+{
+       test_bijective_case(ctx, "[N,M]->{[i,j] -> [i]}", 0);
+       test_bijective_case(ctx, "[N,M]->{[i,j] -> [i] : j=i}", 1);
+       test_bijective_case(ctx, "[N,M]->{[i,j] -> [i] : j=0}", 1);
+       test_bijective_case(ctx, "[N,M]->{[i,j] -> [i] : j=N}", 1);
+       test_bijective_case(ctx, "[N,M]->{[i,j] -> [j,i]}", 1);
+       test_bijective_case(ctx, "[N,M]->{[i,j] -> [i+j]}", 0);
+       test_bijective_case(ctx, "[N,M]->{[i,j] -> []}", 0);
+       test_bijective_case(ctx, "[N,M]->{[i,j] -> [i,j,N]}", 1);
+       test_bijective_case(ctx, "[N,M]->{[i,j] -> [2i]}", 0);
+       test_bijective_case(ctx, "[N,M]->{[i,j] -> [i,i]}", 0);
+       test_bijective_case(ctx, "[N,M]->{[i,j] -> [2i,i]}", 0);
+       test_bijective_case(ctx, "[N,M]->{[i,j] -> [2i,j]}", 1);
+       test_bijective_case(ctx, "[N,M]->{[i,j] -> [x,y] : 2x=i & y =j}", 1);
+}
+
 int main()
 {
        struct isl_ctx *ctx;
@@ -1320,6 +1349,7 @@ int main()
 
        ctx = isl_ctx_alloc();
        test_sv(ctx);
+       test_bijective(ctx);
        test_dep(ctx);
        test_read(ctx);
        test_bounded(ctx);