// Implement Handler::getBranches(). Branches CxUnivarHandler::getBranches(BrCandPtr cand, DoubleVector &x, RelaxationPtr , SolutionPoolPtr ) { double minFromBds = 0.1; BrVarCandPtr vcand = boost::dynamic_pointer_cast <BrVarCand> (cand); VariablePtr v = vcand->getVar(); double xval = x[v->getIndex()]; double value = xval; // Make sure branch value is not too close to an end point double len = v->getUb() - v->getLb(); if (value < v->getLb() + minFromBds*len) { value = v->getLb() + minFromBds*len; } else if (value > v->getUb() - minFromBds*len) { value = v->getUb() - minFromBds*len; } // can't branch on something that is at its bounds. if (!(value > v->getLb()+1e-8 && value < v->getUb()-1e-8)) { std::cerr << "Warning! Branching on variable with bounds/value: [" << v->getLb() << " , " << value << " " << v->getUb() << " ]" << std::endl; //assert(value > v->getLb()+1e-8 && value < v->getUb()-1e-8); } Branches branches = (Branches) new BranchPtrVector(); BranchPtr branch = (BranchPtr) new Branch(); VarBoundModPtr mod = (VarBoundModPtr) new VarBoundMod(v, Upper, value); assert(!"add Mod correctly here."); branch->addPMod(mod); branch->setActivity((v->getUb()-value)/len); branches->push_back(branch); branch = (BranchPtr) new Branch(); mod = (VarBoundModPtr) new VarBoundMod(v, Lower, value); assert(!"add Mod correctly here."); branch->addPMod(mod); branch->setActivity((value - v->getLb())/len); branches->push_back(branch); logger_->msgStream(LogDebug2) << "branching on " << v->getName(); logger_->msgStream(LogDebug2) << " <= " << value << " or " << " >= " << value << std::endl; #if defined(DEBUG_CXUNIVARHANDLER) std::cout << "branching on " << v->getName(); std::cout << " <= " << value << " or " << " >= " << value << std::endl; #endif return branches; }
BranchPtr MultilinearTermsHandler::doBranch_(BranchDirection UpOrDown, ConstVariablePtr v, double bvalue) { BranchPtr branch; BoundType lu; VariableType vtype = v->getType(); #if defined(DEBUG_MULTILINEARTERMS_HANDLER) std::cout << "Branching: " << (UpOrDown == DownBranch ? "Down" : "Up") << " at value: " << bvalue << " on: " << std::endl; v->write(std::cout); #endif branch = (BranchPtr) new Branch(); double branching_value = bvalue; // Change bounds on the x var (called v here) if (UpOrDown == DownBranch) { lu = Upper; if (vtype != Continuous) branching_value = floor(bvalue); } else { lu = Lower; if (vtype != Continuous) branching_value = ceil(bvalue); } VarBoundModPtr vmod = (VarBoundModPtr) new VarBoundMod(v, lu, branching_value); assert(!"check whether this needs to be addRMod instead"); branch->addPMod(vmod); branch->setActivity(0.5);// TODO: set this correctly return branch; }