static char *srcdir;
+static char *get_filename(isl_ctx *ctx, const char *name, const char *suffix) {
+ char *filename;
+ int length;
+ char *pattern = "%s/test_inputs/%s.%s";
+
+ length = strlen(pattern) - 6 + strlen(srcdir) + strlen(name)
+ + strlen(suffix) + 1;
+ filename = isl_alloc_array(ctx, char, length);
+
+ if (!filename)
+ return NULL;
+
+ sprintf(filename, pattern, srcdir, name, suffix);
+
+ return filename;
+}
+
void test_parse_map(isl_ctx *ctx, const char *str)
{
isl_map *map;
void test_read(struct isl_ctx *ctx)
{
- char filename[PATH_MAX];
+ char *filename;
FILE *input;
- int n;
struct isl_basic_set *bset1, *bset2;
const char *str = "{[y]: Exists ( alpha : 2alpha = y)}";
- n = snprintf(filename, sizeof(filename),
- "%s/test_inputs/set.omega", srcdir);
- assert(n < sizeof(filename));
+ filename = get_filename(ctx, "set", "omega");
+ assert(filename);
input = fopen(filename, "r");
assert(input);
isl_basic_set_free(bset1);
isl_basic_set_free(bset2);
+ free(filename);
fclose(input);
}
void test_application_case(struct isl_ctx *ctx, const char *name)
{
- char filename[PATH_MAX];
+ char *filename;
FILE *input;
- int n;
struct isl_basic_set *bset1, *bset2;
struct isl_basic_map *bmap;
- n = snprintf(filename, sizeof(filename),
- "%s/test_inputs/%s.omega", srcdir, name);
- assert(n < sizeof(filename));
+ filename = get_filename(ctx, name, "omega");
+ assert(filename);
input = fopen(filename, "r");
assert(input);
isl_basic_set_free(bset1);
isl_basic_set_free(bset2);
+ free(filename);
fclose(input);
}
void test_affine_hull_case(struct isl_ctx *ctx, const char *name)
{
- char filename[PATH_MAX];
+ char *filename;
FILE *input;
- int n;
struct isl_basic_set *bset1, *bset2;
- n = snprintf(filename, sizeof(filename),
- "%s/test_inputs/%s.polylib", srcdir, name);
- assert(n < sizeof(filename));
+ filename = get_filename(ctx, name, "polylib");
+ assert(filename);
input = fopen(filename, "r");
assert(input);
isl_basic_set_free(bset1);
isl_basic_set_free(bset2);
+ free(filename);
fclose(input);
}
void test_convex_hull_case(struct isl_ctx *ctx, const char *name)
{
- char filename[PATH_MAX];
+ char *filename;
FILE *input;
- int n;
struct isl_basic_set *bset1, *bset2;
struct isl_set *set;
- n = snprintf(filename, sizeof(filename),
- "%s/test_inputs/%s.polylib", srcdir, name);
- assert(n < sizeof(filename));
+ filename = get_filename(ctx, name, "polylib");
+ assert(filename);
input = fopen(filename, "r");
assert(input);
isl_basic_set_free(bset1);
isl_basic_set_free(bset2);
+ free(filename);
fclose(input);
}
void test_gist_case(struct isl_ctx *ctx, const char *name)
{
- char filename[PATH_MAX];
+ char *filename;
FILE *input;
- int n;
struct isl_basic_set *bset1, *bset2;
- n = snprintf(filename, sizeof(filename),
- "%s/test_inputs/%s.polylib", srcdir, name);
- assert(n < sizeof(filename));
+ filename = get_filename(ctx, name, "polylib");
+ assert(filename);
input = fopen(filename, "r");
assert(input);
isl_basic_set_free(bset1);
isl_basic_set_free(bset2);
+ free(filename);
fclose(input);
}
isl_map_free(map);
}
+static int consume_lexmin(__isl_take isl_basic_set *dom,
+ __isl_take isl_aff_list *list, void *user)
+{
+ isl_dim *dim;
+ isl_basic_map *bmap;
+ isl_map **map = user;
+
+ dim = isl_basic_set_get_dim(dom);
+ bmap = isl_basic_map_from_aff_list(dim, list);
+ bmap = isl_basic_map_intersect_domain(bmap, dom);
+
+ *map = isl_map_union(*map, isl_map_from_basic_map(bmap));
+
+ return 0;
+}
+
void test_lexmin(struct isl_ctx *ctx)
{
const char *str;
+ isl_basic_map *bmap;
isl_map *map, *map2;
isl_set *set;
isl_set *set2;
assert(isl_map_is_equal(map, map2));
isl_map_free(map);
isl_map_free(map2);
+
+ str = "{ [i] -> [i', j] : j = i - 8i' and i' >= 0 and i' <= 7 and "
+ " 8i' <= i and 8i' >= -7 + i }";
+ bmap = isl_basic_map_read_from_str(ctx, str, -1);
+ map2 = isl_map_empty(isl_basic_map_get_dim(bmap));
+ isl_basic_map_foreach_lexmin(bmap, &consume_lexmin, &map2);
+ map = isl_map_from_basic_map(bmap);
+ assert(isl_map_is_equal(map, map2));
+ isl_map_free(map);
+ isl_map_free(map2);
}
struct must_may {
assert(isl_pw_qpolynomial_is_zero(pwqp1));
isl_pw_qpolynomial_free(pwqp1);
+
+ str = "{ [i] -> ([i/2]) : i >= 0; [i] -> ([i/3]) : i < 0 }";
+ pwqp1 = isl_pw_qpolynomial_read_from_str(ctx, str);
+ pwqp2 = isl_pw_qpolynomial_read_from_str(ctx, str);
+ pwqp1 = isl_pw_qpolynomial_coalesce(pwqp1);
+ pwqp1 = isl_pw_qpolynomial_sub(pwqp1, pwqp2);
+ assert(isl_pw_qpolynomial_is_zero(pwqp1));
+ isl_pw_qpolynomial_free(pwqp1);
}
void test_split_periods(isl_ctx *ctx)
return test_special_schedule(ctx);
}
+int test_plain_injective(isl_ctx *ctx, const char *str, int injective)
+{
+ isl_union_map *umap;
+ int test;
+
+ umap = isl_union_map_read_from_str(ctx, str);
+ test = isl_union_map_plain_is_injective(umap);
+ isl_union_map_free(umap);
+ if (test < 0)
+ return -1;
+ if (test == injective)
+ return 0;
+ if (injective)
+ isl_die(ctx, isl_error_unknown,
+ "map not detected as injective", return -1);
+ else
+ isl_die(ctx, isl_error_unknown,
+ "map detected as injective", return -1);
+}
+
+int test_injective(isl_ctx *ctx)
+{
+ const char *str;
+
+ if (test_plain_injective(ctx, "{S[i,j] -> A[0]; T[i,j] -> B[1]}", 0))
+ return -1;
+ if (test_plain_injective(ctx, "{S[] -> A[0]; T[] -> B[0]}", 1))
+ return -1;
+ if (test_plain_injective(ctx, "{S[] -> A[0]; T[] -> A[1]}", 1))
+ return -1;
+ if (test_plain_injective(ctx, "{S[] -> A[0]; T[] -> A[0]}", 0))
+ return -1;
+ if (test_plain_injective(ctx, "{S[i] -> A[i,0]; T[i] -> A[i,1]}", 1))
+ return -1;
+ if (test_plain_injective(ctx, "{S[i] -> A[i]; T[i] -> A[i]}", 0))
+ return -1;
+ if (test_plain_injective(ctx, "{S[] -> A[0,0]; T[] -> A[0,1]}", 1))
+ return -1;
+ if (test_plain_injective(ctx, "{S[] -> A[0,0]; T[] -> A[1,0]}", 1))
+ return -1;
+
+ str = "{S[] -> A[0,0]; T[] -> A[0,1]; U[] -> A[1,0]}";
+ if (test_plain_injective(ctx, str, 1))
+ return -1;
+ str = "{S[] -> A[0,0]; T[] -> A[0,1]; U[] -> A[0,0]}";
+ if (test_plain_injective(ctx, str, 0))
+ return -1;
+
+ return 0;
+}
+
int main()
{
struct isl_ctx *ctx;
assert(srcdir);
ctx = isl_ctx_alloc();
+ if (test_injective(ctx) < 0)
+ goto error;
if (test_schedule(ctx) < 0)
goto error;
test_factorize(ctx);