00001
00016 #include "OSmps2OS.h"
00017 #include "OSOutput.h"
00018 #include "OSErrorClass.h"
00019 #include <iostream>
00020 #include <sstream>
00021
00022 using std::endl;
00023
00024 OSmps2OS::OSmps2OS( std::string mpsfilename)
00025 {
00026 m_MpsData = new CoinMpsIO();
00027 m_nOfSOS = 0;
00028 m_SOS = NULL;
00029 m_quadColumnStart = NULL;
00030 m_quadColumnIdx = NULL;
00031 m_quadElements = NULL;
00032 m_coneStart = NULL;
00033 m_coneIdx = NULL;
00034 m_coneType = NULL;
00035
00036 int status = m_MpsData->readMps( &mpsfilename[ 0], "", m_nOfSOS, m_SOS );
00037 if (status != 0)
00038 throw ErrorClass("Error trying to read MPS file");
00039
00040 m_CoinPackedMatrix = new CoinPackedMatrix( *(m_MpsData->getMatrixByCol()));
00041
00042 if (m_nOfSOS > 0)
00043 {
00044 #ifndef NDEBUG
00045 std::ostringstream outStr;
00046 {
00047 outStr << "Detected " << m_nOfSOS << " special ordered sets" << std::endl;
00048 for (int i=0; i < m_nOfSOS; i++)
00049 {
00050 int numberEntries = m_SOS[i]->numberEntries();
00051 const int * which = m_SOS[i]->which();
00052 const double * weights = m_SOS[i]->weights();
00053 outStr << "SOS " << i << " has type " << m_SOS[i]->setType();
00054 outStr << " and " << numberEntries << " entries:" << std::endl;
00055 for (int j=0;j<numberEntries;j++)
00056 outStr << " Idx: " << which[j] << " Weight: " << weights[j] << std::endl;
00057 }
00058 osoutput->OSPrint(ENUM_OUTPUT_AREA_OSModelInterfaces, ENUM_OUTPUT_LEVEL_debug, outStr.str());
00059 }
00060 #endif
00061
00062 }
00063
00064 while (m_MpsData->reader()->whichSection ( ) != COIN_ENDATA_SECTION )
00065 {
00066 switch (m_MpsData->reader()->whichSection ( ))
00067 {
00068 case COIN_QUAD_SECTION:
00069 status = m_MpsData->readQuadraticMps(NULL, m_quadColumnStart, m_quadColumnIdx, m_quadElements, 0);
00070
00071 if (status != 0)
00072 {
00073 if (status != -2 && status != -3)
00074 throw ErrorClass("Error trying to read QUADOBJ section");
00075 }
00076 else
00077 {
00078 #ifndef NDEBUG
00079 std::ostringstream outStr;
00080 int numberColumns=m_MpsData->getNumCols();
00081 outStr << "Quadratic objective has " << m_quadColumnStart[numberColumns] << " entries" << std::endl;
00082 outStr << "Column starts:" << std::endl;
00083 for (int i=0; i<=numberColumns; i++)
00084 outStr << " " << m_quadColumnStart[i] << std::endl;
00085 for (int i=0; i<numberColumns; i++)
00086 {
00087 if (m_quadColumnStart[i] < m_quadColumnStart[i+1])
00088 {
00089 outStr << "Column " << i << ": index value" << std::endl;
00090 for (int j=m_quadColumnStart[i];j<m_quadColumnStart[i+1];j++)
00091 outStr << " " << m_quadColumnIdx[j] << " " << m_quadElements[j] << std::endl;
00092 }
00093 }
00094 osoutput->OSPrint(ENUM_OUTPUT_AREA_OSModelInterfaces, ENUM_OUTPUT_LEVEL_debug, outStr.str());
00095 #endif
00096
00097 }
00098 break;
00099
00100
00101 case COIN_CONIC_SECTION:
00102 m_nOfCones;
00103 status = m_MpsData->readConicMps(NULL, m_coneStart, m_coneIdx, m_coneType, m_nOfCones);
00104 if (status != 0)
00105 {
00106 if (status != -2 && status != -3)
00107 throw ErrorClass("Error trying to read cone section");
00108 }
00109 else
00110 {
00111 #ifndef NDEBUG
00112 std::ostringstream outStr;
00113 outStr << "Conic section has " << m_nOfCones << " cones" << std::endl;
00114 for (int i=0;i<m_nOfCones;i++)
00115 {
00116 outStr << "Cone " << i << " has " << m_coneStart[i+1]-m_coneStart[i] << " entries ";
00117 outStr << "(type " << m_coneType[i] << "):" << std::endl;
00118 for (int j=m_coneStart[i];j<m_coneStart[i+1];j++)
00119 outStr << " " << m_coneIdx[j] << std::endl;
00120 }
00121 osoutput->OSPrint(ENUM_OUTPUT_AREA_OSModelInterfaces, ENUM_OUTPUT_LEVEL_debug, outStr.str());
00122 #endif
00123
00124 }
00125
00126 break;
00127
00128
00129 case COIN_BASIS_SECTION:
00130 #ifndef NDEBUG
00131 {
00132 std::ostringstream outStr;
00133 outStr << "Basis section has not been implemented yet" << std::endl;
00134 osoutput->OSPrint(ENUM_OUTPUT_AREA_OSModelInterfaces, ENUM_OUTPUT_LEVEL_debug, outStr.str());
00135 }
00136 #endif
00137 break;
00138
00139 default:
00140 throw ErrorClass("encountered unknown section in MPS file");
00141 }
00142 }
00143 }
00144
00145 OSmps2OS::~OSmps2OS()
00146 {
00147 #ifndef NDEBUG
00148 osoutput->OSPrint(ENUM_OUTPUT_AREA_OSModelInterfaces, ENUM_OUTPUT_LEVEL_debug, "now delete m_MpsData\n");
00149 #endif
00150 delete m_MpsData;
00151 m_MpsData = NULL;
00152 delete m_CoinPackedMatrix;
00153 m_CoinPackedMatrix = NULL;
00154 osinstance->instanceData->linearConstraintCoefficients->value->el = NULL;
00155 osinstance->instanceData->linearConstraintCoefficients->start->el = NULL;
00156 osinstance->instanceData->linearConstraintCoefficients->colIdx->el = NULL;
00157 osinstance->instanceData->linearConstraintCoefficients->rowIdx->el = NULL;
00158 delete osinstance;
00159 osinstance = NULL;
00160
00161 if (m_SOS != NULL)
00162 delete m_SOS;
00163 m_SOS = NULL;
00164
00165 if (m_quadColumnStart != NULL)
00166 delete m_quadColumnStart;
00167 m_quadColumnStart = NULL;
00168
00169 if (m_quadColumnIdx != NULL)
00170 delete m_quadColumnIdx;
00171 m_quadColumnIdx = NULL;
00172
00173 if (m_quadElements != NULL)
00174 delete m_quadElements;
00175 m_quadElements = NULL;
00176
00177 if (m_coneStart != NULL)
00178 delete m_coneStart;
00179 m_coneStart = NULL;
00180
00181 if (m_coneIdx != NULL)
00182 delete m_coneIdx;
00183 m_coneIdx = NULL;
00184
00185 if (m_coneType != NULL)
00186 delete m_coneType;
00187 m_coneType = NULL;
00188
00189 }
00190
00191
00192 bool OSmps2OS::createOSObjects()
00193 {
00194 int i;
00195 int numvar = m_MpsData->getNumCols();
00196 int numrows = m_MpsData->getNumRows();
00197 int numnonz = m_MpsData->getNumElements();
00198 int numberObj = 1;
00199 int objIndex = -1;
00200 std::ostringstream outStr;
00201
00202 osinstance = new OSInstance();
00203
00204 osinstance->setInstanceName( const_cast<char*>(m_MpsData->getProblemName()));
00205
00206
00207
00208 osinstance->setVariableNumber( numvar);
00209
00210 for(i = 0; i < numvar; i++)
00211 {
00212 char vartype = 'C';
00213 if (m_MpsData->isInteger( i) )
00214 {
00215 if (m_MpsData->getColLower()[ i] == 0 && m_MpsData->getColUpper()[ i] == 1)
00216 vartype = 'B';
00217 else
00218 vartype = 'I';
00219 }
00220 osinstance->addVariable(i, m_MpsData->columnName( i),
00221 m_MpsData->getColLower()[ i], m_MpsData->getColUpper()[ i],
00222 vartype);
00223 }
00224
00225
00226
00227 double objWeight = 1.0;
00228 SparseVector* objectiveCoefficients = NULL;
00229 objectiveCoefficients = new SparseVector( numvar);
00230 double *p = const_cast<double*>(m_MpsData->getObjCoefficients());
00231 for(i = 0; i < numvar; i++)
00232 {
00233 objectiveCoefficients->indexes[i] = i;
00234 objectiveCoefficients->values[i] = *(p++);
00235 }
00236
00237
00238 osinstance->setObjectiveNumber( numberObj) ;
00239 osinstance->addObjective(objIndex, m_MpsData->getObjectiveName(),
00240 "min", m_MpsData->objectiveOffset(), objWeight, objectiveCoefficients) ;
00241 delete objectiveCoefficients;
00242 objectiveCoefficients = NULL;
00243
00244
00245
00246 osinstance->setConstraintNumber( numrows);
00247 double constant = 0.0;
00248 for(i = 0; i < numrows; i++)
00249 {
00250 osinstance->addConstraint(i, m_MpsData->rowName( i), m_MpsData->getRowLower()[i],
00251 m_MpsData->getRowUpper()[i], constant);
00252 }
00253
00254
00255
00256 int valuesBegin = 0;
00257 int valuesEnd = numnonz - 1;
00258 int startsBegin = 0;
00259 int indexesBegin = 0;
00260 int indexesEnd = numnonz - 1;
00261 int startsEnd = m_CoinPackedMatrix->isColOrdered()?numvar:numrows;
00262 osinstance->setLinearConstraintCoefficients(numnonz, m_CoinPackedMatrix->isColOrdered(),
00263 const_cast<double*>(m_CoinPackedMatrix->getElements()), valuesBegin, valuesEnd,
00264 const_cast<int*>(m_CoinPackedMatrix->getIndices()), indexesBegin, indexesEnd,
00265 const_cast<int*>(m_CoinPackedMatrix->getVectorStarts()), startsBegin, startsEnd);
00266
00267
00268 if (m_quadColumnStart != NULL)
00269 {
00270 int numberColumns=m_MpsData->getNumCols();
00271 int numberElements=m_quadColumnStart[numberColumns];
00272 if (numberElements > 0)
00273 {
00274 int *rowindexes = new int[numberElements];
00275 for (int i=0; i<numberElements;i++)
00276 rowindexes[i] = -1;
00277 int *colindexes = new int[numberElements];
00278 for (int i=0; i<numberColumns; i++)
00279 for (int j=m_quadColumnStart[i];j<m_quadColumnStart[i+1];j++)
00280 colindexes[j] = i;
00281 osinstance->setQuadraticCoefficients(numberElements, rowindexes, colindexes,
00282 m_quadColumnIdx, m_quadElements, 0, numberElements-1);
00283 }
00284 }
00285
00286
00287
00288 return true;
00289 }
00290