#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)
{
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;
}
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])) {
}
}
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);
}