double CbcGeneralBranchingObject::branch() { double cutoff = model_->getCutoff(); //printf("GenB %x whichNode %d numberLeft %d which %d\n", // this,whichNode_,numberBranchesLeft(),branchIndex()); if (whichNode_ < 0) { assert (node_); bool applied = false; while (numberBranchesLeft()) { int which = branchIndex(); decrementNumberBranchesLeft(); CbcSubProblem * thisProb = subProblems_ + which; if (thisProb->objectiveValue_ < cutoff) { //printf("branch %x (sub %x) which now %d\n",this, // subProblems_,which); OsiSolverInterface * solver = model_->solver(); thisProb->apply(solver); OsiClpSolverInterface * clpSolver = dynamic_cast<OsiClpSolverInterface *> (solver); assert (clpSolver); // Move status to basis clpSolver->setWarmStart(NULL); //ClpSimplex * simplex = clpSolver->getModelPtr(); node_->setObjectiveValue(thisProb->objectiveValue_); node_->setSumInfeasibilities(thisProb->sumInfeasibilities_); node_->setNumberUnsatisfied(thisProb->numberInfeasibilities_); applied = true; doingDoneBranch = true; break; } else if (numberBranchesLeft()) { node_->nodeInfo()->branchedOn() ; } } if (!applied) { // no good one node_->setObjectiveValue(cutoff + 1.0e20); node_->setSumInfeasibilities(1.0); node_->setNumberUnsatisfied(1); assert (whichNode_ < 0); } } else { decrementNumberBranchesLeft(); CbcSubProblem * thisProb = subProblems_ + whichNode_; assert (thisProb->objectiveValue_ < cutoff); OsiSolverInterface * solver = model_->solver(); thisProb->apply(solver); //OsiClpSolverInterface * clpSolver //= dynamic_cast<OsiClpSolverInterface *> (solver); //assert (clpSolver); // Move status to basis //clpSolver->setWarmStart(NULL); } return 0.0; }
double CbcOneGeneralBranchingObject::branch() { assert (numberBranchesLeft()); decrementNumberBranchesLeft(); assert (!numberBranchesLeft()); object_->setWhichNode(whichOne_); object_->branch(); return 0.0; }
double CbcLinkBranchingObject::branch() { decrementNumberBranchesLeft(); int numberMembers = set_->numberMembers(); int numberLinks = set_->numberLinks(); const double * weights = set_->weights(); const int * which = set_->which(); OsiSolverInterface * solver = model_->solver(); //const double * lower = solver->getColLower(); //const double * upper = solver->getColUpper(); // *** for way - up means fix all those in down section if (way_<0) { int i; for ( i=0;i<numberMembers;i++) { if (weights[i] > separator_) break; } assert (i<numberMembers); int base=i*numberLinks;; for (;i<numberMembers;i++) { for (int k=0;k<numberLinks;k++) { int iColumn = which[base+k]; solver->setColUpper(iColumn,0.0); } base += numberLinks; } way_=1; // Swap direction } else { int i; int base=0; for ( i=0;i<numberMembers;i++) { if (weights[i] >= separator_) { break; } else { for (int k=0;k<numberLinks;k++) { int iColumn = which[base+k]; solver->setColUpper(iColumn,0.0); } base += numberLinks; } } assert (i<numberMembers); way_=-1; // Swap direction } return 0.0; }
/* Perform a dummy branch */ double CbcDummyBranchingObject::branch() { decrementNumberBranchesLeft(); return 0.0; }