Changeset 2365


Ignore:
Timestamp:
Feb 24, 2018 12:05:08 PM (7 months ago)
Author:
forrest
Message:

fix memory leaks with sos and improve checkSolution

Location:
trunk/Cbc/src
Files:
3 edited

Legend:

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

    r2362 r2365  
    1234312343            modifiedTolerances |= 4;
    1234412344            clp->scaling(0);
     12345            clpContinuousSolver->setHintParam(OsiDoScale, false, OsiHintTry);
    1234512346          }
    1234612347#endif
     
    1254512546#endif
    1254612547#ifndef CBC_LEAVE_SCALING_ON_CHECK_SOLUTION
    12547               clp->scaling(saveScaling);
     12548              if (saveScaling) {
     12549                clp->scaling(saveScaling);
     12550                clpContinuousSolver->setHintParam(OsiDoScale, true, OsiHintTry);
     12551              }
    1254812552#endif
    1254912553            }
     
    1276912773#endif
    1277012774#ifndef CBC_LEAVE_SCALING_ON_CHECK_SOLUTION
    12771                       clp->scaling(saveScaling);
     12775                      if (saveScaling) {
     12776                        clp->scaling(saveScaling);
     12777                        clpContinuousSolver->setHintParam(OsiDoScale, true, OsiHintTry);
     12778                      }
    1277212779#endif
    1277312780                      solver_->resolve();
     
    1302813035#endif
    1302913036#ifndef CBC_LEAVE_SCALING_ON_CHECK_SOLUTION
    13030           clp->scaling(saveScaling);
     13037          if (saveScaling) {
     13038            clp->scaling(saveScaling);
     13039            clpContinuousSolver->setHintParam(OsiDoScale, true, OsiHintTry);
     13040          }
    1303113041#endif
    1303213042        }
     
    1955319563        mipStart_.push_back( std::pair<std::string, double>( std::string(colNames[i]), colValues[i]) );
    1955419564}
    19555 
     19565/* Add SOS info to solver -
     19566   Overwrites SOS information in solver with information
     19567   in CbcModel.  Has no effect with some solvers.
     19568   Also updates integer info. */
     19569void
     19570CbcModel::addSOSEtcToSolver()
     19571{
     19572  // at present just for OsiClp
     19573# ifdef COIN_HAS_CLP
     19574  OsiClpSolverInterface * clpSolver
     19575    = dynamic_cast<OsiClpSolverInterface *> (solver_);
     19576  if (clpSolver) {
     19577    int numberColumns = clpSolver->getNumCols();
     19578    for (int i=0;i<numberColumns;i++)
     19579      clpSolver->setContinuous(i);
     19580    int nOdd=0;
     19581    int numberSOS=0;
     19582    for (int i = 0; i < numberObjects_; i++) {
     19583      CbcObject * obj = dynamic_cast <CbcObject *>(object_[i]) ;
     19584      CbcSimpleInteger * thisInt = dynamic_cast <CbcSimpleInteger *> (obj);
     19585      OsiSOS * objSOS1 = dynamic_cast <OsiSOS *>(obj) ;
     19586      CbcSOS * objSOS2 = dynamic_cast <CbcSOS *>(obj) ;
     19587      if (thisInt) {
     19588        clpSolver->setInteger(thisInt->columnNumber());
     19589      } else if (objSOS1) {
     19590        numberSOS++;
     19591      } else if (objSOS2) {
     19592        numberSOS++;
     19593      } else {
     19594        nOdd++;
     19595      }
     19596    }
     19597    if (nOdd) {
     19598      char general[200];
     19599      sprintf(general,"%d objects not SOS or Integer - can't move to Osi",
     19600              nOdd);
     19601      messageHandler()->message(CBC_GENERAL,
     19602                                messages())
     19603        << general << CoinMessageEol ;
     19604    }
     19605    if (numberSOS) {
     19606      CoinSet * setInfo = new CoinSet [numberSOS];
     19607      numberSOS=0;
     19608      for (int i = 0; i < numberObjects_; i++) {
     19609        CbcObject * obj = dynamic_cast <CbcObject *>(object_[i]) ;
     19610        OsiSOS * objSOS1 = dynamic_cast <OsiSOS *>(obj) ;
     19611        CbcSOS * objSOS2 = dynamic_cast <CbcSOS *>(obj) ;
     19612        if (objSOS1 || objSOS2) {
     19613          int numberMembers;
     19614          const int * members;
     19615          int type;
     19616          const double * weights;
     19617          if (objSOS1) {
     19618            numberMembers = objSOS1->numberMembers();
     19619            members = objSOS1->members();
     19620            type = objSOS1->sosType();
     19621            weights = objSOS1->weights();
     19622          } else {
     19623            numberMembers = objSOS2->numberMembers();
     19624            members = objSOS2->members();
     19625            type = objSOS2->sosType();
     19626            weights = objSOS2->weights();
     19627          }
     19628          CoinSosSet info(numberMembers,members,
     19629                          weights,type);
     19630          //info.setSetType(type);
     19631          //memcpy(info.modifiableWeights(),weights,
     19632          //     numberMembers*sizeof(double));
     19633          setInfo[numberSOS++] = info;
     19634        }
     19635      }
     19636      clpSolver->replaceSetInfo(numberSOS,setInfo);
     19637    }
     19638  }
     19639#endif
     19640}
     19641
  • trunk/Cbc/src/CbcModel.hpp

    r2341 r2365  
    513513
    514514    void findIntegers(bool startAgain, int type = 0);
     515    /** Add SOS info to solver -
     516        Overwrites SOS information in solver with information
     517        in CbcModel.  Has no effect with some solvers.
     518        Also updates integer info. */
     519    void addSOSEtcToSolver();
    515520
    516521#ifdef SWITCH_VARIABLES
  • trunk/Cbc/src/CbcSolver.cpp

    r2359 r2365  
    40274027                                  }
    40284028                                  // Lotsizing
    4029                                   int numberColumns = babModel_->solver()->getNumCols();
     4029                                  //int numberColumns = babModel_->solver()->getNumCols();
    40304030                                  CbcObject ** objects =
    40314031                                    new CbcObject * [numberLotSizing];
     
    80168016                                    numberSOS = clpSolver->numberSOS();
    80178017                                    const CoinSet * setInfo = clpSolver->setInfo();
    8018                                     sosStart = new int [numberSOS+1];
    8019                                     sosType = new char [numberSOS];
     8018                                    sosStart = reinterpret_cast<int *>(malloc((numberSOS+1)*sizeof(int)));
     8019                                    sosType = reinterpret_cast<char *>(malloc(numberSOS*sizeof(char)));
    80208020                                    const double * lower =
    80218021                                      clpSolver->getColLower();
     
    80328032                                        sosStart[i+1] = nTotal;
    80338033                                    }
    8034                                     sosIndices = new int[nTotal];
    8035                                     sosReference = new double [nTotal];
     8034                                    sosIndices = reinterpret_cast<int *>(malloc(nTotal*sizeof(int)));
     8035                                    sosReference = reinterpret_cast<double *>(malloc(nTotal*sizeof(double)));
    80368036                                    for (i = 0; i < numberSOS; i++) {
    80378037                                        int n = setInfo[i].numberEntries();
     
    83658365                                        if (!writeLp) {
    83668366                                          remove(fileName.c_str());
     8367                                          //model_.addSOSEtcToSolver();
    83678368                                          clpSolver->writeMpsNative(fileName.c_str(), const_cast<const char **> (rowNames), const_cast<const char **> (columnNames),
    83688369                                                                    (outputFormat - 1) / 2, 1 + ((outputFormat - 1)&1));
Note: See TracChangeset for help on using the changeset viewer.