00001
00016 #include "OSmps2osil.h"
00017 #include "OSOutput.h"
00018 #include "OSErrorClass.h"
00019 #include <iostream>
00020
00021
00022
00023 using std::cout;
00024 using std::endl;
00025
00026 OSmps2osil::OSmps2osil( std::string mpsfilename)
00027 {
00028 m_MpsData = new CoinMpsIO();
00029 int status = m_MpsData->readMps( &mpsfilename[ 0] );
00030 if (status < 0)
00031 throw ErrorClass("Error trying to read MPS file");
00032
00033 m_CoinPackedMatrix = new CoinPackedMatrix( *(m_MpsData->getMatrixByCol()));
00034 }
00035
00036 OSmps2osil::~OSmps2osil()
00037 {
00038 #ifndef NDEBUG
00039 osoutput->OSPrint(ENUM_OUTPUT_AREA_OSModelInterfaces, ENUM_OUTPUT_LEVEL_debug, "now delete m_MpsData\n");
00040 #endif
00041 delete m_MpsData;
00042 m_MpsData = NULL;
00043 delete m_CoinPackedMatrix;
00044 m_CoinPackedMatrix = NULL;
00045 osinstance->instanceData->linearConstraintCoefficients->value->el = NULL;
00046 osinstance->instanceData->linearConstraintCoefficients->start->el = NULL;
00047 osinstance->instanceData->linearConstraintCoefficients->colIdx->el = NULL;
00048 osinstance->instanceData->linearConstraintCoefficients->rowIdx->el = NULL;
00049 delete osinstance;
00050 osinstance = NULL;
00051
00052
00053 }
00054
00055
00056 bool OSmps2osil::createOSInstance( )
00057 {
00058 osinstance = new OSInstance();
00059 int i;
00060 int numvar = m_MpsData->getNumCols();
00061 int numrows = m_MpsData->getNumRows();
00062 int numnonz = m_MpsData->getNumElements();
00063 int numberObj = 1;
00064 int objIndex = -1;
00065 double objWeight = 1.0;
00066 osinstance->setInstanceName( const_cast<char*>(m_MpsData->getProblemName()));
00067
00068
00069
00070 osinstance->setVariableNumber( numvar);
00071 for(i = 0; i < numvar; i++)
00072 {
00073 osinstance->addVariable(i, m_MpsData->columnName( i),
00074 m_MpsData->getColLower()[ i], m_MpsData->getColUpper()[ i],
00075 m_MpsData->isInteger( i)? 'I':'C');
00076 }
00077
00078
00079
00080 SparseVector* objectiveCoefficients = NULL;
00081 objectiveCoefficients = new SparseVector( numvar);
00082 double *p = const_cast<double*>(m_MpsData->getObjCoefficients());
00083 for(i = 0; i < numvar; i++)
00084 {
00085 objectiveCoefficients->indexes[i] = i;
00086 objectiveCoefficients->values[i] = *(p++);
00087 }
00088
00089
00090 osinstance->setObjectiveNumber( numberObj) ;
00091 osinstance->addObjective(objIndex, m_MpsData->getObjectiveName(),
00092 "min", m_MpsData->objectiveOffset(), objWeight, objectiveCoefficients) ;
00093 delete objectiveCoefficients;
00094 objectiveCoefficients = NULL;
00095
00096
00097
00098 osinstance->setConstraintNumber( numrows);
00099 double constant = 0.0;
00100 for(i = 0; i < numrows; i++)
00101 {
00102 osinstance->addConstraint(i, m_MpsData->rowName( i), m_MpsData->getRowLower()[i],
00103 m_MpsData->getRowUpper()[i], constant);
00104 }
00105
00106
00107
00108 int valuesBegin = 0;
00109 int valuesEnd = numnonz - 1;
00110 int startsBegin = 0;
00111 int indexesBegin = 0;
00112 int indexesEnd = numnonz - 1;
00113 int startsEnd = m_CoinPackedMatrix->isColOrdered()?numvar:numrows;
00114 osinstance->setLinearConstraintCoefficients(numnonz, m_CoinPackedMatrix->isColOrdered(),
00115 const_cast<double*>(m_CoinPackedMatrix->getElements()), valuesBegin, valuesEnd,
00116 const_cast<int*>(m_CoinPackedMatrix->getIndices()), indexesBegin, indexesEnd,
00117 const_cast<int*>(m_CoinPackedMatrix->getVectorStarts()), startsBegin, startsEnd);
00118 return true;
00119 }
00120
00121
00122
00123