From ef2f71bc7ba39dd0e60585cfaec37c57e4e3678e Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Fri, 8 Apr 2016 17:54:50 +0200 Subject: [PATCH] add isl_set_project_onto_map Signed-off-by: Sven Verdoolaege --- doc/user.pod | 7 +++++++ include/isl/set.h | 2 ++ isl_map.c | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/doc/user.pod b/doc/user.pod index da0e119d..c21b2cfe 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -4268,10 +4268,17 @@ earlier dimensions before those that involve later dimensions. enum isl_dim_type type, unsigned first, unsigned n); __isl_give isl_set *isl_set_project_out(__isl_take isl_set *set, enum isl_dim_type type, unsigned first, unsigned n); + __isl_give isl_map *isl_set_project_onto_map( + __isl_take isl_set *set, + enum isl_dim_type type, unsigned first, + unsigned n); __isl_give isl_basic_set *isl_basic_set_params( __isl_take isl_basic_set *bset); __isl_give isl_set *isl_set_params(__isl_take isl_set *set); +The function C returns a relation +that projects the input set onto the given set dimensions. + #include __isl_give isl_basic_map *isl_basic_map_project_out( __isl_take isl_basic_map *bmap, diff --git a/include/isl/set.h b/include/isl/set.h index 20fb904a..e7a3189f 100644 --- a/include/isl/set.h +++ b/include/isl/set.h @@ -321,6 +321,8 @@ __isl_give isl_basic_set *isl_basic_set_project_out( enum isl_dim_type type, unsigned first, unsigned n); __isl_give isl_set *isl_set_project_out(__isl_take isl_set *set, enum isl_dim_type type, unsigned first, unsigned n); +__isl_give isl_map *isl_set_project_onto_map(__isl_take isl_set *set, + enum isl_dim_type type, unsigned first, unsigned n); __isl_give isl_basic_set *isl_basic_set_remove_divs( __isl_take isl_basic_set *bset); __isl_give isl_basic_set *isl_basic_set_eliminate( diff --git a/isl_map.c b/isl_map.c index 9deaa601..08c52144 100644 --- a/isl_map.c +++ b/isl_map.c @@ -3673,6 +3673,38 @@ __isl_give isl_set *isl_set_project_out(__isl_take isl_set *set, return (isl_set *)isl_map_project_out((isl_map *)set, type, first, n); } +/* Return a map that projects the elements in "set" onto their + * "n" set dimensions starting at "first". + * "type" should be equal to isl_dim_set. + */ +__isl_give isl_map *isl_set_project_onto_map(__isl_take isl_set *set, + enum isl_dim_type type, unsigned first, unsigned n) +{ + int i; + int dim; + isl_map *map; + + if (!set) + return NULL; + if (type != isl_dim_set) + isl_die(isl_set_get_ctx(set), isl_error_invalid, + "only set dimensions can be projected out", goto error); + dim = isl_set_dim(set, isl_dim_set); + if (first + n > dim || first + n < first) + isl_die(isl_set_get_ctx(set), isl_error_invalid, + "index out of bounds", goto error); + + map = isl_map_from_domain(set); + map = isl_map_add_dims(map, isl_dim_out, n); + for (i = 0; i < n; ++i) + map = isl_map_equate(map, isl_dim_in, first + i, + isl_dim_out, i); + return map; +error: + isl_set_free(set); + return NULL; +} + static struct isl_basic_map *add_divs(struct isl_basic_map *bmap, unsigned n) { int i, j; -- 2.11.4.GIT