Ignore:
Timestamp:
Jan 19, 2018 10:12:47 AM (11 months ago)
Author:
forrest
Message:

changes for SC

File:
1 edited

Legend:

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

    r2345 r2357  
    13561356    CoinMessageHandler * generalMessageHandler = model_.messageHandler();
    13571357    generalMessageHandler->setPrefix(false);
     1358    int numberLotSizing=0;
     1359    typedef struct {double low;double high;int column;} lotStruct;   
     1360    lotStruct * lotsize=NULL;
    13581361#ifndef CBC_OTHER_SOLVER
    13591362    OsiClpSolverInterface * originalSolver = dynamic_cast<OsiClpSolverInterface *> (model_.solver());
     
    40164019                            }
    40174020                            if (type == CBC_PARAM_ACTION_BAB) {
     4021                                if (preProcess==0 && numberLotSizing) {
     4022                                  if (!babModel_->numberObjects()) {
     4023                                    /* model may not have created objects
     4024                                       If none then create
     4025                                    */
     4026                                    babModel_->findIntegers(true);
     4027                                  }
     4028                                  // Lotsizing
     4029                                  int numberColumns = babModel_->solver()->getNumCols();
     4030                                  CbcObject ** objects =
     4031                                    new CbcObject * [numberLotSizing];
     4032                                  double points[]={0.0,0.0,0.0,0.0};
     4033                                  for (int i = 0; i < numberLotSizing; i++) {
     4034                                    int iColumn = lotsize[i].column;
     4035                                    points[2]=lotsize[i].low;
     4036                                    points[3]=lotsize[i].high;
     4037                                    objects[i] = new
     4038                                      CbcLotsize (&model_,iColumn,2,
     4039                                                  points,true);
     4040                                  }
     4041                                  babModel_->addObjects(numberLotSizing,objects);
     4042                                  for (int i = 0; i < numberLotSizing; i++)
     4043                                    delete objects[i];
     4044                                  delete [] objects;
     4045                                }
    40184046                                double limit;
    40194047                                clpSolver->getDblParam(OsiDualObjectiveLimit, limit);
     
    41634191                                        model_.findIntegers(true);
    41644192                                    }
     4193                                    // Lotsizing
     4194                                    if (numberLotSizing) {
     4195                                      int numberColumns = saveSolver->getNumCols();
     4196                                      char * prohibited = new char[numberColumns];
     4197                                      memset(prohibited, 0, numberColumns);
     4198                                      for (int i = 0; i < numberLotSizing; i++) {
     4199                                        int iColumn = lotsize[i].column;
     4200                                        prohibited[iColumn] = 1;
     4201                                      }
     4202                                      process.passInProhibited(prohibited, numberColumns);
     4203                                      delete [] prohibited;
     4204                                    }
    41654205                                    if (model_.numberObjects()) {
    41664206                                        OsiObject ** oldObjects = babModel_->objects();
     
    43474387                                        }
    43484388                                    }
     4389                                    // do lotsizing
     4390                                    if (numberLotSizing) {
     4391                                      CbcObject ** objects =
     4392                                        new CbcObject * [numberLotSizing];
     4393                                      double points[]={0.0,0.0,0.0,0.0};
     4394                                      for (int i = 0; i < numberLotSizing; i++) {
     4395                                        int iColumn = lotsize[i].column;
     4396                                        points[2]=lotsize[i].low;
     4397                                        points[3]=lotsize[i].high;
     4398                                        objects[i] = new
     4399                                          CbcLotsize (babModel_,iColumn,2,
     4400                                                      points,true);
     4401                                      }
     4402                                      babModel_->addObjects(numberLotSizing,objects);
     4403                                      for (int i = 0; i < numberLotSizing; i++)
     4404                                        delete objects[i];
     4405                                      delete [] objects;
     4406                                    }
    43494407                                    // redo existing SOS
    43504408                                    if (osiclp->numberSOS()) {
     
    79508008                        if (canOpen) {
    79518009                            int status;
     8010                            numberLotSizing=0;
     8011                            delete [] lotsize;
    79528012#ifndef CBC_OTHER_SOLVER
    79538013                            ClpSimplex * lpSolver = clpSolver->getModelPtr();
     
    79838043                                lpSolver->createStatus();
    79848044                                // make sure integer
     8045                                // also deal with semi-continuous
    79858046                                int numberColumns = lpSolver->numberColumns();
    7986                                 for (int i = 0; i < numberColumns; i++) {
     8047                                int i;
     8048                                for (i = 0; i < numberColumns; i++) {
     8049                                    if (clpSolver->integerType(i)>2)
     8050                                      break;
    79878051                                    if (lpSolver->isInteger(i))
    79888052                                        clpSolver->setInteger(i);
     8053                                }
     8054                                if (i<numberColumns) {
     8055                                  // semi-continuous
     8056                                  clpSolver->setSpecialOptions(clpSolver->specialOptions()|8388608);
     8057                                  int iStart=i;
     8058                                  for (i=iStart; i < numberColumns; i++) {
     8059                                    if (clpSolver->integerType(i)>2)
     8060                                      numberLotSizing++;
     8061                                  }
     8062                                  lotsize = new lotStruct[numberLotSizing];
     8063                                  numberLotSizing=0;
     8064                                  const double * lower = clpSolver->getColLower();
     8065                                  const double * upper = clpSolver->getColUpper();
     8066                                  for (i=iStart; i < numberColumns; i++) {
     8067                                    if (clpSolver->integerType(i)>2) {
     8068                                      int iType=clpSolver->integerType(i)-3;
     8069                                      if (!iType)
     8070                                        clpSolver->setContinuous(i);
     8071                                      else
     8072                                        clpSolver->setInteger(i);
     8073                                      lotsize[numberLotSizing].column=i;
     8074                                      lotsize[numberLotSizing].high=upper[i];
     8075                                      if (lower[i]) {
     8076                                        lotsize[numberLotSizing++].low=lower[i];
     8077                                        clpSolver->setColLower(i,0.0);
     8078                                      } else {
     8079                                        lotsize[numberLotSizing++].low=1.0;
     8080                                      }
     8081                                    }
     8082                                  }
    79898083                                }
    79908084#else
     
    81688262#endif
    81698263                                numberSOS = clpSolver->numberSOS();
    8170                                 if (numberSOS)
     8264                                if (numberSOS || lotsize)
    81718265                                  preSolve = false;
    81728266#endif
     
    81948288
    81958289                                    }
    8196                                     model2->writeMps(fileName.c_str(), (outputFormat - 1) / 2, 1 + ((outputFormat - 1)&1));
     8290                                    // see if extension lp
     8291                                    bool writeLp=false;
     8292                                    {
     8293                                      int lengthName = strlen(fileName.c_str());
     8294                                      if (lengthName>3&&!strcmp(fileName.c_str()+lengthName-3,".lp"))
     8295                                        writeLp=true;
     8296                                    }
     8297                                    if (!writeLp) {
     8298                                      model2->writeMps(fileName.c_str(), (outputFormat - 1) / 2, 1 + ((outputFormat - 1)&1));
     8299                                    } else {
     8300                                      FILE *fp = fopen(fileName.c_str(), "w");
     8301                                      assert (fp);
     8302                                      OsiClpSolverInterface solver(model2);
     8303                                      solver.writeLp(fp,1.0e-12);
     8304                                    }
    81978305                                    if (deleteModel2)
    81988306                                        delete model2;
     
    82008308                                    printf("Saving model on %s\n",
    82018309                                           fileName.c_str());
    8202                                     if (numberSOS) {
     8310#ifdef COIN_HAS_LINK
     8311                                    OsiSolverLink * linkSolver = dynamic_cast< OsiSolverLink*> (clpSolver);
     8312                                    if (!linkSolver || !linkSolver->quadraticModel()) {
     8313#endif
    82038314                                        // Convert names
    82048315                                        int iRow;
     
    82288339                                          if (lengthName>3&&!strcmp(fileName.c_str()+lengthName-3,".lp"))
    82298340                                            writeLp=true;
     8341                                        }
     8342                                        if (lotsize) {
     8343                                          for (int i=0;i<numberLotSizing;i++) {
     8344                                            int iColumn=lotsize[i].column;
     8345                                            double low = lotsize[i].low;
     8346                                            if (low!=1.0)
     8347                                              clpSolver->setColLower(iColumn,low);
     8348                                            int type;
     8349                                            if (clpSolver->isInteger(iColumn))
     8350                                              type = 4;
     8351                                            else
     8352                                              type = 3;
     8353                                            clpSolver->setColumnType(iColumn,type);
     8354                                          }
    82308355                                        }
    82318356                                        if (!writeLp) {
     
    82488373                                            delete [] columnNames;
    82498374                                        }
     8375                                        if (lotsize) {
     8376                                          for (int i=0;i<numberLotSizing;i++) {
     8377                                            int iColumn=lotsize[i].column;
     8378                                            int itype=clpSolver->integerType(iColumn);
     8379                                            clpSolver->setColLower(iColumn,0.0);
     8380                                            if (itype==3)
     8381                                              clpSolver->setContinuous(iColumn);
     8382                                            else
     8383                                              clpSolver->setInteger(iColumn);
     8384                                          }
     8385                                        }
     8386#ifdef COIN_HAS_LINK
    82508387                                    } else {
    8251 #ifdef COIN_HAS_LINK
    8252                                         OsiSolverLink * linkSolver = dynamic_cast< OsiSolverLink*> (clpSolver);
    8253                                         if (!linkSolver || !linkSolver->quadraticModel())
    8254                                             model2->writeMps(fileName.c_str(), (outputFormat - 1) / 2, 1 + ((outputFormat - 1)&1));
    8255                                         else
    8256                                             linkSolver->quadraticModel()->writeMps(fileName.c_str(), (outputFormat - 1) / 2, 1 + ((outputFormat - 1)&1));
    8257 #endif
    8258                                     }
     8388                                      linkSolver->quadraticModel()->writeMps(fileName.c_str(), (outputFormat - 1) / 2, 1 + ((outputFormat - 1)&1));
     8389                                    }
     8390#endif
    82598391                                }
    82608392                                time2 = CoinCpuTime();
     
    1017310305    }
    1017410306#endif
     10307    delete [] lotsize;
    1017510308    delete [] statistics_number_cuts;
    1017610309    delete [] statistics_name_generators;
Note: See TracChangeset for help on using the changeset viewer.