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 
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_;
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
double * lowerSet() const
Lower bounds on sets.
int CoinBigIndex
void setFlaggedSlack(int i)
Status of row slacks.
int noCheck_
If pricing will declare victory (i.e.
double * columnUpper() const
Optional upper bounds on columns.
unsigned char * gubRowStatus() const
Status region for gub slacks.
int * backToPivotRow_
Backward pointer to pivot row !!!
ClpDynamicMatrix()
Default constructor.
void unsetFlaggedSlack(int i)
Status of row slacks.
double * element() const
elements
int * id_
ids of active columns (just index here)
int numberElements_
size of working matrix (max)
unsigned char * dynamicStatus() const
Status region for gub variables.
DynamicStatus
enums for status of various sorts
virtual int refresh(ClpSimplex *model)
Purely for column generation and similar ideas.
int whichSet(int sequence) const
Returns which set a variable is in.
int numberElements() const
size of working matrix (max)
virtual ClpMatrixBase * clone() const
Clone.
double columnUpper(int sequence) const
Gets upper bound (to simplify coding)
virtual void createVariable(ClpSimplex *model, int &bestSequence)
Creates a variable.
double * columnLower_
Optional lower bounds on columns.
double sumDualInfeasibilities_
Sum of dual infeasibilities.
int * keyVariable() const
Status of row slacks.
double * columnLower() const
Optional lower bounds on columns.
int * toIndex_
Backward pointer to extra row.
int * startSet_
Start of each set.
int numberSets() const
Number of sets (dynamic rows)
double * upperSet() const
Upper bounds on sets.
void initialProblem()
Populates initial matrix from dynamic status.
void setStatus(int sequence, ClpSimplex::Status status)
Status of row slacks.
double * element_
elements
int numberGubEntries() const
Number of possible gub variables.
virtual double reducedCost(ClpSimplex *model, int sequence) const
Returns reduced cost of a variable.
double * cost() const
costs
int numberStaticRows() const
number of rows in original model
Sparse Matrix Base Class.
CoinBigIndex * startColumn_
Starts of each column.
int firstAvailable() const
first free
int lastDynamic_
number of columns in dynamic model
double savedBestGubDual_
Saved best dual on gub row in pricing.
double keyValue(int iSet) const
Gets key value when none in small.
ClpSimplex * model_
Pointer back to model.
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 objectiveOffset() const
Saved value of objective offset.
void writeMps(const char *name)
Writes out model (without names)
CoinBigIndex * startColumn() const
Starts of each column.
int savedBestSet_
Saved best set in pricing.
int * keyVariable_
Key variable of set (only accurate if none in small problem)
int maximumGubColumns_
current maximum number of columns (then compress)
int numberDualInfeasibilities_
Number of dual infeasibilities.
DynamicStatus getDynamicStatus(int sequence) const
Status of row slacks.
double * cost_
costs
virtual double * rhsOffset(ClpSimplex *model, bool forceRefresh=false, bool check=false)
Returns effective RHS offset if it is being used.
Status
enums for status of various sorts.
Definition: ClpSimplex.hpp:78
double sumOfRelaxedDualInfeasibilities_
Sum of Dual infeasibilities using tolerance based on error in duals.
double sumOfRelaxedPrimalInfeasibilities_
Sum of Primal infeasibilities using tolerance based on error in primals.
virtual void packDown(const int *, int)
If addColumn forces compression then this allows descendant to know what to do.
int * id() const
ids of active columns (just index here)
int firstAvailable_
first free
int * row() const
rows
ClpSimplex::Status getStatus(int sequence) const
Status of row slacks.
virtual ~ClpDynamicMatrix()
Destructor.
void setDynamicStatus(int sequence, DynamicStatus status)
Status of row slacks.
virtual void times(double scalar, const double *x, double *y) const
Return y + A * scalar *x in y.
unsigned char * status_
Status of slack on set.
Indexed Vector.
double * upperSet_
Upper bounds on sets.
int numberActiveSets_
Number of active sets.
This implements a dynamic matrix when we have a limit on the number of &quot;interesting rows&quot;...
int numberStaticRows_
number of rows in original model
This solves LPs using the simplex method.
Definition: ClpSimplex.hpp:70
double * columnUpper_
Optional upper bounds on columns.
const double COIN_DBL_MAX
Definition: CoinFinite.hpp:18
Abstract base class for Clp Matrices.
virtual void times(double scalar, const double *x, double *y) const
Return y + A * scalar *x in y.
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 ...
bool flagged(int i) const
Whether flagged.
double infeasibilityWeight_
Infeasibility weight when last full pass done.
int firstDynamic_
first dynamic
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.
virtual int updatePivot(ClpSimplex *model, double oldInValue, double oldOutValue)
update information for a pivot (and effective rhs)
virtual void partialPricing(ClpSimplex *model, double start, double end, int &bestSequence, int &numberWanted)
Partial pricing.
double sumPrimalInfeasibilities_
Sum of primal infeasibilities.
double objectiveOffset_
Saved value of objective offset.
double columnLower(int sequence) const
Gets lower bound (to simplify coding)
bool flaggedSlack(int i) const
Whether flagged slack.
int * fromIndex_
Sum of dual infeasibilities.
void unsetFlagged(int i)
Status of row slacks.
int numberSets_
Number of sets (dynamic rows)
int maximumElements_
current maximum number of elemnts (then compress)
int * startSets() const
Sets.
int numberPrimalInfeasibilities_
Number of primal infeasibilities.
int firstAvailableBefore_
first free when iteration started
int numberGubColumns() const
size
void setFlagged(int i)
Status of row slacks.
int firstDynamic() const
first dynamic
ClpDynamicMatrix & operator=(const ClpDynamicMatrix &)
The copy constructor.
void switchOffCheck()
Switches off dj checking each factorization (for BIG models)
int * next_
next in chain
void gubCrash()
Does gub crash.
int lastDynamic() const
number of columns in dynamic model
unsigned char * dynamicStatus_
for status and which bound
double * lowerSet_
Lower bounds on sets.
void modifyOffset(int sequence, double amount)
Modifies rhs offset.