#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 int add_equality(struct isl_ctx *ctx, struct isl_basic_map *bmap,
Value *constraint)
{
+ 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)
{
+ 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])) {
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(set,
- isl_basic_set_new_from_polylib(ctx, P, nparam, dim));
+ 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(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_basic_map *bmap)
Matrix *M;
Polyhedron *P;
unsigned off;
+ unsigned nparam;
+ unsigned n_in;
+ unsigned n_out;
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 + bmap->n_in + bmap->n_out + bmap->n_div + bmap->nparam + 1);
+ 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);
+ nparam, n_in + n_out, bmap->n_div);
}
P = Constraints2Polyhedron(M, bmap->ctx->MaxRays);
Matrix_Free(M);
next = &(*next)->next;
}
- return R;
+ return R ? R : Empty_Polyhedron(isl_dim_total(map->dim));
}
Polyhedron *isl_basic_set_to_polylib(struct isl_basic_set *bset)