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