COIN-OR::LEMON - Graph Library

Changeset 2363:2aabce558574 in lemon-0.x for lemon/lp_soplex.cc


Ignore:
Timestamp:
02/15/07 15:22:08 (17 years ago)
Author:
Balazs Dezso
Branch:
default
Phase:
public
Convert:
svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@3174
Message:

Changes on the LP interface

_FixId => LpId?

  • handling of not common ids soplex

LpGlpk? row and col erase bug fix

  • calling lpx_std_basis before simplex

LpSoplex?

  • added getter functions
  • better m4 file
  • integration to the tests
  • better handling of unsolved lps
File:
1 edited

Legend:

Unmodified
Added
Removed
  • lemon/lp_soplex.cc

    r2313 r2363  
    2828 
    2929  LpSoplex::LpSoplex() : LpSolverBase() {
     30    rows.setIdHandler(relocateIdHandler);
     31    cols.setIdHandler(relocateIdHandler);
    3032    soplex = new soplex::SoPlex;
     33    solved = false;
    3134  }
    3235 
     
    4851  int LpSoplex::_addCol() {
    4952    soplex::LPCol col;
     53    col.setLower(-soplex::infinity);
     54    col.setUpper(soplex::infinity);
    5055    soplex->addCol(col);
    5156
    5257    colNames.push_back(std::string());
    53     primal.push_back(0.0);
     58    primal_value.push_back(0.0);
     59    solved = false;
    5460
    5561    return soplex->nCols() - 1;
     
    5864  int LpSoplex::_addRow() {
    5965    soplex::LPRow row;
     66    row.setLhs(-soplex::infinity);
     67    row.setRhs(soplex::infinity);
    6068    soplex->addRow(row);
    6169
    62     dual.push_back(0.0);
     70    dual_value.push_back(0.0);
     71    solved = false;
    6372
    6473    return soplex->nRows() - 1;
     
    6877  void LpSoplex::_eraseCol(int i) {
    6978    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;
    7284  }
    7385 
    7486  void LpSoplex::_eraseRow(int i) {
    7587    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;
    7891  }
    7992 
     
    94107      soplex->changeElement(i, it->first, it->second);
    95108    }
     109    solved = false;
    96110  }
    97111 
     
    103117      soplex->changeElement(it->first, j, it->second);
    104118    }
    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];
    109129  }
    110130
    111131  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
    115141  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;
    117149  }
    118150
    119151  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;
    121161  }
    122162
    123163  void LpSoplex::_setObjCoeff(int i, Value obj_coef) {
    124164    soplex->changeObj(i, obj_coef);
     165    solved = false;
     166  }
     167
     168  LpSoplex::Value LpSoplex::_getObjCoeff(int i) {
     169    return soplex->obj(i);
    125170  }
    126171
     
    129174      soplex->changeObj(i, 0.0);
    130175    }
     176    solved = false;
    131177  }
    132178
     
    134180    soplex::SPxSolver::Status status = soplex->solve();
    135181
    136     soplex::Vector pv(primal.size(), &primal[0]);
     182    soplex::Vector pv(primal_value.size(), &primal_value[0]);
    137183    soplex->getPrimal(pv);
    138184
    139     soplex::Vector dv(dual.size(), &dual[0]);
     185    soplex::Vector dv(dual_value.size(), &dual_value[0]);
    140186    soplex->getDual(dv);
    141187
     
    144190    case soplex::SPxSolver::INFEASIBLE:
    145191    case soplex::SPxSolver::UNBOUNDED:
     192      solved = true;
    146193      return SOLVED;
    147194    default:
     
    151198
    152199  LpSoplex::Value LpSoplex::_getPrimal(int i) {
    153     return primal[i];
     200    return primal_value[i];
    154201  }
    155202
    156203  LpSoplex::Value LpSoplex::_getDual(int i) {
    157     return dual[i];
     204    return dual_value[i];
    158205  }
    159206 
     
    167214
    168215  LpSoplex::SolutionStatus LpSoplex::_getPrimalStatus() {
     216    if (!solved) return UNDEFINED;
    169217    switch (soplex->status()) {
    170218    case soplex::SPxSolver::OPTIMAL:
     
    180228
    181229  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:
    184237      return UNDEFINED;
    185       return OPTIMAL;
    186       return INFEASIBLE;
    187       return UNDEFINED;
    188238    }
    189239  }
    190240
    191241  LpSoplex::ProblemTypes LpSoplex::_getProblemType() {
    192     switch (0) {
    193     case 0:
     242    if (!solved) return UNKNOWN;
     243    switch (soplex->status()) {
     244    case soplex::SPxSolver::OPTIMAL:
    194245      return PRIMAL_DUAL_FEASIBLE;
     246    case soplex::SPxSolver::UNBOUNDED:
    195247      return PRIMAL_FEASIBLE_DUAL_INFEASIBLE;
     248    default:
    196249      return UNKNOWN;
    197250    }
     
    200253  void LpSoplex::_setMax() {
    201254    soplex->changeSense(soplex::SPxSolver::MAXIMIZE);
     255    solved = false;
    202256  }
    203257  void LpSoplex::_setMin() {
    204258    soplex->changeSense(soplex::SPxSolver::MINIMIZE);
    205   }
     259    solved = false;
     260  }
     261  bool LpSoplex::_isMax() {
     262    return soplex->spxSense() == soplex::SPxSolver::MAXIMIZE;
     263  }
     264
    206265 
    207266} //namespace lemon
Note: See TracChangeset for help on using the changeset viewer.