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

message handling and sos to CbcSolver?

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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}   
Note: See TracChangeset for help on using the changeset viewer.