void SPxSolver::computeTest() { METHOD( "SPxSolver::computeTest()" ); const SPxBasis::Desc& ds = desc(); Real pricingTol = leavetol(); infeasibilitiesCo.clear(); int ninfeasibilities = 0; for(int i = 0; i < coDim(); ++i) { SPxBasis::Desc::Status stat = ds.status(i); if(isBasic(stat)) theTest[i] = 0.0; else { theTest[i] = test(i, stat); if( remainingRoundsEnterCo == 0 ) { if( theTest[i] < -pricingTol ) { assert(infeasibilitiesCo.size() < infeasibilitiesCo.max()); infeasibilitiesCo.addIdx(i); isInfeasibleCo[i] = true; ++ninfeasibilities; } else isInfeasibleCo[i] = false; if( ninfeasibilities > sparsityThresholdEnterCo ) { MSG_INFO2( spxout << "IENTER04 too many infeasibilities for sparse pricing" << std::endl; ) remainingRoundsEnterCo = DENSEROUNDS; sparsePricingEnterCo = false; ninfeasibilities = 0; } } }
/* This methods assumes correctly setup vectors |pVec| and |coPvec| and bound vectors for leaving simplex. Then it checks all values of |pVec| and |coPvec| to obey these bounds and enlarges them if neccessary. */ void SPxSolver::shiftPvec() { METHOD( "SPxSolver::shiftPvec()" ); /* the allowed tolerance is (rep() == ROW) ? feastol() : opttol() because thePvec is the primal vector in ROW and the * dual vector in COLUMN representation; this is equivalent to leavetol() */ Random mult(10.0 * leavetol(), 100.0 * leavetol()); Real allow = leavetol() - epsilon(); int i, tmp; assert(type() == LEAVE); assert(allow > 0.0); for (i = dim() - 1; i >= 0; --i) { tmp = !isBasic(coId(i)); if ((*theCoUbound)[i] + allow <= (*theCoPvec)[i] && tmp) { if ((*theCoUbound)[i] != (*theCoLbound)[i]) shiftUCbound(i, (*theCoPvec)[i] + Real(mult)); else { shiftUCbound(i, (*theCoPvec)[i]); (*theCoLbound)[i] = (*theCoUbound)[i]; } } else if ((*theCoLbound)[i] - allow >= (*theCoPvec)[i] && tmp) { if ((*theCoUbound)[i] != (*theCoLbound)[i]) shiftLCbound(i, (*theCoPvec)[i] - Real(mult)); else { shiftLCbound(i, (*theCoPvec)[i]); (*theCoUbound)[i] = (*theCoLbound)[i]; } } } for (i = coDim() - 1; i >= 0; --i) { tmp = !isBasic(id(i)); if ((*theUbound)[i] + allow <= (*thePvec)[i] && tmp) { if ((*theUbound)[i] != (*theLbound)[i]) shiftUPbound(i, (*thePvec)[i] + Real(mult)); else { shiftUPbound(i, (*thePvec)[i]); (*theLbound)[i] = (*theUbound)[i]; } } else if ((*theLbound)[i] - allow >= (*thePvec)[i] && tmp) { if ((*theUbound)[i] != (*theLbound)[i]) shiftLPbound(i, (*thePvec)[i] - Real(mult)); else { shiftLPbound(i, (*thePvec)[i]); (*theUbound)[i] = (*theLbound)[i]; } } } #ifndef NDEBUG testBounds(); MSG_DEBUG( spxout << "DSHIFT02 shiftPvec: OK" << std::endl; ) #endif }