1 | /* $Id: CoinPresolveSingleton.hpp 1372 2011-01-03 23:31:00Z 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 CoinPresolveSingleton_H |
7 | #define CoinPresolveSingleton_H |
8 | #define SLACK_DOUBLETON 2 |
9 | #define SLACK_SINGLETON 8 |
10 | |
11 | /*! |
12 | \file |
13 | */ |
14 | |
15 | //const int MAX_SLACK_DOUBLETONS = 1000; |
16 | |
17 | /*! \class slack_doubleton_action |
18 | \brief Convert an explicit bound constraint to a column bound |
19 | |
20 | This transform looks for explicit bound constraints for a variable and |
21 | transfers the bound to the appropriate column bound array. |
22 | The constraint is removed from the constraint system. |
23 | */ |
24 | class slack_doubleton_action : public CoinPresolveAction { |
25 | struct action { |
26 | double clo; |
27 | double cup; |
28 | |
29 | double rlo; |
30 | double rup; |
31 | |
32 | double coeff; |
33 | |
34 | int col; |
35 | int row; |
36 | }; |
37 | |
38 | const int nactions_; |
39 | const action *const actions_; |
40 | |
41 | slack_doubleton_action(int nactions, |
42 | const action *actions, |
43 | const CoinPresolveAction *next) : |
44 | CoinPresolveAction(next), |
45 | nactions_(nactions), |
46 | actions_(actions) |
47 | {} |
48 | |
49 | public: |
50 | const char *name() const { return ("slack_doubleton_action" ); } |
51 | |
52 | /*! \brief Convert explicit bound constraints to column bounds. |
53 | |
54 | Not now There is a hard limit (#MAX_SLACK_DOUBLETONS) on the number of |
55 | constraints processed in a given call. \p notFinished is set to true |
56 | if candidates remain. |
57 | */ |
58 | static const CoinPresolveAction *presolve(CoinPresolveMatrix *prob, |
59 | const CoinPresolveAction *next, |
60 | bool ¬Finished); |
61 | |
62 | void postsolve(CoinPostsolveMatrix *prob) const; |
63 | |
64 | |
65 | ~slack_doubleton_action() { deleteAction(actions_,action*); } |
66 | }; |
67 | /*! \class slack_singleton_action |
68 | \brief For variables with one entry |
69 | |
70 | If we have a variable with one entry and no cost then we can |
71 | transform the row from E to G etc. |
72 | If there is a row objective region then we may be able to do |
73 | this even with a cost. |
74 | */ |
75 | class slack_singleton_action : public CoinPresolveAction { |
76 | struct action { |
77 | double clo; |
78 | double cup; |
79 | |
80 | double rlo; |
81 | double rup; |
82 | |
83 | double coeff; |
84 | |
85 | int col; |
86 | int row; |
87 | }; |
88 | |
89 | const int nactions_; |
90 | const action *const actions_; |
91 | |
92 | slack_singleton_action(int nactions, |
93 | const action *actions, |
94 | const CoinPresolveAction *next) : |
95 | CoinPresolveAction(next), |
96 | nactions_(nactions), |
97 | actions_(actions) |
98 | {} |
99 | |
100 | public: |
101 | const char *name() const { return ("slack_singleton_action" ); } |
102 | |
103 | static const CoinPresolveAction *presolve(CoinPresolveMatrix *prob, |
104 | const CoinPresolveAction *next, |
105 | double * rowObjective); |
106 | |
107 | void postsolve(CoinPostsolveMatrix *prob) const; |
108 | |
109 | |
110 | ~slack_singleton_action() { deleteAction(actions_,action*); } |
111 | }; |
112 | #endif |
113 | |