bool ParQGHandler::isFeasible(ConstSolutionPtr sol, RelaxationPtr, bool &, double &) { int error=0; double act, cUb; ConstraintPtr c; const double *x = sol->getPrimal(); for (CCIter it=nlCons_.begin(); it!=nlCons_.end(); ++it) { c = *it; act = c->getActivity(x, &error); if (error == 0) { cUb = c->getUb(); if ((act > cUb + solAbsTol_) && (cUb == 0 || act > cUb + fabs(cUb)*solRelTol_)) { #if SPEW logger_->msgStream(LogDebug) << me_ << "constraint " << c->getName() << " violated with violation = " << act - cUb << std::endl; #endif return false; } } else { logger_->msgStream(LogError) << me_ << c->getName() << "constraint not defined at this point."<< std::endl; #if SPEW logger_->msgStream(LogDebug) << me_ << "constraint " << c->getName() << " not defined at this point." << std::endl; #endif return false; } } if (oNl_) { error = 0; relobj_ = x[objVar_->getIndex()]; act = minlp_->getObjValue(x, &error); if (error == 0) { if ((act > relobj_ + solAbsTol_) && (relobj_ == 0 || (act > relobj_ + fabs(relobj_)*solRelTol_))) { #if SPEW logger_->msgStream(LogDebug) << me_ << "objective violated with " << "violation = " << act - relobj_ << std::endl; #endif return false; } } else { logger_->msgStream(LogError) << me_ <<"objective not defined at this point."<< std::endl; return false; } } return true; }
void ParQGHandler::addCut_(const double *nlpx, const double *lpx, ConstraintPtr con, CutManager *cutman, SeparationStatus *status) { int error=0; ConstraintPtr newcon; std::stringstream sstm; double c, lpvio, act, cUb; FunctionPtr f = con->getFunction(); LinearFunctionPtr lf = LinearFunctionPtr(); act = con->getActivity(nlpx, &error); if (error == 0) { linearAt_(f, act, nlpx, &c, &lf, &error); if (error==0) { cUb = con->getUb(); lpvio = std::max(lf->eval(lpx)-cUb+c, 0.0); if ((lpvio>solAbsTol_) && ((cUb-c)==0 || (lpvio>fabs(cUb-c)*solRelTol_))) { #if SPEW logger_->msgStream(LogDebug) << me_ << " linearization of constraint " << con->getName() << " violated at LP solution with violation = " << lpvio << ". OA cut added." << std::endl; #endif ++(stats_->cuts); sstm << "_OAcut_"; sstm << stats_->cuts; *status = SepaResolve; f = (FunctionPtr) new Function(lf); newcon = rel_->newConstraint(f, -INFINITY, cUb-c, sstm.str()); CutPtr cut = (CutPtr) new Cut(minlp_->getNumVars(),f, -INFINITY, cUb-c, false,false); cut->setCons(newcon); cutman->addCutToPool(cut); return; } } } else { logger_->msgStream(LogError) << me_ << "Constraint not defined at" << " this point. "<< std::endl; #if SPEW logger_->msgStream(LogDebug) << me_ << "constraint " << con->getName() << " not defined at this point." << std::endl; #endif } return; }
void ParQGHandler::oaCutToCons_(const double *nlpx, const double *lpx, CutManager *cutman, SeparationStatus *status) { int error=0; ConstraintPtr con; double nlpact, cUb; for (CCIter it = nlCons_.begin(); it != nlCons_.end(); ++it) { con = *it; nlpact = con->getActivity(lpx, &error); if (error == 0) { cUb = con->getUb(); if ((nlpact > cUb + solAbsTol_) && (cUb == 0 || nlpact > cUb+fabs(cUb)*solRelTol_)) { #if SPEW logger_->msgStream(LogDebug) << me_ << " constraint " << con->getName() << " violated at LP solution with violation = " << nlpact - cUb << std::endl; #endif addCut_(nlpx, lpx, con, cutman, status); } else { #if SPEW logger_->msgStream(LogDebug) << me_ << " constraint " << con->getName() << " feasible at LP solution. No OA cut to be added." << std::endl; #endif } } else { logger_->msgStream(LogError) << me_ << "Constraint not defined at" << " this point. "<< std::endl; #if SPEW logger_->msgStream(LogDebug) << me_ << "constraint " << con->getName() << " not defined at this point." << std::endl; #endif } } return; }