00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include <cstdio>
00017
00018 class CoinPackedMatrix;
00019 #include "CoinMessage.hpp"
00020
00021 typedef int COINColumnIndex;
00022
00094 class CoinLpIO {
00095
00096 public:
00097
00100
00101 CoinLpIO();
00102
00104 ~CoinLpIO();
00105
00111 void freePreviousNames(const int section);
00112
00114 void freeAll();
00116
00119 inline void
00120 convertBoundToSense(const double lower, const double upper,
00121 char& sense, double& right, double& range) const;
00122
00125
00127 const char * getProblemName() const;
00128
00130 void setProblemName(const char *name);
00131
00133 int getNumCols() const;
00134
00136 int getNumRows() const;
00137
00139 int getNumElements() const;
00140
00142 const double * getColLower() const;
00143
00145 const double * getColUpper() const;
00146
00148 const double * getRowLower() const;
00149
00151 const double * getRowUpper() const;
00161 const char * getRowSense() const;
00162
00174 const double * getRightHandSide() const;
00175
00189 const double * getRowRange() const;
00190
00192 const double * getObjCoefficients() const;
00193
00195 const CoinPackedMatrix * getMatrixByRow() const;
00196
00198 const CoinPackedMatrix * getMatrixByCol() const;
00199
00201 const char * getObjName() const;
00202
00208 void getPreviousRowNames(char const * const * prev,
00209 int *card_prev) const;
00210
00215 void getPreviousColNames(char const * const * prev,
00216 int *card_prev) const;
00217
00220 char const * const * getRowNames() const;
00221
00223 char const * const *getColNames() const;
00224
00228 const char * rowName(int index) const;
00229
00233 const char * columnName(int index) const;
00234
00238 int rowIndex(const char * name) const;
00239
00242 int columnIndex(const char * name) const;
00243
00245 double objectiveOffset() const;
00246
00248 inline void setObjectiveOffset(double value)
00249 { objectiveOffset_ = value;}
00250
00253 bool isInteger(int columnNumber) const;
00254
00256 const char * integerColumns() const;
00258
00261
00262 double getInfinity() const;
00263
00266 void setInfinity(const double);
00267
00269 double getEpsilon() const;
00270
00273 void setEpsilon(const double);
00274
00276 int getNumberAcross() const;
00277
00280 void setNumberAcross(const int);
00281
00283 int getDecimals() const;
00284
00287 void setDecimals(const int);
00289
00301 void setLpDataWithoutRowAndColNames(
00302 const CoinPackedMatrix& m,
00303 const double* collb, const double* colub,
00304 const double* obj_coeff,
00305 const char* integrality,
00306 const double* rowlb, const double* rowub);
00307
00320 int is_invalid_name(const char *buff, const bool ranged) const;
00321
00338 int are_invalid_names(char const * const *vnames,
00339 const int card_vnames,
00340 const bool check_ranged) const;
00341
00344 void setDefaultRowNames();
00345
00347 void setDefaultColNames();
00348
00368 void setLpDataRowAndColNames(char const * const * const rownames,
00369 char const * const * const colnames);
00370
00385 int writeLp(const char *filename,
00386 const double epsilon,
00387 const int numberAcross,
00388 const int decimals,
00389 const bool useRowNames = true);
00390
00405 int writeLp(FILE *fp,
00406 const double epsilon,
00407 const int numberAcross,
00408 const int decimals,
00409 const bool useRowNames = true);
00410
00413 int writeLp(const char *filename, const bool useRowNames = true);
00414
00417 int writeLp(FILE *fp, const bool useRowNames = true);
00418
00423 void readLp(const char *filename, const double epsilon);
00424
00429 void readLp(const char *filename);
00430
00436 void readLp(FILE *fp, const double epsilon);
00437
00442 void readLp(FILE *fp);
00443
00445 void print() const;
00447
00454 void passInMessageHandler(CoinMessageHandler * handler);
00455
00457 void newLanguage(CoinMessages::Language language);
00458
00460 inline void setLanguage(CoinMessages::Language language) {newLanguage(language);}
00461
00463 inline CoinMessageHandler * messageHandler() const {return handler_;}
00464
00466 inline CoinMessages messages() {return messages_;}
00468 inline CoinMessages * messagesPointer() {return & messages_;}
00470
00471 protected:
00473 char * problemName_;
00474
00476 CoinMessageHandler * handler_;
00482 bool defaultHandler_;
00484 CoinMessages messages_;
00485
00487 int numberRows_;
00488
00490 int numberColumns_;
00491
00493 int numberElements_;
00494
00496 mutable CoinPackedMatrix *matrixByColumn_;
00497
00499 CoinPackedMatrix *matrixByRow_;
00500
00502 double * rowlower_;
00503
00505 double * rowupper_;
00506
00508 double * collower_;
00509
00511 double * colupper_;
00512
00514 mutable double * rhs_;
00515
00519 mutable double *rowrange_;
00520
00522 mutable char * rowsense_;
00523
00525 double * objective_;
00526
00528 double objectiveOffset_;
00529
00532 char * integerType_;
00533
00535 char * fileName_;
00536
00538 double infinity_;
00539
00541 double epsilon_;
00542
00544 int numberAcross_;
00545
00547 int decimals_;
00548
00550 char *objName_;
00551
00558 char **previous_names_[2];
00559
00564 int card_previous_names_[2];
00565
00570 char **names_[2];
00571
00572 typedef struct {
00573 int index, next;
00574 } CoinHashLink;
00575
00579 int maxHash_[2];
00580
00584 int numberHash_[2];
00585
00589 mutable CoinHashLink *hash_[2];
00590
00596 void startHash(char const * const * const names,
00597 const COINColumnIndex number,
00598 int section);
00599
00603 void stopHash(int section);
00604
00609 COINColumnIndex findHash(const char *name, int section) const;
00610
00615 void insertHash(const char *thisName, int section);
00616
00619 void out_coeff(FILE *fp, double v, int print_1) const;
00620
00624 int find_obj(FILE *fp) const;
00625
00631 int is_subject_to(const char *buff) const;
00632
00635 int first_is_number(const char *buff) const;
00636
00639 int is_comment(const char *buff) const;
00640
00642 void skip_comment(char *buff, FILE *fp) const;
00643
00645 void scan_next(char *buff, FILE *fp) const;
00646
00649 int is_free(const char *buff) const;
00650
00653 int is_inf(const char *buff) const;
00654
00660 int is_sense(const char *buff) const;
00661
00671 int is_keyword(const char *buff) const;
00672
00675 int read_monom_obj(FILE *fp, double *coeff, char **name, int *cnt,
00676 char **obj_name);
00677
00682 int read_monom_row(FILE *fp, char *start_str, double *coeff, char **name,
00683 int cnt_coeff) const;
00684
00686 void realloc_coeff(double **coeff, char ***colNames, int *maxcoeff) const;
00687
00689 void realloc_row(char ***rowNames, int **start, double **rhs,
00690 double **rowlow, double **rowup, int *maxrow) const;
00691
00693 void realloc_col(double **collow, double **colup, char **is_int,
00694 int *maxcol) const;
00695
00697 void read_row(FILE *fp, char *buff, double **pcoeff, char ***pcolNames,
00698 int *cnt_coeff, int *maxcoeff,
00699 double *rhs, double *rowlow, double *rowup,
00700 int *cnt_row, double inf) const;
00701
00715 void checkRowNames();
00716
00725 void checkColNames();
00726
00727 };
00728