Changeset 2363:2aabce558574 in lemon-0.x for lemon/lp_soplex.cc
- Timestamp:
- 02/15/07 15:22:08 (17 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@3174
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/lp_soplex.cc
r2313 r2363 28 28 29 29 LpSoplex::LpSoplex() : LpSolverBase() { 30 rows.setIdHandler(relocateIdHandler); 31 cols.setIdHandler(relocateIdHandler); 30 32 soplex = new soplex::SoPlex; 33 solved = false; 31 34 } 32 35 … … 48 51 int LpSoplex::_addCol() { 49 52 soplex::LPCol col; 53 col.setLower(-soplex::infinity); 54 col.setUpper(soplex::infinity); 50 55 soplex->addCol(col); 51 56 52 57 colNames.push_back(std::string()); 53 primal.push_back(0.0); 58 primal_value.push_back(0.0); 59 solved = false; 54 60 55 61 return soplex->nCols() - 1; … … 58 64 int LpSoplex::_addRow() { 59 65 soplex::LPRow row; 66 row.setLhs(-soplex::infinity); 67 row.setRhs(soplex::infinity); 60 68 soplex->addRow(row); 61 69 62 dual.push_back(0.0); 70 dual_value.push_back(0.0); 71 solved = false; 63 72 64 73 return soplex->nRows() - 1; … … 68 77 void LpSoplex::_eraseCol(int i) { 69 78 soplex->removeCol(i); 70 primal[i] = primal.back(); 71 primal.pop_back(); 79 colNames[i] = colNames.back(); 80 colNames.pop_back(); 81 primal_value[i] = primal_value.back(); 82 primal_value.pop_back(); 83 solved = false; 72 84 } 73 85 74 86 void LpSoplex::_eraseRow(int i) { 75 87 soplex->removeRow(i); 76 dual[i] = dual.back(); 77 dual.pop_back(); 88 dual_value[i] = dual_value.back(); 89 dual_value.pop_back(); 90 solved = false; 78 91 } 79 92 … … 94 107 soplex->changeElement(i, it->first, it->second); 95 108 } 109 solved = false; 96 110 } 97 111 … … 103 117 soplex->changeElement(it->first, j, it->second); 104 118 } 105 } 106 107 void LpSoplex::_setCoeff(int row, int col, Value value) { 108 soplex->changeElement(row, col, value); 119 solved = false; 120 } 121 122 void LpSoplex::_setCoeff(int i, int j, Value value) { 123 soplex->changeElement(i, j, value); 124 solved = false; 125 } 126 127 LpSoplex::Value LpSoplex::_getCoeff(int i, int j) { 128 return soplex->rowVector(i)[j]; 109 129 } 110 130 111 131 void LpSoplex::_setColLowerBound(int i, Value value) { 112 soplex->changeLower(i, value); 113 } 114 132 soplex->changeLower(i, value != -INF ? value : -soplex::infinity); 133 solved = false; 134 } 135 136 LpSoplex::Value LpSoplex::_getColLowerBound(int i) { 137 double value = soplex->lower(i); 138 return value != -soplex::infinity ? value : -INF; 139 } 140 115 141 void LpSoplex::_setColUpperBound(int i, Value value) { 116 soplex->changeUpper(i, value); 142 soplex->changeUpper(i, value != INF ? value : soplex::infinity); 143 solved = false; 144 } 145 146 LpSoplex::Value LpSoplex::_getColUpperBound(int i) { 147 double value = soplex->upper(i); 148 return value != soplex::infinity ? value : INF; 117 149 } 118 150 119 151 void LpSoplex::_setRowBounds(int i, Value lb, Value ub) { 120 soplex->changeRange(i, lb, ub); 152 soplex->changeRange(i, lb != -INF ? lb : -soplex::infinity, 153 ub != INF ? ub : soplex::infinity); 154 solved = false; 155 } 156 void LpSoplex::_getRowBounds(int i, Value &lower, Value &upper) { 157 lower = soplex->lhs(i); 158 if (lower == -soplex::infinity) lower = -INF; 159 upper = soplex->rhs(i); 160 if (upper == -soplex::infinity) upper = INF; 121 161 } 122 162 123 163 void LpSoplex::_setObjCoeff(int i, Value obj_coef) { 124 164 soplex->changeObj(i, obj_coef); 165 solved = false; 166 } 167 168 LpSoplex::Value LpSoplex::_getObjCoeff(int i) { 169 return soplex->obj(i); 125 170 } 126 171 … … 129 174 soplex->changeObj(i, 0.0); 130 175 } 176 solved = false; 131 177 } 132 178 … … 134 180 soplex::SPxSolver::Status status = soplex->solve(); 135 181 136 soplex::Vector pv(primal .size(), &primal[0]);182 soplex::Vector pv(primal_value.size(), &primal_value[0]); 137 183 soplex->getPrimal(pv); 138 184 139 soplex::Vector dv(dual .size(), &dual[0]);185 soplex::Vector dv(dual_value.size(), &dual_value[0]); 140 186 soplex->getDual(dv); 141 187 … … 144 190 case soplex::SPxSolver::INFEASIBLE: 145 191 case soplex::SPxSolver::UNBOUNDED: 192 solved = true; 146 193 return SOLVED; 147 194 default: … … 151 198 152 199 LpSoplex::Value LpSoplex::_getPrimal(int i) { 153 return primal [i];200 return primal_value[i]; 154 201 } 155 202 156 203 LpSoplex::Value LpSoplex::_getDual(int i) { 157 return dual [i];204 return dual_value[i]; 158 205 } 159 206 … … 167 214 168 215 LpSoplex::SolutionStatus LpSoplex::_getPrimalStatus() { 216 if (!solved) return UNDEFINED; 169 217 switch (soplex->status()) { 170 218 case soplex::SPxSolver::OPTIMAL: … … 180 228 181 229 LpSoplex::SolutionStatus LpSoplex::_getDualStatus() { 182 switch (0) { 183 case 0: 230 if (!solved) return UNDEFINED; 231 switch (soplex->status()) { 232 case soplex::SPxSolver::OPTIMAL: 233 return OPTIMAL; 234 case soplex::SPxSolver::UNBOUNDED: 235 return INFEASIBLE; 236 default: 184 237 return UNDEFINED; 185 return OPTIMAL;186 return INFEASIBLE;187 return UNDEFINED;188 238 } 189 239 } 190 240 191 241 LpSoplex::ProblemTypes LpSoplex::_getProblemType() { 192 switch (0) { 193 case 0: 242 if (!solved) return UNKNOWN; 243 switch (soplex->status()) { 244 case soplex::SPxSolver::OPTIMAL: 194 245 return PRIMAL_DUAL_FEASIBLE; 246 case soplex::SPxSolver::UNBOUNDED: 195 247 return PRIMAL_FEASIBLE_DUAL_INFEASIBLE; 248 default: 196 249 return UNKNOWN; 197 250 } … … 200 253 void LpSoplex::_setMax() { 201 254 soplex->changeSense(soplex::SPxSolver::MAXIMIZE); 255 solved = false; 202 256 } 203 257 void LpSoplex::_setMin() { 204 258 soplex->changeSense(soplex::SPxSolver::MINIMIZE); 205 } 259 solved = false; 260 } 261 bool LpSoplex::_isMax() { 262 return soplex->spxSense() == soplex::SPxSolver::MAXIMIZE; 263 } 264 206 265 207 266 } //namespace lemon
Note: See TracChangeset
for help on using the changeset viewer.