1/* $Id: CoinPresolveForcing.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 CoinPresolveForcing_H
7#define CoinPresolveForcing_H
8
9#include "CoinPresolveMatrix.hpp"
10
11/*!
12 \file
13*/
14
15#define IMPLIED_BOUND 7
16
17/*! \class forcing_constraint_action
18 \brief Detect and process forcing constraints and useless constraints
19
20 A constraint is useless if the bounds on the variables prevent the constraint
21 from ever being violated.
22
23 A constraint is a forcing constraint if the bounds on the constraint force
24 the value of an involved variable to one of its bounds. A constraint can
25 force more than one variable.
26*/
27class forcing_constraint_action : public CoinPresolveAction {
28 forcing_constraint_action();
29 forcing_constraint_action(const forcing_constraint_action& rhs);
30 forcing_constraint_action& operator=(const forcing_constraint_action& rhs);
31public:
32 struct action {
33 const int *rowcols;
34 const double *bounds;
35 int row;
36 int nlo;
37 int nup;
38 };
39private:
40 const int nactions_;
41 // actions_ is owned by the class and must be deleted at destruction
42 const action *const actions_;
43
44public:
45 forcing_constraint_action(int nactions,
46 const action *actions,
47 const CoinPresolveAction *next) :
48 CoinPresolveAction(next),
49 nactions_(nactions), actions_(actions) {}
50
51 const char *name() const override;
52
53 static const CoinPresolveAction *presolve(CoinPresolveMatrix * prob,
54 const CoinPresolveAction *next);
55
56 void postsolve(CoinPostsolveMatrix *prob) const override;
57
58 ~forcing_constraint_action();
59};
60
61#endif
62