Changeset 2055


Ignore:
Timestamp:
Aug 9, 2014 12:05:41 PM (5 years ago)
Author:
forrest
Message:

Fix SOS problem and also bad bestSolution_

Location:
stable/2.8/Cbc/src
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • stable/2.8/Cbc/src/CbcBranchLotsize.cpp

    r1888 r2055  
    505505    } else {
    506506        // ranges
    507         solver->setColLower(columnNumber_, bound_[2*range_]);
    508         solver->setColUpper(columnNumber_, bound_[2*range_+1]);
     507        solver->setColLower(columnNumber_, CoinMax(bound_[2*range_],
     508                                                   lower[columnNumber_]));
     509        solver->setColUpper(columnNumber_, CoinMin(bound_[2*range_+1],
     510                                                   upper[columnNumber_]));
    509511        if (value > bound_[2*range_+1])
    510512            nearest = bound_[2*range_+1];
     
    739741    int iColumn = variable_;
    740742    if (way_ < 0) {
    741 #ifdef CBC_DEBUG
     743#ifndef NDEBUG
    742744        { double olb, oub ;
    743745            olb = model_->solver()->getColLower()[iColumn] ;
    744746            oub = model_->solver()->getColUpper()[iColumn] ;
     747#ifdef CBC_DEBUG
    745748            printf("branching down on var %d: [%g,%g] => [%g,%g]\n",
    746749                   iColumn, olb, oub, down_[0], down_[1]) ;
     750#endif
     751            assert (olb<down_[0]+1.0e-7&&oub>down_[1]-1.0e-7);
    747752        }
    748753#endif
     
    751756        way_ = 1;
    752757    } else {
    753 #ifdef CBC_DEBUG
     758#ifndef NDEBUG
    754759        { double olb, oub ;
    755760            olb = model_->solver()->getColLower()[iColumn] ;
    756761            oub = model_->solver()->getColUpper()[iColumn] ;
     762#ifdef CBC_DEBUG
    757763            printf("branching up on var %d: [%g,%g] => [%g,%g]\n",
    758764                   iColumn, olb, oub, up_[0], up_[1]) ;
     765#endif
     766            assert (olb<up_[0]+1.0e-7&&oub>up_[1]-1.0e-7);
    759767        }
    760768#endif
  • stable/2.8/Cbc/src/CbcHeuristic.cpp

    r1888 r2055  
    277277    // No longer used for original purpose - so use for ever run at all JJF
    278278#ifndef JJF_ONE
    279     // Don't run if hot start
    280     if (model_ && model_->hotstartSolution())
     279    // Don't run if hot start or no rows!
     280    if (model_ && (model_->hotstartSolution()||!model_->getNumRows()))
    281281        return false;
    282282    else
  • stable/2.8/Cbc/src/CbcModel.cpp

    r2024 r2055  
    12921292            del[nDel++] = i;
    12931293    }
     1294    {
     1295      // we must not exclude current best solution (rounding errors)
     1296      // also not if large values
     1297      const int * row = continuousSolver_->getMatrixByCol()->getIndices();
     1298      const CoinBigIndex * columnStart = continuousSolver_->getMatrixByCol()->getVectorStarts();
     1299      const int * columnLength = continuousSolver_->getMatrixByCol()->getVectorLengths();
     1300      const double * solution = continuousSolver_->getColSolution();
     1301      for (int iColumn = 0; iColumn < numberColumns; iColumn++) {
     1302        if (!continuousSolver_->isInteger(iColumn)) {
     1303          double value = bestSolution_ ? bestSolution_[iColumn] : 0.0;
     1304          double value2 = solution[iColumn];
     1305          if (fabs(value-floor(value+0.5))>1.0e-8 ||
     1306              fabs(value2)>1.0e3) {
     1307            CoinBigIndex start = columnStart[iColumn];
     1308            CoinBigIndex end = start + columnLength[iColumn];
     1309            for (CoinBigIndex j = start; j < end; j++) {
     1310              int iRow = row[j];
     1311              possibleRow[iRow]=0;
     1312            }
     1313          }
     1314        }
     1315      }
     1316    }
    12941317    int nExtra = 0;
    12951318    OsiSolverInterface * copy1 = continuousSolver_->clone();
     
    20062029#endif
    20072030    bool feasible;
     2031    {
     2032      // check
     2033      int numberOdd = 0;
     2034      for (int i = 0; i < numberObjects_; i++) {
     2035        CbcSimpleInteger * obj =
     2036          dynamic_cast <CbcSimpleInteger *>(object_[i]) ;
     2037        if (!obj)
     2038          numberOdd++;
     2039      }
     2040      if (numberOdd)
     2041        moreSpecialOptions_ |= 1073741824;
     2042    }
    20082043    numberSolves_ = 0 ;
    20092044    // If NLP then we assume already solved outside branchAndbound
     
    98199854    }
    98209855    // Can't happen if strong branching as would have been found before
    9821     if (!numberStrong_ && numberObjects_ > numberIntegers_) {
     9856    if ((!numberStrong_||(moreSpecialOptions_&1073741824)!=0)
     9857        && numberObjects_ > numberIntegers_) {
    98229858        int iColumn;
    98239859        int numberColumns = solver_->getNumCols();
     
    98559891        }
    98569892        if (clpSolver && (!currentNode_ || (currentNode_->depth()&2) != 0) &&
    9857                 !solverCharacteristics_->solutionAddsCuts())
     9893                !solverCharacteristics_->solutionAddsCuts() &&
     9894            (moreSpecialOptions_&1073741824)==0)
    98589895            nTightened = clpSolver->tightenBounds();
    98599896        if (nTightened) {
  • stable/2.8/Cbc/src/CbcModel.hpp

    r2023 r2055  
    18291829        28 bit (268435456) - idiot branching
    18301830        29 bit (536870912) - don't make fake objective
     1831        30 bit (1073741824) - Funny SOS or similar - be careful
    18311832    */
    18321833    inline void setMoreSpecialOptions(int value) {
  • stable/2.8/Cbc/src/CbcNode.cpp

    r1888 r2055  
    28202820                int preferredWay;
    28212821                double infeasibility = object->infeasibility(&usefulInfo, preferredWay);
     2822                double predictedChange=0.0;
    28222823                // may have become feasible
    28232824                if (!infeasibility) {
     
    29102911                    */
    29112912                    choice.possibleBranch->way(-1) ;
    2912                     choice.possibleBranch->branch() ;
     2913                    predictedChange = choice.possibleBranch->branch() ;
    29132914                    solver->solveFromHotStart() ;
    29142915                    bool needHotStartUpdate = false;
     
    29592960#endif
    29602961                    }
     2962                    // say infeasible if branch says so
     2963                    if (predictedChange==COIN_DBL_MAX)
     2964                      iStatus=1;
    29612965                    if (iStatus != 2 && solver->getIterationCount() >
    29622966                            realMaxHotIterations)
     
    30963100
    30973101                    // repeat the whole exercise, forcing the variable up
    3098                     choice.possibleBranch->branch();
     3102                    predictedChange=choice.possibleBranch->branch();
    30993103                    solver->solveFromHotStart() ;
    31003104                    numberStrongDone++;
     
    31443148#endif
    31453149                    }
     3150                    // say infeasible if branch says so
     3151                    if (predictedChange==COIN_DBL_MAX)
     3152                      iStatus=1;
    31463153                    if (iStatus != 2 && solver->getIterationCount() >
    31473154                            realMaxHotIterations)
  • stable/2.8/Cbc/src/CbcSOS.cpp

    r1902 r2055  
    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.
  • stable/2.8/Cbc/src/CbcSolver.cpp

    r2031 r2055  
    38123812                                  dynamic_cast <CbcSimpleInteger *>(objects[iObj]) ;
    38133813                                if (!objSimpleInteger&&!objSOS) {
     3814                                  // find all integers anyway
     3815                                  babModel_->findIntegers(true);
    38143816                                  preProcess=0;
    38153817                                  break;
Note: See TracChangeset for help on using the changeset viewer.