1 | /* $Id: ClpDualRowSteepest.hpp 1665 2011-01-04 17:55:54Z lou $ */ |
2 | // Copyright (C) 2002, 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 ClpDualRowSteepest_H |
7 | #define ClpDualRowSteepest_H |
8 | |
9 | #include "ClpDualRowPivot.hpp" |
10 | class CoinIndexedVector; |
11 | |
12 | |
13 | //############################################################################# |
14 | |
15 | /** Dual Row Pivot Steepest Edge Algorithm Class |
16 | |
17 | See Forrest-Goldfarb paper for algorithm |
18 | |
19 | */ |
20 | |
21 | class ClpDualRowSteepest : public ClpDualRowPivot { |
22 | |
23 | public: |
24 | |
25 | ///@name Algorithmic methods |
26 | //@{ |
27 | |
28 | /// Returns pivot row, -1 if none |
29 | virtual int pivotRow() override; |
30 | |
31 | /** Updates weights and returns pivot alpha. |
32 | Also does FT update */ |
33 | virtual double updateWeights(CoinIndexedVector * input, |
34 | CoinIndexedVector * spare, |
35 | CoinIndexedVector * spare2, |
36 | CoinIndexedVector * updatedColumn) override; |
37 | |
38 | /** Updates primal solution (and maybe list of candidates) |
39 | Uses input vector which it deletes |
40 | Computes change in objective function |
41 | */ |
42 | virtual void updatePrimalSolution(CoinIndexedVector * input, |
43 | double theta, |
44 | double & changeInObjective) override; |
45 | |
46 | /** Saves any weights round factorization as pivot rows may change |
47 | Save model |
48 | May also recompute infeasibility stuff |
49 | 1) before factorization |
50 | 2) after good factorization (if weights empty may initialize) |
51 | 3) after something happened but no factorization |
52 | (e.g. check for infeasible) |
53 | 4) as 2 but restore weights from previous snapshot |
54 | 5) for strong branching - initialize (uninitialized) , infeasibilities |
55 | */ |
56 | virtual void saveWeights(ClpSimplex * model, int mode) override; |
57 | /// Gets rid of last update |
58 | virtual void unrollWeights() override; |
59 | /// Gets rid of all arrays |
60 | virtual void clearArrays() override; |
61 | /// Returns true if would not find any row |
62 | virtual bool looksOptimal() const override; |
63 | /// Called when maximum pivots changes |
64 | virtual void maximumPivotsChanged() override; |
65 | //@} |
66 | |
67 | /** enums for persistence |
68 | */ |
69 | enum Persistence { |
70 | normal = 0x00, // create (if necessary) and destroy |
71 | keep = 0x01 // create (if necessary) and leave |
72 | }; |
73 | |
74 | ///@name Constructors and destructors |
75 | //@{ |
76 | /** Default Constructor |
77 | 0 is uninitialized, 1 full, 2 is partial uninitialized, |
78 | 3 starts as 2 but may switch to 1. |
79 | By partial is meant that the weights are updated as normal |
80 | but only part of the infeasible basic variables are scanned. |
81 | This can be faster on very easy problems. |
82 | */ |
83 | ClpDualRowSteepest(int mode = 3); |
84 | |
85 | /// Copy constructor |
86 | ClpDualRowSteepest(const ClpDualRowSteepest &); |
87 | |
88 | /// Assignment operator |
89 | ClpDualRowSteepest & operator=(const ClpDualRowSteepest& rhs); |
90 | |
91 | /// Fill most values |
92 | void fill(const ClpDualRowSteepest& rhs); |
93 | |
94 | /// Destructor |
95 | virtual ~ClpDualRowSteepest (); |
96 | |
97 | /// Clone |
98 | virtual ClpDualRowPivot * clone(bool copyData = true) const override; |
99 | |
100 | //@} |
101 | /**@name gets and sets */ |
102 | //@{ |
103 | /// Mode |
104 | inline int mode() const { |
105 | return mode_; |
106 | } |
107 | /// Set/ get persistence |
108 | inline void setPersistence(Persistence life) { |
109 | persistence_ = life; |
110 | } |
111 | inline Persistence persistence() const { |
112 | return persistence_ ; |
113 | } |
114 | //@} |
115 | |
116 | //--------------------------------------------------------------------------- |
117 | |
118 | private: |
119 | ///@name Private member data |
120 | /** Status |
121 | 0) Normal |
122 | -1) Needs initialization |
123 | 1) Weights are stored by sequence number |
124 | */ |
125 | int state_; |
126 | /** If 0 then we are using uninitialized weights, 1 then full, |
127 | if 2 then uninitialized partial, 3 switchable */ |
128 | int mode_; |
129 | /// Life of weights |
130 | Persistence persistence_; |
131 | /// weight array |
132 | double * weights_; |
133 | /// square of infeasibility array (just for infeasible rows) |
134 | CoinIndexedVector * infeasible_; |
135 | /// alternate weight array (so we can unroll) |
136 | CoinIndexedVector * alternateWeights_; |
137 | /// save weight array (so we can use checkpoint) |
138 | CoinIndexedVector * savedWeights_; |
139 | /// Dubious weights |
140 | int * dubiousWeights_; |
141 | //@} |
142 | }; |
143 | |
144 | #endif |
145 | |