Changeset 1176


Ignore:
Timestamp:
Jun 20, 2009 11:55:18 AM (10 years ago)
Author:
forrest
Message:

better behavior on unbounded

Location:
trunk/Cbc/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Cbc/src/CbcHeuristic.cpp

    r1173 r1176  
    793793        if (numberNodes>=0) {
    794794          // normal
    795           model_->setSpecialOptions(saveModelOptions|2048);
     795          model.setSpecialOptions(saveModelOptions|2048);
    796796          if (logLevel<=1)
    797797            model.setLogLevel(0);
     
    810810          model.setMaximumCutPasses(CoinMin(10,model_->getMaximumCutPasses()));
    811811        } else {
    812           model_->setSpecialOptions(saveModelOptions);
     812          model.setSpecialOptions(saveModelOptions);
    813813          model_->messageHandler()->message(CBC_RESTART,model_->messages())
    814814            <<solver2->getNumRows()<<solver2->getNumCols()
  • trunk/Cbc/src/CbcModel.cpp

    r1175 r1176  
    754754      }
    755755    }
     756   
    756757    // But try again
    757758    if (continuousMultiplier<1.0) {
     
    810811                else if (rowLower[iRow]==rowUpper[iRow])
    811812                  equality=true;
    812                 if (fabs(rhs[iRow])>1.0e20||fabs(rhs[iRow]-floor(rhs[iRow]+0.5))>1.0e-10
     813                double rhsValue = rhs[iRow];
     814                double lowerValue = rowLower[iRow];
     815                double upperValue = rowUpper[iRow];
     816                if (rhsValue<1.0e20) {
     817                  if(lowerValue>-1.0e20)
     818                    lowerValue -= rhsValue;
     819                  if(upperValue<1.0e20)
     820                    upperValue -= rhsValue;
     821                }
     822                if (fabs(rhsValue)>1.0e20||fabs(rhsValue-floor(rhsValue+0.5))>1.0e-10
    813823                    ||fabs(element[j])!=1.0) {
    814824                  // no good
     
    817827                }
    818828                if (element[j]>0.0) {
    819                   if (rowLower[iRow]>-1.0e20&&fabs(rowLower[iRow]-floor(rowLower[iRow]+0.5))>1.0e-10) {
     829                  if (lowerValue>-1.0e20&&fabs(lowerValue-floor(lowerValue+0.5))>1.0e-10) {
    820830                    // no good
    821831                    allGood=false;
     
    823833                  }
    824834                } else {
    825                   if (rowUpper[iRow]<1.0e20&&fabs(rowUpper[iRow]-floor(rowUpper[iRow]+0.5))>1.0e-10) {
     835                  if (upperValue<1.0e20&&fabs(upperValue-floor(upperValue+0.5))>1.0e-10) {
    826836                    // no good
    827837                    allGood=false;
     
    851861                else if (rowLower[iRow]==rowUpper[iRow])
    852862                  equality=true;
    853                 if (fabs(rhs[iRow])>1.0e20||fabs(rhs[iRow]-floor(rhs[iRow]+0.5))>1.0e-10
     863                double rhsValue = rhs[iRow];
     864                double lowerValue = rowLower[iRow];
     865                double upperValue = rowUpper[iRow];
     866                if (rhsValue<1.0e20) {
     867                  if(lowerValue>-1.0e20)
     868                    lowerValue -= rhsValue;
     869                  if(upperValue<1.0e20)
     870                    upperValue -= rhsValue;
     871                }
     872                if (fabs(rhsValue)>1.0e20||fabs(rhsValue-floor(rhsValue +0.5))>1.0e-10
    854873                    ||fabs(element[j])!=1.0) {
    855874                  // no good
     
    858877                }
    859878                if (element[j]<0.0) {
    860                   if (rowLower[iRow]>-1.0e20&&fabs(rowLower[iRow]-floor(rowLower[iRow]+0.5))>1.0e-10) {
     879                  if (lowerValue>-1.0e20&&fabs(lowerValue-floor(lowerValue+0.5))>1.0e-10) {
    861880                    // no good
    862881                    allGood=false;
     
    864883                  }
    865884                } else {
    866                   if (rowUpper[iRow]<1.0e20&&fabs(rowUpper[iRow]-floor(rowUpper[iRow]+0.5))>1.0e-10) {
     885                  if (upperValue<1.0e20&&fabs(upperValue-floor(upperValue+0.5))>1.0e-10) {
    867886                    // no good
    868887                    allGood=false;
     
    900919  double maximumCost = 0.0 ;
    901920  //double trueIncrement=0.0;
    902   bool possibleMultiple = continuousMultiplier!=0.0 ;
    903921  int iColumn ;
    904922  int numberColumns = getNumCols() ;
     923  double scaleFactor=1.0; // due to rhs etc
     924  if ((specialOptions_&65536)==0) {
     925    /* be on safe side (later look carefully as may be able to
     926       to get 0.5 say if bounds are multiples of 0.5 */
     927    for (iColumn = 0 ; iColumn < numberColumns ; iColumn++) {
     928      if (upper[iColumn] > lower[iColumn]+1.0e-8) {
     929        double value;
     930        value=fabs(lower[iColumn]);
     931        if (floor(value+0.5)!=value) {
     932          scaleFactor = CoinMin(scaleFactor,0.5);
     933          if (floor(2.0*value+0.5)!=2.0*value) {
     934            scaleFactor = CoinMin(scaleFactor,0.25);
     935            if (floor(4.0*value+0.5)!=4.0*value) {
     936              scaleFactor=0.0;
     937            }
     938          }
     939        }
     940        value=fabs(upper[iColumn]);
     941        if (floor(value+0.5)!=value) {
     942          scaleFactor = CoinMin(scaleFactor,0.5);
     943          if (floor(2.0*value+0.5)!=2.0*value) {
     944            scaleFactor = CoinMin(scaleFactor,0.25);
     945            if (floor(4.0*value+0.5)!=4.0*value) {
     946              scaleFactor=0.0;
     947            }
     948          }
     949        }
     950      }
     951    }
     952  }
     953  bool possibleMultiple = continuousMultiplier!=0.0&&scaleFactor!=0.0 ;
    905954  if (possibleMultiple) {
    906955    for (iColumn = 0 ; iColumn < numberColumns ; iColumn++)
     
    9571006    }
    9581007    delete [] coeffMultiplier;
     1008    increment *= scaleFactor;
    9591009/*
    9601010  If the increment beats the current value for objective change, install it.
     
    37913841{
    37923842  assert (solver_);
     3843  // Check if bounds are all integral (as may get messed up later)
     3844  checkModel();
    37933845  assert (!solverCharacteristics_);
    37943846  OsiBabSolver * solverCharacteristics = dynamic_cast<OsiBabSolver *> (solver_->getAuxiliaryInfo());
     
    38053857  solver_->initialSolve();
    38063858  solver_->setHintParam(OsiDoInBranchAndCut,false,OsiHintDo,NULL) ;
     3859  if (!solver_->isProvenOptimal())
     3860    solver_->resolve();
    38073861  // But set up so Jon Lee will be happy
    38083862  status_=-1;
     
    1409114145  synchronizeModel();
    1409214146}
     14147// Check original model before it gets messed up
     14148void
     14149CbcModel::checkModel()
     14150{
     14151  int iColumn ;
     14152  int numberColumns = getNumCols() ;
     14153  const double *lower = getColLower() ;
     14154  const double *upper = getColUpper() ;
     14155  int setFlag=65536;
     14156  for (iColumn = 0 ; iColumn < numberColumns ; iColumn++) {
     14157    if (upper[iColumn] > lower[iColumn]+1.0e-8) {
     14158      double value;
     14159      value=fabs(lower[iColumn]);
     14160      if (floor(value+0.5)!=value) {
     14161        setFlag=0;
     14162        break;
     14163      }
     14164      value=fabs(upper[iColumn]);
     14165      if (floor(value+0.5)!=value) {
     14166        setFlag=0;
     14167        break;
     14168      }
     14169    }
     14170  }
     14171  specialOptions_ |= setFlag;
     14172}
    1409314173#ifdef CBC_KEEP_DEPRECATED
    1409414174/* preProcess problem - replacing solver
  • trunk/Cbc/src/CbcModel.hpp

    r1173 r1176  
    15401540      14 bit (16384) - Use Cplex! for fathoming
    15411541      15 bit (32768) - Try reduced model after 0 nodes
     1542      16 bit (65536) - Original model had integer bounds
    15421543  */
    15431544  /// Set special options
     
    15531554  inline bool ownObjects() const
    15541555  { return ownObjects_;}
     1556  /// Check original model before it gets messed up
     1557  void checkModel();
    15551558  /// Pointer to a mutex
    15561559  inline void * mutex()
  • trunk/Cbc/src/CbcSolver.cpp

    r1175 r1176  
    58845884                  return returnCode;
    58855885                }
     5886                if (clpSolver->status()>0) {
     5887                  // and in babModel if exists
     5888                  if (babModel_) {
     5889                    babModel_->setProblemStatus(iStatus);
     5890                    babModel_->setSecondaryStatus(iStatus2);
     5891                  }
     5892                  if (!noPrinting_) {
     5893                    iStatus = clpSolver->status();
     5894                    const char * msg[]={"infeasible","unbounded","stopped",
     5895                                      "difficulties","other"};
     5896                    sprintf(generalPrint,"Problem is %s - %.2f seconds",
     5897                            msg[iStatus-1],CoinCpuTime()-time1a);
     5898                    generalMessageHandler->message(CLP_GENERAL,generalMessages)
     5899                      << generalPrint
     5900                      <<CoinMessageEol;
     5901                  }
     5902                  break;
     5903                }
    58865904                clpSolver->setSpecialOptions(clpSolver->specialOptions()|IN_BRANCH_AND_BOUND); // say is Cbc (and in branch and bound)
    58875905#elif CBC_OTHER_SOLVER==1
  • trunk/Cbc/src/unitTestClp.cpp

    r1173 r1176  
    296296        }
    297297      }
     298      model->checkModel();
    298299      modelC->tightenPrimalBounds(0.0,0,true);
    299300      model->initialSolve();
Note: See TracChangeset for help on using the changeset viewer.