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; }
void KnapCovHandler::separate(ConstSolutionPtr sol, NodePtr, RelaxationPtr rel, CutManager * cmanager, SolutionPoolPtr , bool * , SeparationStatus * status) { // Check integer feasibility of sol, must add cuts if it is not integral. numvars_ = minlp_->getNumVars(); VariableType type; const double * x = sol->getPrimal(); // Is the relaxation solution is integer feasible. bool isintfeas = true; // Iterators for variables. VariableConstIterator it; VariableConstIterator begin = rel->varsBegin(); VariableConstIterator end = rel->varsEnd(); // Temporary variable holder. ConstVariablePtr var; // Value of variable. double value; bool separated = false; UInt n_added = 0; // Check if integrality is satisfied for each integer variable. for (it=begin; it!=end; ++it) { var = *it; type = var->getType(); if (type==Binary || type==Integer) { value = x[var->getIndex()]; if (fabs(value - floor(value + 0.5)) > intTol_) { isintfeas = false; break; } } } if (isintfeas == false) { // We do another check in CoverCutGneerator for integrality, may be we // should eliminate it and use the one above. // Generate cover cuts from current relaxation. CoverCutGeneratorPtr cover = (CoverCutGeneratorPtr) new CoverCutGenerator(rel,sol, env_); // Add cuts to the relaxation by using cut manager. CutVector violatedcuts = cover->getViolatedCutList(); CutIterator itc; CutIterator beginc = violatedcuts.begin(); CutIterator endc = violatedcuts.end(); // Serdar I am not sure if we should add the constraints generated by // addCuts to the constraint vector of knapsack cover handler. // Currently CutMan2::addCuts does not add the cuts to the relaxation formulation. cmanager->addCuts(beginc, endc); cmanager->separate(rel, sol, &separated, &n_added); if (n_added>0) { *status = SepaResolve; } // Update statistics by using return from cover cut generator. ConstCovCutGenStatsPtr covstats = cover->getStats(); // Later put the code below to updateStats function. stats_->knaps += covstats->knaps; stats_->cuts += covstats->cuts; stats_->extended += covstats->extended; stats_->simple += covstats->simple; stats_->gns += covstats->gns; stats_->singlectwo += covstats->singlectwo; } }