CoinUtils  2.11.4
CoinLpIO.hpp
Go to the documentation of this file.
1 /* $Id$ */
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 #include "CoinFileIO.hpp"
23 class CoinSet;
24 
25 const int MAX_OBJECTIVES = 2;
26 
27 typedef int COINColumnIndex;
28 
105 class CoinLpIO {
106  friend void CoinLpIOUnitTest(const std::string &lpDir);
107 
108 public:
113 
116 
118  void gutsOfCopy(const CoinLpIO &);
119 
122 
124  CoinLpIO(const CoinLpIO &);
125 
128 
134  void freePreviousNames(const int section);
135 
137  void freeAll();
139 
142  inline void
143  convertBoundToSense(const double lower, const double upper,
144  char &sense, double &right, double &range) const;
145 
148 
150  const char *getProblemName() const;
151 
153  void setProblemName(const char *name);
154 
156  int getNumCols() const;
157 
159  int getNumRows() const;
160 
163 
165  const double *getColLower() const;
166 
168  const double *getColUpper() const;
169 
171  const double *getRowLower() const;
172 
174  const double *getRowUpper() const;
184  const char *getRowSense() const;
185 
197  const double *getRightHandSide() const;
198 
212  const double *getRowRange() const;
213 
215  const int getNumObjectives() const;
216 
218  const double *getObjCoefficients() const;
219 
221  const double *getObjCoefficients(int j) const;
222 
225 
228 
230  const char *getObjName() const;
231 
233  const char *getObjName(int j) const;
234 
240  void getPreviousRowNames(char const *const *prev,
241  int *card_prev) const;
242 
247  void getPreviousColNames(char const *const *prev,
248  int *card_prev) const;
249 
252  char const *const *getRowNames() const;
253 
255  char const *const *getColNames() const;
256 
260  const char *rowName(int index) const;
261 
265  const char *columnName(int index) const;
266 
270  int rowIndex(const char *name) const;
271 
274  int columnIndex(const char *name) const;
275 
277  double objectiveOffset() const;
278 
280  double objectiveOffset(int j) const;
281 
283  inline void setObjectiveOffset(double value)
284  {
285  objectiveOffset_[0] = value;
286  }
288  inline bool wasMaximization() const
289  {
290  return wasMaximization_;
291  }
292 
294  inline void setObjectiveOffset(double value, int j)
295  {
296  objectiveOffset_[j] = value;
297  }
298 
301  bool isInteger(int columnNumber) const;
302 
304  const char *integerColumns() const;
306 
310  double getInfinity() const;
311 
314  void setInfinity(const double);
315 
317  double getEpsilon() const;
318 
321  void setEpsilon(const double);
322 
324  int getNumberAcross() const;
325 
328  void setNumberAcross(const int);
329 
331  int getDecimals() const;
332 
335  void setDecimals(const int);
337 
351  const CoinPackedMatrix &m,
352  const double *collb, const double *colub,
353  const double *obj_coeff,
354  const char *integrality,
355  const double *rowlb, const double *rowub);
356 
358  const CoinPackedMatrix &m,
359  const double *collb, const double *colub,
360  const double *obj_coeff[MAX_OBJECTIVES],
361  int num_objectives,
362  const char *integrality,
363  const double *rowlb, const double *rowub);
364 
377  int is_invalid_name(const char *buff, const bool ranged) const;
378 
395  int are_invalid_names(char const *const *vnames,
396  const int card_vnames,
397  const bool check_ranged) const;
398 
402 
405 
425  void setLpDataRowAndColNames(char const *const *const rownames,
426  char const *const *const colnames);
427 
442  int writeLp(const char *filename,
443  const double epsilon,
444  const int numberAcross,
445  const int decimals,
446  const bool useRowNames = true);
447 
462  int writeLp(FILE *fp,
463  const double epsilon,
464  const int numberAcross,
465  const int decimals,
466  const bool useRowNames = true);
467 
470  int writeLp(const char *filename, const bool useRowNames = true);
471 
474  int writeLp(FILE *fp, const bool useRowNames = true);
475 
480  void readLp(const char *filename, const double epsilon);
481 
486  void readLp(const char *filename);
487 
493  void readLp(FILE *fp, const double epsilon);
494 
499  void readLp(FILE *fp);
500 
502  void readLp();
504  void print() const;
505 
507  void loadSOS(int numberSets, const CoinSet *sets);
508 
510  void loadSOS(int numberSets, const CoinSet **sets);
511 
513  inline int numberSets() const
514  {
515  return numberSets_;
516  }
517 
519  inline CoinSet **setInformation() const
520  {
521  return set_;
522  }
524 
532 
535 
537  inline void setLanguage(CoinMessages::Language language) { newLanguage(language); }
538 
540  inline CoinMessageHandler *messageHandler() const { return handler_; }
541 
543  inline CoinMessages messages() { return messages_; }
545  inline CoinMessages *messagesPointer() { return &messages_; }
547 
548 protected:
551 
562 
565 
568 
571 
574 
577 
579  double *rowlower_;
580 
582  double *rowupper_;
583 
585  double *collower_;
586 
588  double *colupper_;
589 
591  mutable double *rhs_;
592 
596  mutable double *rowrange_;
597 
599  mutable char *rowsense_;
600 
603 
606 
609 
613 
616 
619 
621  char *fileName_;
622 
624  double infinity_;
625 
627  double epsilon_;
628 
631 
634 
637 
640 
647  char **previous_names_[2];
648 
654 
659  char **names_[2];
660 
661  typedef struct {
662  int index, next;
663  } CoinHashLink;
664 
668  int maxHash_[2];
669 
673  int numberHash_[2];
674 
678  mutable CoinHashLink *hash_[2];
679 
681  mutable char inputBuffer_[1028];
683  mutable int bufferLength_;
685  mutable int bufferPosition_;
689  mutable bool eofFound_;
691  int fscanfLpIO(char *buff) const;
693  int newCardLpIO() const;
694 
700  void startHash(char const *const *const names,
701  const COINColumnIndex number,
702  int section);
703 
707  void stopHash(int section);
708 
713  COINColumnIndex findHash(const char *name, int section) const;
714 
719  void insertHash(const char *thisName, int section);
720 
723  void out_coeff(FILE *fp, double v, int print_1) const;
724 
728  int find_obj() const;
729 
735  int is_subject_to(const char *buff) const;
736 
739  int first_is_number(const char *buff) const;
740 
743  int is_comment(const char *buff) const;
744 
746  void skip_comment(char *buff) const;
747 
750  int is_free(const char *buff) const;
751 
754  int is_inf(const char *buff) const;
755 
761  int is_sense(const char *buff) const;
762 
774  int is_keyword(const char *buff) const;
775 
778  int read_monom_obj(double *coeff, char **name, int *cnt,
779  char **obj_name, int *num_objectives, int *obj_starts);
780 
785  int read_monom_row(char *start_str, double *coeff, char **name,
786  int cnt_coeff) const;
787 
789  void realloc_coeff(double **coeff, char ***colNames, int *maxcoeff) const;
790 
792  void realloc_row(char ***rowNames, CoinBigIndex **start, double **rhs,
793  double **rowlow, double **rowup, int *maxrow) const;
794 
796  void realloc_col(double **collow, double **colup, char **is_int,
797  int *maxcol) const;
798 
800  void read_row(char *buff, double **pcoeff, char ***pcolNames,
801  int *cnt_coeff, int *maxcoeff,
802  double *rhs, double *rowlow, double *rowup,
803  int *cnt_row, double inf) const;
804 
819 
829 };
830 
831 void CoinLpIOUnitTest(const std::string &lpDir);
832 
833 #endif
834 
835 /* vi: softtabstop=2 shiftwidth=2 expandtab tabstop=2
836 */
const int MAX_OBJECTIVES
Definition: CoinLpIO.hpp:25
void CoinLpIOUnitTest(const std::string &lpDir)
int COINColumnIndex
Definition: CoinLpIO.hpp:27
This file contains the enum for the standard set of Coin messages and a class definition whose sole p...
int CoinBigIndex
Abstract base class for file input classes.
Definition: CoinFileIO.hpp:40
Class to read and write Lp files.
Definition: CoinLpIO.hpp:105
CoinBigIndex numberElements_
Number of elements.
Definition: CoinLpIO.hpp:570
CoinPackedMatrix * matrixByColumn_
Pointer to column-wise copy of problem matrix coefficients.
Definition: CoinLpIO.hpp:573
int is_comment(const char *buff) const
Return 1 if the first character of buff is '/' or '\'.
int rowIndex(const char *name) const
Return the index for the specified row name.
double objectiveOffset_[MAX_OBJECTIVES]
Constant offset for objective value.
Definition: CoinLpIO.hpp:608
int read_monom_row(char *start_str, double *coeff, char **name, int cnt_coeff) const
Read a monomial of a constraint.
char * fileName_
Current file name.
Definition: CoinLpIO.hpp:621
void setInfinity(const double)
Set infinity.
char inputBuffer_[1028]
Current buffer (needed so can get rid of blanks with :
Definition: CoinLpIO.hpp:681
bool isInteger(int columnNumber) const
Return true if a column is an integer (binary or general integer) variable.
int is_free(const char *buff) const
Return 1 if buff is the keyword "free" or one of its variants.
int numberSets_
Number of sets.
Definition: CoinLpIO.hpp:618
int read_monom_obj(double *coeff, char **name, int *cnt, char **obj_name, int *num_objectives, int *obj_starts)
Read a monomial of the objective function.
double * rowrange_
Pointer to dense vector of slack variable upper bounds for ranged constraints (undefined for non-rang...
Definition: CoinLpIO.hpp:596
int writeLp(const char *filename, const bool useRowNames=true)
Write the data in Lp format in the file with name filename.
void readLp(FILE *fp)
Read the data in Lp format from the file stream.
const char * columnName(int index) const
Return the column name for the specified index.
const char * getRowSense() const
Get pointer to array[getNumRows()] of constraint senses.
bool wasMaximization_
Maximization reformulation flag.
Definition: CoinLpIO.hpp:639
void setDefaultColNames()
Set column names to the default "x0", "x1", ...
void gutsOfCopy(const CoinLpIO &)
Does the heavy lifting for copy and assignment.
int is_keyword(const char *buff) const
Return an integer indicating if one of the keywords "Bounds", "Integers", "Generals",...
int writeLp(FILE *fp, const double epsilon, const int numberAcross, const int decimals, const bool useRowNames=true)
Write the data in Lp format in the file pointed to by the paramater fp.
CoinSet ** setInformation() const
Set information.
Definition: CoinLpIO.hpp:519
char * rowsense_
Pointer to dense vector of row senses.
Definition: CoinLpIO.hpp:599
CoinFileInput * input_
File handler.
Definition: CoinLpIO.hpp:687
int bufferLength_
Current buffer length (negative if not got eol)
Definition: CoinLpIO.hpp:683
double * rhs_
Pointer to dense vector of row rhs.
Definition: CoinLpIO.hpp:591
const CoinPackedMatrix * getMatrixByRow() const
Get pointer to row-wise copy of the coefficient matrix.
void startHash(char const *const *const names, const COINColumnIndex number, int section)
Build the hash table for the given names.
int bufferPosition_
Current buffer position.
Definition: CoinLpIO.hpp:685
COINColumnIndex findHash(const char *name, int section) const
Return the index of the given name, return -1 if the name is not found.
void setObjectiveOffset(double value, int j)
Set objective offset.
Definition: CoinLpIO.hpp:294
void setEpsilon(const double)
Set epsilon.
void checkColNames()
Check that current column names are distinct.
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.
bool defaultHandler_
Flag to say if the message handler is the default handler.
Definition: CoinLpIO.hpp:559
const char * integerColumns() const
Get characteristic vector of integer variables.
CoinMessages messages_
Messages.
Definition: CoinLpIO.hpp:561
void readLp(FILE *fp, const double epsilon)
Read the data in Lp format from the file stream, using the given value for epsilon.
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.
const double * getRightHandSide() const
Get pointer to array[getNumRows()] of constraint right-hand sides.
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 ...
char const *const * getColNames() const
Get pointer to array[getNumCols()] of column names.
int getNumCols() const
Get number of columns.
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.
CoinHashLink * hash_[2]
Hash tables with two sections.
Definition: CoinLpIO.hpp:678
void setDecimals(const int)
Set decimals.
CoinMessages * messagesPointer()
Return the messages pointer.
Definition: CoinLpIO.hpp:545
const char * rowName(int index) const
Return the row name for the specified index.
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.
char ** names_[2]
Row names (including objective function name) and column names (linked to Hash tables).
Definition: CoinLpIO.hpp:659
~CoinLpIO()
Destructor.
int writeLp(FILE *fp, const bool useRowNames=true)
Write the data in Lp format in the file pointed to by the parameter fp.
CoinSet ** set_
Pointer to sets.
Definition: CoinLpIO.hpp:615
const double * getColLower() const
Get pointer to array[getNumCols()] of column lower bounds.
double * colupper_
Pointer to dense vector of column upper bounds.
Definition: CoinLpIO.hpp:588
double * rowlower_
Pointer to dense vector of row lower bounds.
Definition: CoinLpIO.hpp:579
CoinLpIO & operator=(const CoinLpIO &rhs)
assignment operator
CoinMessageHandler * handler_
Message handler.
Definition: CoinLpIO.hpp:553
const char * getObjName() const
Get objective function name.
void newLanguage(CoinMessages::Language language)
Set the language for messages.
int num_objectives_
Number of objectives.
Definition: CoinLpIO.hpp:605
void loadSOS(int numberSets, const CoinSet *sets)
Load in SOS stuff.
double getInfinity() const
Get infinity.
void read_row(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.
double getEpsilon() const
Get epsilon.
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.
double infinity_
Value to use for infinity.
Definition: CoinLpIO.hpp:624
int fscanfLpIO(char *buff) const
Get next string (returns number in)
void realloc_coeff(double **coeff, char ***colNames, int *maxcoeff) const
Reallocate vectors related to number of coefficients.
void setObjectiveOffset(double value)
Set objective offset.
Definition: CoinLpIO.hpp:283
const double * getRowRange() const
Get pointer to array[getNumRows()] of row ranges.
int is_sense(const char *buff) const
Return an integer indicating the inequality sense read.
int numberRows_
Number of rows.
Definition: CoinLpIO.hpp:564
int getNumRows() const
Get number of rows.
void getPreviousRowNames(char const *const *prev, int *card_prev) const
Get pointer to array[*card_prev] of previous row names.
void setProblemName(const char *name)
Set problem name.
int getDecimals() const
Get decimals, the number of digits to write after the decimal point.
int columnIndex(const char *name) const
Return the index for the specified column name.
friend void CoinLpIOUnitTest(const std::string &lpDir)
int numberColumns_
Number of columns.
Definition: CoinLpIO.hpp:567
CoinLpIO(const CoinLpIO &)
Copy constructor.
int is_subject_to(const char *buff) const
Return an integer indicating if the keyword "subject to" or one of its variants has been read.
void checkRowNames()
Check that current objective name and all row names are distinct including row names obtained by addi...
int is_inf(const char *buff) const
Return 1 if buff is the keyword "inf" or one of its variants.
const double * getObjCoefficients() const
Get pointer to array[getNumCols()] of objective function coefficients.
double * collower_
Pointer to dense vector of column lower bounds.
Definition: CoinLpIO.hpp:585
double objectiveOffset() const
Returns the (constant) objective offset.
const int getNumObjectives() const
Get pointer to array[getNumCols()] of objective function coefficients.
char * integerType_
Pointer to dense vector specifying if a variable is continuous (0) or integer (1).
Definition: CoinLpIO.hpp:612
int numberAcross_
Number of monomials printed in a row.
Definition: CoinLpIO.hpp:630
int getNumberAcross() const
Get numberAcross, the number of monomials to be printed per line.
int numberSets() const
Number of SOS sets.
Definition: CoinLpIO.hpp:513
const double * getColUpper() const
Get pointer to array[getNumCols()] of column upper bounds.
const char * getProblemName() const
Get the problem name.
CoinMessages messages()
Return the messages.
Definition: CoinLpIO.hpp:543
void getPreviousColNames(char const *const *prev, int *card_prev) const
Get pointer to array[*card_prev] of previous column names.
const double * getObjCoefficients(int j) const
Get pointer to array[getNumCols()] of objective function coefficients for objective j.
int find_obj() const
Locate the objective function.
int newCardLpIO() const
Get next line into inputBuffer_ (returns number in)
int card_previous_names_[2]
card_previous_names_[section] holds the number of entries in the vector previous_names_[section].
Definition: CoinLpIO.hpp:653
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 setDefaultRowNames()
Set objective function name to the default "obj" and row names to the default "cons0",...
const CoinPackedMatrix * getMatrixByCol() const
Get pointer to column-wise copy of the coefficient matrix.
void readLp()
Does work of readLp.
char * objName_[MAX_OBJECTIVES]
Objective function name.
Definition: CoinLpIO.hpp:636
char ** previous_names_[2]
Row names (including objective function name) and column names when stopHash() for the corresponding ...
Definition: CoinLpIO.hpp:647
void loadSOS(int numberSets, const CoinSet **sets)
Load in SOS stuff.
char * problemName_
Problem name.
Definition: CoinLpIO.hpp:550
void setLanguage(CoinMessages::Language language)
Set the language for messages.
Definition: CoinLpIO.hpp:537
void skip_comment(char *buff) const
Read the file fp until buff contains an end of line.
int maxHash_[2]
Maximum number of entries in a hash table section.
Definition: CoinLpIO.hpp:668
void print() const
Dump the data. Low level method for debugging.
double * rowupper_
Pointer to dense vector of row upper bounds.
Definition: CoinLpIO.hpp:582
void setLpDataRowAndColNames(char const *const *const rownames, char const *const *const colnames)
Set the row and column names.
void passInMessageHandler(CoinMessageHandler *handler)
Pass in Message handler.
void freePreviousNames(const int section)
Free the vector previous_names_[section] and set card_previous_names_[section] to 0.
double objectiveOffset(int j) const
Returns the (constant) objective offset for objective j.
int first_is_number(const char *buff) const
Return 1 if the first character of buff is a number.
double * objective_[MAX_OBJECTIVES]
Pointer to dense vector of objective coefficients.
Definition: CoinLpIO.hpp:602
CoinBigIndex getNumElements() const
Get number of nonzero elements.
void freeAll()
Free all memory (except memory related to hash tables and objName_).
bool eofFound_
If already inserted one End.
Definition: CoinLpIO.hpp:689
void setLpDataWithoutRowAndColNames(const CoinPackedMatrix &m, const double *collb, const double *colub, const double *obj_coeff[MAX_OBJECTIVES], int num_objectives, const char *integrality, const double *rowlb, const double *rowub)
int numberHash_[2]
Number of entries in a hash table section.
Definition: CoinLpIO.hpp:673
bool wasMaximization() const
Return true if maximization problem reformulated as minimization.
Definition: CoinLpIO.hpp:288
CoinLpIO()
Default Constructor.
int decimals_
Number of decimals printed for coefficients.
Definition: CoinLpIO.hpp:633
void out_coeff(FILE *fp, double v, int print_1) const
Write a coefficient.
void stopHash(int section)
Delete hash storage.
const double * getRowLower() const
Get pointer to array[getNumRows()] of row lower bounds.
CoinPackedMatrix * matrixByRow_
Pointer to row-wise copy of problem matrix coefficients.
Definition: CoinLpIO.hpp:576
void readLp(const char *filename)
Read the data in Lp format from the file with name filename.
double epsilon_
Value to use for epsilon.
Definition: CoinLpIO.hpp:627
const char * getObjName(int j) const
Get objective function name for objective j.
char const *const * getRowNames() const
Get pointer to array[getNumRows()+1] of row names, including objective function name as last entry.
void realloc_row(char ***rowNames, CoinBigIndex **start, double **rhs, double **rowlow, double **rowup, int *maxrow) const
Reallocate vectors related to rows.
void setNumberAcross(const int)
Set numberAcross.
const double * getRowUpper() const
Get pointer to array[getNumRows()] of row upper bounds.
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.
CoinMessageHandler * messageHandler() const
Return the message handler.
Definition: CoinLpIO.hpp:540
Base class for message handling.
Class to hold and manipulate an array of massaged messages.
Language
Supported languages.
Sparse Matrix Base Class.
Very simple class for containing data on set.
Definition: CoinMpsIO.hpp:269