1 /* $Id: CoinPresolveEmpty.hpp 2083 2019-01-06 19:38:09Z unxusr $ */
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 CoinPresolveEmpty_H
7 #define CoinPresolveEmpty_H
8 
9 /*! \file
10 
11   Drop/reinsert empty rows/columns.
12 */
13 
14 const int DROP_ROW = 3;
15 const int DROP_COL = 4;
16 
17 /*! \class drop_empty_cols_action
18     \brief Physically removes empty columns in presolve, and reinserts
19 	   empty columns in postsolve.
20 
21   Physical removal of rows and columns should be the last activities
22   performed during presolve. Do them exactly once. The row-major matrix
23   is <b>not</b> maintained by this transform.
24 
25   To physically drop the columns, CoinPrePostsolveMatrix::mcstrt_ and
26   CoinPrePostsolveMatrix::hincol_ are compressed, along with column bounds,
27   objective, and (if present) the column portions of the solution. This
28   renumbers the columns. drop_empty_cols_action::presolve will reconstruct
29   CoinPresolveMatrix::clink_.
30 
31   \todo Confirm correct behaviour with solution in presolve.
32 */
33 
34 class drop_empty_cols_action : public CoinPresolveAction {
35 private:
36   const int nactions_;
37 
38   struct action {
39     double clo;
40     double cup;
41     double cost;
42     double sol;
43     int jcol;
44   };
45   const action *const actions_;
46 
drop_empty_cols_action(int nactions,const action * const actions,const CoinPresolveAction * next)47   drop_empty_cols_action(int nactions,
48     const action *const actions,
49     const CoinPresolveAction *next)
50     : CoinPresolveAction(next)
51     , nactions_(nactions)
52     , actions_(actions)
53   {
54   }
55 
56 public:
name() const57   const char *name() const { return ("drop_empty_cols_action"); }
58 
59   static const CoinPresolveAction *presolve(CoinPresolveMatrix *,
60     const int *ecols,
61     int necols,
62     const CoinPresolveAction *);
63 
64   static const CoinPresolveAction *presolve(CoinPresolveMatrix *prob,
65     const CoinPresolveAction *next);
66 
67   void postsolve(CoinPostsolveMatrix *prob) const;
68 
~drop_empty_cols_action()69   virtual ~drop_empty_cols_action() { deleteAction(actions_, action *); }
70 };
71 
72 /*! \class drop_empty_rows_action
73     \brief Physically removes empty rows in presolve, and reinserts
74 	   empty rows in postsolve.
75 
76   Physical removal of rows and columns should be the last activities
77   performed during presolve. Do them exactly once. The row-major matrix
78   is <b>not</b> maintained by this transform.
79 
80   To physically drop the rows, the rows are renumbered, excluding empty
81   rows. This involves rewriting CoinPrePostsolveMatrix::hrow_ and compressing
82   the row bounds and (if present) the row portions of the solution.
83 
84   \todo Confirm behaviour when a solution is present in presolve.
85 */
86 class drop_empty_rows_action : public CoinPresolveAction {
87 private:
88   struct action {
89     double rlo;
90     double rup;
91     int row;
92     int fill_row; // which row was moved into position row to fill it
93   };
94 
95   const int nactions_;
96   const action *const actions_;
97 
drop_empty_rows_action(int nactions,const action * actions,const CoinPresolveAction * next)98   drop_empty_rows_action(int nactions,
99     const action *actions,
100     const CoinPresolveAction *next)
101     : CoinPresolveAction(next)
102     , nactions_(nactions)
103     , actions_(actions)
104   {
105   }
106 
107 public:
name() const108   const char *name() const { return ("drop_empty_rows_action"); }
109 
110   static const CoinPresolveAction *presolve(CoinPresolveMatrix *prob,
111     const CoinPresolveAction *next);
112 
113   void postsolve(CoinPostsolveMatrix *prob) const;
114 
~drop_empty_rows_action()115   virtual ~drop_empty_rows_action() { deleteAction(actions_, action *); }
116 };
117 #endif
118 
119 /* vi: softtabstop=2 shiftwidth=2 expandtab tabstop=2
120 */
121