* 91893 Orsay, France
*/
-#include <isl_morph.h>
-#include <isl_seq.h>
#include <isl_map_private.h>
+#include <isl_morph.h>
+#include <isl/seq.h>
+#include <isl_mat_private.h>
#include <isl_dim_private.h>
#include <isl_equalities.h>
-static __isl_give isl_morph *isl_morph_alloc(
+__isl_give isl_morph *isl_morph_alloc(
__isl_take isl_basic_set *dom, __isl_take isl_basic_set *ran,
__isl_take isl_mat *map, __isl_take isl_mat *inv)
{
if (!dom || !ran || !map || !inv)
goto error;
- morph = isl_alloc_type(in_dim->ctx, struct isl_morph);
+ morph = isl_alloc_type(dom->ctx, struct isl_morph);
if (!morph)
goto error;
return isl_dim_copy(morph->ran->dim);
}
-__isl_give isl_morph *isl_morph_drop_dims(__isl_take isl_morph *morph,
+unsigned isl_morph_dom_dim(__isl_keep isl_morph *morph, enum isl_dim_type type)
+{
+ if (!morph)
+ return 0;
+
+ return isl_basic_set_dim(morph->dom, type);
+}
+
+unsigned isl_morph_ran_dim(__isl_keep isl_morph *morph, enum isl_dim_type type)
+{
+ if (!morph)
+ return 0;
+
+ return isl_basic_set_dim(morph->ran, type);
+}
+
+__isl_give isl_morph *isl_morph_remove_dom_dims(__isl_take isl_morph *morph,
enum isl_dim_type type, unsigned first, unsigned n)
{
unsigned dom_offset;
- unsigned ran_offset;
if (n == 0)
return morph;
return NULL;
dom_offset = 1 + isl_dim_offset(morph->dom->dim, type);
- ran_offset = 1 + isl_dim_offset(morph->ran->dim, type);
- morph->dom = isl_basic_set_drop(morph->dom, type, first, n);
- morph->ran = isl_basic_set_drop(morph->ran, type, first, n);
+ morph->dom = isl_basic_set_remove_dims(morph->dom, type, first, n);
morph->map = isl_mat_drop_cols(morph->map, dom_offset + first, n);
+
+ morph->inv = isl_mat_drop_rows(morph->inv, dom_offset + first, n);
+
+ if (morph->dom && morph->ran && morph->map && morph->inv)
+ return morph;
+
+ isl_morph_free(morph);
+ return NULL;
+}
+
+__isl_give isl_morph *isl_morph_remove_ran_dims(__isl_take isl_morph *morph,
+ enum isl_dim_type type, unsigned first, unsigned n)
+{
+ unsigned ran_offset;
+
+ if (n == 0)
+ return morph;
+
+ morph = isl_morph_cow(morph);
+ if (!morph)
+ return NULL;
+
+ ran_offset = 1 + isl_dim_offset(morph->ran->dim, type);
+
+ morph->ran = isl_basic_set_remove_dims(morph->ran, type, first, n);
+
morph->map = isl_mat_drop_rows(morph->map, ran_offset + first, n);
morph->inv = isl_mat_drop_cols(morph->inv, ran_offset + first, n);
- morph->inv = isl_mat_drop_rows(morph->inv, dom_offset + first, n);
if (morph->dom && morph->ran && morph->map && morph->inv)
return morph;
return morph;
}
+
+__isl_give isl_morph *isl_basic_set_full_compression(
+ __isl_keep isl_basic_set *bset)
+{
+ isl_morph *morph, *morph2;
+
+ bset = isl_basic_set_copy(bset);
+
+ morph = isl_basic_set_variable_compression(bset, isl_dim_param);
+ bset = isl_morph_basic_set(isl_morph_copy(morph), bset);
+
+ morph2 = isl_basic_set_parameter_compression(bset);
+ bset = isl_morph_basic_set(isl_morph_copy(morph2), bset);
+
+ morph = isl_morph_compose(morph2, morph);
+
+ morph2 = isl_basic_set_variable_compression(bset, isl_dim_set);
+ isl_basic_set_free(bset);
+
+ morph = isl_morph_compose(morph2, morph);
+
+ return morph;
+}
+
+__isl_give isl_vec *isl_morph_vec(__isl_take isl_morph *morph,
+ __isl_take isl_vec *vec)
+{
+ if (!morph)
+ goto error;
+
+ vec = isl_mat_vec_product(isl_mat_copy(morph->map), vec);
+
+ isl_morph_free(morph);
+ return vec;
+error:
+ isl_morph_free(morph);
+ isl_vec_free(vec);
+ return NULL;
+}