- Timestamp:
- Aug 3, 2007 12:07:00 PM (14 years ago)
- Location:
- trunk/Cbc/src
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Cbc/src/CbcBranchActual.cpp
r719 r720 352 352 id_=identifier; 353 353 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 } 354 367 if (numberMembers_) { 355 368 members_ = new int[numberMembers_]; -
trunk/Cbc/src/CbcBranchActual.hpp
r708 r720 154 154 /** Array of weights */ 155 155 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 156 168 { return weights_;} 157 169 -
trunk/Cbc/src/CbcModel.cpp
r719 r720 4527 4527 OsiBranchingObject * bobj = node->modifiableBranchingObject(); 4528 4528 CbcBranchingObject * cbcobj = dynamic_cast<CbcBranchingObject *> (bobj); 4529 if (cbcobj ) {4529 if (cbcobj&&cbcobj->object()) { 4530 4530 CbcObject * object = cbcobj->object(); 4531 4531 CbcObjectUpdateData update = object->createUpdateInformation(solver_,node,cbcobj); … … 6855 6855 OsiClpSolverInterface * clpSolver 6856 6856 = dynamic_cast<OsiClpSolverInterface *> (solver_); 6857 if (clpSolver&& clpSolver->numberSOS()) {6857 if (clpSolver&&(clpSolver->numberSOS()||clpSolver->numberObjects())) { 6858 6858 // deal with sos 6859 6859 const CoinSet * setInfo = clpSolver->setInfo(); 6860 6860 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 } 6870 6890 } 6871 6891 } -
trunk/Cbc/src/CbcSolver.cpp
r717 r720 40 40 #include "OsiRowCutDebugger.hpp" 41 41 #include "OsiChooseVariable.hpp" 42 //#define USER_HAS_FAKE_CLP 43 //#define USER_HAS_FAKE_CBC 42 44 //#define CLP_MALLOC_STATISTICS 43 45 #ifdef CLP_MALLOC_STATISTICS … … 1409 1411 CoinMessageHandler * generalMessageHandler = model.messageHandler(); 1410 1412 generalMessageHandler->setPrefix(false); 1413 // Move handler across if not default 1414 if (!originalSolver->defaultHandler()&&originalSolver->getModelPtr()->defaultHandler()) 1415 originalSolver->getModelPtr()->passInMessageHandler(originalSolver->messageHandler()); 1411 1416 CoinMessages generalMessages = originalSolver->getModelPtr()->messages(); 1412 1417 char generalPrint[10000]; … … 1630 1635 solver->setObjSense(info.direction); 1631 1636 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 } 1632 1644 // Set integer variables (unless nonlinear when set) 1633 1645 if (!info.nonLinear) { … … 1878 1890 #endif 1879 1891 if (!lpSolver->integerInformation()&&!numberSOS&& 1880 !clpSolver->numberSOS() )1892 !clpSolver->numberSOS()&&!model.numberObjects()&&!clpSolver->numberObjects()) 1881 1893 type=DUALSIMPLEX; 1882 1894 } … … 2507 2519 solveOptions.setSpecialOption(4,barrierOptions); 2508 2520 } 2521 model2->setMaximumSeconds(model.getMaximumSeconds()); 2509 2522 #ifdef COIN_HAS_LINK 2510 2523 OsiSolverInterface * coinSolver = model.solver(); … … 2536 2549 model2->initialSolve(solveOptions); 2537 2550 #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 } 2538 2621 basisHasValues=1; 2539 2622 if (dualize) { … … 3180 3263 delete [] prohibited; 3181 3264 } 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 } 3182 3287 int numberPasses = 10; 3183 3288 if (tunePreProcess>=1000000) { … … 3746 3851 int numberOldObjects = babModel->numberObjects(); 3747 3852 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; 3748 3861 if (!integersOK) { 3749 // backward pointer to new variables3750 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;3757 3862 // Change column numbers etc 3758 3863 int n=0; … … 3774 3879 } 3775 3880 } 3776 delete [] newColumn;3777 3881 babModel->setNumberObjects(n); 3778 3882 } 3883 int nMissing=0; 3779 3884 for (int iObj = 0;iObj<numberOldObjects;iObj++) { 3780 3885 if (process.numberSOS()) 3781 3886 oldObjects[iObj]->setPriority(numberColumns+1); 3782 3887 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 } 3784 3908 continue; 3909 } 3785 3910 if (originalColumns) 3786 3911 iColumn = originalColumns[iColumn]; … … 3807 3932 } 3808 3933 } 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; 3809 3941 const int * starts = process.startSOS(); 3810 3942 const int * which = process.whichSOS(); … … 3820 3952 objects[iSOS]->setPriority(numberColumns-n); 3821 3953 } 3822 babModel->addObjects(numberSOS,objects); 3954 if (numberSOS) 3955 babModel->addObjects(numberSOS,objects); 3823 3956 for (iSOS=0;iSOS<numberSOS;iSOS++) 3824 3957 delete objects[iSOS]; … … 6317 6450 model.moveInfo(*babModel); 6318 6451 delete babModel; 6452 model.solver()->setWarmStart(NULL); 6319 6453 return 0; 6320 6454 } -
trunk/Cbc/src/CoinSolve.cpp
r718 r720 14 14 #include <iostream> 15 15 // define TEST_MESSAGE_HANDLER to check works on all messages 16 16 //#define TEST_MESSAGE_HANDLER 17 17 #ifdef TEST_MESSAGE_HANDLER 18 18 // This driver shows how to trap messages - this is just as in unitTest.cpp … … 211 211 clpSolver->messageHandler()->setLogLevel(1) ; 212 212 model.messageHandler()->setLogLevel(1); 213 // switch off some printing 214 void setCbcOrClpPrinting(bool yesNo); 215 setCbcOrClpPrinting(false); 213 216 #endif 214 217 int returnCode = CbcMain1 (argc, argv,model); 215 218 if (returnCode!=777) { 219 //const CoinWarmStartBasis* debugws = 220 //dynamic_cast <const CoinWarmStartBasis*>(model.solver()->getWarmStart()) ; 221 //debugws->print() ; 222 //delete debugws ; 216 223 return returnCode; 217 224 } else {
Note: See TracChangeset
for help on using the changeset viewer.