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*/
24class 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 &notFinished);
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*/
75class 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