introduce isl_dim structure for representing shared dimension information
[platform/upstream/isl.git] / isl_map_polylib.c
1 #include "isl_set.h"
2 #include "isl_map.h"
3 #include "isl_seq.h"
4 #include "isl_map_polylib.h"
5 #include "isl_map_private.h"
6
7 static void copy_values_from(isl_int *dst, Value *src, unsigned n)
8 {
9         int i;
10
11         for (i = 0; i < n; ++i)
12                 value_assign(dst[i], src[i]);
13 }
14
15 static void copy_values_to(Value *dst, isl_int *src, unsigned n)
16 {
17         int i;
18
19         for (i = 0; i < n; ++i)
20                 value_assign(dst[i], src[i]);
21 }
22
23 static void copy_constraint_from(isl_int *dst, Value *src,
24                 unsigned nparam, unsigned dim, unsigned extra)
25 {
26         copy_values_from(dst, src+1+dim+extra+nparam, 1);
27         copy_values_from(dst+1, src+1+dim+extra, nparam);
28         copy_values_from(dst+1+nparam, src+1, dim);
29         copy_values_from(dst+1+nparam+dim, src+1+dim, extra);
30 }
31
32 static void copy_constraint_to(Value *dst, isl_int *src,
33                 unsigned nparam, unsigned dim, unsigned extra)
34 {
35         copy_values_to(dst+1+dim+extra+nparam, src, 1);
36         copy_values_to(dst+1+dim+extra, src+1, nparam);
37         copy_values_to(dst+1, src+1+nparam, dim);
38         copy_values_to(dst+1+dim, src+1+nparam+dim, extra);
39 }
40
41 static int add_equality(struct isl_ctx *ctx, struct isl_basic_map *bmap,
42                          Value *constraint)
43 {
44         unsigned nparam;
45         unsigned n_in;
46         unsigned n_out;
47         int i = isl_basic_map_alloc_equality(bmap);
48         if (i < 0)
49                 return -1;
50         nparam = isl_basic_map_n_param(bmap);
51         n_in = isl_basic_map_n_in(bmap);
52         n_out = isl_basic_map_n_out(bmap);
53         copy_constraint_from(bmap->eq[i], constraint, nparam,
54                              n_in + n_out, bmap->extra);
55         return 0;
56 }
57
58 static int add_inequality(struct isl_ctx *ctx, struct isl_basic_map *bmap,
59                          Value *constraint)
60 {
61         unsigned nparam;
62         unsigned n_in;
63         unsigned n_out;
64         int i = isl_basic_map_alloc_inequality(bmap);
65         if (i < 0)
66                 return -1;
67         nparam = isl_basic_map_n_param(bmap);
68         n_in = isl_basic_map_n_in(bmap);
69         n_out = isl_basic_map_n_out(bmap);
70         copy_constraint_from(bmap->ineq[i], constraint, nparam,
71                              n_in + n_out, bmap->extra);
72         return 0;
73 }
74
75 static struct isl_basic_map *copy_constraints(
76                         struct isl_ctx *ctx, struct isl_basic_map *bmap,
77                         Polyhedron *P)
78 {
79         int i;
80         unsigned total = isl_basic_map_total_dim(bmap);
81
82         for (i = 0; i < P->NbConstraints; ++i) {
83                 if (value_zero_p(P->Constraint[i][0])) {
84                         if (add_equality(ctx, bmap, P->Constraint[i]))
85                                 goto error;
86                 } else {
87                         if (add_inequality(ctx, bmap, P->Constraint[i]))
88                                 goto error;
89                 }
90         }
91         for (i = 0; i < bmap->extra; ++i) {
92                 int j = isl_basic_map_alloc_div(bmap);
93                 if (j == -1)
94                         goto error;
95                 isl_seq_clr(bmap->div[j], 1+1+total);
96         }
97         return bmap;
98 error:
99         isl_basic_map_free(bmap);
100         return NULL;
101 }
102
103 struct isl_basic_set *isl_basic_set_new_from_polylib(
104                         struct isl_ctx *ctx,
105                         Polyhedron *P, unsigned nparam, unsigned dim)
106 {
107         return (struct isl_basic_set *)
108                 isl_basic_map_new_from_polylib(ctx, P, nparam, 0, dim);
109 }
110
111 struct isl_basic_map *isl_basic_map_new_from_polylib(
112                         struct isl_ctx *ctx, Polyhedron *P,
113                         unsigned nparam, unsigned in, unsigned out)
114 {
115         struct isl_basic_map *bmap;
116         unsigned extra;
117
118         isl_assert(ctx, P, return NULL);
119         isl_assert(ctx, P->Dimension >= nparam + in + out, return NULL);
120
121         extra = P->Dimension - nparam - in - out;
122         bmap = isl_basic_map_alloc(ctx, nparam, in, out, extra,
123                                         P->NbEq, P->NbConstraints - P->NbEq);
124         if (!bmap)
125                 return NULL;
126
127         bmap = copy_constraints(ctx, bmap, P);
128         bmap = isl_basic_map_simplify(bmap);
129         return isl_basic_map_finalize(bmap);
130 }
131
132 struct isl_set *isl_set_new_from_polylib(struct isl_ctx *ctx,
133                         Polyhedron *D, unsigned nparam, unsigned dim)
134 {
135         struct isl_set *set = NULL;
136         Polyhedron *P;
137         int n = 0;
138
139         for (P = D; P; P = P->next)
140                 ++n;
141
142         set = isl_set_alloc(ctx, nparam, dim, n, ISL_MAP_DISJOINT);
143         if (!set)
144                 return NULL;
145
146         for (P = D; P; P = P->next)
147                 isl_set_add(set,
148                     isl_basic_set_new_from_polylib(ctx, P, nparam, dim));
149         set = isl_set_remove_empty_parts(set);
150         return set;
151 }
152
153 struct isl_map *isl_map_new_from_polylib(struct isl_ctx *ctx,
154                         Polyhedron *D,
155                         unsigned nparam, unsigned in, unsigned out)
156 {
157         struct isl_map *map = NULL;
158         Polyhedron *P;
159         int n = 0;
160
161         for (P = D; P; P = P->next)
162                 ++n;
163
164         map = isl_map_alloc(ctx, nparam, in, out, n, ISL_MAP_DISJOINT);
165         if (!map)
166                 return NULL;
167
168         for (P = D; P; P = P->next)
169                 isl_map_add(map, isl_basic_map_new_from_polylib(ctx, P,
170                                                             nparam, in, out));
171         map = isl_map_remove_empty_parts(map);
172         return map;
173 }
174
175 Polyhedron *isl_basic_map_to_polylib(struct isl_basic_map *bmap)
176 {
177         int i;
178         Matrix *M;
179         Polyhedron *P;
180         unsigned off;
181         unsigned nparam;
182         unsigned n_in;
183         unsigned n_out;
184
185         if (!bmap)
186                 return NULL;
187
188         nparam = isl_basic_map_n_param(bmap);
189         n_in = isl_basic_map_n_in(bmap);
190         n_out = isl_basic_map_n_out(bmap);
191         M = Matrix_Alloc(bmap->n_eq + bmap->n_ineq,
192                  1 + n_in + n_out + bmap->n_div + nparam + 1);
193         for (i = 0; i < bmap->n_eq; ++i) {
194                 value_set_si(M->p[i][0], 0);
195                 copy_constraint_to(M->p[i], bmap->eq[i],
196                            nparam, n_in + n_out, bmap->n_div);
197         }
198         off = bmap->n_eq;
199         for (i = 0; i < bmap->n_ineq; ++i) {
200                 value_set_si(M->p[off+i][0], 1);
201                 copy_constraint_to(M->p[off+i], bmap->ineq[i],
202                            nparam, n_in + n_out, bmap->n_div);
203         }
204         P = Constraints2Polyhedron(M, bmap->ctx->MaxRays);
205         Matrix_Free(M);
206
207         return P;
208 }
209
210 Polyhedron *isl_map_to_polylib(struct isl_map *map)
211 {
212         int i;
213         Polyhedron *R = NULL;
214         Polyhedron **next = &R;
215
216         if (!map)
217                 return NULL;
218
219         for (i = 0; i < map->n; ++i) {
220                 *next = isl_basic_map_to_polylib(map->p[i]);
221                 next = &(*next)->next;
222         }
223
224         return R ? R : Empty_Polyhedron(isl_dim_total(map->dim));
225 }
226
227 Polyhedron *isl_basic_set_to_polylib(struct isl_basic_set *bset)
228 {
229         return isl_basic_map_to_polylib((struct isl_basic_map *)bset);
230 }
231
232 Polyhedron *isl_set_to_polylib(struct isl_set *set)
233 {
234         return isl_map_to_polylib((struct isl_map *)set);
235 }