00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef CoinLpIO_H
00016 #define CoinLpIO_H
00017
00018 #include <cstdio>
00019
00020 #include "CoinPackedMatrix.hpp"
00021 #include "CoinMessage.hpp"
00022
00023 typedef int COINColumnIndex;
00024
00099 class CoinLpIO {
00100 friend void CoinLpIOUnitTest(const std::string & lpDir);
00101 public:
00102
00105
00106 CoinLpIO();
00107
00109 void gutsOfDestructor();
00110
00112 void gutsOfCopy(const CoinLpIO &);
00113
00115 CoinLpIO & operator = (const CoinLpIO& rhs) ;
00116
00118 CoinLpIO (const CoinLpIO &);
00119
00121 ~CoinLpIO();
00122
00128 void freePreviousNames(const int section);
00129
00131 void freeAll();
00133
00136 inline void
00137 convertBoundToSense(const double lower, const double upper,
00138 char& sense, double& right, double& range) const;
00139
00142
00144 const char * getProblemName() const;
00145
00147 void setProblemName(const char *name);
00148
00150 int getNumCols() const;
00151
00153 int getNumRows() const;
00154
00156 int getNumElements() const;
00157
00159 const double * getColLower() const;
00160
00162 const double * getColUpper() const;
00163
00165 const double * getRowLower() const;
00166
00168 const double * getRowUpper() const;
00178 const char * getRowSense() const;
00179
00191 const double * getRightHandSide() const;
00192
00206 const double * getRowRange() const;
00207
00209 const double * getObjCoefficients() const;
00210
00212 const CoinPackedMatrix * getMatrixByRow() const;
00213
00215 const CoinPackedMatrix * getMatrixByCol() const;
00216
00218 const char * getObjName() const;
00219
00225 void getPreviousRowNames(char const * const * prev,
00226 int *card_prev) const;
00227
00232 void getPreviousColNames(char const * const * prev,
00233 int *card_prev) const;
00234
00237 char const * const * getRowNames() const;
00238
00240 char const * const *getColNames() const;
00241
00245 const char * rowName(int index) const;
00246
00250 const char * columnName(int index) const;
00251
00255 int rowIndex(const char * name) const;
00256
00259 int columnIndex(const char * name) const;
00260
00262 double objectiveOffset() const;
00263
00265 inline void setObjectiveOffset(double value)
00266 { objectiveOffset_ = value;}
00267
00270 bool isInteger(int columnNumber) const;
00271
00273 const char * integerColumns() const;
00275
00278
00279 double getInfinity() const;
00280
00283 void setInfinity(const double);
00284
00286 double getEpsilon() const;
00287
00290 void setEpsilon(const double);
00291
00293 int getNumberAcross() const;
00294
00297 void setNumberAcross(const int);
00298
00300 int getDecimals() const;
00301
00304 void setDecimals(const int);
00306
00318 void setLpDataWithoutRowAndColNames(
00319 const CoinPackedMatrix& m,
00320 const double* collb, const double* colub,
00321 const double* obj_coeff,
00322 const char* integrality,
00323 const double* rowlb, const double* rowub);
00324
00337 int is_invalid_name(const char *buff, const bool ranged) const;
00338
00355 int are_invalid_names(char const * const *vnames,
00356 const int card_vnames,
00357 const bool check_ranged) const;
00358
00361 void setDefaultRowNames();
00362
00364 void setDefaultColNames();
00365
00385 void setLpDataRowAndColNames(char const * const * const rownames,
00386 char const * const * const colnames);
00387
00402 int writeLp(const char *filename,
00403 const double epsilon,
00404 const int numberAcross,
00405 const int decimals,
00406 const bool useRowNames = true);
00407
00422 int writeLp(FILE *fp,
00423 const double epsilon,
00424 const int numberAcross,
00425 const int decimals,
00426 const bool useRowNames = true);
00427
00430 int writeLp(const char *filename, const bool useRowNames = true);
00431
00434 int writeLp(FILE *fp, const bool useRowNames = true);
00435
00440 void readLp(const char *filename, const double epsilon);
00441
00446 void readLp(const char *filename);
00447
00453 void readLp(FILE *fp, const double epsilon);
00454
00459 void readLp(FILE *fp);
00460
00462 void print() const;
00464
00471 void passInMessageHandler(CoinMessageHandler * handler);
00472
00474 void newLanguage(CoinMessages::Language language);
00475
00477 inline void setLanguage(CoinMessages::Language language) {newLanguage(language);}
00478
00480 inline CoinMessageHandler * messageHandler() const {return handler_;}
00481
00483 inline CoinMessages messages() {return messages_;}
00485 inline CoinMessages * messagesPointer() {return & messages_;}
00487
00488 protected:
00490 char * problemName_;
00491
00493 CoinMessageHandler * handler_;
00499 bool defaultHandler_;
00501 CoinMessages messages_;
00502
00504 int numberRows_;
00505
00507 int numberColumns_;
00508
00510 int numberElements_;
00511
00513 mutable CoinPackedMatrix *matrixByColumn_;
00514
00516 CoinPackedMatrix *matrixByRow_;
00517
00519 double * rowlower_;
00520
00522 double * rowupper_;
00523
00525 double * collower_;
00526
00528 double * colupper_;
00529
00531 mutable double * rhs_;
00532
00536 mutable double *rowrange_;
00537
00539 mutable char * rowsense_;
00540
00542 double * objective_;
00543
00545 double objectiveOffset_;
00546
00549 char * integerType_;
00550
00552 char * fileName_;
00553
00555 double infinity_;
00556
00558 double epsilon_;
00559
00561 int numberAcross_;
00562
00564 int decimals_;
00565
00567 char *objName_;
00568
00575 char **previous_names_[2];
00576
00581 int card_previous_names_[2];
00582
00587 char **names_[2];
00588
00589 typedef struct {
00590 int index, next;
00591 } CoinHashLink;
00592
00596 int maxHash_[2];
00597
00601 int numberHash_[2];
00602
00606 mutable CoinHashLink *hash_[2];
00607
00613 void startHash(char const * const * const names,
00614 const COINColumnIndex number,
00615 int section);
00616
00620 void stopHash(int section);
00621
00626 COINColumnIndex findHash(const char *name, int section) const;
00627
00632 void insertHash(const char *thisName, int section);
00633
00636 void out_coeff(FILE *fp, double v, int print_1) const;
00637
00641 int find_obj(FILE *fp) const;
00642
00648 int is_subject_to(const char *buff) const;
00649
00652 int first_is_number(const char *buff) const;
00653
00656 int is_comment(const char *buff) const;
00657
00659 void skip_comment(char *buff, FILE *fp) const;
00660
00662 void scan_next(char *buff, FILE *fp) const;
00663
00666 int is_free(const char *buff) const;
00667
00670 int is_inf(const char *buff) const;
00671
00677 int is_sense(const char *buff) const;
00678
00688 int is_keyword(const char *buff) const;
00689
00692 int read_monom_obj(FILE *fp, double *coeff, char **name, int *cnt,
00693 char **obj_name);
00694
00699 int read_monom_row(FILE *fp, char *start_str, double *coeff, char **name,
00700 int cnt_coeff) const;
00701
00703 void realloc_coeff(double **coeff, char ***colNames, int *maxcoeff) const;
00704
00706 void realloc_row(char ***rowNames, int **start, double **rhs,
00707 double **rowlow, double **rowup, int *maxrow) const;
00708
00710 void realloc_col(double **collow, double **colup, char **is_int,
00711 int *maxcol) const;
00712
00714 void read_row(FILE *fp, char *buff, double **pcoeff, char ***pcolNames,
00715 int *cnt_coeff, int *maxcoeff,
00716 double *rhs, double *rowlow, double *rowup,
00717 int *cnt_row, double inf) const;
00718
00732 void checkRowNames();
00733
00742 void checkColNames();
00743
00744 };
00745
00746 void
00747 CoinLpIOUnitTest(const std::string& lpDir);
00748
00749
00750 #endif