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 class CoinSet;
00023
00024 const int MAX_OBJECTIVES = 2;
00025
00026 typedef int COINColumnIndex;
00027
00104 class CoinLpIO {
00105 friend void CoinLpIOUnitTest(const std::string & lpDir);
00106 public:
00107
00110
00111 CoinLpIO();
00112
00114 void gutsOfDestructor();
00115
00117 void gutsOfCopy(const CoinLpIO &);
00118
00120 CoinLpIO & operator = (const CoinLpIO& rhs) ;
00121
00123 CoinLpIO (const CoinLpIO &);
00124
00126 ~CoinLpIO();
00127
00133 void freePreviousNames(const int section);
00134
00136 void freeAll();
00138
00141 inline void
00142 convertBoundToSense(const double lower, const double upper,
00143 char& sense, double& right, double& range) const;
00144
00147
00149 const char * getProblemName() const;
00150
00152 void setProblemName(const char *name);
00153
00155 int getNumCols() const;
00156
00158 int getNumRows() const;
00159
00161 int getNumElements() const;
00162
00164 const double * getColLower() const;
00165
00167 const double * getColUpper() const;
00168
00170 const double * getRowLower() const;
00171
00173 const double * getRowUpper() const;
00183 const char * getRowSense() const;
00184
00196 const double * getRightHandSide() const;
00197
00211 const double * getRowRange() const;
00212
00214 const int getNumObjectives() const;
00215
00217 const double * getObjCoefficients() const;
00218
00220 const double * getObjCoefficients(int j) const;
00221
00223 const CoinPackedMatrix * getMatrixByRow() const;
00224
00226 const CoinPackedMatrix * getMatrixByCol() const;
00227
00229 const char * getObjName() const;
00230
00232 const char * getObjName(int j) const;
00233
00239 void getPreviousRowNames(char const * const * prev,
00240 int *card_prev) const;
00241
00246 void getPreviousColNames(char const * const * prev,
00247 int *card_prev) const;
00248
00251 char const * const * getRowNames() const;
00252
00254 char const * const *getColNames() const;
00255
00259 const char * rowName(int index) const;
00260
00264 const char * columnName(int index) const;
00265
00269 int rowIndex(const char * name) const;
00270
00273 int columnIndex(const char * name) const;
00274
00276 double objectiveOffset() const;
00277
00279 double objectiveOffset(int j) const;
00280
00282 inline void setObjectiveOffset(double value)
00283 { objectiveOffset_[0] = value;}
00284
00286 inline void setObjectiveOffset(double value, int j)
00287 { objectiveOffset_[j] = value;}
00288
00291 bool isInteger(int columnNumber) const;
00292
00294 const char * integerColumns() const;
00296
00299
00300 double getInfinity() const;
00301
00304 void setInfinity(const double);
00305
00307 double getEpsilon() const;
00308
00311 void setEpsilon(const double);
00312
00314 int getNumberAcross() const;
00315
00318 void setNumberAcross(const int);
00319
00321 int getDecimals() const;
00322
00325 void setDecimals(const int);
00327
00340 void setLpDataWithoutRowAndColNames(
00341 const CoinPackedMatrix& m,
00342 const double* collb, const double* colub,
00343 const double* obj_coeff,
00344 const char* integrality,
00345 const double* rowlb, const double* rowub);
00346
00347 void setLpDataWithoutRowAndColNames(
00348 const CoinPackedMatrix& m,
00349 const double* collb, const double* colub,
00350 const double* obj_coeff[MAX_OBJECTIVES],
00351 int num_objectives,
00352 const char* integrality,
00353 const double* rowlb, const double* rowub);
00354
00367 int is_invalid_name(const char *buff, const bool ranged) const;
00368
00385 int are_invalid_names(char const * const *vnames,
00386 const int card_vnames,
00387 const bool check_ranged) const;
00388
00391 void setDefaultRowNames();
00392
00394 void setDefaultColNames();
00395
00415 void setLpDataRowAndColNames(char const * const * const rownames,
00416 char const * const * const colnames);
00417
00432 int writeLp(const char *filename,
00433 const double epsilon,
00434 const int numberAcross,
00435 const int decimals,
00436 const bool useRowNames = true);
00437
00452 int writeLp(FILE *fp,
00453 const double epsilon,
00454 const int numberAcross,
00455 const int decimals,
00456 const bool useRowNames = true);
00457
00460 int writeLp(const char *filename, const bool useRowNames = true);
00461
00464 int writeLp(FILE *fp, const bool useRowNames = true);
00465
00470 void readLp(const char *filename, const double epsilon);
00471
00476 void readLp(const char *filename);
00477
00483 void readLp(FILE *fp, const double epsilon);
00484
00489 void readLp(FILE *fp);
00490
00492 void print() const;
00493
00495 void loadSOS(int numberSets,const CoinSet * sets);
00496
00498 void loadSOS(int numberSets,const CoinSet ** sets);
00499
00501 inline int numberSets() const
00502 { return numberSets_;}
00503
00505 inline CoinSet ** setInformation() const
00506 { return set_;}
00508
00515 void passInMessageHandler(CoinMessageHandler * handler);
00516
00518 void newLanguage(CoinMessages::Language language);
00519
00521 inline void setLanguage(CoinMessages::Language language) {newLanguage(language);}
00522
00524 inline CoinMessageHandler * messageHandler() const {return handler_;}
00525
00527 inline CoinMessages messages() {return messages_;}
00529 inline CoinMessages * messagesPointer() {return & messages_;}
00531
00532 protected:
00534 char * problemName_;
00535
00537 CoinMessageHandler * handler_;
00543 bool defaultHandler_;
00545 CoinMessages messages_;
00546
00548 int numberRows_;
00549
00551 int numberColumns_;
00552
00554 int numberElements_;
00555
00557 mutable CoinPackedMatrix *matrixByColumn_;
00558
00560 CoinPackedMatrix *matrixByRow_;
00561
00563 double * rowlower_;
00564
00566 double * rowupper_;
00567
00569 double * collower_;
00570
00572 double * colupper_;
00573
00575 mutable double * rhs_;
00576
00580 mutable double *rowrange_;
00581
00583 mutable char * rowsense_;
00584
00586 double * objective_[MAX_OBJECTIVES];
00587
00589 int num_objectives_;
00590
00592 double objectiveOffset_[MAX_OBJECTIVES];
00593
00596 char * integerType_;
00597
00599 CoinSet ** set_;
00600
00602 int numberSets_;
00603
00605 char * fileName_;
00606
00608 double infinity_;
00609
00611 double epsilon_;
00612
00614 int numberAcross_;
00615
00617 int decimals_;
00618
00620 char *objName_[MAX_OBJECTIVES];
00621
00628 char **previous_names_[2];
00629
00634 int card_previous_names_[2];
00635
00640 char **names_[2];
00641
00642 typedef struct {
00643 int index, next;
00644 } CoinHashLink;
00645
00649 int maxHash_[2];
00650
00654 int numberHash_[2];
00655
00659 mutable CoinHashLink *hash_[2];
00660
00666 void startHash(char const * const * const names,
00667 const COINColumnIndex number,
00668 int section);
00669
00673 void stopHash(int section);
00674
00679 COINColumnIndex findHash(const char *name, int section) const;
00680
00685 void insertHash(const char *thisName, int section);
00686
00689 void out_coeff(FILE *fp, double v, int print_1) const;
00690
00694 int find_obj(FILE *fp) const;
00695
00701 int is_subject_to(const char *buff) const;
00702
00705 int first_is_number(const char *buff) const;
00706
00709 int is_comment(const char *buff) const;
00710
00712 void skip_comment(char *buff, FILE *fp) const;
00713
00715 void scan_next(char *buff, FILE *fp) const;
00716
00719 int is_free(const char *buff) const;
00720
00723 int is_inf(const char *buff) const;
00724
00730 int is_sense(const char *buff) const;
00731
00743 int is_keyword(const char *buff) const;
00744
00747 int read_monom_obj(FILE *fp, double *coeff, char **name, int *cnt,
00748 char **obj_name, int *num_objectives, int *obj_starts);
00749
00754 int read_monom_row(FILE *fp, char *start_str, double *coeff, char **name,
00755 int cnt_coeff) const;
00756
00758 void realloc_coeff(double **coeff, char ***colNames, int *maxcoeff) const;
00759
00761 void realloc_row(char ***rowNames, int **start, double **rhs,
00762 double **rowlow, double **rowup, int *maxrow) const;
00763
00765 void realloc_col(double **collow, double **colup, char **is_int,
00766 int *maxcol) const;
00767
00769 void read_row(FILE *fp, char *buff, double **pcoeff, char ***pcolNames,
00770 int *cnt_coeff, int *maxcoeff,
00771 double *rhs, double *rowlow, double *rowup,
00772 int *cnt_row, double inf) const;
00773
00787 void checkRowNames();
00788
00797 void checkColNames();
00798
00799 };
00800
00801 void
00802 CoinLpIOUnitTest(const std::string& lpDir);
00803
00804
00805 #endif