Improved ClearHeap management

This commit is contained in:
Paolo Cignoni 2005-01-19 10:33:50 +00:00
parent 4936947b26
commit 4224284dc4
1 changed files with 26 additions and 1 deletions

View File

@ -22,6 +22,9 @@
****************************************************************************/ ****************************************************************************/
/**************************************************************************** /****************************************************************************
$Log: not supported by cvs2svn $ $Log: not supported by cvs2svn $
Revision 1.12 2004/12/10 01:02:48 cignoni
added an inline and removed loggng
Revision 1.11 2004/12/03 21:14:39 ponchio Revision 1.11 2004/12/03 21:14:39 ponchio
Fixed memory leak... Fixed memory leak...
@ -243,6 +246,7 @@ public:
nPerfmormedOps =0; nPerfmormedOps =0;
while( !GoalReached() && !h.empty()) while( !GoalReached() && !h.empty())
{ {
if(h.size()> m.fn*5 ) ClearHeap();
std::pop_heap(h.begin(),h.end()); std::pop_heap(h.begin(),h.end());
LocModPtrType locMod = h.back().locModPtr; LocModPtrType locMod = h.back().locModPtr;
h.pop_back(); h.pop_back();
@ -264,6 +268,27 @@ public:
return !(h.empty()); return !(h.empty());
} }
// Toglie dallo heap tutti i collassi non up to date
// Chiamata dalla do decimate ogni tanto quando lo heap diventa troppo grande (>fn*3)
void ClearHeap()
{
HeapType::iterator hi;
int sz=h.size();
for(hi=h.begin();hi!=h.end();++hi)
{
if(!(*hi).locModPtr->IsUpToDate())
{
delete (*hi).locModPtr;
*hi=h.back();
h.pop_back();
if(hi==h.end()) break;
--hi;
}
}
printf("\nReduced heap from %7i to %7i (fn %7i) ",sz,h.size(),m.fn);
make_heap(h.begin(),h.end());
}
///initialize for all vertex the temporary mark must call only at the start of decimation ///initialize for all vertex the temporary mark must call only at the start of decimation
///by default it takes the first element in the heap and calls Init (static funcion) of that type ///by default it takes the first element in the heap and calls Init (static funcion) of that type
///of local modification. ///of local modification.
@ -297,7 +322,7 @@ public:
///erase from the heap the operations that are out of date ///erase from the heap the operations that are out of date
void ClearHeap() void ClearHeapOld()
{ {
typename HeapType::iterator hi; typename HeapType::iterator hi;
for(hi=h.begin();hi!=h.end();++hi) for(hi=h.begin();hi!=h.end();++hi)