bool ValHeap:: upheap(int pos) { if(print) cerr << "in Upheap " << pos << " " << array.size() << endl; if(pos == 0) return false; Val* atp = array[pos]; assert(atp); double merit = atp->fom(); int parPos = parent(pos); Val* par = array[parPos]; double pmerit = par->fom(); if(print) cerr << "merits " << merit << " " << pmerit<< endl; if(merit > pmerit) { array[parPos] = atp; array[pos] = par; if(print) cerr << "Put " << pos << " in " << parPos << endl; upheap(parPos); return true; } else if(print) { cerr << "upheap of " << merit << "stopped by " << parPos << " " << pmerit << endl; } return false; }
void ValHeap:: downHeap(int pos) { if(print) cerr << "downHeap " << pos << endl; if(pos >= unusedPos_-1) return; Val* par = array[pos]; double merit = par->fom(); int lc = left_child(pos); int rc = right_child(pos); int largec; int lcthere = 0; Val* lct = NULL; if(lc < unusedPos_) { lct = array[lc]; if(lct) lcthere = 1; } int rcthere = 0; Val* rct = NULL; if(rc < unusedPos_) { rct = array[rc]; if(rct) rcthere = 1; } if(!lcthere && !rcthere) return; assert(lcthere); if(!rcthere || (lct->fom() > rct->fom())) largec = lc; else largec = rc; Val* largeatp = array[largec]; if(merit >= largeatp->fom()) { if(print) cerr << "downheap of " << merit << " stopped by " << " " << largeatp->fom() << endl; return; } array[pos] = largeatp; array[largec] = par; downHeap(largec); }