COIN-OR::LEMON - Graph Library

Changeset 2218:50f1a780a5ff in lemon-0.x


Ignore:
Timestamp:
09/21/06 16:46:28 (18 years ago)
Author:
athos
Branch:
default
Phase:
public
Convert:
svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@2952
Message:

Interface to the cplex MIP solver: it is little, a bit sour but it is ours.

Files:
8 edited

Legend:

Unmodified
Added
Removed
  • lemon/Makefile.am

    r2211 r2218  
    2626if HAVE_CPLEX
    2727lemon_libemon_la_SOURCES += lemon/lp_cplex.cc
     28lemon_libemon_la_SOURCES += lemon/mip_cplex.cc
    2829endif
    2930
     
    7980        lemon/min_cut.h \
    8081        lemon/mip_glpk.h \
     82        lemon/mip_cplex.h \
    8183        lemon/path.h \
    8284        lemon/polynomial.h \
  • lemon/lp.h

    r2144 r2218  
    2222#include<lemon/config.h>
    2323
     24
    2425#ifdef HAVE_GLPK
    2526#include <lemon/lp_glpk.h>
     
    2728#elif HAVE_CPLEX
    2829#include <lemon/lp_cplex.h>
     30#include <lemon/mip_cplex.h>
    2931#endif
    3032
     
    3335///\ingroup gen_opt_group
    3436namespace lemon {
    35  
     37
    3638#ifdef DOXYGEN
    3739  ///The default LP solver identifier
     
    7375#define DEFAULT_LP CPLEX
    7476  typedef LpCplex Lp;
     77  typedef MipCplex Mip;
    7578  const char default_solver_name[]="CPLEX";
    7679#endif
  • lemon/lp_base.h

    r2185 r2218  
    7676        return cross[n];
    7777      }
    78       ///\todo Create an own exception type.
    79       else throw LogicError(); //floatingId-s must form a continuous range;
     78      else {
     79        ///\todo Create an own exception type.
     80        throw LogicError(); //floatingId-s must form a continuous range;
     81      }
    8082    }
    8183    ///Remove a fix id.
     
    11701172      REAL = 0,
    11711173      ///Integer variable
    1172       INTEGER = 1
     1174
     1175      ///Unfortunately, cplex 7.5 somewhere writes something like
     1176      ///#define INTEGER 'I'
     1177      LEMON_INTEGER = 1
    11731178      ///\todo No support for other types yet.
    11741179    };
     
    11931198    void integer(Col c, bool enable) {
    11941199      if (enable)
    1195         colType(c,INTEGER);
     1200        colType(c,LEMON_INTEGER);
    11961201      else
    11971202        colType(c,REAL);
     
    12031208    ///\return true if the column has integer type and false if not.
    12041209    bool integer(Col c){
    1205       return (colType(c)==INTEGER);
     1210      return (colType(c)==LEMON_INTEGER);
    12061211    }
    12071212
  • lemon/lp_cplex.cc

    r2168 r2218  
    270270    status = CPXlpopt(env, lp);
    271271    //status = CPXprimopt(env, lp);
    272 #if CPX_VERSION >= 900
     272#if CPX_VERSION >= 800
    273273    if (status)
    274274    {
     
    417417  LpCplex::SolutionStatus LpCplex::_getPrimalStatus()
    418418  {
     419    //Unboundedness not treated well: the following is from cplex 9.0 doc
     420    // About Unboundedness
     421
     422    // The treatment of models that are unbounded involves a few
     423    // subtleties. Specifically, a declaration of unboundedness means that
     424    // ILOG CPLEX has determined that the model has an unbounded
     425    // ray. Given any feasible solution x with objective z, a multiple of
     426    // the unbounded ray can be added to x to give a feasible solution
     427    // with objective z-1 (or z+1 for maximization models). Thus, if a
     428    // feasible solution exists, then the optimal objective is
     429    // unbounded. Note that ILOG CPLEX has not necessarily concluded that
     430    // a feasible solution exists. Users can call the routine CPXsolninfo
     431    // to determine whether ILOG CPLEX has also concluded that the model
     432    // has a feasible solution.
     433
    419434    int stat = CPXgetstat(env, lp);
    420 #if CPX_VERSION >= 900
     435#if CPX_VERSION >= 800
    421436    switch (stat)
    422437    {
     
    486501  {
    487502    int stat = CPXgetstat(env, lp);
    488 #if CPX_VERSION >= 900
     503#if CPX_VERSION >= 800
    489504    switch (stat)
    490505    {
     
    515530  {
    516531    int stat = CPXgetstat(env, lp);
    517 #if CPX_VERSION >= 900
     532#if CPX_VERSION >= 800
    518533    switch (stat)
    519534    {
  • lemon/lp_cplex.h

    r1956 r2218  
    3535  ///
    3636  /// This class implements an interface for the CPLEX LP solver.
    37   class LpCplex : public LpSolverBase {
     37  class LpCplex :virtual public LpSolverBase {
    3838
    3939  public:
  • lemon/mip_glpk.cc

    r2213 r2218  
    1717 */
    1818
    19 #ifndef LEMON_ILP_GLPK_CC
    20 #define LEMON_ILP_GLPK_CC
     19#ifndef LEMON_MIP_GLPK_CC
     20#define LEMON_MIP_GLPK_CC
    2121
    2222///\file
    23 ///\brief Implementation of the LEMON-GLPK lp solver interface.
     23///\brief Implementation of the LEMON-GLPK mip solver interface.
    2424
    2525#include <lemon/mip_glpk.h>
     
    3333  void MipGlpk::_colType(int i, MipGlpk::ColTypes col_type){
    3434    switch (col_type){
    35       case INTEGER:
     35      case LEMON_INTEGER:
    3636        lpx_set_col_kind(lp,i,LPX_IV);
    3737        break;
     
    4747    switch (lpx_get_col_kind(lp,i)){
    4848    case LPX_IV:
    49       return INTEGER;//Or binary
     49      return LEMON_INTEGER;//Or binary
    5050    case LPX_CV:
    5151      return REAL;
     
    111111    return lpx_mip_obj_val(lp);
    112112  }
    113 } //END OG NAMESPACE LEMON
     113} //END OF NAMESPACE LEMON
    114114
    115 #endif
     115#endif //END OF MIP_GLPK_CC
  • lemon/mip_glpk.h

    r2185 r2218  
    1717 */
    1818
    19 #ifndef LEMON_ILP_GLPK_H
    20 #define LEMON_ILP_GLPK_H
     19#ifndef LEMON_MIP_GLPK_H
     20#define LEMON_MIP_GLPK_H
    2121
    2222///\file
    23 ///\brief Header of the LEMON-GLPK lp solver interface.
     23///\brief Header of the LEMON-GLPK mip solver interface.
    2424///\ingroup gen_opt_group
    2525
     
    2828
    2929namespace lemon {
    30   /// \brief Interface for the GLPK ILP solver
     30  /// \brief Interface for the GLPK MIP solver
    3131  ///
    32   /// This class implements an interface for the GLPK ILP solver.
     32  /// This class implements an interface for the GLPK MIP solver.
    3333  ///\ingroup gen_opt_group
    3434  class MipGlpk : public MipSolverBase, public LpGlpk{
     
    5757} //END OF NAMESPACE LEMON
    5858
    59 #endif // END OF LEMON_ILP_GLPK_H
     59#endif // END OF LEMON_MIP_GLPK_H
  • test/mip_test.cc

    r2213 r2218  
    1 #include <lemon/lp.h>
    21#include "test_tools.h"
     2
     3
     4#include <lemon/mip_cplex.h>
     5#include <lemon/mip_glpk.h>
     6#include<lemon/config.h>
    37
    48using namespace lemon;
    59
    6 void solveAndCheck(Mip& lp, LpSolverBase::SolutionStatus stat,
     10void solveAndCheck(MipSolverBase& lp, MipSolverBase::SolutionStatus stat,
    711                   double exp_opt) {
    812  using std::string;
     13
    914  lp.solve();
    1015  //int decimal,sign;
     
    1217  buf << "Primalstatus should be: " << int(stat)<<" and it is "<<int(lp.primalStatus());
    1318
     19
    1420  //  itoa(stat,buf1, 10);
    1521  check(lp.mipStatus()==stat, buf.str());
    1622
    17   if (stat ==  LpSolverBase::OPTIMAL) {
     23  if (stat ==  MipSolverBase::OPTIMAL) {
    1824    std::ostringstream buf;
    1925    buf << "Wrong optimal value: the right optimum is " << exp_opt;
     
    2329}
    2430
    25 void aTest(Mip& mip)
     31void aTest(MipSolverBase& mip)
    2632{
    2733 //The following example is very simple
    2834
    29   typedef Mip::Row Row;
    30   typedef Mip::Col Col;
     35
     36  typedef MipSolverBase::Row Row;
     37  typedef MipSolverBase::Col Col;
     38
    3139
    3240
    3341  Col x1 = mip.addCol();
    3442  Col x2 = mip.addCol();
    35 
    36 
    37 
    38 
    3943
    4044
     
    6165  //over the triangle with vertices
    6266  double expected_opt=4.0/5.0;
    63   solveAndCheck(mip, Mip::OPTIMAL, expected_opt);
     67  solveAndCheck(mip, MipSolverBase::OPTIMAL, expected_opt);
    6468
    6569  //Restrict x2 to integer
    66   mip.colType(x2,Mip::INTEGER); 
     70  mip.colType(x2,MipSolverBase::LEMON_INTEGER); 
    6771  expected_opt=1.0/2.0;
    68   solveAndCheck(mip, Mip::OPTIMAL, expected_opt);
     72  solveAndCheck(mip, MipSolverBase::OPTIMAL, expected_opt);
    6973
    7074
    7175  //Restrict both to integer
    72   mip.colType(x1,Mip::INTEGER); 
     76  mip.colType(x1,MipSolverBase::LEMON_INTEGER); 
    7377  expected_opt=0;
    74   solveAndCheck(mip, Mip::OPTIMAL, expected_opt);
     78  solveAndCheck(mip, MipSolverBase::OPTIMAL, expected_opt);
    7579
    7680 
     
    8791#endif
    8892
     93
     94
     95#ifdef HAVE_CPLEX
     96  //std::cout<<ATTILA<<INTEGER;
     97  MipCplex mip2;
     98  aTest(mip2);
     99#endif
     100
    89101  return 0;
    90102
Note: See TracChangeset for help on using the changeset viewer.