Changeset 2040


Ignore:
Timestamp:
Jun 20, 2014 8:44:51 AM (5 years ago)
Author:
forrest
Message:

fixes for odd SOS

Location:
trunk/Cbc/src
Files:
6 edited

Legend:

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

    r1956 r2040  
    280280    // No longer used for original purpose - so use for ever run at all JJF
    281281#ifndef JJF_ONE
    282     // Don't run if hot start
    283     if (model_ && model_->hotstartSolution())
     282    // Don't run if hot start or no rows!
     283    if (model_ && (model_->hotstartSolution()||!model_->getNumRows()))
    284284        return false;
    285285    else
  • trunk/Cbc/src/CbcModel.cpp

    r2025 r2040  
    20082008    bool feasible;
    20092009    numberSolves_ = 0 ;
     2010    {
     2011      // check
     2012      int numberSOS = 0;
     2013      for (int i = 0; i < numberObjects_; i++) {
     2014        CbcSOS * obj =
     2015          dynamic_cast <CbcSOS *>(object_[i]) ;
     2016        if (obj)
     2017          numberSOS++;
     2018      }
     2019      if (numberSOS)
     2020        moreSpecialOptions_ |= 1073741824;
     2021    }
    20102022    // If NLP then we assume already solved outside branchAndbound
    20112023    if (!solverCharacteristics_->solverType() || solverCharacteristics_->solverType() == 4) {
     
    99139925    }
    99149926    // Can't happen if strong branching as would have been found before
    9915     if (!numberStrong_ && numberObjects_ > numberIntegers_) {
     9927    if ((!numberStrong_||(moreSpecialOptions_&1073741824)!=0)
     9928        && numberObjects_ > numberIntegers_) {
    99169929        int iColumn;
    99179930        int numberColumns = solver_->getNumCols();
     
    99499962        }
    99509963        if (clpSolver && (!currentNode_ || (currentNode_->depth()&2) != 0) &&
    9951                 !solverCharacteristics_->solutionAddsCuts())
     9964                !solverCharacteristics_->solutionAddsCuts() &&
     9965            (moreSpecialOptions_&1073741824)==0)
    99529966            nTightened = clpSolver->tightenBounds();
    99539967        if (nTightened) {
     
    1252312537
    1252412538{
     12539 
    1252512540    double * solution = CoinCopyOfArray(solutionIn, solver_->getNumCols());
    1252612541#ifdef JJF_ZERO
     
    1264412659                    objectiveValue = objectiveValue2;
    1264512660                }
    12646             }
     12661            } else {
     12662              // not good
     12663              messageHandler()->message(CBC_GENERAL, messages())
     12664                << "On closer inspection - solution discarded"
     12665                << CoinMessageEol ;
     12666           }
    1264712667            delete [] solution2;
    1264812668            solver_->setWarmStart(basis2);
  • trunk/Cbc/src/CbcModel.hpp

    r2022 r2040  
    18441844        28 bit (268435456) - idiot branching
    18451845        29 bit (536870912) - don't make fake objective
     1846        30 bit (1073741824) - Funny SOS or similar - be careful
    18461847    */
    18471848    inline void setMoreSpecialOptions(int value) {
  • trunk/Cbc/src/CbcNode.cpp

    r1943 r2040  
    28232823                int preferredWay;
    28242824                double infeasibility = object->infeasibility(&usefulInfo, preferredWay);
     2825                bool feasibleSolution=false;
     2826                double predictedChange=0.0;
    28252827                // may have become feasible
    28262828                if (!infeasibility) {
     
    29132915                    */
    29142916                    choice.possibleBranch->way(-1) ;
    2915                     choice.possibleBranch->branch() ;
     2917                    predictedChange = choice.possibleBranch->branch() ;
    29162918                    solver->solveFromHotStart() ;
    29172919                    bool needHotStartUpdate = false;
     
    29622964#endif
    29632965                    }
     2966                    // say infeasible if branch says so
     2967                    if (predictedChange==COIN_DBL_MAX)
     2968                      iStatus=1;
    29642969                    if (iStatus != 2 && solver->getIterationCount() >
    29652970                            realMaxHotIterations)
     
    30073012#endif
    30083013                            // See if integer solution
    3009                             if (model->feasibleSolution(choice.numIntInfeasDown,
    3010                                                         choice.numObjInfeasDown)
     3014                            feasibleSolution =
     3015                              model->feasibleSolution(choice.numIntInfeasDown,
     3016                                                      choice.numObjInfeasDown);
     3017                            if (feasibleSolution
    30113018                                    && model->problemFeasibility()->feasible(model, -1) >= 0) {
    30123019                                if (auxiliaryInfo->solutionAddsCuts()) {
     
    30993106
    31003107                    // repeat the whole exercise, forcing the variable up
    3101                     choice.possibleBranch->branch();
     3108                    predictedChange=choice.possibleBranch->branch();
    31023109                    solver->solveFromHotStart() ;
    31033110                    numberStrongDone++;
     
    31473154#endif
    31483155                    }
     3156                    // say infeasible if branch says so
     3157                    if (predictedChange==COIN_DBL_MAX)
     3158                      iStatus=1;
    31493159                    if (iStatus != 2 && solver->getIterationCount() >
    31503160                            realMaxHotIterations)
     
    31913201#endif
    31923202                            // See if integer solution
    3193                             if (model->feasibleSolution(choice.numIntInfeasUp,
    3194                                                         choice.numObjInfeasUp)
     3203                            feasibleSolution =
     3204                              model->feasibleSolution(choice.numIntInfeasUp,
     3205                                                      choice.numObjInfeasUp);
     3206                            if (feasibleSolution
    31953207                                    && model->problemFeasibility()->feasible(model, -1) >= 0) {
    31963208#ifdef BONMIN
  • trunk/Cbc/src/CbcSOS.cpp

    r1900 r2040  
    461461        }
    462462    }
    463     assert (lastNonZero - firstNonZero < sosType_) ;
    464     for (j = 0; j < firstNonZero; j++) {
     463    // Might get here in odd situation if so fix all
     464    if (lastNonZero - firstNonZero < sosType_) {
     465      for (j = 0; j < firstNonZero; j++) {
    465466        int iColumn = members_[j];
    466467        solver->setColUpper(iColumn, 0.0);
    467     }
    468     for (j = lastNonZero + 1; j < numberMembers_; j++) {
     468      }
     469      for (j = lastNonZero + 1; j < numberMembers_; j++) {
    469470        int iColumn = members_[j];
    470471        solver->setColUpper(iColumn, 0.0);
     472      }
     473    } else {
     474      for (j = 0; j < numberMembers_; j++) {
     475        int iColumn = members_[j];
     476        solver->setColUpper(iColumn, 0.0);
     477        solver->setColLower(iColumn, 1.0);
     478      }
    471479    }
    472480}
     
    836844    const double * weights = set_->weights();
    837845    OsiSolverInterface * solver = model_->solver();
    838     //const double * lower = solver->getColLower();
    839     //const double * upper = solver->getColUpper();
     846    const double * lower = solver->getColLower();
     847    const double * upper = solver->getColUpper();
    840848    // *** for way - up means fix all those in down section
    841849    if (way_ < 0) {
     
    861869    }
    862870    computeNonzeroRange();
    863     return 0.0;
     871    double predictedChange=0.0;
     872    for (int i = 0; i < numberMembers; i++) {
     873      int iColumn=which[i];
     874      if (lower[iColumn]>upper[iColumn])
     875        predictedChange=COIN_DBL_MAX;
     876    }
     877    return predictedChange;
    864878}
    865879/* Update bounds in solver as in 'branch' and update given bounds.
  • trunk/Cbc/src/CbcSolver.cpp

    r2030 r2040  
    60696069                                osiclp = dynamic_cast< OsiClpSolverInterface*> (babModel_->solver());
    60706070                                lpSolver = osiclp->getModelPtr();
     6071                                int hotits = parameters_[whichParam(CBC_PARAM_INT_MAXHOTITS, numberParameters_, parameters_)].intValue();
     6072                                if (hotits>100) {
     6073                                  osiclp->setSpecialOptions(osiclp->specialOptions()&~32);
     6074                                  osiclp->setIntParam(OsiMaxNumIterationHotStart, hotits);
     6075                                } else {
     6076                                  osiclp->setIntParam(OsiMaxNumIterationHotStart, hotits);
     6077                                }
    60716078#elif CBC_OTHER_SOLVER==1
    60726079#endif
     
    69776984                                          sprintf(generalPrint + strlen(generalPrint),
    69786985                                                  "Gap:                            %.2f\n",
    6979                                                   (babModel_->getObjValue()-babModel_->getBestPossibleObjValue())/babModel_->getBestPossibleObjValue());
     6986                                                  (babModel_->getObjValue()-babModel_->getBestPossibleObjValue())/
     6987                                                  fabs(babModel_->getBestPossibleObjValue()));
    69806988                                       }
    69816989                                    }
Note: See TracChangeset for help on using the changeset viewer.