/*
* Copyright 2008-2009 Katholieke Universiteit Leuven
*
- * Use of this software is governed by the GNU LGPLv2.1 license
+ * Use of this software is governed by the MIT license
*
* Written by Sven Verdoolaege, K.U.Leuven, Departement
* Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
#include "isl_tab.h"
#include <isl_point_private.h>
+/* Expand the constraint "c" into "v". The initial "dim" dimensions
+ * are the same, but "v" may have more divs than "c" and the divs of "c"
+ * may appear in different positions in "v".
+ * The number of divs in "c" is given by "n_div" and the mapping
+ * of divs in "c" to divs in "v" is given by "div_map".
+ *
+ * Although it shouldn't happen in practice, it is theoretically
+ * possible that two or more divs in "c" are mapped to the same div in "v".
+ * These divs are then necessarily the same, so we simply add their
+ * coefficients.
+ */
static void expand_constraint(isl_vec *v, unsigned dim,
isl_int *c, int *div_map, unsigned n_div)
{
isl_seq_cpy(v->el, c, 1 + dim);
isl_seq_clr(v->el + 1 + dim, v->size - (1 + dim));
- for (i = 0; i < n_div; ++i)
- isl_int_set(v->el[1 + dim + div_map[i]], c[1 + dim + i]);
+ for (i = 0; i < n_div; ++i) {
+ int pos = 1 + dim + div_map[i];
+ isl_int_add(v->el[pos], v->el[pos], c[1 + dim + i]);
+ }
}
/* Add all constraints of bmap to tab. The equalities of bmap
bmap = isl_basic_map_order_divs(bmap);
map = isl_map_order_divs(map);
- tab = isl_tab_from_basic_map(bmap);
- if (isl_tab_track_bmap(tab, isl_basic_map_copy(bmap)) < 0)
+ tab = isl_tab_from_basic_map(bmap, 1);
+ if (!tab)
goto error;
modified = 0;
return isl_map_align_params_map_map_and(map, dom, &map_subtract_domain);
}
+/* Remove the elements of "dom" from the range of "map".
+ */
+static __isl_give isl_map *map_subtract_range(__isl_take isl_map *map,
+ __isl_take isl_set *dom)
+{
+ isl_map *ext_dom;
+
+ if (!isl_map_compatible_range(map, dom))
+ isl_die(isl_set_get_ctx(dom), isl_error_invalid,
+ "incompatible spaces", goto error);
+
+ ext_dom = isl_map_universe(isl_map_get_space(map));
+ ext_dom = isl_map_intersect_range(ext_dom, dom);
+ return isl_map_subtract(map, ext_dom);
+error:
+ isl_map_free(map);
+ isl_set_free(dom);
+ return NULL;
+}
+
+__isl_give isl_map *isl_map_subtract_range(__isl_take isl_map *map,
+ __isl_take isl_set *dom)
+{
+ return isl_map_align_params_map_map_and(map, dom, &map_subtract_range);
+}
+
/* A diff collector that aborts as soon as its add function is called,
* setting empty to 0.
*/
static int map_is_subset(__isl_keep isl_map *map1, __isl_keep isl_map *map2)
{
int is_subset = 0;
+ int empty;
+ int rat1, rat2;
if (!map1 || !map2)
return -1;
if (!isl_map_has_equal_space(map1, map2))
return 0;
- if (isl_map_is_empty(map1))
+ empty = isl_map_is_empty(map1);
+ if (empty < 0)
+ return -1;
+ if (empty)
return 1;
- if (isl_map_is_empty(map2))
+ empty = isl_map_is_empty(map2);
+ if (empty < 0)
+ return -1;
+ if (empty)
+ return 0;
+
+ rat1 = isl_map_has_rational(map1);
+ rat2 = isl_map_has_rational(map2);
+ if (rat1 < 0 || rat2 < 0)
+ return -1;
+ if (rat1 && !rat2)
return 0;
if (isl_map_plain_is_universe(map2))
return (struct isl_set *)isl_map_make_disjoint((struct isl_map *)set);
}
-__isl_give isl_set *isl_set_complement(__isl_take isl_set *set)
+__isl_give isl_map *isl_map_complement(__isl_take isl_map *map)
{
- isl_set *universe;
+ isl_map *universe;
- if (!set)
+ if (!map)
return NULL;
- universe = isl_set_universe(isl_set_get_space(set));
+ universe = isl_map_universe(isl_map_get_space(map));
- return isl_set_subtract(universe, set);
+ return isl_map_subtract(universe, map);
+}
+
+__isl_give isl_set *isl_set_complement(__isl_take isl_set *set)
+{
+ return isl_map_complement(set);
}