Ignore:
Timestamp:
Jul 21, 2013 5:00:37 AM (6 years ago)
Author:
forrest
Message:

changes to allow more options and stop on feasible (and a few other things)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Clp/src/ClpMain.cpp

    r1946 r1972  
    34613461           } else if (value!=-COIN_DBL_MAX) {
    34623462             if (model->logLevel() > 4)
    3463              printf("Singleton %d with objective in row with %d equal elements - rhs %g,%g\n",iColumn,rowLength[iRow],rowLower[iRow],rowUpper[iRow]);
     3463               printf("Singleton %d (%s) with objective in row %d (%s) with %d equal elements - rhs %g,%g\n",iColumn,model->getColumnName(iColumn).c_str(),
     3464                      iRow,model->getRowName(iRow).c_str(),
     3465                      rowLength[iRow],rowLower[iRow],rowUpper[iRow]);
    34643466             nPossibleNonzeroCost++;
    34653467           }
     
    34703472                nPossibleZeroCost,nPossibleNonzeroCost);
    34713473       // look for DW
    3472        int * blockStart = new int [2*(numberRows+numberColumns)+1+numberRows];
     3474       int * blockStart = new int [3*(numberRows+numberColumns)+1];
    34733475       int * columnBlock = blockStart+numberRows;
    34743476       int * nextColumn = columnBlock+numberColumns;
    34753477       int * blockCount = nextColumn+numberColumns;
    34763478       int * blockEls = blockCount+numberRows+1;
     3479       int * countIntegers = blockEls+numberRows;
     3480       memset(countIntegers,0,numberColumns*sizeof(int));
    34773481       int direction[2]={-1,1};
    34783482       int bestBreak=-1;
     
    36533657         int numberEmptyColumns=0;
    36543658         int numberMasterColumns=0;
     3659         int numberMasterIntegers=0;
    36553660         for (int iColumn = 0; iColumn < numberColumns; iColumn++) {
    36563661           int iBlock=columnBlock[iColumn];
     3662           bool isInteger = (model->isInteger(iColumn));
    36573663           if (iBlock>=0) {
    36583664             nextColumn[iBlock]++;
     3665             if (isInteger)
     3666               countIntegers[iBlock]++;
    36593667           } else {
     3668             if (isInteger)
     3669               numberMasterIntegers++;
    36603670             if (columnLength[iColumn])
    36613671               numberMasterColumns++;
     
    36753685         if (numberMaster>halfway||largestRows*3>numberRows)
    36763686           useful=false;
    3677          printf("%s %d blocks (largest %d,%d), %d master rows (%d empty) out of %d, %d master columns (%d empty) out of %d\n",
     3687         printf("%s %d blocks (largest %d,%d), %d master rows (%d empty) out of %d, %d master columns (%d empty, %d integer) out of %d\n",
    36783688                useful ? "**Useful" : "NoGood",
    36793689                numberBlocks,largestRows,largestColumns,numberMaster,numberEmpty,numberRows,
    3680                 numberMasterColumns,numberEmptyColumns,numberColumns);
     3690                numberMasterColumns,numberEmptyColumns,numberMasterIntegers,
     3691                numberColumns);
    36813692         for (int i=0;i<numberBlocks;i++)
    3682            printf("Block %d has %d rows and %d columns (%d elements)\n",
    3683                   i,blockCount[i],nextColumn[i],blockEls[i]);
     3693           printf("Block %d has %d rows and %d columns (%d elements, %d integers)\n",
     3694                  i,blockCount[i],nextColumn[i],blockEls[i],countIntegers[i]);
     3695         FILE * fpBlocks = fopen("blocks.data","wb");
     3696         printf("Blocks data on file blocks.data\n");
     3697         int stats[3];
     3698         stats[0]=numberRows;
     3699         stats[1]=numberColumns;
     3700         stats[2]=numberBlocks;
     3701         size_t numberWritten;
     3702         numberWritten=fwrite(stats,sizeof(int),3,fpBlocks);
     3703         assert (numberWritten==3);
     3704         numberWritten=fwrite(blockStart,sizeof(int),numberRows,fpBlocks);
     3705         assert (numberWritten==numberRows);
     3706         numberWritten=fwrite(columnBlock,sizeof(int),numberColumns,fpBlocks);
     3707         assert (numberWritten==numberColumns);
     3708         fclose(fpBlocks);
    36843709         if (model->logLevel() == 17) {
    36853710           int * whichRows=new int[numberRows+numberColumns];
     
    36993724             }
    37003725             ClpSimplex subset(model,nRows,whichRows,nColumns,whichColumns);
     3726             for (int jRow=0;jRow<nRows;jRow++) {
     3727               int iRow = whichRows[jRow];
     3728               std::string name = model->getRowName(iRow);
     3729               subset.setRowName(jRow,name);
     3730             }
     3731             for (int jColumn=0;jColumn<nColumns;jColumn++) {
     3732               int iColumn = whichColumns[jColumn];
     3733               if (model->isInteger(iColumn))
     3734                 subset.setInteger(jColumn);
     3735               std::string name = model->getColumnName(iColumn);
     3736               subset.setColumnName(jColumn,name);
     3737             }
    37013738             subset.writeMps(name,0,1);
    37023739           }
     
    42824319     breakdown("ColumnUpper", numberColumns, columnUpper);
    42834320     breakdown("Objective", numberColumns, objective);
     4321     // do integer objective
     4322     double * obj = CoinCopyOfArray(objective,numberColumns);
     4323     int n=0;
     4324     //#define FIX_COSTS 1.0
     4325#ifdef FIX_COSTS
     4326     double * obj2   = originalModel->objective();
     4327     double * upper2   = originalModel->columnUpper();
     4328#endif
     4329     for (int i=0;i<numberColumns;i++) {
     4330       if (integerInformation&&integerInformation[i]) {
     4331         obj[n++]=obj[i];
     4332#ifdef FIX_COSTS
     4333         if (obj2[i]>FIX_COSTS)
     4334         upper2[i]=0.0;
     4335#endif
     4336       }
     4337     }
     4338     if (n) {
     4339       breakdown("Integer objective", n, obj);
     4340     }
    42844341}
    42854342static bool maskMatches(const int * starts, char ** masks,
Note: See TracChangeset for help on using the changeset viewer.