int isl_basic_map_is_universe(__isl_keep isl_basic_map *bmap);
int isl_set_fast_is_universe(__isl_keep isl_set *set);
+=item * Single-valuedness
+
+ int isl_map_is_single_valued(__isl_keep isl_map *map);
+
=back
=head3 Binary Properties
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);
__isl_give isl_map *isl_map_make_disjoint(__isl_take isl_map *map);
__isl_give isl_map *isl_basic_map_compute_divs(__isl_take isl_basic_map *bmap);
first += pos(bset->dim, type) - 1;
return isl_basic_set_vars_get_sign(bset, first, n, signs);
}
+
+/* Check if the given 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_map_is_single_valued(__isl_keep isl_map *map)
+{
+ isl_map *test;
+ isl_map *id;
+ int sv;
+
+ test = isl_map_reverse(isl_map_copy(map));
+ test = isl_map_apply_range(test, isl_map_copy(map));
+
+ id = isl_map_identity(isl_dim_range(isl_map_get_dim(map)));
+
+ sv = isl_map_is_subset(test, id);
+
+ isl_map_free(test);
+ isl_map_free(id);
+
+ return sv;
+}
isl_flow_free(flow);
}
+void test_sv(struct isl_ctx *ctx)
+{
+ const char *str;
+ isl_map *map;
+
+ str = "[N] -> { [i] -> [f] : 0 <= i <= N and 0 <= i - 10 f <= 9 }";
+ map = isl_map_read_from_str(ctx, str, -1);
+ assert(isl_map_is_single_valued(map));
+ isl_map_free(map);
+
+ str = "[N] -> { [i] -> [f] : 0 <= i <= N and 0 <= i - 10 f <= 10 }";
+ map = isl_map_read_from_str(ctx, str, -1);
+ assert(!isl_map_is_single_valued(map));
+ isl_map_free(map);
+}
+
int main()
{
struct isl_ctx *ctx;
assert(srcdir);
ctx = isl_ctx_alloc();
+ test_sv(ctx);
test_dep(ctx);
test_read(ctx);
test_construction(ctx);