/** pop will advance the \c next pointer among the siblings on the top and
	then moves the top to its correct position. #realpop is the method
	that actually removes the element from the heap */
    inline void pop() {
	CoinTreeSiblings* s = candidateList_.front();
	if (!s->advanceNode()) {
	    realpop();
	    delete s;
	} else {
	    fixTop();
	}
	--size_;
    }
Example #2
0
// Remove the top node from the heap
void
CbcTree::pop()
{
#ifdef JJF_ZERO
    std::pop_heap(nodes_.begin(), nodes_.end(), comparison_);
    nodes_.pop_back();
#else
if (nodes_.size()) {
    //CbcNode* s = nodes_.front();
    realpop();
    //delete s;
}
assert (nodes_.size() >= 0);
#endif
}
    virtual void fixTop() {
	CoinTreeSiblings* s = top();
	realpop();
	push(s, false);
    }
Example #4
0
// Gets best node and takes off heap
CbcNode *
CbcTree::bestNode(double cutoff)
{
    CbcNode * best = NULL;
    while (!best && nodes_.size()) {
        best = nodes_.front();
        if (best)
            assert(best->objectiveValue() != COIN_DBL_MAX && best->nodeInfo());
        if (best && best->objectiveValue() != COIN_DBL_MAX && best->nodeInfo())
            assert (best->nodeInfo()->numberBranchesLeft());
        if (best && best->objectiveValue() >= cutoff) {
            // double check in case node can change its mind!
            best->checkIsCutoff(cutoff);
        }
        if (!best || best->objectiveValue() >= cutoff) {
#ifdef JJF_ZERO
            // take off
            std::pop_heap(nodes_.begin(), nodes_.end(), comparison_);
            nodes_.pop_back();
            delete best;
            best = NULL;
#else
// let code get rid of it
assert (best);
#endif
        }
    }
    // switched off for now
    if (best && comparison_.test_->fullScan() && false) {
        CbcNode * saveBest = best;
        int n = nodes_.size();
        int iBest = -1;
        for (int i = 0; i < n; i++) {
            // temp
            assert (nodes_[i]);
            assert (nodes_[i]->nodeInfo());
            if (nodes_[i] && nodes_[i]->objectiveValue() != COIN_DBL_MAX && nodes_[i]->nodeInfo())
                assert (nodes_[i]->nodeInfo()->numberBranchesLeft());
            if (nodes_[i] && nodes_[i]->objectiveValue() < cutoff
                    && comparison_.alternateTest(best, nodes_[i])) {
                best = nodes_[i];
                iBest = i;
            }
        }
        if (best == saveBest) {
            // can pop
            // take off
            std::pop_heap(nodes_.begin(), nodes_.end(), comparison_);
            nodes_.pop_back();
        } else {
            // make impossible
            nodes_[iBest] = NULL;
        }
    } else if (best) {
        // take off
#ifdef JJF_ZERO
        std::pop_heap(nodes_.begin(), nodes_.end(), comparison_);
        nodes_.pop_back();
#else
realpop();
#endif
    }
#ifdef DEBUG_CBC_HEAP
    if (best) {
        int n = nodes_.size();
        bool good = true;
        for (int i = 0; i < n; i++) {
            // temp
            assert (nodes_[i]);
            if (!comparison_.compareNodes(nodes_[i], best)) {
                good = false;
                CbcNode * x = nodes_[i];
                printf("i=%d x is better nun %d depth %d obj %g, best nun %d depth %d obj %g\n", i,
                       x->numberUnsatisfied(), x->depth(), x->objectiveValue(),
                       best->numberUnsatisfied(), best->depth(), best->objectiveValue());
            }
        }
        if (!good) {
            // compare best to all
            int i;
            for (i = 0; i < n; i++) {
                CbcNode * x = nodes_[i];
                printf("i=%d x is nun %d depth %d obj %g", i,
                       x->numberUnsatisfied(), x->depth(), x->objectiveValue());
                if (!comparison_.compareNodes(x, best)) {
                    printf(" - best is worse!\n");
                } else {
                    printf("\n");
                }
            }
            // Now compare amongst rest
            for (i = 0; i < n; i++) {
                CbcNode * x = nodes_[i];
                printf("For i=%d ", i);
                for (int j = i + 1; j < n; j++) {
                    CbcNode * y = nodes_[j];
                    if (!comparison_.compareNodes(x, y)) {
                        printf(" b %d", j);
                    } else {
                        printf(" w %d", j);
                    }
                }
                printf("\n");
            }
            assert(good);
        }
    }
#endif
    if (best)
        best->setOnTree(false);
    return best;
}