- Timestamp:
- Jan 21, 2011 1:01:03 PM (9 years ago)
- Location:
- trunk/Clp/src
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Clp/src/ClpDynamicMatrix.cpp
r1676 r1677 94 94 lowerSet_ = ClpCopyOfArray(rhs.lowerSet_, numberSets_); 95 95 upperSet_ = ClpCopyOfArray(rhs.upperSet_, numberSets_); 96 status_ = ClpCopyOfArray(rhs.status_, 2*numberSets_ );96 status_ = ClpCopyOfArray(rhs.status_, 2*numberSets_+4*sizeof(int)); 97 97 model_ = rhs.model_; 98 98 sumDualInfeasibilities_ = rhs. sumDualInfeasibilities_; … … 237 237 flags_ &= ~1; 238 238 // resize model (matrix stays same) 239 int newRowSize = numberRows + CoinMin(numberSets_, CoinMax(frequency, numberRows)) + 1;239 int newRowSize = numberRows + CoinMin(numberSets_, frequency+numberRows) + 1; 240 240 model->resize(newRowSize, numberNeeded); 241 241 for (i = numberRows; i < newRowSize; i++) … … 259 259 keyVariable_ = new int[numberSets_]; 260 260 if (status) { 261 status_ = ClpCopyOfArray(status, 2*numberSets_ );261 status_ = ClpCopyOfArray(status, 2*numberSets_+4*sizeof(int)); 262 262 assert (dynamicStatus); 263 263 dynamicStatus_ = ClpCopyOfArray(dynamicStatus, 2*numberGubColumns_); 264 264 } else { 265 status_ = new unsigned char [2*numberSets_ ];265 status_ = new unsigned char [2*numberSets_+4*sizeof(int)]; 266 266 memset(status_, 0, numberSets_); 267 267 int i; … … 356 356 lowerSet_ = ClpCopyOfArray(rhs.lowerSet_, numberSets_); 357 357 upperSet_ = ClpCopyOfArray(rhs.upperSet_, numberSets_); 358 status_ = ClpCopyOfArray(rhs.status_, 2*numberSets_ );358 status_ = ClpCopyOfArray(rhs.status_, 2*numberSets_+4*sizeof(int)); 359 359 model_ = rhs.model_; 360 360 sumDualInfeasibilities_ = rhs. sumDualInfeasibilities_; … … 865 865 if (lowerSet_[iSet] == upperSet_[iSet]) 866 866 setStatus(iSet, ClpSimplex::isFixed); 867 #if 0 867 868 if (getStatus(iSet) != model->getStatus(sequenceOut)) 868 869 printf("** set %d status %d, var status %d\n", iSet, 869 870 getStatus(iSet), model->getStatus(sequenceOut)); 871 #endif 870 872 } 871 873 ClpMatrixBase::updatePivot(model, oldInValue, oldOutValue); … … 1044 1046 { 1045 1047 int returnCode = 0; 1048 #if 0 //ndef NDEBUG 1049 { 1050 int numberColumns = model->numberColumns(); 1051 int numberRows = model->numberRows(); 1052 int * pivotVariable = model->pivotVariable(); 1053 if (pivotVariable&&model->numberIterations()) { 1054 for (int i=numberStaticRows_+numberActiveSets_;i<numberRows;i++) { 1055 assert (pivotVariable[i]==i+numberColumns); 1056 } 1057 } 1058 } 1059 #endif 1046 1060 switch (mode) { 1047 1061 // Fill in pivotVariable … … 1087 1101 case 5: { 1088 1102 memcpy(status_+numberSets_,status_,numberSets_); 1103 memcpy(status_+2*numberSets_,&numberActiveSets_,sizeof(int)); 1089 1104 memcpy(dynamicStatus_+maximumGubColumns_, 1090 1105 dynamicStatus_,maximumGubColumns_); … … 1094 1109 case 6: { 1095 1110 memcpy(status_,status_+numberSets_,numberSets_); 1111 memcpy(&numberActiveSets_,status_+2*numberSets_,sizeof(int)); 1096 1112 memcpy(dynamicStatus_,dynamicStatus_+maximumGubColumns_, 1097 1113 maximumGubColumns_); … … 1266 1282 return 1; 1267 1283 } 1284 #ifndef NDEBUG 1285 { 1286 int numberColumns = model->numberColumns(); 1287 int numberRows = model->numberRows(); 1288 int * pivotVariable = model->pivotVariable(); 1289 for (int i=numberStaticRows_+numberActiveSets_;i<numberRows;i++) { 1290 assert (pivotVariable[i]==i+numberColumns); 1291 } 1292 } 1293 #endif 1268 1294 // lookup array 1269 1295 int * active = new int [numberActiveSets_]; … … 1479 1505 } 1480 1506 } 1507 if (iPut<numberStaticRows_+numberActiveSets_) { 1508 printf("lost %d sets\n", 1509 numberStaticRows_+numberActiveSets_-iPut); 1510 iPut = numberStaticRows_+numberActiveSets_; 1511 } 1481 1512 for (i = numberActiveSets_; i < currentNumberActiveSets; i++) { 1482 1513 pivotVariable[iPut++] = i + base3; 1483 1514 } 1484 assert (iPut == numberRows);1515 //assert (iPut == numberRows); 1485 1516 } 1486 1517 #ifdef CLP_DEBUG … … 2288 2319 keyVariable_[iSet] = whichKey; 2289 2320 } 2321 // clean up pivotVariable 2322 int numberColumns = model_->numberColumns(); 2323 int numberRows = model_->numberRows(); 2324 int * pivotVariable = model_->pivotVariable(); 2325 if (pivotVariable) { 2326 for (int i=0; i<numberStaticRows_+numberActiveSets_;i++) { 2327 if (model_->getRowStatus(i)!=ClpSimplex::basic) 2328 pivotVariable[i]=-1; 2329 else 2330 pivotVariable[i]=numberColumns+i; 2331 } 2332 for (int i=numberStaticRows_+numberActiveSets_;i<numberRows;i++) { 2333 pivotVariable[i]=i+numberColumns; 2334 } 2335 int put=-1; 2336 for (int i=0;i<numberColumns;i++) { 2337 if (model_->getColumnStatus(i)==ClpSimplex::basic) { 2338 while(put<numberRows) { 2339 put++; 2340 if (pivotVariable[put]==-1) { 2341 pivotVariable[put]=i; 2342 break; 2343 } 2344 } 2345 } 2346 } 2347 for (int i=CoinMax(put,0);i<numberRows;i++) { 2348 if (pivotVariable[i]==-1) 2349 pivotVariable[i]=i+numberColumns; 2350 } 2351 } 2352 if (rhsOffset_) { 2353 double * cost = model_->costRegion(); 2354 double * columnLower = model_->lowerRegion(); 2355 double * columnUpper = model_->upperRegion(); 2356 double * solution = model_->solutionRegion(); 2357 int numberRows = model_->numberRows(); 2358 for (int i = numberActiveSets_; i < numberRows-numberStaticRows_; i++) { 2359 int iSequence = i + numberStaticRows_ + numberColumns; 2360 solution[iSequence] = 0.0; 2361 columnLower[iSequence] = -COIN_DBL_MAX; 2362 columnUpper[iSequence] = COIN_DBL_MAX; 2363 cost[iSequence] = 0.0; 2364 model_->nonLinearCost()->setOne(iSequence, solution[iSequence], 2365 columnLower[iSequence], 2366 columnUpper[iSequence], 0.0); 2367 model_->setStatus(iSequence, ClpSimplex::basic); 2368 rhsOffset_[i+numberStaticRows_] = 0.0; 2369 } 2370 #if 0 2371 for (int i=0;i<numberStaticRows_;i++) 2372 printf("%d offset %g\n", 2373 i,rhsOffset_[i]); 2374 #endif 2375 } 2290 2376 numberActiveColumns_ = firstAvailable_; 2377 #if 0 2378 for (iSet = 0; iSet < numberSets_; iSet++) { 2379 for (int j=startSet_[iSet];j<startSet_[iSet+1];j++) { 2380 if (getDynamicStatus(j)==soloKey) 2381 printf("%d in set %d is solo key\n",j,iSet); 2382 else if (getDynamicStatus(j)==inSmall) 2383 printf("%d in set %d is in small\n",j,iSet); 2384 } 2385 } 2386 #endif 2291 2387 return; 2292 2388 } -
trunk/Clp/src/ClpMessage.cpp
r1665 r1677 104 104 {CLP_PARAMETRICS_STATS2, 63, 2, "Theta %g - objective %g, %s in, %s out"}, 105 105 {CLP_GENERAL, 1000, 1, "%s"}, 106 {CLP_GENERAL2, 1001, 2, "%s"}, 106 107 {CLP_DUMMY_END, 999999, 0, ""} 107 108 }; -
trunk/Clp/src/ClpMessage.hpp
r1665 r1677 105 105 CLP_PARAMETRICS_STATS2, 106 106 CLP_GENERAL, 107 CLP_GENERAL2, 107 108 CLP_DUMMY_END 108 109 }; -
trunk/Clp/src/ClpNonLinearCost.cpp
r1676 r1677 91 91 } 92 92 } 93 if (allZero )93 if (allZero&&model_->clpMatrix()->type()<15) 94 94 model_->setInfeasibilityCost(1.0); 95 95 double infeasibilityCost = model_->infeasibilityCost(); -
trunk/Clp/src/ClpSimplexOther.cpp
r1676 r1677 4173 4173 if (numberGub >= neededGub) { 4174 4174 sprintf(message,"%d gub rows", numberGub); 4175 handler_->message(CLP_GENERAL , messages_)4175 handler_->message(CLP_GENERAL2, messages_) 4176 4176 << message << CoinMessageEol; 4177 4177 int numberNormal = 0; … … 4183 4183 if (!numberNormal) { 4184 4184 sprintf(message,"Putting back one gub row to make non-empty"); 4185 handler_->message(CLP_GENERAL , messages_)4185 handler_->message(CLP_GENERAL2, messages_) 4186 4186 << message << CoinMessageEol; 4187 4187 rowIsGub[smallestGubRow]=-1; … … 4399 4399 sprintf(message,"** Before adding matrix there are %d rows and %d columns", 4400 4400 model2->numberRows(), model2->numberColumns()); 4401 handler_->message(CLP_GENERAL , messages_)4401 handler_->message(CLP_GENERAL2, messages_) 4402 4402 << message << CoinMessageEol; 4403 4403 delete [] scaleArray; … … 4439 4439 "** While after adding matrix there are %d rows and %d columns", 4440 4440 model2->numberRows(), model2->numberColumns()); 4441 handler_->message(CLP_GENERAL , messages_)4441 handler_->message(CLP_GENERAL2, messages_) 4442 4442 << message << CoinMessageEol; 4443 4443 model2->setSpecialOptions(4); // exactly to bound … … 4471 4471 double * solution = primalColumnSolution(); 4472 4472 const double * originalSolution = original.primalColumnSolution(); 4473 const double * upperSet = gubMatrix->upperSet(); 4473 4474 int numberSets = gubMatrix->numberSets(); 4474 4475 const int * startSet = gubMatrix->startSets(); … … 4477 4478 for (int i=0;i<numberSets;i++) { 4478 4479 for (int j=startSet[i];j<startSet[i+1];j++) { 4480 gubMatrix->setDynamicStatus(j,ClpDynamicMatrix::atLowerBound); 4479 4481 int iColumn = whichColumns[j+numberNormal]; 4480 4482 if (iColumn<numberColumns) … … 4543 4545 int iRow = whichRows[numberNonGub+i]; 4544 4546 if (!numberKey[iRow]) { 4545 if (original.getRowStatus(iRow)==ClpSimplex::basic) { 4547 double upper = upperSet[i]-1.0e-7; 4548 if (original.getRowStatus(iRow)==ClpSimplex::basic) 4546 4549 gubMatrix->setStatus(i,ClpSimplex::basic); 4547 } else { 4548 // If not at lb make key otherwise one with smallest number els 4549 double largest=0.0; 4550 int fewest=numberRows+1; 4551 int chosen=-1; 4552 for (int j=startSet[i];j<startSet[i+1];j++) { 4553 int length=startColumn[j+1]-startColumn[j]; 4554 int iOrig = whichColumns[j+numberNormal]; 4555 double value; 4556 if (iOrig<numberColumns) { 4557 value=originalSolution[iOrig]-columnLower[j]; 4558 } else { 4559 // slack - take value as 0.0 as will win on length 4560 value=0.0; 4561 } 4562 if (value>largest+1.0e-8) { 4563 largest=value; 4564 fewest=length; 4565 chosen=j; 4566 } else if (fabs(value-largest)<=1.0e-8&&length<fewest) { 4567 largest=value; 4568 fewest=length; 4569 chosen=j; 4570 } 4550 // If not at lb make key otherwise one with smallest number els 4551 double largest=0.0; 4552 int fewest=numberRows+1; 4553 int chosen=-1; 4554 for (int j=startSet[i];j<startSet[i+1];j++) { 4555 int length=startColumn[j+1]-startColumn[j]; 4556 int iOrig = whichColumns[j+numberNormal]; 4557 double value; 4558 if (iOrig<numberColumns) { 4559 value=originalSolution[iOrig]-columnLower[j]; 4560 if (value>upper) 4561 gubMatrix->setStatus(i,ClpSimplex::atLowerBound); 4562 } else { 4563 // slack - take value as 0.0 as will win on length 4564 value=0.0; 4571 4565 } 4572 assert(chosen>=0); 4566 if (value>largest+1.0e-8) { 4567 largest=value; 4568 fewest=length; 4569 chosen=j; 4570 } else if (fabs(value-largest)<=1.0e-8&&length<fewest) { 4571 largest=value; 4572 fewest=length; 4573 chosen=j; 4574 } 4575 } 4576 assert(chosen>=0); 4577 if (gubMatrix->getStatus(i)!=ClpSimplex::basic) { 4573 4578 // set as key 4574 4579 for (int j=startSet[i];j<startSet[i+1];j++) { -
trunk/Clp/src/OsiClp/OsiClpSolverInterface.cpp
r1664 r1677 57 57 } 58 58 #endif 59 if ((specialOptions_&2097152)!=0) { 60 resolveGub((9*modelPtr_->numberRows())/10); 61 return; 62 } 59 63 bool deleteSolver; 60 64 ClpSimplex * solver; … … 783 787 return; 784 788 } 789 if ((specialOptions_&2097152)!=0) { 790 resolveGub((9*modelPtr_->numberRows())/10); 791 return; 792 } 785 793 //void pclp(char *); 786 794 //pclp("res"); … … 1269 1277 modelPtr_->whatsChanged_ &= ~0xffff; 1270 1278 modelPtr_->whatsChanged_ |= 0x30000; 1279 } 1280 #include "ClpSimplexOther.hpp" 1281 // Resolve an LP relaxation after problem modification (try GUB) 1282 void 1283 OsiClpSolverInterface::resolveGub(int needed) 1284 { 1285 bool takeHint; 1286 OsiHintStrength strength; 1287 // Switch off printing if asked to 1288 bool gotHint = (getHintParam(OsiDoReducePrint,takeHint,strength)); 1289 assert (gotHint); 1290 int saveMessageLevel=modelPtr_->logLevel(); 1291 if (strength!=OsiHintIgnore&&takeHint) { 1292 int messageLevel=messageHandler()->logLevel(); 1293 if (messageLevel>0) 1294 modelPtr_->messageHandler()->setLogLevel(messageLevel-1); 1295 else 1296 modelPtr_->messageHandler()->setLogLevel(0); 1297 } 1298 setBasis(basis_,modelPtr_); 1299 // find gub 1300 int numberRows = modelPtr_->numberRows(); 1301 int * which = new int[numberRows]; 1302 int numberColumns = modelPtr_->numberColumns(); 1303 int * whichC = new int[numberColumns+numberRows]; 1304 ClpSimplex * model2 = 1305 static_cast<ClpSimplexOther *> (modelPtr_)->gubVersion(which,whichC, 1306 needed); 1307 if (model2) { 1308 // move in solution 1309 static_cast<ClpSimplexOther *> (model2)->setGubBasis(*modelPtr_, 1310 which,whichC); 1311 model2->setLogLevel(CoinMin(1,model2->logLevel())); 1312 ClpPrimalColumnSteepest steepest(5); 1313 model2->setPrimalColumnPivotAlgorithm(steepest); 1314 double time1 = CoinCpuTime(); 1315 model2->primal(); 1316 //printf("Primal took %g seconds\n",CoinCpuTime()-time1); 1317 static_cast<ClpSimplexOther *> (model2)->getGubBasis(*modelPtr_, 1318 which,whichC); 1319 int totalIterations = model2->numberIterations(); 1320 //modelPtr_->setLogLevel(63); 1321 modelPtr_->primal(1); 1322 modelPtr_->setNumberIterations(totalIterations+modelPtr_->numberIterations()); 1323 } else { 1324 modelPtr_->dual(); 1325 } 1326 basis_ = getBasis(modelPtr_); 1327 modelPtr_->messageHandler()->setLogLevel(saveMessageLevel); 1271 1328 } 1272 1329 // Sort of lexicographic resolve … … 6276 6333 } 6277 6334 // set normal 6278 specialOptions_ &= (2047 +3*8192+15*65536);6335 specialOptions_ &= (2047|3*8192|15*65536|2097152); 6279 6336 if (otherInformation!=NULL) { 6280 6337 int * array = static_cast<int *> (otherInformation); -
trunk/Clp/src/OsiClp/OsiClpSolverInterface.hpp
r1664 r1677 52 52 /// Resolve an LP relaxation after problem modification 53 53 virtual void resolve(); 54 55 /// Resolve an LP relaxation after problem modification (try GUB) 56 virtual void resolveGub(int needed); 54 57 55 58 /// Invoke solver's built-in enumeration algorithm … … 1369 1372 524288 Fake objective and 0-1 1370 1373 1048576 Don't recompute ray after crunch 1374 2097152 1371 1375 */ 1372 1376 mutable unsigned int specialOptions_;
Note: See TracChangeset
for help on using the changeset viewer.