[Osi] OsiCpx writeLp not working
Matthew Galati
magh at lehigh.edu
Mon Jun 2 13:37:01 EDT 2008
It looks like the problem is related to the actual OsiCpx implementation.
Notice, if obj_ is non null, it does not get the new objective vector.
That means, if a column is added, it does not get the new information.
This is obviously not good. Ticket #62 added.
//------------------------------------------------------------------
const double * OsiCpxSolverInterface::getObjCoefficients() const
{
debugMessage("OsiCpxSolverInterface::getObjCoefficients()\n");
if ( obj_==NULL )
{
int ncols = CPXgetnumcols( env_, getMutableLpPtr() );
if( ncols > 0 )
{
obj_ = new double[ncols];
int err = CPXgetobj( env_, getMutableLpPtr(), obj_, 0, ncols-1 );
checkCPXerror( err, "CPXgetobj", "getObjCoefficients" );
}
}
return obj_;
}
> There seems to be a bigger problem at hand here.
>
> I start out with 5 columns in an OsiCpx object.
>
> If I use the base class Osi::getObjValue( ) after adding a column, I
> get the correct number of columns, but junk back from
> getObjCoefficients( ) and getColSolution( )
>
> MVG inside OsiSolverInterface nc = 6
> OsiCpxSolverInterface::getObjCoefficients()
> OsiCpxSolverInterface::getColSolution()
> OsiCpxSolverInterface::getDblParam(4)
> objOffset = 0
> MVG getObjValue i:0, retVal: -0, objCo: -15 colSol: 0
> MVG getObjValue i:1, retVal: -2.44186, objCo: -15 colSol: 0.162791
> MVG getObjValue i:2, retVal: -10.1163, objCo: -15 colSol: 0.511628
> MVG getObjValue i:3, retVal: -12.5581, objCo: -15 colSol: 0.162791
> MVG getObjValue i:4, retVal: -12.5581, objCo: -15 colSol: 0
> MVG getObjValue i:5, retVal: -12.5581, objCo: 1.56391e-311 colSol:
> 7.20064e-313
> OsiCpxSolverInterface::getNumCols()
> MVG inside OsiSolverInterface nc = 6
>
>
>> If I addCols to my OsiCpx object -- it correctly keeps the
>> information in memory, however when I call writeLp it calls the
>> native Osi writer and does not seem to have my new columns - it only
>> has the original problem. I assume this once again has something to
>> do with cached information.
>>
>> One quick fix suggestion -- use Cpx's native LP writer just like we
>> do for MPS. This is suggested in ticket 61.
>>
>> void OsiCpxSolverInterface::writeLp(const char *filename,
>> const char *extension,
>> double epsilon,
>> int numberAcross,
>> int decimals,
>> double objSense,
>> bool useRowNames) const
>> {
>> debugMessage("OsiCpxSolverInterface::writeLp(%s, %s, %g)\n",
>> filename, extens\
>> ion, objSense);
>>
>> // *FIXME* : this will not output ctype information to the MPS file
>> char filetype[4] = "LP";
>> std::string f(filename);
>> std::string e(extension);
>> std::string fullname = f + "." + e;
>> int err = CPXwriteprob( env_, getMutableLpPtr(), const_cast<char*>(
>> fullname.\
>> c_str() ), filetype );
>> checkCPXerror( err, "CPXwriteprob", "writeLp" );
>> }
>>
>>
>> _______________________________________________
>> Osi mailing list
>> Osi at list.coin-or.org
>> http://list.coin-or.org/mailman/listinfo/osi
>>
>
More information about the Osi
mailing list