Clp  1.17.6
ClpDynamicMatrix.hpp
Go to the documentation of this file.
1 /* $Id$ */
2 // Copyright (C) 2004, International Business Machines
3 // Corporation and others. All Rights Reserved.
4 // This code is licensed under the terms of the Eclipse Public License (EPL).
5 
6 #ifndef ClpDynamicMatrix_H
7 #define ClpDynamicMatrix_H
8 
9 #include "CoinPragma.hpp"
10 
11 #include "ClpPackedMatrix.hpp"
12 class ClpSimplex;
20 
21 public:
24  soloKey = 0x00,
25  inSmall = 0x01,
26  atUpperBound = 0x02,
27  atLowerBound = 0x03
28  };
32  virtual void partialPricing(ClpSimplex *model, double start, double end,
33  int &bestSequence, int &numberWanted);
34 
38  virtual int updatePivot(ClpSimplex *model, double oldInValue, double oldOutValue);
42  virtual double *rhsOffset(ClpSimplex *model, bool forceRefresh = false,
43  bool check = false);
44 
49  virtual void times(double scalar,
50  const double *x, double *y) const;
52  void modifyOffset(int sequence, double amount);
54  double keyValue(int iSet) const;
63  virtual void dualExpanded(ClpSimplex *model, CoinIndexedVector *array,
64  double *other, int mode);
82  virtual int generalExpanded(ClpSimplex *model, int mode, int &number);
87  virtual int refresh(ClpSimplex *model);
91  virtual void createVariable(ClpSimplex *model, int &bestSequence);
93  virtual double reducedCost(ClpSimplex *model, int sequence) const;
95  void gubCrash();
97  void writeMps(const char *name);
101  int addColumn(CoinBigIndex numberEntries, const int *row, const double *element,
102  double cost, double lower, double upper, int iSet,
103  DynamicStatus status);
108  virtual void packDown(const int *, int) {}
110  inline double columnLower(int sequence) const
111  {
112  if (columnLower_)
113  return columnLower_[sequence];
114  else
115  return 0.0;
116  }
118  inline double columnUpper(int sequence) const
119  {
120  if (columnUpper_)
121  return columnUpper_[sequence];
122  else
123  return COIN_DBL_MAX;
124  }
125 
127 
139  int numberColumns, const int *starts,
140  const double *lower, const double *upper,
141  const CoinBigIndex *startColumn, const int *row,
142  const double *element, const double *cost,
143  const double *columnLower = NULL, const double *columnUpper = NULL,
144  const unsigned char *status = NULL,
145  const unsigned char *dynamicStatus = NULL);
146 
148  virtual ~ClpDynamicMatrix();
150 
156  ClpDynamicMatrix(const CoinPackedMatrix &);
157 
160  virtual ClpMatrixBase *clone() const;
162 
165  inline ClpSimplex::Status getStatus(int sequence) const
166  {
167  return static_cast< ClpSimplex::Status >(status_[sequence] & 7);
168  }
169  inline void setStatus(int sequence, ClpSimplex::Status status)
170  {
171  unsigned char &st_byte = status_[sequence];
172  st_byte = static_cast< unsigned char >(st_byte & ~7);
173  st_byte = static_cast< unsigned char >(st_byte | status);
174  }
176  inline bool flaggedSlack(int i) const
177  {
178  return (status_[i] & 8) != 0;
179  }
180  inline void setFlaggedSlack(int i)
181  {
182  status_[i] = static_cast< unsigned char >(status_[i] | 8);
183  }
184  inline void unsetFlaggedSlack(int i)
185  {
186  status_[i] = static_cast< unsigned char >(status_[i] & ~8);
187  }
189  inline int numberSets() const
190  {
191  return numberSets_;
192  }
194  inline int numberGubEntries() const
195  {
196  return startSet_[numberSets_];
197  }
199  inline int *startSets() const
200  {
201  return startSet_;
202  }
204  inline bool flagged(int i) const
205  {
206  return (dynamicStatus_[i] & 8) != 0;
207  }
208  inline void setFlagged(int i)
209  {
210  dynamicStatus_[i] = static_cast< unsigned char >(dynamicStatus_[i] | 8);
211  }
212  inline void unsetFlagged(int i)
213  {
214  dynamicStatus_[i] = static_cast< unsigned char >(dynamicStatus_[i] & ~8);
215  }
216  inline void setDynamicStatus(int sequence, DynamicStatus status)
217  {
218  unsigned char &st_byte = dynamicStatus_[sequence];
219  st_byte = static_cast< unsigned char >(st_byte & ~7);
220  st_byte = static_cast< unsigned char >(st_byte | status);
221  }
222  inline DynamicStatus getDynamicStatus(int sequence) const
223  {
224  return static_cast< DynamicStatus >(dynamicStatus_[sequence] & 7);
225  }
227  inline double objectiveOffset() const
228  {
229  return objectiveOffset_;
230  }
232  inline CoinBigIndex *startColumn() const
233  {
234  return startColumn_;
235  }
237  inline int *row() const
238  {
239  return row_;
240  }
242  inline double *element() const
243  {
244  return element_;
245  }
247  inline double *cost() const
248  {
249  return cost_;
250  }
252  inline int *id() const
253  {
254  return id_;
255  }
257  inline double *columnLower() const
258  {
259  return columnLower_;
260  }
262  inline double *columnUpper() const
263  {
264  return columnUpper_;
265  }
267  inline double *lowerSet() const
268  {
269  return lowerSet_;
270  }
272  inline double *upperSet() const
273  {
274  return upperSet_;
275  }
277  inline int numberGubColumns() const
278  {
279  return numberGubColumns_;
280  }
282  inline int firstAvailable() const
283  {
284  return firstAvailable_;
285  }
287  inline int firstDynamic() const
288  {
289  return firstDynamic_;
290  }
292  inline int lastDynamic() const
293  {
294  return lastDynamic_;
295  }
297  inline int numberStaticRows() const
298  {
299  return numberStaticRows_;
300  }
302  inline CoinBigIndex numberElements() const
303  {
304  return numberElements_;
305  }
306  inline int *keyVariable() const
307  {
308  return keyVariable_;
309  }
313  inline unsigned char *gubRowStatus() const
314  {
315  return status_;
316  }
318  inline unsigned char *dynamicStatus() const
319  {
320  return dynamicStatus_;
321  }
323  int whichSet(int sequence) const;
325 
326 protected:
345  mutable int *keyVariable_;
347  int *toIndex_;
348  // Reverse pointer from index to set
357  double *lowerSet_;
359  double *upperSet_;
361  unsigned char *status_;
375  CoinBigIndex numberElements_;
385  int noCheck_;
393  CoinBigIndex maximumElements_;
395  int *startSet_;
397  int *next_;
399  CoinBigIndex *startColumn_;
401  int *row_;
403  double *element_;
405  double *cost_;
407  int *id_;
409  unsigned char *dynamicStatus_;
411  double *columnLower_;
413  double *columnUpper_;
415 };
416 
417 #endif
418 
419 /* vi: softtabstop=2 shiftwidth=2 expandtab tabstop=2
420 */
This implements a dynamic matrix when we have a limit on the number of "interesting rows".
int whichSet(int sequence) const
Returns which set a variable is in.
int * startSets() const
Sets.
int * next_
next in chain
int * id_
ids of active columns (just index here)
virtual void times(double scalar, const double *x, double *y) const
Return y + A * scalar *x in y.
virtual double reducedCost(ClpSimplex *model, int sequence) const
Returns reduced cost of a variable.
virtual int refresh(ClpSimplex *model)
Purely for column generation and similar ideas.
double keyValue(int iSet) const
Gets key value when none in small.
CoinBigIndex maximumElements_
current maximum number of elemnts (then compress)
unsigned char * dynamicStatus() const
Status region for gub variables.
double * upperSet() const
Upper bounds on sets.
int * row() const
rows
double objectiveOffset() const
Saved value of objective offset.
unsigned char * status_
Status of slack on set.
virtual void dualExpanded(ClpSimplex *model, CoinIndexedVector *array, double *other, int mode)
mode=0 - Set up before "updateTranspose" and "transposeTimes" for duals using extended updates array ...
double * lowerSet_
Lower bounds on sets.
CoinBigIndex * startColumn_
Starts of each column.
int firstDynamic() const
first dynamic
int numberGubEntries() const
Number of possible gub variables.
int savedBestSet_
Saved best set in pricing.
DynamicStatus
enums for status of various sorts
double infeasibilityWeight_
Infeasibility weight when last full pass done.
int numberSets_
Number of sets (dynamic rows)
double * lowerSet() const
Lower bounds on sets.
double columnUpper(int sequence) const
Gets upper bound (to simplify coding)
double columnLower(int sequence) const
Gets lower bound (to simplify coding)
int numberGubColumns() const
size
virtual void partialPricing(ClpSimplex *model, double start, double end, int &bestSequence, int &numberWanted)
Partial pricing.
double * columnUpper() const
Optional upper bounds on columns.
void setFlaggedSlack(int i)
int * keyVariable() const
int numberDualInfeasibilities_
Number of dual infeasibilities.
int * id() const
ids of active columns (just index here)
int numberPrimalInfeasibilities_
Number of primal infeasibilities.
void writeMps(const char *name)
Writes out model (without names)
ClpSimplex * model_
Pointer back to model.
ClpDynamicMatrix()
Default constructor.
double sumDualInfeasibilities_
Sum of dual infeasibilities.
double objectiveOffset_
Saved value of objective offset.
int numberActiveSets_
Number of active sets.
void unsetFlaggedSlack(int i)
double * columnLower_
Optional lower bounds on columns.
CoinBigIndex numberElements_
size of working matrix (max)
void gubCrash()
Does gub crash.
unsigned char * dynamicStatus_
for status and which bound
void initialProblem()
Populates initial matrix from dynamic status.
void modifyOffset(int sequence, double amount)
Modifies rhs offset.
virtual int updatePivot(ClpSimplex *model, double oldInValue, double oldOutValue)
update information for a pivot (and effective rhs)
void unsetFlagged(int i)
double * columnUpper_
Optional upper bounds on columns.
double savedBestGubDual_
Saved best dual on gub row in pricing.
unsigned char * gubRowStatus() const
Status region for gub slacks.
int maximumGubColumns_
current maximum number of columns (then compress)
double * columnLower() const
Optional lower bounds on columns.
int firstAvailable_
first free
double * element() const
elements
bool flagged(int i) const
Whether flagged.
int firstDynamic_
first dynamic
CoinBigIndex * startColumn() const
Starts of each column.
int firstAvailable() const
first free
ClpDynamicMatrix & operator=(const ClpDynamicMatrix &)
int addColumn(CoinBigIndex numberEntries, const int *row, const double *element, double cost, double lower, double upper, int iSet, DynamicStatus status)
Adds in a column to gub structure (called from descendant) and returns sequence.
virtual void createVariable(ClpSimplex *model, int &bestSequence)
Creates a variable.
void setDynamicStatus(int sequence, DynamicStatus status)
CoinBigIndex numberElements() const
size of working matrix (max)
int numberStaticRows() const
number of rows in original model
ClpDynamicMatrix(const ClpDynamicMatrix &)
The copy constructor.
double * cost() const
costs
DynamicStatus getDynamicStatus(int sequence) const
double sumOfRelaxedPrimalInfeasibilities_
Sum of Primal infeasibilities using tolerance based on error in primals.
virtual double * rhsOffset(ClpSimplex *model, bool forceRefresh=false, bool check=false)
Returns effective RHS offset if it is being used.
ClpDynamicMatrix(ClpSimplex *model, int numberSets, int numberColumns, const int *starts, const double *lower, const double *upper, const CoinBigIndex *startColumn, const int *row, const double *element, const double *cost, const double *columnLower=NULL, const double *columnUpper=NULL, const unsigned char *status=NULL, const unsigned char *dynamicStatus=NULL)
This is the real constructor.
int * toIndex_
Backward pointer to extra row.
int numberSets() const
Number of sets (dynamic rows)
virtual ClpMatrixBase * clone() const
Clone.
double sumOfRelaxedDualInfeasibilities_
Sum of Dual infeasibilities using tolerance based on error in duals.
int lastDynamic_
number of columns in dynamic model
void switchOffCheck()
Switches off dj checking each factorization (for BIG models)
int * keyVariable_
Key variable of set (only accurate if none in small problem)
double sumPrimalInfeasibilities_
Sum of primal infeasibilities.
bool flaggedSlack(int i) const
Whether flagged slack.
ClpSimplex::Status getStatus(int sequence) const
Status of row slacks.
virtual int generalExpanded(ClpSimplex *model, int mode, int &number)
mode=0 - Create list of non-key basics in pivotVariable_ using number as numberBasic in and out mode=...
int firstAvailableBefore_
first free when iteration started
int noCheck_
If pricing will declare victory (i.e.
ClpDynamicMatrix(const CoinPackedMatrix &)
The copy constructor from an CoinPackedMatrix.
int numberStaticRows_
number of rows in original model
virtual ~ClpDynamicMatrix()
Destructor.
int * backToPivotRow_
Backward pointer to pivot row !!!
double * element_
elements
void setStatus(int sequence, ClpSimplex::Status status)
double * upperSet_
Upper bounds on sets.
int * startSet_
Start of each set.
int lastDynamic() const
number of columns in dynamic model
virtual void packDown(const int *, int)
If addColumn forces compression then this allows descendant to know what to do.
Abstract base class for Clp Matrices.
virtual void times(double scalar, const double *x, double *y) const
Return y + A * scalar *x in y.
This solves LPs using the simplex method.
Definition: ClpSimplex.hpp:106
Status
enums for status of various sorts.
Definition: ClpSimplex.hpp:114