Changeset 1750


Ignore:
Timestamp:
Oct 23, 2011 11:24:04 PM (6 years ago)
Author:
tkr
Message:

Attempt to fix AMPL interface

Location:
trunk
Files:
5 edited

Legend:

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

    r1735 r1750  
    62096209                                    return returnCode;
    62106210                                }
     6211#ifdef COIN_HAS_ASL
     6212                                if (statusUserFunction_[0]) {
     6213                                   clpSolver = dynamic_cast< OsiClpSolverInterface*> (babModel_->solver());
     6214                                   lpSolver = clpSolver->getModelPtr();
     6215                                   double value = babModel_->getObjValue()*lpSolver->getObjSense();
     6216                                   char buf[300];
     6217                                   int pos=0;
     6218                                   if (iStat==0) {
     6219                                      if (babModel_->getObjValue()<1.0e40) {
     6220                                         pos += sprintf(buf+pos,"optimal," );
     6221                                      } else {
     6222                                         // infeasible
     6223                                         iStat=1;
     6224                                         pos += sprintf(buf+pos,"infeasible,");
     6225                                      }
     6226                                   } else if (iStat==1) {
     6227                                      if (iStat2!=6)
     6228                                         iStat=3;
     6229                                      else
     6230                                         iStat=4;
     6231                                      pos += sprintf(buf+pos,"stopped on %s,",minor[iStat2].c_str());
     6232                                   } else if (iStat==2) {
     6233                                      iStat = 7;
     6234                                      pos += sprintf(buf+pos,"stopped on difficulties,");
     6235                                   } else if (iStat==5) {
     6236                                      iStat = 3;
     6237                                      pos += sprintf(buf+pos,"stopped on ctrl-c,");
     6238                                   } else {
     6239                                      pos += sprintf(buf+pos,"status unknown,");
     6240                                      iStat=6;
     6241                                   }
     6242                                   info.problemStatus=iStat;
     6243                                   info.objValue = value;
     6244                                   if (babModel_->getObjValue()<1.0e40) {
     6245                                      int precision = ampl_obj_prec();
     6246                                      if (precision>0)
     6247                                         pos += sprintf(buf+pos," objective %.*g",precision,
     6248                                                        value);
     6249                                      else
     6250                                         pos += sprintf(buf+pos," objective %g",value);
     6251                                   }
     6252                                   sprintf(buf+pos,"\n%d nodes, %d iterations, %g seconds",
     6253                                           babModel_->getNodeCount(),
     6254                                           babModel_->getIterationCount(),
     6255                                           totalTime);
     6256                                   if (bestSolution) {
     6257                                      free(info.primalSolution);
     6258                                      if (!numberKnapsack) {
     6259                                         info.primalSolution = (double *) malloc(n*sizeof(double));
     6260                                         CoinCopyN(lpSolver->primalColumnSolution(),n,info.primalSolution);
     6261                                         int numberRows = lpSolver->numberRows();
     6262                                         free(info.dualSolution);
     6263                                         info.dualSolution = (double *) malloc(numberRows*sizeof(double));
     6264                                         CoinCopyN(lpSolver->dualRowSolution(),numberRows,info.dualSolution);
     6265                                      } else {
     6266                                         // expanded knapsack
     6267                                         info.dualSolution=NULL;
     6268                                         int numberColumns = saveCoinModel.numberColumns();
     6269                                         info.primalSolution = (double *) malloc(numberColumns*sizeof(double));
     6270                                         // Fills in original solution (coinModel length)
     6271                                         afterKnapsack(saveTightenedModel,  whichColumn,  knapsackStart,
     6272                                                       knapsackRow,  numberKnapsack,
     6273                                                       lpSolver->primalColumnSolution(), info.primalSolution,1);
     6274                                      }
     6275                                   } else {
     6276                                      info.primalSolution=NULL;
     6277                                      info.dualSolution=NULL;
     6278                                   }
     6279                                   // put buffer into info
     6280                                   strcpy(info.buffer,buf);
     6281                                }
     6282#endif
    62116283                            } else {
    62126284                                std::cout << "Model strengthened - now has " << clpSolver->getNumRows()
  • trunk/Cbc/src/CbcSolverExpandKnapsack.cpp

    r1573 r1750  
    528528
    529529
     530// Fills in original solution (coinModel length)
     531void
     532afterKnapsack(const CoinModel & coinModel2, const int * whichColumn, const int * knapsackStart,
     533              const int * knapsackRow, int numberKnapsack,
     534              const double * knapsackSolution, double * solution, int logLevel)
     535{
     536   CoinModel coinModel = coinModel2;
     537   int numberColumns = coinModel.numberColumns();
     538   int iColumn;
     539   // associate all columns to stop possible error messages
     540   for (iColumn=0;iColumn<numberColumns;iColumn++) {
     541      coinModel.associateElement(coinModel.columnName(iColumn),1.0);
     542   }
     543   CoinZeroN(solution,numberColumns);
     544   int nCol=knapsackStart[0];
     545   for (iColumn=0;iColumn<nCol;iColumn++) {
     546      int jColumn = whichColumn[iColumn];
     547      solution[jColumn]=knapsackSolution[iColumn];
     548   }
     549   int * buildRow = new int [numberColumns]; // wild overkill
     550   double * buildElement = new double [numberColumns];
     551   int iKnapsack;
     552   for (iKnapsack=0;iKnapsack<numberKnapsack;iKnapsack++) {
     553      int k=-1;
     554      double value=0.0;
     555      for (iColumn=knapsackStart[iKnapsack];iColumn<knapsackStart[iKnapsack+1];iColumn++) {
     556         if (knapsackSolution[iColumn]>1.0e-5) {
     557            if (k>=0) {
     558               printf("Two nonzero values for knapsack %d at (%d,%g) and (%d,%g)\n",iKnapsack,
     559                      k,knapsackSolution[k],iColumn,knapsackSolution[iColumn]);
     560               abort();
     561            }
     562            k=iColumn;
     563            value=floor(knapsackSolution[iColumn]+0.5);
     564            assert (fabs(value-knapsackSolution[iColumn])<1.0e-5);
     565         }
     566      }
     567      if (k>=0) {
     568         int iRow = knapsackRow[iKnapsack];
     569         int nCreate = 10000;
     570         int nel=coinModel.expandKnapsack(iRow,nCreate,NULL,NULL,buildRow,buildElement,k-knapsackStart[iKnapsack]);
     571         assert (nel);
     572         if (logLevel>0)
     573            printf("expanded column %d in knapsack %d has %d nonzero entries:\n",
     574                   k-knapsackStart[iKnapsack],iKnapsack,nel);
     575         for (int i=0;i<nel;i++) {
     576            int jColumn = buildRow[i];
     577            double value = buildElement[i];
     578            if (logLevel>0)
     579               printf("%d - original %d has value %g\n",i,jColumn,value);
     580            solution[jColumn]=value;
     581         }
     582      }
     583   }
     584   delete [] buildRow;
     585   delete [] buildElement;
     586#if 0
     587   for (iColumn=0;iColumn<numberColumns;iColumn++) {
     588      if (solution[iColumn]>1.0e-5&&coinModel.isInteger(iColumn))
     589         printf("%d %g\n",iColumn,solution[iColumn]);
     590   }
     591#endif
     592}
  • trunk/Cbc/src/CbcSolverExpandKnapsack.hpp

    r1573 r1750  
    2020               int fixedPriority, int SOSPriority, CoinModel & tightenedModel);
    2121
     22void
     23afterKnapsack(const CoinModel & coinModel2, const int * whichColumn, const int * knapsackStart,
     24              const int * knapsackRow, int numberKnapsack,
     25              const double * knapsackSolution, double * solution, int logLevel);
     26
    2227#endif
    2328
  • trunk/Cbc/src/Cbc_ampl.cpp

    r1643 r1750  
    3030*/
    3131
     32#include "CbcConfig.h"
     33
    3234#ifdef COIN_HAS_ASL
    3335
    34 #include "CbcConfig.h"
    3536#ifdef HAVE_UNISTD_H
    3637# include "unistd.h"
     
    144145static Option_Info Oinfo = {
    145146    const_cast<char*>("cbc"),
    146     const_cast<char*>("Cbc 1.04"),
     147    const_cast<char*>("CBC trunk"),
    147148    const_cast<char*>("cbc_options"),
    148149    keywds,
  • trunk/INSTALL

    r1692 r1750  
    3737
    38382. Download the tarball from http://www.coin-or.org/download/source/Cbc
    39    and extract it. For example, for the release 2.0.0 you type
     39   and extract it. For example, for the release 2.7.0 you type
    4040
    41    gunzip Cbc-2.0.0.tgz
    42    tar xvf Cbc-2.0.0.tar
    43 
    44    More detailed download instructions can be found at
     41   gunzip Cbc-2.7.0.tgz
     42   tar xvf Cbc-2.7.0.tar
    4543
    4644**********************************************************************
     
    9492More information on the compilation and installation can be found at
    9593
    96    https://projects.coin-or.org/BuildTools/wiki/user-compile
     94   https://projects.coin-or.org/BuildTools/
    9795
    9896**********************************************************************
Note: See TracChangeset for help on using the changeset viewer.