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