* 91893 Orsay, France
*/
+#include <isl_union_map_private.h>
#include <isl_polynomial_private.h>
#include <isl_point_private.h>
-#include <isl_dim.h>
+#include <isl_dim_private.h>
#include <isl_map_private.h>
#include <isl_lp.h>
#include <isl_seq.h>
goto error;
isl_assert(dim->ctx, n >= 0, goto error);
- fold = isl_alloc(dim->ctx, struct isl_qpolynomial_fold,
+ fold = isl_calloc(dim->ctx, struct isl_qpolynomial_fold,
sizeof(struct isl_qpolynomial_fold) +
(n - 1) * sizeof(struct isl_qpolynomial *));
if (!fold)
return NULL;
}
+__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_reset_dim(
+ __isl_take isl_qpolynomial_fold *fold, __isl_take isl_dim *dim)
+{
+ if (!fold || !dim)
+ goto error;
+
+ isl_dim_free(fold->dim);
+ fold->dim = dim;
+
+ return fold;
+error:
+ isl_qpolynomial_fold_free(fold);
+ isl_dim_free(dim);
+ return NULL;
+}
+
int isl_qpolynomial_fold_involves_dims(__isl_keep isl_qpolynomial_fold *fold,
enum isl_dim_type type, unsigned first, unsigned n)
{
return NULL;
}
+__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_substitute_equalities(
+ __isl_take isl_qpolynomial_fold *fold, __isl_take isl_basic_set *eq)
+{
+ int i;
+
+ if (!fold || !eq)
+ goto error;
+
+ fold = isl_qpolynomial_fold_cow(fold);
+ if (!fold)
+ return NULL;
+
+ for (i = 0; i < fold->n; ++i) {
+ fold->qp[i] = isl_qpolynomial_substitute_equalities(fold->qp[i],
+ isl_basic_set_copy(eq));
+ if (!fold->qp[i])
+ goto error;
+ }
+
+ isl_basic_set_free(eq);
+ return fold;
+error:
+ isl_basic_set_free(eq);
+ isl_qpolynomial_fold_free(fold);
+ return NULL;
+}
+
#undef PW
#define PW isl_pw_qpolynomial_fold
#undef EL
#include <isl_pw_templ.c>
+#undef UNION
+#define UNION isl_union_pw_qpolynomial_fold
+#undef PART
+#define PART isl_pw_qpolynomial_fold
+#undef PARTS
+#define PARTS pw_qpolynomial_fold
+
+#include <isl_union_templ.c>
+
__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_empty(enum isl_fold type,
__isl_take isl_dim *dim)
{
if (!dup)
return NULL;
+ dup->n = fold->n;
for (i = 0; i < fold->n; ++i) {
dup->qp[i] = isl_qpolynomial_copy(fold->qp[i]);
if (!dup->qp[i])
return 1;
}
+
+__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_morph(
+ __isl_take isl_qpolynomial_fold *fold, __isl_take isl_morph *morph)
+{
+ int i;
+ isl_ctx *ctx;
+
+ if (!fold || !morph)
+ goto error;
+
+ ctx = fold->dim->ctx;
+ isl_assert(ctx, isl_dim_equal(fold->dim, morph->dom->dim), goto error);
+
+ fold = isl_qpolynomial_fold_cow(fold);
+ if (!fold)
+ goto error;
+
+ isl_dim_free(fold->dim);
+ fold->dim = isl_dim_copy(morph->ran->dim);
+ if (!fold->dim)
+ goto error;
+
+ for (i = 0; i < fold->n; ++i) {
+ fold->qp[i] = isl_qpolynomial_morph(fold->qp[i],
+ isl_morph_copy(morph));
+ if (!fold->qp[i])
+ goto error;
+ }
+
+ isl_morph_free(morph);
+
+ return fold;
+error:
+ isl_qpolynomial_fold_free(fold);
+ isl_morph_free(morph);
+ return NULL;
+}
+
+enum isl_fold isl_qpolynomial_fold_get_type(__isl_keep isl_qpolynomial_fold *fold)
+{
+ if (!fold)
+ return isl_fold_list;
+ return fold->type;
+}
+
+__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_lift(
+ __isl_take isl_qpolynomial_fold *fold, __isl_take isl_dim *dim)
+{
+ int i;
+ isl_ctx *ctx;
+
+ if (!fold || !dim)
+ goto error;
+
+ if (isl_dim_equal(fold->dim, dim)) {
+ isl_dim_free(dim);
+ return fold;
+ }
+
+ fold = isl_qpolynomial_fold_cow(fold);
+ if (!fold)
+ goto error;
+
+ isl_dim_free(fold->dim);
+ fold->dim = isl_dim_copy(dim);
+ if (!fold->dim)
+ goto error;
+
+ for (i = 0; i < fold->n; ++i) {
+ fold->qp[i] = isl_qpolynomial_lift(fold->qp[i],
+ isl_dim_copy(dim));
+ if (!fold->qp[i])
+ goto error;
+ }
+
+ isl_dim_free(dim);
+
+ return fold;
+error:
+ isl_qpolynomial_fold_free(fold);
+ isl_dim_free(dim);
+ return NULL;
+}
+
+int isl_qpolynomial_fold_foreach_qpolynomial(
+ __isl_keep isl_qpolynomial_fold *fold,
+ int (*fn)(__isl_take isl_qpolynomial *qp, void *user), void *user)
+{
+ int i;
+
+ if (!fold)
+ return -1;
+
+ for (i = 0; i < fold->n; ++i)
+ if (fn(isl_qpolynomial_copy(fold->qp[i]), user) < 0)
+ return -1;
+
+ return 0;
+}
+
+__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_move_dims(
+ __isl_take isl_qpolynomial_fold *fold,
+ enum isl_dim_type dst_type, unsigned dst_pos,
+ enum isl_dim_type src_type, unsigned src_pos, unsigned n)
+{
+ int i;
+
+ if (n == 0)
+ return fold;
+
+ fold = isl_qpolynomial_fold_cow(fold);
+ if (!fold)
+ return NULL;
+
+ fold->dim = isl_dim_move(fold->dim, dst_type, dst_pos,
+ src_type, src_pos, n);
+ if (!fold->dim)
+ goto error;
+
+ for (i = 0; i < fold->n; ++i) {
+ fold->qp[i] = isl_qpolynomial_move_dims(fold->qp[i],
+ dst_type, dst_pos, src_type, src_pos, n);
+ if (!fold->qp[i])
+ goto error;
+ }
+
+ return fold;
+error:
+ isl_qpolynomial_fold_free(fold);
+ return NULL;
+}
+
+/* For each 0 <= i < "n", replace variable "first" + i of type "type"
+ * in fold->qp[k] by subs[i].
+ */
+__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_substitute(
+ __isl_take isl_qpolynomial_fold *fold,
+ enum isl_dim_type type, unsigned first, unsigned n,
+ __isl_keep isl_qpolynomial **subs)
+{
+ int i;
+
+ if (n == 0)
+ return fold;
+
+ fold = isl_qpolynomial_fold_cow(fold);
+ if (!fold)
+ return NULL;
+
+ for (i = 0; i < fold->n; ++i) {
+ fold->qp[i] = isl_qpolynomial_substitute(fold->qp[i],
+ type, first, n, subs);
+ if (!fold->qp[i])
+ goto error;
+ }
+
+ return fold;
+error:
+ isl_qpolynomial_fold_free(fold);
+ return NULL;
+}