void ParQGHandler::oaCutToObj_(const double *nlpx, const double *lpx, CutManager *, SeparationStatus *status) { if (oNl_) { int error=0; FunctionPtr f; double c, vio, act; ConstraintPtr newcon; std::stringstream sstm; ObjectivePtr o = minlp_->getObjective(); act = o->eval(lpx, &error); if (error == 0) { vio = std::max(act-relobj_, 0.0); if ((vio > solAbsTol_) && (relobj_ == 0 || vio > fabs(relobj_)*solRelTol_)) { #if SPEW logger_->msgStream(LogDebug) << me_ << " objective violated at LP " << " solution with violation = " << vio << std::endl; #endif act = o->eval(nlpx, &error); if (error == 0) { f = o->getFunction(); LinearFunctionPtr lf = LinearFunctionPtr(); linearAt_(f, act, nlpx, &c, &lf, &error); if (error == 0) { vio = std::max(c+lf->eval(lpx)-relobj_, 0.0); if ((vio > solAbsTol_) && ((relobj_-c)==0 || vio > fabs(relobj_-c)*solRelTol_)) { #if SPEW logger_->msgStream(LogDebug) << me_ << "linearization of " "objective violated at LP solution with violation = " << vio << ". OA cut added." << std::endl; #endif ++(stats_->cuts); sstm << "_OAObjcut_"; sstm << stats_->cuts; lf->addTerm(objVar_, -1.0); *status = SepaResolve; f = (FunctionPtr) new Function(lf); newcon = rel_->newConstraint(f, -INFINITY, -1.0*c, sstm.str()); } } } } else { #if SPEW logger_->msgStream(LogDebug) << me_ << " objective feasible at LP " << " solution. No OA cut to be added." << std::endl; #endif } } else { logger_->msgStream(LogError) << me_ << " objective not defined at this solution point." << std::endl; #if SPEW logger_->msgStream(LogDebug) << me_ << " objective not defined at this " << " point." << std::endl; #endif } } return; }
void ParQGHandler::addInitLinearX_(const double *x) { int error=0; FunctionPtr f; double c, act, cUb; std::stringstream sstm; ConstraintPtr con, newcon; LinearFunctionPtr lf = LinearFunctionPtr(); for (CCIter it=nlCons_.begin(); it!=nlCons_.end(); ++it) { con = *it; act = con->getActivity(x, &error); if (error == 0) { f = con->getFunction(); linearAt_(f, act, x, &c, &lf, &error); if (error == 0) { cUb = con->getUb(); #if USE_OPENMP sstm << "Thr_" << omp_get_thread_num(); #endif ++(stats_->cuts); sstm << "_OAcut_"; sstm << stats_->cuts; sstm << "_AtRoot"; f = (FunctionPtr) new Function(lf); newcon = rel_->newConstraint(f, -INFINITY, cUb-c, sstm.str()); sstm.str(""); } } else { logger_->msgStream(LogError) << me_ << "Constraint" << con->getName() << " is not defined at this point." << std::endl; #if SPEW logger_->msgStream(LogDebug) << me_ << "constraint " << con->getName() << " is not defined at this point." << std::endl; #endif } } if (oNl_) { error = 0; ObjectivePtr o = minlp_->getObjective(); act = o->eval(x, &error); if (error==0) { ++(stats_->cuts); sstm << "_OAObjcut_"; sstm << stats_->cuts; sstm << "_AtRoot"; f = o->getFunction(); linearAt_(f, act, x, &c, &lf, &error); if (error == 0) { lf->addTerm(objVar_, -1.0); f = (FunctionPtr) new Function(lf); newcon = rel_->newConstraint(f, -INFINITY, -1.0*c, sstm.str()); } } else { logger_->msgStream(LogError) << me_ << "Objective not defined at this point." << std::endl; #if SPEW logger_->msgStream(LogDebug) << me_ << "Objective not defined at this point." << std::endl; #endif } } return; }