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
22struct 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*/
32class 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
57const CoinPresolveAction *drop_zero_coefficients(CoinPresolveMatrix *prob,
58 const CoinPresolveAction *next);
59
60#endif
61