1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 2 /* */ 3 /* This file is part of the class library */ 4 /* SoPlex --- the Sequential object-oriented simPlex. */ 5 /* */ 6 /* Copyright (C) 1996-2021 Konrad-Zuse-Zentrum */ 7 /* fuer Informationstechnik Berlin */ 8 /* */ 9 /* SoPlex is distributed under the terms of the ZIB Academic Licence. */ 10 /* */ 11 /* You should have received a copy of the ZIB Academic License */ 12 /* along with SoPlex; see the file COPYING. If not email to soplex@zib.de. */ 13 /* */ 14 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 15 16 /**@file spxid.h 17 * @brief Row and columns Id's \ref soplex::SPxLP "SPxLP". 18 */ 19 #ifndef _SPXID_H_ 20 #define _SPXID_H_ 21 22 #include <iostream> 23 24 #include "soplex/datakey.h" 25 26 namespace soplex 27 { 28 class SPxId; 29 30 /**@brief Ids for LP columns. 31 * @ingroup Algo 32 * 33 * Class SPxColId provides #DataKey%s for the 34 * column indices of an SPxLP. 35 */ 36 class SPxColId : public DataKey 37 { 38 public: 39 /// default constructor. 40 SPxColId() 41 {} 42 /// copy constructor from DataKey. 43 explicit SPxColId(const DataKey& p_key); 44 /// copy constructor from SPxId. 45 explicit SPxColId(const SPxId& p_key); 46 }; 47 48 49 /**@brief Ids for LP rows. 50 * @ingroup Algo 51 * 52 * Class SPxRowId provides #DataKey%s for the row 53 * indices of an SPxLP. 54 */ 55 class SPxRowId : public DataKey 56 { 57 public: 58 /// default constructor. 59 SPxRowId() 60 {} 61 /// copy constructor from DataKey. 62 explicit SPxRowId(const DataKey& p_key); 63 /// copy constructor from SPxId. 64 explicit SPxRowId(const SPxId& p_key); 65 }; 66 67 /**@brief Generic Ids for LP rows or columns. 68 * @ingroup Algo 69 * 70 * Both \ref soplex::SPxColId "SPxColIds" and \ref soplex::SPxRowId 71 * "SPxRowIds" may be treated uniformly as #SPxId%s: 72 * 73 * Rows and columns are numbered from 0 to num()-1 and 0 to dim()-1 74 * respectively. These numbers may be used to select individual rows or 75 * columns. However, these numbers may change if other rows or columns are 76 * added or removed. 77 * 78 * Further, each row or column of the problem matrix is assigned a \ref 79 * soplex::SPxRowId "SPxRowId" or \ref soplex::SPxColId "SPxColId", 80 * respectively. They are be used to select individual rows or columns just 81 * like numbers. In contrast to row and column numbers, ids remain unchanged 82 * for the time a row or column belongs to a SPxLP, no matter what other 83 * rows or columns are added to it or removed from it. 84 */ 85 class SPxId : public DataKey 86 { 87 friend std::ostream& operator<<(std::ostream& os, const SPxId& id); 88 89 public: 90 91 //-------------------------------- 92 /**@name Types */ 93 ///@{ 94 /// type of the id. 95 enum Type 96 { 97 ROW_ID = -1, ///< row identifier. 98 INVALID = 0, ///< invalid id. 99 COL_ID = 1 ///< column identifier. 100 }; 101 ///@} 102 103 //------------------------------------ 104 /**@name Construction / destruction */ 105 ///@{ 106 /// default constructor. Constructs an invalid id. 107 SPxId() 108 : DataKey(INVALID, -1) 109 {} 110 /// constructs an id out of a column identifier \p cid. 111 explicit SPxId(const SPxColId& cid) 112 : DataKey(COL_ID, cid.idx) 113 {} 114 /// constructs an id out of a row identifier \p rid. 115 explicit SPxId(const SPxRowId& rid) 116 : DataKey(ROW_ID, rid.idx) 117 {} 118 119 /// assignment operator 120 SPxId& operator=(const SPxColId& cid) 121 { 122 DataKey::operator= (cid); 123 info = COL_ID; 124 return *this; 125 } 126 /// assignment operator 127 SPxId& operator=(const SPxRowId& rid) 128 { 129 DataKey::operator= (rid); 130 info = ROW_ID; 131 return *this; 132 } 133 ///@} 134 135 //-------------------------------- 136 /**@name Access / modification */ 137 ///@{ 138 /// returns the type of the id. 139 inline Type type() const 140 { 141 return info ? (info < 0 ? ROW_ID : COL_ID) : INVALID; 142 } 143 /// returns TRUE iff the id is a valid column or row identifier. 144 inline bool isValid() const 145 { 146 return info != 0; 147 } 148 /// makes the id invalid. 149 inline void inValidate() 150 { 151 info = 0; 152 } 153 /// is id a row id? 154 inline bool isSPxRowId() const 155 { 156 return info < 0; 157 } 158 /// is id a column id? 159 inline bool isSPxColId() const 160 { 161 return info > 0; 162 } 163 ///@} 164 165 //------------------------------------ 166 /**@name Comparison of Ids */ 167 ///@{ 168 /// equality operator. 169 int operator==(const SPxId& id) const 170 { 171 return (this == &id); 172 } 173 /// inequality operator. 174 int operator!=(const SPxId& id) const 175 { 176 return (this != &id); 177 } 178 /// less then operator 179 bool operator<(const SPxId& id) const 180 { 181 return getIdx() < id.getIdx(); 182 } 183 ///@} 184 }; 185 186 187 } // namespace soplex 188 #endif // _SPXID_H_ 189