00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include <cstdio>
00014
00015 class CoinPackedMatrix;
00016
00017 typedef int COINColumnIndex;
00018
00089 class CoinLpIO {
00090
00091 public:
00092
00095
00096 CoinLpIO();
00097
00099 ~CoinLpIO();
00100
00106 void freePreviousNames(const int section);
00107
00109 void freeAll();
00111
00114 inline void
00115 convertBoundToSense(const double lower, const double upper,
00116 char& sense, double& right, double& range) const;
00117
00120
00122 const char * getProblemName() const;
00123
00125 void setProblemName(const char *name);
00126
00128 int getNumCols() const;
00129
00131 int getNumRows() const;
00132
00134 int getNumElements() const;
00135
00137 const double * getColLower() const;
00138
00140 const double * getColUpper() const;
00141
00143 const double * getRowLower() const;
00144
00146 const double * getRowUpper() const;
00156 const char * getRowSense() const;
00157
00169 const double * getRightHandSide() const;
00170
00184 const double * getRowRange() const;
00185
00187 const double * getObjCoefficients() const;
00188
00190 const CoinPackedMatrix * getMatrixByRow() const;
00191
00193 const CoinPackedMatrix * getMatrixByCol() const;
00194
00196 const char * getObjName() const;
00197
00203 void getPreviousRowNames(char const * const * prev,
00204 int *card_prev) const;
00205
00210 void getPreviousColNames(char const * const * prev,
00211 int *card_prev) const;
00212
00215 char const * const * getRowNames() const;
00216
00218 char const * const *getColNames() const;
00219
00223 const char * rowName(int index) const;
00224
00228 const char * columnName(int index) const;
00229
00233 int rowIndex(const char * name) const;
00234
00237 int columnIndex(const char * name) const;
00238
00240 double objectiveOffset() const;
00241
00243 inline void setObjectiveOffset(double value)
00244 { objectiveOffset_ = value;}
00245
00248 bool isInteger(int columnNumber) const;
00249
00251 const char * integerColumns() const;
00253
00256
00257 double getInfinity() const;
00258
00261 void setInfinity(const double);
00262
00264 double getEpsilon() const;
00265
00268 void setEpsilon(const double);
00269
00271 int getNumberAcross() const;
00272
00275 void setNumberAcross(const int);
00276
00278 int getDecimals() const;
00279
00282 void setDecimals(const int);
00284
00296 void setLpDataWithoutRowAndColNames(
00297 const CoinPackedMatrix& m,
00298 const double* collb, const double* colub,
00299 const double* obj_coeff,
00300 const char* integrality,
00301 const double* rowlb, const double* rowub);
00302
00315 int is_invalid_name(const char *buff, const bool ranged) const;
00316
00333 int are_invalid_names(char const * const *vnames,
00334 const int card_vnames,
00335 const bool check_ranged) const;
00336
00339 void setDefaultRowNames();
00340
00342 void setDefaultColNames();
00343
00363 void setLpDataRowAndColNames(char const * const * const rownames,
00364 char const * const * const colnames);
00365
00380 int writeLp(const char *filename,
00381 const double epsilon,
00382 const int numberAcross,
00383 const int decimals,
00384 const bool useRowNames = true);
00385
00400 int writeLp(FILE *fp,
00401 const double epsilon,
00402 const int numberAcross,
00403 const int decimals,
00404 const bool useRowNames = true);
00405
00408 int writeLp(const char *filename, const bool useRowNames = true);
00409
00412 int writeLp(FILE *fp, const bool useRowNames = true);
00413
00418 void readLp(const char *filename, const double epsilon);
00419
00424 void readLp(const char *filename);
00425
00431 void readLp(FILE *fp, const double epsilon);
00432
00437 void readLp(FILE *fp);
00438
00440 void print() const;
00442
00443 protected:
00445 char * problemName_;
00446
00448 int numberRows_;
00449
00451 int numberColumns_;
00452
00454 int numberElements_;
00455
00457 mutable CoinPackedMatrix *matrixByColumn_;
00458
00460 CoinPackedMatrix *matrixByRow_;
00461
00463 double * rowlower_;
00464
00466 double * rowupper_;
00467
00469 double * collower_;
00470
00472 double * colupper_;
00473
00475 mutable double * rhs_;
00476
00480 mutable double *rowrange_;
00481
00483 mutable char * rowsense_;
00484
00486 double * objective_;
00487
00489 double objectiveOffset_;
00490
00493 char * integerType_;
00494
00496 char * fileName_;
00497
00499 double infinity_;
00500
00502 double epsilon_;
00503
00505 int numberAcross_;
00506
00508 int decimals_;
00509
00511 char *objName_;
00512
00519 char **previous_names_[2];
00520
00525 int card_previous_names_[2];
00526
00531 char **names_[2];
00532
00533 typedef struct {
00534 int index, next;
00535 } CoinHashLink;
00536
00540 int maxHash_[2];
00541
00545 int numberHash_[2];
00546
00550 mutable CoinHashLink *hash_[2];
00551
00557 void startHash(char const * const * const names,
00558 const COINColumnIndex number,
00559 int section);
00560
00564 void stopHash(int section);
00565
00570 COINColumnIndex findHash(const char *name, int section) const;
00571
00576 void insertHash(const char *thisName, int section);
00577
00580 void out_coeff(FILE *fp, double v, int print_1) const;
00581
00585 int find_obj(FILE *fp) const;
00586
00592 int is_subject_to(const char *buff) const;
00593
00596 int first_is_number(const char *buff) const;
00597
00600 int is_comment(const char *buff) const;
00601
00603 void skip_comment(char *buff, FILE *fp) const;
00604
00606 void scan_next(char *buff, FILE *fp) const;
00607
00610 int is_free(const char *buff) const;
00611
00617 int is_sense(const char *buff) const;
00618
00628 int is_keyword(const char *buff) const;
00629
00632 int read_monom_obj(FILE *fp, double *coeff, char **name, int *cnt,
00633 char **obj_name);
00634
00639 int read_monom_row(FILE *fp, char *start_str, double *coeff, char **name,
00640 int cnt_coeff) const;
00641
00643 void realloc_coeff(double **coeff, char ***colNames, int *maxcoeff) const;
00644
00646 void realloc_row(char ***rowNames, int **start, double **rhs,
00647 double **rowlow, double **rowup, int *maxrow) const;
00648
00650 void realloc_col(double **collow, double **colup, char **is_int,
00651 int *maxcol) const;
00652
00654 void read_row(FILE *fp, char *buff, double **pcoeff, char ***pcolNames,
00655 int *cnt_coeff, int *maxcoeff,
00656 double *rhs, double *rowlow, double *rowup,
00657 int *cnt_row, double inf) const;
00658
00672 void checkRowNames();
00673
00682 void checkColNames();
00683
00684 };
00685