00001
00002
00003
00004
00005 #ifndef MPSREADER
00006 #define MPSREADER
00007
00008 #include "OoqpVectorHandle.h"
00009 #include "DoubleMatrixHandle.h"
00010 #include "SimpleVectorHandle.h"
00011 #include "stdio.h"
00012 #include "hash.h"
00013
00014 struct MpsRowInfo;
00015 struct MpsColInfo;
00016
00017 #ifdef TESTING
00018 class MpsReaderTester;
00019 #endif
00020
00038 class MpsReader {
00039 #ifdef TESTING
00040 friend MpsReaderTester;
00041 #endif
00042 private:
00043 void insertElt( int irow[], int len, int jcol[],
00044 double dval[], int& ne,
00045 int row, int col, double val, int& ier );
00046 void stuffMatrix( GenMatrix& A,
00047 int irow[], int nnz, int jcol[], double dA[] );
00048 void stuffMatrix( SymMatrix& A,
00049 int irow[], int nnz, int jcol[], double dA[] );
00050 protected:
00052 char * infilename;
00054 int iline;
00055
00057 int nnzA, nnzC, nnzQ;
00059 int my, mz;
00060
00062 FILE * file;
00063
00066 char *boundType;
00067
00068 MpsRowInfo * rowInfo;
00069 int * rowRemap;
00070 int totalRows;
00071
00072 MpsColInfo * colInfo;
00073 int totalCols;
00074 int firstColumnLine;
00075 int columnFilePosition;
00076
00077 char problemName[16];
00078 char objectiveName[16];
00079 char RHSName[16];
00080
00081 char boundName[16];
00082
00084 HashTable *rowTable;
00085
00087 HashTable *colTable;
00088
00089 double objminus;
00094 MpsReader() {};
00095
00100 MpsReader( FILE * file );
00101
00112 virtual void scanFile( int& iErr );
00113
00114 virtual int GetLine_old(char * line );
00115 virtual int GetLine(char * line );
00116
00117 virtual int ParseHeaderLine( char line[], char entry1[] );
00118 virtual int ParseHeaderLine2( char line[], char entry1[] );
00119 virtual int ParseBoundsLine( char line[], int& code, char name1[],
00120 char name2[], double * val );
00121 virtual int ParseBoundsLine2( char line[], int& code, char name1[],
00122 char name2[], double * val );
00123 virtual int ParseRowsLine( char line[], char code[], char name1[] );
00124 virtual int ParseRowsLine2( char line[], char code[], char name1[] );
00125 virtual void expectHeader( int kindOfLine, const char expectName[],
00126 char line[], int& ierr );
00127 virtual void expectHeader2( int kindOfLine, const char expectName[],
00128 char line[], int& ierr );
00129 virtual void remapRows();
00130 virtual int acceptHeader( int kindOfLine, const char expectName[],
00131 char line[], int& ierr );
00132 virtual int acceptHeader2( int kindOfLine, const char expectName[],
00133 char line[], int& ierr );
00134 virtual int ParseDataLine2( char line[], char code[], char name1[],
00135 char name2[], double * val1, int& hasSecondValue,
00136 char name3[], double * val2);
00137
00138 virtual int ParseDataLine( char line[], char code[], char name1[],
00139 char name2[], double * val1, int& hasSecondValue,
00140 char name3[], double * val2);
00141
00142 virtual int string_copy( char dest[], char string[], int max);
00143
00144 virtual void readProblemName( char line[], int& iErr, int kindOfLine );
00145 virtual void readProblemName2( char line[], int& iErr, int kindOfLine );
00146
00147 virtual void readObjectiveSense( char line[], int& iErr, int kindOfLine );
00148 virtual void readRowsSection( char line[62],
00149 int& iErr, int& return_getline );
00150 virtual void scanColsSection( char line[62],
00151 int& iErr, int& return_getline );
00152 virtual void scanRangesSection( char line[62],
00153 int& iErr, int& return_getline );
00154 virtual void rowHasRange( int rownum, double val, int& iErr );
00155 virtual void scanHessSection( char line[62],
00156 int& iErr, int& return_getline );
00157
00158 virtual void readColsSection( OoqpVector& c,
00159 GenMatrix& A, GenMatrix& C,
00160 char line[62],
00161 int& iErr, int& return_getline );
00162 virtual void readColsSection( double c[],
00163 int irowA[], int jcolA[], double dA[],
00164 int irowC[], int jcolC[], double dC[],
00165 char line[62],
00166 int& iErr, int& return_getline );
00167 virtual void readRHSSection( OoqpVector& b,
00168 SimpleVector& clow, OoqpVector& iclow,
00169 SimpleVector& cupp, OoqpVector& icupp,
00170 char line[], int& ierr, int& kindOfLine );
00171 virtual void readRHSSection( double b[],
00172 double clow[], char iclow[],
00173 double cupp[], char icupp[],
00174 char line[], int& ierr, int& kindOfLine );
00175 virtual void readRangesSection( SimpleVector& clow, SimpleVector& cupp,
00176 char line[], int& ierr, int& kindOfLine );
00177 virtual void readRangesSection( double clow[], double cupp[],
00178 char line[], int& ierr, int& kindOfLine );
00179 virtual void readBoundsSection( OoqpVector& xlow, OoqpVector& ixlow,
00180 OoqpVector& xupp, OoqpVector& ixupp,
00181 char line[], int& ierr, int& kindOfLine );
00182 virtual void defaultBounds( double xlow[], char ixlow[],
00183 double xupp[], char ixupp[] );
00184 virtual void defaultBounds( OoqpVector& xlow, OoqpVector& ixlow,
00185 OoqpVector& xupp, OoqpVector& ixupp );
00186 virtual void readBoundsSection( double xlow[], char ixlow[],
00187 double xupp[], char ixupp[],
00188 char line[], int& ierr, int& kindOfLine );
00189 virtual void readHessSection( SymMatrix& Q,
00190 char line[], int& ierr, int& kindOfLine );
00191 virtual void readHessSection( int irowQ[], int jcolQ[], double dQ[],
00192 char line[], int& ierr, int& kindOfLine );
00193
00194 public:
00201 int scalingOption;
00202
00206 char objectiveSense[3];
00207
00208
00218 static MpsReader * newReadingFile( char filename[], int& iErr );
00219
00223 static void findFile( FILE*& file, char *& resolvedName,
00224 char filename[] );
00231 void numberOfNonZeros( int& nnzQ, int& nnzA, int& nnzC );
00232 void numbersOfNonZeros( int nnzQ[], int nnzA[], int nnzC[] );
00241 virtual void readQpBound( OoqpVector& c, SymMatrix& Q,
00242 OoqpVector& xlow, OoqpVector& ixlow,
00243 OoqpVector& xupp, OoqpVector& ixupp,
00244 int &ierr );
00251 virtual void readQpGen( OoqpVector& c, SymMatrix& Q,
00252 OoqpVector& xlow, OoqpVector& ixlow,
00253 OoqpVector& xupp, OoqpVector& ixupp,
00254 GenMatrix& A, OoqpVector& b,
00255 GenMatrix& C,
00256 OoqpVector& clow, OoqpVector& iclow,
00257 OoqpVector& cupp, OoqpVector& icupp,
00258 int& ierr );
00259
00269 virtual void readQpGen( double c[],
00270 int irowQ[], int jcolQ[], double dQ[],
00271 double xlow[], char ixlow[],
00272 double xupp[], char ixupp[],
00273 int irowA[], int jcolA[], double dA[],
00274 double b[],
00275 int irowC[], int jcolC[], double dC[],
00276 double clow[], char iclow[],
00277 double cupp[], char icupp[],
00278 int& ierr );
00286 virtual void getSizes( int& nx, int& my, int& mz );
00287
00298 virtual void releaseFile( int& ierr );
00299
00301 virtual ~MpsReader();
00302
00304
00306
00307 double objconst() { return -objminus; }
00308
00313 void printSolution( double x[], int nx,
00314 double xlow[], char ixlow[],
00315 double xupp[], char ixupp[],
00316 double gamma[], double phi[],
00317 double y[], int my,
00318 double s[], int mz,
00319 double clow[], char iclow[],
00320 double cupp[], char icupp[],
00321 double lambda[], double pi[],
00322 double z[], double objectiveValue,
00323 int& iErr );
00324 char * defaultOutputFilename( int& iErr );
00325
00326 };
00327
00328 enum { mpsok = 0,
00329 mpsunknownerr = -1,
00330 mpsfileopenerr = -2,
00331 mpsioerr = -3,
00332 mpssyntaxerr = -4,
00333 mpsmemoryerr = -5
00334 };
00335
00336 #endif