isl_qpolynomial_from_aff: create private copy of divs
[platform/upstream/isl.git] / isl_bernstein.c
index 868bb3c..afeccf6 100644 (file)
  * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France
  */
 
-#include <isl_set.h>
-#include <isl_seq.h>
+#include <isl_ctx_private.h>
+#include <isl_map_private.h>
+#include <isl/set.h>
+#include <isl/seq.h>
 #include <isl_morph.h>
 #include <isl_factorization.h>
 #include <isl_vertices_private.h>
@@ -100,7 +102,7 @@ static int is_tight(int *k, int n, int d, isl_cell *cell)
                                return 0;
                        continue;
                }
-               v = cell->vertices->c[cell->id].vertices[n - 1 - i];
+               v = cell->ids[n - 1 - i];
                return vertex_is_integral(cell->vertices->v[v].vertex);
        }
 
@@ -251,12 +253,17 @@ static int bernstein_coefficients_cell(__isl_take isl_cell *cell, void *user)
        isl_qpolynomial **subs;
        isl_pw_qpolynomial_fold *pwf;
        isl_set *dom;
+       isl_ctx *ctx;
 
        nvar = isl_qpolynomial_dim(poly, isl_dim_set) - 1;
-       n_vertices = cell->vertices->c[cell->id].n_vertices;
+       n_vertices = cell->n_vertices;
+
+       ctx = isl_qpolynomial_get_ctx(poly);
+       if (n_vertices > nvar + 1 && ctx->opt->bernstein_triangulate)
+               return isl_cell_foreach_simplex(cell,
+                                           &bernstein_coefficients_cell, user);
 
-       subs = isl_alloc_array(data->poly->dim->ctx, isl_qpolynomial *,
-                               1 + nvar);
+       subs = isl_alloc_array(ctx, isl_qpolynomial *, 1 + nvar);
        if (!subs)
                goto error;
 
@@ -272,7 +279,7 @@ static int bernstein_coefficients_cell(__isl_take isl_cell *cell, void *user)
                c = isl_qpolynomial_var(isl_dim_copy(dim_dst), isl_dim_set,
                                        1 + nvar + i);
                for (j = 0; j < nvar; ++j) {
-                       int k = cell->vertices->c[cell->id].vertices[i];
+                       int k = cell->ids[i];
                        isl_qpolynomial *v;
                        v = vertex_coordinate(cell->vertices->v[k].vertex, j,
                                                isl_dim_copy(dim_param));
@@ -297,10 +304,11 @@ static int bernstein_coefficients_cell(__isl_take isl_cell *cell, void *user)
        data->fold_tight = isl_qpolynomial_fold_empty(data->type, dim_param);
        extract_coefficients(poly, dom, data);
 
-       pwf = isl_pw_qpolynomial_fold_alloc(isl_set_copy(dom), data->fold);
-       data->pwf = isl_pw_qpolynomial_fold_add(data->pwf, pwf);
-       pwf = isl_pw_qpolynomial_fold_alloc(dom, data->fold_tight);
-       data->pwf_tight = isl_pw_qpolynomial_fold_add(data->pwf_tight, pwf);
+       pwf = isl_pw_qpolynomial_fold_alloc(data->type, isl_set_copy(dom),
+                                           data->fold);
+       data->pwf = isl_pw_qpolynomial_fold_fold(data->pwf, pwf);
+       pwf = isl_pw_qpolynomial_fold_alloc(data->type, dom, data->fold_tight);
+       data->pwf_tight = isl_pw_qpolynomial_fold_fold(data->pwf_tight, pwf);
 
        isl_qpolynomial_free(poly);
        isl_cell_free(cell);
@@ -337,7 +345,7 @@ static __isl_give isl_pw_qpolynomial_fold *bernstein_coefficients_base(
                dom = isl_set_from_basic_set(bset);
                if (tight)
                        *tight = 1;
-               return isl_pw_qpolynomial_fold_alloc(dom, fold);
+               return isl_pw_qpolynomial_fold_alloc(data->type, dom, fold);
        }
 
        if (isl_qpolynomial_is_zero(poly)) {
@@ -345,7 +353,7 @@ static __isl_give isl_pw_qpolynomial_fold *bernstein_coefficients_base(
                isl_qpolynomial_fold *fold;
                fold = isl_qpolynomial_fold_alloc(data->type, poly);
                dom = isl_set_from_basic_set(bset);
-               pwf = isl_pw_qpolynomial_fold_alloc(dom, fold);
+               pwf = isl_pw_qpolynomial_fold_alloc(data->type, dom, fold);
                if (tight)
                        *tight = 1;
                return isl_pw_qpolynomial_fold_drop_dims(pwf,
@@ -354,8 +362,8 @@ static __isl_give isl_pw_qpolynomial_fold *bernstein_coefficients_base(
 
        dim = isl_basic_set_get_dim(bset);
        dim = isl_dim_drop(dim, isl_dim_set, 0, nvar);
-       data->pwf = isl_pw_qpolynomial_fold_zero(isl_dim_copy(dim));
-       data->pwf_tight = isl_pw_qpolynomial_fold_zero(dim);
+       data->pwf = isl_pw_qpolynomial_fold_zero(isl_dim_copy(dim), data->type);
+       data->pwf_tight = isl_pw_qpolynomial_fold_zero(dim, data->type);
        data->poly = isl_qpolynomial_homogenize(isl_qpolynomial_copy(poly));
        vertices = isl_basic_set_compute_vertices(bset);
        isl_vertices_foreach_disjoint_cell(vertices,
@@ -378,7 +386,7 @@ static __isl_give isl_pw_qpolynomial_fold *bernstein_coefficients_base(
                return data->pwf_tight;
        }
 
-       data->pwf = isl_pw_qpolynomial_fold_add(data->pwf, data->pwf_tight);
+       data->pwf = isl_pw_qpolynomial_fold_fold(data->pwf, data->pwf_tight);
 
        return data->pwf;
 error:
@@ -528,9 +536,9 @@ int isl_qpolynomial_bound_on_domain_bernstein(__isl_take isl_basic_set *bset,
                pwf = bernstein_coefficients_base(bset, poly, &data, tp);
 
        if (tight)
-               bound->pwf_tight = isl_pw_qpolynomial_fold_add(bound->pwf_tight, pwf);
+               bound->pwf_tight = isl_pw_qpolynomial_fold_fold(bound->pwf_tight, pwf);
        else
-               bound->pwf = isl_pw_qpolynomial_fold_add(bound->pwf, pwf);
+               bound->pwf = isl_pw_qpolynomial_fold_fold(bound->pwf, pwf);
 
        return 0;
 error: