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/CbcSolver.cpp

    r2290 r2308  
    65736573                                    babModel_->addCutGenerator(&storedAmpl, 1, "Stored");
    65746574                                }
     6575#endif
     6576#ifdef SOS_AS_CUTS
     6577#ifdef COIN_HAS_CLP
     6578                                /* SOS as cuts
     6579                                   Could be a bit more sophisticated e.g. only non duplicates
     6580                                   Could do something for SOS 2?
     6581                                */
     6582                                {
     6583                                  OsiClpSolverInterface * clpSolver = dynamic_cast< OsiClpSolverInterface*> (babModel_->solver());
     6584                                  if (clpSolver && clpSolver->numberSOS()) {
     6585                                    // SOS
     6586                                    int numberSOS = clpSolver->numberSOS();
     6587                                    const CoinSet * setInfo = clpSolver->setInfo();
     6588                                    CglStored sosCuts;
     6589                                    const double * lower = clpSolver->getColLower();
     6590                                    const double * upper = clpSolver->getColUpper();
     6591                                    // Start Cliques
     6592                                    // sizes
     6593                                    int nEls=0;
     6594                                    for (int i = 0; i < numberSOS; i++)
     6595                                      nEls += setInfo[i].numberEntries();
     6596                                    double * els = new double[nEls+2*numberSOS];
     6597                                    for (int i=0;i<nEls;i++)
     6598                                      els[i]=1.0;
     6599                                    double * lo = els+nEls;
     6600                                    double * up = lo+numberSOS;
     6601                                    // need to get rid of sos
     6602                                    ClpSimplex * fakeSimplex =
     6603                                      new ClpSimplex(*clpSolver->getModelPtr());
     6604#if 0
     6605                                    int numberRows=fakeSimplex->numberRows();
     6606                                    int * starts =
     6607                                      new int[CoinMax(numberSOS+1,numberRows)];
     6608                                    int * columns = new int[nEls];
     6609                                    for (int i=0;i<numberRows;i++)
     6610                                      starts[i]=i;
     6611                                    fakeSimplex->deleteRows(numberRows,starts);
     6612#else
     6613                                    int * starts =
     6614                                      new int[numberSOS+1];
     6615                                    int * columns = new int[nEls];
     6616#endif
     6617                                    int nAdded=0;
     6618                                    starts[0]=0;
     6619                                    nEls=0;
     6620                                   
     6621                                    // just SOS 1 with 0-1
     6622                                    for (int i = 0; i < numberSOS; i++) {
     6623                                      int type = setInfo[i].setType();
     6624                                      if (type==2)
     6625                                        continue;
     6626                                      int n = setInfo[i].numberEntries();
     6627                                      const int * which = setInfo[i].which();
     6628                                      for (int j=0;j<n;j++) {
     6629                                        int iColumn=which[j];
     6630                                        if (lower[iColumn]||upper[iColumn]!=1.0) {
     6631                                          n=-1;
     6632                                          break; // no good
     6633                                        }
     6634                                      }
     6635                                      if (n>0) {
     6636                                        memcpy(columns+nEls,which,n*sizeof(int));
     6637                                        lo[nAdded]=-COIN_DBL_MAX;
     6638                                        up[nAdded]=1.0;
     6639                                        nAdded++;
     6640                                        nEls += n;
     6641                                        starts[nAdded]=nEls;
     6642                                      }
     6643                                    }
     6644                                    if (nAdded)
     6645                                      fakeSimplex->addRows(nAdded,
     6646                                                           lo,up,
     6647                                                           starts,columns,els);
     6648                                    if (nAdded) {
     6649                                      OsiClpSolverInterface fakeSolver(fakeSimplex);
     6650                                      CglFakeClique fakeGen(&fakeSolver,false);
     6651                                      fakeGen.setStarCliqueReport(false);
     6652                                      fakeGen.setRowCliqueReport(false);
     6653                                      fakeGen.setMinViolation(0.05);
     6654                                      babModel_->addCutGenerator(&fakeGen, 1, "SosCuts");
     6655                                      //fakeSimplex->writeMps("bad.mps",0,1);
     6656                                      //sosCuts.setProbingInfo(new
     6657                                      //                     CglTreeProbingInfo(&fakeSolver));
     6658                                    }
     6659                                    delete fakeSimplex;
     6660                                    // End Cliques
     6661                                    // Start Stored
     6662                                    nAdded=0;
     6663                                    for (int i = 0; i < numberSOS; i++) {
     6664                                      int type = setInfo[i].setType();
     6665                                      int n = setInfo[i].numberEntries();
     6666                                      const int * which = setInfo[i].which();
     6667                                      double rhs=0.0;
     6668                                      double previous=0.0;
     6669                                      for (int j=0;j<n;j++) {
     6670                                        int iColumn=which[j];
     6671                                        if (lower[iColumn]) {
     6672                                          n=-1;
     6673                                          break; // no good
     6674                                        }
     6675                                        rhs=CoinMax(upper[iColumn]+previous,rhs);
     6676                                        if (type==2)
     6677                                          previous=upper[iColumn];
     6678                                      }
     6679                                      if (n>0) {
     6680                                        sosCuts.addCut(0.0,rhs,
     6681                                                       n, which,els);
     6682                                        nAdded++;
     6683                                      }
     6684                                    }
     6685                                    if (nAdded)
     6686                                      babModel_->addCutGenerator(&sosCuts, 1, "SosCuts2");
     6687                                    // End Stored
     6688                                    delete [] els;
     6689                                    delete [] columns;
     6690                                    delete [] starts;
     6691                                  }
     6692                                }
     6693#endif
    65756694#endif
    65766695                                if (useSolution > 1) {
Note: See TracChangeset for help on using the changeset viewer.