From d12205e2f0e44fe58a7a6017c1f71e42952572cf Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Fri, 18 Mar 2011 15:27:33 +0100 Subject: [PATCH] isl_pw_qpolynomial_sum: handle existentials in non-wrapped domains again Commit 891e850 (isl_pw_qpolynomial_sum: handle existentials in wrapped domains, Mon Nov 1 11:12:28 2010 +0100) fixed the handling of existentials in wrapped domains, but broke the handle of existentials in other dommains. The total number of variables would be computed before the lifting and would therefore not take into account the number of existentials. Reported-by: Chih-Duo Hong Signed-off-by: Sven Verdoolaege --- summate.c | 15 ++++++++------- tests/pwqp/hong1.pwqp | 1 + tests/pwqp/hong2.pwqp | 1 + 3 files changed, 10 insertions(+), 7 deletions(-) create mode 100644 tests/pwqp/hong1.pwqp create mode 100644 tests/pwqp/hong2.pwqp diff --git a/summate.c b/summate.c index 107cccd..9d900ab 100644 --- a/summate.c +++ b/summate.c @@ -724,7 +724,6 @@ struct barvinok_summate_data { __isl_take isl_qpolynomial *qp; isl_pw_qpolynomial *sum; int n_in; - int nvar; int wrapping; evalue *e; struct evalue_section_array sections; @@ -739,6 +738,7 @@ static int add_basic_guarded_qp(__isl_take isl_basic_set *bset, void *user) isl_pw_qpolynomial *pwqp; int bounded; unsigned nparam = isl_basic_set_dim(bset, isl_dim_param); + unsigned nvar = isl_basic_set_dim(bset, isl_dim_set); isl_dim *dim; if (!bset) @@ -758,7 +758,7 @@ static int add_basic_guarded_qp(__isl_take isl_basic_set *bset, void *user) dim = isl_dim_domain(isl_dim_from_range(dim)); P = isl_basic_set_to_polylib(bset); - tmp = barvinok_sum_over_polytope(P, data->e, data->nvar, + tmp = barvinok_sum_over_polytope(P, data->e, nvar, &data->sections, data->options); Polyhedron_Free(P); assert(tmp); @@ -827,6 +827,7 @@ __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_sum( isl_ctx *ctx; struct barvinok_summate_data data; int options_allocated = 0; + int nvar; data.dim = NULL; data.options = NULL; @@ -834,8 +835,8 @@ __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_sum( if (!pwqp) return NULL; - data.nvar = isl_pw_qpolynomial_dim(pwqp, isl_dim_set); - if (data.nvar == 0) + nvar = isl_pw_qpolynomial_dim(pwqp, isl_dim_set); + if (nvar == 0) return isl_pw_qpolynomial_drop_dims(pwqp, isl_dim_set, 0, 0); data.dim = isl_pw_qpolynomial_get_dim(pwqp); @@ -843,13 +844,13 @@ __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_sum( if (data.wrapping) { data.dim = isl_dim_unwrap(data.dim); data.n_in = isl_dim_size(data.dim, isl_dim_in); - data.nvar = isl_dim_size(data.dim, isl_dim_out); + nvar = isl_dim_size(data.dim, isl_dim_out); data.dim = isl_dim_domain(data.dim); - if (data.nvar == 0) + if (nvar == 0) return isl_pw_qpolynomial_reset_dim(pwqp, data.dim); } else { data.n_in = 0; - data.dim = isl_dim_drop(data.dim, isl_dim_set, 0, data.nvar); + data.dim = isl_dim_drop(data.dim, isl_dim_set, 0, nvar); } data.sum = isl_pw_qpolynomial_zero(isl_dim_copy(data.dim)); diff --git a/tests/pwqp/hong1.pwqp b/tests/pwqp/hong1.pwqp new file mode 100644 index 0000000..f638d91 --- /dev/null +++ b/tests/pwqp/hong1.pwqp @@ -0,0 +1 @@ +{ [y] -> 1 : exists (e0 = [(y)/2]: 2e0 = y and y >= 2 and y <= 10) } diff --git a/tests/pwqp/hong2.pwqp b/tests/pwqp/hong2.pwqp new file mode 100644 index 0000000..9aab7dc --- /dev/null +++ b/tests/pwqp/hong2.pwqp @@ -0,0 +1 @@ +{ [y1,y2] -> 1 : exists x : 1<=x<=5 and 2*x=y1+y2 and 10>=y1,y2>=0} -- 2.11.4.GIT