Changeset 699


Ignore:
Timestamp:
Jul 21, 2007 6:41:25 PM (12 years ago)
Author:
forrest
Message:

trying to improve performance and fix message problem in CbcSolver?

Location:
trunk/Cbc/src
Files:
3 edited

Legend:

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

    r687 r699  
    434434    preferredWay=preferredWay_;
    435435  // weight at 1.0 is max min
    436 #define WEIGHT_AFTER 0.9
    437 #define WEIGHT_BEFORE 0.3
     436#define WEIGHT_AFTER 0.7
     437#define WEIGHT_BEFORE 0.1
    438438  if (fabs(value-nearest)<=integerTolerance) {
    439439    return 0.0;
     
    446446      // no solution
    447447      returnValue = WEIGHT_BEFORE*minValue + (1.0-WEIGHT_BEFORE)*maxValue;
     448      if (0) {
     449        double sum;
     450        int number;
     451        double downCost2 = CoinMax(value-below,0.0);
     452        sum = sumDownCost_;
     453        number = numberTimesDown_;
     454        if (number>0)
     455          downCost2 *= sum / (double) number;
     456        else
     457          downCost2  *=  downDynamicPseudoCost_;
     458        double upCost2 = CoinMax((above-value),0.0);
     459        sum = sumUpCost_;
     460        number = numberTimesUp_;
     461        if (number>0)
     462          upCost2 *= sum / (double) number;
     463        else
     464          upCost2  *=  upDynamicPseudoCost_;
     465        double minValue2 = CoinMin(downCost2,upCost2);
     466        double maxValue2 = CoinMax(downCost2,upCost2);
     467        printf("%d value %g downC %g upC %g minV %g maxV %g downC2 %g upC2 %g minV2 %g maxV2 %g\n",
     468               columnNumber_,value,downCost,upCost,minValue,maxValue,
     469               downCost2,upCost2,minValue2,maxValue2);
     470      }
    448471    } else {
    449472      // some solution
     
    545568    preferredWay=preferredWay_;
    546569  // weight at 1.0 is max min
    547 #define WEIGHT_BEFORE 0.3
    548570  if (fabs(value-nearest)<=integerTolerance) {
    549571    return 0.0;
     
    12471269    bestNumberDown_=INT_MAX;
    12481270  }
    1249   if (stateOfSearch<=1&&thisOne->model()->currentNode()->depth()>10) {
     1271  if (stateOfSearch<=1&&thisOne->model()->currentNode()->depth()>=8) {
    12501272#define TRY_STUFF 1
    12511273#ifdef TRY_STUFF
  • trunk/Cbc/src/CbcModel.cpp

    r696 r699  
    11211121      if (tree)
    11221122        tree->passInSolution(bestSolution_,heuristicValue);
    1123     }
    1124     for (i = 0;i<numberHeuristics_;i++) {
    1125       // delete FPump
    1126       CbcHeuristicFPump * pump
    1127         = dynamic_cast<CbcHeuristicFPump *> (heuristic_[i]);
    1128       if (pump) {
    1129         delete pump;
    1130         numberHeuristics_ --;
    1131         for (int j=i;j<numberHeuristics_;j++)
    1132           heuristic_[j] = heuristic_[j+1];
     1123      for (i = 0;i<numberHeuristics_;i++) {
     1124        // delete FPump
     1125        CbcHeuristicFPump * pump
     1126          = dynamic_cast<CbcHeuristicFPump *> (heuristic_[i]);
     1127        if (pump) {
     1128          delete pump;
     1129          numberHeuristics_ --;
     1130          for (int j=i;j<numberHeuristics_;j++)
     1131            heuristic_[j] = heuristic_[j+1];
     1132        }
    11331133      }
    11341134    }
     
    11371137  statistics_ = NULL;
    11381138  // Do on switch
    1139   if (doStatistics) {
     1139  if (doStatistics>0&&doStatistics<100) {
    11401140    maximumStatistics_=10000;
    11411141    statistics_ = new CbcStatistics * [maximumStatistics_];
     
    23762376      << maximumDepthActual_
    23772377      << numberDJFixed_ << CoinMessageEol ;
     2378  if (doStatistics==100) {
     2379    for (int i=0;i<numberObjects_;i++) {
     2380      CbcSimpleIntegerDynamicPseudoCost * obj =
     2381        dynamic_cast <CbcSimpleIntegerDynamicPseudoCost *>(object_[i]) ;
     2382      if (obj)
     2383        obj->print();
     2384    }
     2385  }
    23782386  if (statistics_) {
    23792387    // report in some way
     
    69056913    } else if (!obj2) {
    69066914      allDynamic=false;
     6915    } else {
     6916      // synchronize trust
     6917      obj2->setNumberBeforeTrust(numberBeforeTrust_);
    69076918    }
    69086919  }
  • trunk/Cbc/src/CbcSolver.cpp

    r696 r699  
    14051405  OsiClpSolverInterface * originalSolver = dynamic_cast<OsiClpSolverInterface *> (model.solver());
    14061406  assert (originalSolver);
    1407   CoinMessageHandler * generalMessageHandler = originalSolver->messageHandler();
     1407  CoinMessageHandler * generalMessageHandler = originalSolver->messageHandler()->clone();
    14081408  CoinMessages generalMessages = originalSolver->getModelPtr()->messages();
    14091409  char generalPrint[10000];
     
    30453045              OsiSolverInterface * saveSolver=NULL;
    30463046              CglPreProcess process;
     3047              // Say integers in sync
     3048              bool integersOK=true;
    30473049              delete babModel;
    30483050              babModel = new CbcModel(model);
     
    31953197                  solver2 = process.preProcessNonDefault(*saveSolver,translate[preProcess],numberPasses,
    31963198                                                         tunePreProcess);
     3199                  integersOK=false; // We need to redo if CbcObjects exist
    31973200                  // Tell solver we are not in Branch and Cut
    31983201                  saveSolver->setHintParam(OsiDoInBranchAndCut,false,OsiHintDo) ;
     
    33673370                }
    33683371                babModel->passInPriorities( priority,false);
     3372                integersOK=true;
    33693373                delete [] priority;
    33703374                delete [] sort;
     
    37113715                  // *************************************************************
    37123716                  // CbcObjects
    3713                   if (preProcess&&process.numberSOS()) {
     3717                  if (preProcess&&(process.numberSOS()||babModel->numberObjects())) {
    37143718                    int numberSOS = process.numberSOS();
    37153719                    int numberIntegers = babModel->numberIntegers();
     
    37213725                      babModel->findIntegers(true,type);
    37223726                      numberIntegers = babModel->numberIntegers();
     3727                      integersOK=true;
    37233728                    }
    37243729                    OsiObject ** oldObjects = babModel->objects();
     
    37283733                    int numberOldObjects = babModel->numberObjects();
    37293734                    int numberColumns = babModel->getNumCols();
     3735                    if (!integersOK) {
     3736                      // backward pointer to new variables
     3737                      int * newColumn = new int[numberOriginalColumns];
     3738                      int i;
     3739                      for (i=0;i<numberOriginalColumns;i++)
     3740                        newColumn[i]=-1;
     3741                      assert (originalColumns);
     3742                      for (i=0;i<numberColumns;i++)
     3743                        newColumn[originalColumns[i]]=i;
     3744                      // Change column numbers etc
     3745                      int n=0;
     3746                      for (int iObj = 0;iObj<numberOldObjects;iObj++) {
     3747                        int iColumn = oldObjects[iObj]->columnNumber();
     3748                        if (iColumn<0||iColumn>=numberOriginalColumns) {
     3749                          oldObjects[n++]=oldObjects[iObj];
     3750                        } else {
     3751                          iColumn = newColumn[iColumn];
     3752                          if (iColumn>=0) {
     3753                            CbcSimpleInteger * obj =
     3754                              dynamic_cast <CbcSimpleInteger *>(oldObjects[iObj]) ;
     3755                            assert (obj);
     3756                            obj->setColumnNumber(iColumn);
     3757                            oldObjects[n++]=oldObjects[iObj];
     3758                          } else {
     3759                            delete oldObjects[iObj];
     3760                          }
     3761                        }
     3762                      }
     3763                      delete [] newColumn;
     3764                      babModel->setNumberObjects(n);
     3765                    }
    37303766                    for (int iObj = 0;iObj<numberOldObjects;iObj++) {
    3731                       oldObjects[iObj]->setPriority(numberColumns+1);
     3767                      if (process.numberSOS())
     3768                        oldObjects[iObj]->setPriority(numberColumns+1);
    37323769                      int iColumn = oldObjects[iObj]->columnNumber();
    3733                       assert (iColumn>=0);
    3734                       if (iColumn>=numberOriginalColumns)
     3770                      if (iColumn<0||iColumn>=numberOriginalColumns)
    37353771                        continue;
    37363772                      if (originalColumns)
     
    45124548                }
    45134549                model = *babModel;
     4550                delete generalMessageHandler;
    45144551                return 777;
    45154552              } else {
     
    62636300  dmalloc_shutdown();
    62646301#endif
     6302  delete generalMessageHandler;
    62656303  return 0;
    62666304}   
Note: See TracChangeset for help on using the changeset viewer.