1 #include <stdio.h>
2 #include <isl_int.h>
3 #include <isl/map.h>
4 #include <isl/mat.h>
5 #include <isl_morph.h>
6 #include <isl/polynomial.h>
7 #include <isl_reordering.h>
8 
9 struct isl_poly {
10 	int ref;
11 	struct isl_ctx *ctx;
12 
13 	int var;
14 };
15 typedef struct isl_poly isl_poly;
16 
17 struct isl_poly_cst {
18 	struct isl_poly poly;
19 	isl_int n;
20 	isl_int d;
21 };
22 typedef struct isl_poly_cst isl_poly_cst;
23 
24 struct isl_poly_rec {
25 	struct isl_poly poly;
26 	int n;
27 
28 	size_t size;
29 	isl_poly *p[];
30 };
31 typedef struct isl_poly_rec isl_poly_rec;
32 
33 /* dim represents the domain space.
34  */
35 struct isl_qpolynomial {
36 	int ref;
37 
38 	isl_space *dim;
39 	struct isl_mat *div;
40 	isl_poly *poly;
41 };
42 
43 struct isl_term {
44 	int ref;
45 
46 	isl_int n;
47 	isl_int d;
48 
49 	isl_space *dim;
50 	struct isl_mat *div;
51 
52 	int pow[1];
53 };
54 
55 struct isl_pw_qpolynomial_piece {
56 	struct isl_set *set;
57 	struct isl_qpolynomial *qp;
58 };
59 
60 struct isl_pw_qpolynomial {
61 	int ref;
62 
63 	isl_space *dim;
64 
65 	int n;
66 
67 	size_t size;
68 	struct isl_pw_qpolynomial_piece p[1];
69 };
70 
71 #undef PW
72 #define PW isl_pw_qpolynomial
73 
74 #include <isl_pw_templ.h>
75 
76 #undef EL
77 #define EL isl_pw_qpolynomial
78 
79 #include <isl_list_templ.h>
80 
81 /* dim represents the domain space.
82  */
83 struct isl_qpolynomial_fold {
84 	int ref;
85 
86 	enum isl_fold type;
87 	isl_space *dim;
88 
89 	int n;
90 
91 	size_t size;
92 	struct isl_qpolynomial *qp[1];
93 };
94 
95 struct isl_pw_qpolynomial_fold_piece {
96 	struct isl_set *set;
97 	struct isl_qpolynomial_fold *fold;
98 };
99 
100 struct isl_pw_qpolynomial_fold {
101 	int ref;
102 
103 	enum isl_fold type;
104 	isl_space *dim;
105 
106 	int n;
107 
108 	size_t size;
109 	struct isl_pw_qpolynomial_fold_piece p[1];
110 };
111 
112 #undef PW
113 #define PW isl_pw_qpolynomial_fold
114 
115 #include <isl_pw_templ.h>
116 
117 #undef EL
118 #define EL isl_pw_qpolynomial_fold
119 
120 #include <isl_list_templ.h>
121 
122 void isl_term_get_num(__isl_keep isl_term *term, isl_int *n);
123 
124 __isl_give isl_poly *isl_poly_zero(struct isl_ctx *ctx);
125 __isl_give isl_poly *isl_poly_copy(__isl_keep isl_poly *poly);
126 __isl_give isl_poly *isl_poly_cow(__isl_take isl_poly *poly);
127 __isl_give isl_poly *isl_poly_dup(__isl_keep isl_poly *poly);
128 __isl_null isl_poly *isl_poly_free(__isl_take isl_poly *poly);
129 __isl_give struct isl_poly *isl_poly_mul(__isl_take struct isl_poly *poly1,
130 	__isl_take struct isl_poly *poly2);
131 
132 isl_bool isl_poly_is_cst(__isl_keep isl_poly *poly);
133 isl_bool isl_poly_is_zero(__isl_keep isl_poly *poly);
134 isl_bool isl_poly_is_one(__isl_keep isl_poly *poly);
135 isl_bool isl_poly_is_negone(__isl_keep isl_poly *poly);
136 __isl_keep isl_poly_cst *isl_poly_as_cst(__isl_keep isl_poly *poly);
137 __isl_keep isl_poly_rec *isl_poly_as_rec(__isl_keep isl_poly *poly);
138 
139 __isl_give isl_poly *isl_poly_sum(__isl_take isl_poly *poly1,
140 	__isl_take isl_poly *poly2);
141 __isl_give struct isl_poly *isl_poly_mul_isl_int(
142 	__isl_take isl_poly *poly, isl_int v);
143 
144 __isl_give isl_qpolynomial *isl_qpolynomial_alloc(__isl_take isl_space *space,
145 	unsigned n_div, __isl_take isl_poly *poly);
146 __isl_give isl_qpolynomial *isl_qpolynomial_cow(__isl_take isl_qpolynomial *qp);
147 __isl_give isl_qpolynomial *isl_qpolynomial_dup(__isl_keep isl_qpolynomial *qp);
148 
149 __isl_give isl_qpolynomial *isl_qpolynomial_cst_on_domain(
150 	__isl_take isl_space *domain,
151 	isl_int v);
152 __isl_give isl_qpolynomial *isl_qpolynomial_rat_cst_on_domain(
153 	__isl_take isl_space *domain, const isl_int n, const isl_int d);
154 __isl_give isl_qpolynomial *isl_qpolynomial_var_pow_on_domain(
155 	__isl_take isl_space *domain,
156 	int pos, int power);
157 isl_bool isl_qpolynomial_is_one(__isl_keep isl_qpolynomial *qp);
158 isl_bool isl_qpolynomial_is_affine(__isl_keep isl_qpolynomial *qp);
159 isl_bool isl_qpolynomial_is_cst(__isl_keep isl_qpolynomial *qp,
160 	isl_int *n, isl_int *d);
161 
162 unsigned isl_qpolynomial_domain_offset(__isl_keep isl_qpolynomial *qp,
163 	enum isl_dim_type type);
164 
165 __isl_give isl_qpolynomial *isl_qpolynomial_add_on_domain(
166 	__isl_keep isl_set *dom,
167 	__isl_take isl_qpolynomial *qp1,
168 	__isl_take isl_qpolynomial *qp2);
169 
170 int isl_qpolynomial_plain_cmp(__isl_keep isl_qpolynomial *qp1,
171 	__isl_keep isl_qpolynomial *qp2);
172 
173 int isl_qpolynomial_degree(__isl_keep isl_qpolynomial *poly);
174 __isl_give isl_qpolynomial *isl_qpolynomial_coeff(
175 	__isl_keep isl_qpolynomial *poly,
176 	enum isl_dim_type type, unsigned pos, int deg);
177 
178 __isl_give isl_vec *isl_qpolynomial_extract_affine(
179 	__isl_keep isl_qpolynomial *qp);
180 __isl_give isl_qpolynomial *isl_qpolynomial_from_affine(
181 	__isl_take isl_space *space, isl_int *f, isl_int denom);
182 
183 __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_cow(
184 	__isl_take isl_pw_qpolynomial *pwqp);
185 
186 __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add_piece(
187 	__isl_take isl_pw_qpolynomial *pwqp,
188 	__isl_take isl_set *set, __isl_take isl_qpolynomial *qp);
189 int isl_pw_qpolynomial_is_one(__isl_keep isl_pw_qpolynomial *pwqp);
190 
191 __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_project_out(
192 	__isl_take isl_pw_qpolynomial *pwqp,
193 	enum isl_dim_type type, unsigned first, unsigned n);
194 
195 __isl_give isl_val *isl_qpolynomial_opt_on_domain(
196 	__isl_take isl_qpolynomial *qp, __isl_take isl_set *set, int max);
197 
198 enum isl_fold isl_fold_type_negate(enum isl_fold type);
199 
200 __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_cow(
201 	__isl_take isl_qpolynomial_fold *fold);
202 __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_dup(
203 	__isl_keep isl_qpolynomial_fold *fold);
204 
205 __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_cow(
206 	__isl_take isl_pw_qpolynomial_fold *pwf);
207 
208 __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_add_on_domain(
209 	__isl_keep isl_set *set,
210 	__isl_take isl_qpolynomial_fold *fold1,
211 	__isl_take isl_qpolynomial_fold *fold2);
212 __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_fold_on_domain(
213 	__isl_keep isl_set *set,
214 	__isl_take isl_qpolynomial_fold *fold1,
215 	__isl_take isl_qpolynomial_fold *fold2);
216 
217 int isl_qpolynomial_fold_plain_cmp(__isl_keep isl_qpolynomial_fold *fold1,
218 	__isl_keep isl_qpolynomial_fold *fold2);
219 
220 __isl_give isl_val *isl_qpolynomial_fold_opt_on_domain(
221 	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_set *set, int max);
222 
223 isl_bool isl_pw_qpolynomial_fold_covers(
224 	__isl_keep isl_pw_qpolynomial_fold *pwf1,
225 	__isl_keep isl_pw_qpolynomial_fold *pwf2);
226 
227 __isl_give isl_qpolynomial *isl_qpolynomial_morph_domain(
228 	__isl_take isl_qpolynomial *qp, __isl_take isl_morph *morph);
229 __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_morph_domain(
230 	__isl_take isl_pw_qpolynomial *pwqp, __isl_take isl_morph *morph);
231 __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_morph_domain(
232 	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_morph *morph);
233 __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_morph_domain(
234 	__isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_morph *morph);
235 
236 __isl_give isl_qpolynomial *isl_qpolynomial_lift(__isl_take isl_qpolynomial *qp,
237 	__isl_take isl_space *space);
238 __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_lift(
239 	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_space *space);
240 
241 __isl_give isl_qpolynomial *isl_qpolynomial_substitute_equalities(
242 	__isl_take isl_qpolynomial *qp, __isl_take isl_basic_set *eq);
243 __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_substitute_equalities(
244 	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_basic_set *eq);
245 __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_gist(
246 	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_set *context);
247 
248 __isl_give isl_qpolynomial *isl_qpolynomial_realign_domain(
249 	__isl_take isl_qpolynomial *qp, __isl_take isl_reordering *r);
250 __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_realign_domain(
251 	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_reordering *r);
252 __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_realign_domain(
253 	__isl_take isl_pw_qpolynomial *pwqp, __isl_take isl_reordering *r);
254 __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_realign_domain(
255 	__isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_reordering *r);
256 
257 __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_reset_space(
258 	__isl_take isl_pw_qpolynomial *pwqp, __isl_take isl_space *space);
259 __isl_give isl_qpolynomial *isl_qpolynomial_reset_domain_space(
260 	__isl_take isl_qpolynomial *qp, __isl_take isl_space *space);
261 __isl_give isl_qpolynomial *isl_qpolynomial_reset_space_and_domain(
262 	__isl_take isl_qpolynomial *qp, __isl_take isl_space *space,
263 	__isl_take isl_space *domain);
264 __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_reset_domain_space(
265 	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_space *space);
266 __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_reset_space_and_domain(
267 	__isl_take isl_qpolynomial_fold *fold, __isl_take isl_space *space,
268 	__isl_take isl_space *domain);
269 __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_reset_domain_space(
270 	__isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_space *space);
271 
272 __isl_give isl_val *isl_qpolynomial_get_den(__isl_keep isl_qpolynomial *qp);
273 __isl_give isl_qpolynomial *isl_qpolynomial_add_isl_int(
274 	__isl_take isl_qpolynomial *qp, isl_int v);
275 __isl_give isl_qpolynomial *isl_qpolynomial_mul_isl_int(
276 	__isl_take isl_qpolynomial *qp, isl_int v);
277 __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_mul_isl_int(
278 	__isl_take isl_pw_qpolynomial *pwqp, isl_int v);
279 
280 __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale(
281 	__isl_take isl_qpolynomial_fold *fold, isl_int v);
282 
283 __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_mul_isl_int(
284 	__isl_take isl_qpolynomial_fold *fold, isl_int v);
285 __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_mul_isl_int(
286 	__isl_take isl_pw_qpolynomial_fold *pwf, isl_int v);
287 __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_mul_isl_int(
288 	__isl_take isl_union_pw_qpolynomial *upwqp, isl_int v);
289 __isl_give isl_union_pw_qpolynomial_fold *
290 isl_union_pw_qpolynomial_fold_mul_isl_int(
291 	__isl_take isl_union_pw_qpolynomial_fold *upwf, isl_int v);
292