Ignore:
Timestamp:
Feb 18, 2015 8:01:03 PM (4 years ago)
Author:
unxusr
Message:

MIPStart fixes

File:
1 edited

Legend:

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

    r2013 r2137  
    5555         {
    5656            sprintf( printLine, "Reading: %s, line %d - first column in mipstart file should be numeric, ignoring.", fileName, nLine );
    57             model->messageHandler()->message(CBC_GENERAL, model->messages())
    58               << printLine << CoinMessageEol;
     57            model->messageHandler()->message(CBC_GENERAL, model->messages()) << printLine << CoinMessageEol;
    5958            continue;
    6059         }
     
    6261         {
    6362            sprintf( printLine, "Reading: %s, line %d - Third column in mipstart file should be numeric, ignoring.", fileName, nLine  );
    64             model->messageHandler()->message(CBC_GENERAL, model->messages())
    65               << printLine << CoinMessageEol;
     63            model->messageHandler()->message(CBC_GENERAL, model->messages()) << printLine << CoinMessageEol;
    6664            continue;
    6765         }
    6866
    69          //int idx = atoi( col[0] );
    7067         char *name = col[1];
    7168         double value = atof( col[2] );
    72          //double obj = 0.0;
    73 //         if (nread >= 4)
    74 //            obj = atof( col[3] );
    7569
    7670         colValues.push_back( pair<string, double>(string(name),value) );
     
    7973
    8074   if (colValues.size()) {
    81       sprintf( printLine,"mipstart values read for %d variables.", (int)colValues.size());
    82       model->messageHandler()->message(CBC_GENERAL, model->messages())
    83         << printLine << CoinMessageEol;
     75      sprintf( printLine,"MIPStart values read for %d variables.", static_cast<int>(colValues.size()) );
     76          model->messageHandler()->message(CBC_GENERAL, model->messages()) << printLine << CoinMessageEol;
    8477      if (colValues.size()<model->getNumCols()) {
    85         int numberColumns = model->getNumCols();
    86         OsiSolverInterface * solver = model->solver();
    87         vector< pair< string, double > > fullValues;
    88         /* for fast search of column names */
    89         map< string, int > colIdx;
    90         for (int i=0;i<numberColumns;i++) {
    91           fullValues.push_back( pair<string, double>(solver->getColName(i),0.0) );
    92           colIdx[solver->getColName(i)] = i;
    93         }
    94         for ( int i=0 ; (i<(int)colValues.size()) ; ++i )
    95           {
    96             map< string, int >::const_iterator mIt = colIdx.find( colValues[i].first );
    97             if ( mIt != colIdx.end() ) {
    98               const int idx = mIt->second;
    99               double v = colValues[i].second;
    100               fullValues[idx].second=v;
    101             }
    102           }
    103         colValues=fullValues;
    104       }
    105    } else
    106    {
     78          int numberColumns = model->getNumCols();
     79          OsiSolverInterface *solver = model->solver();
     80          vector< pair< string, double > > fullValues;
     81          /* for fast search of column names */
     82          map< string, int > colIdx;
     83          for (int i=0;i<numberColumns;i++) {
     84              fullValues.push_back( pair<string, double>(solver->getColName(i),0.0) );
     85              colIdx[solver->getColName(i)] = i;
     86          }
     87          for ( int i=0 ; (i<static_cast<int>(colValues.size())) ; ++i ) {
     88              map< string, int >::const_iterator mIt = colIdx.find( colValues[i].first );
     89              if ( mIt != colIdx.end() ) {
     90                  const int idx = mIt->second;
     91                  double v = colValues[i].second;
     92                  fullValues[idx].second=v;
     93              }
     94          }
     95          colValues=fullValues;
     96      }
     97   }
     98   else {
    10799      sprintf( printLine, "No mipstart solution read from %s", fileName );
    108       model->messageHandler()->message(CBC_GENERAL, model->messages())
    109         << printLine << CoinMessageEol;
     100      model->messageHandler()->message(CBC_GENERAL, model->messages()) << printLine << CoinMessageEol;
    110101      return 1;
    111102   }
     
    125116   OsiSolverInterface *lp = model->solver()->clone();
    126117   map< string, int > colIdx;
    127    assert( ((int)colNames.size()) == lp->getNumCols() );
     118   assert( (static_cast<int>(colNames.size())) == lp->getNumCols() );
    128119   /* for fast search of column names */
    129    for ( int i=0 ; (i<(int)colNames.size()) ; ++i )
     120   for ( int i=0 ; (i<static_cast<int>(colNames.size())) ; ++i )
    130121      colIdx[colNames[i]] = i;
    131122
     
    135126   char colNotFound[256] = "";
    136127   int nContinuousFixed = 0;
     128
    137129#ifndef JUST_FIX_INTEGER
    138130#define JUST_FIX_INTEGER 0
    139131#endif
     132
    140133#if JUST_FIX_INTEGER > 1
    141134   // all not mentioned are at zero
    142135   for ( int i=0 ; (i<lp->getNumCols()) ; ++i )
    143      {
     136   {
    144137       if (lp->isInteger(i))
    145138         lp->setColBounds( i, 0.0, 0.0 );
    146      }
    147 #endif
    148    for ( int i=0 ; (i<(int)colValues.size()) ; ++i )
     139   }
     140#endif
     141   for ( int i=0 ; (i<static_cast<int>(colValues.size())) ; ++i )
    149142   {
    150143      map< string, int >::const_iterator mIt = colIdx.find( colValues[i].first );
     
    161154#if JUST_FIX_INTEGER
    162155         if (!lp->isInteger(idx))
    163            continue;
     156            continue;
    164157#endif
    165158         if (v<1e-8)
     
    167160         if (lp->isInteger(idx))  // just to avoid small
    168161            v = floor( v+0.5 );   // fractional garbage
    169          else
    170            nContinuousFixed++;
     162         else
     163            nContinuousFixed++;
     164
    171165         lp->setColBounds( idx, v, v );
    172166         ++fixed;
     
    177171   {
    178172      model->messageHandler()->message(CBC_GENERAL, model->messages())
    179         << "Warning: MIPstart solution is not valid, ignoring it."
    180         << CoinMessageEol;
     173        << "Warning: MIPstart solution is not valid, column names do not match, ignoring it."
     174        << CoinMessageEol;
    181175      goto TERMINATE;
    182176   }
    183177
    184    if ( notFound >= ( ((double)colNames.size()) * 0.5 ) ) {
     178   if ( notFound >= ( (static_cast<double>(colNames.size())) * 0.5 ) ) {
    185179      sprintf( printLine, "Warning: %d column names were not found (e.g. %s) while filling solution.", notFound, colNotFound );
    186       model->messageHandler()->message(CBC_GENERAL, model->messages())
    187         << printLine << CoinMessageEol;
     180        model->messageHandler()->message(CBC_GENERAL, model->messages())
     181        << printLine << CoinMessageEol;
    188182   }
    189183#if JUST_FIX_INTEGER
     
    192186   lp->setDblParam(OsiDualObjectiveLimit,COIN_DBL_MAX);
    193187   lp->initialSolve();
    194    //lp->writeMps("fixed","mps");
     188
     189   if ( (lp->isProvenPrimalInfeasible()) || (lp->isProvenDualInfeasible()) )
     190   {
     191      if (nContinuousFixed) {
     192         model->messageHandler()->message(CBC_GENERAL, model->messages())
     193            << "Trying just fixing integer variables." << CoinMessageEol;
     194         int numberColumns = lp->getNumCols();
     195         const double *oldLower = model->solver()->getColLower();
     196         const double *oldUpper = model->solver()->getColUpper();
     197         for ( int i=0 ; i<numberColumns ; ++i ) {
     198            if (!lp->isInteger(i)) {
     199               lp->setColLower(i,oldLower[i]);
     200               lp->setColUpper(i,oldUpper[i]);
     201            }
     202         }
     203
     204         lp->initialSolve();
     205      }
     206      else
     207      {
     208         model->messageHandler()->message(CBC_GENERAL, model->messages())
     209             << "Fixing only non-zero variables." << CoinMessageEol;
     210         /* unfix all variables which are zero */
     211         int notZeroAnymore = 0;
     212         for ( int i=0 ; (i<lp->getNumCols()) ; ++i )
     213             if ( ((fabs(lp->getColLower()[i])) <= 1e-8) && (fabs(lp->getColLower()[i]-lp->getColUpper()[i]) <= 1e-8) )
     214             {
     215                const double *oldLower = model->solver()->getColLower();
     216                const double *oldUpper = model->solver()->getColUpper();
     217                lp->setColLower(i,oldLower[i]);
     218                lp->setColUpper(i,oldUpper[i]);
     219                notZeroAnymore++;
     220             }
     221         if (notZeroAnymore)
     222             lp->initialSolve();
     223      }
     224   }
     225
    195226   if (!lp->isProvenOptimal())
    196227   {
    197228      model->messageHandler()->message(CBC_GENERAL, model->messages())
    198         << "Warning: mipstart values could not be used to build a solution." << CoinMessageEol;
    199       if (nContinuousFixed) {
    200         model->messageHandler()->message(CBC_GENERAL, model->messages())
    201           << "Trying just fixing integer variables." << CoinMessageEol;
    202         int numberColumns = lp->getNumCols();
    203         const double * oldLower = model->solver()->getColLower();
    204         const double * oldUpper = model->solver()->getColUpper();
    205         for ( int i=0 ; i<numberColumns ; ++i ) {
    206           if (!lp->isInteger(i)) {
    207             lp->setColLower(i,oldLower[i]);
    208             lp->setColUpper(i,oldUpper[i]);
    209           }
    210         }
    211         lp->initialSolve();
    212         if (!lp->isProvenOptimal())
    213           model->messageHandler()->message(CBC_GENERAL, model->messages())
    214             << "Still no good." << CoinMessageEol;
    215       }
    216       if (!lp->isProvenOptimal()) {
    217         status = 1;
    218         goto TERMINATE;
    219       }
    220    }
    221 
     229           << "Warning: mipstart values could not be used to build a solution." << CoinMessageEol;
     230      status = 1;
     231      goto TERMINATE;
     232   }
     233   
    222234   /* some additional effort is needed to provide an integer solution */
    223235   if ( lp->getFractionalIndices().size() > 0 )
    224236   {
    225       sprintf( printLine,"MIPStart solution provided values for %d of %d integer variables, %d variables are still fractional.", fixed, lp->getNumIntegers(), (int)lp->getFractionalIndices().size() );
     237      sprintf( printLine,"MIPStart solution provided values for %d of %d integer variables, %d variables are still fractional.", fixed, lp->getNumIntegers(), static_cast<int>(lp->getFractionalIndices().size()) );
    226238      model->messageHandler()->message(CBC_GENERAL, model->messages())
    227239        << printLine << CoinMessageEol;
     
    246258#else
    247259      CbcModel babModel( *lp );
    248       babModel.setLogLevel( 0 );
    249       babModel.setMaximumNodes( 500 );
     260      lp->writeLp("lessFix");
     261      babModel.setLogLevel( 2 );
     262      babModel.setMaximumNodes( 1000 );
    250263      babModel.setMaximumSeconds( 60 );
    251264      babModel.branchAndBound();
     
    263276      else
    264277      {
    265         model->messageHandler()->message(CBC_GENERAL, model->messages())
    266            << "Warning: mipstart values could not be used to build a solution." << CoinMessageEol;
     278          model->messageHandler()->message(CBC_GENERAL, model->messages())
     279              << "Warning: mipstart values could not be used to build a solution." << CoinMessageEol;
    267280         status = 1;
    268281         goto TERMINATE;
     
    278291   if ( foundIntegerSol )
    279292   {
    280       sprintf( printLine,"mipstart provided solution with cost %g", compObj);
     293      sprintf( printLine,"MIPStart provided solution with cost %g", compObj);
    281294      model->messageHandler()->message(CBC_GENERAL, model->messages())
    282         << printLine << CoinMessageEol;
     295           << printLine << CoinMessageEol;
    283296#if 0
    284297      {
Note: See TracChangeset for help on using the changeset viewer.