Changeset 720


Ignore:
Timestamp:
Aug 3, 2007 12:07:00 PM (12 years ago)
Author:
forrest
Message:

message handling and sos to CbcSolver?

Location:
trunk/Cbc/src
Files:
5 edited

Legend:

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

    r719 r720  
    352352  id_=identifier;
    353353  integerValued_ = type==1;
     354  if (integerValued_) {
     355    // check all members integer
     356    OsiSolverInterface * solver = model->solver();
     357    if (solver) {
     358      for (int i=0;i<numberMembers_;i++) {
     359        if (!solver->isInteger(which[i]))
     360          integerValued_=false;
     361      }
     362    } else {
     363      // can't tell
     364      integerValued_=false;
     365    }
     366  }
    354367  if (numberMembers_) {
    355368    members_ = new int[numberMembers_];
  • trunk/Cbc/src/CbcBranchActual.hpp

    r708 r720  
    154154  /** Array of weights */
    155155  inline const double * weights() const
     156  { return weights_;}
     157
     158  /// Set number of members
     159  inline void setNumberMembers(int n)
     160  {numberMembers_ = n;}
     161
     162  /// Members (indices in range 0 ... numberColumns-1)
     163  inline int * mutableMembers() const
     164  {return members_;}
     165
     166  /** Array of weights */
     167  inline double * mutableWeights() const
    156168  { return weights_;}
    157169
  • trunk/Cbc/src/CbcModel.cpp

    r719 r720  
    45274527    OsiBranchingObject * bobj = node->modifiableBranchingObject();
    45284528    CbcBranchingObject * cbcobj = dynamic_cast<CbcBranchingObject *> (bobj);
    4529     if (cbcobj) {
     4529    if (cbcobj&&cbcobj->object()) {
    45304530      CbcObject * object = cbcobj->object();
    45314531      CbcObjectUpdateData update = object->createUpdateInformation(solver_,node,cbcobj);
     
    68556855    OsiClpSolverInterface * clpSolver
    68566856      = dynamic_cast<OsiClpSolverInterface *> (solver_);
    6857     if (clpSolver&&clpSolver->numberSOS()) {
     6857    if (clpSolver&&(clpSolver->numberSOS()||clpSolver->numberObjects())) {
    68586858      // deal with sos
    68596859      const CoinSet * setInfo = clpSolver->setInfo();
    68606860      int numberSOS = clpSolver->numberSOS();
    6861       nObjects=0;
    6862       delete [] oldObject;
    6863       oldObject = new OsiObject * [numberSOS];
    6864       for (int i=0;i<numberSOS;i++) {
    6865         int type = setInfo[i].setType();
    6866         int n=setInfo[i].numberEntries();
    6867         const int * which = setInfo[i].which();
    6868         const double * weights = setInfo[i].weights();
    6869         oldObject[nObjects++] = new CbcSOS(this,n,which,weights,i,type);
     6861      if (numberSOS) {
     6862        nObjects=0;
     6863        delete [] oldObject;
     6864        oldObject = new OsiObject * [numberSOS];
     6865        for (int i=0;i<numberSOS;i++) {
     6866          int type = setInfo[i].setType();
     6867          int n=setInfo[i].numberEntries();
     6868          const int * which = setInfo[i].which();
     6869          const double * weights = setInfo[i].weights();
     6870          oldObject[nObjects++] = new CbcSOS(this,n,which,weights,i,type);
     6871        }
     6872      } else {
     6873        // objects - only works with SOS at present
     6874        int numberObjects = clpSolver->numberObjects();
     6875        nObjects=0;
     6876        delete [] oldObject;
     6877        oldObject = new OsiObject * [numberObjects];
     6878        OsiObject ** osiObjects = clpSolver->objects();
     6879        for (int i=0;i<numberObjects;i++) {
     6880          OsiSOS * obj =
     6881            dynamic_cast <OsiSOS *>(osiObjects[i]) ;
     6882          if (obj) {
     6883            int type = obj->setType();
     6884            int n=obj->numberMembers();
     6885            const int * which = obj->members();
     6886            const double * weights = obj->weights();
     6887            oldObject[nObjects++] = new CbcSOS(this,n,which,weights,i,type);
     6888          }
     6889        }
    68706890      }
    68716891    }
  • trunk/Cbc/src/CbcSolver.cpp

    r717 r720  
    4040#include "OsiRowCutDebugger.hpp"
    4141#include "OsiChooseVariable.hpp"
     42//#define USER_HAS_FAKE_CLP
     43//#define USER_HAS_FAKE_CBC
    4244//#define CLP_MALLOC_STATISTICS
    4345#ifdef CLP_MALLOC_STATISTICS
     
    14091411  CoinMessageHandler * generalMessageHandler = model.messageHandler();
    14101412  generalMessageHandler->setPrefix(false);
     1413  // Move handler across if not default
     1414  if (!originalSolver->defaultHandler()&&originalSolver->getModelPtr()->defaultHandler())
     1415    originalSolver->getModelPtr()->passInMessageHandler(originalSolver->messageHandler());
    14111416  CoinMessages generalMessages = originalSolver->getModelPtr()->messages();
    14121417  char generalPrint[10000];
     
    16301635      solver->setObjSense(info.direction);
    16311636      solver->setDblParam(OsiObjOffset,info.offset);
     1637      if (info.offset) {
     1638        sprintf(generalPrint,"Ampl objective offset is %g",
     1639                info.offset);
     1640        generalMessageHandler->message(CLP_GENERAL,generalMessages)
     1641          << generalPrint
     1642          <<CoinMessageEol;
     1643      }
    16321644      // Set integer variables (unless nonlinear when set)
    16331645      if (!info.nonLinear) {
     
    18781890#endif
    18791891          if (!lpSolver->integerInformation()&&!numberSOS&&
    1880               !clpSolver->numberSOS())
     1892              !clpSolver->numberSOS()&&!model.numberObjects()&&!clpSolver->numberObjects())
    18811893            type=DUALSIMPLEX;
    18821894        }
     
    25072519                solveOptions.setSpecialOption(4,barrierOptions);
    25082520              }
     2521              model2->setMaximumSeconds(model.getMaximumSeconds());
    25092522#ifdef COIN_HAS_LINK
    25102523              OsiSolverInterface * coinSolver = model.solver();
     
    25362549              model2->initialSolve(solveOptions);
    25372550#endif
     2551              {
     2552                // map states
     2553                /* clp status
     2554                   -1 - unknown e.g. before solve or if postSolve says not optimal
     2555                   0 - optimal
     2556                   1 - primal infeasible
     2557                   2 - dual infeasible
     2558                   3 - stopped on iterations or time
     2559                   4 - stopped due to errors
     2560                   5 - stopped by event handler (virtual int ClpEventHandler::event()) */
     2561                /* cbc status
     2562                   -1 before branchAndBound
     2563                   0 finished - check isProvenOptimal or isProvenInfeasible to see if solution found
     2564                   (or check value of best solution)
     2565                   1 stopped - on maxnodes, maxsols, maxtime
     2566                   2 difficulties so run was abandoned
     2567                   (5 event user programmed event occurred) */
     2568                /* clp secondary status of problem - may get extended
     2569                   0 - none
     2570                   1 - primal infeasible because dual limit reached OR probably primal
     2571                   infeasible but can't prove it (main status 4)
     2572                   2 - scaled problem optimal - unscaled problem has primal infeasibilities
     2573                   3 - scaled problem optimal - unscaled problem has dual infeasibilities
     2574                   4 - scaled problem optimal - unscaled problem has primal and dual infeasibilities
     2575                   5 - giving up in primal with flagged variables
     2576                   6 - failed due to empty problem check
     2577                   7 - postSolve says not optimal
     2578                   8 - failed due to bad element check
     2579                   9 - status was 3 and stopped on time
     2580                   100 up - translation of enum from ClpEventHandler
     2581                */
     2582                /* cbc secondary status of problem
     2583                   -1 unset (status_ will also be -1)
     2584                   0 search completed with solution
     2585                   1 linear relaxation not feasible (or worse than cutoff)
     2586                   2 stopped on gap
     2587                   3 stopped on nodes
     2588                   4 stopped on time
     2589                   5 stopped on user event
     2590                   6 stopped on solutions
     2591                   7 linear relaxation unbounded
     2592                */
     2593                int iStatus = model2->status();
     2594                int iStatus2 = model2->secondaryStatus();
     2595                if (iStatus==0) {
     2596                  iStatus2=0;
     2597                } else if (iStatus==1) {
     2598                  iStatus=0;
     2599                  iStatus2=1; // say infeasible
     2600                } else if (iStatus==2) {
     2601                  iStatus=0;
     2602                  iStatus2=7; // say unbounded
     2603                } else if (iStatus==3) {
     2604                  iStatus=1;
     2605                  if (iStatus2==9)
     2606                    iStatus2=4;
     2607                  else
     2608                    iStatus2=3; // Use nodes - as closer than solutions
     2609                } else if (iStatus==4) {
     2610                  iStatus=2; // difficulties
     2611                  iStatus2=0;
     2612                }
     2613                model.setProblemStatus(iStatus);
     2614                model.setSecondaryStatus(iStatus2);
     2615                // and in babModel if exists
     2616                if (babModel) {
     2617                  babModel->setProblemStatus(iStatus);
     2618                  babModel->setSecondaryStatus(iStatus2);
     2619                }
     2620              }
    25382621              basisHasValues=1;
    25392622              if (dualize) {
     
    31803263                    delete [] prohibited;
    31813264                  }
     3265                  if (model.numberObjects()) {
     3266                    OsiObject ** oldObjects = babModel->objects();
     3267                    int numberOldObjects = babModel->numberObjects();
     3268                    // SOS
     3269                    int numberColumns = saveSolver->getNumCols();
     3270                    char * prohibited = new char[numberColumns];
     3271                    memset(prohibited,0,numberColumns);
     3272                    for (int iObj = 0;iObj<numberOldObjects;iObj++) {
     3273                      CbcSOS * obj =
     3274                        dynamic_cast <CbcSOS *>(oldObjects[iObj]) ;
     3275                      if (obj) {
     3276                        int n=obj->numberMembers();
     3277                        const int * which = obj->members();
     3278                        for (int i=0;i<n;i++) {
     3279                          int iColumn = which[i];
     3280                          prohibited[iColumn]=1;
     3281                        }
     3282                      }
     3283                    }
     3284                    process.passInProhibited(prohibited,numberColumns);
     3285                    delete [] prohibited;
     3286                  }
    31823287                  int numberPasses = 10;
    31833288                  if (tunePreProcess>=1000000) {
     
    37463851                    int numberOldObjects = babModel->numberObjects();
    37473852                    int numberColumns = babModel->getNumCols();
     3853                    // backward pointer to new variables
     3854                    int * newColumn = new int[numberOriginalColumns];
     3855                    int i;
     3856                    for (i=0;i<numberOriginalColumns;i++)
     3857                      newColumn[i]=-1;
     3858                    assert (originalColumns);
     3859                    for (i=0;i<numberColumns;i++)
     3860                      newColumn[originalColumns[i]]=i;
    37483861                    if (!integersOK) {
    3749                       // backward pointer to new variables
    3750                       int * newColumn = new int[numberOriginalColumns];
    3751                       int i;
    3752                       for (i=0;i<numberOriginalColumns;i++)
    3753                         newColumn[i]=-1;
    3754                       assert (originalColumns);
    3755                       for (i=0;i<numberColumns;i++)
    3756                         newColumn[originalColumns[i]]=i;
    37573862                      // Change column numbers etc
    37583863                      int n=0;
     
    37743879                        }
    37753880                      }
    3776                       delete [] newColumn;
    37773881                      babModel->setNumberObjects(n);
    37783882                    }
     3883                    int nMissing=0;
    37793884                    for (int iObj = 0;iObj<numberOldObjects;iObj++) {
    37803885                      if (process.numberSOS())
    37813886                        oldObjects[iObj]->setPriority(numberColumns+1);
    37823887                      int iColumn = oldObjects[iObj]->columnNumber();
    3783                       if (iColumn<0||iColumn>=numberOriginalColumns)
     3888                      if (iColumn<0||iColumn>=numberOriginalColumns) {
     3889                        CbcSOS * obj =
     3890                          dynamic_cast <CbcSOS *>(oldObjects[iObj]) ;
     3891                        if (obj) {
     3892                          int n=obj->numberMembers();
     3893                          int * which = obj->mutableMembers();
     3894                          double * weights = obj->mutableWeights();
     3895                          int nn=0;
     3896                          for (i=0;i<n;i++) {
     3897                            int iColumn = which[i];
     3898                            int jColumn = newColumn[iColumn];
     3899                            if (jColumn>=0) {
     3900                              which[nn] = jColumn;
     3901                              weights[nn++]=weights[i];
     3902                            } else {
     3903                              nMissing++;
     3904                            }
     3905                          }
     3906                          obj->setNumberMembers(nn);
     3907                        }
    37843908                        continue;
     3909                      }
    37853910                      if (originalColumns)
    37863911                        iColumn = originalColumns[iColumn];
     
    38073932                      }
    38083933                    }
     3934                    if (nMissing) {
     3935                      sprintf(generalPrint,"%d SOS variables vanished due to pre processing? - check validity?\n",nMissing);
     3936                      generalMessageHandler->message(CLP_GENERAL,generalMessages)
     3937                        << generalPrint
     3938                        <<CoinMessageEol;
     3939                    }
     3940                    delete [] newColumn;
    38093941                    const int * starts = process.startSOS();
    38103942                    const int * which = process.whichSOS();
     
    38203952                      objects[iSOS]->setPriority(numberColumns-n);
    38213953                    }
    3822                     babModel->addObjects(numberSOS,objects);
     3954                    if (numberSOS)
     3955                      babModel->addObjects(numberSOS,objects);
    38233956                    for (iSOS=0;iSOS<numberSOS;iSOS++)
    38243957                      delete objects[iSOS];
     
    63176450    model.moveInfo(*babModel);
    63186451  delete babModel;
     6452  model.solver()->setWarmStart(NULL);
    63196453  return 0;
    63206454}   
  • trunk/Cbc/src/CoinSolve.cpp

    r718 r720  
    1414#include <iostream>
    1515  // define TEST_MESSAGE_HANDLER to check works on all messages
    16   //#define TEST_MESSAGE_HANDLER
     16//#define TEST_MESSAGE_HANDLER
    1717#ifdef TEST_MESSAGE_HANDLER
    1818// This driver shows how to trap messages - this is just as in unitTest.cpp
     
    211211  clpSolver->messageHandler()->setLogLevel(1) ;
    212212  model.messageHandler()->setLogLevel(1);
     213  // switch off some printing
     214  void setCbcOrClpPrinting(bool yesNo);
     215  setCbcOrClpPrinting(false);
    213216#endif
    214217  int returnCode = CbcMain1 (argc, argv,model);
    215218  if (returnCode!=777) {
     219    //const CoinWarmStartBasis* debugws =
     220    //dynamic_cast <const CoinWarmStartBasis*>(model.solver()->getWarmStart()) ;
     221    //debugws->print() ;
     222    //delete debugws ;
    216223    return returnCode;
    217224  } else {
Note: See TracChangeset for help on using the changeset viewer.