Changeset 2293 for trunk


Ignore:
Timestamp:
Dec 13, 2017 10:44:06 AM (22 months ago)
Author:
forrest
Message:

change infeasibility checks

Location:
trunk/Clp/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Clp/src/ClpSimplexDual.cpp

    r2289 r2293  
    500500              (moreSpecialOptions_&256)==0 &&
    501501              ((progress_.lastObjective(0)<-1.0e10 &&
    502                 progress_.lastObjective(1)>-1.0e5))) {
     502-               progress_.lastObjective(1)>-1.0e5)||sumPrimalInfeasibilities_>1.0e10*smallestPrimalInfeasibility)) {
    503503            // problems - try primal
    504504            problemStatus_=10;
     
    19241924                         // If we have just factorized and infeasibility reasonable say infeas
    19251925                         double dualTest = ((specialOptions_ & 4096) != 0) ? 1.0e8 : 1.0e13;
     1926                         // but if none at fake bounds
     1927                         if (!checkFakeBounds())
     1928                           dualTest=0.0;
    19261929                         if (((specialOptions_ & 4096) != 0 || bestPossiblePivot < 1.0e-11) && dualBound_ > dualTest) {
    19271930                              double testValue = 1.0e-4;
     
    33713374          return 0;
    33723375     }
     3376}
     3377// Just checks if any fake bounds active - if so returns number
     3378int
     3379ClpSimplexDual::checkFakeBounds() const
     3380{
     3381  int numberActive = 0;
     3382  for (int iSequence = 0; iSequence < numberRows_ + numberColumns_; iSequence++) {
     3383    switch(getStatus(iSequence)) {
     3384     
     3385    case basic:
     3386    case ClpSimplex::isFixed:
     3387      break;
     3388    case isFree:
     3389    case superBasic:
     3390      break;
     3391    case atUpperBound:
     3392        if ((getFakeBound(iSequence)&2)!=0)
     3393          numberActive++;
     3394      break;
     3395    case atLowerBound:
     3396      if ((getFakeBound(iSequence)&1)!=0)
     3397        numberActive++;
     3398      break;
     3399    }
     3400  }
     3401  return numberActive;
    33733402}
    33743403#if ABOCA_LITE
     
    71237152
    71247153     int iRow, iColumn;
    7125      int maxPass = maximumIterations();
     7154     int maxPass = maximumIterations()/10;
    71267155     while (problemStatus_ < 0) {
    71277156          // clear
     
    71637192          // Say good factorization
    71647193          factorType = 1;
     7194          // but if large errors - probably not very useful
     7195          if (maxPass>0&&(largestDualError_>0.001||largestPrimalError_>0.001))
     7196            maxPass=-5;
    71657197          maxPass--;
    71667198          if (maxPass < -10) {
  • trunk/Clp/src/ClpSimplexDual.hpp

    r2259 r2293  
    246246     int changeBounds(int initialize, CoinIndexedVector * outputArray,
    247247                      double & changeCost);
     248     /// Just checks if any fake bounds active - if so returns number
     249     int checkFakeBounds() const;
    248250     /** As changeBounds but just changes new bounds for a single variable.
    249251         Returns true if change */
  • trunk/Clp/src/ClpSimplexPrimal.cpp

    r2290 r2293  
    14441444                             }
    14451445                             testValue = 1.0e12*(largestCost+1.0e-6);
     1446                             if (numberDualInfeasibilities_) {
     1447                               double average = sumDualInfeasibilities_/numberDualInfeasibilities_;
     1448                               testValue = CoinMax(testValue,average);
     1449                             }
    14461450                             testValue =
    14471451                               CoinMin(testValue,MAX_INFEASIBILITY_COST);
     
    15581562                    }
    15591563               } else {
    1560                     if (alwaysOptimal || !sumOfRelaxedPrimalInfeasibilities_)
    1561                          problemStatus_ = 0; // optimal
    1562                     else
    1563                          problemStatus_ = 1; // infeasible
     1564                 /* Previous code here mostly works but
     1565                    sumOfRelaxed is rubbish in primal
     1566                 - so give benefit of doubt still */
     1567                 double error = CoinMin(1.0e-4, largestPrimalError_);
     1568                 // allow bigger tolerance than standard
     1569                 double saveTolerance = primalTolerance_;
     1570                 primalTolerance_ = 2.0*primalTolerance_ + error;
     1571                 nonLinearCost_->checkInfeasibilities(primalTolerance_);
     1572                 double relaxedSum = nonLinearCost_->sumInfeasibilities();
     1573                 // back
     1574                 primalTolerance_=saveTolerance;
     1575                 nonLinearCost_->checkInfeasibilities(primalTolerance_);
     1576                 if (alwaysOptimal || !relaxedSum)
     1577                   problemStatus_ = 0; // optimal
     1578                 else
     1579                   problemStatus_ = 1; // infeasible
    15641580               }
    15651581          }
Note: See TracChangeset for help on using the changeset viewer.