COIN-OR::LEMON - Graph Library

Changeset 612:7ab97e2a0c33 in lemon


Ignore:
Timestamp:
04/01/09 22:54:00 (15 years ago)
Author:
Balazs Dezso <deba@…>
Branch:
default
Phase:
public
Message:

Fixing presolver and basis handling (#255)

Location:
lemon
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • lemon/glpk.cc

    r598 r612  
    534534    : LpBase(), LpSolver(), GlpkBase() {
    535535    messageLevel(MESSAGE_NO_OUTPUT);
     536    presolver(false);
    536537  }
    537538
     
    539540    : LpBase(other), LpSolver(other), GlpkBase(other) {
    540541    messageLevel(MESSAGE_NO_OUTPUT);
     542    presolver(false);
    541543  }
    542544
     
    575577      break;
    576578    }
    577 
    578     if (glp_simplex(lp, &smcp) != 0) return UNSOLVED;
     579    smcp.presolve = _presolve;
     580
     581    // If the basis is not valid we get an error return value.
     582    // In this case we can try to create a new basis.
     583    switch (glp_simplex(lp, &smcp)) {
     584    case 0:
     585      break;
     586    case GLP_EBADB:
     587    case GLP_ESING:
     588    case GLP_ECOND:
     589      lpx_set_int_parm(lp, LPX_K_MSGLEV, smcp.msg_lev);
     590      glp_adv_basis(lp, 0);
     591      if (glp_simplex(lp, &smcp) != 0) return UNSOLVED;
     592      break;
     593    default:
     594      return UNSOLVED;
     595    }
     596
    579597    return SOLVED;
    580598  }
     
    601619    }
    602620    smcp.meth = GLP_DUAL;
    603 
    604     if (glp_simplex(lp, &smcp) != 0) return UNSOLVED;
     621    smcp.presolve = _presolve;
     622
     623    // If the basis is not valid we get an error return value.
     624    // In this case we can try to create a new basis.
     625    switch (glp_simplex(lp, &smcp)) {
     626    case 0:
     627      break;
     628    case GLP_EBADB:
     629    case GLP_ESING:
     630    case GLP_ECOND:
     631      lpx_set_int_parm(lp, LPX_K_MSGLEV, smcp.msg_lev);
     632      glp_adv_basis(lp, 0);
     633      if (glp_simplex(lp, &smcp) != 0) return UNSOLVED;
     634      break;
     635    default:
     636      return UNSOLVED;
     637    }
    605638    return SOLVED;
    606639  }
     
    820853  }
    821854
    822   void GlpkLp::presolver(bool b) {
    823     lpx_set_int_parm(lp, LPX_K_PRESOL, b ? 1 : 0);
     855  void GlpkLp::presolver(bool presolve) {
     856    _presolve = presolve;
    824857  }
    825858
     
    882915    smcp.meth = GLP_DUAL;
    883916
    884     if (glp_simplex(lp, &smcp) != 0) return UNSOLVED;
     917    // If the basis is not valid we get an error return value.
     918    // In this case we can try to create a new basis.
     919    switch (glp_simplex(lp, &smcp)) {
     920    case 0:
     921      break;
     922    case GLP_EBADB:
     923    case GLP_ESING:
     924    case GLP_ECOND:
     925      lpx_set_int_parm(lp, LPX_K_MSGLEV, smcp.msg_lev);
     926      glp_adv_basis(lp, 0);
     927      if (glp_simplex(lp, &smcp) != 0) return UNSOLVED;
     928      break;
     929    default:
     930      return UNSOLVED;
     931    }
     932
    885933    if (glp_get_status(lp) != GLP_OPT) return SOLVED;
    886934
  • lemon/glpk.h

    r589 r612  
    179179    SolveExitStatus solveDual();
    180180
     181  private:
     182
     183    bool _presolve;
     184
     185  public:
     186
    181187    ///Turns on or off the presolver
    182188
     
    184190    ///
    185191    ///The presolver is off by default.
    186     void presolver(bool b);
     192    void presolver(bool presolve);
    187193
    188194    ///Enum for \c messageLevel() parameter
Note: See TracChangeset for help on using the changeset viewer.