Clp 1.17.5
Loading...
Searching...
No Matches
ClpDynamicMatrix.hpp
Go to the documentation of this file.
1/* $Id: ClpDynamicMatrix.hpp 2385 2019-01-06 19:43:06Z unxusr $ */
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"
12class ClpSimplex;
20
21public:
24 soloKey = 0x00,
25 inSmall = 0x01,
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
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
326protected:
345 mutable int *keyVariable_;
348 // Reverse pointer from index to set
357 double *lowerSet_;
359 double *upperSet_;
361 unsigned char *status_;
375 CoinBigIndex numberElements_;
393 CoinBigIndex maximumElements_;
397 int *next_;
399 CoinBigIndex *startColumn_;
401 int *row_;
403 double *element_;
405 double *cost_;
407 int *id_;
409 unsigned char *dynamicStatus_;
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".
double * columnUpper() const
Optional upper bounds on columns.
int whichSet(int sequence) const
Returns which set a variable is in.
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.
unsigned char * gubRowStatus() const
Status region for gub slacks.
CoinBigIndex maximumElements_
current maximum number of elemnts (then compress)
virtual double * rhsOffset(ClpSimplex *model, bool forceRefresh=false, bool check=false)
Returns effective RHS offset if it is being used.
double objectiveOffset() const
Saved value of objective offset.
ClpDynamicMatrix & operator=(const ClpDynamicMatrix &)
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 columnUpper(int sequence) const
Gets upper bound (to simplify coding)
int * row() const
rows
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.
void setFlaggedSlack(int i)
int * startSets() const
Sets.
int numberDualInfeasibilities_
Number of dual infeasibilities.
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 * columnLower() const
Optional lower bounds on columns.
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.
double * upperSet() const
Upper bounds on sets.
virtual int updatePivot(ClpSimplex *model, double oldInValue, double oldOutValue)
update information for a pivot (and effective rhs)
double * columnUpper_
Optional upper bounds on columns.
double savedBestGubDual_
Saved best dual on gub row in pricing.
int maximumGubColumns_
current maximum number of columns (then compress)
int firstAvailable_
first free
bool flagged(int i) const
Whether flagged.
int firstDynamic_
first dynamic
int * id() const
ids of active columns (just index here)
int firstAvailable() const
first free
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)
double * cost() const
costs
int numberStaticRows() const
number of rows in original model
ClpDynamicMatrix(const ClpDynamicMatrix &)
The copy constructor.
DynamicStatus getDynamicStatus(int sequence) const
double sumOfRelaxedPrimalInfeasibilities_
Sum of Primal infeasibilities using tolerance based on error in primals.
double * lowerSet() const
Lower bounds on sets.
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)
unsigned char * dynamicStatus() const
Status region for gub variables.
double * element() const
elements
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.
virtual ClpMatrixBase * clone() const
Clone.
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 * keyVariable() const
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)
CoinBigIndex * startColumn() const
Starts of each column.
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.
Status
enums for status of various sorts.