From 1abc947f259883eec0a6983444fd8855f8c82be7 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Fri, 22 Sep 2006 14:53:08 +0200 Subject: [PATCH] edomain.h: add EDomain_floor abstraction --- edomain.cc | 2 +- edomain.h | 48 +++++++++++++++++++++++++++++++++--------------- lexmin.cc | 33 +++++++++++---------------------- 3 files changed, 45 insertions(+), 38 deletions(-) diff --git a/edomain.cc b/edomain.cc index d079b67..5ae3a9a 100644 --- a/edomain.cc +++ b/edomain.cc @@ -9,7 +9,7 @@ void EDomain::print(FILE *out, char **p) fdostream os(dup(fileno(out))); for (int i = 0; i < floors.size(); ++i) { os << "floor " << i << ": ["; - evalue_print(os, floors[i], p); + evalue_print(os, floors[i]->e, p); os << "]" << endl; } Polyhedron_Print(out, P_VALUE_FMT, D); diff --git a/edomain.h b/edomain.h index 1cbf7ee..2b0f978 100644 --- a/edomain.h +++ b/edomain.h @@ -5,16 +5,40 @@ extern "C" { } #include +struct EDomain_floor { + int refcount; + evalue *e; + + EDomain_floor(const evalue *f) { + e = new evalue; + value_init(e->d); + evalue_copy(e, f); + refcount = 1; + } + ~EDomain_floor() { + free_evalue_refs(e); + delete e; + } + EDomain_floor *ref() { + ++refcount; + return this; + } + static void unref(EDomain_floor* floor) { + if (!--floor->refcount) + delete floor; + } +}; + struct EDomain { Polyhedron *D; Vector *sample; - std::vector floors; + std::vector floors; EDomain(Polyhedron *D) { this->D = Polyhedron_Copy(D); sample = NULL; } - EDomain(Polyhedron *D, std::vectorfloors) { + EDomain(Polyhedron *D, std::vectorfloors) { this->D = Polyhedron_Copy(D); add_floors(floors); sample = NULL; @@ -24,32 +48,26 @@ struct EDomain { add_floors(ED->floors); sample = NULL; } - EDomain(Polyhedron *D, EDomain *ED, std::vectorfloors) { + EDomain(Polyhedron *D, EDomain *ED, std::vectorfloors) { this->D = Polyhedron_Copy(D); add_floors(ED->floors); add_floors(floors); sample = NULL; } - void add_floors(std::vectorfloors) { - for (int i = 0; i < floors.size(); ++i) { - evalue *f = new evalue; - value_init(f->d); - evalue_copy(f, floors[i]); - this->floors.push_back(f); - } + void add_floors(std::vectorfloors) { + for (int i = 0; i < floors.size(); ++i) + this->floors.push_back(floors[i]->ref()); } int find_floor(evalue *needle) { for (int i = 0; i < floors.size(); ++i) - if (eequal(needle, floors[i])) + if (eequal(needle, floors[i]->e)) return i; return -1; } void print(FILE *out, char **p); ~EDomain() { - for (int i = 0; i < floors.size(); ++i) { - free_evalue_refs(floors[i]); - delete floors[i]; - } + for (int i = 0; i < floors.size(); ++i) + EDomain_floor::unref(floors[i]); Polyhedron_Free(D); if (sample) Vector_Free(sample); diff --git a/lexmin.cc b/lexmin.cc index 9c3b93a..a1deb45 100644 --- a/lexmin.cc +++ b/lexmin.cc @@ -812,7 +812,7 @@ max_term* indicator::create_max_term(indicator_term *it) } static Matrix *add_ge_constraint(EDomain *ED, evalue *constraint, - vector& new_floors) + vector& new_floors) { Polyhedron *D = ED->D; evalue mone; @@ -824,12 +824,8 @@ static Matrix *add_ge_constraint(EDomain *ED, evalue *constraint, int i; if (e->x.p->type != fractional) continue; - for (i = 0; i < ED->floors.size(); ++i) - if (eequal(&e->x.p->arr[0], ED->floors[i])) - break; - if (i < ED->floors.size()) - continue; - ++fract; + if (ED->find_floor(&e->x.p->arr[0]) == -1) + ++fract; } int rows = D->NbConstraints+2*fract+1; @@ -871,10 +867,7 @@ static Matrix *add_ge_constraint(EDomain *ED, evalue *constraint, M->p[row+1][1+D->Dimension+fract]); value_decrement(M->p[row+1][cols-1], M->p[row+1][cols-1]); - evalue *arg = new evalue; - value_init(arg->d); - evalue_copy(arg, &e->x.p->arr[0]); - new_floors.push_back(arg); + new_floors.push_back(new EDomain_floor(&e->x.p->arr[0])); ++fract; } else { @@ -1005,17 +998,15 @@ order_sign partial_order::compare(indicator_term *a, indicator_term *b) sign = diff_sign; Matrix *M; - vector new_floors; + vector new_floors; M = add_ge_constraint(D, diff, new_floors); value_set_si(M->p[M->NbRows-1][0], 0); Polyhedron *D2 = Constraints2Polyhedron(M, MaxRays); EDomain *EDeq = new EDomain(D2, D, new_floors); Polyhedron_Free(D2); Matrix_Free(M); - for (int i = 0; i < new_floors.size(); ++i) { - free_evalue_refs(new_floors[i]); - delete new_floors[i]; - } + for (int i = 0; i < new_floors.size(); ++i) + EDomain_floor::unref(new_floors[i]); if (D != ind->D) delete D; @@ -2102,7 +2093,7 @@ static void split_on(const split& sp, EDomain *D, *Dlt = NULL; *Deq = NULL; *Dgt = NULL; - vector new_floors; + vector new_floors; M = add_ge_constraint(D, sp.constraint, new_floors); if (sp.sign == split::lge || sp.sign == split::ge) { M2 = Matrix_Copy(M); @@ -2141,13 +2132,11 @@ static void split_on(const split& sp, EDomain *D, Vector_Copy(D->sample->p, sample->p, D->D->Dimension); value_set_si(sample->p[D->D->Dimension+new_floors.size()], 1); for (int i = 0; i < new_floors.size(); ++i) - compute_evalue(new_floors[i], sample->p, sample->p+D->D->Dimension+i); + compute_evalue(new_floors[i]->e, sample->p, sample->p+D->D->Dimension+i); } - for (int i = 0; i < new_floors.size(); ++i) { - free_evalue_refs(new_floors[i]); - delete new_floors[i]; - } + for (int i = 0; i < new_floors.size(); ++i) + EDomain_floor::unref(new_floors[i]); for (int i = 0; i < 3; ++i) { if (!ED[i]) -- 2.11.4.GIT