Clp  1.17.3
ClpPESimplex.hpp
Go to the documentation of this file.
1 // Copyright (C) 2002, International Business Machines
2 // Corporation and others. All Rights Reserved.
3 /*
4  Authors
5 
6  Jeremy Omer
7 
8  Last update: june 10, 2014
9 
10  */
11 
12 #ifndef ClpPESimplex_H
13 #define ClpPESimplex_H
14 
15 #include "ClpSimplex.hpp"
16 #include "CoinIndexedVector.hpp"
17 #include "ClpPackedMatrix.hpp"
18 #include "CoinTime.hpp"
19 
20 #include <iostream>
21 #include <fstream>
22 
23 // #define PE_DEBUG 0
24 
28 double PEdot(CoinIndexedVector &v1, const double *v2);
29 
33 
35 void PEtransposeTimesSubsetAll(ClpSimplex *model, int number, const int *which,
36  const double *COIN_RESTRICT x, double *COIN_RESTRICT y,
37  const double *COIN_RESTRICT rowScale,
38  const double *COIN_RESTRICT columnScale);
39 
42 class ClpPESimplex {
43 
44 public:
46  ClpPESimplex(ClpSimplex *model);
47 
49  ~ClpPESimplex();
50 
52 public:
53  inline int coPrimalDegenerates() { return coPrimalDegenerates_; }
54  inline int coDualDegenerates() { return coDualDegenerates_; }
55  inline int coCompatibleCols() { return coCompatibleCols_; }
56  inline int coCompatibleRows() { return coCompatibleRows_; }
57 
58  inline bool isCompatibleCol(int sequence) { return isCompatibleCol_[sequence]; }
59  inline bool isCompatibleRow(int row)
60  {
61  assert(row >= 0 && row < numberRows_);
62  return isCompatibleRow_[row];
63  }
64 
65  inline ClpSimplex *clpModel() { return model_; }
66  // check seems to be same model - returns false if size changed
67  bool checkSize();
69 public:
72 
74  void updateDualDegenerates();
75 
78  void identifyCompatibleCols(int number, const int *which,
79  CoinIndexedVector *spareRow2,
80  CoinIndexedVector *wPrimal);
81 
84  CoinIndexedVector *wDual);
85 
87  void updateCompatibleRows(int sequence);
88 
90 public:
91 #if PE_DEBUG >= 1
92 
93  void printPrimalDegenerates();
94 
96  void printCompatibleCols();
97 
99  bool checkCompatibilityCol(int sequence, CoinIndexedVector *spareRow2);
100 #endif
101 
103  bool checkCompatibilityRow(int pivotRow);
104 
106  inline double lastObjectiveValue() { return lastObjectiveValue_; }
107  inline void updateLastObjectiveValue() { lastObjectiveValue_ = model_->objectiveValue(); }
108  inline bool isDegeneratePivot() { return fabs(model_->objectiveValue() - lastObjectiveValue_) < model_->dualTolerance(); }
109  inline bool isLastPivotCompatible() { return isLastPivotCompatible_; }
110  inline void isLastPivotCompatible(bool yesOrNo) { isLastPivotCompatible_ = yesOrNo; }
111 
113  inline void startTimer() { timeTmp_ = CoinCpuTime(); }
114  inline void stopTimer() { timeCompatibility_ += CoinCpuTime() - timeTmp_; }
115  void printTimer(std::ostream &out);
116  inline double timeMultRandom() { return timeMultRandom_; }
117  inline double timeLinearSystem() { return timeLinearSystem_; }
118  inline double timeCompatibility() { return timeCompatibility_; }
119 
121  inline void addDegeneratePivot() { coDegeneratePivots_++; }
122  inline int coDegeneratePivots() { return coDegeneratePivots_; }
123  inline void addDegeneratePivotConsecutive() { coDegeneratePivotsConsecutive_++; }
124  inline void resetDegeneratePivotsConsecutive() { coDegeneratePivotsConsecutive_ = 0; }
125  inline int coDegeneratePivotsConsecutive() { return coDegeneratePivotsConsecutive_; }
126  void updateDualDegeneratesAvg(int coPivots);
127  inline double coDualDegeneratesAvg() { return coDualDegeneratesAvg_; }
128  void updatePrimalDegeneratesAvg(int coPivots);
129  inline double coPrimalDegeneratesAvg() { return coPrimalDegeneratesAvg_; }
130  inline double coCompatibleRowsAvg() { return coCompatibleRowsAvg_; }
131  void updateCompatibleRowsAvg(int coPivots);
132  inline double coCompatibleColsAvg() { return coCompatibleColsAvg_; }
133  void updateCompatibleColsAvg(int coPivots);
134  inline int coCompatiblePivots() { return coCompatiblePivots_; }
135  inline void addCompatiblePivot() { coCompatiblePivots_++; }
136  inline int coDegenerateCompatiblePivots() { return coDegenerateCompatiblePivots_; }
137  inline void addDegenerateCompatiblePivot() { coDegenerateCompatiblePivots_++; }
138 
139  /* Get and update the number of compatible pivots that were done because of the priority factor */
140  inline void addPriorityPivot() { coPriorityPivots_++; }
141  inline int coPriorityPivots() { return coPriorityPivots_; }
142  inline int doStatistics() const
143  {
144  return doStatistics_;
145  }
146  inline void setDoStatistics(int value)
147  {
148  doStatistics_ = value;
149  }
150 
151 protected:
157 
163 
169 
175 
176 private:
178  ClpSimplex *model_;
179 
181  double epsDegeneracy_;
182  double epsCompatibility_;
183 
185  int numberRows_;
186  int numberColumns_;
187 
191  // now passed in CoinIndexedVector *wPrimal_;
192  // now passed in CoinIndexedVector *wDual_;
193 
196  // not usedCoinIndexedVector *tempColumn_;
197  double *tempRandom_;
198 
200  int coPrimalDegeneratesAvg_;
201  int coDualDegeneratesAvg_;
202  int coCompatibleColsAvg_;
203  int coCompatibleRowsAvg_;
204  int coUpdateDegenerates_;
205  int coIdentifyCompatibles_;
206  int coDegeneratePivots_;
207  int coCompatiblePivots_;
208  int coDegenerateCompatiblePivots_;
209  int coDegeneratePivotsConsecutive_;
210 
212  int coPriorityPivots_;
214  int doStatistics_;
215 
217  double lastObjectiveValue_;
218  bool isLastPivotCompatible_;
219 
222  double timeCompatibility_;
223  double timeMultRandom_;
224  double timeLinearSystem_;
225  double timeTmp_;
226 };
227 
228 #endif
229 
230 /* vi: softtabstop=2 shiftwidth=2 expandtab tabstop=2
231 */
int coPrimalDegenerates()
BASIC GET METHODS.
double coDualDegeneratesAvg()
bool * isCompatibleCol_
bool isCompatibleCol(int sequence)
double timeCompatibility()
double timeMultRandom()
double dualTolerance() const
Dual tolerance to use.
Definition: ClpModel.hpp:339
double * compatibilityRow_
double coCompatibleRowsAvg()
double coCompatibleColsAvg()
int * dualDegenerates_
void addPriorityPivot()
bool isLastPivotCompatible()
int * primalDegenerates_
int coCompatiblePivots()
void updateDualDegeneratesAvg(int coPivots)
void identifyCompatibleRows(CoinIndexedVector *spare, CoinIndexedVector *wDual)
Identify the dual compatible rows.
void isLastPivotCompatible(bool yesOrNo)
#define COIN_RESTRICT
bool isCompatibleRow(int row)
~ClpPESimplex()
Destructor.
int coDegenerateCompatiblePivots()
bool checkCompatibilityRow(int pivotRow)
DEBUG AND DISPLAY METHODS.
void updateDualDegenerates()
Updates the set of dual degenerate variables.
double PEdot(CoinIndexedVector &v1, const double *v2)
SHARED METHODS FOR USEFUL ALGEBRAIC OPERATIONS.
void updateCompatibleRowsAvg(int coPivots)
double timeLinearSystem()
void addDegeneratePivot()
Update and return the number of degenerate pivots and variables.
ClpPESimplex(ClpSimplex *model)
Constructor.
bool isDegeneratePivot()
This solves LPs using the simplex method.
Definition: ClpSimplex.hpp:106
int coDualDegenerates_
Indices of the non basic variables with a zero reduced cost during the last update (ndual-degenerate ...
void updateCompatibleColsAvg(int coPivots)
int coDualDegenerates()
bool checkSize()
double objectiveValue() const
Objective value.
Definition: ClpModel.hpp:837
double lastObjectiveValue()
Tracking the degenerate iterations after compatible pivots.
void addDegeneratePivotConsecutive()
void printTimer(std::ostream &out)
double coPrimalDegeneratesAvg()
int coCompatibleCols()
void startTimer()
Start and stop the timer, and print the total recorded time.
void identifyCompatibleCols(int number, const int *which, CoinIndexedVector *spareRow2, CoinIndexedVector *wPrimal)
Identify the primal compatible columns The input argument is a temporary array that is needed for the...
double * compatibilityCol_
int doStatistics() const
bool * isPrimalDegenerate_
int coCompatibleRows()
int coDegeneratePivots()
void addCompatiblePivot()
void updateCompatibleRows(int sequence)
Update the dual compatible rows.
int coPrimalDegenerates_
Indices of the variables that were not at one of their bounds during the last update (non primal dege...
void updateLastObjectiveValue()
void updatePrimalDegenerates()
PUBLIC METHODS RELATED TO COMPATIBILITY.
int coPriorityPivots()
void addDegenerateCompatiblePivot()
bool * isDualDegenerate_
int coCompatibleRows_
Table of booleans indicating whether each constraint is dual compatible (true) or not (false)
void PEtransposeTimesSubsetAll(ClpSimplex *model, int number, const int *which, const double *COIN_RESTRICT x, double *COIN_RESTRICT y, const double *COIN_RESTRICT rowScale, const double *COIN_RESTRICT columnScale)
compute the product x^T*[A I] for the indices "which" of [A I]
void updatePrimalDegeneratesAvg(int coPivots)
int coCompatibleCols_
Table of booleans indicating whether each variable is primal compatible (true) or not (false)
int coDegeneratePivotsConsecutive()
void setDoStatistics(int value)
ClpSimplex * clpModel()
BASE CLASS FOR THE IMPROVED SIMPLEX.
void resetDegeneratePivotsConsecutive()
bool * isCompatibleRow_