source: trunk/Clp/src/ClpPESimplex.hpp @ 2470

Last change on this file since 2470 was 2385, checked in by unxusr, 9 months ago

formatting

File size: 7.9 KB
Line 
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
25/** SHARED METHODS FOR USEFUL ALGEBRAIC OPERATIONS */
26
27/** inner product between a coin vector and a pointer */
28double PEdot(CoinIndexedVector &v1, const double *v2);
29
30/** inner product between two coin vectors
31    call the function with the sparser vector first for efficiency */
32double PEdot(CoinIndexedVector &v1, CoinIndexedVector &v2);
33
34/** compute the product x^T*[A I] for the indices "which" of [A I] */
35void 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
40/** BASE CLASS FOR THE IMPROVED SIMPLEX
41*/
42class ClpPESimplex {
43
44public:
45  /** Constructor */
46  ClpPESimplex(ClpSimplex *model);
47
48  /** Destructor */
49  ~ClpPESimplex();
50
51  /** BASIC GET METHODS */
52public:
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();
68  /** PUBLIC METHODS RELATED TO COMPATIBILITY */
69public:
70  /** Updates the set of variables that are not at their bounds */
71  void updatePrimalDegenerates();
72
73  /** Updates the set of dual degenerate variables */
74  void updateDualDegenerates();
75
76  /** Identify the primal compatible columns
77        The input argument is a temporary array that is needed for the Clp's BTRAN */
78  void identifyCompatibleCols(int number, const int *which,
79    CoinIndexedVector *spareRow2,
80    CoinIndexedVector *wPrimal);
81
82  /** Identify the dual compatible rows */
83  void identifyCompatibleRows(CoinIndexedVector *spare,
84    CoinIndexedVector *wDual);
85
86  /** Update the dual compatible rows */
87  void updateCompatibleRows(int sequence);
88
89  /** DEBUG AND DISPLAY METHODS */
90public:
91#if PE_DEBUG >= 1
92  /** Print the set of variables within their bounds */
93  void printPrimalDegenerates();
94
95  /** Print the set of primal compatible variables */
96  void printCompatibleCols();
97
98  /** Check that a nonbasic variable is indeed compatible */
99  bool checkCompatibilityCol(int sequence, CoinIndexedVector *spareRow2);
100#endif
101
102  /** Check that a basic row is indeed compatible */
103  bool checkCompatibilityRow(int pivotRow);
104
105  /** Tracking the degenerate iterations after compatible pivots */
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
112  /** Start and stop the timer, and print the total recorded time */
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
120  /** Update and return the number of degenerate pivots and variables */
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
151protected:
152  /** Indices of the variables that were not at one of their bounds
153        during the last update (non primal degenerate variables) */
154  int coPrimalDegenerates_;
155  int *primalDegenerates_;
156  bool *isPrimalDegenerate_;
157
158  /** Indices of the non basic variables with a zero reduced cost
159        during the last update (ndual-degenerate variables) */
160  int coDualDegenerates_;
161  int *dualDegenerates_;
162  bool *isDualDegenerate_;
163
164  /** Table of booleans indicating whether each variable is primal
165        compatible (true) or not (false) */
166  int coCompatibleCols_;
167  double *compatibilityCol_;
168  bool *isCompatibleCol_;
169
170  /** Table of booleans indicating whether each constraint is dual
171        compatible (true) or not (false) */
172  int coCompatibleRows_;
173  double *compatibilityRow_;
174  bool *isCompatibleRow_;
175
176private:
177  /** pointer to the original model that shall be solved */
178  ClpSimplex *model_;
179
180  /** tolerance used for the tests of degeneracy and compatibility (resp.) */
181  double epsDegeneracy_;
182  double epsCompatibility_;
183
184  /** size of the original model */
185  int numberRows_;
186  int numberColumns_;
187
188  /** w vectors that are used to identify the compatible columns and
189    rows. The name w, refers to the notations of the articles on
190    positive edge */
191  // now passed in CoinIndexedVector *wPrimal_;
192  // now passed in CoinIndexedVector *wDual_;
193
194  /** temporary vectors that are used to store colulns of the constraint
195        matrix or random numbers */
196  // not usedCoinIndexedVector *tempColumn_;
197  double *tempRandom_;
198
199  /** number of degenerate pivots and variables */
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
211  /** number of compatible pivots that were done because of the priority factor */
212  int coPriorityPivots_;
213  /// Do statistics
214  int doStatistics_;
215
216  /** tracking the degenerate iterations after compatible pivots */
217  double lastObjectiveValue_;
218  bool isLastPivotCompatible_;
219
220  /** Timer attribute recording the additional time spent in
221        identifying compatible variables */
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*/
Note: See TracBrowser for help on using the repository browser.