update isl for change in isl_vertex inspectors
[barvinok.git] / isl_param_util.c
blob294cac1e12afadd393b7830c91772e9fcc321fd9
1 #include <isl_aff_polylib.h>
2 #include <isl_set_polylib.h>
3 #include <isl/vertices.h>
4 #include "isl_param_util.h"
6 static Matrix *expr2vertex(Polyhedron *E, unsigned nvar)
8 int i;
9 Matrix *M;
10 unsigned nparam = E->Dimension - nvar;
11 Value mone;
13 value_init(mone);
14 value_set_si(mone, -1);
15 M = Matrix_Alloc(nvar, nparam + 1 + 1);
16 for (i = 0; i < nvar; ++i) {
17 Vector_Scale(E->Constraint[i] + 1 + nvar, M->p[i],
18 mone, nparam + 1);
19 value_assign(M->p[i][nparam + 1], E->Constraint[i][1 + i]);
21 value_clear(mone);
23 return M;
26 #define INT_BITS (sizeof(unsigned) * 8)
28 static int add_vertex(__isl_take isl_vertex *vertex, void *user)
30 Param_Vertices ***next_V = (Param_Vertices ***) user;
31 Param_Vertices *V;
32 Polyhedron *D;
33 isl_basic_set *dom;
34 isl_multi_aff *expr;
35 isl_ctx *ctx;
37 ctx = isl_vertex_get_ctx(vertex);
39 dom = isl_vertex_get_domain(vertex);
40 D = isl_basic_set_to_polylib(dom);
41 isl_basic_set_free(dom);
43 expr = isl_vertex_get_expr(vertex);
45 V = isl_alloc_type(ctx, Param_Vertices);
46 V->Vertex = isl_multi_aff_to_polylib(expr);
47 V->Domain = Polyhedron2Constraints(D);
48 V->Facets = NULL;
49 V->next = NULL;
51 Polyhedron_Free(D);
52 isl_multi_aff_free(expr);
54 **next_V = V;
55 *next_V = &V->next;
57 isl_vertex_free(vertex);
59 return 0;
62 struct bv_add_chamber_data {
63 Param_Domain **next_D;
64 int vertex_len;
65 Param_Domain *dom;
68 static int add_chamber_vertex(__isl_take isl_vertex *vertex, void *user)
70 int j;
71 struct bv_add_chamber_data *data = (struct bv_add_chamber_data *)user;
72 unsigned v;
74 v = isl_vertex_get_id(vertex);
75 data->dom->F[v / INT_BITS] |= 1u << (INT_BITS - (v % INT_BITS) - 1);
77 isl_vertex_free(vertex);
79 return 0;
82 static int add_chamber(__isl_take isl_cell *cell, void *user)
84 struct bv_add_chamber_data *data = (struct bv_add_chamber_data *)user;
85 isl_ctx *ctx;
86 isl_basic_set *domain;
88 ctx = isl_cell_get_ctx(cell);
90 domain = isl_cell_get_domain(cell);
92 data->dom = isl_alloc_type(ctx, Param_Domain);
93 data->dom->Domain = isl_basic_set_to_polylib(domain);
94 data->dom->F = isl_calloc_array(ctx, unsigned, data->vertex_len);
95 data->dom->next = NULL;
97 isl_basic_set_free(domain);
99 *data->next_D = data->dom;
100 data->next_D = &data->dom->next;
102 isl_cell_foreach_vertex(cell, &add_chamber_vertex, data);
104 isl_cell_free(cell);
106 return 0;
109 Param_Polyhedron *ISL_P2PP(Polyhedron *P, Polyhedron *C,
110 struct barvinok_options *options)
112 int i, j;
113 isl_ctx *ctx = isl_ctx_alloc();
114 isl_space *dim;
115 isl_basic_set *bset, *context;
116 isl_vertices *vertices;
117 unsigned nparam = C->Dimension;
118 unsigned nvar = P->Dimension - nparam;
119 Param_Polyhedron *PP = isl_calloc_type(ctx, Param_Polyhedron);
120 Param_Vertices **next_V;
121 struct bv_add_chamber_data data;
123 dim = isl_space_set_alloc(ctx, nparam, nvar);
124 bset = isl_basic_set_new_from_polylib(P, dim);
125 dim = isl_space_set_alloc(ctx, nparam, 0);
126 context = isl_basic_set_new_from_polylib(C, dim);
128 bset = isl_basic_set_intersect(bset, context);
130 vertices = isl_basic_set_compute_vertices(bset);
131 isl_basic_set_free(bset);
133 PP->Rays = NULL;
134 PP->nbV = isl_vertices_get_n_vertices(vertices);
135 PP->Constraints = Polyhedron2Constraints(P);
137 next_V = &PP->V;
138 isl_vertices_foreach_vertex(vertices, &add_vertex, &next_V);
140 data.next_D = &PP->D;
141 data.vertex_len = (PP->nbV + INT_BITS - 1)/INT_BITS;
142 isl_vertices_foreach_cell(vertices, &add_chamber, &data);
144 isl_vertices_free(vertices);
146 isl_ctx_free(ctx);
148 return PP;