Ignore:
Timestamp:
Oct 26, 2016 7:34:38 AM (4 years ago)
Author:
forrest
Message:

fix sos preprocess error

File:
1 edited

Legend:

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

    r2280 r2308  
    3535#include "CbcBranchActual.hpp"
    3636#include "CbcCutGenerator.hpp"
     37#include "CoinMpsIO.hpp"
    3738//==============================================================================
    3839
     
    744745    }
    745746#ifdef COIN_HAS_CLP
    746     OsiClpSolverInterface * osiclp = dynamic_cast< OsiClpSolverInterface*> (solver);
    747     if (osiclp && (osiclp->specialOptions()&65536) == 0) {
     747    OsiClpSolverInterface * clpSolver = dynamic_cast< OsiClpSolverInterface*> (solver);
     748    if (clpSolver && (clpSolver->specialOptions()&65536) == 0) {
    748749        // go faster stripes
    749         if (osiclp->getNumRows() < 300 && osiclp->getNumCols() < 500) {
    750             osiclp->setupForRepeatedUse(2, 0);
     750        if (clpSolver->getNumRows() < 300 && clpSolver->getNumCols() < 500) {
     751            clpSolver->setupForRepeatedUse(2, 0);
    751752        } else {
    752             osiclp->setupForRepeatedUse(0, 0);
     753            clpSolver->setupForRepeatedUse(0, 0);
    753754        }
    754755        // Turn this off if you get problems
    755756        // Used to be automatically set
    756         osiclp->setSpecialOptions(osiclp->specialOptions() | (128 + 64 - 128));
    757         ClpSimplex * lpSolver = osiclp->getModelPtr();
     757        clpSolver->setSpecialOptions(clpSolver->specialOptions() | (128 + 64 - 128));
     758        ClpSimplex * lpSolver = clpSolver->getModelPtr();
    758759        lpSolver->setSpecialOptions(lpSolver->specialOptions() | 0x01000000); // say is Cbc (and in branch and bound)
    759760        lpSolver->setSpecialOptions(lpSolver->specialOptions() |
     
    949950            process.setApplicationData(const_cast<double *>(debugger->optimalSolution()));
    950951          }
     952        }
     953#endif
     954#ifdef COIN_HAS_CLP
     955        OsiClpSolverInterface * clpSolver = dynamic_cast< OsiClpSolverInterface*> (solver);
     956        // See if SOS
     957        if (clpSolver&&clpSolver->numberSOS()) {
     958          // SOS
     959          int numberSOS = clpSolver->numberSOS();
     960          const CoinSet * setInfo = clpSolver->setInfo();
     961          int *sosStart = new int [numberSOS+1];
     962          char *sosType = new char [numberSOS];
     963          int i;
     964          int nTotal = 0;
     965          sosStart[0] = 0;
     966          for ( i = 0; i < numberSOS; i++) {
     967            int type = setInfo[i].setType();
     968            int n = setInfo[i].numberEntries();
     969            sosType[i] = static_cast<char>(type);
     970            nTotal += n;
     971            sosStart[i+1] = nTotal;
     972          }
     973          int * sosIndices = new int[nTotal];
     974          double * sosReference = new double [nTotal];
     975          for (i = 0; i < numberSOS; i++) {
     976            int n = setInfo[i].numberEntries();
     977            const int * which = setInfo[i].which();
     978            const double * weights = setInfo[i].weights();
     979            int base = sosStart[i];
     980            for (int j = 0; j < n; j++) {
     981              int k = which[j];
     982              sosIndices[j+base] = k;
     983              sosReference[j+base] = weights ? weights[j] : static_cast<double> (j);
     984            }
     985          }
     986          int numberColumns = solver->getNumCols();
     987          char * prohibited = new char[numberColumns];
     988          memset(prohibited, 0, numberColumns);
     989          int n = sosStart[numberSOS];
     990          for (int i = 0; i < n; i++) {
     991            int iColumn = sosIndices[i];
     992            prohibited[iColumn] = 1;
     993          }
     994          delete [] sosIndices;
     995          delete [] sosReference;
     996          delete [] sosStart;
     997          delete [] sosType;
     998          process.passInProhibited(prohibited, numberColumns);
     999          delete [] prohibited;
    9511000        }
    9521001#endif
     
    14391488#endif
    14401489                    //if (fractionSmall_ < 1000000.0)
    1441                       process.postProcess(*model.solver());
     1490                    process.postProcess(*model.solver());
    14421491                    if (solver->isProvenOptimal() && solver->getObjValue()*solver->getObjSense() < cutoff) {
    14431492                        // Solution now back in solver
     
    14461495                               numberColumns*sizeof(double));
    14471496                        newSolutionValue = model.getMinimizationObjValue();
     1497#ifdef COIN_HAS_CLP
     1498                      if (clpSolver) {
     1499                        if (clpSolver && clpSolver->numberSOS()) {
     1500                          // SOS
     1501                          int numberSOS = clpSolver->numberSOS();
     1502                          const CoinSet * setInfo = clpSolver->setInfo();
     1503                          int i;
     1504                          for ( i = 0; i < numberSOS; i++) {
     1505                            int type = setInfo[i].setType();
     1506                            int n = setInfo[i].numberEntries();
     1507                            const int * which = setInfo[i].which();
     1508                            int first = -1;
     1509                            int last = -1;
     1510                            for (int j = 0; j < n; j++) {
     1511                              int iColumn = which[j];
     1512                              if (fabs(newSolution[iColumn]) > 1.0e-7) {
     1513                                last = j;
     1514                                if (first < 0)
     1515                                  first = j;
     1516                              }
     1517                            }
     1518                            assert (last - first < type);
     1519                            for (int j = 0; j < n; j++) {
     1520                              if (j < first || j > last) {
     1521                                int iColumn = which[j];
     1522                                // do I want to fix??
     1523                                solver->setColLower(iColumn, 0.0);
     1524                                solver->setColUpper(iColumn, 0.0);
     1525                                newSolution[iColumn]=0.0;
     1526                              }
     1527                            }
     1528                          }
     1529                        }
     1530                      }
     1531#endif
    14481532                    } else {
    14491533                        // odd - but no good
     
    32123296    probabilities_[numberHeuristics_-1] = 1.000001;
    32133297}
    3214 
Note: See TracChangeset for help on using the changeset viewer.