gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Unify sources
0 2 0
r1.1.5 1.1
2 files changed with 2 insertions and 2 deletions:
↑ Collapse diff ↑
Ignore white space 512 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-2011
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 <lemon/list_graph.h>
20 20
#include <lemon/lgf_reader.h>
21 21
#include "test_tools.h"
22 22

	
23 23
using namespace lemon;
24 24

	
25 25
char test_lgf[] =
26 26
  "@nodes\n"
27 27
  "label\n"
28 28
  "0\n"
29 29
  "1\n"
30 30
  "@arcs\n"
31 31
  "     label\n"
32 32
  "0 1  0\n"
33 33
  "1 0  1\n"
34 34
  "@attributes\n"
35 35
  "source 0\n"
36 36
  "target 1\n";
37 37

	
38 38
char test_lgf_nomap[] =
39 39
  "@nodes\n"
40 40
  "label\n"
41 41
  "0\n"
42 42
  "1\n"
43 43
  "@arcs\n"
44 44
  "     -\n"
45 45
  "0 1\n";
46 46

	
47 47
char test_lgf_bad1[] =
48 48
  "@nodes\n"
49 49
  "label\n"
50 50
  "0\n"
51 51
  "1\n"
52 52
  "@arcs\n"
53 53
  "     - another\n"
54 54
  "0 1\n";
55 55

	
56 56
char test_lgf_bad2[] =
57 57
  "@nodes\n"
58 58
  "label\n"
59 59
  "0\n"
60 60
  "1\n"
61 61
  "@arcs\n"
62 62
  "     label -\n"
63 63
  "0 1\n";
