1 | /* $Id: CoinPresolveZeros.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 CoinPresolveZeros_H |
7 | #define CoinPresolveZeros_H |
8 | |
9 | /*! \file |
10 | |
11 | Drop/reintroduce explicit zeros. |
12 | */ |
13 | |
14 | #define DROP_ZERO 8 |
15 | |
16 | /*! \brief Tracking information for an explicit zero coefficient |
17 | |
18 | \todo Why isn't this a nested class in drop_zero_coefficients_action? |
19 | That would match the structure of other presolve classes. |
20 | */ |
21 | |
22 | struct dropped_zero { |
23 | int row; |
24 | int col; |
25 | }; |
26 | |
27 | /*! \brief Removal of explicit zeros |
28 | |
29 | The presolve action for this class removes explicit zeros from the constraint |
30 | matrix. The postsolve action puts them back. |
31 | */ |
32 | class drop_zero_coefficients_action : public CoinPresolveAction { |
33 | |
34 | const int nzeros_; |
35 | const dropped_zero *const zeros_; |
36 | |
37 | drop_zero_coefficients_action(int nzeros, |
38 | const dropped_zero *zeros, |
39 | const CoinPresolveAction *next) : |
40 | CoinPresolveAction(next), |
41 | nzeros_(nzeros), zeros_(zeros) |
42 | {} |
43 | |
44 | public: |
45 | const char *name() const { return ("drop_zero_coefficients_action" ); } |
46 | |
47 | static const CoinPresolveAction *presolve(CoinPresolveMatrix *prob, |
48 | int *checkcols, |
49 | int ncheckcols, |
50 | const CoinPresolveAction *next); |
51 | |
52 | void postsolve(CoinPostsolveMatrix *prob) const; |
53 | |
54 | ~drop_zero_coefficients_action() { deleteAction(zeros_,dropped_zero*); } |
55 | }; |
56 | |
57 | const CoinPresolveAction *drop_zero_coefficients(CoinPresolveMatrix *prob, |
58 | const CoinPresolveAction *next); |
59 | |
60 | #endif |
61 | |