Clp  1.17.6
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ClpGubMatrix.hpp
Go to the documentation of this file.
1 /* $Id: ClpGubMatrix.hpp 2385 2019-01-06 19:43:06Z unxusr $ */
2 // Copyright (C) 2003, 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 ClpGubMatrix_H
7 #define ClpGubMatrix_H
8 
9 #include "CoinPragma.hpp"
10 
11 #include "ClpPackedMatrix.hpp"
12 class ClpSimplex;
21 class ClpGubMatrix : public ClpPackedMatrix {
22 
23 public:
27  virtual ClpMatrixBase *reverseOrderedCopy() const;
29  virtual int countBasis(const int *whichColumn,
30  int &numberColumnBasic);
32  virtual void fillBasis(ClpSimplex *model,
33  const int *whichColumn,
34  int &numberColumnBasic,
35  int *row, int *start,
36  int *rowCount, int *columnCount,
37  CoinFactorizationDouble *element);
40  virtual void unpack(const ClpSimplex *model, CoinIndexedVector *rowArray,
41  int column) const;
46  virtual void unpackPacked(ClpSimplex *model,
47  CoinIndexedVector *rowArray,
48  int column) const;
51  virtual void add(const ClpSimplex *model, CoinIndexedVector *rowArray,
52  int column, double multiplier) const;
54  virtual void add(const ClpSimplex *model, double *array,
55  int column, double multiplier) const;
57  virtual void partialPricing(ClpSimplex *model, double start, double end,
58  int &bestSequence, int &numberWanted);
60  virtual int hiddenRows() const;
62 
65 
71  virtual void transposeTimes(const ClpSimplex *model, double scalar,
72  const CoinIndexedVector *x,
74  CoinIndexedVector *z) const;
80  virtual void transposeTimesByRow(const ClpSimplex *model, double scalar,
81  const CoinIndexedVector *x,
83  CoinIndexedVector *z) const;
87  virtual void subsetTransposeTimes(const ClpSimplex *model,
88  const CoinIndexedVector *x,
89  const CoinIndexedVector *y,
90  CoinIndexedVector *z) const;
97  virtual int extendUpdated(ClpSimplex *model, CoinIndexedVector *update, int mode);
103  virtual void primalExpanded(ClpSimplex *model, int mode);
112  virtual void dualExpanded(ClpSimplex *model, CoinIndexedVector *array,
113  double *other, int mode);
131  virtual int generalExpanded(ClpSimplex *model, int mode, int &number);
135  virtual int updatePivot(ClpSimplex *model, double oldInValue, double oldOutValue);
137  virtual void useEffectiveRhs(ClpSimplex *model, bool cheapest = true);
141  virtual double *rhsOffset(ClpSimplex *model, bool forceRefresh = false,
142  bool check = false);
155  virtual int synchronize(ClpSimplex *model, int mode);
157  virtual void correctSequence(const ClpSimplex *model, int &sequenceIn, int &sequenceOut);
159 
163  ClpGubMatrix();
165  virtual ~ClpGubMatrix();
167 
171  ClpGubMatrix(const ClpGubMatrix &);
176  ClpGubMatrix(const ClpGubMatrix &wholeModel,
177  int numberRows, const int *whichRows,
178  int numberColumns, const int *whichColumns);
179  ClpGubMatrix(const CoinPackedMatrix &wholeModel,
180  int numberRows, const int *whichRows,
181  int numberColumns, const int *whichColumns);
182 
185 
189  const int *start, const int *end,
190  const double *lower, const double *upper,
191  const unsigned char *status = NULL);
192 
195  virtual ClpMatrixBase *clone() const;
198  virtual ClpMatrixBase *subsetClone(
199  int numberRows, const int *whichRows,
200  int numberColumns, const int *whichColumns) const;
202  void redoSet(ClpSimplex *model, int newKey, int oldKey, int iSet);
204 
206  inline ClpSimplex::Status getStatus(int sequence) const
208  {
209  return static_cast< ClpSimplex::Status >(status_[sequence] & 7);
210  }
211  inline void setStatus(int sequence, ClpSimplex::Status status)
212  {
213  unsigned char &st_byte = status_[sequence];
214  st_byte = static_cast< unsigned char >(st_byte & ~7);
215  st_byte = static_cast< unsigned char >(st_byte | status);
216  }
218  inline void setFlagged(int sequence)
219  {
220  status_[sequence] = static_cast< unsigned char >(status_[sequence] | 64);
221  }
222  inline void clearFlagged(int sequence)
223  {
224  status_[sequence] = static_cast< unsigned char >(status_[sequence] & ~64);
225  }
226  inline bool flagged(int sequence) const
227  {
228  return ((status_[sequence] & 64) != 0);
229  }
231  inline void setAbove(int sequence)
232  {
233  unsigned char iStat = status_[sequence];
234  iStat = static_cast< unsigned char >(iStat & ~24);
235  status_[sequence] = static_cast< unsigned char >(iStat | 16);
236  }
238  inline void setFeasible(int sequence)
239  {
240  unsigned char iStat = status_[sequence];
241  iStat = static_cast< unsigned char >(iStat & ~24);
242  status_[sequence] = static_cast< unsigned char >(iStat | 8);
243  }
245  inline void setBelow(int sequence)
246  {
247  unsigned char iStat = status_[sequence];
248  iStat = static_cast< unsigned char >(iStat & ~24);
249  status_[sequence] = iStat;
250  }
251  inline double weight(int sequence) const
252  {
253  int iStat = status_[sequence] & 31;
254  iStat = iStat >> 3;
255  return static_cast< double >(iStat - 1);
256  }
258  inline int *start() const
259  {
260  return start_;
261  }
263  inline int *end() const
264  {
265  return end_;
266  }
268  inline double *lower() const
269  {
270  return lower_;
271  }
273  inline double *upper() const
274  {
275  return upper_;
276  }
278  inline int *keyVariable() const
279  {
280  return keyVariable_;
281  }
283  inline int *backward() const
284  {
285  return backward_;
286  }
288  inline int numberSets() const
289  {
290  return numberSets_;
291  }
293  void switchOffCheck();
295 
296 protected:
311  int *start_;
313  int *end_;
315  double *lower_;
317  double *upper_;
319  mutable unsigned char *status_;
321  unsigned char *saveStatus_;
325  int *backward_;
329  double *changeCost_;
331  mutable int *keyVariable_;
335  mutable int *next_;
337  int *toIndex_;
338  // Reverse pointer from index to set
351  int noCheck_;
363  int lastGub_;
366  int gubType_;
368 };
369 
370 #endif
371 
372 /* vi: softtabstop=2 shiftwidth=2 expandtab tabstop=2
373 */
int gubType_
type of gub - 0 not contiguous, 1 contiguous add 8 bit to say no ubs on individual variables ...
virtual int synchronize(ClpSimplex *model, int mode)
This is local to Gub to allow synchronization: mode=0 when status of basis is good mode=1 when variab...
virtual ClpMatrixBase * subsetClone(int numberRows, const int *whichRows, int numberColumns, const int *whichColumns) const
Subset clone (without gaps).
virtual int hiddenRows() const
Returns number of hidden rows e.g. gub.
int numberSets() const
Number of sets (gub rows)
unsigned char * saveStatus_
Saved status of slacks.
Status
enums for status of various sorts.
Definition: ClpSimplex.hpp:114
double * upper() const
Upper bounds on sets.
ClpSimplex::Status getStatus(int sequence) const
Status.
int * next_
Next basic variable in set - starts at key and end with -(set+1).
double sumOfRelaxedPrimalInfeasibilities_
Sum of Primal infeasibilities using tolerance based on error in primals.
Abstract base class for Clp Matrices.
This implements Gub rows plus a ClpPackedMatrix.
virtual void subsetTransposeTimes(const ClpSimplex *model, const CoinIndexedVector *x, const CoinIndexedVector *y, CoinIndexedVector *z) const
Return x *A in z but just for indices in y.
ClpGubMatrix & operator=(const ClpGubMatrix &)
virtual void primalExpanded(ClpSimplex *model, int mode)
mode=0 - Set up before &quot;update&quot; and &quot;times&quot; for primal solution using extended rows mode=1 - Cleanup ...
unsigned char * status_
Status of slacks.
int numberPrimalInfeasibilities_
Number of primal infeasibilities.
bool flagged(int sequence) const
virtual void partialPricing(ClpSimplex *model, double start, double end, int &bestSequence, int &numberWanted)
Partial pricing.
double weight(int sequence) const
int numberDualInfeasibilities_
Number of dual infeasibilities.
virtual void correctSequence(const ClpSimplex *model, int &sequenceIn, int &sequenceOut)
Correct sequence in and out to give true value.
int * keyVariable() const
Key variable of set.
ClpSimplex * model_
Pointer back to model.
int * end() const
End.
virtual void fillBasis(ClpSimplex *model, const int *whichColumn, int &numberColumnBasic, int *row, int *start, int *rowCount, int *columnCount, CoinFactorizationDouble *element)
Fills in column part of basis.
ClpGubMatrix()
Default constructor.
double sumDualInfeasibilities_
Sum of dual infeasibilities.
virtual void dualExpanded(ClpSimplex *model, CoinIndexedVector *array, double *other, int mode)
mode=0 - Set up before &quot;updateTranspose&quot; and &quot;transposeTimes&quot; for duals using extended updates array ...
int gubSlackIn_
Gub slack in (set number or -1)
int firstGub_
First gub variables (same as start_[0] at present)
virtual int extendUpdated(ClpSimplex *model, CoinIndexedVector *update, int mode)
expands an updated column to allow for extra rows which the main solver does not know about and retur...
double sumPrimalInfeasibilities_
Sum of primal infeasibilities.
virtual void transposeTimesByRow(const ClpSimplex *model, double scalar, const CoinIndexedVector *x, CoinIndexedVector *y, CoinIndexedVector *z) const
Return x * scalar * A + y in z.
double CoinFactorizationDouble
Definition: CoinTypes.hpp:57
virtual ClpMatrixBase * reverseOrderedCopy() const
Returns a new matrix in reverse order without gaps (GUB wants NULL)
void redoSet(ClpSimplex *model, int newKey, int oldKey, int iSet)
redoes next_ for a set.
This solves LPs using the simplex method.
Definition: ClpSimplex.hpp:106
Indexed Vector.
virtual int countBasis(const int *whichColumn, int &numberColumnBasic)
Returns number of elements in column part of basis.
int possiblePivotKey_
Pivot row of possible next key.
int saveNumber_
Number in vector without gub extension.
void setFlagged(int sequence)
To flag a variable.
double * lower() const
Lower bounds on sets.
int * backToPivotRow_
Backward pointer to pivot row !!!
int * keyVariable_
Key variable of set.
void setAbove(int sequence)
To say key is above ub.
double * lower_
Lower bounds on sets.
void setBelow(int sequence)
To say key is below lb.
virtual void useEffectiveRhs(ClpSimplex *model, bool cheapest=true)
Sets up an effective RHS and does gub crash if needed.
Sparse Matrix Base Class.
void clearFlagged(int sequence)
int * start() const
Starts.
virtual double * rhsOffset(ClpSimplex *model, bool forceRefresh=false, bool check=false)
Returns effective RHS offset if it is being used.
virtual void transposeTimes(double scalar, const double *x, double *y) const
Return y + x * scalar * A in y.
void switchOffCheck()
Switches off dj checking each factorization (for BIG models)
int * start_
Starts.
void setFeasible(int sequence)
To say key is feasible.
virtual void transposeTimes(const ClpSimplex *model, double scalar, const CoinIndexedVector *x, CoinIndexedVector *y, CoinIndexedVector *z) const
Return x * scalar * A + y in z.
CoinPackedMatrix * matrix() const
Returns CoinPackedMatrix (non const)
int * savedKeyVariable_
Saved key variables.
virtual void add(const ClpSimplex *model, CoinIndexedVector *rowArray, int column, double multiplier) const
Adds multiple of a column into an CoinIndexedvector You can use quickAdd to add to vector...
double * changeCost_
Change in costs for keys.
int * end_
End.
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=...
void setStatus(int sequence, ClpSimplex::Status status)
int numberSets_
Number of sets (gub rows)
int * backward() const
Backward pointer to set number.
int noCheck_
If pricing will declare victory (i.e.
virtual ~ClpGubMatrix()
Destructor.
int lastGub_
last gub variable (same as end_[numberSets_-1] at present)
int * backward_
Backward pointer to set number.
virtual ClpMatrixBase * clone() const
Clone.
double infeasibilityWeight_
Infeasibility weight when last full pass done.
double * upper_
Upper bounds on sets.
int * toIndex_
Backward pointer to index in CoinIndexedVector.
virtual void unpackPacked(ClpSimplex *model, CoinIndexedVector *rowArray, int column) const
Unpacks a column into an CoinIndexedvector in packed foramt Note that model is NOT const...
virtual int updatePivot(ClpSimplex *model, double oldInValue, double oldOutValue)
update information for a pivot (and effective rhs)
virtual void unpack(const ClpSimplex *model, CoinIndexedVector *rowArray, int column) const
Unpacks a column into an CoinIndexedvector.
double sumOfRelaxedDualInfeasibilities_
Sum of Dual infeasibilities using tolerance based on error in duals.