gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge #317
0 2 0
merge default
0 files changed with 3 insertions and 2 deletions:
↑ Collapse diff ↑
Ignore white space 6 line context
1 1
AC_DEFUN([LX_CHECK_COIN],
2 2
[
3 3
  AC_ARG_WITH([coin],
4 4
AS_HELP_STRING([--with-coin@<:@=PREFIX@:>@], [search for CLP under PREFIX or under the default search paths if PREFIX is not given @<:@default@:>@])
5 5
AS_HELP_STRING([--without-coin], [disable checking for CLP]),
6 6
              [], [with_coin=yes])
7 7

	
8 8
  AC_ARG_WITH([coin-includedir],
9 9
AS_HELP_STRING([--with-coin-includedir=DIR], [search for CLP headers in DIR]),
10 10
              [], [with_coin_includedir=no])
11 11

	
12 12
  AC_ARG_WITH([coin-libdir],
13 13
AS_HELP_STRING([--with-coin-libdir=DIR], [search for CLP libraries in DIR]),
14 14
              [], [with_coin_libdir=no])
15 15

	
16 16
  lx_clp_found=no
17 17
  if test x"$with_coin" != x"no"; then
18 18
    AC_MSG_CHECKING([for CLP])
19 19

	
20 20
    if test x"$with_coin_includedir" != x"no"; then
21 21
      CLP_CXXFLAGS="-I$with_coin_includedir"
22 22
    elif test x"$with_coin" != x"yes"; then
23 23
      CLP_CXXFLAGS="-I$with_coin/include"
24 24
    fi
25 25

	
26 26
    if test x"$with_coin_libdir" != x"no"; then
27 27
      CLP_LDFLAGS="-L$with_coin_libdir"
28 28
    elif test x"$with_coin" != x"yes"; then
29 29
      CLP_LDFLAGS="-L$with_coin/lib"
30 30
    fi
31 31
    CLP_LIBS="-lClp -lCoinUtils -lm"
32 32

	
33 33
    lx_save_cxxflags="$CXXFLAGS"
34 34
    lx_save_ldflags="$LDFLAGS"
35 35
    lx_save_libs="$LIBS"
36 36
    CXXFLAGS="$CLP_CXXFLAGS"
37 37
    LDFLAGS="$CLP_LDFLAGS"
38 38
    LIBS="$CLP_LIBS"
39 39

	
40 40
    lx_clp_test_prog='
41 41
      #include <coin/ClpModel.hpp>
42 42

	
43 43
      int main(int argc, char** argv)
44 44
      {
45 45
        ClpModel clp;
46 46
        return 0;
47 47
      }'
48 48

	
49 49
    AC_LANG_PUSH(C++)
50 50
    AC_LINK_IFELSE([$lx_clp_test_prog], [lx_clp_found=yes], [lx_clp_found=no])
51 51
    AC_LANG_POP(C++)
52 52

	
53 53
    CXXFLAGS="$lx_save_cxxflags"
54 54
    LDFLAGS="$lx_save_ldflags"
55 55
    LIBS="$lx_save_libs"
56 56

	
57 57
    if test x"$lx_clp_found" = x"yes"; then
58 58
      AC_DEFINE([LEMON_HAVE_CLP], [1], [Define to 1 if you have CLP.])
59 59
      lx_lp_found=yes
60 60
      AC_DEFINE([LEMON_HAVE_LP], [1], [Define to 1 if you have any LP solver.])
61 61
      AC_MSG_RESULT([yes])
62 62
    else
63 63
      CLP_CXXFLAGS=""
64 64
      CLP_LDFLAGS=""
65 65
      CLP_LIBS=""
66 66
      AC_MSG_RESULT([no])
67 67
    fi
68 68
  fi
69 69
  CLP_LIBS="$CLP_LDFLAGS $CLP_LIBS"
70 70
  AC_SUBST(CLP_CXXFLAGS)
71 71
  AC_SUBST(CLP_LIBS)
72 72
  AM_CONDITIONAL([HAVE_CLP], [test x"$lx_clp_found" = x"yes"])
73 73

	
74 74

	
75 75
  lx_cbc_found=no
76 76
  if test x"$lx_clp_found" = x"yes"; then
77 77
    if test x"$with_coin" != x"no"; then
78 78
      AC_MSG_CHECKING([for CBC])
79 79

	
80 80
      if test x"$with_coin_includedir" != x"no"; then
81 81
        CBC_CXXFLAGS="-I$with_coin_includedir"
82 82
      elif test x"$with_coin" != x"yes"; then
83 83
        CBC_CXXFLAGS="-I$with_coin/include"
84 84
      fi
85 85

	
86 86
      if test x"$with_coin_libdir" != x"no"; then
87 87
        CBC_LDFLAGS="-L$with_coin_libdir"
88 88
      elif test x"$with_coin" != x"yes"; then
89 89
        CBC_LDFLAGS="-L$with_coin/lib"
90 90
      fi
91
      CBC_LIBS="-lOsi -lCbc -lOsiCbc -lCbcSolver -lClp -lOsiClp -lCoinUtils -lVol -lOsiVol -lCgl -lm -llapack -lblas"
91
      CBC_LIBS="-lOsi -lCbc -lCbcSolver -lClp -lOsiClp -lCoinUtils -lVol -lOsiVol -lCgl -lm -llapack -lblas"
92 92

	
93 93
      lx_save_cxxflags="$CXXFLAGS"
94 94
      lx_save_ldflags="$LDFLAGS"
95 95
      lx_save_libs="$LIBS"
96 96
      CXXFLAGS="$CBC_CXXFLAGS"
97 97
      LDFLAGS="$CBC_LDFLAGS"
98 98
      LIBS="$CBC_LIBS"
99 99

	
100 100
      lx_cbc_test_prog='
101 101
        #include <coin/CbcModel.hpp>
102 102

	
103 103
        int main(int argc, char** argv)
104 104
        {
105 105
          CbcModel cbc;
106 106
          return 0;
107 107
        }'
108 108

	
109 109
      AC_LANG_PUSH(C++)
110 110
      AC_LINK_IFELSE([$lx_cbc_test_prog], [lx_cbc_found=yes], [lx_cbc_found=no])
111 111
      AC_LANG_POP(C++)
112 112

	
113 113
      CXXFLAGS="$lx_save_cxxflags"
114 114
      LDFLAGS="$lx_save_ldflags"
115 115
      LIBS="$lx_save_libs"
116 116

	
117 117
      if test x"$lx_cbc_found" = x"yes"; then
118 118
        AC_DEFINE([LEMON_HAVE_CBC], [1], [Define to 1 if you have CBC.])
119 119
        lx_lp_found=yes
120 120
        AC_DEFINE([LEMON_HAVE_LP], [1], [Define to 1 if you have any LP solver.])
121 121
        lx_mip_found=yes
122 122
        AC_DEFINE([LEMON_HAVE_MIP], [1], [Define to 1 if you have any MIP solver.])
123 123
        AC_MSG_RESULT([yes])
124 124
      else
125 125
        CBC_CXXFLAGS=""
126 126
        CBC_LDFLAGS=""
127 127
        CBC_LIBS=""
128 128
        AC_MSG_RESULT([no])
129 129
      fi
130 130
    fi
131 131
  fi
132 132
  CBC_LIBS="$CBC_LDFLAGS $CBC_LIBS"
133 133
  AC_SUBST(CBC_CXXFLAGS)
134 134
  AC_SUBST(CBC_LIBS)
135 135
  AM_CONDITIONAL([HAVE_CBC], [test x"$lx_cbc_found" = x"yes"])
136 136
])
Ignore white space 192 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include "test_tools.h"
20 20

	
21 21
#include <lemon/config.h>
22 22

	
23 23
#ifdef LEMON_HAVE_CPLEX
24 24
#include <lemon/cplex.h>
25 25
#endif
26 26

	
27 27
#ifdef LEMON_HAVE_GLPK
28 28
#include <lemon/glpk.h>
29 29
#endif
30 30

	
31 31
#ifdef LEMON_HAVE_CBC
32 32
#include <lemon/cbc.h>
33 33
#endif
34 34

	
35 35

	
36 36
using namespace lemon;
37 37

	
38 38
void solveAndCheck(MipSolver& mip, MipSolver::ProblemType stat,
39 39
                   double exp_opt) {
40 40
  using std::string;
41 41

	
42 42
  mip.solve();
43 43
  //int decimal,sign;
44 44
  std::ostringstream buf;
45 45
  buf << "Type should be: " << int(stat)<<" and it is "<<int(mip.type());
46 46

	
47 47

	
48 48
  //  itoa(stat,buf1, 10);
49 49
  check(mip.type()==stat, buf.str());
50 50

	
51 51
  if (stat ==  MipSolver::OPTIMAL) {
52 52
    std::ostringstream sbuf;
53
    buf << "Wrong optimal value: the right optimum is " << exp_opt;
53
    sbuf << "Wrong optimal value ("<< mip.solValue()
54
         <<" instead of " << exp_opt << ")";
54 55
    check(std::abs(mip.solValue()-exp_opt) < 1e-3, sbuf.str());
55 56
    //+ecvt(exp_opt,2)
56 57
  }
57 58
}
58 59

	
59 60
void aTest(MipSolver& mip)
60 61
{
61 62
  //The following example is very simple
62 63

	
63 64

	
64 65
  typedef MipSolver::Row Row;
65 66
  typedef MipSolver::Col Col;
66 67

	
67 68

	
68 69
  Col x1 = mip.addCol();
69 70
  Col x2 = mip.addCol();
70 71

	
71 72

	
72 73
  //Objective function
73 74
  mip.obj(x1);
74 75

	
75 76
  mip.max();
76 77

	
77 78
  //Unconstrained optimization
78 79
  mip.solve();
79 80
  //Check it out!
80 81

	
81 82
  //Constraints
82 83
  mip.addRow(2 * x1 + x2 <= 2);
83 84
  Row y2 = mip.addRow(x1 - 2 * x2 <= 0);
84 85

	
85 86
  //Nonnegativity of the variable x1
86 87
  mip.colLowerBound(x1, 0);
87 88

	
88 89

	
89 90
  //Maximization of x1
90 91
  //over the triangle with vertices (0,0),(4/5,2/5),(0,2)
91 92
  double expected_opt=4.0/5.0;
92 93
  solveAndCheck(mip, MipSolver::OPTIMAL, expected_opt);
93 94

	
94 95

	
95 96
  //Restrict x2 to integer
96 97
  mip.colType(x2,MipSolver::INTEGER);
97 98
  expected_opt=1.0/2.0;
98 99
  solveAndCheck(mip, MipSolver::OPTIMAL, expected_opt);
99 100

	
100 101

	
101 102
  //Restrict both to integer
102 103
  mip.colType(x1,MipSolver::INTEGER);
103 104
  expected_opt=0;
104 105
  solveAndCheck(mip, MipSolver::OPTIMAL, expected_opt);
105 106

	
106 107
  //Erase a variable
107 108
  mip.erase(x2);
108 109
  mip.rowUpperBound(y2, 8);
109 110
  expected_opt=1;
110 111
  solveAndCheck(mip, MipSolver::OPTIMAL, expected_opt);
111 112

	
112 113
}
113 114

	
114 115

	
115 116
template<class MIP>
116 117
void cloneTest()
117 118
{
118 119

	
119 120
  MIP* mip = new MIP();
120 121
  MIP* mipnew = mip->newSolver();
121 122
  MIP* mipclone = mip->cloneSolver();
122 123
  delete mip;
123 124
  delete mipnew;
124 125
  delete mipclone;
125 126
}
126 127

	
127 128
int main()
128 129
{
129 130

	
130 131
#ifdef LEMON_HAVE_GLPK
131 132
  {
132 133
    GlpkMip mip1;
133 134
    aTest(mip1);
134 135
    cloneTest<GlpkMip>();
135 136
  }
136 137
#endif
137 138

	
138 139
#ifdef LEMON_HAVE_CPLEX
139 140
  try {
140 141
    CplexMip mip2;
141 142
    aTest(mip2);
142 143
    cloneTest<CplexMip>();
143 144
  } catch (CplexEnv::LicenseError& error) {
144 145
    check(false, error.what());
145 146
  }
146 147
#endif
147 148

	
148 149
#ifdef LEMON_HAVE_CBC
149 150
  {
0 comments (0 inline)