CoinLpIO.hpp
Go to the documentation of this file.
1 /* $Id: CoinLpIO.hpp 1749 2014-10-24 20:00:14Z tkr $ */
2 // Last edit: 11/5/08
3 //
4 // Name: CoinLpIO.hpp; Support for Lp files
5 // Author: Francois Margot
6 // Tepper School of Business
7 // Carnegie Mellon University, Pittsburgh, PA 15213
8 // email: fmargot@andrew.cmu.edu
9 // Date: 12/28/03
10 //-----------------------------------------------------------------------------
11 // Copyright (C) 2003, Francois Margot, International Business Machines
12 // Corporation and others. All Rights Reserved.
13 // This code is licensed under the terms of the Eclipse Public License (EPL).
14 
15 #ifndef CoinLpIO_H
16 #define CoinLpIO_H
17 
18 #include <cstdio>
19 
20 #include "CoinPackedMatrix.hpp"
21 #include "CoinMessage.hpp"
22 class CoinSet;
23 
24 const int MAX_OBJECTIVES = 2;
25 
26 typedef int COINColumnIndex;
27 
104 class CoinLpIO {
105  friend void CoinLpIOUnitTest(const std::string & lpDir);
106 public:
107 
110  CoinLpIO();
112 
114  void gutsOfDestructor();
115 
117  void gutsOfCopy(const CoinLpIO &);
118 
120  CoinLpIO & operator = (const CoinLpIO& rhs) ;
121 
123  CoinLpIO (const CoinLpIO &);
124 
126  ~CoinLpIO();
127 
133  void freePreviousNames(const int section);
134 
136  void freeAll();
138 
141  inline void
142  convertBoundToSense(const double lower, const double upper,
143  char& sense, double& right, double& range) const;
144 
147 
149  const char * getProblemName() const;
150 
152  void setProblemName(const char *name);
153 
155  int getNumCols() const;
156 
158  int getNumRows() const;
159 
161  int getNumElements() const;
162 
164  const double * getColLower() const;
165 
167  const double * getColUpper() const;
168 
170  const double * getRowLower() const;
171 
173  const double * getRowUpper() const;
183  const char * getRowSense() const;
184 
196  const double * getRightHandSide() const;
197 
211  const double * getRowRange() const;
212 
214  const int getNumObjectives() const;
215 
217  const double * getObjCoefficients() const;
218 
220  const double * getObjCoefficients(int j) const;
221 
223  const CoinPackedMatrix * getMatrixByRow() const;
224 
226  const CoinPackedMatrix * getMatrixByCol() const;
227 
229  const char * getObjName() const;
230 
232  const char * getObjName(int j) const;
233 
239  void getPreviousRowNames(char const * const * prev,
240  int *card_prev) const;
241 
246  void getPreviousColNames(char const * const * prev,
247  int *card_prev) const;
248 
251  char const * const * getRowNames() const;
252 
254  char const * const *getColNames() const;
255 
259  const char * rowName(int index) const;
260 
264  const char * columnName(int index) const;
265 
269  int rowIndex(const char * name) const;
270 
273  int columnIndex(const char * name) const;
274 
276  double objectiveOffset() const;
277 
279  double objectiveOffset(int j) const;
280 
282  inline void setObjectiveOffset(double value)
283  { objectiveOffset_[0] = value;}
284 
286  inline void setObjectiveOffset(double value, int j)
287  { objectiveOffset_[j] = value;}
288 
291  bool isInteger(int columnNumber) const;
292 
294  const char * integerColumns() const;
296 
299  double getInfinity() const;
301 
304  void setInfinity(const double);
305 
307  double getEpsilon() const;
308 
311  void setEpsilon(const double);
312 
314  int getNumberAcross() const;
315 
318  void setNumberAcross(const int);
319 
321  int getDecimals() const;
322 
325  void setDecimals(const int);
327 
341  const CoinPackedMatrix& m,
342  const double* collb, const double* colub,
343  const double* obj_coeff,
344  const char* integrality,
345  const double* rowlb, const double* rowub);
346 
348  const CoinPackedMatrix& m,
349  const double* collb, const double* colub,
350  const double* obj_coeff[MAX_OBJECTIVES],
351  int num_objectives,
352  const char* integrality,
353  const double* rowlb, const double* rowub);
354 
367  int is_invalid_name(const char *buff, const bool ranged) const;
368 
385  int are_invalid_names(char const * const *vnames,
386  const int card_vnames,
387  const bool check_ranged) const;
388 
391  void setDefaultRowNames();
392 
394  void setDefaultColNames();
395 
415  void setLpDataRowAndColNames(char const * const * const rownames,
416  char const * const * const colnames);
417 
432  int writeLp(const char *filename,
433  const double epsilon,
434  const int numberAcross,
435  const int decimals,
436  const bool useRowNames = true);
437 
452  int writeLp(FILE *fp,
453  const double epsilon,
454  const int numberAcross,
455  const int decimals,
456  const bool useRowNames = true);
457 
460  int writeLp(const char *filename, const bool useRowNames = true);
461 
464  int writeLp(FILE *fp, const bool useRowNames = true);
465 
470  void readLp(const char *filename, const double epsilon);
471 
476  void readLp(const char *filename);
477 
483  void readLp(FILE *fp, const double epsilon);
484 
489  void readLp(FILE *fp);
490 
492  void print() const;
493 
495  void loadSOS(int numberSets,const CoinSet * sets);
496 
498  void loadSOS(int numberSets,const CoinSet ** sets);
499 
501  inline int numberSets() const
502  { return numberSets_;}
503 
505  inline CoinSet ** setInformation() const
506  { return set_;}
508 
516 
518  void newLanguage(CoinMessages::Language language);
519 
521  inline void setLanguage(CoinMessages::Language language) {newLanguage(language);}
522 
524  inline CoinMessageHandler * messageHandler() const {return handler_;}
525 
527  inline CoinMessages messages() {return messages_;}
529  inline CoinMessages * messagesPointer() {return & messages_;}
531 
532 protected:
534  char * problemName_;
535 
546 
549 
552 
555 
558 
561 
563  double * rowlower_;
564 
566  double * rowupper_;
567 
569  double * collower_;
570 
572  double * colupper_;
573 
575  mutable double * rhs_;
576 
580  mutable double *rowrange_;
581 
583  mutable char * rowsense_;
584 
587 
590 
593 
596  char * integerType_;
597 
600 
603 
605  char * fileName_;
606 
608  double infinity_;
609 
611  double epsilon_;
612 
615 
618 
621 
628  char **previous_names_[2];
629 
635 
640  char **names_[2];
641 
642  typedef struct {
643  int index, next;
644  } CoinHashLink;
645 
649  int maxHash_[2];
650 
654  int numberHash_[2];
655 
659  mutable CoinHashLink *hash_[2];
660 
666  void startHash(char const * const * const names,
667  const COINColumnIndex number,
668  int section);
669 
673  void stopHash(int section);
674 
679  COINColumnIndex findHash(const char *name, int section) const;
680 
685  void insertHash(const char *thisName, int section);
686 
689  void out_coeff(FILE *fp, double v, int print_1) const;
690 
694  int find_obj(FILE *fp) const;
695 
701  int is_subject_to(const char *buff) const;
702 
705  int first_is_number(const char *buff) const;
706 
709  int is_comment(const char *buff) const;
710 
712  void skip_comment(char *buff, FILE *fp) const;
713 
715  void scan_next(char *buff, FILE *fp) const;
716 
719  int is_free(const char *buff) const;
720 
723  int is_inf(const char *buff) const;
724 
730  int is_sense(const char *buff) const;
731 
743  int is_keyword(const char *buff) const;
744 
747  int read_monom_obj(FILE *fp, double *coeff, char **name, int *cnt,
748  char **obj_name, int *num_objectives, int *obj_starts);
749 
754  int read_monom_row(FILE *fp, char *start_str, double *coeff, char **name,
755  int cnt_coeff) const;
756 
758  void realloc_coeff(double **coeff, char ***colNames, int *maxcoeff) const;
759 
761  void realloc_row(char ***rowNames, int **start, double **rhs,
762  double **rowlow, double **rowup, int *maxrow) const;
763 
765  void realloc_col(double **collow, double **colup, char **is_int,
766  int *maxcol) const;
767 
769  void read_row(FILE *fp, char *buff, double **pcoeff, char ***pcolNames,
770  int *cnt_coeff, int *maxcoeff,
771  double *rhs, double *rowlow, double *rowup,
772  int *cnt_row, double inf) const;
773 
787  void checkRowNames();
788 
797  void checkColNames();
798 
799 };
800 
801 void
802 CoinLpIOUnitTest(const std::string& lpDir);
803 
804 
805 #endif
void read_row(FILE *fp, char *buff, double **pcoeff, char ***pcolNames, int *cnt_coeff, int *maxcoeff, double *rhs, double *rowlow, double *rowup, int *cnt_row, double inf) const
Read a constraint.
CoinMessages * messagesPointer()
Return the messages pointer.
Definition: CoinLpIO.hpp:529
char ** previous_names_[2]
Row names (including objective function name) and column names when stopHash() for the corresponding ...
Definition: CoinLpIO.hpp:628
void convertBoundToSense(const double lower, const double upper, char &sense, double &right, double &range) const
A quick inlined function to convert from lb/ub style constraint definition to sense/rhs/range style...
char * objName_[MAX_OBJECTIVES]
Objective function name.
Definition: CoinLpIO.hpp:620
const char * integerColumns() const
Get characteristic vector of integer variables.
void setLpDataWithoutRowAndColNames(const CoinPackedMatrix &m, const double *collb, const double *colub, const double *obj_coeff, const char *integrality, const double *rowlb, const double *rowub)
Set the data of the object.
int numberSets_
Number of sets.
Definition: CoinLpIO.hpp:602
void setDecimals(const int)
Set decimals.
int first_is_number(const char *buff) const
Return 1 if the first character of buff is a number.
double objectiveOffset() const
Returns the (constant) objective offset.
void skip_comment(char *buff, FILE *fp) const
Read the file fp until buff contains an end of line.
CoinLpIO()
Default Constructor.
double * objective_[MAX_OBJECTIVES]
Pointer to dense vector of objective coefficients.
Definition: CoinLpIO.hpp:586
void loadSOS(int numberSets, const CoinSet *sets)
Load in SOS stuff.
Base class for message handling.
const int MAX_OBJECTIVES
Definition: CoinLpIO.hpp:24
const char * rowName(int index) const
Return the row name for the specified index.
void scan_next(char *buff, FILE *fp) const
Put in buff the next string that is not part of a comment.
COINColumnIndex findHash(const char *name, int section) const
Return the index of the given name, return -1 if the name is not found.
int is_comment(const char *buff) const
Return 1 if the first character of buff is &#39;/&#39; or &#39;\&#39;.
int numberColumns_
Number of columns.
Definition: CoinLpIO.hpp:551
Class to read and write Lp files.
Definition: CoinLpIO.hpp:104
int numberElements_
Number of elements.
Definition: CoinLpIO.hpp:554
int numberSets() const
Number of SOS sets.
Definition: CoinLpIO.hpp:501
void CoinLpIOUnitTest(const std::string &lpDir)
int writeLp(const char *filename, const double epsilon, const int numberAcross, const int decimals, const bool useRowNames=true)
Write the data in Lp format in the file with name filename.
CoinSet ** setInformation() const
Set information.
Definition: CoinLpIO.hpp:505
void setEpsilon(const double)
Set epsilon.
char ** names_[2]
Row names (including objective function name) and column names (linked to Hash tables).
Definition: CoinLpIO.hpp:640
double * rowlower_
Pointer to dense vector of row lower bounds.
Definition: CoinLpIO.hpp:563
void getPreviousRowNames(char const *const *prev, int *card_prev) const
Get pointer to array[*card_prev] of previous row names.
char * problemName_
Problem name.
Definition: CoinLpIO.hpp:534
int getNumCols() const
Get number of columns.
void setDefaultRowNames()
Set objective function name to the default &quot;obj&quot; and row names to the default &quot;cons0&quot;, &quot;cons1&quot;, ...
CoinMessages messages_
Messages.
Definition: CoinLpIO.hpp:545
void passInMessageHandler(CoinMessageHandler *handler)
Pass in Message handler.
char * integerType_
Pointer to dense vector specifying if a variable is continuous (0) or integer (1).
Definition: CoinLpIO.hpp:596
void out_coeff(FILE *fp, double v, int print_1) const
Write a coefficient.
void setObjectiveOffset(double value, int j)
Set objective offset.
Definition: CoinLpIO.hpp:286
double * rowrange_
Pointer to dense vector of slack variable upper bounds for ranged constraints (undefined for non-rang...
Definition: CoinLpIO.hpp:580
const double * getRowRange() const
Get pointer to array[getNumRows()] of row ranges.
int read_monom_row(FILE *fp, char *start_str, double *coeff, char **name, int cnt_coeff) const
Read a monomial of a constraint.
char * rowsense_
Pointer to dense vector of row senses.
Definition: CoinLpIO.hpp:583
int getNumberAcross() const
Get numberAcross, the number of monomials to be printed per line.
Sparse Matrix Base Class.
void gutsOfCopy(const CoinLpIO &)
Does the heavy lifting for copy and assignment.
CoinMessageHandler * messageHandler() const
Return the message handler.
Definition: CoinLpIO.hpp:524
int numberRows_
Number of rows.
Definition: CoinLpIO.hpp:548
char * fileName_
Current file name.
Definition: CoinLpIO.hpp:605
int maxHash_[2]
Maximum number of entries in a hash table section.
Definition: CoinLpIO.hpp:649
double * rhs_
Pointer to dense vector of row rhs.
Definition: CoinLpIO.hpp:575
CoinMessages messages()
Return the messages.
Definition: CoinLpIO.hpp:527
double objectiveOffset_[MAX_OBJECTIVES]
Constant offset for objective value.
Definition: CoinLpIO.hpp:592
int rowIndex(const char *name) const
Return the index for the specified row name.
double infinity_
Value to use for infinity.
Definition: CoinLpIO.hpp:608
CoinPackedMatrix * matrixByColumn_
Pointer to column-wise copy of problem matrix coefficients.
Definition: CoinLpIO.hpp:557
void setLpDataRowAndColNames(char const *const *const rownames, char const *const *const colnames)
Set the row and column names.
char const *const * getColNames() const
Get pointer to array[getNumCols()] of column names.
friend void CoinLpIOUnitTest(const std::string &lpDir)
bool isInteger(int columnNumber) const
Return true if a column is an integer (binary or general integer) variable.
const double * getObjCoefficients() const
Get pointer to array[getNumCols()] of objective function coefficients.
int num_objectives_
Number of objectives.
Definition: CoinLpIO.hpp:589
void newLanguage(CoinMessages::Language language)
Set the language for messages.
CoinHashLink * hash_[2]
Hash tables with two sections.
Definition: CoinLpIO.hpp:659
const double * getColUpper() const
Get pointer to array[getNumCols()] of column upper bounds.
void startHash(char const *const *const names, const COINColumnIndex number, int section)
Build the hash table for the given names.
Very simple class for containing data on set.
Definition: CoinMpsIO.hpp:221
void checkColNames()
Check that current column names are distinct.
const char * getProblemName() const
Get the problem name.
int numberAcross_
Number of monomials printed in a row.
Definition: CoinLpIO.hpp:614
void getPreviousColNames(char const *const *prev, int *card_prev) const
Get pointer to array[*card_prev] of previous column names.
int find_obj(FILE *fp) const
Locate the objective function.
void setLanguage(CoinMessages::Language language)
Set the language for messages.
Definition: CoinLpIO.hpp:521
int columnIndex(const char *name) const
Return the index for the specified column name.
int is_free(const char *buff) const
Return 1 if buff is the keyword &quot;free&quot; or one of its variants.
~CoinLpIO()
Destructor.
int getDecimals() const
Get decimals, the number of digits to write after the decimal point.
int numberHash_[2]
Number of entries in a hash table section.
Definition: CoinLpIO.hpp:654
void stopHash(int section)
Delete hash storage.
double * rowupper_
Pointer to dense vector of row upper bounds.
Definition: CoinLpIO.hpp:566
void readLp(const char *filename, const double epsilon)
Read the data in Lp format from the file with name filename, using the given value for epsilon...
const double * getRowLower() const
Get pointer to array[getNumRows()] of row lower bounds.
int read_monom_obj(FILE *fp, double *coeff, char **name, int *cnt, char **obj_name, int *num_objectives, int *obj_starts)
Read a monomial of the objective function.
void setNumberAcross(const int)
Set numberAcross.
const double * getRowUpper() const
Get pointer to array[getNumRows()] of row upper bounds.
void freePreviousNames(const int section)
Free the vector previous_names_[section] and set card_previous_names_[section] to 0...
int is_subject_to(const char *buff) const
Return an integer indicating if the keyword &quot;subject to&quot; or one of its variants has been read...
double getInfinity() const
Get infinity.
Class to hold and manipulate an array of massaged messages.
double * collower_
Pointer to dense vector of column lower bounds.
Definition: CoinLpIO.hpp:569
const CoinPackedMatrix * getMatrixByRow() const
Get pointer to row-wise copy of the coefficient matrix.
void insertHash(const char *thisName, int section)
Insert thisName in the hash table if not present yet; does nothing if the name is already in...
bool defaultHandler_
Flag to say if the message handler is the default handler.
Definition: CoinLpIO.hpp:543
const int getNumObjectives() const
Get pointer to array[getNumCols()] of objective function coefficients.
void gutsOfDestructor()
Does the heavy lifting for destruct and assignment.
void realloc_col(double **collow, double **colup, char **is_int, int *maxcol) const
Reallocate vectors related to columns.
char const *const * getRowNames() const
Get pointer to array[getNumRows()+1] of row names, including objective function name as last entry...
double getEpsilon() const
Get epsilon.
int is_inf(const char *buff) const
Return 1 if buff is the keyword &quot;inf&quot; or one of its variants.
CoinPackedMatrix * matrixByRow_
Pointer to row-wise copy of problem matrix coefficients.
Definition: CoinLpIO.hpp:560
void setObjectiveOffset(double value)
Set objective offset.
Definition: CoinLpIO.hpp:282
void realloc_row(char ***rowNames, int **start, double **rhs, double **rowlow, double **rowup, int *maxrow) const
Reallocate vectors related to rows.
CoinMessageHandler * handler_
Message handler.
Definition: CoinLpIO.hpp:537
double * colupper_
Pointer to dense vector of column upper bounds.
Definition: CoinLpIO.hpp:572
int getNumElements() const
Get number of nonzero elements.
const char * getObjName() const
Get objective function name.
int decimals_
Number of decimals printed for coefficients.
Definition: CoinLpIO.hpp:617
CoinLpIO & operator=(const CoinLpIO &rhs)
assignment operator
int COINColumnIndex
Definition: CoinLpIO.hpp:26
int is_sense(const char *buff) const
Return an integer indicating the inequality sense read.
double epsilon_
Value to use for epsilon.
Definition: CoinLpIO.hpp:611
const char * columnName(int index) const
Return the column name for the specified index.
void freeAll()
Free all memory (except memory related to hash tables and objName_).
void realloc_coeff(double **coeff, char ***colNames, int *maxcoeff) const
Reallocate vectors related to number of coefficients.
int is_keyword(const char *buff) const
Return an integer indicating if one of the keywords &quot;Bounds&quot;, &quot;Integers&quot;, &quot;Generals&quot;, &quot;Binaries&quot;, &quot;Semi-continuous&quot;, &quot;Sos&quot;, &quot;End&quot;, or one of their variants has been read.
void setInfinity(const double)
Set infinity.
void checkRowNames()
Check that current objective name and all row names are distinct including row names obtained by addi...
const double * getColLower() const
Get pointer to array[getNumCols()] of column lower bounds.
Language
Supported languages.
const char * getRowSense() const
Get pointer to array[getNumRows()] of constraint senses.
int are_invalid_names(char const *const *vnames, const int card_vnames, const bool check_ranged) const
Return 0 if each of the card_vnames entries of vnames is a valid name, return a positive number other...
void setProblemName(const char *name)
Set problem name.
int card_previous_names_[2]
card_previous_names_[section] holds the number of entries in the vector previous_names_[section].
Definition: CoinLpIO.hpp:634
const CoinPackedMatrix * getMatrixByCol() const
Get pointer to column-wise copy of the coefficient matrix.
int getNumRows() const
Get number of rows.
void print() const
Dump the data. Low level method for debugging.
int is_invalid_name(const char *buff, const bool ranged) const
Return 0 if buff is a valid name for a row, a column or objective function, return a positive number ...
void setDefaultColNames()
Set column names to the default &quot;x0&quot;, &quot;x1&quot;, ...
CoinSet ** set_
Pointer to sets.
Definition: CoinLpIO.hpp:599
const double * getRightHandSide() const
Get pointer to array[getNumRows()] of constraint right-hand sides.