Ignore:
Timestamp:
Jun 12, 2006 11:44:32 AM (14 years ago)
Author:
forrest
Message:

for ampl preprocess sos

File:
1 edited

Legend:

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

    r356 r364  
    491491    double * solutionIn = NULL;
    492492    int * prioritiesIn = NULL;
     493    int numberSOS = 0;
     494    int * sosStart = NULL;
     495    int * sosIndices = NULL;
     496    char * sosType = NULL;
     497    double * sosReference = NULL;
     498    int * sosPriority=NULL;
    493499#ifdef CBC_AMPL
    494500    ampl_info info;
     
    16801686              double timeLeft = babModel->getMaximumSeconds();
    16811687              int numberOriginalColumns = babModel->solver()->getNumCols();
    1682 #ifdef CBC_AMPL
    1683               if (usingAmpl&&info.numberSos&&doSOS) {
    1684                 // SOS
    1685                 assert (!preProcess); // do later
    1686                 int numberSOS = info.numberSos;
    1687                 int numberIntegers = babModel->numberIntegers();
    1688                 int numberColumns = babModel->getNumCols();
    1689                 /* model may not have created objects
    1690                    If none then create
    1691                 */
    1692                 if (!numberIntegers||!babModel->numberObjects()) {
    1693                   int type = (pseudoUp) ? 1 : 0;
    1694                   babModel->findIntegers(true,type);
    1695                   numberIntegers = babModel->numberIntegers();
    1696                 }
    1697                 // Do sets and priorities
    1698                 CbcObject ** objects = new CbcObject * [numberSOS];
    1699                 const int * starts = info.sosStart;
    1700                 const int * which = info.sosIndices;
    1701                 const char * type = info.sosType;
    1702                 const double * weight = info.sosReference;
    1703                 // see if any priorities
    1704                 int i;
    1705                 bool gotPriorities=false;
    1706                 int * priorities=info.priorities;
    1707                 if (priorities) {
    1708                   for (i=0;i<numberColumns;i++) {
    1709                     if (priorities[i]) {
    1710                       gotPriorities=true;
    1711                       break;
    1712                     }
    1713                   }
    1714                 }
    1715                 priorities=info.sosPriority;
    1716                 if (priorities) {
    1717                   for (i=0;i<numberSOS;i++) {
    1718                     if (priorities[i]) {
    1719                       gotPriorities=true;
    1720                       break;
    1721                     }
    1722                   }
    1723                 }
    1724                 int iSOS;
    1725                 for (iSOS =0;iSOS<numberSOS;iSOS++) {
    1726                   int iStart = starts[iSOS];
    1727                   int n=starts[iSOS+1]-iStart;
    1728                   objects[iSOS] = new CbcSOS(babModel,n,which+iStart,weight+iStart,
    1729                                              iSOS,type[iSOS]);
    1730                   // higher for set
    1731                   objects[iSOS]->setPriority(10);
    1732                   if (gotPriorities&&info.sosPriority&&info.sosPriority[iSOS])
    1733                     objects[iSOS]->setPriority(info.sosPriority[iSOS]);
    1734                 }
    1735                 babModel->addObjects(numberSOS,objects);
    1736                 for (iSOS=0;iSOS<numberSOS;iSOS++)
    1737                   delete objects[iSOS];
    1738                 delete [] objects;
    1739               }
    1740 #endif
    17411688              if (preProcess==6) {
    17421689                // use strategy instead
     
    20441991                  solutionIn=info.primalSolution;
    20451992                  prioritiesIn = info.priorities;
     1993                  if (info.numberSos&&doSOS) {
     1994                    // SOS
     1995                    numberSOS = info.numberSos;
     1996                    sosStart = info.sosStart;
     1997                    sosIndices = info.sosIndices;
     1998                    sosType = info.sosType;
     1999                    sosReference = info.sosReference;
     2000                    sosPriority = info.sosPriority;
     2001                  }
    20462002                }
    20472003#endif               
     
    21342090                    delete objects[iSOS];
    21352091                  delete [] objects;
    2136                 } else if (priorities||branchDirection||pseudoDown||pseudoUp) {
     2092                } else if (priorities||branchDirection||pseudoDown||pseudoUp||numberSOS) {
    21372093                  // do anyway for priorities etc
    21382094                  int numberIntegers = babModel->numberIntegers();
     
    21432099                    int type = (pseudoUp) ? 1 : 0;
    21442100                    babModel->findIntegers(true,type);
     2101                  }
     2102                  if (numberSOS) {
     2103                    // Do sets and priorities
     2104                    CbcObject ** objects = new CbcObject * [numberSOS];
     2105                    int iSOS;
     2106                    if (originalColumns) {
     2107                      // redo sequence numbers
     2108                      int numberColumns = babModel->getNumCols();
     2109                      int nOld = originalColumns[numberColumns-1]+1;
     2110                      int * back = new int[nOld];
     2111                      int i;
     2112                      for (i=0;i<nOld;i++)
     2113                        back[i]=-1;
     2114                      for (i=0;i<numberColumns;i++)
     2115                        back[originalColumns[i]]=i;
     2116                      // Really need better checks
     2117                      int nMissing=0;
     2118                      int n=sosStart[numberSOS];
     2119                      for (i=0;i<n;i++) {
     2120                        int iColumn = sosIndices[i];
     2121                        int jColumn = back[iColumn];
     2122                        if (jColumn>=0)
     2123                          sosIndices[i] = jColumn;
     2124                        else
     2125                          nMissing++;
     2126                      }
     2127                      delete [] back;
     2128                      if (nMissing)
     2129                        printf("%d SOS variables vanished due to pre processing? - check validity?\n",nMissing);
     2130                    }
     2131                    for (iSOS =0;iSOS<numberSOS;iSOS++) {
     2132                      int iStart = sosStart[iSOS];
     2133                      int n=sosStart[iSOS+1]-iStart;
     2134                      objects[iSOS] = new CbcSOS(babModel,n,sosIndices+iStart,sosReference+iStart,
     2135                                                 iSOS,sosType[iSOS]);
     2136                      if (sosPriority)
     2137                        objects[iSOS]->setPriority(sosPriority[iSOS]);
     2138                      else if (!prioritiesIn)
     2139                        objects[iSOS]->setPriority(10);  // rather than 1000
     2140                    }
     2141                    babModel->addObjects(numberSOS,objects);
     2142                    for (iSOS=0;iSOS<numberSOS;iSOS++)
     2143                      delete objects[iSOS];
     2144                    delete [] objects;
    21452145                  }
    21462146                  CbcObject ** objects = babModel->objects();
     
    21902190                  free(prioritiesIn);
    21912191                  prioritiesIn=NULL;
     2192                  free(sosStart);
     2193                  sosStart=NULL;
     2194                  free(sosIndices);
     2195                  sosIndices=NULL;
     2196                  free(sosType);
     2197                  sosType=NULL;
     2198                  free(sosReference);
     2199                  sosReference=NULL;
     2200                  free(sosPriority);
     2201                  sosPriority=NULL;
    21922202#ifdef CBC_AMPL
    21932203                }
     
    23882398                free(prioritiesIn);
    23892399                prioritiesIn=NULL;
     2400                free(sosStart);
     2401                sosStart=NULL;
     2402                free(sosIndices);
     2403                sosIndices=NULL;
     2404                free(sosType);
     2405                sosType=NULL;
     2406                free(sosReference);
     2407                sosReference=NULL;
     2408                free(sosPriority);
     2409                sosPriority=NULL;
    23902410#ifdef CBC_AMPL
    23912411              }
Note: See TracChangeset for help on using the changeset viewer.