gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Fix (and improve) error message in mip_test.cc (#317)
0 1 0
default
1 file changed with 2 insertions and 1 deletions:
↑ Collapse diff ↑
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)