Clp  1.15.10
ClpDynamicMatrix.hpp
Go to the documentation of this file.
1 /* $Id: ClpDynamicMatrix.hpp 1755 2011-06-28 18:24:31Z lou $ */
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 
10 #include "CoinPragma.hpp"
11 
12 #include "ClpPackedMatrix.hpp"
13 class ClpSimplex;
21 
22 public:
25  soloKey = 0x00,
26  inSmall = 0x01,
27  atUpperBound = 0x02,
28  atLowerBound = 0x03
29  };
32  virtual void partialPricing(ClpSimplex * model, double start, double end,
34  int & bestSequence, int & numberWanted);
35 
39  virtual int updatePivot(ClpSimplex * model, double oldInValue, double oldOutValue);
43  virtual double * rhsOffset(ClpSimplex * model, bool forceRefresh = false,
44  bool check = false);
45 
50  virtual void times(double scalar,
51  const double * x, double * y) const;
53  void modifyOffset(int sequence, double amount);
55  double keyValue(int iSet) const;
64  virtual void dualExpanded(ClpSimplex * model, CoinIndexedVector * array,
65  double * other, int mode);
83  virtual int generalExpanded(ClpSimplex * model, int mode, int & number);
88  virtual int refresh(ClpSimplex * model);
92  virtual void createVariable(ClpSimplex * model, int & bestSequence);
94  virtual double reducedCost( ClpSimplex * model, int sequence) const;
96  void gubCrash();
98  void writeMps(const char * name);
100  void initialProblem();
102  int addColumn(int numberEntries, const int * row, const double * element,
103  double cost, double lower, double upper, int iSet,
104  DynamicStatus status);
109  virtual void packDown(const int * , int ) {}
111  inline double columnLower(int sequence) const {
112  if (columnLower_) return columnLower_[sequence];
113  else return 0.0;
114  }
116  inline double columnUpper(int sequence) const {
117  if (columnUpper_) return columnUpper_[sequence];
118  else return COIN_DBL_MAX;
119  }
120 
122 
123 
124 
136  int numberColumns, const int * starts,
137  const double * lower, const double * upper,
138  const CoinBigIndex * startColumn, const int * row,
139  const double * element, const double * cost,
140  const double * columnLower = NULL, const double * columnUpper = NULL,
141  const unsigned char * status = NULL,
142  const unsigned char * dynamicStatus = NULL);
143 
145  virtual ~ClpDynamicMatrix();
147 
153  ClpDynamicMatrix(const CoinPackedMatrix&);
154 
157  virtual ClpMatrixBase * clone() const ;
159 
161  inline ClpSimplex::Status getStatus(int sequence) const {
163  return static_cast<ClpSimplex::Status> (status_[sequence] & 7);
164  }
165  inline void setStatus(int sequence, ClpSimplex::Status status) {
166  unsigned char & st_byte = status_[sequence];
167  st_byte = static_cast<unsigned char>(st_byte & ~7);
168  st_byte = static_cast<unsigned char>(st_byte | status);
169  }
171  inline bool flaggedSlack(int i) const {
172  return (status_[i] & 8) != 0;
173  }
174  inline void setFlaggedSlack(int i) {
175  status_[i] = static_cast<unsigned char>(status_[i] | 8);
176  }
177  inline void unsetFlaggedSlack(int i) {
178  status_[i] = static_cast<unsigned char>(status_[i] & ~8);
179  }
181  inline int numberSets() const {
182  return numberSets_;
183  }
185  inline int numberGubEntries() const
186  { return startSet_[numberSets_];}
188  inline int * startSets() const
189  { return startSet_;}
191  inline bool flagged(int i) const {
192  return (dynamicStatus_[i] & 8) != 0;
193  }
194  inline void setFlagged(int i) {
195  dynamicStatus_[i] = static_cast<unsigned char>(dynamicStatus_[i] | 8);
196  }
197  inline void unsetFlagged(int i) {
198  dynamicStatus_[i] = static_cast<unsigned char>(dynamicStatus_[i] & ~8);
199  }
200  inline void setDynamicStatus(int sequence, DynamicStatus status) {
201  unsigned char & st_byte = dynamicStatus_[sequence];
202  st_byte = static_cast<unsigned char>(st_byte & ~7);
203  st_byte = static_cast<unsigned char>(st_byte | status);
204  }
205  inline DynamicStatus getDynamicStatus(int sequence) const {
206  return static_cast<DynamicStatus> (dynamicStatus_[sequence] & 7);
207  }
209  inline double objectiveOffset() const {
210  return objectiveOffset_;
211  }
213  inline CoinBigIndex * startColumn() const {
214  return startColumn_;
215  }
217  inline int * row() const {
218  return row_;
219  }
221  inline double * element() const {
222  return element_;
223  }
225  inline double * cost() const {
226  return cost_;
227  }
229  inline int * id() const {
230  return id_;
231  }
233  inline double * columnLower() const {
234  return columnLower_;
235  }
237  inline double * columnUpper() const {
238  return columnUpper_;
239  }
241  inline double * lowerSet() const {
242  return lowerSet_;
243  }
245  inline double * upperSet() const {
246  return upperSet_;
247  }
249  inline int numberGubColumns() const {
250  return numberGubColumns_;
251  }
253  inline int firstAvailable() const {
254  return firstAvailable_;
255  }
257  inline int firstDynamic() const {
258  return firstDynamic_;
259  }
261  inline int lastDynamic() const {
262  return lastDynamic_;
263  }
265  inline int numberStaticRows() const {
266  return numberStaticRows_;
267  }
269  inline int numberElements() const {
270  return numberElements_;
271  }
272  inline int * keyVariable() const {
273  return keyVariable_;
274  }
276  void switchOffCheck();
278  inline unsigned char * gubRowStatus() const {
279  return status_;
280  }
282  inline unsigned char * dynamicStatus() const {
283  return dynamicStatus_;
284  }
286  int whichSet (int sequence) const;
288 
289 
290 protected:
309  mutable int * keyVariable_;
311  int * toIndex_;
312  // Reverse pointer from index to set
313  int * fromIndex_;
321  double * lowerSet_;
323  double * upperSet_;
325  unsigned char * status_;
349  int noCheck_;
359  int * startSet_;
361  int * next_;
363  CoinBigIndex * startColumn_;
365  int * row_;
367  double * element_;
369  double * cost_;
371  int * id_;
373  unsigned char * dynamicStatus_;
375  double * columnLower_;
377  double * columnUpper_;
379 };
380 
381 #endif
void initialProblem()
Populates initial matrix from dynamic status.
void unsetFlaggedSlack(int i)
double sumPrimalInfeasibilities_
Sum of primal infeasibilities.
virtual double reducedCost(ClpSimplex *model, int sequence) const
Returns reduced cost of a variable.
virtual void createVariable(ClpSimplex *model, int &bestSequence)
Creates a variable.
int numberSets() const
Number of sets (dynamic rows)
DynamicStatus getDynamicStatus(int sequence) const
int numberActiveSets_
Number of active sets.
virtual void times(double scalar, const double *x, double *y) const
Return y + A * scalar *x in y.
double savedBestGubDual_
Saved best dual on gub row in pricing.
ClpSimplex * model_
Pointer back to model.
Status
enums for status of various sorts.
Definition: ClpSimplex.hpp:63
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 double * rhsOffset(ClpSimplex *model, bool forceRefresh=false, bool check=false)
Returns effective RHS offset if it is being used.
void switchOffCheck()
Switches off dj checking each factorization (for BIG models)
int firstDynamic() const
first dynamic
unsigned char * dynamicStatus_
for status and which bound
DynamicStatus
enums for status of various sorts
int firstAvailable() const
first free
int * keyVariable_
Key variable of set (only accurate if none in small problem)
int numberElements_
size of working matrix (max)
ClpDynamicMatrix & operator=(const ClpDynamicMatrix &)
double * upperSet_
Upper bounds on sets.
void gubCrash()
Does gub crash.
double infeasibilityWeight_
Infeasibility weight when last full pass done.
int maximumElements_
current maximum number of elemnts (then compress)
int numberGubEntries() const
Number of possible gub variables.
int * backToPivotRow_
Backward pointer to pivot row !!!
double sumDualInfeasibilities_
Sum of dual infeasibilities.
int maximumGubColumns_
current maximum number of columns (then compress)
int numberSets_
Number of sets (dynamic rows)
int * next_
next in chain
bool flagged(int i) const
Whether flagged.
double * lowerSet_
Lower bounds on sets.
double columnLower(int sequence) const
Gets lower bound (to simplify coding)
ClpSimplex::Status getStatus(int sequence) const
Status of row slacks.
int * startSet_
Start of each set.
virtual ClpMatrixBase * clone() const
Clone.
int lastDynamic() const
number of columns in dynamic model
double * columnUpper() const
Optional upper bounds on columns.
int * toIndex_
Backward pointer to extra row.
virtual int refresh(ClpSimplex *model)
Purely for column generation and similar ideas.
int whichSet(int sequence) const
Returns which set a variable is in.
double * element() const
elements
double objectiveOffset_
Saved value of objective offset.
double * lowerSet() const
Lower bounds on sets.
int savedBestSet_
Saved best set in pricing.
void setFlaggedSlack(int i)
int * keyVariable() const
ClpDynamicMatrix()
Default constructor.
int firstAvailableBefore_
first free when iteration started
CoinBigIndex * startColumn() const
Starts of each column.
double * element_
elements
This solves LPs using the simplex method.
Definition: ClpSimplex.hpp:55
double * columnLower() const
Optional lower bounds on columns.
void setDynamicStatus(int sequence, DynamicStatus status)
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 ...
void setStatus(int sequence, ClpSimplex::Status status)
unsigned char * gubRowStatus() const
Status region for gub slacks.
int numberPrimalInfeasibilities_
Number of primal infeasibilities.
virtual int updatePivot(ClpSimplex *model, double oldInValue, double oldOutValue)
update information for a pivot (and effective rhs)
void unsetFlagged(int i)
int firstAvailable_
first free
int numberGubColumns() const
size
int numberDualInfeasibilities_
Number of dual infeasibilities.
void writeMps(const char *name)
Writes out model (without names)
virtual ~ClpDynamicMatrix()
Destructor.
int * row() const
rows
double sumOfRelaxedPrimalInfeasibilities_
Sum of Primal infeasibilities using tolerance based on error in primals.
int addColumn(int 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.
int * startSets() const
Sets.
unsigned char * dynamicStatus() const
Status region for gub variables.
double * columnUpper_
Optional upper bounds on columns.
int numberStaticRows() const
number of rows in original model
int firstDynamic_
first dynamic
double * columnLower_
Optional lower bounds on columns.
This implements a dynamic matrix when we have a limit on the number of "interesting rows"...
int * id() const
ids of active columns (just index here)
int noCheck_
If pricing will declare victory (i.e.
double * cost() const
costs
int lastDynamic_
number of columns in dynamic model
int numberStaticRows_
number of rows in original model
double sumOfRelaxedDualInfeasibilities_
Sum of Dual infeasibilities using tolerance based on error in duals.
double columnUpper(int sequence) const
Gets upper bound (to simplify coding)
void modifyOffset(int sequence, double amount)
Modifies rhs offset.
double keyValue(int iSet) const
Gets key value when none in small.
int numberElements() const
size of working matrix (max)
double objectiveOffset() const
Saved value of objective offset.
double * upperSet() const
Upper bounds on sets.
int * id_
ids of active columns (just index here)
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=...
double * cost_
costs
CoinBigIndex * startColumn_
Starts of each column.
bool flaggedSlack(int i) const
Whether flagged slack.
virtual void times(double scalar, const double *x, double *y) const
Return y + A * scalar *x in y.
virtual void partialPricing(ClpSimplex *model, double start, double end, int &bestSequence, int &numberWanted)
Partial pricing.
unsigned char * status_
Status of slack on set.