add isl_mat_concat
[platform/upstream/isl.git] / isl_map_polylib.c
index 58848ac..7d4bc44 100644 (file)
@@ -1,6 +1,9 @@
 #include "isl_set.h"
 #include "isl_map.h"
+#include "isl_seq.h"
+#include "isl_set_polylib.h"
 #include "isl_map_polylib.h"
+#include "isl_map_private.h"
 
 static void copy_values_from(isl_int *dst, Value *src, unsigned n)
 {
@@ -39,22 +42,34 @@ static void copy_constraint_to(Value *dst, isl_int *src,
 static int add_equality(struct isl_ctx *ctx, struct isl_basic_map *bmap,
                         Value *constraint)
 {
-       int i = isl_basic_map_alloc_equality(ctx, bmap);
+       unsigned nparam;
+       unsigned n_in;
+       unsigned n_out;
+       int i = isl_basic_map_alloc_equality(bmap);
        if (i < 0)
                return -1;
-       copy_constraint_from(bmap->eq[i], constraint, bmap->nparam,
-                            bmap->n_in + bmap->n_out, bmap->extra);
+       nparam = isl_basic_map_n_param(bmap);
+       n_in = isl_basic_map_n_in(bmap);
+       n_out = isl_basic_map_n_out(bmap);
+       copy_constraint_from(bmap->eq[i], constraint, nparam,
+                            n_in + n_out, bmap->extra);
        return 0;
 }
 
 static int add_inequality(struct isl_ctx *ctx, struct isl_basic_map *bmap,
                         Value *constraint)
 {
-       int i = isl_basic_map_alloc_inequality(ctx, bmap);
+       unsigned nparam;
+       unsigned n_in;
+       unsigned n_out;
+       int i = isl_basic_map_alloc_inequality(bmap);
        if (i < 0)
                return -1;
-       copy_constraint_from(bmap->ineq[i], constraint, bmap->nparam,
-                            bmap->n_in + bmap->n_out, bmap->extra);
+       nparam = isl_basic_map_n_param(bmap);
+       n_in = isl_basic_map_n_in(bmap);
+       n_out = isl_basic_map_n_out(bmap);
+       copy_constraint_from(bmap->ineq[i], constraint, nparam,
+                            n_in + n_out, bmap->extra);
        return 0;
 }
 
@@ -63,7 +78,7 @@ static struct isl_basic_map *copy_constraints(
                        Polyhedron *P)
 {
        int i;
-       unsigned total = bmap->nparam + bmap->n_in + bmap->n_out + bmap->extra;
+       unsigned total = isl_basic_map_total_dim(bmap);
 
        for (i = 0; i < P->NbConstraints; ++i) {
                if (value_zero_p(P->Constraint[i][0])) {
@@ -75,155 +90,167 @@ static struct isl_basic_map *copy_constraints(
                }
        }
        for (i = 0; i < bmap->extra; ++i) {
-               int j = isl_basic_map_alloc_div(ctx, bmap);
+               int j = isl_basic_map_alloc_div(bmap);
                if (j == -1)
                        goto error;
                isl_seq_clr(bmap->div[j], 1+1+total);
        }
        return bmap;
 error:
-       isl_basic_map_free(ctx, bmap);
+       isl_basic_map_free(bmap);
        return NULL;
 }
 
-struct isl_basic_set *isl_basic_set_new_from_polylib(
-                       struct isl_ctx *ctx,
-                       Polyhedron *P, unsigned nparam, unsigned dim)
+struct isl_basic_set *isl_basic_set_new_from_polylib(Polyhedron *P,
+                       struct isl_dim *dim)
 {
+       if (!dim)
+               return NULL;
+       isl_assert(dim->ctx, dim->n_in == 0, return NULL);
+
        return (struct isl_basic_set *)
-               isl_basic_map_new_from_polylib(ctx, P, nparam, 0, dim);
+               isl_basic_map_new_from_polylib(P, dim);
 }
 
-struct isl_basic_map *isl_basic_map_new_from_polylib(
-                       struct isl_ctx *ctx, Polyhedron *P,
-                       unsigned nparam, unsigned in, unsigned out)
+struct isl_basic_map *isl_basic_map_new_from_polylib(Polyhedron *P,
+                       struct isl_dim *dim)
 {
        struct isl_basic_map *bmap;
        unsigned extra;
 
-       isl_assert(ctx, P, return NULL);
-       isl_assert(ctx, P->Dimension >= nparam + in + out, return NULL);
+       if (!dim)
+               return NULL;
+
+       isl_assert(dim->ctx, P, goto error);
+       isl_assert(dim->ctx, P->Dimension >= isl_dim_total(dim), goto error);
 
-       extra = P->Dimension - nparam - in - out;
-       bmap = isl_basic_map_alloc(ctx, nparam, in, out, extra,
+       extra = P->Dimension - isl_dim_total(dim);
+       bmap = isl_basic_map_alloc_dim(dim, extra,
                                        P->NbEq, P->NbConstraints - P->NbEq);
        if (!bmap)
                return NULL;
 
-       return copy_constraints(ctx, bmap, P);
+       bmap = copy_constraints(dim->ctx, bmap, P);
+       bmap = isl_basic_map_simplify(bmap);
+       return isl_basic_map_finalize(bmap);
+error:
+       isl_dim_free(dim);
+       return NULL;
 }
 
-struct isl_set *isl_set_new_from_polylib(struct isl_ctx *ctx,
-                       Polyhedron *D, unsigned nparam, unsigned dim)
+struct isl_set *isl_set_new_from_polylib(Polyhedron *D, struct isl_dim *dim)
 {
        struct isl_set *set = NULL;
        Polyhedron *P;
        int n = 0;
 
+       if (!dim)
+               return NULL;
+       isl_assert(dim->ctx, dim->n_in == 0, goto error);
+
        for (P = D; P; P = P->next)
                ++n;
 
-       set = isl_set_alloc(ctx, nparam, dim, n, ISL_MAP_DISJOINT);
+       set = isl_set_alloc_dim(isl_dim_copy(dim), n, ISL_MAP_DISJOINT);
        if (!set)
-               return NULL;
+               goto error;
 
        for (P = D; P; P = P->next)
-               isl_set_add(ctx, set,
-                   isl_basic_set_new_from_polylib(ctx, P, nparam, dim));
+               isl_set_add(set,
+                   isl_basic_set_new_from_polylib(P, isl_dim_copy(dim)));
+       isl_dim_free(dim);
+       set = isl_set_remove_empty_parts(set);
        return set;
+error:
+       isl_dim_free(dim);
+       return NULL;
 }
 
-struct isl_map *isl_map_new_from_polylib(struct isl_ctx *ctx,
-                       Polyhedron *D,
-                       unsigned nparam, unsigned in, unsigned out)
+struct isl_map *isl_map_new_from_polylib(Polyhedron *D, struct isl_dim *dim)
 {
        struct isl_map *map = NULL;
        Polyhedron *P;
        int n = 0;
 
+       if (!dim)
+               return NULL;
+
        for (P = D; P; P = P->next)
                ++n;
 
-       map = isl_map_alloc(ctx, nparam, in, out, n, ISL_MAP_DISJOINT);
+       map = isl_map_alloc_dim(isl_dim_copy(dim), n, ISL_MAP_DISJOINT);
        if (!map)
-               return NULL;
+               goto error;
 
        for (P = D; P; P = P->next)
-               isl_map_add(ctx, map,
-                       isl_basic_map_new_from_polylib(ctx, P,
-                                                           nparam, in, out));
+               isl_map_add(map,
+                   isl_basic_map_new_from_polylib(P, isl_dim_copy(dim)));
+       isl_dim_free(dim);
+       map = isl_map_remove_empty_parts(map);
        return map;
+error:
+       isl_dim_free(dim);
+       return NULL;
 }
 
-Polyhedron *isl_basic_map_to_polylib(struct isl_ctx *ctx,
-                                               struct isl_basic_map *bmap)
+Polyhedron *isl_basic_map_to_polylib(struct isl_basic_map *bmap)
 {
        int i;
        Matrix *M;
        Polyhedron *P;
        unsigned off;
+       unsigned nparam;
+       unsigned n_in;
+       unsigned n_out;
 
-       M = Matrix_Alloc(bmap->n_eq + bmap->n_ineq + 2*bmap->n_div,
-                1 + bmap->n_in + bmap->n_out + bmap->n_div + bmap->nparam + 1);
+       if (!bmap)
+               return NULL;
+
+       nparam = isl_basic_map_n_param(bmap);
+       n_in = isl_basic_map_n_in(bmap);
+       n_out = isl_basic_map_n_out(bmap);
+       M = Matrix_Alloc(bmap->n_eq + bmap->n_ineq,
+                1 + n_in + n_out + bmap->n_div + nparam + 1);
        for (i = 0; i < bmap->n_eq; ++i) {
                value_set_si(M->p[i][0], 0);
                copy_constraint_to(M->p[i], bmap->eq[i],
-                          bmap->nparam, bmap->n_in + bmap->n_out, bmap->n_div);
+                          nparam, n_in + n_out, bmap->n_div);
        }
        off = bmap->n_eq;
        for (i = 0; i < bmap->n_ineq; ++i) {
                value_set_si(M->p[off+i][0], 1);
                copy_constraint_to(M->p[off+i], bmap->ineq[i],
-                          bmap->nparam, bmap->n_in + bmap->n_out, bmap->n_div);
-       }
-       off += bmap->n_ineq;
-       for (i = 0; i < bmap->n_div; ++i) {
-               unsigned total = bmap->n_in+bmap->n_out+bmap->n_div+bmap->nparam;
-               if (isl_int_is_zero(bmap->div[i][0]))
-                       continue;
-               value_set_si(M->p[off+2*i][0], 1);
-               copy_constraint_to(M->p[off+2*i], bmap->div[i]+1,
-                          bmap->nparam, bmap->n_in + bmap->n_out, bmap->n_div);
-               copy_values_to(M->p[off+2*i]+1+bmap->n_in+bmap->n_out+i,
-                               bmap->div[i], 1);
-               value_oppose(M->p[off+2*i][1+bmap->n_in+bmap->n_out+i],
-                            M->p[off+2*i][1+bmap->n_in+bmap->n_out+i]);
-
-               value_set_si(M->p[off+2*i+1][0], 1);
-               Vector_Oppose(M->p[off+2*i]+1, M->p[off+2*i+1]+1, total+1);
-               value_addto(M->p[off+2*i+1][1+total], M->p[off+2*i+1][1+total],
-                           M->p[off+2*i+1][1+bmap->n_in+bmap->n_out+i]);
-               value_decrement(M->p[off+2*i+1][1+total],
-                               M->p[off+2*i+1][1+total]);
+                          nparam, n_in + n_out, bmap->n_div);
        }
-       P = Constraints2Polyhedron(M, ctx->MaxRays);
+       P = Constraints2Polyhedron(M, bmap->ctx->MaxRays);
        Matrix_Free(M);
 
        return P;
 }
 
-Polyhedron *isl_map_to_polylib(struct isl_ctx *ctx, struct isl_map *map)
+Polyhedron *isl_map_to_polylib(struct isl_map *map)
 {
        int i;
        Polyhedron *R = NULL;
        Polyhedron **next = &R;
 
+       if (!map)
+               return NULL;
+
        for (i = 0; i < map->n; ++i) {
-               *next = isl_basic_map_to_polylib(ctx, map->p[i]);
+               *next = isl_basic_map_to_polylib(map->p[i]);
                next = &(*next)->next;
        }
 
-       return R;
+       return R ? R : Empty_Polyhedron(isl_dim_total(map->dim));
 }
 
-Polyhedron *isl_basic_set_to_polylib(struct isl_ctx *ctx,
-                       struct isl_basic_set *bset)
+Polyhedron *isl_basic_set_to_polylib(struct isl_basic_set *bset)
 {
-       return isl_basic_map_to_polylib(ctx,
-                       (struct isl_basic_map *)bset);
+       return isl_basic_map_to_polylib((struct isl_basic_map *)bset);
 }
 
-Polyhedron *isl_set_to_polylib(struct isl_ctx *ctx, struct isl_set *set)
+Polyhedron *isl_set_to_polylib(struct isl_set *set)
 {
-       return isl_map_to_polylib(ctx, (struct isl_map *)set);
+       return isl_map_to_polylib((struct isl_map *)set);
 }