From 760bb1e4e6bb4c8c51616027ef4645298cc96c79 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Fri, 14 Mar 2008 12:53:20 +0100 Subject: [PATCH] verify.c: extract evalue_optimum from maximize.cc --- maximize.cc | 64 ++++++++++--------------------------------------------------- verify.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++ verify.h | 1 + 3 files changed, 59 insertions(+), 54 deletions(-) diff --git a/maximize.cc b/maximize.cc index 0c7c6ac..6392bbd 100644 --- a/maximize.cc +++ b/maximize.cc @@ -97,54 +97,6 @@ struct check_poly_max_data : public check_EP_data { } }; -static void optimum(Polyhedron *S, int pos, const check_poly_max_data *data, - Value *opt, bool& found, - const struct verify_options *options) -{ - if (!S) { - Value c; - value_init(c); - value_set_double(c, compute_evalue(data->EP, data->cp.z+1)+.25); - if (!found) { - value_assign(*opt, c); - found = true; - } else { - if (options->barvinok->bernstein_optimize == BV_BERNSTEIN_MAX) { - if (value_gt(c, *opt)) - value_assign(*opt, c); - } else { - if (value_lt(c, *opt)) - value_assign(*opt, c); - } - } - value_clear(c); - } else { - Value LB, UB; - int ok; - value_init(LB); - value_init(UB); - ok = !(lower_upper_bounds(1+pos, S, data->cp.z, &LB, &UB)); - assert(ok); - for (; value_le(LB, UB); value_increment(LB, LB)) { - value_assign(data->cp.z[1+pos], LB); - optimum(S->next, pos+1, data, opt, found, options); - } - value_set_si(data->cp.z[1+pos], 0); - value_clear(LB); - value_clear(UB); - } -} - -static void optimum(const check_poly_max_data *data, Value *opt, - const struct verify_options *options) -{ - bool found = false; - for (int i = 0; i < data->n_S; ++i) - if (!emptyQ2(data->S[i])) - optimum(data->S[i], 0, data, opt, found, options); - assert(found); -} - static int check_poly_max(const struct check_poly_data *data, int nparam, Value *z, const struct verify_options *options) @@ -158,14 +110,18 @@ static int check_poly_max(const struct check_poly_data *data, value_init(m); value_init(n); value_init(d); + int sign; - if (options->barvinok->bernstein_optimize == BV_BERNSTEIN_MAX) + if (options->barvinok->bernstein_optimize == BV_BERNSTEIN_MAX) { minmax = "max"; - else + sign = 1; + } else { minmax = "min"; + sign = -1; + } max_data->pl->evaluate(nparam, z, &n, &d); - if (options->barvinok->bernstein_optimize == BV_BERNSTEIN_MAX) + if (sign > 0) mpz_fdiv_q(m, n, d); else mpz_cdiv_q(m, n, d); @@ -188,9 +144,9 @@ static int check_poly_max(const struct check_poly_data *data, printf(")"); } - optimum(max_data, &n, options); + evalue_optimum(max_data, &n, sign); - if (options->barvinok->bernstein_optimize == BV_BERNSTEIN_MAX) + if (sign > 0) ok = value_ge(m, n); else ok = value_le(m, n); @@ -212,7 +168,7 @@ static int check_poly_max(const struct check_poly_data *data, value_print(stderr, VALUE_FMT, z[k]); } fprintf(stderr, ") should be "); - if (options->barvinok->bernstein_optimize == BV_BERNSTEIN_MAX) + if (sign > 0) fprintf(stderr, "greater"); else fprintf(stderr, "smaller"); diff --git a/verify.c b/verify.c index b1ed8b8..10b3390 100644 --- a/verify.c +++ b/verify.c @@ -444,3 +444,51 @@ int check_EP(struct check_EP_data *data, unsigned nvar, unsigned nparam, return ok; } + +static void optimum(Polyhedron *S, int pos, const struct check_EP_data *data, + Value *opt, int *found, int sign) +{ + if (!S) { + Value c; + value_init(c); + value_set_double(c, compute_evalue(data->EP, data->cp.z+1)+.25); + if (!*found) { + value_assign(*opt, c); + *found = 1; + } else { + if (sign > 0) { + if (value_gt(c, *opt)) + value_assign(*opt, c); + } else { + if (value_lt(c, *opt)) + value_assign(*opt, c); + } + } + value_clear(c); + } else { + Value LB, UB; + int ok; + value_init(LB); + value_init(UB); + ok = !(lower_upper_bounds(1+pos, S, data->cp.z, &LB, &UB)); + assert(ok); + for (; value_le(LB, UB); value_increment(LB, LB)) { + value_assign(data->cp.z[1+pos], LB); + optimum(S->next, pos+1, data, opt, found, sign); + } + value_set_si(data->cp.z[1+pos], 0); + value_clear(LB); + value_clear(UB); + } +} + +void evalue_optimum(const struct check_EP_data *data, Value *opt, int sign) +{ + int i; + int found = 0; + + for (i = 0; i < data->n_S; ++i) + if (!emptyQ2(data->S[i])) + optimum(data->S[i], 0, data, opt, &found, sign); + assert(found); +} diff --git a/verify.h b/verify.h index 2e24dcc..461f120 100644 --- a/verify.h +++ b/verify.h @@ -60,6 +60,7 @@ struct check_EP_data { int check_EP(struct check_EP_data *data, unsigned nvar, unsigned nparam, struct verify_options *options); +void evalue_optimum(const struct check_EP_data *data, Value *opt, int sign); #if defined(__cplusplus) } -- 2.11.4.GIT