add isl_map_set_rational
[platform/upstream/isl.git] / isl_convex_hull.c
index 90720e5..8d02b7c 100644 (file)
@@ -7,28 +7,18 @@
  * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
  */
 
-#include "isl_lp.h"
-#include "isl_map.h"
-#include "isl_map_private.h"
-#include "isl_mat.h"
-#include "isl_set.h"
-#include "isl_seq.h"
+#include <isl_ctx_private.h>
+#include <isl_map_private.h>
+#include <isl/lp.h>
+#include <isl/map.h>
+#include <isl_mat_private.h>
+#include <isl/set.h>
+#include <isl/seq.h>
 #include "isl_equalities.h"
 #include "isl_tab.h"
 
 static struct isl_basic_set *uset_convex_hull_wrap_bounded(struct isl_set *set);
 
-static void swap_ineq(struct isl_basic_map *bmap, unsigned i, unsigned j)
-{
-       isl_int *t;
-
-       if (i != j) {
-               t = bmap->ineq[i];
-               bmap->ineq[i] = bmap->ineq[j];
-               bmap->ineq[j] = t;
-       }
-}
-
 /* Return 1 if constraint c is redundant with respect to the constraints
  * in bmap.  If c is a lower [upper] bound in some variable and bmap
  * does not have a lower [upper] bound in that variable, then c cannot
@@ -126,6 +116,19 @@ __isl_give isl_basic_set *isl_basic_set_remove_redundancies(
                isl_basic_map_remove_redundancies((struct isl_basic_map *)bset);
 }
 
+/* Remove redundant constraints in each of the basic maps.
+ */
+__isl_give isl_map *isl_map_remove_redundancies(__isl_take isl_map *map)
+{
+       return isl_map_inline_foreach_basic_map(map,
+                                           &isl_basic_map_remove_redundancies);
+}
+
+__isl_give isl_set *isl_set_remove_redundancies(__isl_take isl_set *set)
+{
+       return isl_map_remove_redundancies(set);
+}
+
 /* Check if the set set is bound in the direction of the affine
  * constraint c and if so, set the constant term such that the
  * resulting constraint is a bounding constraint for the set.
@@ -174,41 +177,53 @@ error:
        return -1;
 }
 
-struct isl_basic_set *isl_basic_set_set_rational(struct isl_basic_set *bset)
+__isl_give isl_basic_map *isl_basic_map_set_rational(
+       __isl_take isl_basic_set *bmap)
 {
-       if (!bset)
+       if (!bmap)
                return NULL;
 
-       if (ISL_F_ISSET(bset, ISL_BASIC_MAP_RATIONAL))
-               return bset;
+       if (ISL_F_ISSET(bmap, ISL_BASIC_MAP_RATIONAL))
+               return bmap;
 
-       bset = isl_basic_set_cow(bset);
-       if (!bset)
+       bmap = isl_basic_map_cow(bmap);
+       if (!bmap)
                return NULL;
 
-       ISL_F_SET(bset, ISL_BASIC_MAP_RATIONAL);
+       ISL_F_SET(bmap, ISL_BASIC_MAP_RATIONAL);
 
-       return isl_basic_set_finalize(bset);
+       return isl_basic_map_finalize(bmap);
 }
 
-static struct isl_set *isl_set_set_rational(struct isl_set *set)
+__isl_give isl_basic_set *isl_basic_set_set_rational(
+       __isl_take isl_basic_set *bset)
+{
+       return isl_basic_map_set_rational(bset);
+}
+
+__isl_give isl_map *isl_map_set_rational(__isl_take isl_map *map)
 {
        int i;
 
-       set = isl_set_cow(set);
-       if (!set)
+       map = isl_map_cow(map);
+       if (!map)
                return NULL;
-       for (i = 0; i < set->n; ++i) {
-               set->p[i] = isl_basic_set_set_rational(set->p[i]);
-               if (!set->p[i])
+       for (i = 0; i < map->n; ++i) {
+               map->p[i] = isl_basic_map_set_rational(map->p[i]);
+               if (!map->p[i])
                        goto error;
        }
-       return set;
+       return map;
 error:
-       isl_set_free(set);
+       isl_map_free(map);
        return NULL;
 }
 
+__isl_give isl_set *isl_set_set_rational(__isl_take isl_set *set)
+{
+       return isl_map_set_rational(set);
+}
+
 static struct isl_basic_set *isl_basic_set_add_equality(
        struct isl_basic_set *bset, isl_int *c)
 {
@@ -290,6 +305,7 @@ static struct isl_basic_set *wrap_constraints(struct isl_set *set)
                n_ineq += set->p[i]->n_ineq;
        }
        lp = isl_basic_set_alloc(set->ctx, 0, dim * set->n, 0, n_eq, n_ineq);
+       lp = isl_basic_set_set_rational(lp);
        if (!lp)
                return NULL;
        lp_dim = isl_basic_set_n_dim(lp);
@@ -427,6 +443,7 @@ isl_int *isl_set_wrap_facet(__isl_keep isl_set *set,
        if (res == isl_lp_ok) {
                isl_int_neg(num, num);
                isl_seq_combine(facet, num, facet, den, ridge, dim);
+               isl_seq_normalize(ctx, facet, dim);
        }
        isl_int_clear(num);
        isl_int_clear(den);
@@ -785,13 +802,6 @@ error:
        return NULL;
 }
 
-/* Project out final n dimensions using Fourier-Motzkin */
-static struct isl_set *set_project_out(struct isl_ctx *ctx,
-       struct isl_set *set, unsigned n)
-{
-       return isl_set_remove_dims(set, isl_set_n_dim(set) - n, n);
-}
-
 static struct isl_basic_set *convex_hull_0d(struct isl_set *set)
 {
        struct isl_basic_set *convex_hull;
@@ -868,7 +878,7 @@ static struct isl_basic_set *convex_hull_pair_elim(struct isl_basic_set *bset1,
                isl_int_set_si(hull->eq[k][2*(1+dim)+j], 1);
        }
        hull = isl_basic_set_set_rational(hull);
-       hull = isl_basic_set_remove_dims(hull, dim, 2*(1+dim));
+       hull = isl_basic_set_remove_dims(hull, isl_dim_set, dim, 2*(1+dim));
        hull = isl_basic_set_remove_redundancies(hull);
        isl_basic_set_free(bset1);
        isl_basic_set_free(bset2);
@@ -889,7 +899,7 @@ int isl_basic_set_is_bounded(__isl_keep isl_basic_set *bset)
 
        if (!bset)
                return -1;
-       if (isl_basic_set_fast_is_empty(bset))
+       if (isl_basic_set_plain_is_empty(bset))
                return 1;
 
        tab = isl_tab_from_recession_cone(bset, 1);
@@ -1029,7 +1039,7 @@ static struct isl_basic_set *modulo_lineality(struct isl_set *set,
        if (!set || !lin)
                goto error;
        lin_dim = total - lin->n_eq;
-       M = isl_mat_sub_alloc(set->ctx, lin->eq, 0, lin->n_eq, 1, total);
+       M = isl_mat_sub_alloc6(set->ctx, lin->eq, 0, lin->n_eq, 1, total);
        M = isl_mat_left_hermite(M, 0, &U, &Q);
        if (!M)
                goto error;
@@ -1042,7 +1052,7 @@ static struct isl_basic_set *modulo_lineality(struct isl_set *set,
        Q = isl_mat_lin_to_aff(Q);
 
        set = isl_set_preimage(set, U);
-       set = isl_set_remove_dims(set, total - lin_dim, lin_dim);
+       set = isl_set_remove_dims(set, isl_dim_set, total - lin_dim, lin_dim);
        hull = uset_convex_hull(set);
        hull = isl_basic_set_preimage(hull, Q);
 
@@ -1351,6 +1361,9 @@ static struct isl_basic_set *convex_hull_pair(struct isl_basic_set *bset1,
        isl_basic_set *lin, *aff;
        int bounded1, bounded2;
 
+       if (bset1->ctx->opt->convex == ISL_CONVEX_HULL_FM)
+               return convex_hull_pair_elim(bset1, bset2);
+
        aff = isl_set_affine_hull(isl_basic_set_union(isl_basic_set_copy(bset1),
                                                    isl_basic_set_copy(bset2)));
        if (!aff)
@@ -1659,7 +1672,7 @@ static struct isl_basic_set *common_constraints(struct isl_basic_set *hull,
 
        total = isl_dim_total(set->dim);
        for (i = 0; i < set->p[best]->n_ineq; ++i) {
-               constraints[i].c = isl_mat_sub_alloc(hull->ctx,
+               constraints[i].c = isl_mat_sub_alloc6(hull->ctx,
                        set->p[best]->ineq + i, 0, 1, 0, 1 + total);
                if (!constraints[i].c)
                        goto error;
@@ -1806,7 +1819,8 @@ static struct isl_basic_set *uset_convex_hull(struct isl_set *set)
        if (isl_set_n_dim(set) == 1)
                return convex_hull_1d(set);
 
-       if (isl_set_is_bounded(set))
+       if (isl_set_is_bounded(set) &&
+           set->ctx->opt->convex == ISL_CONVEX_HULL_WRAP)
                return uset_convex_hull_wrap(set);
 
        lin = uset_combined_lineality_space(isl_set_copy(set));
@@ -1955,6 +1969,19 @@ struct isl_basic_set *isl_set_convex_hull(struct isl_set *set)
                isl_map_convex_hull((struct isl_map *)set);
 }
 
+__isl_give isl_basic_map *isl_map_polyhedral_hull(__isl_take isl_map *map)
+{
+       isl_basic_map *hull;
+
+       hull = isl_map_convex_hull(map);
+       return isl_basic_map_remove_divs(hull);
+}
+
+__isl_give isl_basic_set *isl_set_polyhedral_hull(__isl_take isl_set *set)
+{
+       return (isl_basic_set *)isl_map_polyhedral_hull((isl_map *)set);
+}
+
 struct sh_data_entry {
        struct isl_hash_table   *table;
        struct isl_tab          *tab;