64 64

	
65 65

	
66 66
int main()
67 67
{
68 68
  {
69 69
    ListDigraph d;
70 70
    ListDigraph::Node s,t;
71 71
    ListDigraph::ArcMap<int> label(d);
72 72
    std::istringstream input(test_lgf);
73 73
    digraphReader(d, input).
74 74
      node("source", s).
75 75
      node("target", t).
76 76
      arcMap("label", label).
77 77
      run();
78 78
    check(countNodes(d) == 2,"There should be 2 nodes");
79 79
    check(countArcs(d) == 2,"There should be 2 arcs");
80 80
  }
81 81
  {
82 82
    ListGraph g;
83 83
    ListGraph::Node s,t;
84 84
    ListGraph::EdgeMap<int> label(g);
85 85
    std::istringstream input(test_lgf);
86 86
    graphReader(g, input).
87 87
      node("source", s).
88 88
      node("target", t).
89 89
      edgeMap("label", label).
90 90
      run();
91 91
    check(countNodes(g) == 2,"There should be 2 nodes");
92 92
    check(countEdges(g) == 2,"There should be 2 arcs");
93 93
  }
94 94

	
95 95
  {
96 96
    ListDigraph d;
97 97
    std::istringstream input(test_lgf_nomap);
98 98
    digraphReader(d, input).
99 99
      run();
100 100
    check(countNodes(d) == 2,"There should be 2 nodes");
101 101
    check(countArcs(d) == 1,"There should be 1 arc");
102 102
  }
103 103
  {
104 104
    ListGraph g;
105 105
    std::istringstream input(test_lgf_nomap);
106 106
    graphReader(g, input).
107 107
      run();
108 108
    check(countNodes(g) == 2,"There should be 2 nodes");
109 109
    check(countEdges(g) == 1,"There should be 1 edge");
110 110
  }
111 111

	
112 112
  {
113 113
    ListDigraph d;
114 114
    std::istringstream input(test_lgf_bad1);
115 115
    bool ok=false;
116 116
    try {
117 117
      digraphReader(d, input).
118 118
        run();
119 119
    }
120
    catch (FormatError&) 
120
    catch (FormatError&)
121 121
      {
122 122
        ok = true;
123 123
      }
124 124
    check(ok,"FormatError exception should have occured");
125 125
  }
126 126
  {
127 127
    ListGraph g;
128 128
    std::istringstream input(test_lgf_bad1);
129 129
    bool ok=false;
130 130
    try {
131 131
      graphReader(g, input).
132 132
        run();
133 133
    }
134 134
    catch (FormatError&)
135 135
      {
136 136
        ok = true;
137 137
      }
138 138
    check(ok,"FormatError exception should have occured");
139 139
  }
140 140

	
141 141
  {
142 142
    ListDigraph d;
143 143
    std::istringstream input(test_lgf_bad2);
144 144
    bool ok=false;
145 145
    try {
146 146
      digraphReader(d, input).
147 147
        run();
148 148
    }
149 149
    catch (FormatError&)
150 150
      {
151 151
        ok = true;
152 152
      }
153 153
    check(ok,"FormatError exception should have occured");
154 154
  }
155 155
  {
156 156
    ListGraph g;
157 157
    std::istringstream input(test_lgf_bad2);
158 158
    bool ok=false;
159 159
    try {
160 160
      graphReader(g, input).
161 161
        run();
162 162
    }
163 163
    catch (FormatError&)
164 164
      {
165 165
        ok = true;
166 166
      }
167 167
    check(ok,"FormatError exception should have occured");
168 168
  }
169 169
}
Ignore white space 512 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
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2011
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 <sstream>
20 20
#include <lemon/lp_skeleton.h>
21 21
#include "test_tools.h"
22 22
#include <lemon/tolerance.h>
23 23

	
24 24
#include <lemon/config.h>
25 25

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

	
30 30
#ifdef LEMON_HAVE_CPLEX
31 31
#include <lemon/cplex.h>
32 32
#endif
33 33

	
34 34
#ifdef LEMON_HAVE_SOPLEX
35 35
#include <lemon/soplex.h>
36 36
#endif
37 37

	
38 38
#ifdef LEMON_HAVE_CLP
39 39
#include <lemon/clp.h>
40 40
#endif
41 41

	
42 42
using namespace lemon;
43 43

	
44 44
void lpTest(LpSolver& lp)
45 45
{
46 46

	
47 47
  typedef LpSolver LP;
48 48

	
49 49
  std::vector<LP::Col> x(10);
50 50
  //  for(int i=0;i<10;i++) x.push_back(lp.addCol());
51 51
  lp.addColSet(x);
52 52
  lp.colLowerBound(x,1);
53 53
  lp.colUpperBound(x,1);
54 54
  lp.colBounds(x,1,2);
55 55

	
56 56
  std::vector<LP::Col> y(10);
57 57
  lp.addColSet(y);
58 58

	
59 59
  lp.colLowerBound(y,1);
60 60
  lp.colUpperBound(y,1);
61 61
  lp.colBounds(y,1,2);
62 62

	
63 63
  std::map<int,LP::Col> z;
64 64

	
65 65
  z.insert(std::make_pair(12,INVALID));
66 66
  z.insert(std::make_pair(2,INVALID));
67 67
  z.insert(std::make_pair(7,INVALID));
68 68
  z.insert(std::make_pair(5,INVALID));
69 69

	
70 70
  lp.addColSet(z);
71 71

	
72 72
  lp.colLowerBound(z,1);
73 73
  lp.colUpperBound(z,1);
74 74
  lp.colBounds(z,1,2);
75 75

	
76 76
  {
77 77
    LP::Expr e,f,g;
78 78
    LP::Col p1,p2,p3,p4,p5;
79 79
    LP::Constr c;
80 80

	
81 81
    p1=lp.addCol();
82 82
    p2=lp.addCol();
83 83
    p3=lp.addCol();
84 84
    p4=lp.addCol();
85 85
    p5=lp.addCol();
86 86

	
87 87
    e[p1]=2;
88 88
    *e=12;
89 89
    e[p1]+=2;
90 90
    *e+=12;
91 91
    e[p1]-=2;
92 92
    *e-=12;
93 93

	
94 94
    e=2;
95 95
    e=2.2;
96 96
    e=p1;
97 97
    e=f;
98 98

	
99 99
    e+=2;
100 100
    e+=2.2;
101 101
    e+=p1;
102 102
    e+=f;
103 103

	
104 104
    e-=2;
105 105
    e-=2.2;
106 106
    e-=p1;
107 107
    e-=f;
108 108

	
109 109
    e*=2;
110 110
    e*=2.2;
111 111
    e/=2;
112 112
    e/=2.2;
113 113

	
114 114
    e=((p1+p2)+(p1-p2)+(p1+12)+(12+p1)+(p1-12)+(12-p1)+
115 115
       (f+12)+(12+f)+(p1+f)+(f+p1)+(f+g)+
116 116
       (f-12)+(12-f)+(p1-f)+(f-p1)+(f-g)+
117 117
       2.2*f+f*2.2+f/2.2+
118 118
       2*f+f*2+f/2+
119 119
       2.2*p1+p1*2.2+p1/2.2+
120 120
       2*p1+p1*2+p1/2
121 121
       );
122 122

	
123 123

	
124 124
    c = (e  <= f  );
125 125
    c = (e  <= 2.2);
126 126
    c = (e  <= 2  );
127 127
    c = (e  <= p1 );
128 128
    c = (2.2<= f  );
129 129
    c = (2  <= f  );
130 130
    c = (p1 <= f  );
131 131
    c = (p1 <= p2 );
132 132
    c = (p1 <= 2.2);
133 133
    c = (p1 <= 2  );
134 134
    c = (2.2<= p2 );
135 135
    c = (2  <= p2 );
136 136

	
137 137
    c = (e  >= f  );
138 138
    c = (e  >= 2.2);
139 139
    c = (e  >= 2  );
140 140
    c = (e  >= p1 );
141 141
    c = (2.2>= f  );
142 142
    c = (2  >= f  );
143 143
    c = (p1 >= f  );
144 144
    c = (p1 >= p2 );
145 145
    c = (p1 >= 2.2);
146 146
    c = (p1 >= 2  );
147 147
    c = (2.2>= p2 );
148 148
    c = (2  >= p2 );
149 149

	
150 150
    c = (e  == f  );
151 151
    c = (e  == 2.2);
152 152
    c = (e  == 2  );
153 153
    c = (e  == p1 );
154 154
    c = (2.2== f  );
155 155
    c = (2  == f  );
156 156
    c = (p1 == f  );
157 157
    //c = (p1 == p2 );
158 158
    c = (p1 == 2.2);
159 159
    c = (p1 == 2  );
160 160
    c = (2.2== p2 );
161 161
    c = (2  == p2 );
162 162

	
163 163
    c = ((2 <= e) <= 3);
164 164
    c = ((2 <= p1) <= 3);
165 165

	
166 166
    c = ((2 >= e) >= 3);
167 167
    c = ((2 >= p1) >= 3);
168 168

	
169 169
    { //Tests for #430
170 170
      LP::Col v=lp.addCol();
171 171
      LP::Constr c = v >= -3;
172 172
      c = c <= 4;
173 173
      LP::Constr c2;
174 174
      c2 = -3 <= v <= 4;
175 175
    }
176 176

	
177 177
    e[x[3]]=2;
178 178
    e[x[3]]=4;
179 179
    e[x[3]]=1;
180 180
    *e=12;
181 181

	
182 182
    lp.addRow(-LP::INF,e,23);
183 183
    lp.addRow(-LP::INF,3.0*(x[1]+x[2]/2)-x[3],23);
184 184
    lp.addRow(-LP::INF,3.0*(x[1]+x[2]*2-5*x[3]+12-x[4]/3)+2*x[4]-4,23);
185 185

	
186 186
    lp.addRow(x[1]+x[3]<=x[5]-3);
187 187
    lp.addRow((-7<=x[1]+x[3]-12)<=3);
188 188
    lp.addRow(x[1]<=x[5]);
189 189

	
190 190
    std::ostringstream buf;
191 191

	
192 192

	
193 193
    e=((p1+p2)+(p1-0.99*p2));
194 194
    //e.prettyPrint(std::cout);
195 195
    //(e<=2).prettyPrint(std::cout);
196 196
    double tolerance=0.001;
197 197
    e.simplify(tolerance);
198 198
    buf << "Coeff. of p2 should be 0.01";
199 199
    check(e[p2]>0, buf.str());
200 200

	
201 201
    tolerance=0.02;
202 202
    e.simplify(tolerance);
203 203
    buf << "Coeff. of p2 should be 0";
204 204
    check(const_cast<const LpSolver::Expr&>(e)[p2]==0, buf.str());
205 205

	
206 206
    //Test for clone/new
207 207
    LP* lpnew = lp.newSolver();
208 208
    LP* lpclone = lp.cloneSolver();
209 209
    delete lpnew;
210 210
    delete lpclone;
211 211

	
212 212
  }
213 213

	
214 214
  {
215 215
    LP::DualExpr e,f,g;
216 216
    LP::Row p1 = INVALID, p2 = INVALID, p3 = INVALID,
217 217
      p4 = INVALID, p5 = INVALID;
218 218

	
219 219
    e[p1]=2;
220 220
    e[p1]+=2;
221 221
    e[p1]-=2;
222 222

	
223 223
    e=p1;
224 224
    e=f;
225 225

	
226 226
    e+=p1;
227 227
    e+=f;
228 228

	
229 229
    e-=p1;
230 230
    e-=f;
231 231

	
232 232
    e*=2;
233 233
    e*=2.2;
234 234
    e/=2;
235 235
    e/=2.2;
236 236

	
237 237
    e=((p1+p2)+(p1-p2)+
238 238
       (p1+f)+(f+p1)+(f+g)+
239 239
       (p1-f)+(f-p1)+(f-g)+
240 240
       2.2*f+f*2.2+f/2.2+
241 241
       2*f+f*2+f/2+
242 242
       2.2*p1+p1*2.2+p1/2.2+
243 243
       2*p1+p1*2+p1/2
244 244
       );
245 245
  }
246 246

	
247 247
}
248 248

	
249 249
void solveAndCheck(LpSolver& lp, LpSolver::ProblemType stat,
250 250
                   double exp_opt) {
251 251
  using std::string;
252 252
  lp.solve();
253 253

	
254 254
  std::ostringstream buf;
255 255
  buf << "PrimalType should be: " << int(stat) << int(lp.primalType());
256 256

	
257 257
  check(lp.primalType()==stat, buf.str());
258 258

	
259 259
  if (stat ==  LpSolver::OPTIMAL) {
260 260
    std::ostringstream sbuf;
261 261
    sbuf << "Wrong optimal value (" << lp.primal() <<") with "
0 comments (0 inline)