[Coin-discuss] re: Preserving row and column names using readLP & OsiSolverInterface

Francois Margot fmargot at andrew.cmu.edu
Thu Feb 2 12:03:52 EST 2006



Looking at the diff:

+    if(numberHash_[0] != numberRows_) {
+      printf("### WARNING: CoinLpIO::setLpDataRowAndColNames(): non distinct row names\n");
+      // We don't normally use row names as hash so put back
+      stopHash(0);
+      names_[0] = (char **) malloc(numberRows_ * sizeof(char *));
+      char ** names = names_[0];
+      for (int i=0;i<numberRows_;i++)
+      names[i]=strdup(rownames[i]);
+    }

startHash(0) is doing more than just setting up the vector "names". Calling 
stopHash(0) deletes allocated memory and resets constants maxHash_[0]
and  numberHash_[0] to 0. I am afraid that this code creates bugs.

I don't understand why you have to modify CoinLpIO to make OsiClp pass
untiTest. Why not modify your unitTest? If you read an LP file with distinct
row names (or without row names, i.e. calling 
CoinLpIO::setLpDataRowAndColNames() with a NULL vector for the row names) 
there should be no problems.

Francois


On Wed, 1 Feb 2006, John J Forrest wrote:

> James,
>
> OsiClpSolverInterface::readLp and writeLp in cvs.  I had to make some
> changes to CoinLpIO when there are duplicate row names from ranges -
> otherwise it fails unitTest.
>
> John Forrest
>
>
>
> "James Gibbons" <James.Gibbons at nottingham.ac.uk>
> Sent by: coin-discuss-bounces at list.coin-or.org
> 02/01/2006 09:27 AM
> Please respond to
> Discussions about open source software for Operations Research
> <coin-discuss at list.coin-or.org>
>
>
> To
> <coin-discuss at list.coin-or.org>
> cc
>
> Subject
> [Coin-discuss] re: Preserving row and column names using readLP &
> OsiSolverInterface
>
>
>
>
>
>
> Dear All,
>
> Replying to myself about previous message (text at end). Investigating
> further I don't think the OsiSolverInterface::readLp function, inherited
> by OsiClpSolverInterface copies the neames into the Solver object. I've
> fixed this problem for me locally by adding the following  function to
> OsiClpSolverInterface.cpp (and a corresponding declaration in
> OsiClpSolverInterface.hpp). the function is adapted from
> OsiSolverInterface::readLp and OsiClpSolverInterface::readMps. I guess
> there maybe a more elegant way of doing this as the message handler stuff
> doesn't work and CoinLpIO::readLp doesn't return the number of errors. Is
> there any chane of getting this or an improved version included in the
> code base?
>
> Thanks,
>
> James
>
> int
> OsiClpSolverInterface::readLp(const char * filename, const double epsilon)
> {
>
>  // Get rid of integer stuff
>  delete [] integerInformation_;
>  integerInformation_=NULL;
>
>  CoinLpIO m;
>  m.setInfinity(getInfinity());
>  //m.passInMessageHandler(modelPtr_->messageHandler());
>  //*m.messagesPointer()=modelPtr_->coinMessages();
>
>  //handler_->message(COIN_SOLVER_MPS,messages_)
>  //  <<m.getProblemName()<< numberErrors <<CoinMessageEol;
>  int numberErrors = 0;
>  m.readLp(filename, epsilon);
>
>  if (!numberErrors) {
>                   // set objective function offest
>                   setDblParam(OsiObjOffset, 0);
>
>                   // set problem name
>                   setStrParam(OsiProbName, m.getProblemName());
>
>                   // no errors
> loadProblem(*m.getMatrixByCol(),m.getColLower(),m.getColUpper(),
> m.getObjCoefficients(),m.getRowSense(),m.getRightHandSide(),
>                                 m.getRowRange());
>
>                   const char *integer = m.integerColumns();
>                   int nCols = m.getNumCols();
>                   int nRows = m.getNumRows();
>                   if (integer) {
>                                 int i, n = 0;
>                                 int *index = new int [nCols];
>                                 for (i=0; i<nCols; i++) {
>                                   if (integer[i]) {
>                                 index[n++] = i;
>                                   }
>                                 }
>                                 setInteger(index,n);
>                                 delete [] index;
>                   }
>
>                   // Always keep names
>                   int iRow;
>      std::vector<std::string> rowNames = std::vector<std::string> ();
>      std::vector<std::string> columnNames = std::vector<std::string> ();
>      rowNames.reserve(nRows);
>      for (iRow=0;iRow<nRows;iRow++) {
>                                 const char * name = m.rowName(iRow);
>                                 rowNames.push_back(name);
>                   }
>
>      int iColumn;
>      columnNames.reserve(nCols);
>      for (iColumn=0;iColumn<nCols;iColumn++) {
>                                 const char * name =
> m.columnName(iColumn);
>                                 columnNames.push_back(name);
>      }
>      modelPtr_->copyNames(rowNames,columnNames);
>  }
>  return numberErrors;
>
> Dear all,
>
> I am trying to use the Clp and Cbc solvers to solve a problem generated by
> XpressMP Mosel. I have been able to read and solve the problem as a .lp
> file but not using a .mps file. (I think Xpress mps files might have a
> non-standard extension to the format?).
>
> What I can't work out how to do is too keep the row and column names from
> the original problem. A simple example:
>
>    OsiClpSolverInterface solver0;
>    std::string fn = "test2.lp";
>    solver0.readLp(fn.c_str());
>    int ncols = solver0.getNumCols();
>    for(int i=0;i<ncols;i++) {
>                                 std::cout<<solver0.getColName(i)<<"\n";}
>
> This outputs the column names as C0000001 etc. As there is no guarantee
> about what order Mosel generates the matrix in I really need access to the
> names. I've tried recompiling with LPIO_DEBUG defined in the CoinLPIO.cpp
> file and the output from this suggests that readLp is reading in the
> problem names correctly. So am I missing something obvious or doing
> something wrong?
>
> Thanks,
>
> James
>
> This message has been checked for viruses but the contents of an
> attachment
> may still contain software viruses, which could damage your computer
> system:
> you are advised to perform your own checks. Email communications with the
> University of Nottingham may be monitored as permitted by UK legislation.
>
>
> _______________________________________________
> Coin-discuss mailing list
> Coin-discuss at list.coin-or.org
> http://list.coin-or.org/mailman/listinfo/coin-discuss
>
>



More information about the Coin-discuss mailing list