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

fix memory leaks with sos and improve checkSolution

File:
1 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
Note: See TracChangeset for help on using the changeset viewer.