gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge
0 64 6
merge default
2 files changed with 3083 insertions and 1387 deletions:
↑ Collapse diff ↑
Ignore white space 6 line context
1
%!PS-Adobe-3.0 EPSF-3.0
2
%%BoundingBox: 15 18 829 570
3
%%HiResBoundingBox: 15.1913 18.4493 828.078 569.438
4
%%Creator: Karbon14 EPS Exportfilter 0.5
5
%%CreationDate: (04/15/06 15:20:26)
6
%%For: (Balazs Dezso) ()
7
%%Title: ()
8

	
9
/N {newpath} def
10
/C {closepath} def
11
/m {moveto} def
12
/c {curveto} def
13
/l {lineto} def
14
/s {stroke} def
15
/f {fill} def
16
/w {setlinewidth} def
17
/d {setdash} def
18
/r {setrgbcolor} def
19
/S {gsave} def
20
/R {grestore} def
21

	
22
N
23
251.402 32.047 m
24
532.945 293.946 814.484 555.844 814.484 555.844 c
25
[] 0 d 1 0 0 r 3.92814 w s
26

	
27
N
28
749.012 32.047 m
29
742.465 293.946 735.918 555.844 735.918 555.844 c
30
[] 0 d 0 0 0 r 1.96407 w s
31

	
32
N
33
539.492 32.047 m
34
637.703 293.946 735.918 555.844 735.918 555.844 c
35
[] 0 d 0 0 0 r 1.96407 w s
36

	
37
N
38
172.832 32.047 m
39
454.375 293.946 735.918 555.844 735.918 555.844 c
40
[] 0 d 0 0 0 r 1.96407 w s
41

	
42
N
43
107.355 32.047 m
44
421.637 293.946 735.918 555.844 735.918 555.844 c
45
[] 0 d 1 0 0 r 3.92814 w s
46

	
47
N
48
644.25 555.844 m
49
696.633 293.946 749.012 32.047 749.012 32.047 c
50
[] 0 d 0 0 0 r 1.96407 w s
51

	
52
N
53
474.016 555.844 m
54
611.516 293.946 749.012 32.047 749.012 32.047 c
55
[] 0 d 1 0 0 r 3.92814 w s
56

	
57
N
58
683.535 32.047 m
59
663.894 293.946 644.25 555.844 644.25 555.844 c
60
[] 0 d 0 0 0 r 1.96407 w s
61

	
62
N
63
120.453 555.844 m
64
401.992 293.946 683.535 32.047 683.535 32.047 c
65
[] 0 d 0 0 0 r 1.96407 w s
66

	
67
N
68
28.7853 555.844 m
69
356.16 293.946 683.535 32.047 683.535 32.047 c
70
[] 0 d 1 0 0 r 3.92814 w s
71

	
72
N
73
539.492 32.047 m
74
546.039 293.946 552.586 555.844 552.586 555.844 c
75
[] 0 d 1 0 0 r 3.92814 w s
76

	
77
N
78
316.875 32.047 m
79
349.613 293.946 382.351 555.844 382.351 555.844 c
80
[] 0 d 1 0 0 r 3.92814 w s
81

	
82
N
83
107.355 32.047 m
84
244.855 293.946 382.351 555.844 382.351 555.844 c
85
[] 0 d 0 0 0 r 1.96407 w s
86

	
87
N
88
290.687 555.844 m
89
375.805 293.946 460.922 32.047 460.922 32.047 c
90
[] 0 d 1 0 0 r 3.92814 w s
91

	
92
N
93
120.453 555.844 m
94
290.687 293.946 460.922 32.047 460.922 32.047 c
95
[] 0 d 0 0 0 r 1.96407 w s
96

	
97
N
98
172.832 32.047 m
99
146.64 293.946 120.453 555.844 120.453 555.844 c
100
[] 0 d 1 0 0 r 3.92814 w s
101

	
102
N
103
15.6913 555.844 m
104
15.6913 555.844 l
105
15.6913 548.614 21.5553 542.75 28.7853 542.75 c
106
36.0163 542.75 41.8833 548.614 41.8833 555.844 c
107
41.8833 563.075 36.0163 568.938 28.7853 568.938 c
108
21.5553 568.938 15.6913 563.075 15.6913 555.844 c
109
15.6913 555.844 l
110
C
111
S 0 0 0 r f R
112

	
113
N
114
16.8833 555.844 m
115
16.8833 555.844 l
116
16.8833 549.27 22.2113 543.942 28.7853 543.942 c
117
35.3593 543.942 40.6913 549.27 40.6913 555.844 c
118
40.6913 562.418 35.3593 567.747 28.7853 567.747 c
119
22.2113 567.747 16.8833 562.418 16.8833 555.844 c
120
16.8833 555.844 l
121
C
122
S 1 0.5 1 r f R
123

	
124
N
125
107.355 555.844 m
126
107.355 555.844 l
127
107.355 548.614 113.223 542.75 120.453 542.75 c
128
127.683 542.75 133.547 548.614 133.547 555.844 c
129
133.547 563.075 127.683 568.938 120.453 568.938 c
130
113.223 568.938 107.355 563.075 107.355 555.844 c
131
107.355 555.844 l
132
C
133
S 0 0 0 r f R
134

	
135
N
136
108.547 555.844 m
137
108.547 555.844 l
138
108.547 549.27 113.879 543.942 120.453 543.942 c
139
127.027 543.942 132.355 549.27 132.355 555.844 c
140
132.355 562.418 127.027 567.747 120.453 567.747 c
141
113.879 567.747 108.547 562.418 108.547 555.844 c
142
108.547 555.844 l
143
C
144
S 1 0 1 r f R
145

	
146
N
147
199.019 555.844 m
148
199.019 555.844 l
149
199.019 548.614 204.887 542.75 212.117 542.75 c
150
219.348 542.75 225.211 548.614 225.211 555.844 c
151
225.211 563.075 219.348 568.938 212.117 568.938 c
152
204.887 568.938 199.019 563.075 199.019 555.844 c
153
199.019 555.844 l
154
C
155
S 0 0 0 r f R
156

	
157
N
158
200.211 555.844 m
159
200.211 555.844 l
160
200.211 549.27 205.543 543.942 212.117 543.942 c
161
218.691 543.942 224.019 549.27 224.019 555.844 c
162
224.019 562.418 218.691 567.747 212.117 567.747 c
163
205.543 567.747 200.211 562.418 200.211 555.844 c
164
200.211 555.844 l
165
C
166
S 1 0.5 1 r f R
167

	
168
N
169
277.59 555.844 m
170
277.59 555.844 l
171
277.59 548.614 283.457 542.75 290.687 542.75 c
172
297.918 542.75 303.781 548.614 303.781 555.844 c
173
303.781 563.075 297.918 568.938 290.687 568.938 c
174
283.457 568.938 277.59 563.075 277.59 555.844 c
175
277.59 555.844 l
176
C
177
S 0 0 0 r f R
178

	
179
N
180
278.781 555.844 m
181
278.781 555.844 l
182
278.781 549.27 284.113 543.942 290.687 543.942 c
183
297.262 543.942 302.59 549.27 302.59 555.844 c
184
302.59 562.418 297.262 567.747 290.687 567.747 c
185
284.113 567.747 278.781 562.418 278.781 555.844 c
186
278.781 555.844 l
187
C
188
S 1 0 1 r f R
189

	
190
N
191
369.258 555.844 m
192
369.258 555.844 l
193
369.258 548.614 375.121 542.75 382.351 542.75 c
194
389.582 542.75 395.445 548.614 395.445 555.844 c
195
395.445 563.075 389.582 568.938 382.351 568.938 c
196
375.121 568.938 369.258 563.075 369.258 555.844 c
197
369.258 555.844 l
198
C
199
S 0 0 0 r f R
200

	
201
N
202
370.445 555.844 m
203
370.445 555.844 l
204
370.445 549.27 375.777 543.942 382.351 543.942 c
205
388.926 543.942 394.258 549.27 394.258 555.844 c
206
394.258 562.418 388.926 567.747 382.351 567.747 c
207
375.777 567.747 370.445 562.418 370.445 555.844 c
208
370.445 555.844 l
209
C
210
S 1 0 1 r f R
211

	
212
N
213
460.922 555.844 m
214
460.922 555.844 l
215
460.922 548.614 466.785 542.75 474.016 542.75 c
216
481.246 542.75 487.109 548.614 487.109 555.844 c
217
487.109 563.075 481.246 568.938 474.016 568.938 c
218
466.785 568.938 460.922 563.075 460.922 555.844 c
219
460.922 555.844 l
220
C
221
S 0 0 0 r f R
222

	
223
N
224
462.113 555.844 m
225
462.113 555.844 l
226
462.113 549.27 467.441 543.942 474.016 543.942 c
227
480.59 543.942 485.922 549.27 485.922 555.844 c
228
485.922 562.418 480.59 567.747 474.016 567.747 c
229
467.441 567.747 462.113 562.418 462.113 555.844 c
230
462.113 555.844 l
231
C
232
S 1 0.5 1 r f R
233

	
234
N
235
539.492 555.844 m
236
539.492 555.844 l
237
539.492 548.614 545.355 542.75 552.586 542.75 c
238
559.816 542.75 565.68 548.614 565.68 555.844 c
239
565.68 563.075 559.816 568.938 552.586 568.938 c
240
545.355 568.938 539.492 563.075 539.492 555.844 c
241
539.492 555.844 l
242
C
243
S 0 0 0 r f R
244

	
245
N
246
540.683 555.844 m
247
540.683 555.844 l
248
540.683 549.27 546.012 543.942 552.586 543.942 c
249
559.16 543.942 564.492 549.27 564.492 555.844 c
250
564.492 562.418 559.16 567.747 552.586 567.747 c
251
546.012 567.747 540.683 562.418 540.683 555.844 c
252
540.683 555.844 l
253
C
254
S 1 0 1 r f R
255

	
256
N
257
631.156 555.844 m
258
631.156 555.844 l
259
631.156 548.614 637.019 542.75 644.25 542.75 c
260
651.48 542.75 657.348 548.614 657.348 555.844 c
261
657.348 563.075 651.48 568.938 644.25 568.938 c
262
637.019 568.938 631.156 563.075 631.156 555.844 c
263
631.156 555.844 l
264
C
265
S 0 0 0 r f R
266

	
267
N
268
632.348 555.844 m
269
632.348 555.844 l
270
632.348 549.27 637.676 543.942 644.25 543.942 c
271
650.824 543.942 656.156 549.27 656.156 555.844 c
272
656.156 562.418 650.824 567.747 644.25 567.747 c
273
637.676 567.747 632.348 562.418 632.348 555.844 c
274
632.348 555.844 l
275
C
276
S 1 0.5 1 r f R
277

	
278
N
279
722.82 555.844 m
280
722.82 555.844 l
281
722.82 548.614 728.687 542.75 735.918 542.75 c
282
743.149 542.75 749.012 548.614 749.012 555.844 c
283
749.012 563.075 743.149 568.938 735.918 568.938 c
284
728.687 568.938 722.82 563.075 722.82 555.844 c
285
722.82 555.844 l
286
C
287
S 0 0 0 r f R
288

	
289
N
290
724.012 555.844 m
291
724.012 555.844 l
292
724.012 549.27 729.344 543.942 735.918 543.942 c
293
742.492 543.942 747.82 549.27 747.82 555.844 c
294
747.82 562.418 742.492 567.747 735.918 567.747 c
295
729.344 567.747 724.012 562.418 724.012 555.844 c
296
724.012 555.844 l
297
C
298
S 1 0 1 r f R
299

	
300
N
301
801.391 555.844 m
302
801.391 555.844 l
303
801.391 548.614 807.254 542.75 814.484 542.75 c
304
821.715 542.75 827.578 548.614 827.578 555.844 c
305
827.578 563.075 821.715 568.938 814.484 568.938 c
306
807.254 568.938 801.391 563.075 801.391 555.844 c
307
801.391 555.844 l
308
C
309
S 0 0 0 r f R
310

	
311
N
312
802.582 555.844 m
313
802.582 555.844 l
314
802.582 549.27 807.91 543.942 814.484 543.942 c
315
821.059 543.942 826.387 549.27 826.387 555.844 c
316
826.387 562.418 821.059 567.747 814.484 567.747 c
317
807.91 567.747 802.582 562.418 802.582 555.844 c
318
802.582 555.844 l
319
C
320
S 1 0 1 r f R
321

	
322
N
323
15.6913 32.047 m
324
15.6913 32.047 l
325
15.6913 24.8165 21.5553 18.9493 28.7853 18.9493 c
326
36.0163 18.9493 41.8833 24.8165 41.8833 32.047 c
327
41.8833 39.2775 36.0163 45.1407 28.7853 45.1407 c
328
21.5553 45.1407 15.6913 39.2775 15.6913 32.047 c
329
15.6913 32.047 l
330
C
331
S 0 0 0 r f R
332

	
333
N
334
16.8833 32.047 m
335
16.8833 32.047 l
336
16.8833 25.4728 22.2113 20.1407 28.7853 20.1407 c
337
35.3593 20.1407 40.6913 25.4728 40.6913 32.047 c
338
40.6913 38.6212 35.3593 43.9493 28.7853 43.9493 c
339
22.2113 43.9493 16.8833 38.6212 16.8833 32.047 c
340
16.8833 32.047 l
341
C
342
S 0.5 0.5 1 r f R
343

	
344
N
345
94.2623 32.047 m
346
94.2623 32.047 l
347
94.2623 24.8165 100.125 18.9493 107.355 18.9493 c
348
114.586 18.9493 120.453 24.8165 120.453 32.047 c
349
120.453 39.2775 114.586 45.1407 107.355 45.1407 c
350
100.125 45.1407 94.2623 39.2775 94.2623 32.047 c
351
94.2623 32.047 l
352
C
353
S 0 0 0 r f R
354

	
355
N
356
95.4533 32.047 m
357
95.4533 32.047 l
358
95.4533 25.4728 100.781 20.1407 107.355 20.1407 c
359
113.93 20.1407 119.262 25.4728 119.262 32.047 c
360
119.262 38.6212 113.93 43.9493 107.355 43.9493 c
361
100.781 43.9493 95.4533 38.6212 95.4533 32.047 c
362
95.4533 32.047 l
363
C
364
S 0.5 0.5 1 r f R
365

	
366
N
367
159.734 32.047 m
368
159.734 32.047 l
369
159.734 24.8165 165.601 18.9493 172.832 18.9493 c
370
180.062 18.9493 185.926 24.8165 185.926 32.047 c
371
185.926 39.2775 180.062 45.1407 172.832 45.1407 c
372
165.601 45.1407 159.734 39.2775 159.734 32.047 c
373
159.734 32.047 l
374
C
375
S 0 0 0 r f R
376

	
377
N
378
160.926 32.047 m
379
160.926 32.047 l
380
160.926 25.4728 166.258 20.1407 172.832 20.1407 c
381
179.406 20.1407 184.734 25.4728 184.734 32.047 c
382
184.734 38.6212 179.406 43.9493 172.832 43.9493 c
383
166.258 43.9493 160.926 38.6212 160.926 32.047 c
384
160.926 32.047 l
385
C
386
S 0.5 0.5 1 r f R
387

	
388
N
389
238.305 32.047 m
390
238.305 32.047 l
391
238.305 24.8165 244.172 18.9493 251.402 18.9493 c
392
258.633 18.9493 264.496 24.8165 264.496 32.047 c
393
264.496 39.2775 258.633 45.1407 251.402 45.1407 c
394
244.172 45.1407 238.305 39.2775 238.305 32.047 c
395
238.305 32.047 l
396
C
397
S 0 0 0 r f R
398

	
399
N
400
239.496 32.047 m
401
239.496 32.047 l
402
239.496 25.4728 244.828 20.1407 251.402 20.1407 c
403
257.976 20.1407 263.305 25.4728 263.305 32.047 c
404
263.305 38.6212 257.976 43.9493 251.402 43.9493 c
405
244.828 43.9493 239.496 38.6212 239.496 32.047 c
406
239.496 32.047 l
407
C
408
S 0.5 0.5 1 r f R
409

	
410
N
411
303.781 32.047 m
412
303.781 32.047 l
413
303.781 24.8165 309.644 18.9493 316.875 18.9493 c
414
324.105 18.9493 329.973 24.8165 329.973 32.047 c
415
329.973 39.2775 324.105 45.1407 316.875 45.1407 c
416
309.644 45.1407 303.781 39.2775 303.781 32.047 c
417
303.781 32.047 l
418
C
419
S 0 0 0 r f R
420

	
421
N
422
304.973 32.047 m
423
304.973 32.047 l
424
304.973 25.4728 310.301 20.1407 316.875 20.1407 c
425
323.449 20.1407 328.781 25.4728 328.781 32.047 c
426
328.781 38.6212 323.449 43.9493 316.875 43.9493 c
427
310.301 43.9493 304.973 38.6212 304.973 32.047 c
428
304.973 32.047 l
429
C
430
S 0.5 0.5 1 r f R
431

	
432
N
433
382.351 32.047 m
434
382.351 32.047 l
435
382.351 24.8165 388.215 18.9493 395.445 18.9493 c
436
402.676 18.9493 408.543 24.8165 408.543 32.047 c
437
408.543 39.2775 402.676 45.1407 395.445 45.1407 c
438
388.215 45.1407 382.351 39.2775 382.351 32.047 c
439
382.351 32.047 l
440
C
441
S 0 0 0 r f R
442

	
443
N
444
383.543 32.047 m
445
383.543 32.047 l
446
383.543 25.4728 388.871 20.1407 395.445 20.1407 c
447
402.019 20.1407 407.351 25.4728 407.351 32.047 c
448
407.351 38.6212 402.019 43.9493 395.445 43.9493 c
449
388.871 43.9493 383.543 38.6212 383.543 32.047 c
450
383.543 32.047 l
451
C
452
S 0.5 0.5 1 r f R
453

	
454
N
455
447.828 32.047 m
456
447.828 32.047 l
457
447.828 24.8165 453.691 18.9493 460.922 18.9493 c
458
468.152 18.9493 474.016 24.8165 474.016 32.047 c
459
474.016 39.2775 468.152 45.1407 460.922 45.1407 c
460
453.691 45.1407 447.828 39.2775 447.828 32.047 c
461
447.828 32.047 l
462
C
463
S 0 0 0 r f R
464

	
465
N
466
449.016 32.047 m
467
449.016 32.047 l
468
449.016 25.4728 454.348 20.1407 460.922 20.1407 c
469
467.496 20.1407 472.824 25.4728 472.824 32.047 c
470
472.824 38.6212 467.496 43.9493 460.922 43.9493 c
471
454.348 43.9493 449.016 38.6212 449.016 32.047 c
472
449.016 32.047 l
473
C
474
S 0.5 0.5 1 r f R
475

	
476
N
477
526.394 32.047 m
478
526.394 32.047 l
479
526.394 24.8165 532.262 18.9493 539.492 18.9493 c
480
546.723 18.9493 552.586 24.8165 552.586 32.047 c
481
552.586 39.2775 546.723 45.1407 539.492 45.1407 c
482
532.262 45.1407 526.394 39.2775 526.394 32.047 c
483
526.394 32.047 l
484
C
485
S 0 0 0 r f R
486

	
487
N
488
527.586 32.047 m
489
527.586 32.047 l
490
527.586 25.4728 532.918 20.1407 539.492 20.1407 c
491
546.066 20.1407 551.394 25.4728 551.394 32.047 c
492
551.394 38.6212 546.066 43.9493 539.492 43.9493 c
493
532.918 43.9493 527.586 38.6212 527.586 32.047 c
494
527.586 32.047 l
495
C
496
S 0.5 0.5 1 r f R
497

	
498
N
499
591.871 32.047 m
500
591.871 32.047 l
501
591.871 24.8165 597.734 18.9493 604.965 18.9493 c
502
612.195 18.9493 618.062 24.8165 618.062 32.047 c
503
618.062 39.2775 612.195 45.1407 604.965 45.1407 c
504
597.734 45.1407 591.871 39.2775 591.871 32.047 c
505
591.871 32.047 l
506
C
507
S 0 0 0 r f R
508

	
509
N
510
593.062 32.047 m
511
593.062 32.047 l
512
593.062 25.4728 598.39 20.1407 604.965 20.1407 c
513
611.539 20.1407 616.871 25.4728 616.871 32.047 c
514
616.871 38.6212 611.539 43.9493 604.965 43.9493 c
515
598.39 43.9493 593.062 38.6212 593.062 32.047 c
516
593.062 32.047 l
517
C
518
S 0.5 0.5 1 r f R
519

	
520
N
521
670.441 32.047 m
522
670.441 32.047 l
523
670.441 24.8165 676.305 18.9493 683.535 18.9493 c
524
690.766 18.9493 696.633 24.8165 696.633 32.047 c
525
696.633 39.2775 690.766 45.1407 683.535 45.1407 c
526
676.305 45.1407 670.441 39.2775 670.441 32.047 c
527
670.441 32.047 l
528
C
529
S 0 0 0 r f R
530

	
531
N
532
671.633 32.047 m
533
671.633 32.047 l
534
671.633 25.4728 676.961 20.1407 683.535 20.1407 c
535
690.109 20.1407 695.441 25.4728 695.441 32.047 c
536
695.441 38.6212 690.109 43.9493 683.535 43.9493 c
537
676.961 43.9493 671.633 38.6212 671.633 32.047 c
538
671.633 32.047 l
539
C
540
S 0 0 1 r f R
541

	
542
N
543
735.918 32.047 m
544
735.918 32.047 l
545
735.918 24.8165 741.781 18.9493 749.012 18.9493 c
546
756.242 18.9493 762.106 24.8165 762.106 32.047 c
547
762.106 39.2775 756.242 45.1407 749.012 45.1407 c
548
741.781 45.1407 735.918 39.2775 735.918 32.047 c
549
735.918 32.047 l
550
C
551
S 0 0 0 r f R
552

	
553
N
554
737.105 32.047 m
555
737.105 32.047 l
556
737.105 25.4728 742.437 20.1407 749.012 20.1407 c
557
755.586 20.1407 760.914 25.4728 760.914 32.047 c
558
760.914 38.6212 755.586 43.9493 749.012 43.9493 c
559
742.437 43.9493 737.105 38.6212 737.105 32.047 c
560
737.105 32.047 l
561
C
562
S 0 0 1 r f R
563

	
564
N
565
801.391 32.047 m
566
801.391 32.047 l
567
801.391 24.8165 807.254 18.9493 814.484 18.9493 c
568
821.715 18.9493 827.578 24.8165 827.578 32.047 c
569
827.578 39.2775 821.715 45.1407 814.484 45.1407 c
570
807.254 45.1407 801.391 39.2775 801.391 32.047 c
571
801.391 32.047 l
572
C
573
S 0 0 0 r f R
574

	
575
N
576
802.582 32.047 m
577
802.582 32.047 l
578
802.582 25.4728 807.91 20.1407 814.484 20.1407 c
579
821.059 20.1407 826.387 25.4728 826.387 32.047 c
580
826.387 38.6212 821.059 43.9493 814.484 43.9493 c
581
807.91 43.9493 802.582 38.6212 802.582 32.047 c
582
802.582 32.047 l
583
C
584
S 0.5 0.5 1 r f R
585

	
586
%%EOF
1
%!PS-Adobe-2.0 EPSF-2.0
2
%%Creator: LEMON, graphToEps()
3
%%CreationDate: Tue Nov 15 16:51:43 2005
4
%%BoundingBox: 0 0 842 596
5
%%EndComments
6
/lb { setlinewidth setrgbcolor newpath moveto
7
      4 2 roll 1 index 1 index curveto stroke } bind def
8
/l { setlinewidth setrgbcolor newpath moveto lineto stroke } bind def
9
/c { newpath dup 3 index add 2 index moveto 0 360 arc closepath } bind def
10
/sq { newpath 2 index 1 index add 2 index 2 index add moveto
11
      2 index 1 index sub 2 index 2 index add lineto
12
      2 index 1 index sub 2 index 2 index sub lineto
13
      2 index 1 index add 2 index 2 index sub lineto
14
      closepath pop pop pop} bind def
15
/di { newpath 2 index 1 index add 2 index moveto
16
      2 index             2 index 2 index add lineto
17
      2 index 1 index sub 2 index             lineto
18
      2 index             2 index 2 index sub lineto
19
      closepath pop pop pop} bind def
20
/nc { 0 0 0 setrgbcolor 5 index 5 index 5 index c fill
21
     setrgbcolor 1.1 div c fill
22
   } bind def
23
/nsq { 0 0 0 setrgbcolor 5 index 5 index 5 index sq fill
24
     setrgbcolor 1.1 div sq fill
25
   } bind def
26
/ndi { 0 0 0 setrgbcolor 5 index 5 index 5 index di fill
27
     setrgbcolor 1.1 div di fill
28
   } bind def
29
/arrl 1 def
30
/arrw 0.3 def
31
/lrl { 2 index mul exch 2 index mul exch rlineto pop} bind def
32
/arr { setrgbcolor /y1 exch def /x1 exch def /dy exch def /dx exch def
33
       /w exch def /len exch def
34
       newpath x1 dy w 2 div mul add y1 dx w 2 div mul sub moveto
35
       len w sub arrl sub dx dy lrl
36
       arrw dy dx neg lrl
37
       dx arrl w add mul dy w 2 div arrw add mul sub
38
       dy arrl w add mul dx w 2 div arrw add mul add rlineto
39
       dx arrl w add mul neg dy w 2 div arrw add mul sub
40
       dy arrl w add mul neg dx w 2 div arrw add mul add rlineto
41
       arrw dy dx neg lrl
42
       len w sub arrl sub neg dx dy lrl
43
       closepath fill } bind def
44
/cshow { 2 index 2 index moveto dup stringwidth pop
45
         neg 2 div fosi .35 mul neg rmoveto show pop pop} def
46

	
47
gsave
48
90 rotate
49
0 -842 translate
50
71.6378 15 translate
51
0.389093 dup scale
52
90 rotate
53
1197.47 -613.138 translate
54
%Edges:
55
gsave
56
513.857 -446.322 296.569 -487.43 79.2808 -528.539 0 0 0 2 lb
57
513.857 -446.322 575.52 -315.655 637.183 -184.989 0 0 0 2 lb
58
393.468 566.711 494.771 434.577 596.074 302.442 0 0 0 2 lb
59
393.468 566.711 155.625 579.925 -82.2171 593.138 0 0 0 2 lb
60
393.468 566.711 251.056 450.726 108.644 334.741 0 0 0 2 lb
61
869.153 52.8539 732.613 177.648 596.074 302.442 0 0 0 2 lb
62
869.153 52.8539 753.168 -66.0676 637.183 -184.989 0 0 0 2 lb
63
-82.2171 593.138 -91.0261 346.487 -99.8351 99.8351 0 0 0 2 lb
64
-663.61 546.157 -753.168 394.936 -842.726 243.715 0 0 0 2 lb
65
-663.61 546.157 -574.052 437.513 -484.494 328.869 0 0 0 2 lb
66
-1077.63 161.498 -960.178 202.606 -842.726 243.715 0 0 0 2 lb
67
-1077.63 161.498 -968.987 66.0674 -860.344 -29.3633 0 0 0 2 lb
68
-1177.47 -234.906 -1029.18 -381.722 -880.898 -528.539 0 0 0 2 lb
69
-1177.47 -234.906 -1018.91 -132.135 -860.344 -29.3633 0 0 0 2 lb
70
-880.898 -528.539 -744.359 -387.595 -607.82 -246.651 0 0 0 2 lb
71
-499.175 -499.175 -355.295 -475.685 -211.415 -452.194 0 0 0 2 lb
72
-499.175 -499.175 -553.498 -372.913 -607.82 -246.651 0 0 0 2 lb
73
-499.175 -499.175 -386.587 -315.087 -274 -131 0 0 0 2 lb
74
79.2808 -528.539 -66.0671 -490.366 -211.415 -452.194 0 0 0 2 lb
75
637.183 -184.989 421.363 -253.993 205.543 -322.996 0 0 0 2 lb
76
205.543 -322.996 162.966 -226.097 120.389 -129.198 0 0 0 2 lb
77
399.34 88.0898 259.865 -20.5541 120.389 -129.198 0 0 0 2 lb
78
399.34 88.0898 253.992 211.415 108.644 334.741 0 0 0 2 lb
79
-842.726 243.715 -471.281 171.775 -99.8351 99.8351 0 0 0 2 lb
80
-842.726 243.715 -558.363 56.3575 -274 -131 0 0 0 2 lb
81
-860.344 -29.3633 -734.082 -138.007 -607.82 -246.651 0 0 0 2 lb
82
-211.415 -452.194 -45.513 -290.696 120.389 -129.198 0 0 0 2 lb
83
-99.8351 99.8351 4.40445 217.288 108.644 334.741 0 0 0 2 lb
84
-99.8351 99.8351 -292.165 214.352 -484.494 328.869 0 0 0 2 lb
85
120.389 -129.198 -76.8055 -130.099 -274 -131 0 0 0 2 lb
86
grestore
87
%Nodes:
88
gsave
89
-274 -131 20 1 0 0 nc
90
-607.82 -246.651 20 1 0 0 nc
91
-484.494 328.869 20 0 0 1 nc
92
108.644 334.741 20 0 0 1 nc
93
120.389 -129.198 20 0 0 1 nc
94
-99.8351 99.8351 20 1 0 0 nc
95
-211.415 -452.194 20 1 0 0 nc
96
-860.344 -29.3633 20 0 0 1 nc
97
-842.726 243.715 20 0 0 1 nc
98
399.34 88.0898 20 1 0 0 nc
99
205.543 -322.996 20 1 0 0 nc
100
637.183 -184.989 20 0 0 1 nc
101
79.2808 -528.539 20 0 0 1 nc
102
-499.175 -499.175 20 0 0 1 nc
103
-880.898 -528.539 20 0 0 1 nc
104
-1177.47 -234.906 20 1 0 0 nc
105
-1077.63 161.498 20 1 0 0 nc
106
-663.61 546.157 20 1 0 0 nc
107
-82.2171 593.138 20 0 0 1 nc
108
596.074 302.442 20 0 0 1 nc
109
869.153 52.8539 20 1 0 0 nc
110
393.468 566.711 20 1 0 0 nc
111
513.857 -446.322 20 1 0 0 nc
112
grestore
113
grestore
114
showpage
1
%!PS-Adobe-2.0 EPSF-2.0
2
%%Creator: LEMON, graphToEps()
3
%%CreationDate: Fri Nov  4 13:47:12 2005
4
%%BoundingBox: 0 0 842 596
5
%%EndComments
6
/lb { setlinewidth setrgbcolor newpath moveto
7
      4 2 roll 1 index 1 index curveto stroke } bind def
8
/l { setlinewidth setrgbcolor newpath moveto lineto stroke } bind def
9
/c { newpath dup 3 index add 2 index moveto 0 360 arc closepath } bind def
10
/sq { newpath 2 index 1 index add 2 index 2 index add moveto
11
      2 index 1 index sub 2 index 2 index add lineto
12
      2 index 1 index sub 2 index 2 index sub lineto
13
      2 index 1 index add 2 index 2 index sub lineto
14
      closepath pop pop pop} bind def
15
/di { newpath 2 index 1 index add 2 index moveto
16
      2 index             2 index 2 index add lineto
17
      2 index 1 index sub 2 index             lineto
18
      2 index             2 index 2 index sub lineto
19
      closepath pop pop pop} bind def
20
/nc { 0 0 0 setrgbcolor 5 index 5 index 5 index c fill
21
     setrgbcolor 1.1 div c fill
22
   } bind def
23
/nsq { 0 0 0 setrgbcolor 5 index 5 index 5 index sq fill
24
     setrgbcolor 1.1 div sq fill
25
   } bind def
26
/ndi { 0 0 0 setrgbcolor 5 index 5 index 5 index di fill
27
     setrgbcolor 1.1 div di fill
28
   } bind def
29
/arrl 1 def
30
/arrw 0.3 def
31
/lrl { 2 index mul exch 2 index mul exch rlineto pop} bind def
32
/arr { setrgbcolor /y1 exch def /x1 exch def /dy exch def /dx exch def
33
       /w exch def /len exch def
34
       newpath x1 dy w 2 div mul add y1 dx w 2 div mul sub moveto
35
       len w sub arrl sub dx dy lrl
36
       arrw dy dx neg lrl
37
       dx arrl w add mul dy w 2 div arrw add mul sub
38
       dy arrl w add mul dx w 2 div arrw add mul add rlineto
39
       dx arrl w add mul neg dy w 2 div arrw add mul sub
40
       dy arrl w add mul neg dx w 2 div arrw add mul add rlineto
41
       arrw dy dx neg lrl
42
       len w sub arrl sub neg dx dy lrl
43
       closepath fill } bind def
44
/cshow { 2 index 2 index moveto dup stringwidth pop
45
         neg 2 div fosi .35 mul neg rmoveto show pop pop} def
46

	
47
gsave
48
90 rotate
49
0 -842 translate
50
71.0944 15 translate
51
0.434694 dup scale
52
90 rotate
53
860.856 -588.349 translate
54
%Edges:
55
gsave
56
574.035 177.301 622.149 225.748 670.264 274.195 0 0 0 2 lb
57
694.579 115.483 682.421 194.839 670.264 274.195 0 0 0 2 lb
58
280.402 10.3938 246.402 -6.60595 212.403 -23.6057 0 0 0 2 lb
59
280.402 10.3938 283.493 -18.9695 286.584 -48.3327 0 0 0 2 lb
60
212.403 -23.6057 249.493 -35.9692 286.584 -48.3327 0 0 0 2 lb
61
286.584 -48.3327 326.765 -79.2414 366.947 -110.15 0 0 0 2 lb
62
286.584 -48.3327 278.857 -111.695 271.13 -175.058 0 0 0 2 lb
63
438.037 -88.514 417.946 -142.604 397.855 -196.694 0 0 0 2 lb
64
438.037 -88.514 402.492 -99.332 366.947 -110.15 0 0 0 2 lb
65
397.855 -196.694 382.401 -153.422 366.947 -110.15 0 0 0 2 lb
66
366.947 -110.15 319.038 -142.604 271.13 -175.058 0 0 0 2 lb
67
271.13 -175.058 274.221 -213.694 277.311 -252.33 0 0 0 2 lb
68
271.13 -175.058 238.675 -190.512 206.221 -205.967 0 0 0 2 lb
69
277.311 -252.33 241.766 -229.149 206.221 -205.967 0 0 0 2 lb
70
-840.856 -246.718 -804.351 -66.7145 -767.847 113.289 0 0 0 2 lb
71
-579.033 445.603 -673.44 279.446 -767.847 113.289 0 0 0 2 lb
72
-579.033 445.603 -524.906 302.104 -470.779 158.605 0 0 0 2 lb
73
-767.847 113.289 -619.313 135.947 -470.779 158.605 0 0 0 2 lb
74
906.312 201.403 946.592 42.798 986.873 -115.807 0 0 0 2 lb
75
906.312 201.403 834.562 91.8901 762.812 -17.6227 0 0 0 2 lb
76
986.873 -115.807 874.842 -66.7148 762.812 -17.6227 0 0 0 2 lb
77
-470.779 158.605 -390.218 50.3508 -309.657 -57.9033 0 0 0 2 lb
78
422.945 521.129 208.955 541.269 -5.03507 561.41 0 0 0 2 lb
79
422.945 521.129 376.371 417.911 329.797 314.692 0 0 0 2 lb
80
422.945 521.129 474.554 276.928 526.164 32.7279 0 0 0 2 lb
81
-5.03507 561.41 -36.5042 440.568 -67.9734 319.727 0 0 0 2 lb
82
329.797 314.692 130.912 317.209 -67.9734 319.727 0 0 0 2 lb
83
-67.9734 319.727 229.095 176.227 526.164 32.7279 0 0 0 2 lb
84
762.812 -17.6227 644.488 7.5526 526.164 32.7279 0 0 0 2 lb
85
762.812 -17.6227 746.448 -162.381 730.084 -307.139 0 0 0 2 lb
86
526.164 32.7279 470.779 -128.394 415.393 -289.516 0 0 0 2 lb
87
730.084 -307.139 572.738 -298.327 415.393 -289.516 0 0 0 2 lb
88
415.393 -289.516 173.71 -318.468 -67.9734 -347.42 0 0 0 2 lb
89
-67.9734 -347.42 -188.815 -202.662 -309.657 -57.9033 0 0 0 2 lb
90
-67.9734 -347.42 -195.758 -390.692 -323.543 -433.964 0 0 0 2 lb
91
-309.657 -57.9033 -424.775 -160.272 -539.894 -262.64 0 0 0 2 lb
92
-323.543 -433.964 -431.719 -348.302 -539.894 -262.64 0 0 0 2 lb
93
-26.6953 -19.9585 44.8558 -96.8093 116.407 -173.66 0 0 0 2 lb
94
-26.6953 -19.9585 87.2563 9.19185 201.208 38.3422 0 0 0 2 lb
95
-26.6953 -19.9585 -144.622 43.6422 -262.548 107.243 0 0 0 2 lb
96
-26.6953 -19.9585 -20.0703 56.8923 -13.4452 133.743 0 0 0 2 lb
97
116.407 -173.66 158.808 -67.6589 201.208 38.3422 0 0 0 2 lb
98
-262.548 107.243 -137.997 120.493 -13.4452 133.743 0 0 0 2 lb
99
-262.548 107.243 -221.472 176.144 -180.397 245.045 0 0 0 2 lb
100
-13.4452 133.743 -96.9211 189.394 -180.397 245.045 0 0 0 2 lb
101
-180.397 245.045 -142.256 345.099 -132.697 451.748 0 0 0 2 lb
102
-180.397 245.045 -170.838 351.694 -132.697 451.748 0 0 0 2 lb
103
-416.25 345.746 -274.474 398.747 -132.697 451.748 0 0 0 2 lb
104
-416.25 345.746 -393.725 457.048 -371.2 568.349 0 0 0 2 lb
105
-132.697 451.748 -251.948 510.048 -371.2 568.349 0 0 0 2 lb
106
670.264 274.195 629.188 409.347 588.113 544.499 0 0 0 2 lb
107
670.264 274.195 797.466 341.771 924.667 409.347 0 0 0 2 lb
108
588.113 544.499 756.39 476.923 924.667 409.347 0 0 0 2 lb
109
-689.204 -237.261 -614.799 -102.648 -567.302 43.6423 0 0 0 2 lb
110
-689.204 -237.261 -641.707 -90.9706 -567.302 43.6423 0 0 0 2 lb
111
grestore
112
%Nodes:
113
gsave
114
-567.302 43.6423 20 0 0 0 nc
115
-689.204 -237.261 20 0 0 0 nc
116
924.667 409.347 20 1 0 0 nc
117
588.113 544.499 20 1 0 0 nc
118
670.264 274.195 20 1 0 0 nc
119
-371.2 568.349 20 0 1 0 nc
120
-132.697 451.748 20 0 1 0 nc
121
-416.25 345.746 20 0 1 0 nc
122
-180.397 245.045 20 0 1 0 nc
123
-13.4452 133.743 20 0 1 0 nc
124
-262.548 107.243 20 0 1 0 nc
125
201.208 38.3422 20 0 1 0 nc
126
116.407 -173.66 20 0 1 0 nc
127
-26.6953 -19.9585 20 0 1 0 nc
128
-539.894 -262.64 20 0 0 1 nc
129
-323.543 -433.964 20 0 0 1 nc
130
-309.657 -57.9033 20 0 0 1 nc
131
-67.9734 -347.42 20 0 0 1 nc
132
415.393 -289.516 20 0 0 1 nc
133
730.084 -307.139 20 0 0 1 nc
134
526.164 32.7279 20 0 0 1 nc
135
762.812 -17.6227 20 0 0 1 nc
136
-67.9734 319.727 20 0 0 1 nc
137
329.797 314.692 20 0 0 1 nc
138
-5.03507 561.41 20 0 0 1 nc
139
422.945 521.129 20 0 0 1 nc
140
-470.779 158.605 20 0 0 1 nc
141
986.873 -115.807 20 0 0 1 nc
142
906.312 201.403 20 0 0 1 nc
143
-767.847 113.289 20 0 0 1 nc
144
-579.033 445.603 20 0 0 1 nc
145
-840.856 -246.718 20 0 0 1 nc
146
206.221 -205.967 20 1 1 0 nc
147
277.311 -252.33 20 1 1 0 nc
148
271.13 -175.058 20 1 1 0 nc
149
366.947 -110.15 20 1 1 0 nc
150
397.855 -196.694 20 1 1 0 nc
151
438.037 -88.514 20 1 1 0 nc
152
286.584 -48.3327 20 1 1 0 nc
153
212.403 -23.6057 20 1 1 0 nc
154
280.402 10.3938 20 1 1 0 nc
155
694.579 115.483 20 1 0 0 nc
156
574.035 177.301 20 1 0 0 nc
157
grestore
158
grestore
159
showpage
1
%!PS-Adobe-2.0 EPSF-2.0
2
%%Creator: LEMON, graphToEps()
3
%%CreationDate: Fri Nov  4 13:47:12 2005
4
%%BoundingBox: 0 0 842 596
5
%%EndComments
6
/lb { setlinewidth setrgbcolor newpath moveto
7
      4 2 roll 1 index 1 index curveto stroke } bind def
8
/l { setlinewidth setrgbcolor newpath moveto lineto stroke } bind def
9
/c { newpath dup 3 index add 2 index moveto 0 360 arc closepath } bind def
10
/sq { newpath 2 index 1 index add 2 index 2 index add moveto
11
      2 index 1 index sub 2 index 2 index add lineto
12
      2 index 1 index sub 2 index 2 index sub lineto
13
      2 index 1 index add 2 index 2 index sub lineto
14
      closepath pop pop pop} bind def
15
/di { newpath 2 index 1 index add 2 index moveto
16
      2 index             2 index 2 index add lineto
17
      2 index 1 index sub 2 index             lineto
18
      2 index             2 index 2 index sub lineto
19
      closepath pop pop pop} bind def
20
/nc { 0 0 0 setrgbcolor 5 index 5 index 5 index c fill
21
     setrgbcolor 1.1 div c fill
22
   } bind def
23
/nsq { 0 0 0 setrgbcolor 5 index 5 index 5 index sq fill
24
     setrgbcolor 1.1 div sq fill
25
   } bind def
26
/ndi { 0 0 0 setrgbcolor 5 index 5 index 5 index di fill
27
     setrgbcolor 1.1 div di fill
28
   } bind def
29
/arrl 1 def
30
/arrw 0.3 def
31
/lrl { 2 index mul exch 2 index mul exch rlineto pop} bind def
32
/arr { setrgbcolor /y1 exch def /x1 exch def /dy exch def /dx exch def
33
       /w exch def /len exch def
34
       newpath x1 dy w 2 div mul add y1 dx w 2 div mul sub moveto
35
       len w sub arrl sub dx dy lrl
36
       arrw dy dx neg lrl
37
       dx arrl w add mul dy w 2 div arrw add mul sub
38
       dy arrl w add mul dx w 2 div arrw add mul add rlineto
39
       dx arrl w add mul neg dy w 2 div arrw add mul sub
40
       dy arrl w add mul neg dx w 2 div arrw add mul add rlineto
41
       arrw dy dx neg lrl
42
       len w sub arrl sub neg dx dy lrl
43
       closepath fill } bind def
44
/cshow { 2 index 2 index moveto dup stringwidth pop
45
         neg 2 div fosi .35 mul neg rmoveto show pop pop} def
46

	
47
gsave
48
90 rotate
49
0 -842 translate
50
71.0944 15 translate
51
0.434694 dup scale
52
90 rotate
53
860.856 -588.349 translate
54
%Edges:
55
gsave
56
574.035 177.301 622.149 225.748 670.264 274.195 1 0 0 2 lb
57
694.579 115.483 682.421 194.839 670.264 274.195 1 0 0 2 lb
58
280.402 10.3938 246.402 -6.60595 212.403 -23.6057 0 0 1 2 lb
59
280.402 10.3938 283.493 -18.9695 286.584 -48.3327 0 0 1 2 lb
60
212.403 -23.6057 249.493 -35.9692 286.584 -48.3327 0 0 1 2 lb
61
286.584 -48.3327 326.765 -79.2414 366.947 -110.15 0 0 1 2 lb
62
286.584 -48.3327 278.857 -111.695 271.13 -175.058 0 0 1 2 lb
63
438.037 -88.514 417.946 -142.604 397.855 -196.694 0 0 1 2 lb
64
438.037 -88.514 402.492 -99.332 366.947 -110.15 0 0 1 2 lb
65
397.855 -196.694 382.401 -153.422 366.947 -110.15 0 0 1 2 lb
66
366.947 -110.15 319.038 -142.604 271.13 -175.058 0 0 1 2 lb
67
271.13 -175.058 274.221 -213.694 277.311 -252.33 0 0 1 2 lb
68
271.13 -175.058 238.675 -190.512 206.221 -205.967 0 0 1 2 lb
69
277.311 -252.33 241.766 -229.149 206.221 -205.967 0 0 1 2 lb
70
-840.856 -246.718 -804.351 -66.7145 -767.847 113.289 1 0 0 2 lb
71
-579.033 445.603 -673.44 279.446 -767.847 113.289 0 0 1 2 lb
72
-579.033 445.603 -524.906 302.104 -470.779 158.605 0 0 1 2 lb
73
-767.847 113.289 -619.313 135.947 -470.779 158.605 0 0 1 2 lb
74
906.312 201.403 946.592 42.798 986.873 -115.807 0 0 1 2 lb
75
906.312 201.403 834.562 91.8901 762.812 -17.6227 0 0 1 2 lb
76
986.873 -115.807 874.842 -66.7148 762.812 -17.6227 0 0 1 2 lb
77
-470.779 158.605 -390.218 50.3508 -309.657 -57.9033 1 0 0 2 lb
78
422.945 521.129 208.955 541.269 -5.03507 561.41 0 0 1 2 lb
79
422.945 521.129 376.371 417.911 329.797 314.692 0 0 1 2 lb
80
422.945 521.129 474.554 276.928 526.164 32.7279 0 0 1 2 lb
81
-5.03507 561.41 -36.5042 440.568 -67.9734 319.727 0 0 1 2 lb
82
329.797 314.692 130.912 317.209 -67.9734 319.727 0 0 1 2 lb
83
-67.9734 319.727 229.095 176.227 526.164 32.7279 0 0 1 2 lb
84
762.812 -17.6227 644.488 7.5526 526.164 32.7279 0 0 1 2 lb
85
762.812 -17.6227 746.448 -162.381 730.084 -307.139 0 0 1 2 lb
86
526.164 32.7279 470.779 -128.394 415.393 -289.516 0 0 1 2 lb
87
730.084 -307.139 572.738 -298.327 415.393 -289.516 0 0 1 2 lb
88
415.393 -289.516 173.71 -318.468 -67.9734 -347.42 1 0 0 2 lb
89
-67.9734 -347.42 -188.815 -202.662 -309.657 -57.9033 0 0 1 2 lb
90
-67.9734 -347.42 -195.758 -390.692 -323.543 -433.964 0 0 1 2 lb
91
-309.657 -57.9033 -424.775 -160.272 -539.894 -262.64 0 0 1 2 lb
92
-323.543 -433.964 -431.719 -348.302 -539.894 -262.64 0 0 1 2 lb
93
-26.6953 -19.9585 44.8558 -96.8093 116.407 -173.66 0 0 1 2 lb
94
-26.6953 -19.9585 87.2563 9.19185 201.208 38.3422 0 0 1 2 lb
95
-26.6953 -19.9585 -144.622 43.6422 -262.548 107.243 0 0 1 2 lb
96
-26.6953 -19.9585 -20.0703 56.8923 -13.4452 133.743 0 0 1 2 lb
97
116.407 -173.66 158.808 -67.6589 201.208 38.3422 0 0 1 2 lb
98
-262.548 107.243 -137.997 120.493 -13.4452 133.743 0 0 1 2 lb
99
-262.548 107.243 -221.472 176.144 -180.397 245.045 0 0 1 2 lb
100
-13.4452 133.743 -96.9211 189.394 -180.397 245.045 0 0 1 2 lb
101
-180.397 245.045 -142.256 345.099 -132.697 451.748 0 0 1 2 lb
102
-180.397 245.045 -170.838 351.694 -132.697 451.748 0 0 1 2 lb
103
-416.25 345.746 -274.474 398.747 -132.697 451.748 0 0 1 2 lb
104
-416.25 345.746 -393.725 457.048 -371.2 568.349 0 0 1 2 lb
105
-132.697 451.748 -251.948 510.048 -371.2 568.349 0 0 1 2 lb
106
670.264 274.195 629.188 409.347 588.113 544.499 0 0 1 2 lb
107
670.264 274.195 797.466 341.771 924.667 409.347 0 0 1 2 lb
108
588.113 544.499 756.39 476.923 924.667 409.347 0 0 1 2 lb
109
-689.204 -237.261 -614.799 -102.648 -567.302 43.6423 0 0 1 2 lb
110
-689.204 -237.261 -641.707 -90.9706 -567.302 43.6423 0 0 1 2 lb
111
grestore
112
%Nodes:
113
gsave
114
-567.302 43.6423 20 0 0 0 nc
115
-689.204 -237.261 20 0 0 0 nc
116
924.667 409.347 20 0 0 1 nc
117
588.113 544.499 20 0 0 1 nc
118
670.264 274.195 20 0 0 1 nc
119
-371.2 568.349 20 1 1 0 nc
120
-132.697 451.748 20 1 1 0 nc
121
-416.25 345.746 20 1 1 0 nc
122
-180.397 245.045 20 1 1 0 nc
123
-13.4452 133.743 20 1 1 0 nc
124
-262.548 107.243 20 1 1 0 nc
125
201.208 38.3422 20 1 1 0 nc
126
116.407 -173.66 20 1 1 0 nc
127
-26.6953 -19.9585 20 1 1 0 nc
128
-539.894 -262.64 20 0 0.5 0 nc
129
-323.543 -433.964 20 0 0.5 0 nc
130
-309.657 -57.9033 20 0 0.5 0 nc
131
-67.9734 -347.42 20 0 0.5 0 nc
132
415.393 -289.516 20 0.5 0 0 nc
133
730.084 -307.139 20 0.5 0 0 nc
134
526.164 32.7279 20 0.5 0 0 nc
135
762.812 -17.6227 20 0.5 0 0 nc
136
-67.9734 319.727 20 0.5 0 0 nc
137
329.797 314.692 20 0.5 0 0 nc
138
-5.03507 561.41 20 0.5 0 0 nc
139
422.945 521.129 20 0.5 0 0 nc
140
-470.779 158.605 20 0 1 1 nc
141
986.873 -115.807 20 0.5 0 0 nc
142
906.312 201.403 20 0.5 0 0 nc
143
-767.847 113.289 20 0 1 1 nc
144
-579.033 445.603 20 0 1 1 nc
145
-840.856 -246.718 20 1 0 1 nc
146
206.221 -205.967 20 0 0 0.5 nc
147
277.311 -252.33 20 0 0 0.5 nc
148
271.13 -175.058 20 0 0 0.5 nc
149
366.947 -110.15 20 0 0 0.5 nc
150
397.855 -196.694 20 0 0 0.5 nc
151
438.037 -88.514 20 0 0 0.5 nc
152
286.584 -48.3327 20 0 0 0.5 nc
153
212.403 -23.6057 20 0 0 0.5 nc
154
280.402 10.3938 20 0 0 0.5 nc
155
694.579 115.483 20 1 0 0 nc
156
574.035 177.301 20 0 1 0 nc
157
grestore
158
grestore
159
showpage
1
%!PS-Adobe-2.0 EPSF-2.0
2
%%Creator: LEMON, graphToEps()
3
%%CreationDate: Fri Nov  4 13:47:12 2005
4
%%BoundingBox: 0 0 842 596
5
%%EndComments
6
/lb { setlinewidth setrgbcolor newpath moveto
7
      4 2 roll 1 index 1 index curveto stroke } bind def
8
/l { setlinewidth setrgbcolor newpath moveto lineto stroke } bind def
9
/c { newpath dup 3 index add 2 index moveto 0 360 arc closepath } bind def
10
/sq { newpath 2 index 1 index add 2 index 2 index add moveto
11
      2 index 1 index sub 2 index 2 index add lineto
12
      2 index 1 index sub 2 index 2 index sub lineto
13
      2 index 1 index add 2 index 2 index sub lineto
14
      closepath pop pop pop} bind def
15
/di { newpath 2 index 1 index add 2 index moveto
16
      2 index             2 index 2 index add lineto
17
      2 index 1 index sub 2 index             lineto
18
      2 index             2 index 2 index sub lineto
19
      closepath pop pop pop} bind def
20
/nc { 0 0 0 setrgbcolor 5 index 5 index 5 index c fill
21
     setrgbcolor 1.1 div c fill
22
   } bind def
23
/nsq { 0 0 0 setrgbcolor 5 index 5 index 5 index sq fill
24
     setrgbcolor 1.1 div sq fill
25
   } bind def
26
/ndi { 0 0 0 setrgbcolor 5 index 5 index 5 index di fill
27
     setrgbcolor 1.1 div di fill
28
   } bind def
29
/arrl 1 def
30
/arrw 0.3 def
31
/lrl { 2 index mul exch 2 index mul exch rlineto pop} bind def
32
/arr { setrgbcolor /y1 exch def /x1 exch def /dy exch def /dx exch def
33
       /w exch def /len exch def
34
       newpath x1 dy w 2 div mul add y1 dx w 2 div mul sub moveto
35
       len w sub arrl sub dx dy lrl
36
       arrw dy dx neg lrl
37
       dx arrl w add mul dy w 2 div arrw add mul sub
38
       dy arrl w add mul dx w 2 div arrw add mul add rlineto
39
       dx arrl w add mul neg dy w 2 div arrw add mul sub
40
       dy arrl w add mul neg dx w 2 div arrw add mul add rlineto
41
       arrw dy dx neg lrl
42
       len w sub arrl sub neg dx dy lrl
43
       closepath fill } bind def
44
/cshow { 2 index 2 index moveto dup stringwidth pop
45
         neg 2 div fosi .35 mul neg rmoveto show pop pop} def
46

	
47
gsave
48
90 rotate
49
0 -842 translate
50
71.0944 15 translate
51
0.434694 dup scale
52
90 rotate
53
860.856 -588.349 translate
54
%Edges:
55
gsave
56
574.035 177.301 622.149 225.748 670.264 274.195 0 1 0 5 lb
57
694.579 115.483 682.421 194.839 670.264 274.195 1 0 0 5 lb
58
280.402 10.3938 246.402 -6.60595 212.403 -23.6057 1 1 0.5 5 lb
59
280.402 10.3938 283.493 -18.9695 286.584 -48.3327 1 1 0.5 5 lb
60
212.403 -23.6057 249.493 -35.9692 286.584 -48.3327 1 1 0.5 5 lb
61
286.584 -48.3327 326.765 -79.2414 366.947 -110.15 1 0.5 1 5 lb
62
286.584 -48.3327 278.857 -111.695 271.13 -175.058 1 0.5 1 5 lb
63
438.037 -88.514 417.946 -142.604 397.855 -196.694 0.5 0.5 1 5 lb
64
438.037 -88.514 402.492 -99.332 366.947 -110.15 0.5 0.5 1 5 lb
65
397.855 -196.694 382.401 -153.422 366.947 -110.15 0.5 0.5 1 5 lb
66
366.947 -110.15 319.038 -142.604 271.13 -175.058 1 0.5 1 5 lb
67
271.13 -175.058 274.221 -213.694 277.311 -252.33 0.5 1 1 5 lb
68
271.13 -175.058 238.675 -190.512 206.221 -205.967 0.5 1 1 5 lb
69
277.311 -252.33 241.766 -229.149 206.221 -205.967 0.5 1 1 5 lb
70
-840.856 -246.718 -804.351 -66.7145 -767.847 113.289 0 0.5 0 5 lb
71
-579.033 445.603 -673.44 279.446 -767.847 113.289 0 0 0.5 5 lb
72
-579.033 445.603 -524.906 302.104 -470.779 158.605 0 0 0.5 5 lb
73
-767.847 113.289 -619.313 135.947 -470.779 158.605 0 0 0.5 5 lb
74
906.312 201.403 946.592 42.798 986.873 -115.807 0 0.5 0.5 5 lb
75
906.312 201.403 834.562 91.8901 762.812 -17.6227 0 0.5 0.5 5 lb
76
986.873 -115.807 874.842 -66.7148 762.812 -17.6227 0 0.5 0.5 5 lb
77
-470.779 158.605 -390.218 50.3508 -309.657 -57.9033 0.5 0.5 0 5 lb
78
422.945 521.129 208.955 541.269 -5.03507 561.41 0.5 0 0.5 5 lb
79
422.945 521.129 376.371 417.911 329.797 314.692 0.5 0 0.5 5 lb
80
422.945 521.129 474.554 276.928 526.164 32.7279 0.5 0 0.5 5 lb
81
-5.03507 561.41 -36.5042 440.568 -67.9734 319.727 0.5 0 0.5 5 lb
82
329.797 314.692 130.912 317.209 -67.9734 319.727 0.5 0 0.5 5 lb
83
-67.9734 319.727 229.095 176.227 526.164 32.7279 0.5 0 0.5 5 lb
84
762.812 -17.6227 644.488 7.5526 526.164 32.7279 0.5 0.5 0.5 5 lb
85
762.812 -17.6227 746.448 -162.381 730.084 -307.139 0.5 0.5 0.5 5 lb
86
526.164 32.7279 470.779 -128.394 415.393 -289.516 0.5 0.5 0.5 5 lb
87
730.084 -307.139 572.738 -298.327 415.393 -289.516 0.5 0.5 0.5 5 lb
88
415.393 -289.516 173.71 -318.468 -67.9734 -347.42 1 0.5 0.5 5 lb
89
-67.9734 -347.42 -188.815 -202.662 -309.657 -57.9033 0.5 1 0.5 5 lb
90
-67.9734 -347.42 -195.758 -390.692 -323.543 -433.964 0.5 1 0.5 5 lb
91
-309.657 -57.9033 -424.775 -160.272 -539.894 -262.64 0.5 1 0.5 5 lb
92
-323.543 -433.964 -431.719 -348.302 -539.894 -262.64 0.5 1 0.5 5 lb
93
-26.6953 -19.9585 44.8558 -96.8093 116.407 -173.66 1 1 0 5 lb
94
-26.6953 -19.9585 87.2563 9.19185 201.208 38.3422 1 1 0 5 lb
95
-26.6953 -19.9585 -144.622 43.6422 -262.548 107.243 1 0 1 5 lb
96
-26.6953 -19.9585 -20.0703 56.8923 -13.4452 133.743 1 0 1 5 lb
97
116.407 -173.66 158.808 -67.6589 201.208 38.3422 1 1 0 5 lb
98
-262.548 107.243 -137.997 120.493 -13.4452 133.743 1 0 1 5 lb
99
-262.548 107.243 -221.472 176.144 -180.397 245.045 1 0 1 5 lb
100
-13.4452 133.743 -96.9211 189.394 -180.397 245.045 1 0 1 5 lb
101
-180.397 245.045 -140.307 344.649 -132.697 451.748 0 1 1 5 lb
102
-180.397 245.045 -172.787 352.144 -132.697 451.748 0 1 1 5 lb
103
-416.25 345.746 -274.474 398.747 -132.697 451.748 0.5 0 0 5 lb
104
-416.25 345.746 -393.725 457.048 -371.2 568.349 0.5 0 0 5 lb
105
-132.697 451.748 -251.948 510.048 -371.2 568.349 0.5 0 0 5 lb
106
670.264 274.195 629.188 409.347 588.113 544.499 0 0 1 5 lb
107
670.264 274.195 797.466 341.771 924.667 409.347 0 0 1 5 lb
108
588.113 544.499 756.39 476.923 924.667 409.347 0 0 1 5 lb
109
-689.204 -237.261 -612.964 -103.444 -567.302 43.6423 0 0 0 5 lb
110
-689.204 -237.261 -643.542 -90.1744 -567.302 43.6423 0 0 0 5 lb
111
grestore
112
%Nodes:
113
gsave
114
-567.302 43.6423 20 0 0 1 nc
115
-689.204 -237.261 20 0 0 1 nc
116
924.667 409.347 20 0 0 1 nc
117
588.113 544.499 20 0 0 1 nc
118
670.264 274.195 20 1 0 0 nc
119
-371.2 568.349 20 0 0 1 nc
120
-132.697 451.748 20 1 0 0 nc
121
-416.25 345.746 20 0 0 1 nc
122
-180.397 245.045 20 1 0 0 nc
123
-13.4452 133.743 20 0 0 1 nc
124
-262.548 107.243 20 0 0 1 nc
125
201.208 38.3422 20 0 0 1 nc
126
116.407 -173.66 20 0 0 1 nc
127
-26.6953 -19.9585 20 1 0 0 nc
128
-539.894 -262.64 20 0 0 1 nc
129
-323.543 -433.964 20 0 0 1 nc
130
-309.657 -57.9033 20 1 0 0 nc
131
-67.9734 -347.42 20 1 0 0 nc
132
415.393 -289.516 20 1 0 0 nc
133
730.084 -307.139 20 0 0 1 nc
134
526.164 32.7279 20 1 0 0 nc
135
762.812 -17.6227 20 1 0 0 nc
136
-67.9734 319.727 20 0 0 1 nc
137
329.797 314.692 20 0 0 1 nc
138
-5.03507 561.41 20 0 0 1 nc
139
422.945 521.129 20 0 0 1 nc
140
-470.779 158.605 20 1 0 0 nc
141
986.873 -115.807 20 0 0 1 nc
142
906.312 201.403 20 0 0 1 nc
143
-767.847 113.289 20 1 0 0 nc
144
-579.033 445.603 20 0 0 1 nc
145
-840.856 -246.718 20 0 0 1 nc
146
206.221 -205.967 20 0 0 1 nc
147
277.311 -252.33 20 0 0 1 nc
148
271.13 -175.058 20 1 0 0 nc
149
366.947 -110.15 20 1 0 0 nc
150
397.855 -196.694 20 0 0 1 nc
151
438.037 -88.514 20 0 0 1 nc
152
286.584 -48.3327 20 1 0 0 nc
153
212.403 -23.6057 20 0 0 1 nc
154
280.402 10.3938 20 0 0 1 nc
155
694.579 115.483 20 0 0 1 nc
156
574.035 177.301 20 0 0 1 nc
157
grestore
158
grestore
159
showpage
1
%!PS-Adobe-2.0 EPSF-2.0
2
%%Creator: LEMON, graphToEps()
3
%%CreationDate: Fri Nov  4 13:47:12 2005
4
%%BoundingBox: 0 0 842 596
5
%%EndComments
6
/lb { setlinewidth setrgbcolor newpath moveto
7
      4 2 roll 1 index 1 index curveto stroke } bind def
8
/l { setlinewidth setrgbcolor newpath moveto lineto stroke } bind def
9
/c { newpath dup 3 index add 2 index moveto 0 360 arc closepath } bind def
10
/sq { newpath 2 index 1 index add 2 index 2 index add moveto
11
      2 index 1 index sub 2 index 2 index add lineto
12
      2 index 1 index sub 2 index 2 index sub lineto
13
      2 index 1 index add 2 index 2 index sub lineto
14
      closepath pop pop pop} bind def
15
/di { newpath 2 index 1 index add 2 index moveto
16
      2 index             2 index 2 index add lineto
17
      2 index 1 index sub 2 index             lineto
18
      2 index             2 index 2 index sub lineto
19
      closepath pop pop pop} bind def
20
/nc { 0 0 0 setrgbcolor 5 index 5 index 5 index c fill
21
     setrgbcolor 1.1 div c fill
22
   } bind def
23
/nsq { 0 0 0 setrgbcolor 5 index 5 index 5 index sq fill
24
     setrgbcolor 1.1 div sq fill
25
   } bind def
26
/ndi { 0 0 0 setrgbcolor 5 index 5 index 5 index di fill
27
     setrgbcolor 1.1 div di fill
28
   } bind def
29
/arrl 10 def
30
/arrw 3 def
31
/lrl { 2 index mul exch 2 index mul exch rlineto pop} bind def
32
/arr { setrgbcolor /y1 exch def /x1 exch def /dy exch def /dx exch def
33
       /w exch def /len exch def
34
       newpath x1 dy w 2 div mul add y1 dx w 2 div mul sub moveto
35
       len w sub arrl sub dx dy lrl
36
       arrw dy dx neg lrl
37
       dx arrl w add mul dy w 2 div arrw add mul sub
38
       dy arrl w add mul dx w 2 div arrw add mul add rlineto
39
       dx arrl w add mul neg dy w 2 div arrw add mul sub
40
       dy arrl w add mul neg dx w 2 div arrw add mul add rlineto
41
       arrw dy dx neg lrl
42
       len w sub arrl sub neg dx dy lrl
43
       closepath fill } bind def
44
/cshow { 2 index 2 index moveto dup stringwidth pop
45
         neg 2 div fosi .35 mul neg rmoveto show pop pop} def
46

	
47
gsave
48
90 rotate
49
0 -842 translate
50
77.1122 15 translate
51
0.585745 dup scale
52
90 rotate
53
695.963 -397.916 translate
54
%Edges:
55
gsave
56
2 setlinewidth 0 0 1 setrgbcolor newpath
57
218.178 27.2723 moveto
58
192.373 -40.1551 188.622 -49.9556 169.228 -100.631 curveto stroke
59
newpath 164.939 -111.838 moveto 165.492 -99.2013 lineto 172.964 -102.061 lineto closepath fill
60
2 setlinewidth 0 0 1 setrgbcolor newpath
61
44.8044 15.5841 moveto
62
119.293 20.6059 129.775 21.3125 186.25 25.1199 curveto stroke
63
newpath 198.223 25.927 moveto 186.519 21.1289 lineto 185.981 29.1108 lineto closepath fill
64
2 setlinewidth 1 0 0 setrgbcolor newpath
65
218.178 27.2723 moveto
66
285.395 -87.4449 290.763 -96.6058 348.102 -194.464 curveto stroke
67
newpath 354.169 -204.818 moveto 344.651 -196.487 lineto 351.554 -192.442 lineto closepath fill
68
2 setlinewidth 0 0 1 setrgbcolor newpath
69
157.79 -130.517 moveto
70
108.71 -67.0521 102.27 -58.7243 64.3804 -9.72954 curveto stroke
71
newpath 57.0394 -0.236898 moveto 67.5446 -7.28254 lineto 61.2162 -12.1765 lineto closepath fill
72
2 setlinewidth 1 0 0 setrgbcolor newpath
73
-105.193 -261.035 moveto
74
-35.6576 -132.801 -30.5923 -123.459 29.5506 -12.5464 curveto stroke
75
newpath 35.2708 -1.99743 moveto 33.0669 -14.4531 lineto 26.0343 -10.6397 lineto closepath fill
76
2 setlinewidth 0 0 1 setrgbcolor newpath
77
-465.576 -42.8564 moveto
78
-559.078 -25.5413 -569.47 -23.6169 -644.498 -9.72286 curveto stroke
79
newpath -656.297 -7.5378 moveto -643.77 -5.78973 lineto -645.226 -13.656 lineto closepath fill
80
2 setlinewidth 0 0 1 setrgbcolor newpath
81
-574.666 -153.893 moveto
82
-528.842 -107.252 -521.515 -99.794 -488.002 -65.683 curveto stroke
83
newpath -479.592 -57.123 moveto -485.149 -68.4863 lineto -490.856 -62.8797 lineto closepath fill
84
2 setlinewidth 1 0 0 setrgbcolor newpath
85
-490.901 120.777 moveto
86
-480.122 51.1328 -478.519 40.7713 -470.47 -11.2329 curveto stroke
87
newpath -468.635 -23.0917 moveto -474.423 -11.8447 lineto -466.517 -10.6212 lineto closepath fill
88
2 setlinewidth 0 0 1 setrgbcolor newpath
89
-675.963 -3.89604 moveto
90
-632.116 -68.8235 -626.228 -77.5422 -592.575 -127.374 curveto stroke
91
newpath -585.859 -137.319 moveto -595.89 -129.612 lineto -589.26 -125.135 lineto closepath fill
92
2 setlinewidth 0 0 1 setrgbcolor newpath
93
-490.901 120.777 moveto
94
-435.445 215.844 -430.107 224.995 -384.3 303.522 curveto stroke
95
newpath -378.253 313.887 moveto -380.845 301.507 lineto -387.755 305.537 lineto closepath fill
96
2 setlinewidth 0 0 1 setrgbcolor newpath
97
-266.879 114.933 moveto
98
-367.067 117.547 -377.642 117.822 -458.912 119.943 curveto stroke
99
newpath -470.908 120.255 moveto -458.807 123.941 lineto -459.016 115.944 lineto closepath fill
100
2 setlinewidth 0 0 1 setrgbcolor newpath
101
-368.176 331.163 moveto
102
-322.511 233.685 -318.018 224.095 -280.454 143.911 curveto stroke
103
newpath -275.364 133.044 moveto -284.076 142.214 lineto -276.832 145.608 lineto closepath fill
104
2 setlinewidth 1 0 0 setrgbcolor newpath
105
-266.879 114.933 moveto
106
-224.004 235.52 -220.448 245.52 -184.094 347.765 curveto stroke
107
newpath -180.074 359.072 moveto -180.325 346.425 lineto -187.863 349.105 lineto closepath fill
108
2 setlinewidth 0 0 1 setrgbcolor newpath
109
-251.294 -335.059 moveto
110
-189.25 -303.624 -179.902 -298.887 -133.738 -275.498 curveto stroke
111
newpath -123.034 -270.074 moveto -131.93 -279.066 lineto -135.546 -271.93 lineto closepath fill
112
2 setlinewidth 0 0 1 setrgbcolor newpath
113
-389.604 -136.361 moveto
114
-327.15 -226.083 -321.098 -234.777 -269.576 -308.795 curveto stroke
115
newpath -262.72 -318.644 moveto -272.859 -311.081 lineto -266.293 -306.51 lineto closepath fill
116
2 setlinewidth 1 0 0 setrgbcolor newpath
117
5.84406 175.322 moveto
118
-76.0754 267.926 -83.1051 275.873 -152.172 353.948 curveto stroke
119
newpath -160.122 362.936 moveto -149.176 356.598 lineto -155.168 351.298 lineto closepath fill
120
2 setlinewidth 0 0 1 setrgbcolor newpath
121
169.478 311.683 moveto
122
96.8003 251.119 88.6819 244.353 30.4273 195.808 curveto stroke
123
newpath 21.2086 188.126 moveto 27.8666 198.881 lineto 32.988 192.735 lineto closepath fill
124
2 setlinewidth 0 0 1 setrgbcolor newpath
125
342.851 111.037 moveto
126
263.766 202.563 256.831 210.589 190.4 287.47 curveto stroke
127
newpath 182.554 296.55 moveto 193.427 290.085 lineto 187.373 284.855 lineto closepath fill
128
2 setlinewidth 0 0 1 setrgbcolor newpath
129
5.84406 175.322 moveto
130
163.16 145.314 173.605 143.321 311.418 117.033 curveto stroke
131
newpath 323.205 114.784 moveto 310.668 113.104 lineto 312.167 120.962 lineto closepath fill
132
2 setlinewidth 0 0 1 setrgbcolor newpath
133
342.851 111.037 moveto
134
497.255 2.58683 505.964 -3.53033 643.932 -100.436 curveto stroke
135
newpath 653.752 -107.334 moveto 641.633 -103.71 lineto 646.231 -97.163 lineto closepath fill
136
2 setlinewidth 0 0 1 setrgbcolor newpath
137
364.28 -222.074 moveto
138
354.298 -66.9063 353.616 -56.2971 344.905 79.1029 curveto stroke
139
newpath 344.135 91.0781 moveto 348.897 79.3597 lineto 340.914 78.8461 lineto closepath fill
140
2 setlinewidth 0 0 1 setrgbcolor newpath
141
670.118 -118.829 moveto
142
528.037 -166.793 517.967 -170.192 394.599 -211.839 curveto stroke
143
newpath 383.229 -215.677 moveto 393.32 -208.049 lineto 395.878 -215.629 lineto closepath fill
144
2 setlinewidth 1 0 0 setrgbcolor newpath
145
-105.193 -261.035 moveto
146
118.401 -242.479 129.015 -241.598 332.39 -224.721 curveto stroke
147
newpath 344.348 -223.728 moveto 332.72 -228.707 lineto 332.059 -220.734 lineto closepath fill
148
2 setlinewidth 0 0 1 setrgbcolor newpath
149
-105.193 -261.035 moveto
150
-160.867 -161.176 -166.028 -151.918 -212.336 -68.858 curveto stroke
151
newpath -218.179 -58.3769 moveto -208.842 -66.9102 lineto -215.829 -70.8058 lineto closepath fill
152
2 setlinewidth 0 0 1 setrgbcolor newpath
153
-227.918 -40.9084 moveto
154
-298.35 -82.4884 -307.42 -87.8432 -362.048 -120.093 curveto stroke
155
newpath -372.381 -126.193 moveto -364.081 -116.648 lineto -360.014 -123.537 lineto closepath fill
156
grestore
157
%Nodes:
158
gsave
159
-389.604 -136.361 20 0 1 0 nc
160
-227.918 -40.9084 20 0 1 0 nc
161
-105.193 -261.035 20 0 1 0 nc
162
364.28 -222.074 20 1 1 0 nc
163
670.118 -118.829 20 1 1 0 nc
164
342.851 111.037 20 1 1 0 nc
165
5.84406 175.322 20 1 1 0 nc
166
169.478 311.683 20 1 1 0 nc
167
-173.374 377.916 20 1 0 1 nc
168
-251.294 -335.059 20 0 1 0 nc
169
-266.879 114.933 20 0 0 0 nc
170
-368.176 331.163 20 0 0 0 nc
171
-490.901 120.777 20 0 0 0 nc
172
-574.666 -153.893 20 1 0 0 nc
173
-675.963 -3.89604 20 1 0 0 nc
174
-465.576 -42.8564 20 1 0 0 nc
175
44.8044 15.5841 20 0 0 1 nc
176
157.79 -130.517 20 0 0 1 nc
177
218.178 27.2723 20 0 0 1 nc
178
grestore
179
grestore
180
showpage
Ignore white space 6 line context
... ...
@@ -5,39 +5,52 @@
5 5

	
6 6
CONFIGURE_FILE(
7 7
  ${PROJECT_SOURCE_DIR}/doc/Doxyfile.in
8 8
  ${PROJECT_BINARY_DIR}/doc/Doxyfile
9 9
  @ONLY)
10 10

	
11 11
IF(DOXYGEN_EXECUTABLE AND GHOSTSCRIPT_EXECUTABLE)
12 12
  FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/)
13 13
  IF(UNIX)
14 14
    ADD_CUSTOM_TARGET(html
15 15
      COMMAND rm -rf gen-images
16 16
      COMMAND mkdir gen-images
17
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/bipartite_matching.png ${CMAKE_CURRENT_SOURCE_DIR}/images/bipartite_matching.eps
18
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/bipartite_partitions.png ${CMAKE_CURRENT_SOURCE_DIR}/images/bipartite_partitions.eps
19
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/connected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/connected_components.eps
20
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/edge_biconnected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/edge_biconnected_components.eps
17 21
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/grid_graph.png ${CMAKE_CURRENT_SOURCE_DIR}/images/grid_graph.eps
22
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/node_biconnected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/node_biconnected_components.eps
18 23
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_0.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_0.eps
19 24
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_1.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_1.eps
20 25
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_2.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_2.eps
21 26
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_3.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_3.eps
22 27
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_4.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_4.eps
28
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/strongly_connected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/strongly_connected_components.eps
23 29
      COMMAND rm -rf html
24 30
      COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile
25 31
      WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
26 32
  ELSEIF(WIN32)
27 33
    ADD_CUSTOM_TARGET(html
28 34
      COMMAND if exist gen-images rmdir /s /q gen-images
29 35
      COMMAND mkdir gen-images
36
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/bipartite_matching.png ${CMAKE_CURRENT_SOURCE_DIR}/images/bipartite_matching.eps
37
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/bipartite_partitions.png ${CMAKE_CURRENT_SOURCE_DIR}/images/bipartite_partitions.eps
38
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/connected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/connected_components.eps
39
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/edge_biconnected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/edge_biconnected_components.eps
40
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/grid_graph.png ${CMAKE_CURRENT_SOURCE_DIR}/images/grid_graph.eps
41
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/node_biconnected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/node_biconnected_components.eps
30 42
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_0.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_0.eps
31 43
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_1.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_1.eps
32 44
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_2.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_2.eps
33 45
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_3.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_3.eps
34 46
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_4.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_4.eps
47
      COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/strongly_connected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/strongly_connected_components.eps
35 48
      COMMAND if exist html rmdir /s /q html
36 49
      COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile
37 50
      WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
38 51
  ENDIF(UNIX)
39 52
  INSTALL(
40 53
    DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/
41 54
    DESTINATION share/doc
42 55
    COMPONENT html_documentation)
43 56
ENDIF(DOXYGEN_EXECUTABLE AND GHOSTSCRIPT_EXECUTABLE)
Ignore white space 6 line context
... ...
@@ -12,48 +12,68 @@
12 12
	doc/namespaces.dox \
13 13
	doc/html \
14 14
	doc/CMakeLists.txt
15 15

	
16 16
DOC_EPS_IMAGES18 = \
17 17
	grid_graph.eps \
18 18
	nodeshape_0.eps \
19 19
	nodeshape_1.eps \
20 20
	nodeshape_2.eps \
21 21
	nodeshape_3.eps \
22 22
	nodeshape_4.eps
23 23

	
24
DOC_EPS_IMAGES27 = \
25
	bipartite_matching.eps \
26
	bipartite_partitions.eps \
27
	connected_components.eps \
28
	edge_biconnected_components.eps \
29
	node_biconnected_components.eps \
30
	strongly_connected_components.eps
31

	
24 32
DOC_EPS_IMAGES = \
25
	$(DOC_EPS_IMAGES18)
33
	$(DOC_EPS_IMAGES18) \
34
	$(DOC_EPS_IMAGES27)
26 35

	
27 36
DOC_PNG_IMAGES = \
28 37
	$(DOC_EPS_IMAGES:%.eps=doc/gen-images/%.png)
29 38

	
30 39
EXTRA_DIST += $(DOC_EPS_IMAGES:%=doc/images/%)
31 40

	
32 41
doc/html:
33 42
	$(MAKE) $(AM_MAKEFLAGS) html
34 43

	
35 44
GS_COMMAND=gs -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4
36 45

	
37 46
$(DOC_EPS_IMAGES18:%.eps=doc/gen-images/%.png): doc/gen-images/%.png: doc/images/%.eps
38 47
	-mkdir doc/gen-images
39 48
	if test ${gs_found} = yes; then \
40 49
	  $(GS_COMMAND) -sDEVICE=pngalpha -r18 -sOutputFile=$@ $<; \
41 50
	else \
42 51
	  echo; \
43 52
	  echo "Ghostscript not found."; \
44 53
	  echo; \
45 54
	  exit 1; \
46 55
	fi
47 56

	
57
$(DOC_EPS_IMAGES27:%.eps=doc/gen-images/%.png): doc/gen-images/%.png: doc/images/%.eps
58
	-mkdir doc/gen-images
59
	if test ${gs_found} = yes; then \
60
	  $(GS_COMMAND) -sDEVICE=pngalpha -r27 -sOutputFile=$@ $<; \
61
	else \
62
	  echo; \
63
	  echo "Ghostscript not found."; \
64
	  echo; \
65
	  exit 1; \
66
	fi
67

	
48 68
html-local: $(DOC_PNG_IMAGES)
49 69
	if test ${doxygen_found} = yes; then \
50 70
	  cd doc; \
51 71
	  doxygen Doxyfile; \
52 72
	  cd ..; \
53 73
	else \
54 74
	  echo; \
55 75
	  echo "Doxygen not found."; \
56 76
	  echo; \
57 77
	  exit 1; \
58 78
	fi
59 79

	
Ignore white space 6 line context
... ...
@@ -398,25 +398,25 @@
398 398
- \ref HaoOrlin "Hao-Orlin algorithm" for calculating minimum cut
399 399
  in directed graphs.
400 400
- \ref NagamochiIbaraki "Nagamochi-Ibaraki algorithm" for
401 401
  calculating minimum cut in undirected graphs.
402 402
- \ref GomoryHu "Gomory-Hu tree computation" for calculating
403 403
  all-pairs minimum cut in undirected graphs.
404 404

	
405 405
If you want to find minimum cut just between two distinict nodes,
406 406
see the \ref max_flow "maximum flow problem".
407 407
*/
408 408

	
409 409
/**
410
@defgroup graph_prop Connectivity and Other Graph Properties
410
@defgroup graph_properties Connectivity and Other Graph Properties
411 411
@ingroup algs
412 412
\brief Algorithms for discovering the graph properties
413 413

	
414 414
This group contains the algorithms for discovering the graph properties
415 415
like connectivity, bipartiteness, euler property, simplicity etc.
416 416

	
417 417
\image html edge_biconnected_components.png
418 418
\image latex edge_biconnected_components.eps "bi-edge-connected components" width=\textwidth
419 419
*/
420 420

	
421 421
/**
422 422
@defgroup planar Planarity Embedding and Drawing
Ignore white space 6 line context
... ...
@@ -2183,24 +2183,27 @@
2183 2183
      EdgeMap& operator=(const CMap& cmap) {
2184 2184
        Parent::operator=(cmap);
2185 2185
        return *this;
2186 2186
      }
2187 2187

	
2188 2188
    };
2189 2189

	
2190 2190
    typedef typename ItemSetTraits<DGR, Node>::ItemNotifier NodeNotifier;
2191 2191
    NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
2192 2192

	
2193 2193
    typedef typename ItemSetTraits<DGR, Edge>::ItemNotifier EdgeNotifier;
2194 2194
    EdgeNotifier& notifier(Edge) const { return _digraph->notifier(Edge()); }
2195
    
2196
    typedef EdgeNotifier ArcNotifier;
2197
    ArcNotifier& notifier(Arc) const { return _digraph->notifier(Edge()); }
2195 2198

	
2196 2199
  protected:
2197 2200

	
2198 2201
    UndirectorBase() : _digraph(0) {}
2199 2202

	
2200 2203
    DGR* _digraph;
2201 2204

	
2202 2205
    void initialize(DGR& digraph) {
2203 2206
      _digraph = &digraph;
2204 2207
    }
2205 2208

	
2206 2209
  };
Ignore white space 6 line context
... ...
@@ -64,27 +64,27 @@
64 64
    ///\e
65 65
    typedef Comp Compare;
66 66

	
67 67
    /// \brief Type to represent the items states.
68 68
    ///
69 69
    /// Each Item element have a state associated to it. It may be "in heap",
70 70
    /// "pre heap" or "post heap". The latter two are indifferent from the
71 71
    /// heap's point of view, but may be useful to the user.
72 72
    ///
73 73
    /// The item-int map must be initialized in such way that it assigns
74 74
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
75 75
    enum State {
76
      IN_HEAP = 0,    ///< \e
77
      PRE_HEAP = -1,  ///< \e
78
      POST_HEAP = -2  ///< \e
76
      IN_HEAP = 0,    ///< = 0.
77
      PRE_HEAP = -1,  ///< = -1.
78
      POST_HEAP = -2  ///< = -2.
79 79
    };
80 80

	
81 81
  private:
82 82
    std::vector<Pair> _data;
83 83
    Compare _comp;
84 84
    ItemIntMap &_iim;
85 85

	
86 86
  public:
87 87
    /// \brief The constructor.
88 88
    ///
89 89
    /// The constructor.
90 90
    /// \param map should be given to the constructor, since it is used
... ...
@@ -13,26 +13,24 @@
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
#ifndef LEMON_BITS_GRAPH_ADAPTOR_EXTENDER_H
20 20
#define LEMON_BITS_GRAPH_ADAPTOR_EXTENDER_H
21 21

	
22 22
#include <lemon/core.h>
23 23
#include <lemon/error.h>
24 24

	
25
#include <lemon/bits/default_map.h>
26

	
27 25
namespace lemon {
28 26

	
29 27
  template <typename _Digraph>
30 28
  class DigraphAdaptorExtender : public _Digraph {
31 29
  public:
32 30

	
33 31
    typedef _Digraph Parent;
34 32
    typedef _Digraph Digraph;
35 33
    typedef DigraphAdaptorExtender Adaptor;
36 34

	
37 35
    // Base extensions
38 36

	
Ignore white space 6 line context
... ...
@@ -38,24 +38,26 @@
38 38
  class MapExtender : public _Map {
39 39
  public:
40 40

	
41 41
    typedef _Map Parent;
42 42
    typedef MapExtender Map;
43 43

	
44 44

	
45 45
    typedef typename Parent::Graph Graph;
46 46
    typedef typename Parent::Key Item;
47 47

	
48 48
    typedef typename Parent::Key Key;
49 49
    typedef typename Parent::Value Value;
50
    typedef typename Parent::Reference Reference;
51
    typedef typename Parent::ConstReference ConstReference;
50 52

	
51 53
    class MapIt;
52 54
    class ConstMapIt;
53 55

	
54 56
    friend class MapIt;
55 57
    friend class ConstMapIt;
56 58

	
57 59
  public:
58 60

	
59 61
    MapExtender(const Graph& graph)
60 62
      : Parent(graph) {}
61 63

	
... ...
@@ -178,24 +180,26 @@
178 180
  class SubMapExtender : public _Map {
179 181
  public:
180 182

	
181 183
    typedef _Map Parent;
182 184
    typedef SubMapExtender Map;
183 185

	
184 186
    typedef _Graph Graph;
185 187

	
186 188
    typedef typename Parent::Key Item;
187 189

	
188 190
    typedef typename Parent::Key Key;
189 191
    typedef typename Parent::Value Value;
192
    typedef typename Parent::Reference Reference;
193
    typedef typename Parent::ConstReference ConstReference;
190 194

	
191 195
    class MapIt;
192 196
    class ConstMapIt;
193 197

	
194 198
    friend class MapIt;
195 199
    friend class ConstMapIt;
196 200

	
197 201
  public:
198 202

	
199 203
    SubMapExtender(const Graph& _graph)
200 204
      : Parent(_graph), graph(_graph) {}
201 205

	
Ignore white space 6 line context
... ...
@@ -46,30 +46,33 @@
46 46
#include "coin/CglFlowCover.hpp"
47 47
#include "coin/CglMixedIntegerRounding.hpp"
48 48

	
49 49
#include "coin/CbcHeuristic.hpp"
50 50

	
51 51
namespace lemon {
52 52

	
53 53
  CbcMip::CbcMip() {
54 54
    _prob = new CoinModel();
55 55
    _prob->setProblemName("LEMON");
56 56
    _osi_solver = 0;
57 57
    _cbc_model = 0;
58
    messageLevel(MESSAGE_NOTHING);
58 59
  }
59 60

	
60 61
  CbcMip::CbcMip(const CbcMip& other) {
61 62
    _prob = new CoinModel(*other._prob);
63
    _prob->setProblemName("LEMON");
62 64
    _osi_solver = 0;
63 65
    _cbc_model = 0;
66
    messageLevel(MESSAGE_NOTHING);
64 67
  }
65 68

	
66 69
  CbcMip::~CbcMip() {
67 70
    delete _prob;
68 71
    if (_osi_solver) delete _osi_solver;
69 72
    if (_cbc_model) delete _cbc_model;
70 73
  }
71 74

	
72 75
  const char* CbcMip::_solverName() const { return "CbcMip"; }
73 76

	
74 77
  int CbcMip::_addCol() {
75 78
    _prob->addColumn(0, 0, 0, -COIN_DBL_MAX, COIN_DBL_MAX, 0.0, 0, false);
... ...
@@ -261,42 +264,26 @@
261 264
    _osi_solver = new OsiOslSolverInterface();
262 265
#else
263 266
#error Cannot instantiate Osi solver
264 267
#endif
265 268

	
266 269
    _osi_solver->loadFromCoinModel(*_prob);
267 270

	
268 271
    if (_cbc_model) {
269 272
      delete _cbc_model;
270 273
    }
271 274
    _cbc_model= new CbcModel(*_osi_solver);
272 275

	
273
    switch (_message_level) {
274
    case MESSAGE_NO_OUTPUT:
275
      _osi_solver->messageHandler()->setLogLevel(0);
276
      _cbc_model->setLogLevel(0);
277
      break;
278
    case MESSAGE_ERROR_MESSAGE:
279
      _osi_solver->messageHandler()->setLogLevel(1);
280
      _cbc_model->setLogLevel(1);
281
      break;
282
    case MESSAGE_NORMAL_OUTPUT:
283
      _osi_solver->messageHandler()->setLogLevel(2);
284
      _cbc_model->setLogLevel(2);
285
      break;
286
    case MESSAGE_FULL_OUTPUT:
287
      _osi_solver->messageHandler()->setLogLevel(3);
288
      _cbc_model->setLogLevel(3);
289
      break;
290
    }
276
    _osi_solver->messageHandler()->setLogLevel(_message_level);
277
    _cbc_model->setLogLevel(_message_level);
291 278

	
292 279
    _cbc_model->initialSolve();
293 280
    _cbc_model->solver()->setHintParam(OsiDoReducePrint, true, OsiHintTry);
294 281

	
295 282
    if (!_cbc_model->isInitialSolveAbandoned() &&
296 283
        _cbc_model->isInitialSolveProvenOptimal() &&
297 284
        !_cbc_model->isInitialSolveProvenPrimalInfeasible() &&
298 285
        !_cbc_model->isInitialSolveProvenDualInfeasible()) {
299 286

	
300 287
      CglProbing generator1;
301 288
      generator1.setUsingObjective(true);
302 289
      generator1.setMaxPass(3);
... ...
@@ -444,17 +431,33 @@
444 431
      _osi_solver = 0;
445 432
    }
446 433
    if (_cbc_model) {
447 434
      delete _cbc_model;
448 435
      _cbc_model = 0;
449 436
    }
450 437

	
451 438
    _prob = new CoinModel();
452 439
    rows.clear();
453 440
    cols.clear();
454 441
  }
455 442

	
456
  void CbcMip::messageLevel(MessageLevel m) {
457
    _message_level = m;
443
  void CbcMip::_messageLevel(MessageLevel level) {
444
    switch (level) {
445
    case MESSAGE_NOTHING:
446
      _message_level = 0;
447
      break;
448
    case MESSAGE_ERROR:
449
      _message_level = 1;
450
      break;
451
    case MESSAGE_WARNING:
452
      _message_level = 1;
453
      break;
454
    case MESSAGE_NORMAL:
455
      _message_level = 2;
456
      break;
457
    case MESSAGE_VERBOSE:
458
      _message_level = 3;
459
      break;
460
    }
458 461
  }
459 462

	
460 463
} //END OF NAMESPACE LEMON
Ignore white space 6 line context
... ...
@@ -106,45 +106,24 @@
106 106
    virtual Sense _getSense() const;
107 107

	
108 108
    virtual ColTypes _getColType(int col) const;
109 109
    virtual void _setColType(int col, ColTypes col_type);
110 110

	
111 111
    virtual SolveExitStatus _solve();
112 112
    virtual ProblemType _getType() const;
113 113
    virtual Value _getSol(int i) const;
114 114
    virtual Value _getSolValue() const;
115 115

	
116 116
    virtual void _clear();
117 117

	
118
  public:
118
    virtual void _messageLevel(MessageLevel level);
119
    void _applyMessageLevel();
119 120

	
120
    ///Enum for \c messageLevel() parameter
121
    enum MessageLevel {
122
      /// no output (default value)
123
      MESSAGE_NO_OUTPUT = 0,
124
      /// error messages only
125
      MESSAGE_ERROR_MESSAGE = 1,
126
      /// normal output
127
      MESSAGE_NORMAL_OUTPUT = 2,
128
      /// full output (includes informational messages)
129
      MESSAGE_FULL_OUTPUT = 3
130
    };
121
    int _message_level;
131 122

	
132
  private:
133

	
134
    MessageLevel _message_level;
135

	
136
  public:
137

	
138
    ///Set the verbosity of the messages
139

	
140
    ///Set the verbosity of the messages
141
    ///
142
    ///\param m is the level of the messages output by the solver routines.
143
    void messageLevel(MessageLevel m);
144

	
123
    
145 124

	
146 125
  };
147 126

	
148 127
}
149 128

	
150 129
#endif
Ignore white space 6 line context
... ...
@@ -444,70 +444,70 @@
444 444

	
445 445
    ///@{
446 446

	
447 447
    /// Initializes the internal data structures.
448 448

	
449 449
    /// Initializes the internal data structures and sets all flow values
450 450
    /// to the lower bound.
451 451
    void init()
452 452
    {
453 453
      createStructures();
454 454

	
455 455
      for(NodeIt n(_g);n!=INVALID;++n) {
456
        _excess->set(n, (*_delta)[n]);
456
        (*_excess)[n] = (*_delta)[n];
457 457
      }
458 458

	
459 459
      for (ArcIt e(_g);e!=INVALID;++e) {
460 460
        _flow->set(e, (*_lo)[e]);
461
        _excess->set(_g.target(e), (*_excess)[_g.target(e)] + (*_flow)[e]);
462
        _excess->set(_g.source(e), (*_excess)[_g.source(e)] - (*_flow)[e]);
461
        (*_excess)[_g.target(e)] += (*_flow)[e];
462
        (*_excess)[_g.source(e)] -= (*_flow)[e];
463 463
      }
464 464

	
465 465
      // global relabeling tested, but in general case it provides
466 466
      // worse performance for random digraphs
467 467
      _level->initStart();
468 468
      for(NodeIt n(_g);n!=INVALID;++n)
469 469
        _level->initAddItem(n);
470 470
      _level->initFinish();
471 471
      for(NodeIt n(_g);n!=INVALID;++n)
472 472
        if(_tol.positive((*_excess)[n]))
473 473
          _level->activate(n);
474 474
    }
475 475

	
476 476
    /// Initializes the internal data structures using a greedy approach.
477 477

	
478 478
    /// Initializes the internal data structures using a greedy approach
479 479
    /// to construct the initial solution.
480 480
    void greedyInit()
481 481
    {
482 482
      createStructures();
483 483

	
484 484
      for(NodeIt n(_g);n!=INVALID;++n) {
485
        _excess->set(n, (*_delta)[n]);
485
        (*_excess)[n] = (*_delta)[n];
486 486
      }
487 487

	
488 488
      for (ArcIt e(_g);e!=INVALID;++e) {
489 489
        if (!_tol.positive((*_excess)[_g.target(e)] + (*_up)[e])) {
490 490
          _flow->set(e, (*_up)[e]);
491
          _excess->set(_g.target(e), (*_excess)[_g.target(e)] + (*_up)[e]);
492
          _excess->set(_g.source(e), (*_excess)[_g.source(e)] - (*_up)[e]);
491
          (*_excess)[_g.target(e)] += (*_up)[e];
492
          (*_excess)[_g.source(e)] -= (*_up)[e];
493 493
        } else if (_tol.positive((*_excess)[_g.target(e)] + (*_lo)[e])) {
494 494
          _flow->set(e, (*_lo)[e]);
495
          _excess->set(_g.target(e), (*_excess)[_g.target(e)] + (*_lo)[e]);
496
          _excess->set(_g.source(e), (*_excess)[_g.source(e)] - (*_lo)[e]);
495
          (*_excess)[_g.target(e)] += (*_lo)[e];
496
          (*_excess)[_g.source(e)] -= (*_lo)[e];
497 497
        } else {
498 498
          Value fc = -(*_excess)[_g.target(e)];
499 499
          _flow->set(e, fc);
500
          _excess->set(_g.target(e), 0);
501
          _excess->set(_g.source(e), (*_excess)[_g.source(e)] - fc);
500
          (*_excess)[_g.target(e)] = 0;
501
          (*_excess)[_g.source(e)] -= fc;
502 502
        }
503 503
      }
504 504

	
505 505
      _level->initStart();
506 506
      for(NodeIt n(_g);n!=INVALID;++n)
507 507
        _level->initAddItem(n);
508 508
      _level->initFinish();
509 509
      for(NodeIt n(_g);n!=INVALID;++n)
510 510
        if(_tol.positive((*_excess)[n]))
511 511
          _level->activate(n);
512 512
    }
513 513

	
... ...
@@ -528,67 +528,67 @@
528 528
      while((act=_level->highestActive())!=INVALID) {
529 529
        int actlevel=(*_level)[act];
530 530
        int mlevel=_node_num;
531 531
        Value exc=(*_excess)[act];
532 532

	
533 533
        for(OutArcIt e(_g,act);e!=INVALID; ++e) {
534 534
          Node v = _g.target(e);
535 535
          Value fc=(*_up)[e]-(*_flow)[e];
536 536
          if(!_tol.positive(fc)) continue;
537 537
          if((*_level)[v]<actlevel) {
538 538
            if(!_tol.less(fc, exc)) {
539 539
              _flow->set(e, (*_flow)[e] + exc);
540
              _excess->set(v, (*_excess)[v] + exc);
540
              (*_excess)[v] += exc;
541 541
              if(!_level->active(v) && _tol.positive((*_excess)[v]))
542 542
                _level->activate(v);
543
              _excess->set(act,0);
543
              (*_excess)[act] = 0;
544 544
              _level->deactivate(act);
545 545
              goto next_l;
546 546
            }
547 547
            else {
548 548
              _flow->set(e, (*_up)[e]);
549
              _excess->set(v, (*_excess)[v] + fc);
549
              (*_excess)[v] += fc;
550 550
              if(!_level->active(v) && _tol.positive((*_excess)[v]))
551 551
                _level->activate(v);
552 552
              exc-=fc;
553 553
            }
554 554
          }
555 555
          else if((*_level)[v]<mlevel) mlevel=(*_level)[v];
556 556
        }
557 557
        for(InArcIt e(_g,act);e!=INVALID; ++e) {
558 558
          Node v = _g.source(e);
559 559
          Value fc=(*_flow)[e]-(*_lo)[e];
560 560
          if(!_tol.positive(fc)) continue;
561 561
          if((*_level)[v]<actlevel) {
562 562
            if(!_tol.less(fc, exc)) {
563 563
              _flow->set(e, (*_flow)[e] - exc);
564
              _excess->set(v, (*_excess)[v] + exc);
564
              (*_excess)[v] += exc;
565 565
              if(!_level->active(v) && _tol.positive((*_excess)[v]))
566 566
                _level->activate(v);
567
              _excess->set(act,0);
567
              (*_excess)[act] = 0;
568 568
              _level->deactivate(act);
569 569
              goto next_l;
570 570
            }
571 571
            else {
572 572
              _flow->set(e, (*_lo)[e]);
573
              _excess->set(v, (*_excess)[v] + fc);
573
              (*_excess)[v] += fc;
574 574
              if(!_level->active(v) && _tol.positive((*_excess)[v]))
575 575
                _level->activate(v);
576 576
              exc-=fc;
577 577
            }
578 578
          }
579 579
          else if((*_level)[v]<mlevel) mlevel=(*_level)[v];
580 580
        }
581 581

	
582
        _excess->set(act, exc);
582
        (*_excess)[act] = exc;
583 583
        if(!_tol.positive(exc)) _level->deactivate(act);
584 584
        else if(mlevel==_node_num) {
585 585
          _level->liftHighestActiveToTop();
586 586
          _el = _node_num;
587 587
          return false;
588 588
        }
589 589
        else {
590 590
          _level->liftHighestActive(mlevel+1);
591 591
          if(_level->onLevel(actlevel)==0) {
592 592
            _el = actlevel;
593 593
            return false;
594 594
          }
Ignore white space 6 line context
... ...
@@ -15,33 +15,33 @@
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <lemon/clp.h>
20 20
#include <coin/ClpSimplex.hpp>
21 21

	
22 22
namespace lemon {
23 23

	
24 24
  ClpLp::ClpLp() {
25 25
    _prob = new ClpSimplex();
26 26
    _init_temporals();
27
    messageLevel(MESSAGE_NO_OUTPUT);
27
    messageLevel(MESSAGE_NOTHING);
28 28
  }
29 29

	
30 30
  ClpLp::ClpLp(const ClpLp& other) {
31 31
    _prob = new ClpSimplex(*other._prob);
32 32
    rows = other.rows;
33 33
    cols = other.cols;
34 34
    _init_temporals();
35
    messageLevel(MESSAGE_NO_OUTPUT);
35
    messageLevel(MESSAGE_NOTHING);
36 36
  }
37 37

	
38 38
  ClpLp::~ClpLp() {
39 39
    delete _prob;
40 40
    _clear_temporals();
41 41
  }
42 42

	
43 43
  void ClpLp::_init_temporals() {
44 44
    _primal_ray = 0;
45 45
    _dual_ray = 0;
46 46
  }
47 47

	
... ...
@@ -421,17 +421,33 @@
421 421
    }
422 422
  }
423 423

	
424 424
  void ClpLp::_clear() {
425 425
    delete _prob;
426 426
    _prob = new ClpSimplex();
427 427
    rows.clear();
428 428
    cols.clear();
429 429
    _col_names_ref.clear();
430 430
    _clear_temporals();
431 431
  }
432 432

	
433
  void ClpLp::messageLevel(MessageLevel m) {
434
    _prob->setLogLevel(static_cast<int>(m));
433
  void ClpLp::_messageLevel(MessageLevel level) {
434
    switch (level) {
435
    case MESSAGE_NOTHING:
436
      _prob->setLogLevel(0);
437
      break;
438
    case MESSAGE_ERROR:
439
      _prob->setLogLevel(1);
440
      break;
441
    case MESSAGE_WARNING:
442
      _prob->setLogLevel(2);
443
      break;
444
    case MESSAGE_NORMAL:
445
      _prob->setLogLevel(3);
446
      break;
447
    case MESSAGE_VERBOSE:
448
      _prob->setLogLevel(4);
449
      break;
450
    }
435 451
  }
436 452

	
437 453
} //END OF NAMESPACE LEMON
Ignore white space 6 line context
... ...
@@ -127,55 +127,37 @@
127 127

	
128 128
    virtual Value _getPrimalRay(int i) const;
129 129
    virtual Value _getDualRay(int i) const;
130 130

	
131 131
    virtual VarStatus _getColStatus(int i) const;
132 132
    virtual VarStatus _getRowStatus(int i) const;
133 133

	
134 134
    virtual ProblemType _getPrimalType() const;
135 135
    virtual ProblemType _getDualType() const;
136 136

	
137 137
    virtual void _clear();
138 138

	
139
    virtual void _messageLevel(MessageLevel);
140
    
139 141
  public:
140 142

	
141 143
    ///Solves LP with primal simplex method.
142 144
    SolveExitStatus solvePrimal();
143 145

	
144 146
    ///Solves LP with dual simplex method.
145 147
    SolveExitStatus solveDual();
146 148

	
147 149
    ///Solves LP with barrier method.
148 150
    SolveExitStatus solveBarrier();
149 151

	
150 152
    ///Returns the constraint identifier understood by CLP.
151 153
    int clpRow(Row r) const { return rows(id(r)); }
152 154

	
153 155
    ///Returns the variable identifier understood by CLP.
154 156
    int clpCol(Col c) const { return cols(id(c)); }
155 157

	
156
    ///Enum for \c messageLevel() parameter
157
    enum MessageLevel {
158
      /// no output (default value)
159
      MESSAGE_NO_OUTPUT = 0,
160
      /// print final solution
161
      MESSAGE_FINAL_SOLUTION = 1,
162
      /// print factorization
163
      MESSAGE_FACTORIZATION = 2,
164
      /// normal output
165
      MESSAGE_NORMAL_OUTPUT = 3,
166
      /// verbose output
167
      MESSAGE_VERBOSE_OUTPUT = 4
168
    };
169
    ///Set the verbosity of the messages
170

	
171
    ///Set the verbosity of the messages
172
    ///
173
    ///\param m is the level of the messages output by the solver routines.
174
    void messageLevel(MessageLevel m);
175

	
176 158
  };
177 159

	
178 160
} //END OF NAMESPACE LEMON
179 161

	
180 162
#endif //LEMON_CLP_H
181 163

	
Ignore white space 6 line context
... ...
@@ -412,74 +412,75 @@
412 412

	
413 413
      /// \brief The running node of the iterator.
414 414
      ///
415 415
      /// Gives back the running node of the iterator.
416 416
      /// It is always the target of the pointed arc.
417 417
      Node runningNode(const OutArcIt&) const { return INVALID; }
418 418

	
419 419
      /// \brief The opposite node on the given arc.
420 420
      ///
421 421
      /// Gives back the opposite node on the given arc.
422 422
      Node oppositeNode(const Node&, const Arc&) const { return INVALID; }
423 423

	
424
      /// \brief Read write map of the nodes to type \c T.
424
      /// \brief Reference map of the nodes to type \c T.
425 425
      ///
426
      /// ReadWrite map of the nodes to type \c T.
427
      /// \sa Reference
426
      /// Reference map of the nodes to type \c T.
428 427
      template<class T>
429
      class NodeMap : public ReadWriteMap< Node, T > {
428
      class NodeMap : public ReferenceMap<Node, T, T&, const T&> {
430 429
      public:
431 430

	
432 431
        ///\e
433 432
        NodeMap(const Digraph&) { }
434 433
        ///\e
435 434
        NodeMap(const Digraph&, T) { }
436 435

	
437 436
      private:
438 437
        ///Copy constructor
439
        NodeMap(const NodeMap& nm) : ReadWriteMap< Node, T >(nm) { }
438
        NodeMap(const NodeMap& nm) : 
439
          ReferenceMap<Node, T, T&, const T&>(nm) { }
440 440
        ///Assignment operator
441 441
        template <typename CMap>
442 442
        NodeMap& operator=(const CMap&) {
443 443
          checkConcept<ReadMap<Node, T>, CMap>();
444 444
          return *this;
445 445
        }
446 446
      };
447 447

	
448
      /// \brief Read write map of the arcs to type \c T.
448
      /// \brief Reference map of the arcs to type \c T.
449 449
      ///
450 450
      /// Reference map of the arcs to type \c T.
451
      /// \sa Reference
452 451
      template<class T>
453
      class ArcMap : public ReadWriteMap<Arc,T> {
452
      class ArcMap : public ReferenceMap<Arc, T, T&, const T&> {
454 453
      public:
455 454

	
456 455
        ///\e
457 456
        ArcMap(const Digraph&) { }
458 457
        ///\e
459 458
        ArcMap(const Digraph&, T) { }
460 459
      private:
461 460
        ///Copy constructor
462
        ArcMap(const ArcMap& em) : ReadWriteMap<Arc,T>(em) { }
461
        ArcMap(const ArcMap& em) :
462
          ReferenceMap<Arc, T, T&, const T&>(em) { }
463 463
        ///Assignment operator
464 464
        template <typename CMap>
465 465
        ArcMap& operator=(const CMap&) {
466 466
          checkConcept<ReadMap<Arc, T>, CMap>();
467 467
          return *this;
468 468
        }
469 469
      };
470 470

	
471 471
      template <typename _Digraph>
472 472
      struct Constraints {
473 473
        void constraints() {
474
          checkConcept<BaseDigraphComponent, _Digraph>();
474 475
          checkConcept<IterableDigraphComponent<>, _Digraph>();
475 476
          checkConcept<IDableDigraphComponent<>, _Digraph>();
476 477
          checkConcept<MappableDigraphComponent<>, _Digraph>();
477 478
        }
478 479
      };
479 480

	
480 481
    };
481 482

	
482 483
  } //namespace concepts
483 484
} //namespace lemon
484 485

	
485 486

	
Ignore white space 6 line context
... ...
@@ -488,89 +488,89 @@
488 488

	
489 489
        /// Sets the iterator to the value of the trivial iterator \c e.
490 490
        /// This feature necessitates that each time we
491 491
        /// iterate the arc-set, the iteration order is the same.
492 492
        InArcIt(const Graph&, const Arc&) { }
493 493
        /// Next incoming arc
494 494

	
495 495
        /// Assign the iterator to the next inarc of the corresponding node.
496 496
        ///
497 497
        InArcIt& operator++() { return *this; }
498 498
      };
499 499

	
500
      /// \brief Read write map of the nodes to type \c T.
500
      /// \brief Reference map of the nodes to type \c T.
501 501
      ///
502
      /// ReadWrite map of the nodes to type \c T.
503
      /// \sa Reference
502
      /// Reference map of the nodes to type \c T.
504 503
      template<class T>
505
      class NodeMap : public ReadWriteMap< Node, T >
504
      class NodeMap : public ReferenceMap<Node, T, T&, const T&>
506 505
      {
507 506
      public:
508 507

	
509 508
        ///\e
510 509
        NodeMap(const Graph&) { }
511 510
        ///\e
512 511
        NodeMap(const Graph&, T) { }
513 512

	
514 513
      private:
515 514
        ///Copy constructor
516
        NodeMap(const NodeMap& nm) : ReadWriteMap< Node, T >(nm) { }
515
        NodeMap(const NodeMap& nm) :
516
          ReferenceMap<Node, T, T&, const T&>(nm) { }
517 517
        ///Assignment operator
518 518
        template <typename CMap>
519 519
        NodeMap& operator=(const CMap&) {
520 520
          checkConcept<ReadMap<Node, T>, CMap>();
521 521
          return *this;
522 522
        }
523 523
      };
524 524

	
525
      /// \brief Read write map of the directed arcs to type \c T.
525
      /// \brief Reference map of the arcs to type \c T.
526 526
      ///
527
      /// Reference map of the directed arcs to type \c T.
528
      /// \sa Reference
527
      /// Reference map of the arcs to type \c T.
529 528
      template<class T>
530
      class ArcMap : public ReadWriteMap<Arc,T>
529
      class ArcMap : public ReferenceMap<Arc, T, T&, const T&>
531 530
      {
532 531
      public:
533 532

	
534 533
        ///\e
535 534
        ArcMap(const Graph&) { }
536 535
        ///\e
537 536
        ArcMap(const Graph&, T) { }
538 537
      private:
539 538
        ///Copy constructor
540
        ArcMap(const ArcMap& em) : ReadWriteMap<Arc,T>(em) { }
539
        ArcMap(const ArcMap& em) :
540
          ReferenceMap<Arc, T, T&, const T&>(em) { }
541 541
        ///Assignment operator
542 542
        template <typename CMap>
543 543
        ArcMap& operator=(const CMap&) {
544 544
          checkConcept<ReadMap<Arc, T>, CMap>();
545 545
          return *this;
546 546
        }
547 547
      };
548 548

	
549
      /// Read write map of the edges to type \c T.
549
      /// Reference map of the edges to type \c T.
550 550

	
551
      /// Reference map of the arcs to type \c T.
552
      /// \sa Reference
551
      /// Reference map of the edges to type \c T.
553 552
      template<class T>
554
      class EdgeMap : public ReadWriteMap<Edge,T>
553
      class EdgeMap : public ReferenceMap<Edge, T, T&, const T&>
555 554
      {
556 555
      public:
557 556

	
558 557
        ///\e
559 558
        EdgeMap(const Graph&) { }
560 559
        ///\e
561 560
        EdgeMap(const Graph&, T) { }
562 561
      private:
563 562
        ///Copy constructor
564
        EdgeMap(const EdgeMap& em) : ReadWriteMap<Edge,T>(em) {}
563
        EdgeMap(const EdgeMap& em) :
564
          ReferenceMap<Edge, T, T&, const T&>(em) {}
565 565
        ///Assignment operator
566 566
        template <typename CMap>
567 567
        EdgeMap& operator=(const CMap&) {
568 568
          checkConcept<ReadMap<Edge, T>, CMap>();
569 569
          return *this;
570 570
        }
571 571
      };
572 572

	
573 573
      /// \brief Direct the given edge.
574 574
      ///
575 575
      /// Direct the given edge. The returned arc source
576 576
      /// will be the given node.
... ...
@@ -739,24 +739,25 @@
739 739
      }
740 740

	
741 741
      /// \brief Running node of the iterator
742 742
      ///
743 743
      /// Returns the running node of the iterator
744 744
      Node runningNode(IncEdgeIt) const {
745 745
        return INVALID;
746 746
      }
747 747

	
748 748
      template <typename _Graph>
749 749
      struct Constraints {
750 750
        void constraints() {
751
          checkConcept<BaseGraphComponent, _Graph>();
751 752
          checkConcept<IterableGraphComponent<>, _Graph>();
752 753
          checkConcept<IDableGraphComponent<>, _Graph>();
753 754
          checkConcept<MappableGraphComponent<>, _Graph>();
754 755
        }
755 756
      };
756 757

	
757 758
    };
758 759

	
759 760
  }
760 761

	
761 762
}
762 763

	
Ignore white space 6 line context
... ...
@@ -22,142 +22,139 @@
22 22

	
23 23
#ifndef LEMON_CONCEPTS_GRAPH_COMPONENTS_H
24 24
#define LEMON_CONCEPTS_GRAPH_COMPONENTS_H
25 25

	
26 26
#include <lemon/core.h>
27 27
#include <lemon/concepts/maps.h>
28 28

	
29 29
#include <lemon/bits/alteration_notifier.h>
30 30

	
31 31
namespace lemon {
32 32
  namespace concepts {
33 33

	
34
    /// \brief Skeleton class for graph Node and Arc types
34
    /// \brief Concept class for \c Node, \c Arc and \c Edge types.
35 35
    ///
36
    /// This class describes the interface of Node and Arc (and Edge
37
    /// in undirected graphs) subtypes of graph types.
36
    /// This class describes the concept of \c Node, \c Arc and \c Edge
37
    /// subtypes of digraph and graph types.
38 38
    ///
39 39
    /// \note This class is a template class so that we can use it to
40
    /// create graph skeleton classes. The reason for this is than Node
41
    /// and Arc types should \em not derive from the same base class.
42
    /// For Node you should instantiate it with character 'n' and for Arc
43
    /// with 'a'.
44

	
40
    /// create graph skeleton classes. The reason for this is that \c Node
41
    /// and \c Arc (or \c Edge) types should \e not derive from the same 
42
    /// base class. For \c Node you should instantiate it with character
43
    /// \c 'n', for \c Arc with \c 'a' and for \c Edge with \c 'e'.
45 44
#ifndef DOXYGEN
46 45
    template <char sel = '0'>
47 46
#endif
48 47
    class GraphItem {
49 48
    public:
50 49
      /// \brief Default constructor.
51 50
      ///
51
      /// Default constructor.
52 52
      /// \warning The default constructor is not required to set
53 53
      /// the item to some well-defined value. So you should consider it
54 54
      /// as uninitialized.
55 55
      GraphItem() {}
56

	
56 57
      /// \brief Copy constructor.
57 58
      ///
58 59
      /// Copy constructor.
60
      GraphItem(const GraphItem &) {}
61

	
62
      /// \brief Constructor for conversion from \c INVALID.
59 63
      ///
60
      GraphItem(const GraphItem &) {}
61
      /// \brief Invalid constructor \& conversion.
62
      ///
63
      /// This constructor initializes the item to be invalid.
64
      /// Constructor for conversion from \c INVALID.
65
      /// It initializes the item to be invalid.
64 66
      /// \sa Invalid for more details.
65 67
      GraphItem(Invalid) {}
66
      /// \brief Assign operator for nodes.
68

	
69
      /// \brief Assignment operator.
67 70
      ///
68
      /// The nodes are assignable.
69
      ///
70
      GraphItem& operator=(GraphItem const&) { return *this; }
71
      /// Assignment operator for the item.
72
      GraphItem& operator=(const GraphItem&) { return *this; }
73

	
71 74
      /// \brief Equality operator.
72 75
      ///
73
      /// Two iterators are equal if and only if they represents the
74
      /// same node in the graph or both are invalid.
75
      bool operator==(GraphItem) const { return false; }
76
      /// Equality operator.
77
      bool operator==(const GraphItem&) const { return false; }
78

	
76 79
      /// \brief Inequality operator.
77 80
      ///
78
      /// \sa operator==(const Node& n)
81
      /// Inequality operator.
82
      bool operator!=(const GraphItem&) const { return false; }
83

	
84
      /// \brief Ordering operator.
79 85
      ///
80
      bool operator!=(GraphItem) const { return false; }
81

	
82
      /// \brief Artificial ordering operator.
83
      ///
84
      /// To allow the use of graph descriptors as key type in std::map or
85
      /// similar associative container we require this.
86
      /// This operator defines an ordering of the items.
87
      /// It makes possible to use graph item types as key types in 
88
      /// associative containers (e.g. \c std::map).
86 89
      ///
87 90
      /// \note This operator only have to define some strict ordering of
88 91
      /// the items; this order has nothing to do with the iteration
89 92
      /// ordering of the items.
90
      bool operator<(GraphItem) const { return false; }
93
      bool operator<(const GraphItem&) const { return false; }
91 94

	
92 95
      template<typename _GraphItem>
93 96
      struct Constraints {
94 97
        void constraints() {
95 98
          _GraphItem i1;
96 99
          _GraphItem i2 = i1;
97 100
          _GraphItem i3 = INVALID;
98 101

	
99 102
          i1 = i2 = i3;
100 103

	
101 104
          bool b;
102
          //          b = (ia == ib) && (ia != ib) && (ia < ib);
103 105
          b = (ia == ib) && (ia != ib);
104 106
          b = (ia == INVALID) && (ib != INVALID);
105 107
          b = (ia < ib);
106 108
        }
107 109

	
108 110
        const _GraphItem &ia;
109 111
        const _GraphItem &ib;
110 112
      };
111 113
    };
112 114

	
113
    /// \brief An empty base directed graph class.
115
    /// \brief Base skeleton class for directed graphs.
114 116
    ///
115
    /// This class provides the minimal set of features needed for a
116
    /// directed graph structure. All digraph concepts have to
117
    /// conform to this base directed graph. It just provides types
118
    /// for nodes and arcs and functions to get the source and the
119
    /// target of the arcs.
117
    /// This class describes the base interface of directed graph types.
118
    /// All digraph %concepts have to conform to this class.
119
    /// It just provides types for nodes and arcs and functions 
120
    /// to get the source and the target nodes of arcs.
120 121
    class BaseDigraphComponent {
121 122
    public:
122 123

	
123 124
      typedef BaseDigraphComponent Digraph;
124 125

	
125 126
      /// \brief Node class of the digraph.
126 127
      ///
127
      /// This class represents the Nodes of the digraph.
128
      ///
128
      /// This class represents the nodes of the digraph.
129 129
      typedef GraphItem<'n'> Node;
130 130

	
131 131
      /// \brief Arc class of the digraph.
132 132
      ///
133
      /// This class represents the Arcs of the digraph.
133
      /// This class represents the arcs of the digraph.
134
      typedef GraphItem<'a'> Arc;
135

	
136
      /// \brief Return the source node of an arc.
134 137
      ///
135
      typedef GraphItem<'e'> Arc;
138
      /// This function returns the source node of an arc.
139
      Node source(const Arc&) const { return INVALID; }
136 140

	
137
      /// \brief Gives back the target node of an arc.
141
      /// \brief Return the target node of an arc.
138 142
      ///
139
      /// Gives back the target node of an arc.
143
      /// This function returns the target node of an arc.
144
      Node target(const Arc&) const { return INVALID; }
145

	
146
      /// \brief Return the opposite node on the given arc.
140 147
      ///
141
      Node target(const Arc&) const { return INVALID;}
142

	
143
      /// \brief Gives back the source node of an arc.
144
      ///
145
      /// Gives back the source node of an arc.
146
      ///
147
      Node source(const Arc&) const { return INVALID;}
148

	
149
      /// \brief Gives back the opposite node on the given arc.
150
      ///
151
      /// Gives back the opposite node on the given arc.
148
      /// This function returns the opposite node on the given arc.
152 149
      Node oppositeNode(const Node&, const Arc&) const {
153 150
        return INVALID;
154 151
      }
155 152

	
156 153
      template <typename _Digraph>
157 154
      struct Constraints {
158 155
        typedef typename _Digraph::Node Node;
159 156
        typedef typename _Digraph::Arc Arc;
160 157

	
161 158
        void constraints() {
162 159
          checkConcept<GraphItem<'n'>, Node>();
163 160
          checkConcept<GraphItem<'a'>, Arc>();
... ...
@@ -165,192 +162,196 @@
165 162
            Node n;
166 163
            Arc e(INVALID);
167 164
            n = digraph.source(e);
168 165
            n = digraph.target(e);
169 166
            n = digraph.oppositeNode(n, e);
170 167
          }
171 168
        }
172 169

	
173 170
        const _Digraph& digraph;
174 171
      };
175 172
    };
176 173

	
177
    /// \brief An empty base undirected graph class.
174
    /// \brief Base skeleton class for undirected graphs.
178 175
    ///
179
    /// This class provides the minimal set of features needed for an
180
    /// undirected graph structure. All undirected graph concepts have
181
    /// to conform to this base graph. It just provides types for
182
    /// nodes, arcs and edges and functions to get the
183
    /// source and the target of the arcs and edges,
184
    /// conversion from arcs to edges and function to get
185
    /// both direction of the edges.
176
    /// This class describes the base interface of undirected graph types.
177
    /// All graph %concepts have to conform to this class.
178
    /// It extends the interface of \ref BaseDigraphComponent with an
179
    /// \c Edge type and functions to get the end nodes of edges,
180
    /// to convert from arcs to edges and to get both direction of edges.
186 181
    class BaseGraphComponent : public BaseDigraphComponent {
187 182
    public:
188 183
      typedef BaseDigraphComponent::Node Node;
189 184
      typedef BaseDigraphComponent::Arc Arc;
190
      /// \brief Undirected arc class of the graph.
185

	
186
      /// \brief Undirected edge class of the graph.
191 187
      ///
192
      /// This class represents the edges of the graph.
193
      /// The undirected graphs can be used as a directed graph which
194
      /// for each arc contains the opposite arc too so the graph is
195
      /// bidirected. The edge represents two opposite
196
      /// directed arcs.
197
      class Edge : public GraphItem<'u'> {
188
      /// This class represents the undirected edges of the graph.
189
      /// Undirected graphs can be used as directed graphs, each edge is
190
      /// represented by two opposite directed arcs.
191
      class Edge : public GraphItem<'e'> {
198 192
      public:
199
        typedef GraphItem<'u'> Parent;
193
        typedef GraphItem<'e'> Parent;
194

	
200 195
        /// \brief Default constructor.
201 196
        ///
197
        /// Default constructor.
202 198
        /// \warning The default constructor is not required to set
203 199
        /// the item to some well-defined value. So you should consider it
204 200
        /// as uninitialized.
205 201
        Edge() {}
202

	
206 203
        /// \brief Copy constructor.
207 204
        ///
208 205
        /// Copy constructor.
206
        Edge(const Edge &) : Parent() {}
207

	
208
        /// \brief Constructor for conversion from \c INVALID.
209 209
        ///
210
        Edge(const Edge &) : Parent() {}
211
        /// \brief Invalid constructor \& conversion.
212
        ///
213
        /// This constructor initializes the item to be invalid.
210
        /// Constructor for conversion from \c INVALID.
211
        /// It initializes the item to be invalid.
214 212
        /// \sa Invalid for more details.
215 213
        Edge(Invalid) {}
216
        /// \brief Converter from arc to edge.
214

	
215
        /// \brief Constructor for conversion from an arc.
217 216
        ///
217
        /// Constructor for conversion from an arc.
218 218
        /// Besides the core graph item functionality each arc should
219 219
        /// be convertible to the represented edge.
220 220
        Edge(const Arc&) {}
221
        /// \brief Assign arc to edge.
221

	
222
        /// \brief Assign an arc to an edge.
222 223
        ///
224
        /// This function assigns an arc to an edge.
223 225
        /// Besides the core graph item functionality each arc should
224 226
        /// be convertible to the represented edge.
225 227
        Edge& operator=(const Arc&) { return *this; }
226 228
      };
227 229

	
228
      /// \brief Returns the direction of the arc.
230
      /// \brief Return one end node of an edge.
231
      ///
232
      /// This function returns one end node of an edge.
233
      Node u(const Edge&) const { return INVALID; }
234

	
235
      /// \brief Return the other end node of an edge.
236
      ///
237
      /// This function returns the other end node of an edge.
238
      Node v(const Edge&) const { return INVALID; }
239

	
240
      /// \brief Return a directed arc related to an edge.
241
      ///
242
      /// This function returns a directed arc from its direction and the
243
      /// represented edge.
244
      Arc direct(const Edge&, bool) const { return INVALID; }
245

	
246
      /// \brief Return a directed arc related to an edge.
247
      ///
248
      /// This function returns a directed arc from its source node and the
249
      /// represented edge.
250
      Arc direct(const Edge&, const Node&) const { return INVALID; }
251

	
252
      /// \brief Return the direction of the arc.
229 253
      ///
230 254
      /// Returns the direction of the arc. Each arc represents an
231 255
      /// edge with a direction. It gives back the
232 256
      /// direction.
233 257
      bool direction(const Arc&) const { return true; }
234 258

	
235
      /// \brief Returns the directed arc.
259
      /// \brief Return the opposite arc.
236 260
      ///
237
      /// Returns the directed arc from its direction and the
238
      /// represented edge.
239
      Arc direct(const Edge&, bool) const { return INVALID;}
240

	
241
      /// \brief Returns the directed arc.
242
      ///
243
      /// Returns the directed arc from its source and the
244
      /// represented edge.
245
      Arc direct(const Edge&, const Node&) const { return INVALID;}
246

	
247
      /// \brief Returns the opposite arc.
248
      ///
249
      /// Returns the opposite arc. It is the arc representing the
250
      /// same edge and has opposite direction.
251
      Arc oppositeArc(const Arc&) const { return INVALID;}
252

	
253
      /// \brief Gives back one ending of an edge.
254
      ///
255
      /// Gives back one ending of an edge.
256
      Node u(const Edge&) const { return INVALID;}
257

	
258
      /// \brief Gives back the other ending of an edge.
259
      ///
260
      /// Gives back the other ending of an edge.
261
      Node v(const Edge&) const { return INVALID;}
261
      /// This function returns the opposite arc, i.e. the arc representing
262
      /// the same edge and has opposite direction.
263
      Arc oppositeArc(const Arc&) const { return INVALID; }
262 264

	
263 265
      template <typename _Graph>
264 266
      struct Constraints {
265 267
        typedef typename _Graph::Node Node;
266 268
        typedef typename _Graph::Arc Arc;
267 269
        typedef typename _Graph::Edge Edge;
268 270

	
269 271
        void constraints() {
270 272
          checkConcept<BaseDigraphComponent, _Graph>();
271
          checkConcept<GraphItem<'u'>, Edge>();
273
          checkConcept<GraphItem<'e'>, Edge>();
272 274
          {
273 275
            Node n;
274 276
            Edge ue(INVALID);
275 277
            Arc e;
276 278
            n = graph.u(ue);
277 279
            n = graph.v(ue);
278 280
            e = graph.direct(ue, true);
281
            e = graph.direct(ue, false);
279 282
            e = graph.direct(ue, n);
280 283
            e = graph.oppositeArc(e);
281 284
            ue = e;
282 285
            bool d = graph.direction(e);
283 286
            ignore_unused_variable_warning(d);
284 287
          }
285 288
        }
286 289

	
287 290
        const _Graph& graph;
288 291
      };
289 292

	
290 293
    };
291 294

	
292
    /// \brief An empty idable base digraph class.
295
    /// \brief Skeleton class for \e idable directed graphs.
293 296
    ///
294
    /// This class provides beside the core digraph features
295
    /// core id functions for the digraph structure.
296
    /// The most of the base digraphs should conform to this concept.
297
    /// The id's are unique and immutable.
297
    /// This class describes the interface of \e idable directed graphs.
298
    /// It extends \ref BaseDigraphComponent with the core ID functions.
299
    /// The ids of the items must be unique and immutable.
300
    /// This concept is part of the Digraph concept.
298 301
    template <typename BAS = BaseDigraphComponent>
299 302
    class IDableDigraphComponent : public BAS {
300 303
    public:
301 304

	
302 305
      typedef BAS Base;
303 306
      typedef typename Base::Node Node;
304 307
      typedef typename Base::Arc Arc;
305 308

	
306
      /// \brief Gives back an unique integer id for the Node.
309
      /// \brief Return a unique integer id for the given node.
307 310
      ///
308
      /// Gives back an unique integer id for the Node.
311
      /// This function returns a unique integer id for the given node.
312
      int id(const Node&) const { return -1; }
313

	
314
      /// \brief Return the node by its unique id.
309 315
      ///
310
      int id(const Node&) const { return -1;}
316
      /// This function returns the node by its unique id.
317
      /// If the digraph does not contain a node with the given id,
318
      /// then the result of the function is undefined.
319
      Node nodeFromId(int) const { return INVALID; }
311 320

	
312
      /// \brief Gives back the node by the unique id.
321
      /// \brief Return a unique integer id for the given arc.
313 322
      ///
314
      /// Gives back the node by the unique id.
315
      /// If the digraph does not contain node with the given id
316
      /// then the result of the function is undetermined.
317
      Node nodeFromId(int) const { return INVALID;}
323
      /// This function returns a unique integer id for the given arc.
324
      int id(const Arc&) const { return -1; }
318 325

	
319
      /// \brief Gives back an unique integer id for the Arc.
326
      /// \brief Return the arc by its unique id.
320 327
      ///
321
      /// Gives back an unique integer id for the Arc.
328
      /// This function returns the arc by its unique id.
329
      /// If the digraph does not contain an arc with the given id,
330
      /// then the result of the function is undefined.
331
      Arc arcFromId(int) const { return INVALID; }
332

	
333
      /// \brief Return an integer greater or equal to the maximum
334
      /// node id.
322 335
      ///
323
      int id(const Arc&) const { return -1;}
336
      /// This function returns an integer greater or equal to the
337
      /// maximum node id.
338
      int maxNodeId() const { return -1; }
324 339

	
325
      /// \brief Gives back the arc by the unique id.
340
      /// \brief Return an integer greater or equal to the maximum
341
      /// arc id.
326 342
      ///
327
      /// Gives back the arc by the unique id.
328
      /// If the digraph does not contain arc with the given id
329
      /// then the result of the function is undetermined.
330
      Arc arcFromId(int) const { return INVALID;}
331

	
332
      /// \brief Gives back an integer greater or equal to the maximum
333
      /// Node id.
334
      ///
335
      /// Gives back an integer greater or equal to the maximum Node
336
      /// id.
337
      int maxNodeId() const { return -1;}
338

	
339
      /// \brief Gives back an integer greater or equal to the maximum
340
      /// Arc id.
341
      ///
342
      /// Gives back an integer greater or equal to the maximum Arc
343
      /// id.
344
      int maxArcId() const { return -1;}
343
      /// This function returns an integer greater or equal to the
344
      /// maximum arc id.
345
      int maxArcId() const { return -1; }
345 346

	
346 347
      template <typename _Digraph>
347 348
      struct Constraints {
348 349

	
349 350
        void constraints() {
350 351
          checkConcept<Base, _Digraph >();
351 352
          typename _Digraph::Node node;
352 353
          int nid = digraph.id(node);
353 354
          nid = digraph.id(node);
354 355
          node = digraph.nodeFromId(nid);
355 356
          typename _Digraph::Arc arc;
356 357
          int eid = digraph.id(arc);
... ...
@@ -358,351 +359,362 @@
358 359
          arc = digraph.arcFromId(eid);
359 360

	
360 361
          nid = digraph.maxNodeId();
361 362
          ignore_unused_variable_warning(nid);
362 363
          eid = digraph.maxArcId();
363 364
          ignore_unused_variable_warning(eid);
364 365
        }
365 366

	
366 367
        const _Digraph& digraph;
367 368
      };
368 369
    };
369 370

	
370
    /// \brief An empty idable base undirected graph class.
371
    /// \brief Skeleton class for \e idable undirected graphs.
371 372
    ///
372
    /// This class provides beside the core undirected graph features
373
    /// core id functions for the undirected graph structure.  The
374
    /// most of the base undirected graphs should conform to this
375
    /// concept.  The id's are unique and immutable.
373
    /// This class describes the interface of \e idable undirected
374
    /// graphs. It extends \ref IDableDigraphComponent with the core ID
375
    /// functions of undirected graphs.
376
    /// The ids of the items must be unique and immutable.
377
    /// This concept is part of the Graph concept.
376 378
    template <typename BAS = BaseGraphComponent>
377 379
    class IDableGraphComponent : public IDableDigraphComponent<BAS> {
378 380
    public:
379 381

	
380 382
      typedef BAS Base;
381 383
      typedef typename Base::Edge Edge;
382 384

	
383 385
      using IDableDigraphComponent<Base>::id;
384 386

	
385
      /// \brief Gives back an unique integer id for the Edge.
387
      /// \brief Return a unique integer id for the given edge.
386 388
      ///
387
      /// Gives back an unique integer id for the Edge.
389
      /// This function returns a unique integer id for the given edge.
390
      int id(const Edge&) const { return -1; }
391

	
392
      /// \brief Return the edge by its unique id.
388 393
      ///
389
      int id(const Edge&) const { return -1;}
394
      /// This function returns the edge by its unique id.
395
      /// If the graph does not contain an edge with the given id,
396
      /// then the result of the function is undefined.
397
      Edge edgeFromId(int) const { return INVALID; }
390 398

	
391
      /// \brief Gives back the edge by the unique id.
399
      /// \brief Return an integer greater or equal to the maximum
400
      /// edge id.
392 401
      ///
393
      /// Gives back the edge by the unique id.  If the
394
      /// graph does not contain arc with the given id then the
395
      /// result of the function is undetermined.
396
      Edge edgeFromId(int) const { return INVALID;}
397

	
398
      /// \brief Gives back an integer greater or equal to the maximum
399
      /// Edge id.
400
      ///
401
      /// Gives back an integer greater or equal to the maximum Edge
402
      /// id.
403
      int maxEdgeId() const { return -1;}
402
      /// This function returns an integer greater or equal to the
403
      /// maximum edge id.
404
      int maxEdgeId() const { return -1; }
404 405

	
405 406
      template <typename _Graph>
406 407
      struct Constraints {
407 408

	
408 409
        void constraints() {
409
          checkConcept<Base, _Graph >();
410 410
          checkConcept<IDableDigraphComponent<Base>, _Graph >();
411 411
          typename _Graph::Edge edge;
412 412
          int ueid = graph.id(edge);
413 413
          ueid = graph.id(edge);
414 414
          edge = graph.edgeFromId(ueid);
415 415
          ueid = graph.maxEdgeId();
416 416
          ignore_unused_variable_warning(ueid);
417 417
        }
418 418

	
419 419
        const _Graph& graph;
420 420
      };
421 421
    };
422 422

	
423
    /// \brief Skeleton class for graph NodeIt and ArcIt
423
    /// \brief Concept class for \c NodeIt, \c ArcIt and \c EdgeIt types.
424 424
    ///
425
    /// Skeleton class for graph NodeIt and ArcIt.
426
    ///
425
    /// This class describes the concept of \c NodeIt, \c ArcIt and 
426
    /// \c EdgeIt subtypes of digraph and graph types.
427 427
    template <typename GR, typename Item>
428 428
    class GraphItemIt : public Item {
429 429
    public:
430 430
      /// \brief Default constructor.
431 431
      ///
432
      /// @warning The default constructor sets the iterator
433
      /// to an undefined value.
432
      /// Default constructor.
433
      /// \warning The default constructor is not required to set
434
      /// the iterator to some well-defined value. So you should consider it
435
      /// as uninitialized.
434 436
      GraphItemIt() {}
437

	
435 438
      /// \brief Copy constructor.
436 439
      ///
437 440
      /// Copy constructor.
441
      GraphItemIt(const GraphItemIt& it) : Item(it) {}
442

	
443
      /// \brief Constructor that sets the iterator to the first item.
438 444
      ///
439
      GraphItemIt(const GraphItemIt& ) {}
440
      /// \brief Sets the iterator to the first item.
445
      /// Constructor that sets the iterator to the first item.
446
      explicit GraphItemIt(const GR&) {}
447

	
448
      /// \brief Constructor for conversion from \c INVALID.
441 449
      ///
442
      /// Sets the iterator to the first item of \c the graph.
443
      ///
444
      explicit GraphItemIt(const GR&) {}
445
      /// \brief Invalid constructor \& conversion.
446
      ///
447
      /// This constructor initializes the item to be invalid.
450
      /// Constructor for conversion from \c INVALID.
451
      /// It initializes the iterator to be invalid.
448 452
      /// \sa Invalid for more details.
449 453
      GraphItemIt(Invalid) {}
450
      /// \brief Assign operator for items.
454

	
455
      /// \brief Assignment operator.
451 456
      ///
452
      /// The items are assignable.
457
      /// Assignment operator for the iterator.
458
      GraphItemIt& operator=(const GraphItemIt&) { return *this; }
459

	
460
      /// \brief Increment the iterator.
453 461
      ///
454
      GraphItemIt& operator=(const GraphItemIt&) { return *this; }
455
      /// \brief Next item.
456
      ///
457
      /// Assign the iterator to the next item.
458
      ///
462
      /// This operator increments the iterator, i.e. assigns it to the
463
      /// next item.
459 464
      GraphItemIt& operator++() { return *this; }
465
 
460 466
      /// \brief Equality operator
461 467
      ///
468
      /// Equality operator.
462 469
      /// Two iterators are equal if and only if they point to the
463 470
      /// same object or both are invalid.
464 471
      bool operator==(const GraphItemIt&) const { return true;}
472

	
465 473
      /// \brief Inequality operator
466 474
      ///
467
      /// \sa operator==(Node n)
468
      ///
475
      /// Inequality operator.
476
      /// Two iterators are equal if and only if they point to the
477
      /// same object or both are invalid.
469 478
      bool operator!=(const GraphItemIt&) const { return true;}
470 479

	
471 480
      template<typename _GraphItemIt>
472 481
      struct Constraints {
473 482
        void constraints() {
483
          checkConcept<GraphItem<>, _GraphItemIt>();
474 484
          _GraphItemIt it1(g);
475 485
          _GraphItemIt it2;
486
          _GraphItemIt it3 = it1;
487
          _GraphItemIt it4 = INVALID;
476 488

	
477 489
          it2 = ++it1;
478 490
          ++it2 = it1;
479 491
          ++(++it1);
480 492

	
481 493
          Item bi = it1;
482 494
          bi = it2;
483 495
        }
484
        GR& g;
496
        const GR& g;
485 497
      };
486 498
    };
487 499

	
488
    /// \brief Skeleton class for graph InArcIt and OutArcIt
500
    /// \brief Concept class for \c InArcIt, \c OutArcIt and 
501
    /// \c IncEdgeIt types.
489 502
    ///
490
    /// \note Because InArcIt and OutArcIt may not inherit from the same
491
    /// base class, the \c sel is a additional template parameter (selector).
492
    /// For InArcIt you should instantiate it with character 'i' and for
493
    /// OutArcIt with 'o'.
503
    /// This class describes the concept of \c InArcIt, \c OutArcIt 
504
    /// and \c IncEdgeIt subtypes of digraph and graph types.
505
    ///
506
    /// \note Since these iterator classes do not inherit from the same
507
    /// base class, there is an additional template parameter (selector)
508
    /// \c sel. For \c InArcIt you should instantiate it with character 
509
    /// \c 'i', for \c OutArcIt with \c 'o' and for \c IncEdgeIt with \c 'e'.
494 510
    template <typename GR,
495 511
              typename Item = typename GR::Arc,
496 512
              typename Base = typename GR::Node,
497 513
              char sel = '0'>
498 514
    class GraphIncIt : public Item {
499 515
    public:
500 516
      /// \brief Default constructor.
501 517
      ///
502
      /// @warning The default constructor sets the iterator
503
      /// to an undefined value.
518
      /// Default constructor.
519
      /// \warning The default constructor is not required to set
520
      /// the iterator to some well-defined value. So you should consider it
521
      /// as uninitialized.
504 522
      GraphIncIt() {}
523

	
505 524
      /// \brief Copy constructor.
506 525
      ///
507 526
      /// Copy constructor.
527
      GraphIncIt(const GraphIncIt& it) : Item(it) {}
528

	
529
      /// \brief Constructor that sets the iterator to the first 
530
      /// incoming or outgoing arc.
508 531
      ///
509
      GraphIncIt(GraphIncIt const& gi) : Item(gi) {}
510
      /// \brief Sets the iterator to the first arc incoming into or outgoing
511
      /// from the node.
532
      /// Constructor that sets the iterator to the first arc 
533
      /// incoming to or outgoing from the given node.
534
      explicit GraphIncIt(const GR&, const Base&) {}
535

	
536
      /// \brief Constructor for conversion from \c INVALID.
512 537
      ///
513
      /// Sets the iterator to the first arc incoming into or outgoing
514
      /// from the node.
515
      ///
516
      explicit GraphIncIt(const GR&, const Base&) {}
517
      /// \brief Invalid constructor \& conversion.
518
      ///
519
      /// This constructor initializes the item to be invalid.
538
      /// Constructor for conversion from \c INVALID.
539
      /// It initializes the iterator to be invalid.
520 540
      /// \sa Invalid for more details.
521 541
      GraphIncIt(Invalid) {}
522
      /// \brief Assign operator for iterators.
542

	
543
      /// \brief Assignment operator.
523 544
      ///
524
      /// The iterators are assignable.
545
      /// Assignment operator for the iterator.
546
      GraphIncIt& operator=(const GraphIncIt&) { return *this; }
547

	
548
      /// \brief Increment the iterator.
525 549
      ///
526
      GraphIncIt& operator=(GraphIncIt const&) { return *this; }
527
      /// \brief Next item.
528
      ///
529
      /// Assign the iterator to the next item.
530
      ///
550
      /// This operator increments the iterator, i.e. assigns it to the
551
      /// next arc incoming to or outgoing from the given node.
531 552
      GraphIncIt& operator++() { return *this; }
532 553

	
533 554
      /// \brief Equality operator
534 555
      ///
556
      /// Equality operator.
535 557
      /// Two iterators are equal if and only if they point to the
536 558
      /// same object or both are invalid.
537 559
      bool operator==(const GraphIncIt&) const { return true;}
538 560

	
539 561
      /// \brief Inequality operator
540 562
      ///
541
      /// \sa operator==(Node n)
542
      ///
563
      /// Inequality operator.
564
      /// Two iterators are equal if and only if they point to the
565
      /// same object or both are invalid.
543 566
      bool operator!=(const GraphIncIt&) const { return true;}
544 567

	
545 568
      template <typename _GraphIncIt>
546 569
      struct Constraints {
547 570
        void constraints() {
548 571
          checkConcept<GraphItem<sel>, _GraphIncIt>();
549 572
          _GraphIncIt it1(graph, node);
550 573
          _GraphIncIt it2;
574
          _GraphIncIt it3 = it1;
575
          _GraphIncIt it4 = INVALID;
551 576

	
552 577
          it2 = ++it1;
553 578
          ++it2 = it1;
554 579
          ++(++it1);
555 580
          Item e = it1;
556 581
          e = it2;
557

	
558 582
        }
559

	
560
        Item arc;
561
        Base node;
562
        GR graph;
563
        _GraphIncIt it;
583
        const Base& node;
584
        const GR& graph;
564 585
      };
565 586
    };
566 587

	
567

	
568
    /// \brief An empty iterable digraph class.
588
    /// \brief Skeleton class for iterable directed graphs.
569 589
    ///
570
    /// This class provides beside the core digraph features
571
    /// iterator based iterable interface for the digraph structure.
590
    /// This class describes the interface of iterable directed
591
    /// graphs. It extends \ref BaseDigraphComponent with the core
592
    /// iterable interface.
572 593
    /// This concept is part of the Digraph concept.
573 594
    template <typename BAS = BaseDigraphComponent>
574 595
    class IterableDigraphComponent : public BAS {
575 596

	
576 597
    public:
577 598

	
578 599
      typedef BAS Base;
579 600
      typedef typename Base::Node Node;
580 601
      typedef typename Base::Arc Arc;
581 602

	
582 603
      typedef IterableDigraphComponent Digraph;
583 604

	
584
      /// \name Base iteration
605
      /// \name Base Iteration
585 606
      ///
586
      /// This interface provides functions for iteration on digraph items
607
      /// This interface provides functions for iteration on digraph items.
587 608
      ///
588 609
      /// @{
589 610

	
590
      /// \brief Gives back the first node in the iterating order.
611
      /// \brief Return the first node.
591 612
      ///
592
      /// Gives back the first node in the iterating order.
593
      ///
613
      /// This function gives back the first node in the iteration order.
594 614
      void first(Node&) const {}
595 615

	
596
      /// \brief Gives back the next node in the iterating order.
616
      /// \brief Return the next node.
597 617
      ///
598
      /// Gives back the next node in the iterating order.
599
      ///
618
      /// This function gives back the next node in the iteration order.
600 619
      void next(Node&) const {}
601 620

	
602
      /// \brief Gives back the first arc in the iterating order.
621
      /// \brief Return the first arc.
603 622
      ///
604
      /// Gives back the first arc in the iterating order.
605
      ///
623
      /// This function gives back the first arc in the iteration order.
606 624
      void first(Arc&) const {}
607 625

	
608
      /// \brief Gives back the next arc in the iterating order.
626
      /// \brief Return the next arc.
609 627
      ///
610
      /// Gives back the next arc in the iterating order.
611
      ///
628
      /// This function gives back the next arc in the iteration order.
612 629
      void next(Arc&) const {}
613 630

	
614

	
615
      /// \brief Gives back the first of the arcs point to the given
616
      /// node.
631
      /// \brief Return the first arc incomming to the given node.
617 632
      ///
618
      /// Gives back the first of the arcs point to the given node.
619
      ///
633
      /// This function gives back the first arc incomming to the
634
      /// given node.
620 635
      void firstIn(Arc&, const Node&) const {}
621 636

	
622
      /// \brief Gives back the next of the arcs points to the given
623
      /// node.
637
      /// \brief Return the next arc incomming to the given node.
624 638
      ///
625
      /// Gives back the next of the arcs points to the given node.
626
      ///
639
      /// This function gives back the next arc incomming to the
640
      /// given node.
627 641
      void nextIn(Arc&) const {}
628 642

	
629
      /// \brief Gives back the first of the arcs start from the
643
      /// \brief Return the first arc outgoing form the given node.
644
      ///
645
      /// This function gives back the first arc outgoing form the
630 646
      /// given node.
631
      ///
632
      /// Gives back the first of the arcs start from the given node.
633
      ///
634 647
      void firstOut(Arc&, const Node&) const {}
635 648

	
636
      /// \brief Gives back the next of the arcs start from the given
637
      /// node.
649
      /// \brief Return the next arc outgoing form the given node.
638 650
      ///
639
      /// Gives back the next of the arcs start from the given node.
640
      ///
651
      /// This function gives back the next arc outgoing form the
652
      /// given node.
641 653
      void nextOut(Arc&) const {}
642 654

	
643 655
      /// @}
644 656

	
645
      /// \name Class based iteration
657
      /// \name Class Based Iteration
646 658
      ///
647
      /// This interface provides functions for iteration on digraph items
659
      /// This interface provides iterator classes for digraph items.
648 660
      ///
649 661
      /// @{
650 662

	
651 663
      /// \brief This iterator goes through each node.
652 664
      ///
653 665
      /// This iterator goes through each node.
654 666
      ///
655 667
      typedef GraphItemIt<Digraph, Node> NodeIt;
656 668

	
657
      /// \brief This iterator goes through each node.
669
      /// \brief This iterator goes through each arc.
658 670
      ///
659
      /// This iterator goes through each node.
671
      /// This iterator goes through each arc.
660 672
      ///
661 673
      typedef GraphItemIt<Digraph, Arc> ArcIt;
662 674

	
663 675
      /// \brief This iterator goes trough the incoming arcs of a node.
664 676
      ///
665
      /// This iterator goes trough the \e inccoming arcs of a certain node
677
      /// This iterator goes trough the \e incoming arcs of a certain node
666 678
      /// of a digraph.
667 679
      typedef GraphIncIt<Digraph, Arc, Node, 'i'> InArcIt;
668 680

	
669 681
      /// \brief This iterator goes trough the outgoing arcs of a node.
670 682
      ///
671 683
      /// This iterator goes trough the \e outgoing arcs of a certain node
672 684
      /// of a digraph.
673 685
      typedef GraphIncIt<Digraph, Arc, Node, 'o'> OutArcIt;
674 686

	
675 687
      /// \brief The base node of the iterator.
676 688
      ///
677
      /// Gives back the base node of the iterator.
678
      /// It is always the target of the pointed arc.
689
      /// This function gives back the base node of the iterator.
690
      /// It is always the target node of the pointed arc.
679 691
      Node baseNode(const InArcIt&) const { return INVALID; }
680 692

	
681 693
      /// \brief The running node of the iterator.
682 694
      ///
683
      /// Gives back the running node of the iterator.
684
      /// It is always the source of the pointed arc.
695
      /// This function gives back the running node of the iterator.
696
      /// It is always the source node of the pointed arc.
685 697
      Node runningNode(const InArcIt&) const { return INVALID; }
686 698

	
687 699
      /// \brief The base node of the iterator.
688 700
      ///
689
      /// Gives back the base node of the iterator.
690
      /// It is always the source of the pointed arc.
701
      /// This function gives back the base node of the iterator.
702
      /// It is always the source node of the pointed arc.
691 703
      Node baseNode(const OutArcIt&) const { return INVALID; }
692 704

	
693 705
      /// \brief The running node of the iterator.
694 706
      ///
695
      /// Gives back the running node of the iterator.
696
      /// It is always the target of the pointed arc.
707
      /// This function gives back the running node of the iterator.
708
      /// It is always the target node of the pointed arc.
697 709
      Node runningNode(const OutArcIt&) const { return INVALID; }
698 710

	
699 711
      /// @}
700 712

	
701 713
      template <typename _Digraph>
702 714
      struct Constraints {
703 715
        void constraints() {
704 716
          checkConcept<Base, _Digraph>();
705 717

	
706 718
          {
707 719
            typename _Digraph::Node node(INVALID);
708 720
            typename _Digraph::Arc arc(INVALID);
... ...
@@ -726,125 +738,121 @@
726 738

	
727 739
          {
728 740
            checkConcept<GraphItemIt<_Digraph, typename _Digraph::Arc>,
729 741
              typename _Digraph::ArcIt >();
730 742
            checkConcept<GraphItemIt<_Digraph, typename _Digraph::Node>,
731 743
              typename _Digraph::NodeIt >();
732 744
            checkConcept<GraphIncIt<_Digraph, typename _Digraph::Arc,
733 745
              typename _Digraph::Node, 'i'>, typename _Digraph::InArcIt>();
734 746
            checkConcept<GraphIncIt<_Digraph, typename _Digraph::Arc,
735 747
              typename _Digraph::Node, 'o'>, typename _Digraph::OutArcIt>();
736 748

	
737 749
            typename _Digraph::Node n;
738
            typename _Digraph::InArcIt ieit(INVALID);
739
            typename _Digraph::OutArcIt oeit(INVALID);
740
            n = digraph.baseNode(ieit);
741
            n = digraph.runningNode(ieit);
742
            n = digraph.baseNode(oeit);
743
            n = digraph.runningNode(oeit);
750
            const typename _Digraph::InArcIt iait(INVALID);
751
            const typename _Digraph::OutArcIt oait(INVALID);
752
            n = digraph.baseNode(iait);
753
            n = digraph.runningNode(iait);
754
            n = digraph.baseNode(oait);
755
            n = digraph.runningNode(oait);
744 756
            ignore_unused_variable_warning(n);
745 757
          }
746 758
        }
747 759

	
748 760
        const _Digraph& digraph;
749

	
750 761
      };
751 762
    };
752 763

	
753
    /// \brief An empty iterable undirected graph class.
764
    /// \brief Skeleton class for iterable undirected graphs.
754 765
    ///
755
    /// This class provides beside the core graph features iterator
756
    /// based iterable interface for the undirected graph structure.
766
    /// This class describes the interface of iterable undirected
767
    /// graphs. It extends \ref IterableDigraphComponent with the core
768
    /// iterable interface of undirected graphs.
757 769
    /// This concept is part of the Graph concept.
758 770
    template <typename BAS = BaseGraphComponent>
759 771
    class IterableGraphComponent : public IterableDigraphComponent<BAS> {
760 772
    public:
761 773

	
762 774
      typedef BAS Base;
763 775
      typedef typename Base::Node Node;
764 776
      typedef typename Base::Arc Arc;
765 777
      typedef typename Base::Edge Edge;
766 778

	
767 779

	
768 780
      typedef IterableGraphComponent Graph;
769 781

	
770
      /// \name Base iteration
782
      /// \name Base Iteration
771 783
      ///
772
      /// This interface provides functions for iteration on graph items
784
      /// This interface provides functions for iteration on edges.
785
      ///
773 786
      /// @{
774 787

	
775 788
      using IterableDigraphComponent<Base>::first;
776 789
      using IterableDigraphComponent<Base>::next;
777 790

	
778
      /// \brief Gives back the first edge in the iterating
779
      /// order.
791
      /// \brief Return the first edge.
780 792
      ///
781
      /// Gives back the first edge in the iterating order.
782
      ///
793
      /// This function gives back the first edge in the iteration order.
783 794
      void first(Edge&) const {}
784 795

	
785
      /// \brief Gives back the next edge in the iterating
786
      /// order.
796
      /// \brief Return the next edge.
787 797
      ///
788
      /// Gives back the next edge in the iterating order.
789
      ///
798
      /// This function gives back the next edge in the iteration order.
790 799
      void next(Edge&) const {}
791 800

	
792

	
793
      /// \brief Gives back the first of the edges from the
801
      /// \brief Return the first edge incident to the given node.
802
      ///
803
      /// This function gives back the first edge incident to the given 
804
      /// node. The bool parameter gives back the direction for which the
805
      /// source node of the directed arc representing the edge is the 
794 806
      /// given node.
795
      ///
796
      /// Gives back the first of the edges from the given
797
      /// node. The bool parameter gives back that direction which
798
      /// gives a good direction of the edge so the source of the
799
      /// directed arc is the given node.
800 807
      void firstInc(Edge&, bool&, const Node&) const {}
801 808

	
802 809
      /// \brief Gives back the next of the edges from the
803 810
      /// given node.
804 811
      ///
805
      /// Gives back the next of the edges from the given
806
      /// node. The bool parameter should be used as the \c firstInc()
807
      /// use it.
812
      /// This function gives back the next edge incident to the given 
813
      /// node. The bool parameter should be used as \c firstInc() use it.
808 814
      void nextInc(Edge&, bool&) const {}
809 815

	
810 816
      using IterableDigraphComponent<Base>::baseNode;
811 817
      using IterableDigraphComponent<Base>::runningNode;
812 818

	
813 819
      /// @}
814 820

	
815
      /// \name Class based iteration
821
      /// \name Class Based Iteration
816 822
      ///
817
      /// This interface provides functions for iteration on graph items
823
      /// This interface provides iterator classes for edges.
818 824
      ///
819 825
      /// @{
820 826

	
821
      /// \brief This iterator goes through each node.
827
      /// \brief This iterator goes through each edge.
822 828
      ///
823
      /// This iterator goes through each node.
829
      /// This iterator goes through each edge.
824 830
      typedef GraphItemIt<Graph, Edge> EdgeIt;
825
      /// \brief This iterator goes trough the incident arcs of a
831

	
832
      /// \brief This iterator goes trough the incident edges of a
826 833
      /// node.
827 834
      ///
828
      /// This iterator goes trough the incident arcs of a certain
835
      /// This iterator goes trough the incident edges of a certain
829 836
      /// node of a graph.
830
      typedef GraphIncIt<Graph, Edge, Node, 'u'> IncEdgeIt;
837
      typedef GraphIncIt<Graph, Edge, Node, 'e'> IncEdgeIt;
838

	
831 839
      /// \brief The base node of the iterator.
832 840
      ///
833
      /// Gives back the base node of the iterator.
841
      /// This function gives back the base node of the iterator.
834 842
      Node baseNode(const IncEdgeIt&) const { return INVALID; }
835 843

	
836 844
      /// \brief The running node of the iterator.
837 845
      ///
838
      /// Gives back the running node of the iterator.
846
      /// This function gives back the running node of the iterator.
839 847
      Node runningNode(const IncEdgeIt&) const { return INVALID; }
840 848

	
841 849
      /// @}
842 850

	
843 851
      template <typename _Graph>
844 852
      struct Constraints {
845 853
        void constraints() {
846 854
          checkConcept<IterableDigraphComponent<Base>, _Graph>();
847 855

	
848 856
          {
849 857
            typename _Graph::Node node(INVALID);
850 858
            typename _Graph::Edge edge(INVALID);
... ...
@@ -855,289 +863,299 @@
855 863
            }
856 864
            {
857 865
              graph.firstInc(edge, dir, node);
858 866
              graph.nextInc(edge, dir);
859 867
            }
860 868

	
861 869
          }
862 870

	
863 871
          {
864 872
            checkConcept<GraphItemIt<_Graph, typename _Graph::Edge>,
865 873
              typename _Graph::EdgeIt >();
866 874
            checkConcept<GraphIncIt<_Graph, typename _Graph::Edge,
867
              typename _Graph::Node, 'u'>, typename _Graph::IncEdgeIt>();
875
              typename _Graph::Node, 'e'>, typename _Graph::IncEdgeIt>();
868 876

	
869 877
            typename _Graph::Node n;
870
            typename _Graph::IncEdgeIt ueit(INVALID);
871
            n = graph.baseNode(ueit);
872
            n = graph.runningNode(ueit);
878
            const typename _Graph::IncEdgeIt ieit(INVALID);
879
            n = graph.baseNode(ieit);
880
            n = graph.runningNode(ieit);
873 881
          }
874 882
        }
875 883

	
876 884
        const _Graph& graph;
877 885
      };
878 886
    };
879 887

	
880
    /// \brief An empty alteration notifier digraph class.
888
    /// \brief Skeleton class for alterable directed graphs.
881 889
    ///
882
    /// This class provides beside the core digraph features alteration
883
    /// notifier interface for the digraph structure.  This implements
890
    /// This class describes the interface of alterable directed
891
    /// graphs. It extends \ref BaseDigraphComponent with the alteration
892
    /// notifier interface. It implements
884 893
    /// an observer-notifier pattern for each digraph item. More
885 894
    /// obsevers can be registered into the notifier and whenever an
886
    /// alteration occured in the digraph all the observers will
895
    /// alteration occured in the digraph all the observers will be
887 896
    /// notified about it.
888 897
    template <typename BAS = BaseDigraphComponent>
889 898
    class AlterableDigraphComponent : public BAS {
890 899
    public:
891 900

	
892 901
      typedef BAS Base;
893 902
      typedef typename Base::Node Node;
894 903
      typedef typename Base::Arc Arc;
895 904

	
896 905

	
897
      /// The node observer registry.
906
      /// Node alteration notifier class.
898 907
      typedef AlterationNotifier<AlterableDigraphComponent, Node>
899 908
      NodeNotifier;
900
      /// The arc observer registry.
909
      /// Arc alteration notifier class.
901 910
      typedef AlterationNotifier<AlterableDigraphComponent, Arc>
902 911
      ArcNotifier;
903 912

	
904
      /// \brief Gives back the node alteration notifier.
913
      /// \brief Return the node alteration notifier.
905 914
      ///
906
      /// Gives back the node alteration notifier.
915
      /// This function gives back the node alteration notifier.
907 916
      NodeNotifier& notifier(Node) const {
908
        return NodeNotifier();
917
         return NodeNotifier();
909 918
      }
910 919

	
911
      /// \brief Gives back the arc alteration notifier.
920
      /// \brief Return the arc alteration notifier.
912 921
      ///
913
      /// Gives back the arc alteration notifier.
922
      /// This function gives back the arc alteration notifier.
914 923
      ArcNotifier& notifier(Arc) const {
915 924
        return ArcNotifier();
916 925
      }
917 926

	
918 927
      template <typename _Digraph>
919 928
      struct Constraints {
920 929
        void constraints() {
921 930
          checkConcept<Base, _Digraph>();
922 931
          typename _Digraph::NodeNotifier& nn
923 932
            = digraph.notifier(typename _Digraph::Node());
924 933

	
925 934
          typename _Digraph::ArcNotifier& en
926 935
            = digraph.notifier(typename _Digraph::Arc());
927 936

	
928 937
          ignore_unused_variable_warning(nn);
929 938
          ignore_unused_variable_warning(en);
930 939
        }
931 940

	
932 941
        const _Digraph& digraph;
933

	
934 942
      };
935

	
936 943
    };
937 944

	
938
    /// \brief An empty alteration notifier undirected graph class.
945
    /// \brief Skeleton class for alterable undirected graphs.
939 946
    ///
940
    /// This class provides beside the core graph features alteration
941
    /// notifier interface for the graph structure.  This implements
942
    /// an observer-notifier pattern for each graph item. More
947
    /// This class describes the interface of alterable undirected
948
    /// graphs. It extends \ref AlterableDigraphComponent with the alteration
949
    /// notifier interface of undirected graphs. It implements
950
    /// an observer-notifier pattern for the edges. More
943 951
    /// obsevers can be registered into the notifier and whenever an
944
    /// alteration occured in the graph all the observers will
952
    /// alteration occured in the graph all the observers will be
945 953
    /// notified about it.
946 954
    template <typename BAS = BaseGraphComponent>
947 955
    class AlterableGraphComponent : public AlterableDigraphComponent<BAS> {
948 956
    public:
949 957

	
950 958
      typedef BAS Base;
951 959
      typedef typename Base::Edge Edge;
952 960

	
953 961

	
954
      /// The arc observer registry.
962
      /// Edge alteration notifier class.
955 963
      typedef AlterationNotifier<AlterableGraphComponent, Edge>
956 964
      EdgeNotifier;
957 965

	
958
      /// \brief Gives back the arc alteration notifier.
966
      /// \brief Return the edge alteration notifier.
959 967
      ///
960
      /// Gives back the arc alteration notifier.
968
      /// This function gives back the edge alteration notifier.
961 969
      EdgeNotifier& notifier(Edge) const {
962 970
        return EdgeNotifier();
963 971
      }
964 972

	
965 973
      template <typename _Graph>
966 974
      struct Constraints {
967 975
        void constraints() {
968
          checkConcept<AlterableGraphComponent<Base>, _Graph>();
976
          checkConcept<AlterableDigraphComponent<Base>, _Graph>();
969 977
          typename _Graph::EdgeNotifier& uen
970 978
            = graph.notifier(typename _Graph::Edge());
971 979
          ignore_unused_variable_warning(uen);
972 980
        }
973 981

	
974 982
        const _Graph& graph;
975 983
      };
976 984
    };
977 985

	
978
    /// \brief Class describing the concept of graph maps
986
    /// \brief Concept class for standard graph maps.
979 987
    ///
980
    /// This class describes the common interface of the graph maps
981
    /// (NodeMap, ArcMap), that is maps that can be used to
982
    /// associate data to graph descriptors (nodes or arcs).
988
    /// This class describes the concept of standard graph maps, i.e.
989
    /// the \c NodeMap, \c ArcMap and \c EdgeMap subtypes of digraph and 
990
    /// graph types, which can be used for associating data to graph items.
991
    /// The standard graph maps must conform to the ReferenceMap concept.
983 992
    template <typename GR, typename K, typename V>
984
    class GraphMap : public ReadWriteMap<K, V> {
993
    class GraphMap : public ReferenceMap<K, V, V&, const V&> {
985 994
    public:
986 995

	
987 996
      typedef ReadWriteMap<K, V> Parent;
988 997

	
989 998
      /// The graph type of the map.
990 999
      typedef GR Graph;
991 1000
      /// The key type of the map.
992 1001
      typedef K Key;
993 1002
      /// The value type of the map.
994 1003
      typedef V Value;
1004
      /// The reference type of the map.
1005
      typedef Value& Reference;
1006
      /// The const reference type of the map.
1007
      typedef const Value& ConstReference;
1008

	
1009
      // The reference map tag.
1010
      typedef True ReferenceMapTag;
995 1011

	
996 1012
      /// \brief Construct a new map.
997 1013
      ///
998 1014
      /// Construct a new map for the graph.
999 1015
      explicit GraphMap(const Graph&) {}
1000 1016
      /// \brief Construct a new map with default value.
1001 1017
      ///
1002
      /// Construct a new map for the graph and initalise the values.
1018
      /// Construct a new map for the graph and initalize the values.
1003 1019
      GraphMap(const Graph&, const Value&) {}
1004 1020

	
1005 1021
    private:
1006 1022
      /// \brief Copy constructor.
1007 1023
      ///
1008 1024
      /// Copy Constructor.
1009 1025
      GraphMap(const GraphMap&) : Parent() {}
1010 1026

	
1011
      /// \brief Assign operator.
1027
      /// \brief Assignment operator.
1012 1028
      ///
1013
      /// Assign operator. It does not mofify the underlying graph,
1029
      /// Assignment operator. It does not mofify the underlying graph,
1014 1030
      /// it just iterates on the current item set and set the  map
1015 1031
      /// with the value returned by the assigned map.
1016 1032
      template <typename CMap>
1017 1033
      GraphMap& operator=(const CMap&) {
1018 1034
        checkConcept<ReadMap<Key, Value>, CMap>();
1019 1035
        return *this;
1020 1036
      }
1021 1037

	
1022 1038
    public:
1023 1039
      template<typename _Map>
1024 1040
      struct Constraints {
1025 1041
        void constraints() {
1026
          checkConcept<ReadWriteMap<Key, Value>, _Map >();
1027
          // Construction with a graph parameter
1028
          _Map a(g);
1029
          // Constructor with a graph and a default value parameter
1030
          _Map a2(g,t);
1031
          // Copy constructor.
1032
          // _Map b(c);
1042
          checkConcept
1043
            <ReferenceMap<Key, Value, Value&, const Value&>, _Map>();
1044
          _Map m1(g);
1045
          _Map m2(g,t);
1046
          
1047
          // Copy constructor
1048
          // _Map m3(m);
1033 1049

	
1050
          // Assignment operator
1034 1051
          // ReadMap<Key, Value> cmap;
1035
          // b = cmap;
1052
          // m3 = cmap;
1036 1053

	
1037
          ignore_unused_variable_warning(a);
1038
          ignore_unused_variable_warning(a2);
1039
          // ignore_unused_variable_warning(b);
1054
          ignore_unused_variable_warning(m1);
1055
          ignore_unused_variable_warning(m2);
1056
          // ignore_unused_variable_warning(m3);
1040 1057
        }
1041 1058

	
1042
        const _Map &c;
1059
        const _Map &m;
1043 1060
        const Graph &g;
1044 1061
        const typename GraphMap::Value &t;
1045 1062
      };
1046 1063

	
1047 1064
    };
1048 1065

	
1049
    /// \brief An empty mappable digraph class.
1066
    /// \brief Skeleton class for mappable directed graphs.
1050 1067
    ///
1051
    /// This class provides beside the core digraph features
1052
    /// map interface for the digraph structure.
1068
    /// This class describes the interface of mappable directed graphs.
1069
    /// It extends \ref BaseDigraphComponent with the standard digraph 
1070
    /// map classes, namely \c NodeMap and \c ArcMap.
1053 1071
    /// This concept is part of the Digraph concept.
1054 1072
    template <typename BAS = BaseDigraphComponent>
1055 1073
    class MappableDigraphComponent : public BAS  {
1056 1074
    public:
1057 1075

	
1058 1076
      typedef BAS Base;
1059 1077
      typedef typename Base::Node Node;
1060 1078
      typedef typename Base::Arc Arc;
1061 1079

	
1062 1080
      typedef MappableDigraphComponent Digraph;
1063 1081

	
1064
      /// \brief ReadWrite map of the nodes.
1082
      /// \brief Standard graph map for the nodes.
1065 1083
      ///
1066
      /// ReadWrite map of the nodes.
1067
      ///
1084
      /// Standard graph map for the nodes.
1085
      /// It conforms to the ReferenceMap concept.
1068 1086
      template <typename V>
1069
      class NodeMap : public GraphMap<Digraph, Node, V> {
1087
      class NodeMap : public GraphMap<MappableDigraphComponent, Node, V> {
1070 1088
      public:
1071 1089
        typedef GraphMap<MappableDigraphComponent, Node, V> Parent;
1072 1090

	
1073 1091
        /// \brief Construct a new map.
1074 1092
        ///
1075 1093
        /// Construct a new map for the digraph.
1076 1094
        explicit NodeMap(const MappableDigraphComponent& digraph)
1077 1095
          : Parent(digraph) {}
1078 1096

	
1079 1097
        /// \brief Construct a new map with default value.
1080 1098
        ///
1081
        /// Construct a new map for the digraph and initalise the values.
1099
        /// Construct a new map for the digraph and initalize the values.
1082 1100
        NodeMap(const MappableDigraphComponent& digraph, const V& value)
1083 1101
          : Parent(digraph, value) {}
1084 1102

	
1085 1103
      private:
1086 1104
        /// \brief Copy constructor.
1087 1105
        ///
1088 1106
        /// Copy Constructor.
1089 1107
        NodeMap(const NodeMap& nm) : Parent(nm) {}
1090 1108

	
1091
        /// \brief Assign operator.
1109
        /// \brief Assignment operator.
1092 1110
        ///
1093
        /// Assign operator.
1111
        /// Assignment operator.
1094 1112
        template <typename CMap>
1095 1113
        NodeMap& operator=(const CMap&) {
1096 1114
          checkConcept<ReadMap<Node, V>, CMap>();
1097 1115
          return *this;
1098 1116
        }
1099 1117

	
1100 1118
      };
1101 1119

	
1102
      /// \brief ReadWrite map of the arcs.
1120
      /// \brief Standard graph map for the arcs.
1103 1121
      ///
1104
      /// ReadWrite map of the arcs.
1105
      ///
1122
      /// Standard graph map for the arcs.
1123
      /// It conforms to the ReferenceMap concept.
1106 1124
      template <typename V>
1107
      class ArcMap : public GraphMap<Digraph, Arc, V> {
1125
      class ArcMap : public GraphMap<MappableDigraphComponent, Arc, V> {
1108 1126
      public:
1109 1127
        typedef GraphMap<MappableDigraphComponent, Arc, V> Parent;
1110 1128

	
1111 1129
        /// \brief Construct a new map.
1112 1130
        ///
1113 1131
        /// Construct a new map for the digraph.
1114 1132
        explicit ArcMap(const MappableDigraphComponent& digraph)
1115 1133
          : Parent(digraph) {}
1116 1134

	
1117 1135
        /// \brief Construct a new map with default value.
1118 1136
        ///
1119
        /// Construct a new map for the digraph and initalise the values.
1137
        /// Construct a new map for the digraph and initalize the values.
1120 1138
        ArcMap(const MappableDigraphComponent& digraph, const V& value)
1121 1139
          : Parent(digraph, value) {}
1122 1140

	
1123 1141
      private:
1124 1142
        /// \brief Copy constructor.
1125 1143
        ///
1126 1144
        /// Copy Constructor.
1127 1145
        ArcMap(const ArcMap& nm) : Parent(nm) {}
1128 1146

	
1129
        /// \brief Assign operator.
1147
        /// \brief Assignment operator.
1130 1148
        ///
1131
        /// Assign operator.
1149
        /// Assignment operator.
1132 1150
        template <typename CMap>
1133 1151
        ArcMap& operator=(const CMap&) {
1134 1152
          checkConcept<ReadMap<Arc, V>, CMap>();
1135 1153
          return *this;
1136 1154
        }
1137 1155

	
1138 1156
      };
1139 1157

	
1140 1158

	
1141 1159
      template <typename _Digraph>
1142 1160
      struct Constraints {
1143 1161

	
... ...
@@ -1169,325 +1187,328 @@
1169 1187
              IntArcMap >();
1170 1188
          } { // bool map test
1171 1189
            typedef typename _Digraph::template ArcMap<bool> BoolArcMap;
1172 1190
            checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, bool>,
1173 1191
              BoolArcMap >();
1174 1192
          } { // Dummy map test
1175 1193
            typedef typename _Digraph::template ArcMap<Dummy> DummyArcMap;
1176 1194
            checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, Dummy>,
1177 1195
              DummyArcMap >();
1178 1196
          }
1179 1197
        }
1180 1198

	
1181
        _Digraph& digraph;
1199
        const _Digraph& digraph;
1182 1200
      };
1183 1201
    };
1184 1202

	
1185
    /// \brief An empty mappable base bipartite graph class.
1203
    /// \brief Skeleton class for mappable undirected graphs.
1186 1204
    ///
1187
    /// This class provides beside the core graph features
1188
    /// map interface for the graph structure.
1205
    /// This class describes the interface of mappable undirected graphs.
1206
    /// It extends \ref MappableDigraphComponent with the standard graph 
1207
    /// map class for edges (\c EdgeMap).
1189 1208
    /// This concept is part of the Graph concept.
1190 1209
    template <typename BAS = BaseGraphComponent>
1191 1210
    class MappableGraphComponent : public MappableDigraphComponent<BAS>  {
1192 1211
    public:
1193 1212

	
1194 1213
      typedef BAS Base;
1195 1214
      typedef typename Base::Edge Edge;
1196 1215

	
1197 1216
      typedef MappableGraphComponent Graph;
1198 1217

	
1199
      /// \brief ReadWrite map of the edges.
1218
      /// \brief Standard graph map for the edges.
1200 1219
      ///
1201
      /// ReadWrite map of the edges.
1202
      ///
1220
      /// Standard graph map for the edges.
1221
      /// It conforms to the ReferenceMap concept.
1203 1222
      template <typename V>
1204
      class EdgeMap : public GraphMap<Graph, Edge, V> {
1223
      class EdgeMap : public GraphMap<MappableGraphComponent, Edge, V> {
1205 1224
      public:
1206 1225
        typedef GraphMap<MappableGraphComponent, Edge, V> Parent;
1207 1226

	
1208 1227
        /// \brief Construct a new map.
1209 1228
        ///
1210 1229
        /// Construct a new map for the graph.
1211 1230
        explicit EdgeMap(const MappableGraphComponent& graph)
1212 1231
          : Parent(graph) {}
1213 1232

	
1214 1233
        /// \brief Construct a new map with default value.
1215 1234
        ///
1216
        /// Construct a new map for the graph and initalise the values.
1235
        /// Construct a new map for the graph and initalize the values.
1217 1236
        EdgeMap(const MappableGraphComponent& graph, const V& value)
1218 1237
          : Parent(graph, value) {}
1219 1238

	
1220 1239
      private:
1221 1240
        /// \brief Copy constructor.
1222 1241
        ///
1223 1242
        /// Copy Constructor.
1224 1243
        EdgeMap(const EdgeMap& nm) : Parent(nm) {}
1225 1244

	
1226
        /// \brief Assign operator.
1245
        /// \brief Assignment operator.
1227 1246
        ///
1228
        /// Assign operator.
1247
        /// Assignment operator.
1229 1248
        template <typename CMap>
1230 1249
        EdgeMap& operator=(const CMap&) {
1231 1250
          checkConcept<ReadMap<Edge, V>, CMap>();
1232 1251
          return *this;
1233 1252
        }
1234 1253

	
1235 1254
      };
1236 1255

	
1237 1256

	
1238 1257
      template <typename _Graph>
1239 1258
      struct Constraints {
1240 1259

	
1241 1260
        struct Dummy {
1242 1261
          int value;
1243 1262
          Dummy() : value(0) {}
1244 1263
          Dummy(int _v) : value(_v) {}
1245 1264
        };
1246 1265

	
1247 1266
        void constraints() {
1248
          checkConcept<MappableGraphComponent<Base>, _Graph>();
1267
          checkConcept<MappableDigraphComponent<Base>, _Graph>();
1249 1268

	
1250 1269
          { // int map test
1251 1270
            typedef typename _Graph::template EdgeMap<int> IntEdgeMap;
1252 1271
            checkConcept<GraphMap<_Graph, typename _Graph::Edge, int>,
1253 1272
              IntEdgeMap >();
1254 1273
          } { // bool map test
1255 1274
            typedef typename _Graph::template EdgeMap<bool> BoolEdgeMap;
1256 1275
            checkConcept<GraphMap<_Graph, typename _Graph::Edge, bool>,
1257 1276
              BoolEdgeMap >();
1258 1277
          } { // Dummy map test
1259 1278
            typedef typename _Graph::template EdgeMap<Dummy> DummyEdgeMap;
1260 1279
            checkConcept<GraphMap<_Graph, typename _Graph::Edge, Dummy>,
1261 1280
              DummyEdgeMap >();
1262 1281
          }
1263 1282
        }
1264 1283

	
1265
        _Graph& graph;
1284
        const _Graph& graph;
1266 1285
      };
1267 1286
    };
1268 1287

	
1269
    /// \brief An empty extendable digraph class.
1288
    /// \brief Skeleton class for extendable directed graphs.
1270 1289
    ///
1271
    /// This class provides beside the core digraph features digraph
1272
    /// extendable interface for the digraph structure.  The main
1273
    /// difference between the base and this interface is that the
1274
    /// digraph alterations should handled already on this level.
1290
    /// This class describes the interface of extendable directed graphs.
1291
    /// It extends \ref BaseDigraphComponent with functions for adding 
1292
    /// nodes and arcs to the digraph.
1293
    /// This concept requires \ref AlterableDigraphComponent.
1275 1294
    template <typename BAS = BaseDigraphComponent>
1276 1295
    class ExtendableDigraphComponent : public BAS {
1277 1296
    public:
1278 1297
      typedef BAS Base;
1279 1298

	
1280 1299
      typedef typename Base::Node Node;
1281 1300
      typedef typename Base::Arc Arc;
1282 1301

	
1283
      /// \brief Adds a new node to the digraph.
1302
      /// \brief Add a new node to the digraph.
1284 1303
      ///
1285
      /// Adds a new node to the digraph.
1286
      ///
1304
      /// This function adds a new node to the digraph.
1287 1305
      Node addNode() {
1288 1306
        return INVALID;
1289 1307
      }
1290 1308

	
1291
      /// \brief Adds a new arc connects the given two nodes.
1309
      /// \brief Add a new arc connecting the given two nodes.
1292 1310
      ///
1293
      /// Adds a new arc connects the the given two nodes.
1311
      /// This function adds a new arc connecting the given two nodes
1312
      /// of the digraph.
1294 1313
      Arc addArc(const Node&, const Node&) {
1295 1314
        return INVALID;
1296 1315
      }
1297 1316

	
1298 1317
      template <typename _Digraph>
1299 1318
      struct Constraints {
1300 1319
        void constraints() {
1301 1320
          checkConcept<Base, _Digraph>();
1302 1321
          typename _Digraph::Node node_a, node_b;
1303 1322
          node_a = digraph.addNode();
1304 1323
          node_b = digraph.addNode();
1305 1324
          typename _Digraph::Arc arc;
1306 1325
          arc = digraph.addArc(node_a, node_b);
1307 1326
        }
1308 1327

	
1309 1328
        _Digraph& digraph;
1310 1329
      };
1311 1330
    };
1312 1331

	
1313
    /// \brief An empty extendable base undirected graph class.
1332
    /// \brief Skeleton class for extendable undirected graphs.
1314 1333
    ///
1315
    /// This class provides beside the core undirected graph features
1316
    /// core undircted graph extend interface for the graph structure.
1317
    /// The main difference between the base and this interface is
1318
    /// that the graph alterations should handled already on this
1319
    /// level.
1334
    /// This class describes the interface of extendable undirected graphs.
1335
    /// It extends \ref BaseGraphComponent with functions for adding 
1336
    /// nodes and edges to the graph.
1337
    /// This concept requires \ref AlterableGraphComponent.
1320 1338
    template <typename BAS = BaseGraphComponent>
1321 1339
    class ExtendableGraphComponent : public BAS {
1322 1340
    public:
1323 1341

	
1324 1342
      typedef BAS Base;
1325 1343
      typedef typename Base::Node Node;
1326 1344
      typedef typename Base::Edge Edge;
1327 1345

	
1328
      /// \brief Adds a new node to the graph.
1346
      /// \brief Add a new node to the digraph.
1329 1347
      ///
1330
      /// Adds a new node to the graph.
1331
      ///
1348
      /// This function adds a new node to the digraph.
1332 1349
      Node addNode() {
1333 1350
        return INVALID;
1334 1351
      }
1335 1352

	
1336
      /// \brief Adds a new arc connects the given two nodes.
1353
      /// \brief Add a new edge connecting the given two nodes.
1337 1354
      ///
1338
      /// Adds a new arc connects the the given two nodes.
1339
      Edge addArc(const Node&, const Node&) {
1355
      /// This function adds a new edge connecting the given two nodes
1356
      /// of the graph.
1357
      Edge addEdge(const Node&, const Node&) {
1340 1358
        return INVALID;
1341 1359
      }
1342 1360

	
1343 1361
      template <typename _Graph>
1344 1362
      struct Constraints {
1345 1363
        void constraints() {
1346 1364
          checkConcept<Base, _Graph>();
1347 1365
          typename _Graph::Node node_a, node_b;
1348 1366
          node_a = graph.addNode();
1349 1367
          node_b = graph.addNode();
1350 1368
          typename _Graph::Edge edge;
1351 1369
          edge = graph.addEdge(node_a, node_b);
1352 1370
        }
1353 1371

	
1354 1372
        _Graph& graph;
1355 1373
      };
1356 1374
    };
1357 1375

	
1358
    /// \brief An empty erasable digraph class.
1376
    /// \brief Skeleton class for erasable directed graphs.
1359 1377
    ///
1360
    /// This class provides beside the core digraph features core erase
1361
    /// functions for the digraph structure. The main difference between
1362
    /// the base and this interface is that the digraph alterations
1363
    /// should handled already on this level.
1378
    /// This class describes the interface of erasable directed graphs.
1379
    /// It extends \ref BaseDigraphComponent with functions for removing 
1380
    /// nodes and arcs from the digraph.
1381
    /// This concept requires \ref AlterableDigraphComponent.
1364 1382
    template <typename BAS = BaseDigraphComponent>
1365 1383
    class ErasableDigraphComponent : public BAS {
1366 1384
    public:
1367 1385

	
1368 1386
      typedef BAS Base;
1369 1387
      typedef typename Base::Node Node;
1370 1388
      typedef typename Base::Arc Arc;
1371 1389

	
1372 1390
      /// \brief Erase a node from the digraph.
1373 1391
      ///
1374
      /// Erase a node from the digraph. This function should
1375
      /// erase all arcs connecting to the node.
1392
      /// This function erases the given node from the digraph and all arcs 
1393
      /// connected to the node.
1376 1394
      void erase(const Node&) {}
1377 1395

	
1378 1396
      /// \brief Erase an arc from the digraph.
1379 1397
      ///
1380
      /// Erase an arc from the digraph.
1381
      ///
1398
      /// This function erases the given arc from the digraph.
1382 1399
      void erase(const Arc&) {}
1383 1400

	
1384 1401
      template <typename _Digraph>
1385 1402
      struct Constraints {
1386 1403
        void constraints() {
1387 1404
          checkConcept<Base, _Digraph>();
1388
          typename _Digraph::Node node;
1405
          const typename _Digraph::Node node(INVALID);
1389 1406
          digraph.erase(node);
1390
          typename _Digraph::Arc arc;
1407
          const typename _Digraph::Arc arc(INVALID);
1391 1408
          digraph.erase(arc);
1392 1409
        }
1393 1410

	
1394 1411
        _Digraph& digraph;
1395 1412
      };
1396 1413
    };
1397 1414

	
1398
    /// \brief An empty erasable base undirected graph class.
1415
    /// \brief Skeleton class for erasable undirected graphs.
1399 1416
    ///
1400
    /// This class provides beside the core undirected graph features
1401
    /// core erase functions for the undirceted graph structure. The
1402
    /// main difference between the base and this interface is that
1403
    /// the graph alterations should handled already on this level.
1417
    /// This class describes the interface of erasable undirected graphs.
1418
    /// It extends \ref BaseGraphComponent with functions for removing 
1419
    /// nodes and edges from the graph.
1420
    /// This concept requires \ref AlterableGraphComponent.
1404 1421
    template <typename BAS = BaseGraphComponent>
1405 1422
    class ErasableGraphComponent : public BAS {
1406 1423
    public:
1407 1424

	
1408 1425
      typedef BAS Base;
1409 1426
      typedef typename Base::Node Node;
1410 1427
      typedef typename Base::Edge Edge;
1411 1428

	
1412 1429
      /// \brief Erase a node from the graph.
1413 1430
      ///
1414
      /// Erase a node from the graph. This function should erase
1415
      /// arcs connecting to the node.
1431
      /// This function erases the given node from the graph and all edges
1432
      /// connected to the node.
1416 1433
      void erase(const Node&) {}
1417 1434

	
1418
      /// \brief Erase an arc from the graph.
1435
      /// \brief Erase an edge from the digraph.
1419 1436
      ///
1420
      /// Erase an arc from the graph.
1421
      ///
1437
      /// This function erases the given edge from the digraph.
1422 1438
      void erase(const Edge&) {}
1423 1439

	
1424 1440
      template <typename _Graph>
1425 1441
      struct Constraints {
1426 1442
        void constraints() {
1427 1443
          checkConcept<Base, _Graph>();
1428
          typename _Graph::Node node;
1444
          const typename _Graph::Node node(INVALID);
1429 1445
          graph.erase(node);
1430
          typename _Graph::Edge edge;
1446
          const typename _Graph::Edge edge(INVALID);
1431 1447
          graph.erase(edge);
1432 1448
        }
1433 1449

	
1434 1450
        _Graph& graph;
1435 1451
      };
1436 1452
    };
1437 1453

	
1438
    /// \brief An empty clearable base digraph class.
1454
    /// \brief Skeleton class for clearable directed graphs.
1439 1455
    ///
1440
    /// This class provides beside the core digraph features core clear
1441
    /// functions for the digraph structure. The main difference between
1442
    /// the base and this interface is that the digraph alterations
1443
    /// should handled already on this level.
1456
    /// This class describes the interface of clearable directed graphs.
1457
    /// It extends \ref BaseDigraphComponent with a function for clearing
1458
    /// the digraph.
1459
    /// This concept requires \ref AlterableDigraphComponent.
1444 1460
    template <typename BAS = BaseDigraphComponent>
1445 1461
    class ClearableDigraphComponent : public BAS {
1446 1462
    public:
1447 1463

	
1448 1464
      typedef BAS Base;
1449 1465

	
1450 1466
      /// \brief Erase all nodes and arcs from the digraph.
1451 1467
      ///
1452
      /// Erase all nodes and arcs from the digraph.
1453
      ///
1468
      /// This function erases all nodes and arcs from the digraph.
1454 1469
      void clear() {}
1455 1470

	
1456 1471
      template <typename _Digraph>
1457 1472
      struct Constraints {
1458 1473
        void constraints() {
1459 1474
          checkConcept<Base, _Digraph>();
1460 1475
          digraph.clear();
1461 1476
        }
1462 1477

	
1463
        _Digraph digraph;
1478
        _Digraph& digraph;
1464 1479
      };
1465 1480
    };
1466 1481

	
1467
    /// \brief An empty clearable base undirected graph class.
1482
    /// \brief Skeleton class for clearable undirected graphs.
1468 1483
    ///
1469
    /// This class provides beside the core undirected graph features
1470
    /// core clear functions for the undirected graph structure. The
1471
    /// main difference between the base and this interface is that
1472
    /// the graph alterations should handled already on this level.
1484
    /// This class describes the interface of clearable undirected graphs.
1485
    /// It extends \ref BaseGraphComponent with a function for clearing
1486
    /// the graph.
1487
    /// This concept requires \ref AlterableGraphComponent.
1473 1488
    template <typename BAS = BaseGraphComponent>
1474 1489
    class ClearableGraphComponent : public ClearableDigraphComponent<BAS> {
1475 1490
    public:
1476 1491

	
1477 1492
      typedef BAS Base;
1478 1493

	
1494
      /// \brief Erase all nodes and edges from the graph.
1495
      ///
1496
      /// This function erases all nodes and edges from the graph.
1497
      void clear() {}
1498

	
1479 1499
      template <typename _Graph>
1480 1500
      struct Constraints {
1481 1501
        void constraints() {
1482
          checkConcept<ClearableGraphComponent<Base>, _Graph>();
1502
          checkConcept<Base, _Graph>();
1503
          graph.clear();
1483 1504
        }
1484 1505

	
1485
        _Graph graph;
1506
        _Graph& graph;
1486 1507
      };
1487 1508
    };
1488 1509

	
1489 1510
  }
1490 1511

	
1491 1512
}
1492 1513

	
1493 1514
#endif
Ignore white space 6 line context
... ...
@@ -62,27 +62,27 @@
62 62
      typedef typename ItemIntMap::Key Item;
63 63

	
64 64
      /// \brief Type to represent the states of the items.
65 65
      ///
66 66
      /// Each item has a state associated to it. It can be "in heap",
67 67
      /// "pre heap" or "post heap". The later two are indifferent
68 68
      /// from the point of view of the heap, but may be useful for
69 69
      /// the user.
70 70
      ///
71 71
      /// The item-int map must be initialized in such way that it assigns
72 72
      /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
73 73
      enum State {
74
        IN_HEAP = 0,    ///< The "in heap" state constant.
75
        PRE_HEAP = -1,  ///< The "pre heap" state constant.
76
        POST_HEAP = -2  ///< The "post heap" state constant.
74
        IN_HEAP = 0,    ///< = 0. The "in heap" state constant.
75
        PRE_HEAP = -1,  ///< = -1. The "pre heap" state constant.
76
        POST_HEAP = -2  ///< = -2. The "post heap" state constant.
77 77
      };
78 78

	
79 79
      /// \brief The constructor.
80 80
      ///
81 81
      /// The constructor.
82 82
      /// \param map A map that assigns \c int values to keys of type
83 83
      /// \c Item. It is used internally by the heap implementations to
84 84
      /// handle the cross references. The assigned value must be
85 85
      /// \c PRE_HEAP (<tt>-1</tt>) for every item.
86 86
      explicit Heap(ItemIntMap &map) {}
87 87

	
88 88
      /// \brief The number of items stored in the heap.
Ignore white space 6 line context
... ...
@@ -23,56 +23,56 @@
23 23
#include <lemon/bfs.h>
24 24
#include <lemon/core.h>
25 25
#include <lemon/maps.h>
26 26
#include <lemon/adaptors.h>
27 27

	
28 28
#include <lemon/concepts/digraph.h>
29 29
#include <lemon/concepts/graph.h>
30 30
#include <lemon/concept_check.h>
31 31

	
32 32
#include <stack>
33 33
#include <functional>
34 34

	
35
/// \ingroup connectivity
35
/// \ingroup graph_properties
36 36
/// \file
37 37
/// \brief Connectivity algorithms
38 38
///
39 39
/// Connectivity algorithms
40 40

	
41 41
namespace lemon {
42 42

	
43
  /// \ingroup connectivity
43
  /// \ingroup graph_properties
44 44
  ///
45 45
  /// \brief Check whether the given undirected graph is connected.
46 46
  ///
47 47
  /// Check whether the given undirected graph is connected.
48 48
  /// \param graph The undirected graph.
49 49
  /// \return \c true when there is path between any two nodes in the graph.
50 50
  /// \note By definition, the empty graph is connected.
51 51
  template <typename Graph>
52 52
  bool connected(const Graph& graph) {
53 53
    checkConcept<concepts::Graph, Graph>();
54 54
    typedef typename Graph::NodeIt NodeIt;
55 55
    if (NodeIt(graph) == INVALID) return true;
56 56
    Dfs<Graph> dfs(graph);
57 57
    dfs.run(NodeIt(graph));
58 58
    for (NodeIt it(graph); it != INVALID; ++it) {
59 59
      if (!dfs.reached(it)) {
60 60
        return false;
61 61
      }
62 62
    }
63 63
    return true;
64 64
  }
65 65

	
66
  /// \ingroup connectivity
66
  /// \ingroup graph_properties
67 67
  ///
68 68
  /// \brief Count the number of connected components of an undirected graph
69 69
  ///
70 70
  /// Count the number of connected components of an undirected graph
71 71
  ///
72 72
  /// \param graph The graph. It must be undirected.
73 73
  /// \return The number of components
74 74
  /// \note By definition, the empty graph consists
75 75
  /// of zero connected components.
76 76
  template <typename Graph>
77 77
  int countConnectedComponents(const Graph &graph) {
78 78
    checkConcept<concepts::Graph, Graph>();
... ...
@@ -96,37 +96,39 @@
96 96

	
97 97
    bfs.init();
98 98
    for(typename Graph::NodeIt n(graph); n != INVALID; ++n) {
99 99
      if (!bfs.reached(n)) {
100 100
        bfs.addSource(n);
101 101
        bfs.start();
102 102
        ++compNum;
103 103
      }
104 104
    }
105 105
    return compNum;
106 106
  }
107 107

	
108
  /// \ingroup connectivity
108
  /// \ingroup graph_properties
109 109
  ///
110 110
  /// \brief Find the connected components of an undirected graph
111 111
  ///
112 112
  /// Find the connected components of an undirected graph.
113 113
  ///
114
  /// \image html connected_components.png
115
  /// \image latex connected_components.eps "Connected components" width=\textwidth
116
  ///
114 117
  /// \param graph The graph. It must be undirected.
115 118
  /// \retval compMap A writable node map. The values will be set from 0 to
116 119
  /// the number of the connected components minus one. Each values of the map
117 120
  /// will be set exactly once, the values of a certain component will be
118 121
  /// set continuously.
119 122
  /// \return The number of components
120
  ///
121 123
  template <class Graph, class NodeMap>
122 124
  int connectedComponents(const Graph &graph, NodeMap &compMap) {
123 125
    checkConcept<concepts::Graph, Graph>();
124 126
    typedef typename Graph::Node Node;
125 127
    typedef typename Graph::Arc Arc;
126 128
    checkConcept<concepts::WriteMap<Node, int>, NodeMap>();
127 129

	
128 130
    typedef NullMap<Node, Arc> PredMap;
129 131
    typedef NullMap<Node, int> DistMap;
130 132

	
131 133
    int compNum = 0;
132 134
    typename Bfs<Graph>::
... ...
@@ -218,25 +220,25 @@
218 220
    private:
219 221
      const Digraph& _digraph;
220 222
      ArcMap& _cutMap;
221 223
      int& _cutNum;
222 224

	
223 225
      typename Digraph::template NodeMap<int> _compMap;
224 226
      int _num;
225 227
    };
226 228

	
227 229
  }
228 230

	
229 231

	
230
  /// \ingroup connectivity
232
  /// \ingroup graph_properties
231 233
  ///
232 234
  /// \brief Check whether the given directed graph is strongly connected.
233 235
  ///
234 236
  /// Check whether the given directed graph is strongly connected. The
235 237
  /// graph is strongly connected when any two nodes of the graph are
236 238
  /// connected with directed paths in both direction.
237 239
  /// \return \c false when the graph is not strongly connected.
238 240
  /// \see connected
239 241
  ///
240 242
  /// \note By definition, the empty graph is strongly connected.
241 243
  template <typename Digraph>
242 244
  bool stronglyConnected(const Digraph& digraph) {
... ...
@@ -276,25 +278,25 @@
276 278
    rdfs.addSource(source);
277 279
    rdfs.start();
278 280

	
279 281
    for (RNodeIt it(rdigraph); it != INVALID; ++it) {
280 282
      if (!rdfs.reached(it)) {
281 283
        return false;
282 284
      }
283 285
    }
284 286

	
285 287
    return true;
286 288
  }
287 289

	
288
  /// \ingroup connectivity
290
  /// \ingroup graph_properties
289 291
  ///
290 292
  /// \brief Count the strongly connected components of a directed graph
291 293
  ///
292 294
  /// Count the strongly connected components of a directed graph.
293 295
  /// The strongly connected components are the classes of an
294 296
  /// equivalence relation on the nodes of the graph. Two nodes are in
295 297
  /// the same class if they are connected with directed paths in both
296 298
  /// direction.
297 299
  ///
298 300
  /// \param digraph The graph.
299 301
  /// \return The number of components
300 302
  /// \note By definition, the empty graph has zero
... ...
@@ -340,43 +342,45 @@
340 342

	
341 343
    rdfs.init();
342 344
    for (RIterator it = nodes.rbegin(); it != nodes.rend(); ++it) {
343 345
      if (!rdfs.reached(*it)) {
344 346
        rdfs.addSource(*it);
345 347
        rdfs.start();
346 348
        ++compNum;
347 349
      }
348 350
    }
349 351
    return compNum;
350 352
  }
351 353

	
352
  /// \ingroup connectivity
354
  /// \ingroup graph_properties
353 355
  ///
354 356
  /// \brief Find the strongly connected components of a directed graph
355 357
  ///
356 358
  /// Find the strongly connected components of a directed graph.  The
357 359
  /// strongly connected components are the classes of an equivalence
358 360
  /// relation on the nodes of the graph. Two nodes are in
359 361
  /// relationship when there are directed paths between them in both
360 362
  /// direction. In addition, the numbering of components will satisfy
361 363
  /// that there is no arc going from a higher numbered component to
362 364
  /// a lower.
363 365
  ///
366
  /// \image html strongly_connected_components.png
367
  /// \image latex strongly_connected_components.eps "Strongly connected components" width=\textwidth
368
  ///
364 369
  /// \param digraph The digraph.
365 370
  /// \retval compMap A writable node map. The values will be set from 0 to
366 371
  /// the number of the strongly connected components minus one. Each value
367 372
  /// of the map will be set exactly once, the values of a certain component
368 373
  /// will be set continuously.
369 374
  /// \return The number of components
370
  ///
371 375
  template <typename Digraph, typename NodeMap>
372 376
  int stronglyConnectedComponents(const Digraph& digraph, NodeMap& compMap) {
373 377
    checkConcept<concepts::Digraph, Digraph>();
374 378
    typedef typename Digraph::Node Node;
375 379
    typedef typename Digraph::NodeIt NodeIt;
376 380
    checkConcept<concepts::WriteMap<Node, int>, NodeMap>();
377 381

	
378 382
    using namespace _connectivity_bits;
379 383

	
380 384
    typedef std::vector<Node> Container;
381 385
    typedef typename Container::iterator Iterator;
382 386

	
... ...
@@ -407,25 +411,25 @@
407 411

	
408 412
    rdfs.init();
409 413
    for (RIterator it = nodes.rbegin(); it != nodes.rend(); ++it) {
410 414
      if (!rdfs.reached(*it)) {
411 415
        rdfs.addSource(*it);
412 416
        rdfs.start();
413 417
        ++compNum;
414 418
      }
415 419
    }
416 420
    return compNum;
417 421
  }
418 422

	
419
  /// \ingroup connectivity
423
  /// \ingroup graph_properties
420 424
  ///
421 425
  /// \brief Find the cut arcs of the strongly connected components.
422 426
  ///
423 427
  /// Find the cut arcs of the strongly connected components.
424 428
  /// The strongly connected components are the classes of an equivalence
425 429
  /// relation on the nodes of the graph. Two nodes are in relationship
426 430
  /// when there are directed paths between them in both direction.
427 431
  /// The strongly connected components are separated by the cut arcs.
428 432
  ///
429 433
  /// \param graph The graph.
430 434
  /// \retval cutMap A writable node map. The values will be set true when the
431 435
  /// arc is a cut arc.
... ...
@@ -691,40 +695,40 @@
691 695
      typename Digraph::template NodeMap<int> _retMap;
692 696
      typename Digraph::template NodeMap<Node> _predMap;
693 697
      std::stack<Edge> _edgeStack;
694 698
      int _num;
695 699
      bool rootCut;
696 700
    };
697 701

	
698 702
  }
699 703

	
700 704
  template <typename Graph>
701 705
  int countBiNodeConnectedComponents(const Graph& graph);
702 706

	
703
  /// \ingroup connectivity
707
  /// \ingroup graph_properties
704 708
  ///
705 709
  /// \brief Checks the graph is bi-node-connected.
706 710
  ///
707 711
  /// This function checks that the undirected graph is bi-node-connected
708 712
  /// graph. The graph is bi-node-connected if any two undirected edge is
709 713
  /// on same circle.
710 714
  ///
711 715
  /// \param graph The graph.
712 716
  /// \return \c true when the graph bi-node-connected.
713 717
  template <typename Graph>
714 718
  bool biNodeConnected(const Graph& graph) {
715 719
    return countBiNodeConnectedComponents(graph) <= 1;
716 720
  }
717 721

	
718
  /// \ingroup connectivity
722
  /// \ingroup graph_properties
719 723
  ///
720 724
  /// \brief Count the biconnected components.
721 725
  ///
722 726
  /// This function finds the bi-node-connected components in an undirected
723 727
  /// graph. The biconnected components are the classes of an equivalence
724 728
  /// relation on the undirected edges. Two undirected edge is in relationship
725 729
  /// when they are on same circle.
726 730
  ///
727 731
  /// \param graph The graph.
728 732
  /// \return The number of components.
729 733
  template <typename Graph>
730 734
  int countBiNodeConnectedComponents(const Graph& graph) {
... ...
@@ -741,40 +745,42 @@
741 745
    DfsVisit<Graph, Visitor> dfs(graph, visitor);
742 746
    dfs.init();
743 747

	
744 748
    for (NodeIt it(graph); it != INVALID; ++it) {
745 749
      if (!dfs.reached(it)) {
746 750
        dfs.addSource(it);
747 751
        dfs.start();
748 752
      }
749 753
    }
750 754
    return compNum;
751 755
  }
752 756

	
753
  /// \ingroup connectivity
757
  /// \ingroup graph_properties
754 758
  ///
755 759
  /// \brief Find the bi-node-connected components.
756 760
  ///
757 761
  /// This function finds the bi-node-connected components in an undirected
758 762
  /// graph. The bi-node-connected components are the classes of an equivalence
759 763
  /// relation on the undirected edges. Two undirected edge are in relationship
760 764
  /// when they are on same circle.
761 765
  ///
766
  /// \image html node_biconnected_components.png
767
  /// \image latex node_biconnected_components.eps "bi-node-connected components" width=\textwidth
768
  ///
762 769
  /// \param graph The graph.
763 770
  /// \retval compMap A writable uedge map. The values will be set from 0
764 771
  /// to the number of the biconnected components minus one. Each values
765 772
  /// of the map will be set exactly once, the values of a certain component
766 773
  /// will be set continuously.
767 774
  /// \return The number of components.
768
  ///
769 775
  template <typename Graph, typename EdgeMap>
770 776
  int biNodeConnectedComponents(const Graph& graph,
771 777
                                EdgeMap& compMap) {
772 778
    checkConcept<concepts::Graph, Graph>();
773 779
    typedef typename Graph::NodeIt NodeIt;
774 780
    typedef typename Graph::Edge Edge;
775 781
    checkConcept<concepts::WriteMap<Edge, int>, EdgeMap>();
776 782

	
777 783
    using namespace _connectivity_bits;
778 784

	
779 785
    typedef BiNodeConnectedComponentsVisitor<Graph, EdgeMap> Visitor;
780 786

	
... ...
@@ -784,25 +790,25 @@
784 790
    DfsVisit<Graph, Visitor> dfs(graph, visitor);
785 791
    dfs.init();
786 792

	
787 793
    for (NodeIt it(graph); it != INVALID; ++it) {
788 794
      if (!dfs.reached(it)) {
789 795
        dfs.addSource(it);
790 796
        dfs.start();
791 797
      }
792 798
    }
793 799
    return compNum;
794 800
  }
795 801

	
796
  /// \ingroup connectivity
802
  /// \ingroup graph_properties
797 803
  ///
798 804
  /// \brief Find the bi-node-connected cut nodes.
799 805
  ///
800 806
  /// This function finds the bi-node-connected cut nodes in an undirected
801 807
  /// graph. The bi-node-connected components are the classes of an equivalence
802 808
  /// relation on the undirected edges. Two undirected edges are in
803 809
  /// relationship when they are on same circle. The biconnected components
804 810
  /// are separted by nodes which are the cut nodes of the components.
805 811
  ///
806 812
  /// \param graph The graph.
807 813
  /// \retval cutMap A writable edge map. The values will be set true when
808 814
  /// the node separate two or more components.
... ...
@@ -1014,40 +1020,40 @@
1014 1020
      int& _cutNum;
1015 1021

	
1016 1022
      typename Digraph::template NodeMap<int> _numMap;
1017 1023
      typename Digraph::template NodeMap<int> _retMap;
1018 1024
      typename Digraph::template NodeMap<Arc> _predMap;
1019 1025
      int _num;
1020 1026
    };
1021 1027
  }
1022 1028

	
1023 1029
  template <typename Graph>
1024 1030
  int countBiEdgeConnectedComponents(const Graph& graph);
1025 1031

	
1026
  /// \ingroup connectivity
1032
  /// \ingroup graph_properties
1027 1033
  ///
1028 1034
  /// \brief Checks that the graph is bi-edge-connected.
1029 1035
  ///
1030 1036
  /// This function checks that the graph is bi-edge-connected. The undirected
1031 1037
  /// graph is bi-edge-connected when any two nodes are connected with two
1032 1038
  /// edge-disjoint paths.
1033 1039
  ///
1034 1040
  /// \param graph The undirected graph.
1035 1041
  /// \return The number of components.
1036 1042
  template <typename Graph>
1037 1043
  bool biEdgeConnected(const Graph& graph) {
1038 1044
    return countBiEdgeConnectedComponents(graph) <= 1;
1039 1045
  }
1040 1046

	
1041
  /// \ingroup connectivity
1047
  /// \ingroup graph_properties
1042 1048
  ///
1043 1049
  /// \brief Count the bi-edge-connected components.
1044 1050
  ///
1045 1051
  /// This function count the bi-edge-connected components in an undirected
1046 1052
  /// graph. The bi-edge-connected components are the classes of an equivalence
1047 1053
  /// relation on the nodes. Two nodes are in relationship when they are
1048 1054
  /// connected with at least two edge-disjoint paths.
1049 1055
  ///
1050 1056
  /// \param graph The undirected graph.
1051 1057
  /// \return The number of components.
1052 1058
  template <typename Graph>
1053 1059
  int countBiEdgeConnectedComponents(const Graph& graph) {
... ...
@@ -1064,40 +1070,42 @@
1064 1070
    DfsVisit<Graph, Visitor> dfs(graph, visitor);
1065 1071
    dfs.init();
1066 1072

	
1067 1073
    for (NodeIt it(graph); it != INVALID; ++it) {
1068 1074
      if (!dfs.reached(it)) {
1069 1075
        dfs.addSource(it);
1070 1076
        dfs.start();
1071 1077
      }
1072 1078
    }
1073 1079
    return compNum;
1074 1080
  }
1075 1081

	
1076
  /// \ingroup connectivity
1082
  /// \ingroup graph_properties
1077 1083
  ///
1078 1084
  /// \brief Find the bi-edge-connected components.
1079 1085
  ///
1080 1086
  /// This function finds the bi-edge-connected components in an undirected
1081 1087
  /// graph. The bi-edge-connected components are the classes of an equivalence
1082 1088
  /// relation on the nodes. Two nodes are in relationship when they are
1083 1089
  /// connected at least two edge-disjoint paths.
1084 1090
  ///
1091
  /// \image html edge_biconnected_components.png
1092
  /// \image latex edge_biconnected_components.eps "bi-edge-connected components" width=\textwidth
1093
  ///
1085 1094
  /// \param graph The graph.
1086 1095
  /// \retval compMap A writable node map. The values will be set from 0 to
1087 1096
  /// the number of the biconnected components minus one. Each values
1088 1097
  /// of the map will be set exactly once, the values of a certain component
1089 1098
  /// will be set continuously.
1090 1099
  /// \return The number of components.
1091
  ///
1092 1100
  template <typename Graph, typename NodeMap>
1093 1101
  int biEdgeConnectedComponents(const Graph& graph, NodeMap& compMap) {
1094 1102
    checkConcept<concepts::Graph, Graph>();
1095 1103
    typedef typename Graph::NodeIt NodeIt;
1096 1104
    typedef typename Graph::Node Node;
1097 1105
    checkConcept<concepts::WriteMap<Node, int>, NodeMap>();
1098 1106

	
1099 1107
    using namespace _connectivity_bits;
1100 1108

	
1101 1109
    typedef BiEdgeConnectedComponentsVisitor<Graph, NodeMap> Visitor;
1102 1110

	
1103 1111
    int compNum = 0;
... ...
@@ -1106,25 +1114,25 @@
1106 1114
    DfsVisit<Graph, Visitor> dfs(graph, visitor);
1107 1115
    dfs.init();
1108 1116

	
1109 1117
    for (NodeIt it(graph); it != INVALID; ++it) {
1110 1118
      if (!dfs.reached(it)) {
1111 1119
        dfs.addSource(it);
1112 1120
        dfs.start();
1113 1121
      }
1114 1122
    }
1115 1123
    return compNum;
1116 1124
  }
1117 1125

	
1118
  /// \ingroup connectivity
1126
  /// \ingroup graph_properties
1119 1127
  ///
1120 1128
  /// \brief Find the bi-edge-connected cut edges.
1121 1129
  ///
1122 1130
  /// This function finds the bi-edge-connected components in an undirected
1123 1131
  /// graph. The bi-edge-connected components are the classes of an equivalence
1124 1132
  /// relation on the nodes. Two nodes are in relationship when they are
1125 1133
  /// connected with at least two edge-disjoint paths. The bi-edge-connected
1126 1134
  /// components are separted by edges which are the cut edges of the
1127 1135
  /// components.
1128 1136
  ///
1129 1137
  /// \param graph The graph.
1130 1138
  /// \retval cutMap A writable node map. The values will be set true when the
... ...
@@ -1170,25 +1178,25 @@
1170 1178

	
1171 1179
      void leave(const Node& node) {
1172 1180
        _order.set(node, --_num);
1173 1181
      }
1174 1182

	
1175 1183
    private:
1176 1184
      IntNodeMap& _order;
1177 1185
      int _num;
1178 1186
    };
1179 1187

	
1180 1188
  }
1181 1189

	
1182
  /// \ingroup connectivity
1190
  /// \ingroup graph_properties
1183 1191
  ///
1184 1192
  /// \brief Sort the nodes of a DAG into topolgical order.
1185 1193
  ///
1186 1194
  /// Sort the nodes of a DAG into topolgical order.
1187 1195
  ///
1188 1196
  /// \param graph The graph. It must be directed and acyclic.
1189 1197
  /// \retval order A writable node map. The values will be set from 0 to
1190 1198
  /// the number of the nodes in the graph minus one. Each values of the map
1191 1199
  /// will be set exactly once, the values  will be set descending order.
1192 1200
  ///
1193 1201
  /// \see checkedTopologicalSort
1194 1202
  /// \see dag
... ...
@@ -1209,25 +1217,25 @@
1209 1217
    DfsVisit<Digraph, TopologicalSortVisitor<Digraph, NodeMap> >
1210 1218
      dfs(graph, visitor);
1211 1219

	
1212 1220
    dfs.init();
1213 1221
    for (NodeIt it(graph); it != INVALID; ++it) {
1214 1222
      if (!dfs.reached(it)) {
1215 1223
        dfs.addSource(it);
1216 1224
        dfs.start();
1217 1225
      }
1218 1226
    }
1219 1227
  }
1220 1228

	
1221
  /// \ingroup connectivity
1229
  /// \ingroup graph_properties
1222 1230
  ///
1223 1231
  /// \brief Sort the nodes of a DAG into topolgical order.
1224 1232
  ///
1225 1233
  /// Sort the nodes of a DAG into topolgical order. It also checks
1226 1234
  /// that the given graph is DAG.
1227 1235
  ///
1228 1236
  /// \param digraph The graph. It must be directed and acyclic.
1229 1237
  /// \retval order A readable - writable node map. The values will be set
1230 1238
  /// from 0 to the number of the nodes in the graph minus one. Each values
1231 1239
  /// of the map will be set exactly once, the values will be set descending
1232 1240
  /// order.
1233 1241
  /// \return \c false when the graph is not DAG.
... ...
@@ -1264,25 +1272,25 @@
1264 1272
           Arc arc = dfs.nextArc();
1265 1273
           Node target = digraph.target(arc);
1266 1274
           if (dfs.reached(target) && order[target] == -1) {
1267 1275
             return false;
1268 1276
           }
1269 1277
           dfs.processNextArc();
1270 1278
         }
1271 1279
      }
1272 1280
    }
1273 1281
    return true;
1274 1282
  }
1275 1283

	
1276
  /// \ingroup connectivity
1284
  /// \ingroup graph_properties
1277 1285
  ///
1278 1286
  /// \brief Check that the given directed graph is a DAG.
1279 1287
  ///
1280 1288
  /// Check that the given directed graph is a DAG. The DAG is
1281 1289
  /// an Directed Acyclic Digraph.
1282 1290
  /// \return \c false when the graph is not DAG.
1283 1291
  /// \see acyclic
1284 1292
  template <typename Digraph>
1285 1293
  bool dag(const Digraph& digraph) {
1286 1294

	
1287 1295
    checkConcept<concepts::Digraph, Digraph>();
1288 1296

	
... ...
@@ -1306,25 +1314,25 @@
1306 1314
          Arc edge = dfs.nextArc();
1307 1315
          Node target = digraph.target(edge);
1308 1316
          if (dfs.reached(target) && !processed[target]) {
1309 1317
            return false;
1310 1318
          }
1311 1319
          dfs.processNextArc();
1312 1320
        }
1313 1321
      }
1314 1322
    }
1315 1323
    return true;
1316 1324
  }
1317 1325

	
1318
  /// \ingroup connectivity
1326
  /// \ingroup graph_properties
1319 1327
  ///
1320 1328
  /// \brief Check that the given undirected graph is acyclic.
1321 1329
  ///
1322 1330
  /// Check that the given undirected graph acyclic.
1323 1331
  /// \param graph The undirected graph.
1324 1332
  /// \return \c true when there is no circle in the graph.
1325 1333
  /// \see dag
1326 1334
  template <typename Graph>
1327 1335
  bool acyclic(const Graph& graph) {
1328 1336
    checkConcept<concepts::Graph, Graph>();
1329 1337
    typedef typename Graph::Node Node;
1330 1338
    typedef typename Graph::NodeIt NodeIt;
... ...
@@ -1340,25 +1348,25 @@
1340 1348
          Node target = graph.target(edge);
1341 1349
          if (dfs.reached(target) &&
1342 1350
              dfs.predArc(source) != graph.oppositeArc(edge)) {
1343 1351
            return false;
1344 1352
          }
1345 1353
          dfs.processNextArc();
1346 1354
        }
1347 1355
      }
1348 1356
    }
1349 1357
    return true;
1350 1358
  }
1351 1359

	
1352
  /// \ingroup connectivity
1360
  /// \ingroup graph_properties
1353 1361
  ///
1354 1362
  /// \brief Check that the given undirected graph is tree.
1355 1363
  ///
1356 1364
  /// Check that the given undirected graph is tree.
1357 1365
  /// \param graph The undirected graph.
1358 1366
  /// \return \c true when the graph is acyclic and connected.
1359 1367
  template <typename Graph>
1360 1368
  bool tree(const Graph& graph) {
1361 1369
    checkConcept<concepts::Graph, Graph>();
1362 1370
    typedef typename Graph::Node Node;
1363 1371
    typedef typename Graph::NodeIt NodeIt;
1364 1372
    typedef typename Graph::Arc Arc;
... ...
@@ -1432,25 +1440,25 @@
1432 1440
        _bipartite = _bipartite &&
1433 1441
          _part[_graph.target(edge)] != _part[_graph.source(edge)];
1434 1442
      }
1435 1443

	
1436 1444
    private:
1437 1445

	
1438 1446
      const Digraph& _graph;
1439 1447
      PartMap& _part;
1440 1448
      bool& _bipartite;
1441 1449
    };
1442 1450
  }
1443 1451

	
1444
  /// \ingroup connectivity
1452
  /// \ingroup graph_properties
1445 1453
  ///
1446 1454
  /// \brief Check if the given undirected graph is bipartite or not
1447 1455
  ///
1448 1456
  /// The function checks if the given undirected \c graph graph is bipartite
1449 1457
  /// or not. The \ref Bfs algorithm is used to calculate the result.
1450 1458
  /// \param graph The undirected graph.
1451 1459
  /// \return \c true if \c graph is bipartite, \c false otherwise.
1452 1460
  /// \sa bipartitePartitions
1453 1461
  template<typename Graph>
1454 1462
  inline bool bipartite(const Graph &graph){
1455 1463
    using namespace _connectivity_bits;
1456 1464

	
... ...
@@ -1469,32 +1477,36 @@
1469 1477
    for(NodeIt it(graph); it != INVALID; ++it) {
1470 1478
      if(!bfs.reached(it)){
1471 1479
        bfs.addSource(it);
1472 1480
        while (!bfs.emptyQueue()) {
1473 1481
          bfs.processNextNode();
1474 1482
          if (!bipartite) return false;
1475 1483
        }
1476 1484
      }
1477 1485
    }
1478 1486
    return true;
1479 1487
  }
1480 1488

	
1481
  /// \ingroup connectivity
1489
  /// \ingroup graph_properties
1482 1490
  ///
1483 1491
  /// \brief Check if the given undirected graph is bipartite or not
1484 1492
  ///
1485 1493
  /// The function checks if the given undirected graph is bipartite
1486 1494
  /// or not. The  \ref  Bfs  algorithm  is   used  to  calculate the result.
1487 1495
  /// During the execution, the \c partMap will be set as the two
1488 1496
  /// partitions of the graph.
1497
  ///
1498
  /// \image html bipartite_partitions.png
1499
  /// \image latex bipartite_partitions.eps "Bipartite partititions" width=\textwidth
1500
  ///
1489 1501
  /// \param graph The undirected graph.
1490 1502
  /// \retval partMap A writable bool map of nodes. It will be set as the
1491 1503
  /// two partitions of the graph.
1492 1504
  /// \return \c true if \c graph is bipartite, \c false otherwise.
1493 1505
  template<typename Graph, typename NodeMap>
1494 1506
  inline bool bipartitePartitions(const Graph &graph, NodeMap &partMap){
1495 1507
    using namespace _connectivity_bits;
1496 1508

	
1497 1509
    checkConcept<concepts::Graph, Graph>();
1498 1510

	
1499 1511
    typedef typename Graph::Node Node;
1500 1512
    typedef typename Graph::NodeIt NodeIt;
Ignore white space 6 line context
... ...
@@ -1306,201 +1306,201 @@
1306 1306
    virtual void erase(const std::vector<Arc>& arcs) {
1307 1307
      for (int i = 0; i < int(arcs.size()); ++i) {
1308 1308
        remove(arcs[i]);
1309 1309
      }
1310 1310
    }
1311 1311

	
1312 1312
    virtual void build() {
1313 1313
      refresh();
1314 1314
    }
1315 1315

	
1316 1316
    virtual void clear() {
1317 1317
      for(NodeIt n(_g);n!=INVALID;++n) {
1318
        _head.set(n, INVALID);
1318
        _head[n] = INVALID;
1319 1319
      }
1320 1320
    }
1321 1321

	
1322 1322
    void insert(Arc arc) {
1323 1323
      Node s = _g.source(arc);
1324 1324
      Node t = _g.target(arc);
1325
      _left.set(arc, INVALID);
1326
      _right.set(arc, INVALID);
1325
      _left[arc] = INVALID;
1326
      _right[arc] = INVALID;
1327 1327

	
1328 1328
      Arc e = _head[s];
1329 1329
      if (e == INVALID) {
1330
        _head.set(s, arc);
1331
        _parent.set(arc, INVALID);
1330
        _head[s] = arc;
1331
        _parent[arc] = INVALID;
1332 1332
        return;
1333 1333
      }
1334 1334
      while (true) {
1335 1335
        if (t < _g.target(e)) {
1336 1336
          if (_left[e] == INVALID) {
1337
            _left.set(e, arc);
1338
            _parent.set(arc, e);
1337
            _left[e] = arc;
1338
            _parent[arc] = e;
1339 1339
            splay(arc);
1340 1340
            return;
1341 1341
          } else {
1342 1342
            e = _left[e];
1343 1343
          }
1344 1344
        } else {
1345 1345
          if (_right[e] == INVALID) {
1346
            _right.set(e, arc);
1347
            _parent.set(arc, e);
1346
            _right[e] = arc;
1347
            _parent[arc] = e;
1348 1348
            splay(arc);
1349 1349
            return;
1350 1350
          } else {
1351 1351
            e = _right[e];
1352 1352
          }
1353 1353
        }
1354 1354
      }
1355 1355
    }
1356 1356

	
1357 1357
    void remove(Arc arc) {
1358 1358
      if (_left[arc] == INVALID) {
1359 1359
        if (_right[arc] != INVALID) {
1360
          _parent.set(_right[arc], _parent[arc]);
1360
          _parent[_right[arc]] = _parent[arc];
1361 1361
        }
1362 1362
        if (_parent[arc] != INVALID) {
1363 1363
          if (_left[_parent[arc]] == arc) {
1364
            _left.set(_parent[arc], _right[arc]);
1364
            _left[_parent[arc]] = _right[arc];
1365 1365
          } else {
1366
            _right.set(_parent[arc], _right[arc]);
1366
            _right[_parent[arc]] = _right[arc];
1367 1367
          }
1368 1368
        } else {
1369
          _head.set(_g.source(arc), _right[arc]);
1369
          _head[_g.source(arc)] = _right[arc];
1370 1370
        }
1371 1371
      } else if (_right[arc] == INVALID) {
1372
        _parent.set(_left[arc], _parent[arc]);
1372
        _parent[_left[arc]] = _parent[arc];
1373 1373
        if (_parent[arc] != INVALID) {
1374 1374
          if (_left[_parent[arc]] == arc) {
1375
            _left.set(_parent[arc], _left[arc]);
1375
            _left[_parent[arc]] = _left[arc];
1376 1376
          } else {
1377
            _right.set(_parent[arc], _left[arc]);
1377
            _right[_parent[arc]] = _left[arc];
1378 1378
          }
1379 1379
        } else {
1380
          _head.set(_g.source(arc), _left[arc]);
1380
          _head[_g.source(arc)] = _left[arc];
1381 1381
        }
1382 1382
      } else {
1383 1383
        Arc e = _left[arc];
1384 1384
        if (_right[e] != INVALID) {
1385 1385
          e = _right[e];
1386 1386
          while (_right[e] != INVALID) {
1387 1387
            e = _right[e];
1388 1388
          }
1389 1389
          Arc s = _parent[e];
1390
          _right.set(_parent[e], _left[e]);
1390
          _right[_parent[e]] = _left[e];
1391 1391
          if (_left[e] != INVALID) {
1392
            _parent.set(_left[e], _parent[e]);
1392
            _parent[_left[e]] = _parent[e];
1393 1393
          }
1394 1394

	
1395
          _left.set(e, _left[arc]);
1396
          _parent.set(_left[arc], e);
1397
          _right.set(e, _right[arc]);
1398
          _parent.set(_right[arc], e);
1395
          _left[e] = _left[arc];
1396
          _parent[_left[arc]] = e;
1397
          _right[e] = _right[arc];
1398
          _parent[_right[arc]] = e;
1399 1399

	
1400
          _parent.set(e, _parent[arc]);
1400
          _parent[e] = _parent[arc];
1401 1401
          if (_parent[arc] != INVALID) {
1402 1402
            if (_left[_parent[arc]] == arc) {
1403
              _left.set(_parent[arc], e);
1403
              _left[_parent[arc]] = e;
1404 1404
            } else {
1405
              _right.set(_parent[arc], e);
1405
              _right[_parent[arc]] = e;
1406 1406
            }
1407 1407
          }
1408 1408
          splay(s);
1409 1409
        } else {
1410
          _right.set(e, _right[arc]);
1411
          _parent.set(_right[arc], e);
1412
          _parent.set(e, _parent[arc]);
1410
          _right[e] = _right[arc];
1411
          _parent[_right[arc]] = e;
1412
          _parent[e] = _parent[arc];
1413 1413

	
1414 1414
          if (_parent[arc] != INVALID) {
1415 1415
            if (_left[_parent[arc]] == arc) {
1416
              _left.set(_parent[arc], e);
1416
              _left[_parent[arc]] = e;
1417 1417
            } else {
1418
              _right.set(_parent[arc], e);
1418
              _right[_parent[arc]] = e;
1419 1419
            }
1420 1420
          } else {
1421
            _head.set(_g.source(arc), e);
1421
            _head[_g.source(arc)] = e;
1422 1422
          }
1423 1423
        }
1424 1424
      }
1425 1425
    }
1426 1426

	
1427 1427
    Arc refreshRec(std::vector<Arc> &v,int a,int b)
1428 1428
    {
1429 1429
      int m=(a+b)/2;
1430 1430
      Arc me=v[m];
1431 1431
      if (a < m) {
1432 1432
        Arc left = refreshRec(v,a,m-1);
1433
        _left.set(me, left);
1434
        _parent.set(left, me);
1433
        _left[me] = left;
1434
        _parent[left] = me;
1435 1435
      } else {
1436
        _left.set(me, INVALID);
1436
        _left[me] = INVALID;
1437 1437
      }
1438 1438
      if (m < b) {
1439 1439
        Arc right = refreshRec(v,m+1,b);
1440
        _right.set(me, right);
1441
        _parent.set(right, me);
1440
        _right[me] = right;
1441
        _parent[right] = me;
1442 1442
      } else {
1443
        _right.set(me, INVALID);
1443
        _right[me] = INVALID;
1444 1444
      }
1445 1445
      return me;
1446 1446
    }
1447 1447

	
1448 1448
    void refresh() {
1449 1449
      for(NodeIt n(_g);n!=INVALID;++n) {
1450 1450
        std::vector<Arc> v;
1451 1451
        for(OutArcIt a(_g,n);a!=INVALID;++a) v.push_back(a);
1452 1452
        if (!v.empty()) {
1453 1453
          std::sort(v.begin(),v.end(),ArcLess(_g));
1454 1454
          Arc head = refreshRec(v,0,v.size()-1);
1455
          _head.set(n, head);
1456
          _parent.set(head, INVALID);
1455
          _head[n] = head;
1456
          _parent[head] = INVALID;
1457 1457
        }
1458
        else _head.set(n, INVALID);
1458
        else _head[n] = INVALID;
1459 1459
      }
1460 1460
    }
1461 1461

	
1462 1462
    void zig(Arc v) {
1463 1463
      Arc w = _parent[v];
1464
      _parent.set(v, _parent[w]);
1465
      _parent.set(w, v);
1466
      _left.set(w, _right[v]);
1467
      _right.set(v, w);
1464
      _parent[v] = _parent[w];
1465
      _parent[w] = v;
1466
      _left[w] = _right[v];
1467
      _right[v] = w;
1468 1468
      if (_parent[v] != INVALID) {
1469 1469
        if (_right[_parent[v]] == w) {
1470
          _right.set(_parent[v], v);
1470
          _right[_parent[v]] = v;
1471 1471
        } else {
1472
          _left.set(_parent[v], v);
1472
          _left[_parent[v]] = v;
1473 1473
        }
1474 1474
      }
1475 1475
      if (_left[w] != INVALID){
1476
        _parent.set(_left[w], w);
1476
        _parent[_left[w]] = w;
1477 1477
      }
1478 1478
    }
1479 1479

	
1480 1480
    void zag(Arc v) {
1481 1481
      Arc w = _parent[v];
1482
      _parent.set(v, _parent[w]);
1483
      _parent.set(w, v);
1484
      _right.set(w, _left[v]);
1485
      _left.set(v, w);
1482
      _parent[v] = _parent[w];
1483
      _parent[w] = v;
1484
      _right[w] = _left[v];
1485
      _left[v] = w;
1486 1486
      if (_parent[v] != INVALID){
1487 1487
        if (_left[_parent[v]] == w) {
1488
          _left.set(_parent[v], v);
1488
          _left[_parent[v]] = v;
1489 1489
        } else {
1490
          _right.set(_parent[v], v);
1490
          _right[_parent[v]] = v;
1491 1491
        }
1492 1492
      }
1493 1493
      if (_right[w] != INVALID){
1494
        _parent.set(_right[w], w);
1494
        _parent[_right[w]] = w;
1495 1495
      }
1496 1496
    }
1497 1497

	
1498 1498
    void splay(Arc v) {
1499 1499
      while (_parent[v] != INVALID) {
1500 1500
        if (v == _left[_parent[v]]) {
1501 1501
          if (_parent[_parent[v]] == INVALID) {
1502 1502
            zig(v);
1503 1503
          } else {
1504 1504
            if (_parent[v] == _left[_parent[_parent[v]]]) {
1505 1505
              zig(_parent[v]);
1506 1506
              zig(v);
Ignore white space 6 line context
... ...
@@ -63,38 +63,41 @@
63 63

	
64 64
  CplexEnv::~CplexEnv() {
65 65
    --(*_cnt);
66 66
    if (*_cnt == 0) {
67 67
      delete _cnt;
68 68
      CPXcloseCPLEX(&_env);
69 69
    }
70 70
  }
71 71

	
72 72
  CplexBase::CplexBase() : LpBase() {
73 73
    int status;
74 74
    _prob = CPXcreateprob(cplexEnv(), &status, "Cplex problem");
75
    messageLevel(MESSAGE_NOTHING);
75 76
  }
76 77

	
77 78
  CplexBase::CplexBase(const CplexEnv& env)
78 79
    : LpBase(), _env(env) {
79 80
    int status;
80 81
    _prob = CPXcreateprob(cplexEnv(), &status, "Cplex problem");
82
    messageLevel(MESSAGE_NOTHING);
81 83
  }
82 84

	
83 85
  CplexBase::CplexBase(const CplexBase& cplex)
84 86
    : LpBase() {
85 87
    int status;
86 88
    _prob = CPXcloneprob(cplexEnv(), cplex._prob, &status);
87 89
    rows = cplex.rows;
88 90
    cols = cplex.cols;
91
    messageLevel(MESSAGE_NOTHING);
89 92
  }
90 93

	
91 94
  CplexBase::~CplexBase() {
92 95
    CPXfreeprob(cplexEnv(),&_prob);
93 96
  }
94 97

	
95 98
  int CplexBase::_addCol() {
96 99
    int i = CPXgetnumcols(cplexEnv(), _prob);
97 100
    double lb = -INF, ub = INF;
98 101
    CPXnewcols(cplexEnv(), _prob, 1, 0, &lb, &ub, 0, 0);
99 102
    return i;
100 103
  }
... ...
@@ -429,24 +432,43 @@
429 432
      return CplexBase::Sense();
430 433
    }
431 434
  }
432 435

	
433 436
  void CplexBase::_clear() {
434 437
    CPXfreeprob(cplexEnv(),&_prob);
435 438
    int status;
436 439
    _prob = CPXcreateprob(cplexEnv(), &status, "Cplex problem");
437 440
    rows.clear();
438 441
    cols.clear();
439 442
  }
440 443

	
444
  void CplexBase::_messageLevel(MessageLevel level) {
445
    switch (level) {
446
    case MESSAGE_NOTHING:
447
      _message_enabled = false;
448
      break;
449
    case MESSAGE_ERROR:
450
    case MESSAGE_WARNING:
451
    case MESSAGE_NORMAL:
452
    case MESSAGE_VERBOSE:
453
      _message_enabled = true;
454
      break;
455
    }
456
  }
457

	
458
  void CplexBase::_applyMessageLevel() {
459
    CPXsetintparam(cplexEnv(), CPX_PARAM_SCRIND, 
460
                   _message_enabled ? CPX_ON : CPX_OFF);
461
  }
462

	
441 463
  // CplexLp members
442 464

	
443 465
  CplexLp::CplexLp()
444 466
    : LpBase(), LpSolver(), CplexBase() {}
445 467

	
446 468
  CplexLp::CplexLp(const CplexEnv& env)
447 469
    : LpBase(), LpSolver(), CplexBase(env) {}
448 470

	
449 471
  CplexLp::CplexLp(const CplexLp& other)
450 472
    : LpBase(), LpSolver(), CplexBase(other) {}
451 473

	
452 474
  CplexLp::~CplexLp() {}
... ...
@@ -498,39 +520,43 @@
498 520
        return UNSOLVED;
499 521
      default:
500 522
        return SOLVED;
501 523
      }
502 524
    } else {
503 525
      return UNSOLVED;
504 526
    }
505 527
#endif
506 528
  }
507 529

	
508 530
  CplexLp::SolveExitStatus CplexLp::_solve() {
509 531
    _clear_temporals();
532
    _applyMessageLevel();
510 533
    return convertStatus(CPXlpopt(cplexEnv(), _prob));
511 534
  }
512 535

	
513 536
  CplexLp::SolveExitStatus CplexLp::solvePrimal() {
514 537
    _clear_temporals();
538
    _applyMessageLevel();
515 539
    return convertStatus(CPXprimopt(cplexEnv(), _prob));
516 540
  }
517 541

	
518 542
  CplexLp::SolveExitStatus CplexLp::solveDual() {
519 543
    _clear_temporals();
544
    _applyMessageLevel();
520 545
    return convertStatus(CPXdualopt(cplexEnv(), _prob));
521 546
  }
522 547

	
523 548
  CplexLp::SolveExitStatus CplexLp::solveBarrier() {
524 549
    _clear_temporals();
550
    _applyMessageLevel();
525 551
    return convertStatus(CPXbaropt(cplexEnv(), _prob));
526 552
  }
527 553

	
528 554
  CplexLp::Value CplexLp::_getPrimal(int i) const {
529 555
    Value x;
530 556
    CPXgetx(cplexEnv(), _prob, &x, i, i);
531 557
    return x;
532 558
  }
533 559

	
534 560
  CplexLp::Value CplexLp::_getDual(int i) const {
535 561
    Value y;
536 562
    CPXgetpi(cplexEnv(), _prob, &y, i, i);
... ...
@@ -591,25 +617,25 @@
591 617
      CPXgetray(cplexEnv(), _prob, &_primal_ray.front());
592 618
    }
593 619
    return _primal_ray[i];
594 620
  }
595 621

	
596 622
  CplexLp::Value CplexLp::_getDualRay(int i) const {
597 623
    if (_dual_ray.empty()) {
598 624

	
599 625
    }
600 626
    return _dual_ray[i];
601 627
  }
602 628

	
603
  //7.5-os cplex statusai (Vigyazat: a 9.0-asei masok!)
629
  // Cplex 7.0 status values
604 630
  // This table lists the statuses, returned by the CPXgetstat()
605 631
  // routine, for solutions to LP problems or mixed integer problems. If
606 632
  // no solution exists, the return value is zero.
607 633

	
608 634
  // For Simplex, Barrier
609 635
  // 1          CPX_OPTIMAL
610 636
  //          Optimal solution found
611 637
  // 2          CPX_INFEASIBLE
612 638
  //          Problem infeasible
613 639
  // 3    CPX_UNBOUNDED
614 640
  //          Problem unbounded
615 641
  // 4          CPX_OBJ_LIM
... ...
@@ -638,25 +664,25 @@
638 664
  //          Aborted in barrier, primal infeasible
639 665
  // 16          CPX_ABORT_PRIM_DUAL_INFEAS
640 666
  //          Aborted in barrier, primal and dual infeasible
641 667
  // 17          CPX_ABORT_PRIM_DUAL_FEAS
642 668
  //          Aborted in barrier, primal and dual feasible
643 669
  // 18          CPX_ABORT_CROSSOVER
644 670
  //          Aborted in crossover
645 671
  // 19          CPX_INForUNBD
646 672
  //          Infeasible or unbounded
647 673
  // 20   CPX_PIVOT
648 674
  //       User pivot used
649 675
  //
650
  //     Ezeket hova tegyem:
676
  // Pending return values
651 677
  // ??case CPX_ABORT_DUAL_INFEAS
652 678
  // ??case CPX_ABORT_CROSSOVER
653 679
  // ??case CPX_INForUNBD
654 680
  // ??case CPX_PIVOT
655 681

	
656 682
  //Some more interesting stuff:
657 683

	
658 684
  // CPX_PARAM_PROBMETHOD  1062  int  LPMETHOD
659 685
  // 0 Automatic
660 686
  // 1 Primal Simplex
661 687
  // 2 Dual Simplex
662 688
  // 3 Network Simplex
... ...
@@ -709,25 +735,24 @@
709 735
      case CPX_STAT_OPTIMAL:
710 736
        return OPTIMAL;
711 737
      case CPX_STAT_UNBOUNDED:
712 738
        return UNBOUNDED;
713 739
      case CPX_STAT_INFEASIBLE:
714 740
        return INFEASIBLE;
715 741
      default:
716 742
        return UNDEFINED;
717 743
      }
718 744
#else
719 745
    statusSwitch(cplexEnv(),stat);
720 746
    //CPXgetstat(cplexEnv(), _prob);
721
    //printf("A primal status: %d, CPX_OPTIMAL=%d \n",stat,CPX_OPTIMAL);
722 747
    switch (stat) {
723 748
    case 0:
724 749
      return UNDEFINED; //Undefined
725 750
    case CPX_OPTIMAL://Optimal
726 751
      return OPTIMAL;
727 752
    case CPX_UNBOUNDED://Unbounded
728 753
      return INFEASIBLE;//In case of dual simplex
729 754
      //return UNBOUNDED;
730 755
    case CPX_INFEASIBLE://Infeasible
731 756
      //    case CPX_IT_LIM_INFEAS:
732 757
      //     case CPX_TIME_LIM_INFEAS:
733 758
      //     case CPX_NUM_BEST_INFEAS:
... ...
@@ -742,25 +767,25 @@
742 767
      //     case CPX_TIME_LIM_FEAS:
743 768
      //     case CPX_NUM_BEST_FEAS:
744 769
      //     case CPX_ABORT_FEAS:
745 770
      //     case CPX_ABORT_PRIM_DUAL_FEAS:
746 771
      //       return FEASIBLE;
747 772
    default:
748 773
      return UNDEFINED; //Everything else comes here
749 774
      //FIXME error
750 775
    }
751 776
#endif
752 777
  }
753 778

	
754
  //9.0-as cplex verzio statusai
779
  // Cplex 9.0 status values
755 780
  // CPX_STAT_ABORT_DUAL_OBJ_LIM
756 781
  // CPX_STAT_ABORT_IT_LIM
757 782
  // CPX_STAT_ABORT_OBJ_LIM
758 783
  // CPX_STAT_ABORT_PRIM_OBJ_LIM
759 784
  // CPX_STAT_ABORT_TIME_LIM
760 785
  // CPX_STAT_ABORT_USER
761 786
  // CPX_STAT_FEASIBLE_RELAXED
762 787
  // CPX_STAT_INFEASIBLE
763 788
  // CPX_STAT_INForUNBD
764 789
  // CPX_STAT_NUM_BEST
765 790
  // CPX_STAT_OPTIMAL
766 791
  // CPX_STAT_OPTIMAL_FACE_UNBOUNDED
... ...
@@ -855,24 +880,25 @@
855 880
      return INTEGER;
856 881
    case 'C':
857 882
      return REAL;
858 883
    default:
859 884
      LEMON_ASSERT(false, "Invalid column type");
860 885
      return ColTypes();
861 886
    }
862 887

	
863 888
  }
864 889

	
865 890
  CplexMip::SolveExitStatus CplexMip::_solve() {
866 891
    int status;
892
    _applyMessageLevel();
867 893
    status = CPXmipopt (cplexEnv(), _prob);
868 894
    if (status==0)
869 895
      return SOLVED;
870 896
    else
871 897
      return UNSOLVED;
872 898

	
873 899
  }
874 900

	
875 901

	
876 902
  CplexMip::ProblemType CplexMip::_getType() const {
877 903

	
878 904
    int stat = CPXgetstat(cplexEnv(), _prob);
Ignore white space 6 line context
... ...
@@ -135,32 +135,47 @@
135 135

	
136 136
    virtual void _setObjCoeffs(ExprIterator b, ExprIterator e);
137 137
    virtual void _getObjCoeffs(InsertIterator b) const;
138 138

	
139 139
    virtual void _setObjCoeff(int i, Value obj_coef);
140 140
    virtual Value _getObjCoeff(int i) const;
141 141

	
142 142
    virtual void _setSense(Sense sense);
143 143
    virtual Sense _getSense() const;
144 144

	
145 145
    virtual void _clear();
146 146

	
147
    virtual void _messageLevel(MessageLevel level);
148
    void _applyMessageLevel();
149

	
150
    bool _message_enabled;
151

	
147 152
  public:
148 153

	
149 154
    /// Returns the used \c CplexEnv instance
150 155
    const CplexEnv& env() const { return _env; }
156

	
157
    /// \brief Returns the const cpxenv pointer
151 158
    ///
159
    /// \note The cpxenv might be destructed with the solver.
152 160
    const cpxenv* cplexEnv() const { return _env.cplexEnv(); }
153 161

	
162
    /// \brief Returns the const cpxenv pointer
163
    ///
164
    /// \note The cpxenv might be destructed with the solver.
165
    cpxenv* cplexEnv() { return _env.cplexEnv(); }
166

	
167
    /// Returns the cplex problem object
154 168
    cpxlp* cplexLp() { return _prob; }
169
    /// Returns the cplex problem object
155 170
    const cpxlp* cplexLp() const { return _prob; }
156 171

	
157 172
  };
158 173

	
159 174
  /// \brief Interface for the CPLEX LP solver
160 175
  ///
161 176
  /// This class implements an interface for the CPLEX LP solver.
162 177
  ///\ingroup lp_group
163 178
  class CplexLp : public LpSolver, public CplexBase {
164 179
  public:
165 180
    /// \e
166 181
    CplexLp();
Ignore white space 6 line context
... ...
@@ -197,25 +197,25 @@
197 197
        _processed = Traits::createProcessedMap(*G);
198 198
      }
199 199
    }
200 200

	
201 201
  protected:
202 202

	
203 203
    Dfs() {}
204 204

	
205 205
  public:
206 206

	
207 207
    typedef Dfs Create;
208 208

	
209
    ///\name Named template parameters
209
    ///\name Named Template Parameters
210 210

	
211 211
    ///@{
212 212

	
213 213
    template <class T>
214 214
    struct SetPredMapTraits : public Traits {
215 215
      typedef T PredMap;
216 216
      static PredMap *createPredMap(const Digraph &)
217 217
      {
218 218
        LEMON_ASSERT(false, "PredMap is not initialized");
219 219
        return 0; // ignore warnings
220 220
      }
221 221
    };
Ignore white space 6 line context
... ...
@@ -277,25 +277,25 @@
277 277
        _heap_cross_ref = Traits::createHeapCrossRef(*G);
278 278
      }
279 279
      if (!_heap) {
280 280
        local_heap = true;
281 281
        _heap = Traits::createHeap(*_heap_cross_ref);
282 282
      }
283 283
    }
284 284

	
285 285
  public:
286 286

	
287 287
    typedef Dijkstra Create;
288 288

	
289
    ///\name Named template parameters
289
    ///\name Named Template Parameters
290 290

	
291 291
    ///@{
292 292

	
293 293
    template <class T>
294 294
    struct SetPredMapTraits : public Traits {
295 295
      typedef T PredMap;
296 296
      static PredMap *createPredMap(const Digraph &)
297 297
      {
298 298
        LEMON_ASSERT(false, "PredMap is not initialized");
299 299
        return 0; // ignore warnings
300 300
      }
301 301
    };
Ignore white space 24 line context
... ...
@@ -28,46 +28,51 @@
28 28
/// \ingroup dimacs_group
29 29
/// \file
30 30
/// \brief DIMACS file format reader.
31 31

	
32 32
namespace lemon {
33 33

	
34 34
  /// \addtogroup dimacs_group
35 35
  /// @{
36 36

	
37 37
  /// DIMACS file type descriptor.
38 38
  struct DimacsDescriptor
39 39
  {
40
    ///File type enum
41
    enum Type
42
      {
43
        NONE, MIN, MAX, SP, MAT
44
      };
40
    ///\brief DIMACS file type enum
41
    ///
42
    ///DIMACS file type enum.
43
    enum Type {
44
      NONE,  ///< Undefined type.
45
      MIN,   ///< DIMACS file type for minimum cost flow problems.
46
      MAX,   ///< DIMACS file type for maximum flow problems.
47
      SP,    ///< DIMACS file type for shostest path problems.
48
      MAT    ///< DIMACS file type for plain graphs and matching problems.
49
    };
45 50
    ///The file type
46 51
    Type type;
47 52
    ///The number of nodes in the graph
48 53
    int nodeNum;
49 54
    ///The number of edges in the graph
50 55
    int edgeNum;
51 56
    int lineShift;
52
    /// Constructor. Sets the type to NONE.
57
    ///Constructor. It sets the type to \c NONE.
53 58
    DimacsDescriptor() : type(NONE) {}
54 59
  };
55 60

	
56 61
  ///Discover the type of a DIMACS file
57 62

	
58
  ///It starts seeking the beginning of the file for the problem type
59
  ///and size info. The found data is returned in a special struct
60
  ///that can be evaluated and passed to the appropriate reader
61
  ///function.
63
  ///This function starts seeking the beginning of the given file for the
64
  ///problem type and size info. 
65
  ///The found data is returned in a special struct that can be evaluated
66
  ///and passed to the appropriate reader function.
62 67
  DimacsDescriptor dimacsType(std::istream& is)
63 68
  {
64 69
    DimacsDescriptor r;
65 70
    std::string problem,str;
66 71
    char c;
67 72
    r.lineShift=0;
68 73
    while (is >> c)
69 74
      switch(c)
70 75
        {
71 76
        case 'p':
72 77
          if(is >> problem >> r.nodeNum >> r.edgeNum)
73 78
            {
... ...
@@ -87,26 +92,25 @@
87 92
          break;
88 93
        case 'c':
89 94
          getline(is, str);
90 95
          r.lineShift++;
91 96
          break;
92 97
        default:
93 98
          throw FormatError("Unknown DIMACS declaration.");
94 99
        }
95 100
    throw FormatError("Missing problem type declaration.");
96 101
  }
97 102

	
98 103

	
99

	
100
  /// DIMACS minimum cost flow reader function.
104
  /// \brief DIMACS minimum cost flow reader function.
101 105
  ///
102 106
  /// This function reads a minimum cost flow instance from DIMACS format,
103 107
  /// i.e. from a DIMACS file having a line starting with
104 108
  /// \code
105 109
  ///   p min
106 110
  /// \endcode
107 111
  /// At the beginning, \c g is cleared by \c g.clear(). The supply
108 112
  /// amount of the nodes are written to the \c supply node map
109 113
  /// (they are signed values). The lower bounds, capacities and costs
110 114
  /// of the arcs are written to the \c lower, \c capacity and \c cost
111 115
  /// arc maps.
112 116
  ///
... ...
@@ -244,25 +248,25 @@
244 248
            capacity.set(e, infty);
245 249
        }
246 250
        else {
247 251
          is >> i >> j;
248 252
          getline(is, str);
249 253
          g.addArc(nodes[i], nodes[j]);
250 254
        }
251 255
        break;
252 256
      }
253 257
    }
254 258
  }
255 259

	
256
  /// DIMACS maximum flow reader function.
260
  /// \brief DIMACS maximum flow reader function.
257 261
  ///
258 262
  /// This function reads a maximum flow instance from DIMACS format,
259 263
  /// i.e. from a DIMACS file having a line starting with
260 264
  /// \code
261 265
  ///   p max
262 266
  /// \endcode
263 267
  /// At the beginning, \c g is cleared by \c g.clear(). The arc
264 268
  /// capacities are written to the \c capacity arc map and \c s and
265 269
  /// \c t are set to the source and the target nodes.
266 270
  ///
267 271
  /// If the capacity of an arc is negative, it will
268 272
  /// be set to "infinite" instead. The actual value of "infinite" is
... ...
@@ -278,25 +282,25 @@
278 282
                     Digraph &g,
279 283
                     CapacityMap& capacity,
280 284
                     typename Digraph::Node &s,
281 285
                     typename Digraph::Node &t,
282 286
                     typename CapacityMap::Value infty = 0,
283 287
                     DimacsDescriptor desc=DimacsDescriptor()) {
284 288
    if(desc.type==DimacsDescriptor::NONE) desc=dimacsType(is);
285 289
    if(desc.type!=DimacsDescriptor::MAX)
286 290
      throw FormatError("Problem type mismatch");
287 291
    _readDimacs(is,g,capacity,s,t,infty,desc);
288 292
  }
289 293

	
290
  /// DIMACS shortest path reader function.
294
  /// \brief DIMACS shortest path reader function.
291 295
  ///
292 296
  /// This function reads a shortest path instance from DIMACS format,
293 297
  /// i.e. from a DIMACS file having a line starting with
294 298
  /// \code
295 299
  ///   p sp
296 300
  /// \endcode
297 301
  /// At the beginning, \c g is cleared by \c g.clear(). The arc
298 302
  /// lengths are written to the \c length arc map and \c s is set to the
299 303
  /// source node.
300 304
  ///
301 305
  /// If the file type was previously evaluated by dimacsType(), then
302 306
  /// the descriptor struct should be given by the \c dest parameter.
... ...
@@ -304,25 +308,25 @@
304 308
  void readDimacsSp(std::istream& is,
305 309
                    Digraph &g,
306 310
                    LengthMap& length,
307 311
                    typename Digraph::Node &s,
308 312
                    DimacsDescriptor desc=DimacsDescriptor()) {
309 313
    typename Digraph::Node t;
310 314
    if(desc.type==DimacsDescriptor::NONE) desc=dimacsType(is);
311 315
    if(desc.type!=DimacsDescriptor::SP)
312 316
      throw FormatError("Problem type mismatch");
313 317
    _readDimacs(is, g, length, s, t, 0, desc);
314 318
  }
315 319

	
316
  /// DIMACS capacitated digraph reader function.
320
  /// \brief DIMACS capacitated digraph reader function.
317 321
  ///
318 322
  /// This function reads an arc capacitated digraph instance from
319 323
  /// DIMACS 'max' or 'sp' format.
320 324
  /// At the beginning, \c g is cleared by \c g.clear()
321 325
  /// and the arc capacities/lengths are written to the \c capacity
322 326
  /// arc map.
323 327
  ///
324 328
  /// In case of the 'max' format, if the capacity of an arc is negative,
325 329
  /// it will
326 330
  /// be set to "infinite" instead. The actual value of "infinite" is
327 331
  /// contolled by the \c infty parameter. If it is 0 (the default value),
328 332
  /// \c std::numeric_limits<Capacity>::infinity() will be used if available,
... ...
@@ -350,29 +354,29 @@
350 354
              dummy<0> = 0)
351 355
  {
352 356
    g.addEdge(s,t);
353 357
  }
354 358
  template<typename Graph>
355 359
  typename disable_if<lemon::UndirectedTagIndicator<Graph>,void>::type
356 360
  _addArcEdge(Graph &g, typename Graph::Node s, typename Graph::Node t,
357 361
              dummy<1> = 1)
358 362
  {
359 363
    g.addArc(s,t);
360 364
  }
361 365
  
362
  /// DIMACS plain (di)graph reader function.
366
  /// \brief DIMACS plain (di)graph reader function.
363 367
  ///
364
  /// This function reads a (di)graph without any designated nodes and
365
  /// maps from DIMACS format, i.e. from DIMACS files having a line
366
  /// starting with
368
  /// This function reads a plain (di)graph without any designated nodes
369
  /// and maps (e.g. a matching instance) from DIMACS format, i.e. from 
370
  /// DIMACS files having a line starting with
367 371
  /// \code
368 372
  ///   p mat
369 373
  /// \endcode
370 374
  /// At the beginning, \c g is cleared by \c g.clear().
371 375
  ///
372 376
  /// If the file type was previously evaluated by dimacsType(), then
373 377
  /// the descriptor struct should be given by the \c dest parameter.
374 378
  template<typename Graph>
375 379
  void readDimacsMat(std::istream& is, Graph &g,
376 380
                     DimacsDescriptor desc=DimacsDescriptor())
377 381
  {
378 382
    if(desc.type==DimacsDescriptor::NONE) desc=dimacsType(is);
Ignore white space 6 line context
... ...
@@ -67,41 +67,41 @@
67 67
    int _max_level;
68 68
    int _item_num;
69 69
    VitMap _where;
70 70
    IntMap _level;
71 71
    std::vector<Item> _items;
72 72
    std::vector<Vit> _first;
73 73
    std::vector<Vit> _last_active;
74 74

	
75 75
    int _highest_active;
76 76

	
77 77
    void copy(Item i, Vit p)
78 78
    {
79
      _where.set(*p=i,p);
79
      _where[*p=i] = p;
80 80
    }
81 81
    void copy(Vit s, Vit p)
82 82
    {
83 83
      if(s!=p)
84 84
        {
85 85
          Item i=*s;
86 86
          *p=i;
87
          _where.set(i,p);
87
          _where[i] = p;
88 88
        }
89 89
    }
90 90
    void swap(Vit i, Vit j)
91 91
    {
92 92
      Item ti=*i;
93 93
      Vit ct = _where[ti];
94
      _where.set(ti,_where[*i=*j]);
95
      _where.set(*j,ct);
94
      _where[ti] = _where[*i=*j];
95
      _where[*j] = ct;
96 96
      *j=ti;
97 97
    }
98 98

	
99 99
  public:
100 100

	
101 101
    ///Constructor with given maximum level.
102 102

	
103 103
    ///Constructor with given maximum level.
104 104
    ///
105 105
    ///\param graph The underlying graph.
106 106
    ///\param max_level The maximum allowed level.
107 107
    ///Set the range of the possible labels to <tt>[0..max_level]</tt>.
... ...
@@ -217,68 +217,68 @@
217 217
    int highestActiveLevel() const
218 218
    {
219 219
      return _highest_active;
220 220
    }
221 221

	
222 222
    ///Lift the highest active item by one.
223 223

	
224 224
    ///Lift the item returned by highestActive() by one.
225 225
    ///
226 226
    void liftHighestActive()
227 227
    {
228 228
      Item it = *_last_active[_highest_active];
229
      _level.set(it,_level[it]+1);
229
      ++_level[it];
230 230
      swap(_last_active[_highest_active]--,_last_active[_highest_active+1]);
231 231
      --_first[++_highest_active];
232 232
    }
233 233

	
234 234
    ///Lift the highest active item to the given level.
235 235

	
236 236
    ///Lift the item returned by highestActive() to level \c new_level.
237 237
    ///
238 238
    ///\warning \c new_level must be strictly higher
239 239
    ///than the current level.
240 240
    ///
241 241
    void liftHighestActive(int new_level)
242 242
    {
243 243
      const Item li = *_last_active[_highest_active];
244 244

	
245 245
      copy(--_first[_highest_active+1],_last_active[_highest_active]--);
246 246
      for(int l=_highest_active+1;l<new_level;l++)
247 247
        {
248 248
          copy(--_first[l+1],_first[l]);
249 249
          --_last_active[l];
250 250
        }
251 251
      copy(li,_first[new_level]);
252
      _level.set(li,new_level);
252
      _level[li] = new_level;
253 253
      _highest_active=new_level;
254 254
    }
255 255

	
256 256
    ///Lift the highest active item to the top level.
257 257

	
258 258
    ///Lift the item returned by highestActive() to the top level and
259 259
    ///deactivate it.
260 260
    void liftHighestActiveToTop()
261 261
    {
262 262
      const Item li = *_last_active[_highest_active];
263 263

	
264 264
      copy(--_first[_highest_active+1],_last_active[_highest_active]--);
265 265
      for(int l=_highest_active+1;l<_max_level;l++)
266 266
        {
267 267
          copy(--_first[l+1],_first[l]);
268 268
          --_last_active[l];
269 269
        }
270 270
      copy(li,_first[_max_level]);
271 271
      --_last_active[_max_level];
272
      _level.set(li,_max_level);
272
      _level[li] = _max_level;
273 273

	
274 274
      while(_highest_active>=0 &&
275 275
            _last_active[_highest_active]<_first[_highest_active])
276 276
        _highest_active--;
277 277
    }
278 278

	
279 279
    ///@}
280 280

	
281 281
    ///\name Active Item on Certain Level
282 282
    ///Functions for working with the active items.
283 283

	
284 284
    ///@{
... ...
@@ -290,65 +290,65 @@
290 290
    Item activeOn(int l) const
291 291
    {
292 292
      return _last_active[l]>=_first[l]?*_last_active[l]:INVALID;
293 293
    }
294 294

	
295 295
    ///Lift the active item returned by \c activeOn(level) by one.
296 296

	
297 297
    ///Lift the active item returned by \ref activeOn() "activeOn(level)"
298 298
    ///by one.
299 299
    Item liftActiveOn(int level)
300 300
    {
301 301
      Item it =*_last_active[level];
302
      _level.set(it,_level[it]+1);
302
      ++_level[it];
303 303
      swap(_last_active[level]--, --_first[level+1]);
304 304
      if (level+1>_highest_active) ++_highest_active;
305 305
    }
306 306

	
307 307
    ///Lift the active item returned by \c activeOn(level) to the given level.
308 308

	
309 309
    ///Lift the active item returned by \ref activeOn() "activeOn(level)"
310 310
    ///to the given level.
311 311
    void liftActiveOn(int level, int new_level)
312 312
    {
313 313
      const Item ai = *_last_active[level];
314 314

	
315 315
      copy(--_first[level+1], _last_active[level]--);
316 316
      for(int l=level+1;l<new_level;l++)
317 317
        {
318 318
          copy(_last_active[l],_first[l]);
319 319
          copy(--_first[l+1], _last_active[l]--);
320 320
        }
321 321
      copy(ai,_first[new_level]);
322
      _level.set(ai,new_level);
322
      _level[ai] = new_level;
323 323
      if (new_level>_highest_active) _highest_active=new_level;
324 324
    }
325 325

	
326 326
    ///Lift the active item returned by \c activeOn(level) to the top level.
327 327

	
328 328
    ///Lift the active item returned by \ref activeOn() "activeOn(level)"
329 329
    ///to the top level and deactivate it.
330 330
    void liftActiveToTop(int level)
331 331
    {
332 332
      const Item ai = *_last_active[level];
333 333

	
334 334
      copy(--_first[level+1],_last_active[level]--);
335 335
      for(int l=level+1;l<_max_level;l++)
336 336
        {
337 337
          copy(_last_active[l],_first[l]);
338 338
          copy(--_first[l+1], _last_active[l]--);
339 339
        }
340 340
      copy(ai,_first[_max_level]);
341 341
      --_last_active[_max_level];
342
      _level.set(ai,_max_level);
342
      _level[ai] = _max_level;
343 343

	
344 344
      if (_highest_active==level) {
345 345
        while(_highest_active>=0 &&
346 346
              _last_active[_highest_active]<_first[_highest_active])
347 347
          _highest_active--;
348 348
      }
349 349
    }
350 350

	
351 351
    ///@}
352 352

	
353 353
    ///Lift an active item to a higher level.
354 354

	
... ...
@@ -361,49 +361,49 @@
361 361
    {
362 362
      const int lo = _level[i];
363 363
      const Vit w = _where[i];
364 364

	
365 365
      copy(_last_active[lo],w);
366 366
      copy(--_first[lo+1],_last_active[lo]--);
367 367
      for(int l=lo+1;l<new_level;l++)
368 368
        {
369 369
          copy(_last_active[l],_first[l]);
370 370
          copy(--_first[l+1],_last_active[l]--);
371 371
        }
372 372
      copy(i,_first[new_level]);
373
      _level.set(i,new_level);
373
      _level[i] = new_level;
374 374
      if(new_level>_highest_active) _highest_active=new_level;
375 375
    }
376 376

	
377 377
    ///Move an inactive item to the top but one level (in a dirty way).
378 378

	
379 379
    ///This function moves an inactive item from the top level to the top
380 380
    ///but one level (in a dirty way).
381 381
    ///\warning It makes the underlying datastructure corrupt, so use it
382 382
    ///only if you really know what it is for.
383 383
    ///\pre The item is on the top level.
384 384
    void dirtyTopButOne(Item i) {
385
      _level.set(i,_max_level - 1);
385
      _level[i] = _max_level - 1;
386 386
    }
387 387

	
388 388
    ///Lift all items on and above the given level to the top level.
389 389

	
390 390
    ///This function lifts all items on and above level \c l to the top
391 391
    ///level and deactivates them.
392 392
    void liftToTop(int l)
393 393
    {
394 394
      const Vit f=_first[l];
395 395
      const Vit tl=_first[_max_level];
396 396
      for(Vit i=f;i!=tl;++i)
397
        _level.set(*i,_max_level);
397
        _level[*i] = _max_level;
398 398
      for(int i=l;i<=_max_level;i++)
399 399
        {
400 400
          _first[i]=f;
401 401
          _last_active[i]=f-1;
402 402
        }
403 403
      for(_highest_active=l-1;
404 404
          _highest_active>=0 &&
405 405
            _last_active[_highest_active]<_first[_highest_active];
406 406
          _highest_active--) ;
407 407
    }
408 408

	
409 409
  private:
... ...
@@ -424,35 +424,35 @@
424 424

	
425 425
    ///Start the initialization process.
426 426
    void initStart()
427 427
    {
428 428
      _init_lev=0;
429 429
      _init_num=&_items[0];
430 430
      _first[0]=&_items[0];
431 431
      _last_active[0]=&_items[0]-1;
432 432
      Vit n=&_items[0];
433 433
      for(typename ItemSetTraits<GR,Item>::ItemIt i(_g);i!=INVALID;++i)
434 434
        {
435 435
          *n=i;
436
          _where.set(i,n);
437
          _level.set(i,_max_level);
436
          _where[i] = n;
437
          _level[i] = _max_level;
438 438
          ++n;
439 439
        }
440 440
    }
441 441

	
442 442
    ///Add an item to the current level.
443 443
    void initAddItem(Item i)
444 444
    {
445 445
      swap(_where[i],_init_num);
446
      _level.set(i,_init_lev);
446
      _level[i] = _init_lev;
447 447
      ++_init_num;
448 448
    }
449 449

	
450 450
    ///Start a new level.
451 451

	
452 452
    ///Start a new level.
453 453
    ///It shouldn't be used before the items on level 0 are listed.
454 454
    void initNewLevel()
455 455
    {
456 456
      _init_lev++;
457 457
      _first[_init_lev]=_init_num;
458 458
      _last_active[_init_lev]=_init_num-1;
... ...
@@ -542,69 +542,69 @@
542 542
      : _graph(graph), _max_level(countItems<GR, Item>(graph)),
543 543
        _item_num(_max_level),
544 544
        _first(_max_level + 1), _last(_max_level + 1),
545 545
        _prev(graph, INVALID), _next(graph, INVALID),
546 546
        _highest_active(-1), _level(graph), _active(graph) {}
547 547

	
548 548

	
549 549
    ///Activate item \c i.
550 550

	
551 551
    ///Activate item \c i.
552 552
    ///\pre Item \c i shouldn't be active before.
553 553
    void activate(Item i) {
554
      _active.set(i, true);
554
      _active[i] = true;
555 555

	
556 556
      int level = _level[i];
557 557
      if (level > _highest_active) {
558 558
        _highest_active = level;
559 559
      }
560 560

	
561 561
      if (_prev[i] == INVALID || _active[_prev[i]]) return;
562 562
      //unlace
563
      _next.set(_prev[i], _next[i]);
563
      _next[_prev[i]] = _next[i];
564 564
      if (_next[i] != INVALID) {
565
        _prev.set(_next[i], _prev[i]);
565
        _prev[_next[i]] = _prev[i];
566 566
      } else {
567 567
        _last[level] = _prev[i];
568 568
      }
569 569
      //lace
570
      _next.set(i, _first[level]);
571
      _prev.set(_first[level], i);
572
      _prev.set(i, INVALID);
570
      _next[i] = _first[level];
571
      _prev[_first[level]] = i;
572
      _prev[i] = INVALID;
573 573
      _first[level] = i;
574 574

	
575 575
    }
576 576

	
577 577
    ///Deactivate item \c i.
578 578

	
579 579
    ///Deactivate item \c i.
580 580
    ///\pre Item \c i must be active before.
581 581
    void deactivate(Item i) {
582
      _active.set(i, false);
582
      _active[i] = false;
583 583
      int level = _level[i];
584 584

	
585 585
      if (_next[i] == INVALID || !_active[_next[i]])
586 586
        goto find_highest_level;
587 587

	
588 588
      //unlace
589
      _prev.set(_next[i], _prev[i]);
589
      _prev[_next[i]] = _prev[i];
590 590
      if (_prev[i] != INVALID) {
591
        _next.set(_prev[i], _next[i]);
591
        _next[_prev[i]] = _next[i];
592 592
      } else {
593 593
        _first[_level[i]] = _next[i];
594 594
      }
595 595
      //lace
596
      _prev.set(i, _last[level]);
597
      _next.set(_last[level], i);
598
      _next.set(i, INVALID);
596
      _prev[i] = _last[level];
597
      _next[_last[level]] = i;
598
      _next[i] = INVALID;
599 599
      _last[level] = i;
600 600

	
601 601
    find_highest_level:
602 602
      if (level == _highest_active) {
603 603
        while (_highest_active >= 0 && activeFree(_highest_active))
604 604
          --_highest_active;
605 605
      }
606 606
    }
607 607

	
608 608
    ///Query whether item \c i is active
609 609
    bool active(Item i) const { return _active[i]; }
610 610

	
... ...
@@ -676,80 +676,80 @@
676 676
    ///item.
677 677
    int highestActiveLevel() const {
678 678
      return _highest_active;
679 679
    }
680 680

	
681 681
    ///Lift the highest active item by one.
682 682

	
683 683
    ///Lift the item returned by highestActive() by one.
684 684
    ///
685 685
    void liftHighestActive() {
686 686
      Item i = _first[_highest_active];
687 687
      if (_next[i] != INVALID) {
688
        _prev.set(_next[i], INVALID);
688
        _prev[_next[i]] = INVALID;
689 689
        _first[_highest_active] = _next[i];
690 690
      } else {
691 691
        _first[_highest_active] = INVALID;
692 692
        _last[_highest_active] = INVALID;
693 693
      }
694
      _level.set(i, ++_highest_active);
694
      _level[i] = ++_highest_active;
695 695
      if (_first[_highest_active] == INVALID) {
696 696
        _first[_highest_active] = i;
697 697
        _last[_highest_active] = i;
698
        _prev.set(i, INVALID);
699
        _next.set(i, INVALID);
698
        _prev[i] = INVALID;
699
        _next[i] = INVALID;
700 700
      } else {
701
        _prev.set(_first[_highest_active], i);
702
        _next.set(i, _first[_highest_active]);
701
        _prev[_first[_highest_active]] = i;
702
        _next[i] = _first[_highest_active];
703 703
        _first[_highest_active] = i;
704 704
      }
705 705
    }
706 706

	
707 707
    ///Lift the highest active item to the given level.
708 708

	
709 709
    ///Lift the item returned by highestActive() to level \c new_level.
710 710
    ///
711 711
    ///\warning \c new_level must be strictly higher
712 712
    ///than the current level.
713 713
    ///
714 714
    void liftHighestActive(int new_level) {
715 715
      Item i = _first[_highest_active];
716 716
      if (_next[i] != INVALID) {
717
        _prev.set(_next[i], INVALID);
717
        _prev[_next[i]] = INVALID;
718 718
        _first[_highest_active] = _next[i];
719 719
      } else {
720 720
        _first[_highest_active] = INVALID;
721 721
        _last[_highest_active] = INVALID;
722 722
      }
723
      _level.set(i, _highest_active = new_level);
723
      _level[i] = _highest_active = new_level;
724 724
      if (_first[_highest_active] == INVALID) {
725 725
        _first[_highest_active] = _last[_highest_active] = i;
726
        _prev.set(i, INVALID);
727
        _next.set(i, INVALID);
726
        _prev[i] = INVALID;
727
        _next[i] = INVALID;
728 728
      } else {
729
        _prev.set(_first[_highest_active], i);
730
        _next.set(i, _first[_highest_active]);
729
        _prev[_first[_highest_active]] = i;
730
        _next[i] = _first[_highest_active];
731 731
        _first[_highest_active] = i;
732 732
      }
733 733
    }
734 734

	
735 735
    ///Lift the highest active item to the top level.
736 736

	
737 737
    ///Lift the item returned by highestActive() to the top level and
738 738
    ///deactivate it.
739 739
    void liftHighestActiveToTop() {
740 740
      Item i = _first[_highest_active];
741
      _level.set(i, _max_level);
741
      _level[i] = _max_level;
742 742
      if (_next[i] != INVALID) {
743
        _prev.set(_next[i], INVALID);
743
        _prev[_next[i]] = INVALID;
744 744
        _first[_highest_active] = _next[i];
745 745
      } else {
746 746
        _first[_highest_active] = INVALID;
747 747
        _last[_highest_active] = INVALID;
748 748
      }
749 749
      while (_highest_active >= 0 && activeFree(_highest_active))
750 750
        --_highest_active;
751 751
    }
752 752

	
753 753
    ///@}
754 754

	
755 755
    ///\name Active Item on Certain Level
... ...
@@ -765,150 +765,150 @@
765 765
    {
766 766
      return _active[_first[l]] ? _first[l] : INVALID;
767 767
    }
768 768

	
769 769
    ///Lift the active item returned by \c activeOn(l) by one.
770 770

	
771 771
    ///Lift the active item returned by \ref activeOn() "activeOn(l)"
772 772
    ///by one.
773 773
    Item liftActiveOn(int l)
774 774
    {
775 775
      Item i = _first[l];
776 776
      if (_next[i] != INVALID) {
777
        _prev.set(_next[i], INVALID);
777
        _prev[_next[i]] = INVALID;
778 778
        _first[l] = _next[i];
779 779
      } else {
780 780
        _first[l] = INVALID;
781 781
        _last[l] = INVALID;
782 782
      }
783
      _level.set(i, ++l);
783
      _level[i] = ++l;
784 784
      if (_first[l] == INVALID) {
785 785
        _first[l] = _last[l] = i;
786
        _prev.set(i, INVALID);
787
        _next.set(i, INVALID);
786
        _prev[i] = INVALID;
787
        _next[i] = INVALID;
788 788
      } else {
789
        _prev.set(_first[l], i);
790
        _next.set(i, _first[l]);
789
        _prev[_first[l]] = i;
790
        _next[i] = _first[l];
791 791
        _first[l] = i;
792 792
      }
793 793
      if (_highest_active < l) {
794 794
        _highest_active = l;
795 795
      }
796 796
    }
797 797

	
798 798
    ///Lift the active item returned by \c activeOn(l) to the given level.
799 799

	
800 800
    ///Lift the active item returned by \ref activeOn() "activeOn(l)"
801 801
    ///to the given level.
802 802
    void liftActiveOn(int l, int new_level)
803 803
    {
804 804
      Item i = _first[l];
805 805
      if (_next[i] != INVALID) {
806
        _prev.set(_next[i], INVALID);
806
        _prev[_next[i]] = INVALID;
807 807
        _first[l] = _next[i];
808 808
      } else {
809 809
        _first[l] = INVALID;
810 810
        _last[l] = INVALID;
811 811
      }
812
      _level.set(i, l = new_level);
812
      _level[i] = l = new_level;
813 813
      if (_first[l] == INVALID) {
814 814
        _first[l] = _last[l] = i;
815
        _prev.set(i, INVALID);
816
        _next.set(i, INVALID);
815
        _prev[i] = INVALID;
816
        _next[i] = INVALID;
817 817
      } else {
818
        _prev.set(_first[l], i);
819
        _next.set(i, _first[l]);
818
        _prev[_first[l]] = i;
819
        _next[i] = _first[l];
820 820
        _first[l] = i;
821 821
      }
822 822
      if (_highest_active < l) {
823 823
        _highest_active = l;
824 824
      }
825 825
    }
826 826

	
827 827
    ///Lift the active item returned by \c activeOn(l) to the top level.
828 828

	
829 829
    ///Lift the active item returned by \ref activeOn() "activeOn(l)"
830 830
    ///to the top level and deactivate it.
831 831
    void liftActiveToTop(int l)
832 832
    {
833 833
      Item i = _first[l];
834 834
      if (_next[i] != INVALID) {
835
        _prev.set(_next[i], INVALID);
835
        _prev[_next[i]] = INVALID;
836 836
        _first[l] = _next[i];
837 837
      } else {
838 838
        _first[l] = INVALID;
839 839
        _last[l] = INVALID;
840 840
      }
841
      _level.set(i, _max_level);
841
      _level[i] = _max_level;
842 842
      if (l == _highest_active) {
843 843
        while (_highest_active >= 0 && activeFree(_highest_active))
844 844
          --_highest_active;
845 845
      }
846 846
    }
847 847

	
848 848
    ///@}
849 849

	
850 850
    /// \brief Lift an active item to a higher level.
851 851
    ///
852 852
    /// Lift an active item to a higher level.
853 853
    /// \param i The item to be lifted. It must be active.
854 854
    /// \param new_level The new level of \c i. It must be strictly higher
855 855
    /// than the current level.
856 856
    ///
857 857
    void lift(Item i, int new_level) {
858 858
      if (_next[i] != INVALID) {
859
        _prev.set(_next[i], _prev[i]);
859
        _prev[_next[i]] = _prev[i];
860 860
      } else {
861 861
        _last[new_level] = _prev[i];
862 862
      }
863 863
      if (_prev[i] != INVALID) {
864
        _next.set(_prev[i], _next[i]);
864
        _next[_prev[i]] = _next[i];
865 865
      } else {
866 866
        _first[new_level] = _next[i];
867 867
      }
868
      _level.set(i, new_level);
868
      _level[i] = new_level;
869 869
      if (_first[new_level] == INVALID) {
870 870
        _first[new_level] = _last[new_level] = i;
871
        _prev.set(i, INVALID);
872
        _next.set(i, INVALID);
871
        _prev[i] = INVALID;
872
        _next[i] = INVALID;
873 873
      } else {
874
        _prev.set(_first[new_level], i);
875
        _next.set(i, _first[new_level]);
874
        _prev[_first[new_level]] = i;
875
        _next[i] = _first[new_level];
876 876
        _first[new_level] = i;
877 877
      }
878 878
      if (_highest_active < new_level) {
879 879
        _highest_active = new_level;
880 880
      }
881 881
    }
882 882

	
883 883
    ///Move an inactive item to the top but one level (in a dirty way).
884 884

	
885 885
    ///This function moves an inactive item from the top level to the top
886 886
    ///but one level (in a dirty way).
887 887
    ///\warning It makes the underlying datastructure corrupt, so use it
888 888
    ///only if you really know what it is for.
889 889
    ///\pre The item is on the top level.
890 890
    void dirtyTopButOne(Item i) {
891
      _level.set(i, _max_level - 1);
891
      _level[i] = _max_level - 1;
892 892
    }
893 893

	
894 894
    ///Lift all items on and above the given level to the top level.
895 895

	
896 896
    ///This function lifts all items on and above level \c l to the top
897 897
    ///level and deactivates them.
898 898
    void liftToTop(int l)  {
899 899
      for (int i = l + 1; _first[i] != INVALID; ++i) {
900 900
        Item n = _first[i];
901 901
        while (n != INVALID) {
902
          _level.set(n, _max_level);
902
          _level[n] = _max_level;
903 903
          n = _next[n];
904 904
        }
905 905
        _first[i] = INVALID;
906 906
        _last[i] = INVALID;
907 907
      }
908 908
      if (_highest_active > l - 1) {
909 909
        _highest_active = l - 1;
910 910
        while (_highest_active >= 0 && activeFree(_highest_active))
911 911
          --_highest_active;
912 912
      }
913 913
    }
914 914

	
... ...
@@ -928,41 +928,41 @@
928 928
    ///The items not listed are put on the highest level.
929 929
    ///@{
930 930

	
931 931
    ///Start the initialization process.
932 932
    void initStart() {
933 933

	
934 934
      for (int i = 0; i <= _max_level; ++i) {
935 935
        _first[i] = _last[i] = INVALID;
936 936
      }
937 937
      _init_level = 0;
938 938
      for(typename ItemSetTraits<GR,Item>::ItemIt i(_graph);
939 939
          i != INVALID; ++i) {
940
        _level.set(i, _max_level);
941
        _active.set(i, false);
940
        _level[i] = _max_level;
941
        _active[i] = false;
942 942
      }
943 943
    }
944 944

	
945 945
    ///Add an item to the current level.
946 946
    void initAddItem(Item i) {
947
      _level.set(i, _init_level);
947
      _level[i] = _init_level;
948 948
      if (_last[_init_level] == INVALID) {
949 949
        _first[_init_level] = i;
950 950
        _last[_init_level] = i;
951
        _prev.set(i, INVALID);
952
        _next.set(i, INVALID);
951
        _prev[i] = INVALID;
952
        _next[i] = INVALID;
953 953
      } else {
954
        _prev.set(i, _last[_init_level]);
955
        _next.set(i, INVALID);
956
        _next.set(_last[_init_level], i);
954
        _prev[i] = _last[_init_level];
955
        _next[i] = INVALID;
956
        _next[_last[_init_level]] = i;
957 957
        _last[_init_level] = i;
958 958
      }
959 959
    }
960 960

	
961 961
    ///Start a new level.
962 962

	
963 963
    ///Start a new level.
964 964
    ///It shouldn't be used before the items on level 0 are listed.
965 965
    void initNewLevel() {
966 966
      ++_init_level;
967 967
    }
968 968

	
Ignore white space 6 line context
... ...
@@ -15,37 +15,37 @@
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_EULER_H
20 20
#define LEMON_EULER_H
21 21

	
22 22
#include<lemon/core.h>
23 23
#include<lemon/adaptors.h>
24 24
#include<lemon/connectivity.h>
25 25
#include <list>
26 26

	
27
/// \ingroup graph_prop
27
/// \ingroup graph_properties
28 28
/// \file
29 29
/// \brief Euler tour
30 30
///
31 31
///This file provides an Euler tour iterator and ways to check
32 32
///if a digraph is euler.
33 33

	
34 34

	
35 35
namespace lemon {
36 36

	
37 37
  ///Euler iterator for digraphs.
38 38

	
39
  /// \ingroup graph_prop
39
  /// \ingroup graph_properties
40 40
  ///This iterator converts to the \c Arc type of the digraph and using
41 41
  ///operator ++, it provides an Euler tour of a \e directed
42 42
  ///graph (if there exists).
43 43
  ///
44 44
  ///For example
45 45
  ///if the given digraph is Euler (i.e it has only one nontrivial component
46 46
  ///and the in-degree is equal to the out-degree for all nodes),
47 47
  ///the following code will put the arcs of \c g
48 48
  ///to the vector \c et according to an
49 49
  ///Euler tour of \c g.
50 50
  ///\code
51 51
  ///  std::vector<ListDigraph::Arc> et;
... ...
@@ -114,25 +114,25 @@
114 114
    ///returns an \c Arc, not an \ref DiEulerIt, as one may
115 115
    ///expect.
116 116
    Arc operator++(int)
117 117
    {
118 118
      Arc e=*this;
119 119
      ++(*this);
120 120
      return e;
121 121
    }
122 122
  };
123 123

	
124 124
  ///Euler iterator for graphs.
125 125

	
126
  /// \ingroup graph_prop
126
  /// \ingroup graph_properties
127 127
  ///This iterator converts to the \c Arc (or \c Edge)
128 128
  ///type of the digraph and using
129 129
  ///operator ++, it provides an Euler tour of an undirected
130 130
  ///digraph (if there exists).
131 131
  ///
132 132
  ///For example
133 133
  ///if the given digraph if Euler (i.e it has only one nontrivial component
134 134
  ///and the degree of each node is even),
135 135
  ///the following code will print the arc IDs according to an
136 136
  ///Euler tour of \c g.
137 137
  ///\code
138 138
  ///  for(EulerIt<ListGraph> e(g),e!=INVALID;++e) {
... ...
@@ -219,25 +219,25 @@
219 219
    ///expect.
220 220
    Arc operator++(int)
221 221
    {
222 222
      Arc e=*this;
223 223
      ++(*this);
224 224
      return e;
225 225
    }
226 226
  };
227 227

	
228 228

	
229 229
  ///Checks if the graph is Eulerian
230 230

	
231
  /// \ingroup graph_prop
231
  /// \ingroup graph_properties
232 232
  ///Checks if the graph is Eulerian. It works for both directed and undirected
233 233
  ///graphs.
234 234
  ///\note By definition, a digraph is called \e Eulerian if
235 235
  ///and only if it is connected and the number of its incoming and outgoing
236 236
  ///arcs are the same for each node.
237 237
  ///Similarly, an undirected graph is called \e Eulerian if
238 238
  ///and only if it is connected and the number of incident arcs is even
239 239
  ///for each node. <em>Therefore, there are digraphs which are not Eulerian,
240 240
  ///but still have an Euler tour</em>.
241 241
  template<typename GR>
242 242
#ifdef DOXYGEN
243 243
  bool
Ignore white space 6 line context
... ...
@@ -148,27 +148,26 @@
148 148

	
149 149
  /// \ingroup graphs
150 150
  ///
151 151
  /// \brief A full digraph class.
152 152
  ///
153 153
  /// This is a simple and fast directed full graph implementation.
154 154
  /// From each node go arcs to each node (including the source node),
155 155
  /// therefore the number of the arcs in the digraph is the square of
156 156
  /// the node number. This digraph type is completely static, so you
157 157
  /// can neither add nor delete either arcs or nodes, and it needs
158 158
  /// constant space in memory.
159 159
  ///
160
  /// This class conforms to the \ref concepts::Digraph "Digraph" concept
161
  /// and it also has an important extra feature that its maps are
162
  /// real \ref concepts::ReferenceMap "reference map"s.
160
  /// This class fully conforms to the \ref concepts::Digraph
161
  /// "Digraph concept".
163 162
  ///
164 163
  /// The \c FullDigraph and \c FullGraph classes are very similar,
165 164
  /// but there are two differences. While this class conforms only
166 165
  /// to the \ref concepts::Digraph "Digraph" concept, the \c FullGraph
167 166
  /// class conforms to the \ref concepts::Graph "Graph" concept,
168 167
  /// moreover \c FullGraph does not contain a loop arc for each
169 168
  /// node as \c FullDigraph does.
170 169
  ///
171 170
  /// \sa FullGraph
172 171
  class FullDigraph : public ExtendedFullDigraphBase {
173 172
  public:
174 173

	
... ...
@@ -518,27 +517,25 @@
518 517

	
519 518
  /// \ingroup graphs
520 519
  ///
521 520
  /// \brief An undirected full graph class.
522 521
  ///
523 522
  /// This is a simple and fast undirected full graph
524 523
  /// implementation. From each node go edge to each other node,
525 524
  /// therefore the number of edges in the graph is \f$n(n-1)/2\f$.
526 525
  /// This graph type is completely static, so you can neither
527 526
  /// add nor delete either edges or nodes, and it needs constant
528 527
  /// space in memory.
529 528
  ///
530
  /// This class conforms to the \ref concepts::Graph "Graph" concept
531
  /// and it also has an important extra feature that its maps are
532
  /// real \ref concepts::ReferenceMap "reference map"s.
529
  /// This class fully conforms to the \ref concepts::Graph "Graph concept".
533 530
  ///
534 531
  /// The \c FullGraph and \c FullDigraph classes are very similar,
535 532
  /// but there are two differences. While the \c FullDigraph class
536 533
  /// conforms only to the \ref concepts::Digraph "Digraph" concept,
537 534
  /// this class conforms to the \ref concepts::Graph "Graph" concept,
538 535
  /// moreover \c FullGraph does not contain a loop arc for each
539 536
  /// node as \c FullDigraph does.
540 537
  ///
541 538
  /// \sa FullDigraph
542 539
  class FullGraph : public ExtendedFullGraphBase {
543 540
  public:
544 541

	
Ignore white space 6 line context
... ...
@@ -22,32 +22,34 @@
22 22
#include <lemon/glpk.h>
23 23
#include <glpk.h>
24 24

	
25 25
#include <lemon/assert.h>
26 26

	
27 27
namespace lemon {
28 28

	
29 29
  // GlpkBase members
30 30

	
31 31
  GlpkBase::GlpkBase() : LpBase() {
32 32
    lp = glp_create_prob();
33 33
    glp_create_index(lp);
34
    messageLevel(MESSAGE_NOTHING);
34 35
  }
35 36

	
36 37
  GlpkBase::GlpkBase(const GlpkBase &other) : LpBase() {
37 38
    lp = glp_create_prob();
38 39
    glp_copy_prob(lp, other.lp, GLP_ON);
39 40
    glp_create_index(lp);
40 41
    rows = other.rows;
41 42
    cols = other.cols;
43
    messageLevel(MESSAGE_NOTHING);
42 44
  }
43 45

	
44 46
  GlpkBase::~GlpkBase() {
45 47
    glp_delete_prob(lp);
46 48
  }
47 49

	
48 50
  int GlpkBase::_addCol() {
49 51
    int i = glp_add_cols(lp, 1);
50 52
    glp_set_col_bnds(lp, i, GLP_FR, 0.0, 0.0);
51 53
    return i;
52 54
  }
53 55

	
... ...
@@ -517,74 +519,79 @@
517 519
  }
518 520

	
519 521
  void GlpkBase::_clear() {
520 522
    glp_erase_prob(lp);
521 523
    rows.clear();
522 524
    cols.clear();
523 525
  }
524 526

	
525 527
  void GlpkBase::freeEnv() {
526 528
    glp_free_env();
527 529
  }
528 530

	
531
  void GlpkBase::_messageLevel(MessageLevel level) {
532
    switch (level) {
533
    case MESSAGE_NOTHING:
534
      _message_level = GLP_MSG_OFF;
535
      break;
536
    case MESSAGE_ERROR:
537
      _message_level = GLP_MSG_ERR;
538
      break;
539
    case MESSAGE_WARNING:
540
      _message_level = GLP_MSG_ERR;
541
      break;
542
    case MESSAGE_NORMAL:
543
      _message_level = GLP_MSG_ON;
544
      break;
545
    case MESSAGE_VERBOSE:
546
      _message_level = GLP_MSG_ALL;
547
      break;
548
    }
549
  }
550

	
529 551
  GlpkBase::FreeEnvHelper GlpkBase::freeEnvHelper;
530 552

	
531 553
  // GlpkLp members
532 554

	
533 555
  GlpkLp::GlpkLp()
534 556
    : LpBase(), LpSolver(), GlpkBase() {
535
    messageLevel(MESSAGE_NO_OUTPUT);
536 557
    presolver(false);
537 558
  }
538 559

	
539 560
  GlpkLp::GlpkLp(const GlpkLp& other)
540 561
    : LpBase(other), LpSolver(other), GlpkBase(other) {
541
    messageLevel(MESSAGE_NO_OUTPUT);
542 562
    presolver(false);
543 563
  }
544 564

	
545 565
  GlpkLp* GlpkLp::newSolver() const { return new GlpkLp; }
546 566
  GlpkLp* GlpkLp::cloneSolver() const { return new GlpkLp(*this); }
547 567

	
548 568
  const char* GlpkLp::_solverName() const { return "GlpkLp"; }
549 569

	
550 570
  void GlpkLp::_clear_temporals() {
551 571
    _primal_ray.clear();
552 572
    _dual_ray.clear();
553 573
  }
554 574

	
555 575
  GlpkLp::SolveExitStatus GlpkLp::_solve() {
556 576
    return solvePrimal();
557 577
  }
558 578

	
559 579
  GlpkLp::SolveExitStatus GlpkLp::solvePrimal() {
560 580
    _clear_temporals();
561 581

	
562 582
    glp_smcp smcp;
563 583
    glp_init_smcp(&smcp);
564 584

	
565
    switch (_message_level) {
566
    case MESSAGE_NO_OUTPUT:
567
      smcp.msg_lev = GLP_MSG_OFF;
568
      break;
569
    case MESSAGE_ERROR_MESSAGE:
570
      smcp.msg_lev = GLP_MSG_ERR;
571
      break;
572
    case MESSAGE_NORMAL_OUTPUT:
573
      smcp.msg_lev = GLP_MSG_ON;
574
      break;
575
    case MESSAGE_FULL_OUTPUT:
576
      smcp.msg_lev = GLP_MSG_ALL;
577
      break;
578
    }
585
    smcp.msg_lev = _message_level;
579 586
    smcp.presolve = _presolve;
580 587

	
581 588
    // If the basis is not valid we get an error return value.
582 589
    // In this case we can try to create a new basis.
583 590
    switch (glp_simplex(lp, &smcp)) {
584 591
    case 0:
585 592
      break;
586 593
    case GLP_EBADB:
587 594
    case GLP_ESING:
588 595
    case GLP_ECOND:
589 596
      glp_term_out(false);
590 597
      glp_adv_basis(lp, 0);
... ...
@@ -595,38 +602,25 @@
595 602
      return UNSOLVED;
596 603
    }
597 604

	
598 605
    return SOLVED;
599 606
  }
600 607

	
601 608
  GlpkLp::SolveExitStatus GlpkLp::solveDual() {
602 609
    _clear_temporals();
603 610

	
604 611
    glp_smcp smcp;
605 612
    glp_init_smcp(&smcp);
606 613

	
607
    switch (_message_level) {
608
    case MESSAGE_NO_OUTPUT:
609
      smcp.msg_lev = GLP_MSG_OFF;
610
      break;
611
    case MESSAGE_ERROR_MESSAGE:
612
      smcp.msg_lev = GLP_MSG_ERR;
613
      break;
614
    case MESSAGE_NORMAL_OUTPUT:
615
      smcp.msg_lev = GLP_MSG_ON;
616
      break;
617
    case MESSAGE_FULL_OUTPUT:
618
      smcp.msg_lev = GLP_MSG_ALL;
619
      break;
620
    }
614
    smcp.msg_lev = _message_level;
621 615
    smcp.meth = GLP_DUAL;
622 616
    smcp.presolve = _presolve;
623 617

	
624 618
    // If the basis is not valid we get an error return value.
625 619
    // In this case we can try to create a new basis.
626 620
    switch (glp_simplex(lp, &smcp)) {
627 621
    case 0:
628 622
      break;
629 623
    case GLP_EBADB:
630 624
    case GLP_ESING:
631 625
    case GLP_ECOND:
632 626
      glp_term_out(false);
... ...
@@ -849,38 +843,32 @@
849 843
    case GLP_NOFEAS:
850 844
      return INFEASIBLE;
851 845
    default:
852 846
      LEMON_ASSERT(false, "Wrong primal type");
853 847
      return  GlpkLp::ProblemType();
854 848
    }
855 849
  }
856 850

	
857 851
  void GlpkLp::presolver(bool presolve) {
858 852
    _presolve = presolve;
859 853
  }
860 854

	
861
  void GlpkLp::messageLevel(MessageLevel m) {
862
    _message_level = m;
863
  }
864

	
865 855
  // GlpkMip members
866 856

	
867 857
  GlpkMip::GlpkMip()
868 858
    : LpBase(), MipSolver(), GlpkBase() {
869
    messageLevel(MESSAGE_NO_OUTPUT);
870 859
  }
871 860

	
872 861
  GlpkMip::GlpkMip(const GlpkMip& other)
873 862
    : LpBase(), MipSolver(), GlpkBase(other) {
874
    messageLevel(MESSAGE_NO_OUTPUT);
875 863
  }
876 864

	
877 865
  void GlpkMip::_setColType(int i, GlpkMip::ColTypes col_type) {
878 866
    switch (col_type) {
879 867
    case INTEGER:
880 868
      glp_set_col_kind(lp, i, GLP_IV);
881 869
      break;
882 870
    case REAL:
883 871
      glp_set_col_kind(lp, i, GLP_CV);
884 872
      break;
885 873
    }
886 874
  }
... ...
@@ -891,76 +879,50 @@
891 879
    case GLP_BV:
892 880
      return INTEGER;
893 881
    default:
894 882
      return REAL;
895 883
    }
896 884

	
897 885
  }
898 886

	
899 887
  GlpkMip::SolveExitStatus GlpkMip::_solve() {
900 888
    glp_smcp smcp;
901 889
    glp_init_smcp(&smcp);
902 890

	
903
    switch (_message_level) {
904
    case MESSAGE_NO_OUTPUT:
905
      smcp.msg_lev = GLP_MSG_OFF;
906
      break;
907
    case MESSAGE_ERROR_MESSAGE:
908
      smcp.msg_lev = GLP_MSG_ERR;
909
      break;
910
    case MESSAGE_NORMAL_OUTPUT:
911
      smcp.msg_lev = GLP_MSG_ON;
912
      break;
913
    case MESSAGE_FULL_OUTPUT:
914
      smcp.msg_lev = GLP_MSG_ALL;
915
      break;
916
    }
891
    smcp.msg_lev = _message_level;
917 892
    smcp.meth = GLP_DUAL;
918 893

	
919 894
    // If the basis is not valid we get an error return value.
920 895
    // In this case we can try to create a new basis.
921 896
    switch (glp_simplex(lp, &smcp)) {
922 897
    case 0:
923 898
      break;
924 899
    case GLP_EBADB:
925 900
    case GLP_ESING:
926 901
    case GLP_ECOND:
927 902
      glp_term_out(false);
928 903
      glp_adv_basis(lp, 0);
929 904
      glp_term_out(true);
930 905
      if (glp_simplex(lp, &smcp) != 0) return UNSOLVED;
931 906
      break;
932 907
    default:
933 908
      return UNSOLVED;
934 909
    }
935 910

	
936 911
    if (glp_get_status(lp) != GLP_OPT) return SOLVED;
937 912

	
938 913
    glp_iocp iocp;
939 914
    glp_init_iocp(&iocp);
940 915

	
941
    switch (_message_level) {
942
    case MESSAGE_NO_OUTPUT:
943
      iocp.msg_lev = GLP_MSG_OFF;
944
      break;
945
    case MESSAGE_ERROR_MESSAGE:
946
      iocp.msg_lev = GLP_MSG_ERR;
947
      break;
948
    case MESSAGE_NORMAL_OUTPUT:
949
      iocp.msg_lev = GLP_MSG_ON;
950
      break;
951
    case MESSAGE_FULL_OUTPUT:
952
      iocp.msg_lev = GLP_MSG_ALL;
953
      break;
954
    }
916
    iocp.msg_lev = _message_level;
955 917

	
956 918
    if (glp_intopt(lp, &iocp) != 0) return UNSOLVED;
957 919
    return SOLVED;
958 920
  }
959 921

	
960 922

	
961 923
  GlpkMip::ProblemType GlpkMip::_getType() const {
962 924
    switch (glp_get_status(lp)) {
963 925
    case GLP_OPT:
964 926
      switch (glp_mip_status(lp)) {
965 927
      case GLP_UNDEF:
966 928
        return UNDEFINED;
... ...
@@ -993,17 +955,13 @@
993 955
    return glp_mip_col_val(lp, i);
994 956
  }
995 957

	
996 958
  GlpkMip::Value GlpkMip::_getSolValue() const {
997 959
    return glp_mip_obj_val(lp);
998 960
  }
999 961

	
1000 962
  GlpkMip* GlpkMip::newSolver() const { return new GlpkMip; }
1001 963
  GlpkMip* GlpkMip::cloneSolver() const {return new GlpkMip(*this); }
1002 964

	
1003 965
  const char* GlpkMip::_solverName() const { return "GlpkMip"; }
1004 966

	
1005
  void GlpkMip::messageLevel(MessageLevel m) {
1006
    _message_level = m;
1007
  }
1008

	
1009 967
} //END OF NAMESPACE LEMON
Ignore white space 6 line context
... ...
@@ -91,35 +91,41 @@
91 91

	
92 92
    virtual void _setObjCoeffs(ExprIterator b, ExprIterator e);
93 93
    virtual void _getObjCoeffs(InsertIterator b) const;
94 94

	
95 95
    virtual void _setObjCoeff(int i, Value obj_coef);
96 96
    virtual Value _getObjCoeff(int i) const;
97 97

	
98 98
    virtual void _setSense(Sense);
99 99
    virtual Sense _getSense() const;
100 100

	
101 101
    virtual void _clear();
102 102

	
103
    virtual void _messageLevel(MessageLevel level);
104

	
103 105
  private:
104 106

	
105 107
    static void freeEnv();
106 108

	
107 109
    struct FreeEnvHelper {
108 110
      ~FreeEnvHelper() {
109 111
        freeEnv();
110 112
      }
111 113
    };
112 114
    
113 115
    static FreeEnvHelper freeEnvHelper;
116

	
117
  protected:
118
    
119
    int _message_level;
114 120
    
115 121
  public:
116 122

	
117 123
    ///Pointer to the underlying GLPK data structure.
118 124
    LPX *lpx() {return lp;}
119 125
    ///Const pointer to the underlying GLPK data structure.
120 126
    const LPX *lpx() const {return lp;}
121 127

	
122 128
    ///Returns the constraint identifier understood by GLPK.
123 129
    int lpxRow(Row r) const { return rows(id(r)); }
124 130

	
125 131
    ///Returns the variable identifier understood by GLPK.
... ...
@@ -182,48 +188,24 @@
182 188

	
183 189
    bool _presolve;
184 190

	
185 191
  public:
186 192

	
187 193
    ///Turns on or off the presolver
188 194

	
189 195
    ///Turns on (\c b is \c true) or off (\c b is \c false) the presolver
190 196
    ///
191 197
    ///The presolver is off by default.
192 198
    void presolver(bool presolve);
193 199

	
194
    ///Enum for \c messageLevel() parameter
195
    enum MessageLevel {
196
      /// no output (default value)
197
      MESSAGE_NO_OUTPUT = 0,
198
      /// error messages only
199
      MESSAGE_ERROR_MESSAGE = 1,
200
      /// normal output
201
      MESSAGE_NORMAL_OUTPUT = 2,
202
      /// full output (includes informational messages)
203
      MESSAGE_FULL_OUTPUT = 3
204
    };
205

	
206
  private:
207

	
208
    MessageLevel _message_level;
209

	
210
  public:
211

	
212
    ///Set the verbosity of the messages
213

	
214
    ///Set the verbosity of the messages
215
    ///
216
    ///\param m is the level of the messages output by the solver routines.
217
    void messageLevel(MessageLevel m);
218 200
  };
219 201

	
220 202
  /// \brief Interface for the GLPK MIP solver
221 203
  ///
222 204
  /// This class implements an interface for the GLPK MIP solver.
223 205
  ///\ingroup lp_group
224 206
  class GlpkMip : public MipSolver, public GlpkBase {
225 207
  public:
226 208

	
227 209
    ///\e
228 210
    GlpkMip();
229 211
    ///\e
... ...
@@ -235,43 +217,19 @@
235 217
  protected:
236 218

	
237 219
    virtual const char* _solverName() const;
238 220

	
239 221
    virtual ColTypes _getColType(int col) const;
240 222
    virtual void _setColType(int col, ColTypes col_type);
241 223

	
242 224
    virtual SolveExitStatus _solve();
243 225
    virtual ProblemType _getType() const;
244 226
    virtual Value _getSol(int i) const;
245 227
    virtual Value _getSolValue() const;
246 228

	
247
    ///Enum for \c messageLevel() parameter
248
    enum MessageLevel {
249
      /// no output (default value)
250
      MESSAGE_NO_OUTPUT = 0,
251
      /// error messages only
252
      MESSAGE_ERROR_MESSAGE = 1,
253
      /// normal output
254
      MESSAGE_NORMAL_OUTPUT = 2,
255
      /// full output (includes informational messages)
256
      MESSAGE_FULL_OUTPUT = 3
257
    };
258

	
259
  private:
260

	
261
    MessageLevel _message_level;
262

	
263
  public:
264

	
265
    ///Set the verbosity of the messages
266

	
267
    ///Set the verbosity of the messages
268
    ///
269
    ///\param m is the level of the messages output by the solver routines.
270
    void messageLevel(MessageLevel m);
271 229
  };
272 230

	
273 231

	
274 232
} //END OF NAMESPACE LEMON
275 233

	
276 234
#endif //LEMON_GLPK_H
277 235

	
Ignore white space 6 line context
... ...
@@ -33,55 +33,53 @@
33 33
namespace lemon {
34 34

	
35 35
  /// \ingroup min_cut
36 36
  ///
37 37
  /// \brief Gomory-Hu cut tree algorithm
38 38
  ///
39 39
  /// The Gomory-Hu tree is a tree on the node set of a given graph, but it
40 40
  /// may contain edges which are not in the original graph. It has the
41 41
  /// property that the minimum capacity edge of the path between two nodes 
42 42
  /// in this tree has the same weight as the minimum cut in the graph
43 43
  /// between these nodes. Moreover the components obtained by removing
44 44
  /// this edge from the tree determine the corresponding minimum cut.
45
  ///
46 45
  /// Therefore once this tree is computed, the minimum cut between any pair
47 46
  /// of nodes can easily be obtained.
48 47
  /// 
49 48
  /// The algorithm calculates \e n-1 distinct minimum cuts (currently with
50
  /// the \ref Preflow algorithm), therefore the algorithm has
51
  /// \f$(O(n^3\sqrt{e})\f$ overall time complexity. It calculates a
52
  /// rooted Gomory-Hu tree, its structure and the weights can be obtained
53
  /// by \c predNode(), \c predValue() and \c rootDist().
54
  /// 
55
  /// The members \c minCutMap() and \c minCutValue() calculate
49
  /// the \ref Preflow algorithm), thus it has \f$O(n^3\sqrt{e})\f$ overall
50
  /// time complexity. It calculates a rooted Gomory-Hu tree.
51
  /// The structure of the tree and the edge weights can be
52
  /// obtained using \c predNode(), \c predValue() and \c rootDist().
53
  /// The functions \c minCutMap() and \c minCutValue() calculate
56 54
  /// the minimum cut and the minimum cut value between any two nodes
57 55
  /// in the graph. You can also list (iterate on) the nodes and the
58 56
  /// edges of the cuts using \c MinCutNodeIt and \c MinCutEdgeIt.
59 57
  ///
60 58
  /// \tparam GR The type of the undirected graph the algorithm runs on.
61
  /// \tparam CAP The type of the edge map describing the edge capacities.
62
  /// It is \ref concepts::Graph::EdgeMap "GR::EdgeMap<int>" by default.
59
  /// \tparam CAP The type of the edge map containing the capacities.
60
  /// The default map type is \ref concepts::Graph::EdgeMap "GR::EdgeMap<int>".
63 61
#ifdef DOXYGEN
64 62
  template <typename GR,
65 63
	    typename CAP>
66 64
#else
67 65
  template <typename GR,
68 66
	    typename CAP = typename GR::template EdgeMap<int> >
69 67
#endif
70 68
  class GomoryHu {
71 69
  public:
72 70

	
73
    /// The graph type
71
    /// The graph type of the algorithm
74 72
    typedef GR Graph;
75
    /// The type of the edge capacity map
73
    /// The capacity map type of the algorithm
76 74
    typedef CAP Capacity;
77 75
    /// The value type of capacities
78 76
    typedef typename Capacity::Value Value;
79 77
    
80 78
  private:
81 79

	
82 80
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
83 81

	
84 82
    const Graph& _graph;
85 83
    const Capacity& _capacity;
86 84

	
87 85
    Node _root;
... ...
@@ -108,191 +106,208 @@
108 106
      if (_weight) {
109 107
	delete _weight;
110 108
      }
111 109
      if (_order) {
112 110
	delete _order;
113 111
      }
114 112
    }
115 113
  
116 114
  public:
117 115

	
118 116
    /// \brief Constructor
119 117
    ///
120
    /// Constructor
118
    /// Constructor.
121 119
    /// \param graph The undirected graph the algorithm runs on.
122 120
    /// \param capacity The edge capacity map.
123 121
    GomoryHu(const Graph& graph, const Capacity& capacity) 
124 122
      : _graph(graph), _capacity(capacity),
125 123
	_pred(0), _weight(0), _order(0) 
126 124
    {
127 125
      checkConcept<concepts::ReadMap<Edge, Value>, Capacity>();
128 126
    }
129 127

	
130 128

	
131 129
    /// \brief Destructor
132 130
    ///
133
    /// Destructor
131
    /// Destructor.
134 132
    ~GomoryHu() {
135 133
      destroyStructures();
136 134
    }
137 135

	
138 136
  private:
139 137
  
140 138
    // Initialize the internal data structures
141 139
    void init() {
142 140
      createStructures();
143 141

	
144 142
      _root = NodeIt(_graph);
145 143
      for (NodeIt n(_graph); n != INVALID; ++n) {
146
	_pred->set(n, _root);
147
	_order->set(n, -1);
144
        (*_pred)[n] = _root;
145
        (*_order)[n] = -1;
148 146
      }
149
      _pred->set(_root, INVALID);
150
      _weight->set(_root, std::numeric_limits<Value>::max()); 
147
      (*_pred)[_root] = INVALID;
148
      (*_weight)[_root] = std::numeric_limits<Value>::max(); 
151 149
    }
152 150

	
153 151

	
154 152
    // Start the algorithm
155 153
    void start() {
156 154
      Preflow<Graph, Capacity> fa(_graph, _capacity, _root, INVALID);
157 155

	
158 156
      for (NodeIt n(_graph); n != INVALID; ++n) {
159 157
	if (n == _root) continue;
160 158

	
161 159
	Node pn = (*_pred)[n];
162 160
	fa.source(n);
163 161
	fa.target(pn);
164 162

	
165 163
	fa.runMinCut();
166 164

	
167
	_weight->set(n, fa.flowValue());
165
	(*_weight)[n] = fa.flowValue();
168 166

	
169 167
	for (NodeIt nn(_graph); nn != INVALID; ++nn) {
170 168
	  if (nn != n && fa.minCut(nn) && (*_pred)[nn] == pn) {
171
	    _pred->set(nn, n);
169
	    (*_pred)[nn] = n;
172 170
	  }
173 171
	}
174 172
	if ((*_pred)[pn] != INVALID && fa.minCut((*_pred)[pn])) {
175
	  _pred->set(n, (*_pred)[pn]);
176
	  _pred->set(pn, n);
177
	  _weight->set(n, (*_weight)[pn]);
178
	  _weight->set(pn, fa.flowValue());	
173
	  (*_pred)[n] = (*_pred)[pn];
174
	  (*_pred)[pn] = n;
175
	  (*_weight)[n] = (*_weight)[pn];
176
	  (*_weight)[pn] = fa.flowValue();
179 177
	}
180 178
      }
181 179

	
182
      _order->set(_root, 0);
180
      (*_order)[_root] = 0;
183 181
      int index = 1;
184 182

	
185 183
      for (NodeIt n(_graph); n != INVALID; ++n) {
186 184
	std::vector<Node> st;
187 185
	Node nn = n;
188 186
	while ((*_order)[nn] == -1) {
189 187
	  st.push_back(nn);
190 188
	  nn = (*_pred)[nn];
191 189
	}
192 190
	while (!st.empty()) {
193
	  _order->set(st.back(), index++);
191
	  (*_order)[st.back()] = index++;
194 192
	  st.pop_back();
195 193
	}
196 194
      }
197 195
    }
198 196

	
199 197
  public:
200 198

	
201 199
    ///\name Execution Control
202 200
 
203 201
    ///@{
204 202

	
205 203
    /// \brief Run the Gomory-Hu algorithm.
206 204
    ///
207 205
    /// This function runs the Gomory-Hu algorithm.
208 206
    void run() {
209 207
      init();
210 208
      start();
211 209
    }
212 210
    
213 211
    /// @}
214 212

	
215 213
    ///\name Query Functions
216 214
    ///The results of the algorithm can be obtained using these
217 215
    ///functions.\n
218
    ///\ref run() "run()" should be called before using them.\n
216
    ///\ref run() should be called before using them.\n
219 217
    ///See also \ref MinCutNodeIt and \ref MinCutEdgeIt.
220 218

	
221 219
    ///@{
222 220

	
223 221
    /// \brief Return the predecessor node in the Gomory-Hu tree.
224 222
    ///
225
    /// This function returns the predecessor node in the Gomory-Hu tree.
226
    /// If the node is
227
    /// the root of the Gomory-Hu tree, then it returns \c INVALID.
228
    Node predNode(const Node& node) {
223
    /// This function returns the predecessor node of the given node
224
    /// in the Gomory-Hu tree.
225
    /// If \c node is the root of the tree, then it returns \c INVALID.
226
    ///
227
    /// \pre \ref run() must be called before using this function.
228
    Node predNode(const Node& node) const {
229 229
      return (*_pred)[node];
230 230
    }
231 231

	
232
    /// \brief Return the distance from the root node in the Gomory-Hu tree.
233
    ///
234
    /// This function returns the distance of \c node from the root node
235
    /// in the Gomory-Hu tree.
236
    int rootDist(const Node& node) {
237
      return (*_order)[node];
238
    }
239

	
240 232
    /// \brief Return the weight of the predecessor edge in the
241 233
    /// Gomory-Hu tree.
242 234
    ///
243
    /// This function returns the weight of the predecessor edge in the
244
    /// Gomory-Hu tree.  If the node is the root, the result is undefined.
245
    Value predValue(const Node& node) {
235
    /// This function returns the weight of the predecessor edge of the 
236
    /// given node in the Gomory-Hu tree.
237
    /// If \c node is the root of the tree, the result is undefined.
238
    ///
239
    /// \pre \ref run() must be called before using this function.
240
    Value predValue(const Node& node) const {
246 241
      return (*_weight)[node];
247 242
    }
248 243

	
244
    /// \brief Return the distance from the root node in the Gomory-Hu tree.
245
    ///
246
    /// This function returns the distance of the given node from the root
247
    /// node in the Gomory-Hu tree.
248
    ///
249
    /// \pre \ref run() must be called before using this function.
250
    int rootDist(const Node& node) const {
251
      return (*_order)[node];
252
    }
253

	
249 254
    /// \brief Return the minimum cut value between two nodes
250 255
    ///
251
    /// This function returns the minimum cut value between two nodes. The
252
    /// algorithm finds the nearest common ancestor in the Gomory-Hu
253
    /// tree and calculates the minimum weight edge on the paths to
254
    /// the ancestor.
256
    /// This function returns the minimum cut value between the nodes
257
    /// \c s and \c t. 
258
    /// It finds the nearest common ancestor of the given nodes in the
259
    /// Gomory-Hu tree and calculates the minimum weight edge on the
260
    /// paths to the ancestor.
261
    ///
262
    /// \pre \ref run() must be called before using this function.
255 263
    Value minCutValue(const Node& s, const Node& t) const {
256 264
      Node sn = s, tn = t;
257 265
      Value value = std::numeric_limits<Value>::max();
258 266
      
259 267
      while (sn != tn) {
260 268
	if ((*_order)[sn] < (*_order)[tn]) {
261 269
	  if ((*_weight)[tn] <= value) value = (*_weight)[tn];
262 270
	  tn = (*_pred)[tn];
263 271
	} else {
264 272
	  if ((*_weight)[sn] <= value) value = (*_weight)[sn];
265 273
	  sn = (*_pred)[sn];
266 274
	}
267 275
      }
268 276
      return value;
269 277
    }
270 278

	
271 279
    /// \brief Return the minimum cut between two nodes
272 280
    ///
273 281
    /// This function returns the minimum cut between the nodes \c s and \c t
274 282
    /// in the \c cutMap parameter by setting the nodes in the component of
275 283
    /// \c s to \c true and the other nodes to \c false.
276 284
    ///
277
    /// For higher level interfaces, see MinCutNodeIt and MinCutEdgeIt.
285
    /// For higher level interfaces see MinCutNodeIt and MinCutEdgeIt.
286
    ///
287
    /// \param s The base node.
288
    /// \param t The node you want to separate from node \c s.
289
    /// \param cutMap The cut will be returned in this map.
290
    /// It must be a \c bool (or convertible) \ref concepts::ReadWriteMap
291
    /// "ReadWriteMap" on the graph nodes.
292
    ///
293
    /// \return The value of the minimum cut between \c s and \c t.
294
    ///
295
    /// \pre \ref run() must be called before using this function.
278 296
    template <typename CutMap>
279
    Value minCutMap(const Node& s, ///< The base node.
297
    Value minCutMap(const Node& s, ///< 
280 298
                    const Node& t,
281
                    ///< The node you want to separate from node \c s.
299
                    ///< 
282 300
                    CutMap& cutMap
283
                    ///< The cut will be returned in this map.
284
                    /// It must be a \c bool (or convertible) 
285
                    /// \ref concepts::ReadWriteMap "ReadWriteMap"
286
                    /// on the graph nodes.
301
                    ///< 
287 302
                    ) const {
288 303
      Node sn = s, tn = t;
289 304
      bool s_root=false;
290 305
      Node rn = INVALID;
291 306
      Value value = std::numeric_limits<Value>::max();
292 307
      
293 308
      while (sn != tn) {
294 309
	if ((*_order)[sn] < (*_order)[tn]) {
295 310
	  if ((*_weight)[tn] <= value) {
296 311
	    rn = tn;
297 312
            s_root = false;
298 313
	    value = (*_weight)[tn];
... ...
@@ -300,27 +315,27 @@
300 315
	  tn = (*_pred)[tn];
301 316
	} else {
302 317
	  if ((*_weight)[sn] <= value) {
303 318
	    rn = sn;
304 319
            s_root = true;
305 320
	    value = (*_weight)[sn];
306 321
	  }
307 322
	  sn = (*_pred)[sn];
308 323
	}
309 324
      }
310 325

	
311 326
      typename Graph::template NodeMap<bool> reached(_graph, false);
312
      reached.set(_root, true);
327
      reached[_root] = true;
313 328
      cutMap.set(_root, !s_root);
314
      reached.set(rn, true);
329
      reached[rn] = true;
315 330
      cutMap.set(rn, s_root);
316 331

	
317 332
      std::vector<Node> st;
318 333
      for (NodeIt n(_graph); n != INVALID; ++n) {
319 334
	st.clear();
320 335
        Node nn = n;
321 336
	while (!reached[nn]) {
322 337
	  st.push_back(nn);
323 338
	  nn = (*_pred)[nn];
324 339
	}
325 340
	while (!st.empty()) {
326 341
	  cutMap.set(st.back(), cutMap[nn]);
... ...
@@ -329,25 +344,25 @@
329 344
      }
330 345
      
331 346
      return value;
332 347
    }
333 348

	
334 349
    ///@}
335 350

	
336 351
    friend class MinCutNodeIt;
337 352

	
338 353
    /// Iterate on the nodes of a minimum cut
339 354
    
340 355
    /// This iterator class lists the nodes of a minimum cut found by
341
    /// GomoryHu. Before using it, you must allocate a GomoryHu class,
356
    /// GomoryHu. Before using it, you must allocate a GomoryHu class
342 357
    /// and call its \ref GomoryHu::run() "run()" method.
343 358
    ///
344 359
    /// This example counts the nodes in the minimum cut separating \c s from
345 360
    /// \c t.
346 361
    /// \code
347 362
    /// GomoruHu<Graph> gom(g, capacities);
348 363
    /// gom.run();
349 364
    /// int cnt=0;
350 365
    /// for(GomoruHu<Graph>::MinCutNodeIt n(gom,s,t); n!=INVALID; ++n) ++cnt;
351 366
    /// \endcode
352 367
    class MinCutNodeIt
353 368
    {
... ...
@@ -426,68 +441,72 @@
426 441
      {
427 442
        typename Graph::Node n=*this;
428 443
        ++(*this);
429 444
        return n;
430 445
      }
431 446
    };
432 447
    
433 448
    friend class MinCutEdgeIt;
434 449
    
435 450
    /// Iterate on the edges of a minimum cut
436 451
    
437 452
    /// This iterator class lists the edges of a minimum cut found by
438
    /// GomoryHu. Before using it, you must allocate a GomoryHu class,
453
    /// GomoryHu. Before using it, you must allocate a GomoryHu class
439 454
    /// and call its \ref GomoryHu::run() "run()" method.
440 455
    ///
441 456
    /// This example computes the value of the minimum cut separating \c s from
442 457
    /// \c t.
443 458
    /// \code
444 459
    /// GomoruHu<Graph> gom(g, capacities);
445 460
    /// gom.run();
446 461
    /// int value=0;
447 462
    /// for(GomoruHu<Graph>::MinCutEdgeIt e(gom,s,t); e!=INVALID; ++e)
448 463
    ///   value+=capacities[e];
449 464
    /// \endcode
450
    /// the result will be the same as it is returned by
451
    /// \ref GomoryHu::minCutValue() "gom.minCutValue(s,t)"
465
    /// The result will be the same as the value returned by
466
    /// \ref GomoryHu::minCutValue() "gom.minCutValue(s,t)".
452 467
    class MinCutEdgeIt
453 468
    {
454 469
      bool _side;
455 470
      const Graph &_graph;
456 471
      typename Graph::NodeIt _node_it;
457 472
      typename Graph::OutArcIt _arc_it;
458 473
      typename Graph::template NodeMap<bool> _cut;
459 474
      void step()
460 475
      {
461 476
        ++_arc_it;
462 477
        while(_node_it!=INVALID && _arc_it==INVALID)
463 478
          {
464 479
            for(++_node_it;_node_it!=INVALID&&!_cut[_node_it];++_node_it) {}
465 480
            if(_node_it!=INVALID)
466 481
              _arc_it=typename Graph::OutArcIt(_graph,_node_it);
467 482
          }
468 483
      }
469 484
      
470 485
    public:
486
      /// Constructor
487

	
488
      /// Constructor.
489
      ///
471 490
      MinCutEdgeIt(GomoryHu const &gomory,
472 491
                   ///< The GomoryHu class. You must call its
473 492
                   ///  run() method
474 493
                   ///  before initializing this iterator.
475 494
                   const Node& s,  ///< The base node.
476 495
                   const Node& t,
477 496
                   ///< The node you want to separate from node \c s.
478 497
                   bool side=true
479 498
                   ///< If it is \c true (default) then the listed arcs
480 499
                   ///  will be oriented from the
481
                   ///  the nodes of the component containing \c s,
500
                   ///  nodes of the component containing \c s,
482 501
                   ///  otherwise they will be oriented in the opposite
483 502
                   ///  direction.
484 503
                   )
485 504
        : _graph(gomory._graph), _cut(_graph)
486 505
      {
487 506
        gomory.minCutMap(s,t,_cut);
488 507
        if(!side)
489 508
          for(typename Graph::NodeIt n(_graph);n!=INVALID;++n)
490 509
            _cut[n]=!_cut[n];
491 510

	
492 511
        for(_node_it=typename Graph::NodeIt(_graph);
493 512
            _node_it!=INVALID && !_cut[_node_it];
Ignore white space 6 line context
... ...
@@ -259,40 +259,36 @@
259 259
  ///Node shapes
260 260

	
261 261
  ///Node shapes.
262 262
  ///
263 263
  enum NodeShapes {
264 264
    /// = 0
265 265
    ///\image html nodeshape_0.png
266 266
    ///\image latex nodeshape_0.eps "CIRCLE shape (0)" width=2cm
267 267
    CIRCLE=0,
268 268
    /// = 1
269 269
    ///\image html nodeshape_1.png
270 270
    ///\image latex nodeshape_1.eps "SQUARE shape (1)" width=2cm
271
    ///
272 271
    SQUARE=1,
273 272
    /// = 2
274 273
    ///\image html nodeshape_2.png
275 274
    ///\image latex nodeshape_2.eps "DIAMOND shape (2)" width=2cm
276
    ///
277 275
    DIAMOND=2,
278 276
    /// = 3
279 277
    ///\image html nodeshape_3.png
280
    ///\image latex nodeshape_2.eps "MALE shape (4)" width=2cm
281
    ///
278
    ///\image latex nodeshape_3.eps "MALE shape (3)" width=2cm
282 279
    MALE=3,
283 280
    /// = 4
284 281
    ///\image html nodeshape_4.png
285
    ///\image latex nodeshape_2.eps "FEMALE shape (4)" width=2cm
286
    ///
282
    ///\image latex nodeshape_4.eps "FEMALE shape (4)" width=2cm
287 283
    FEMALE=4
288 284
  };
289 285

	
290 286
private:
291 287
  class arcLess {
292 288
    const Graph &g;
293 289
  public:
294 290
    arcLess(const Graph &_g) : g(_g) {}
295 291
    bool operator()(Arc a,Arc b) const
296 292
    {
297 293
      Node ai=std::min(g.source(a),g.target(a));
298 294
      Node aa=std::max(g.source(a),g.target(a));
Ignore white space 6 line context
... ...
@@ -488,27 +488,25 @@
488 488
  /// A short example about the basic usage:
489 489
  ///\code
490 490
  /// GridGraph graph(rows, cols);
491 491
  /// GridGraph::NodeMap<int> val(graph);
492 492
  /// for (int i = 0; i < graph.width(); ++i) {
493 493
  ///   for (int j = 0; j < graph.height(); ++j) {
494 494
  ///     val[graph(i, j)] = i + j;
495 495
  ///   }
496 496
  /// }
497 497
  ///\endcode
498 498
  ///
499 499
  /// This graph type fully conforms to the \ref concepts::Graph
500
  /// "Graph" concept, and it also has an important extra feature
501
  /// that its maps are real \ref concepts::ReferenceMap
502
  /// "reference map"s.
500
  /// "Graph concept".
503 501
  class GridGraph : public ExtendedGridGraphBase {
504 502
  public:
505 503

	
506 504
    typedef ExtendedGridGraphBase Parent;
507 505

	
508 506
    /// \brief Map to get the indices of the nodes as dim2::Point<int>.
509 507
    ///
510 508
    /// Map to get the indices of the nodes as dim2::Point<int>.
511 509
    class IndexMap {
512 510
    public:
513 511
      /// \brief The key type of the map
514 512
      typedef GridGraph::Node Key;
Ignore white space 6 line context
... ...
@@ -22,75 +22,82 @@
22 22
#include <vector>
23 23
#include <list>
24 24
#include <limits>
25 25

	
26 26
#include <lemon/maps.h>
27 27
#include <lemon/core.h>
28 28
#include <lemon/tolerance.h>
29 29

	
30 30
/// \file
31 31
/// \ingroup min_cut
32 32
/// \brief Implementation of the Hao-Orlin algorithm.
33 33
///
34
/// Implementation of the Hao-Orlin algorithm class for testing network
35
/// reliability.
34
/// Implementation of the Hao-Orlin algorithm for finding a minimum cut 
35
/// in a digraph.
36 36

	
37 37
namespace lemon {
38 38

	
39 39
  /// \ingroup min_cut
40 40
  ///
41
  /// \brief %Hao-Orlin algorithm to find a minimum cut in directed graphs.
41
  /// \brief Hao-Orlin algorithm for finding a minimum cut in a digraph.
42 42
  ///
43
  /// Hao-Orlin calculates a minimum cut in a directed graph
44
  /// \f$D=(V,A)\f$. It takes a fixed node \f$ source \in V \f$ and
43
  /// This class implements the Hao-Orlin algorithm for finding a minimum
44
  /// value cut in a directed graph \f$D=(V,A)\f$. 
45
  /// It takes a fixed node \f$ source \in V \f$ and
45 46
  /// consists of two phases: in the first phase it determines a
46 47
  /// minimum cut with \f$ source \f$ on the source-side (i.e. a set
47
  /// \f$ X\subsetneq V \f$ with \f$ source \in X \f$ and minimal
48
  /// out-degree) and in the second phase it determines a minimum cut
48
  /// \f$ X\subsetneq V \f$ with \f$ source \in X \f$ and minimal outgoing
49
  /// capacity) and in the second phase it determines a minimum cut
49 50
  /// with \f$ source \f$ on the sink-side (i.e. a set
50
  /// \f$ X\subsetneq V \f$ with \f$ source \notin X \f$ and minimal
51
  /// out-degree). Obviously, the smaller of these two cuts will be a
51
  /// \f$ X\subsetneq V \f$ with \f$ source \notin X \f$ and minimal outgoing
52
  /// capacity). Obviously, the smaller of these two cuts will be a
52 53
  /// minimum cut of \f$ D \f$. The algorithm is a modified
53
  /// push-relabel preflow algorithm and our implementation calculates
54
  /// preflow push-relabel algorithm. Our implementation calculates
54 55
  /// the minimum cut in \f$ O(n^2\sqrt{m}) \f$ time (we use the
55 56
  /// highest-label rule), or in \f$O(nm)\f$ for unit capacities. The
56
  /// purpose of such algorithm is testing network reliability. For an
57
  /// undirected graph you can run just the first phase of the
58
  /// algorithm or you can use the algorithm of Nagamochi and Ibaraki
59
  /// which solves the undirected problem in
60
  /// \f$ O(nm + n^2 \log n) \f$ time: it is implemented in the
61
  /// NagamochiIbaraki algorithm class.
57
  /// purpose of such algorithm is e.g. testing network reliability.
62 58
  ///
63
  /// \param GR The digraph class the algorithm runs on.
64
  /// \param CAP An arc map of capacities which can be any numreric type.
65
  /// The default type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
66
  /// \param TOL Tolerance class for handling inexact computations. The
59
  /// For an undirected graph you can run just the first phase of the
60
  /// algorithm or you can use the algorithm of Nagamochi and Ibaraki,
61
  /// which solves the undirected problem in \f$ O(nm + n^2 \log n) \f$ 
62
  /// time. It is implemented in the NagamochiIbaraki algorithm class.
63
  ///
64
  /// \tparam GR The type of the digraph the algorithm runs on.
65
  /// \tparam CAP The type of the arc map containing the capacities,
66
  /// which can be any numreric type. The default map type is
67
  /// \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
68
  /// \tparam TOL Tolerance class for handling inexact computations. The
67 69
  /// default tolerance type is \ref Tolerance "Tolerance<CAP::Value>".
68 70
#ifdef DOXYGEN
69 71
  template <typename GR, typename CAP, typename TOL>
70 72
#else
71 73
  template <typename GR,
72 74
            typename CAP = typename GR::template ArcMap<int>,
73 75
            typename TOL = Tolerance<typename CAP::Value> >
74 76
#endif
75 77
  class HaoOrlin {
78
  public:
79
   
80
    /// The digraph type of the algorithm
81
    typedef GR Digraph;
82
    /// The capacity map type of the algorithm
83
    typedef CAP CapacityMap;
84
    /// The tolerance type of the algorithm
85
    typedef TOL Tolerance;
86

	
76 87
  private:
77 88

	
78
    typedef GR Digraph;
79
    typedef CAP CapacityMap;
80
    typedef TOL Tolerance;
81

	
82 89
    typedef typename CapacityMap::Value Value;
83 90

	
84
    TEMPLATE_GRAPH_TYPEDEFS(Digraph);
91
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
85 92

	
86 93
    const Digraph& _graph;
87 94
    const CapacityMap* _capacity;
88 95

	
89 96
    typedef typename Digraph::template ArcMap<Value> FlowMap;
90 97
    FlowMap* _flow;
91 98

	
92 99
    Node _source;
93 100

	
94 101
    int _node_num;
95 102

	
96 103
    // Bucketing structure
... ...
@@ -152,141 +159,142 @@
152 159
      }
153 160
      if (_bucket) {
154 161
        delete _bucket;
155 162
      }
156 163
      if (_flow) {
157 164
        delete _flow;
158 165
      }
159 166
    }
160 167

	
161 168
  private:
162 169

	
163 170
    void activate(const Node& i) {
164
      _active->set(i, true);
171
      (*_active)[i] = true;
165 172

	
166 173
      int bucket = (*_bucket)[i];
167 174

	
168 175
      if ((*_prev)[i] == INVALID || (*_active)[(*_prev)[i]]) return;
169 176
      //unlace
170
      _next->set((*_prev)[i], (*_next)[i]);
177
      (*_next)[(*_prev)[i]] = (*_next)[i];
171 178
      if ((*_next)[i] != INVALID) {
172
        _prev->set((*_next)[i], (*_prev)[i]);
179
        (*_prev)[(*_next)[i]] = (*_prev)[i];
173 180
      } else {
174 181
        _last[bucket] = (*_prev)[i];
175 182
      }
176 183
      //lace
177
      _next->set(i, _first[bucket]);
178
      _prev->set(_first[bucket], i);
179
      _prev->set(i, INVALID);
184
      (*_next)[i] = _first[bucket];
185
      (*_prev)[_first[bucket]] = i;
186
      (*_prev)[i] = INVALID;
180 187
      _first[bucket] = i;
181 188
    }
182 189

	
183 190
    void deactivate(const Node& i) {
184
      _active->set(i, false);
191
      (*_active)[i] = false;
185 192
      int bucket = (*_bucket)[i];
186 193

	
187 194
      if ((*_next)[i] == INVALID || !(*_active)[(*_next)[i]]) return;
188 195

	
189 196
      //unlace
190
      _prev->set((*_next)[i], (*_prev)[i]);
197
      (*_prev)[(*_next)[i]] = (*_prev)[i];
191 198
      if ((*_prev)[i] != INVALID) {
192
        _next->set((*_prev)[i], (*_next)[i]);
199
        (*_next)[(*_prev)[i]] = (*_next)[i];
193 200
      } else {
194 201
        _first[bucket] = (*_next)[i];
195 202
      }
196 203
      //lace
197
      _prev->set(i, _last[bucket]);
198
      _next->set(_last[bucket], i);
199
      _next->set(i, INVALID);
204
      (*_prev)[i] = _last[bucket];
205
      (*_next)[_last[bucket]] = i;
206
      (*_next)[i] = INVALID;
200 207
      _last[bucket] = i;
201 208
    }
202 209

	
203 210
    void addItem(const Node& i, int bucket) {
204 211
      (*_bucket)[i] = bucket;
205 212
      if (_last[bucket] != INVALID) {
206
        _prev->set(i, _last[bucket]);
207
        _next->set(_last[bucket], i);
208
        _next->set(i, INVALID);
213
        (*_prev)[i] = _last[bucket];
214
        (*_next)[_last[bucket]] = i;
215
        (*_next)[i] = INVALID;
209 216
        _last[bucket] = i;
210 217
      } else {
211
        _prev->set(i, INVALID);
218
        (*_prev)[i] = INVALID;
212 219
        _first[bucket] = i;
213
        _next->set(i, INVALID);
220
        (*_next)[i] = INVALID;
214 221
        _last[bucket] = i;
215 222
      }
216 223
    }
217 224

	
218 225
    void findMinCutOut() {
219 226

	
220 227
      for (NodeIt n(_graph); n != INVALID; ++n) {
221
        _excess->set(n, 0);
228
        (*_excess)[n] = 0;
229
        (*_source_set)[n] = false;
222 230
      }
223 231

	
224 232
      for (ArcIt a(_graph); a != INVALID; ++a) {
225
        _flow->set(a, 0);
233
        (*_flow)[a] = 0;
226 234
      }
227 235

	
228 236
      int bucket_num = 0;
229 237
      std::vector<Node> queue(_node_num);
230 238
      int qfirst = 0, qlast = 0, qsep = 0;
231 239

	
232 240
      {
233 241
        typename Digraph::template NodeMap<bool> reached(_graph, false);
234 242

	
235
        reached.set(_source, true);
243
        reached[_source] = true;
236 244
        bool first_set = true;
237 245

	
238 246
        for (NodeIt t(_graph); t != INVALID; ++t) {
239 247
          if (reached[t]) continue;
240 248
          _sets.push_front(std::list<int>());
241 249

	
242 250
          queue[qlast++] = t;
243
          reached.set(t, true);
251
          reached[t] = true;
244 252

	
245 253
          while (qfirst != qlast) {
246 254
            if (qsep == qfirst) {
247 255
              ++bucket_num;
248 256
              _sets.front().push_front(bucket_num);
249 257
              _dormant[bucket_num] = !first_set;
250 258
              _first[bucket_num] = _last[bucket_num] = INVALID;
251 259
              qsep = qlast;
252 260
            }
253 261

	
254 262
            Node n = queue[qfirst++];
255 263
            addItem(n, bucket_num);
256 264

	
257 265
            for (InArcIt a(_graph, n); a != INVALID; ++a) {
258 266
              Node u = _graph.source(a);
259 267
              if (!reached[u] && _tolerance.positive((*_capacity)[a])) {
260
                reached.set(u, true);
268
                reached[u] = true;
261 269
                queue[qlast++] = u;
262 270
              }
263 271
            }
264 272
          }
265 273
          first_set = false;
266 274
        }
267 275

	
268 276
        ++bucket_num;
269
        _bucket->set(_source, 0);
277
        (*_bucket)[_source] = 0;
270 278
        _dormant[0] = true;
271 279
      }
272
      _source_set->set(_source, true);
280
      (*_source_set)[_source] = true;
273 281

	
274 282
      Node target = _last[_sets.back().back()];
275 283
      {
276 284
        for (OutArcIt a(_graph, _source); a != INVALID; ++a) {
277 285
          if (_tolerance.positive((*_capacity)[a])) {
278 286
            Node u = _graph.target(a);
279
            _flow->set(a, (*_capacity)[a]);
280
            _excess->set(u, (*_excess)[u] + (*_capacity)[a]);
287
            (*_flow)[a] = (*_capacity)[a];
288
            (*_excess)[u] += (*_capacity)[a];
281 289
            if (!(*_active)[u] && u != _source) {
282 290
              activate(u);
283 291
            }
284 292
          }
285 293
        }
286 294

	
287 295
        if ((*_active)[target]) {
288 296
          deactivate(target);
289 297
        }
290 298

	
291 299
        _highest = _sets.back().begin();
292 300
        while (_highest != _sets.back().end() &&
... ...
@@ -309,284 +317,285 @@
309 317
          }
310 318

	
311 319
          for (OutArcIt a(_graph, n); a != INVALID; ++a) {
312 320
            Node v = _graph.target(a);
313 321
            if (_dormant[(*_bucket)[v]]) continue;
314 322
            Value rem = (*_capacity)[a] - (*_flow)[a];
315 323
            if (!_tolerance.positive(rem)) continue;
316 324
            if ((*_bucket)[v] == under_bucket) {
317 325
              if (!(*_active)[v] && v != target) {
318 326
                activate(v);
319 327
              }
320 328
              if (!_tolerance.less(rem, excess)) {
321
                _flow->set(a, (*_flow)[a] + excess);
322
                _excess->set(v, (*_excess)[v] + excess);
329
                (*_flow)[a] += excess;
330
                (*_excess)[v] += excess;
323 331
                excess = 0;
324 332
                goto no_more_push;
325 333
              } else {
326 334
                excess -= rem;
327
                _excess->set(v, (*_excess)[v] + rem);
328
                _flow->set(a, (*_capacity)[a]);
335
                (*_excess)[v] += rem;
336
                (*_flow)[a] = (*_capacity)[a];
329 337
              }
330 338
            } else if (next_bucket > (*_bucket)[v]) {
331 339
              next_bucket = (*_bucket)[v];
332 340
            }
333 341
          }
334 342

	
335 343
          for (InArcIt a(_graph, n); a != INVALID; ++a) {
336 344
            Node v = _graph.source(a);
337 345
            if (_dormant[(*_bucket)[v]]) continue;
338 346
            Value rem = (*_flow)[a];
339 347
            if (!_tolerance.positive(rem)) continue;
340 348
            if ((*_bucket)[v] == under_bucket) {
341 349
              if (!(*_active)[v] && v != target) {
342 350
                activate(v);
343 351
              }
344 352
              if (!_tolerance.less(rem, excess)) {
345
                _flow->set(a, (*_flow)[a] - excess);
346
                _excess->set(v, (*_excess)[v] + excess);
353
                (*_flow)[a] -= excess;
354
                (*_excess)[v] += excess;
347 355
                excess = 0;
348 356
                goto no_more_push;
349 357
              } else {
350 358
                excess -= rem;
351
                _excess->set(v, (*_excess)[v] + rem);
352
                _flow->set(a, 0);
359
                (*_excess)[v] += rem;
360
                (*_flow)[a] = 0;
353 361
              }
354 362
            } else if (next_bucket > (*_bucket)[v]) {
355 363
              next_bucket = (*_bucket)[v];
356 364
            }
357 365
          }
358 366

	
359 367
        no_more_push:
360 368

	
361
          _excess->set(n, excess);
369
          (*_excess)[n] = excess;
362 370

	
363 371
          if (excess != 0) {
364 372
            if ((*_next)[n] == INVALID) {
365 373
              typename std::list<std::list<int> >::iterator new_set =
366 374
                _sets.insert(--_sets.end(), std::list<int>());
367 375
              new_set->splice(new_set->end(), _sets.back(),
368 376
                              _sets.back().begin(), ++_highest);
369 377
              for (std::list<int>::iterator it = new_set->begin();
370 378
                   it != new_set->end(); ++it) {
371 379
                _dormant[*it] = true;
372 380
              }
373 381
              while (_highest != _sets.back().end() &&
374 382
                     !(*_active)[_first[*_highest]]) {
375 383
                ++_highest;
376 384
              }
377 385
            } else if (next_bucket == _node_num) {
378 386
              _first[(*_bucket)[n]] = (*_next)[n];
379
              _prev->set((*_next)[n], INVALID);
387
              (*_prev)[(*_next)[n]] = INVALID;
380 388

	
381 389
              std::list<std::list<int> >::iterator new_set =
382 390
                _sets.insert(--_sets.end(), std::list<int>());
383 391

	
384 392
              new_set->push_front(bucket_num);
385
              _bucket->set(n, bucket_num);
393
              (*_bucket)[n] = bucket_num;
386 394
              _first[bucket_num] = _last[bucket_num] = n;
387
              _next->set(n, INVALID);
388
              _prev->set(n, INVALID);
395
              (*_next)[n] = INVALID;
396
              (*_prev)[n] = INVALID;
389 397
              _dormant[bucket_num] = true;
390 398
              ++bucket_num;
391 399

	
392 400
              while (_highest != _sets.back().end() &&
393 401
                     !(*_active)[_first[*_highest]]) {
394 402
                ++_highest;
395 403
              }
396 404
            } else {
397 405
              _first[*_highest] = (*_next)[n];
398
              _prev->set((*_next)[n], INVALID);
406
              (*_prev)[(*_next)[n]] = INVALID;
399 407

	
400 408
              while (next_bucket != *_highest) {
401 409
                --_highest;
402 410
              }
403 411

	
404 412
              if (_highest == _sets.back().begin()) {
405 413
                _sets.back().push_front(bucket_num);
406 414
                _dormant[bucket_num] = false;
407 415
                _first[bucket_num] = _last[bucket_num] = INVALID;
408 416
                ++bucket_num;
409 417
              }
410 418
              --_highest;
411 419

	
412
              _bucket->set(n, *_highest);
413
              _next->set(n, _first[*_highest]);
420
              (*_bucket)[n] = *_highest;
421
              (*_next)[n] = _first[*_highest];
414 422
              if (_first[*_highest] != INVALID) {
415
                _prev->set(_first[*_highest], n);
423
                (*_prev)[_first[*_highest]] = n;
416 424
              } else {
417 425
                _last[*_highest] = n;
418 426
              }
419 427
              _first[*_highest] = n;
420 428
            }
421 429
          } else {
422 430

	
423 431
            deactivate(n);
424 432
            if (!(*_active)[_first[*_highest]]) {
425 433
              ++_highest;
426 434
              if (_highest != _sets.back().end() &&
427 435
                  !(*_active)[_first[*_highest]]) {
428 436
                _highest = _sets.back().end();
429 437
              }
430 438
            }
431 439
          }
432 440
        }
433 441

	
434 442
        if ((*_excess)[target] < _min_cut) {
435 443
          _min_cut = (*_excess)[target];
436 444
          for (NodeIt i(_graph); i != INVALID; ++i) {
437
            _min_cut_map->set(i, true);
445
            (*_min_cut_map)[i] = true;
438 446
          }
439 447
          for (std::list<int>::iterator it = _sets.back().begin();
440 448
               it != _sets.back().end(); ++it) {
441 449
            Node n = _first[*it];
442 450
            while (n != INVALID) {
443
              _min_cut_map->set(n, false);
451
              (*_min_cut_map)[n] = false;
444 452
              n = (*_next)[n];
445 453
            }
446 454
          }
447 455
        }
448 456

	
449 457
        {
450 458
          Node new_target;
451 459
          if ((*_prev)[target] != INVALID || (*_next)[target] != INVALID) {
452 460
            if ((*_next)[target] == INVALID) {
453 461
              _last[(*_bucket)[target]] = (*_prev)[target];
454 462
              new_target = (*_prev)[target];
455 463
            } else {
456
              _prev->set((*_next)[target], (*_prev)[target]);
464
              (*_prev)[(*_next)[target]] = (*_prev)[target];
457 465
              new_target = (*_next)[target];
458 466
            }
459 467
            if ((*_prev)[target] == INVALID) {
460 468
              _first[(*_bucket)[target]] = (*_next)[target];
461 469
            } else {
462
              _next->set((*_prev)[target], (*_next)[target]);
470
              (*_next)[(*_prev)[target]] = (*_next)[target];
463 471
            }
464 472
          } else {
465 473
            _sets.back().pop_back();
466 474
            if (_sets.back().empty()) {
467 475
              _sets.pop_back();
468 476
              if (_sets.empty())
469 477
                break;
470 478
              for (std::list<int>::iterator it = _sets.back().begin();
471 479
                   it != _sets.back().end(); ++it) {
472 480
                _dormant[*it] = false;
473 481
              }
474 482
            }
475 483
            new_target = _last[_sets.back().back()];
476 484
          }
477 485

	
478
          _bucket->set(target, 0);
486
          (*_bucket)[target] = 0;
479 487

	
480
          _source_set->set(target, true);
488
          (*_source_set)[target] = true;
481 489
          for (OutArcIt a(_graph, target); a != INVALID; ++a) {
482 490
            Value rem = (*_capacity)[a] - (*_flow)[a];
483 491
            if (!_tolerance.positive(rem)) continue;
484 492
            Node v = _graph.target(a);
485 493
            if (!(*_active)[v] && !(*_source_set)[v]) {
486 494
              activate(v);
487 495
            }
488
            _excess->set(v, (*_excess)[v] + rem);
489
            _flow->set(a, (*_capacity)[a]);
496
            (*_excess)[v] += rem;
497
            (*_flow)[a] = (*_capacity)[a];
490 498
          }
491 499

	
492 500
          for (InArcIt a(_graph, target); a != INVALID; ++a) {
493 501
            Value rem = (*_flow)[a];
494 502
            if (!_tolerance.positive(rem)) continue;
495 503
            Node v = _graph.source(a);
496 504
            if (!(*_active)[v] && !(*_source_set)[v]) {
497 505
              activate(v);
498 506
            }
499
            _excess->set(v, (*_excess)[v] + rem);
500
            _flow->set(a, 0);
507
            (*_excess)[v] += rem;
508
            (*_flow)[a] = 0;
501 509
          }
502 510

	
503 511
          target = new_target;
504 512
          if ((*_active)[target]) {
505 513
            deactivate(target);
506 514
          }
507 515

	
508 516
          _highest = _sets.back().begin();
509 517
          while (_highest != _sets.back().end() &&
510 518
                 !(*_active)[_first[*_highest]]) {
511 519
            ++_highest;
512 520
          }
513 521
        }
514 522
      }
515 523
    }
516 524

	
517 525
    void findMinCutIn() {
518 526

	
519 527
      for (NodeIt n(_graph); n != INVALID; ++n) {
520
        _excess->set(n, 0);
528
        (*_excess)[n] = 0;
529
        (*_source_set)[n] = false;
521 530
      }
522 531

	
523 532
      for (ArcIt a(_graph); a != INVALID; ++a) {
524
        _flow->set(a, 0);
533
        (*_flow)[a] = 0;
525 534
      }
526 535

	
527 536
      int bucket_num = 0;
528 537
      std::vector<Node> queue(_node_num);
529 538
      int qfirst = 0, qlast = 0, qsep = 0;
530 539

	
531 540
      {
532 541
        typename Digraph::template NodeMap<bool> reached(_graph, false);
533 542

	
534
        reached.set(_source, true);
543
        reached[_source] = true;
535 544

	
536 545
        bool first_set = true;
537 546

	
538 547
        for (NodeIt t(_graph); t != INVALID; ++t) {
539 548
          if (reached[t]) continue;
540 549
          _sets.push_front(std::list<int>());
541 550

	
542 551
          queue[qlast++] = t;
543
          reached.set(t, true);
552
          reached[t] = true;
544 553

	
545 554
          while (qfirst != qlast) {
546 555
            if (qsep == qfirst) {
547 556
              ++bucket_num;
548 557
              _sets.front().push_front(bucket_num);
549 558
              _dormant[bucket_num] = !first_set;
550 559
              _first[bucket_num] = _last[bucket_num] = INVALID;
551 560
              qsep = qlast;
552 561
            }
553 562

	
554 563
            Node n = queue[qfirst++];
555 564
            addItem(n, bucket_num);
556 565

	
557 566
            for (OutArcIt a(_graph, n); a != INVALID; ++a) {
558 567
              Node u = _graph.target(a);
559 568
              if (!reached[u] && _tolerance.positive((*_capacity)[a])) {
560
                reached.set(u, true);
569
                reached[u] = true;
561 570
                queue[qlast++] = u;
562 571
              }
563 572
            }
564 573
          }
565 574
          first_set = false;
566 575
        }
567 576

	
568 577
        ++bucket_num;
569
        _bucket->set(_source, 0);
578
        (*_bucket)[_source] = 0;
570 579
        _dormant[0] = true;
571 580
      }
572
      _source_set->set(_source, true);
581
      (*_source_set)[_source] = true;
573 582

	
574 583
      Node target = _last[_sets.back().back()];
575 584
      {
576 585
        for (InArcIt a(_graph, _source); a != INVALID; ++a) {
577 586
          if (_tolerance.positive((*_capacity)[a])) {
578 587
            Node u = _graph.source(a);
579
            _flow->set(a, (*_capacity)[a]);
580
            _excess->set(u, (*_excess)[u] + (*_capacity)[a]);
588
            (*_flow)[a] = (*_capacity)[a];
589
            (*_excess)[u] += (*_capacity)[a];
581 590
            if (!(*_active)[u] && u != _source) {
582 591
              activate(u);
583 592
            }
584 593
          }
585 594
        }
586 595
        if ((*_active)[target]) {
587 596
          deactivate(target);
588 597
        }
589 598

	
590 599
        _highest = _sets.back().begin();
591 600
        while (_highest != _sets.back().end() &&
592 601
               !(*_active)[_first[*_highest]]) {
... ...
@@ -609,246 +618,247 @@
609 618
          }
610 619

	
611 620
          for (InArcIt a(_graph, n); a != INVALID; ++a) {
612 621
            Node v = _graph.source(a);
613 622
            if (_dormant[(*_bucket)[v]]) continue;
614 623
            Value rem = (*_capacity)[a] - (*_flow)[a];
615 624
            if (!_tolerance.positive(rem)) continue;
616 625
            if ((*_bucket)[v] == under_bucket) {
617 626
              if (!(*_active)[v] && v != target) {
618 627
                activate(v);
619 628
              }
620 629
              if (!_tolerance.less(rem, excess)) {
621
                _flow->set(a, (*_flow)[a] + excess);
622
                _excess->set(v, (*_excess)[v] + excess);
630
                (*_flow)[a] += excess;
631
                (*_excess)[v] += excess;
623 632
                excess = 0;
624 633
                goto no_more_push;
625 634
              } else {
626 635
                excess -= rem;
627
                _excess->set(v, (*_excess)[v] + rem);
628
                _flow->set(a, (*_capacity)[a]);
636
                (*_excess)[v] += rem;
637
                (*_flow)[a] = (*_capacity)[a];
629 638
              }
630 639
            } else if (next_bucket > (*_bucket)[v]) {
631 640
              next_bucket = (*_bucket)[v];
632 641
            }
633 642
          }
634 643

	
635 644
          for (OutArcIt a(_graph, n); a != INVALID; ++a) {
636 645
            Node v = _graph.target(a);
637 646
            if (_dormant[(*_bucket)[v]]) continue;
638 647
            Value rem = (*_flow)[a];
639 648
            if (!_tolerance.positive(rem)) continue;
640 649
            if ((*_bucket)[v] == under_bucket) {
641 650
              if (!(*_active)[v] && v != target) {
642 651
                activate(v);
643 652
              }
644 653
              if (!_tolerance.less(rem, excess)) {
645
                _flow->set(a, (*_flow)[a] - excess);
646
                _excess->set(v, (*_excess)[v] + excess);
654
                (*_flow)[a] -= excess;
655
                (*_excess)[v] += excess;
647 656
                excess = 0;
648 657
                goto no_more_push;
649 658
              } else {
650 659
                excess -= rem;
651
                _excess->set(v, (*_excess)[v] + rem);
652
                _flow->set(a, 0);
660
                (*_excess)[v] += rem;
661
                (*_flow)[a] = 0;
653 662
              }
654 663
            } else if (next_bucket > (*_bucket)[v]) {
655 664
              next_bucket = (*_bucket)[v];
656 665
            }
657 666
          }
658 667

	
659 668
        no_more_push:
660 669

	
661
          _excess->set(n, excess);
670
          (*_excess)[n] = excess;
662 671

	
663 672
          if (excess != 0) {
664 673
            if ((*_next)[n] == INVALID) {
665 674
              typename std::list<std::list<int> >::iterator new_set =
666 675
                _sets.insert(--_sets.end(), std::list<int>());
667 676
              new_set->splice(new_set->end(), _sets.back(),
668 677
                              _sets.back().begin(), ++_highest);
669 678
              for (std::list<int>::iterator it = new_set->begin();
670 679
                   it != new_set->end(); ++it) {
671 680
                _dormant[*it] = true;
672 681
              }
673 682
              while (_highest != _sets.back().end() &&
674 683
                     !(*_active)[_first[*_highest]]) {
675 684
                ++_highest;
676 685
              }
677 686
            } else if (next_bucket == _node_num) {
678 687
              _first[(*_bucket)[n]] = (*_next)[n];
679
              _prev->set((*_next)[n], INVALID);
688
              (*_prev)[(*_next)[n]] = INVALID;
680 689

	
681 690
              std::list<std::list<int> >::iterator new_set =
682 691
                _sets.insert(--_sets.end(), std::list<int>());
683 692

	
684 693
              new_set->push_front(bucket_num);
685
              _bucket->set(n, bucket_num);
694
              (*_bucket)[n] = bucket_num;
686 695
              _first[bucket_num] = _last[bucket_num] = n;
687
              _next->set(n, INVALID);
688
              _prev->set(n, INVALID);
696
              (*_next)[n] = INVALID;
697
              (*_prev)[n] = INVALID;
689 698
              _dormant[bucket_num] = true;
690 699
              ++bucket_num;
691 700

	
692 701
              while (_highest != _sets.back().end() &&
693 702
                     !(*_active)[_first[*_highest]]) {
694 703
                ++_highest;
695 704
              }
696 705
            } else {
697 706
              _first[*_highest] = (*_next)[n];
698
              _prev->set((*_next)[n], INVALID);
707
              (*_prev)[(*_next)[n]] = INVALID;
699 708

	
700 709
              while (next_bucket != *_highest) {
701 710
                --_highest;
702 711
              }
703 712
              if (_highest == _sets.back().begin()) {
704 713
                _sets.back().push_front(bucket_num);
705 714
                _dormant[bucket_num] = false;
706 715
                _first[bucket_num] = _last[bucket_num] = INVALID;
707 716
                ++bucket_num;
708 717
              }
709 718
              --_highest;
710 719

	
711
              _bucket->set(n, *_highest);
712
              _next->set(n, _first[*_highest]);
720
              (*_bucket)[n] = *_highest;
721
              (*_next)[n] = _first[*_highest];
713 722
              if (_first[*_highest] != INVALID) {
714
                _prev->set(_first[*_highest], n);
723
                (*_prev)[_first[*_highest]] = n;
715 724
              } else {
716 725
                _last[*_highest] = n;
717 726
              }
718 727
              _first[*_highest] = n;
719 728
            }
720 729
          } else {
721 730

	
722 731
            deactivate(n);
723 732
            if (!(*_active)[_first[*_highest]]) {
724 733
              ++_highest;
725 734
              if (_highest != _sets.back().end() &&
726 735
                  !(*_active)[_first[*_highest]]) {
727 736
                _highest = _sets.back().end();
728 737
              }
729 738
            }
730 739
          }
731 740
        }
732 741

	
733 742
        if ((*_excess)[target] < _min_cut) {
734 743
          _min_cut = (*_excess)[target];
735 744
          for (NodeIt i(_graph); i != INVALID; ++i) {
736
            _min_cut_map->set(i, false);
745
            (*_min_cut_map)[i] = false;
737 746
          }
738 747
          for (std::list<int>::iterator it = _sets.back().begin();
739 748
               it != _sets.back().end(); ++it) {
740 749
            Node n = _first[*it];
741 750
            while (n != INVALID) {
742
              _min_cut_map->set(n, true);
751
              (*_min_cut_map)[n] = true;
743 752
              n = (*_next)[n];
744 753
            }
745 754
          }
746 755
        }
747 756

	
748 757
        {
749 758
          Node new_target;
750 759
          if ((*_prev)[target] != INVALID || (*_next)[target] != INVALID) {
751 760
            if ((*_next)[target] == INVALID) {
752 761
              _last[(*_bucket)[target]] = (*_prev)[target];
753 762
              new_target = (*_prev)[target];
754 763
            } else {
755
              _prev->set((*_next)[target], (*_prev)[target]);
764
              (*_prev)[(*_next)[target]] = (*_prev)[target];
756 765
              new_target = (*_next)[target];
757 766
            }
758 767
            if ((*_prev)[target] == INVALID) {
759 768
              _first[(*_bucket)[target]] = (*_next)[target];
760 769
            } else {
761
              _next->set((*_prev)[target], (*_next)[target]);
770
              (*_next)[(*_prev)[target]] = (*_next)[target];
762 771
            }
763 772
          } else {
764 773
            _sets.back().pop_back();
765 774
            if (_sets.back().empty()) {
766 775
              _sets.pop_back();
767 776
              if (_sets.empty())
768 777
                break;
769 778
              for (std::list<int>::iterator it = _sets.back().begin();
770 779
                   it != _sets.back().end(); ++it) {
771 780
                _dormant[*it] = false;
772 781
              }
773 782
            }
774 783
            new_target = _last[_sets.back().back()];
775 784
          }
776 785

	
777
          _bucket->set(target, 0);
786
          (*_bucket)[target] = 0;
778 787

	
779
          _source_set->set(target, true);
788
          (*_source_set)[target] = true;
780 789
          for (InArcIt a(_graph, target); a != INVALID; ++a) {
781 790
            Value rem = (*_capacity)[a] - (*_flow)[a];
782 791
            if (!_tolerance.positive(rem)) continue;
783 792
            Node v = _graph.source(a);
784 793
            if (!(*_active)[v] && !(*_source_set)[v]) {
785 794
              activate(v);
786 795
            }
787
            _excess->set(v, (*_excess)[v] + rem);
788
            _flow->set(a, (*_capacity)[a]);
796
            (*_excess)[v] += rem;
797
            (*_flow)[a] = (*_capacity)[a];
789 798
          }
790 799

	
791 800
          for (OutArcIt a(_graph, target); a != INVALID; ++a) {
792 801
            Value rem = (*_flow)[a];
793 802
            if (!_tolerance.positive(rem)) continue;
794 803
            Node v = _graph.target(a);
795 804
            if (!(*_active)[v] && !(*_source_set)[v]) {
796 805
              activate(v);
797 806
            }
798
            _excess->set(v, (*_excess)[v] + rem);
799
            _flow->set(a, 0);
807
            (*_excess)[v] += rem;
808
            (*_flow)[a] = 0;
800 809
          }
801 810

	
802 811
          target = new_target;
803 812
          if ((*_active)[target]) {
804 813
            deactivate(target);
805 814
          }
806 815

	
807 816
          _highest = _sets.back().begin();
808 817
          while (_highest != _sets.back().end() &&
809 818
                 !(*_active)[_first[*_highest]]) {
810 819
            ++_highest;
811 820
          }
812 821
        }
813 822
      }
814 823
    }
815 824

	
816 825
  public:
817 826

	
818
    /// \name Execution control
827
    /// \name Execution Control
819 828
    /// The simplest way to execute the algorithm is to use
820 829
    /// one of the member functions called \ref run().
821 830
    /// \n
822
    /// If you need more control on the execution,
823
    /// first you must call \ref init(), then the \ref calculateIn() or
824
    /// \ref calculateOut() functions.
831
    /// If you need better control on the execution,
832
    /// you have to call one of the \ref init() functions first, then
833
    /// \ref calculateOut() and/or \ref calculateIn().
825 834

	
826 835
    /// @{
827 836

	
828
    /// \brief Initializes the internal data structures.
837
    /// \brief Initialize the internal data structures.
829 838
    ///
830
    /// Initializes the internal data structures. It creates
831
    /// the maps, residual graph adaptors and some bucket structures
832
    /// for the algorithm.
839
    /// This function initializes the internal data structures. It creates
840
    /// the maps and some bucket structures for the algorithm.
841
    /// The first node is used as the source node for the push-relabel
842
    /// algorithm.
833 843
    void init() {
834 844
      init(NodeIt(_graph));
835 845
    }
836 846

	
837
    /// \brief Initializes the internal data structures.
847
    /// \brief Initialize the internal data structures.
838 848
    ///
839
    /// Initializes the internal data structures. It creates
840
    /// the maps, residual graph adaptor and some bucket structures
841
    /// for the algorithm. Node \c source  is used as the push-relabel
842
    /// algorithm's source.
849
    /// This function initializes the internal data structures. It creates
850
    /// the maps and some bucket structures for the algorithm. 
851
    /// The given node is used as the source node for the push-relabel
852
    /// algorithm.
843 853
    void init(const Node& source) {
844 854
      _source = source;
845 855

	
846 856
      _node_num = countNodes(_graph);
847 857

	
848 858
      _first.resize(_node_num);
849 859
      _last.resize(_node_num);
850 860

	
851 861
      _dormant.resize(_node_num);
852 862

	
853 863
      if (!_flow) {
854 864
        _flow = new FlowMap(_graph);
... ...
@@ -870,97 +880,109 @@
870 880
      }
871 881
      if (!_source_set) {
872 882
        _source_set = new SourceSetMap(_graph);
873 883
      }
874 884
      if (!_min_cut_map) {
875 885
        _min_cut_map = new MinCutMap(_graph);
876 886
      }
877 887

	
878 888
      _min_cut = std::numeric_limits<Value>::max();
879 889
    }
880 890

	
881 891

	
882
    /// \brief Calculates a minimum cut with \f$ source \f$ on the
892
    /// \brief Calculate a minimum cut with \f$ source \f$ on the
883 893
    /// source-side.
884 894
    ///
885
    /// Calculates a minimum cut with \f$ source \f$ on the
895
    /// This function calculates a minimum cut with \f$ source \f$ on the
886 896
    /// source-side (i.e. a set \f$ X\subsetneq V \f$ with
887
    /// \f$ source \in X \f$ and minimal out-degree).
897
    /// \f$ source \in X \f$ and minimal outgoing capacity).
898
    ///
899
    /// \pre \ref init() must be called before using this function.
888 900
    void calculateOut() {
889 901
      findMinCutOut();
890 902
    }
891 903

	
892
    /// \brief Calculates a minimum cut with \f$ source \f$ on the
893
    /// target-side.
904
    /// \brief Calculate a minimum cut with \f$ source \f$ on the
905
    /// sink-side.
894 906
    ///
895
    /// Calculates a minimum cut with \f$ source \f$ on the
896
    /// target-side (i.e. a set \f$ X\subsetneq V \f$ with
897
    /// \f$ source \in X \f$ and minimal out-degree).
907
    /// This function calculates a minimum cut with \f$ source \f$ on the
908
    /// sink-side (i.e. a set \f$ X\subsetneq V \f$ with
909
    /// \f$ source \notin X \f$ and minimal outgoing capacity).
910
    ///
911
    /// \pre \ref init() must be called before using this function.
898 912
    void calculateIn() {
899 913
      findMinCutIn();
900 914
    }
901 915

	
902 916

	
903
    /// \brief Runs the algorithm.
917
    /// \brief Run the algorithm.
904 918
    ///
905
    /// Runs the algorithm. It finds nodes \c source and \c target
906
    /// arbitrarily and then calls \ref init(), \ref calculateOut()
919
    /// This function runs the algorithm. It finds nodes \c source and
920
    /// \c target arbitrarily and then calls \ref init(), \ref calculateOut()
907 921
    /// and \ref calculateIn().
908 922
    void run() {
909 923
      init();
910 924
      calculateOut();
911 925
      calculateIn();
912 926
    }
913 927

	
914
    /// \brief Runs the algorithm.
928
    /// \brief Run the algorithm.
915 929
    ///
916
    /// Runs the algorithm. It uses the given \c source node, finds a
917
    /// proper \c target and then calls the \ref init(), \ref
918
    /// calculateOut() and \ref calculateIn().
930
    /// This function runs the algorithm. It uses the given \c source node, 
931
    /// finds a proper \c target node and then calls the \ref init(),
932
    /// \ref calculateOut() and \ref calculateIn().
919 933
    void run(const Node& s) {
920 934
      init(s);
921 935
      calculateOut();
922 936
      calculateIn();
923 937
    }
924 938

	
925 939
    /// @}
926 940

	
927 941
    /// \name Query Functions
928 942
    /// The result of the %HaoOrlin algorithm
929
    /// can be obtained using these functions.
930
    /// \n
931
    /// Before using these functions, either \ref run(), \ref
932
    /// calculateOut() or \ref calculateIn() must be called.
943
    /// can be obtained using these functions.\n
944
    /// \ref run(), \ref calculateOut() or \ref calculateIn() 
945
    /// should be called before using them.
933 946

	
934 947
    /// @{
935 948

	
936
    /// \brief Returns the value of the minimum value cut.
949
    /// \brief Return the value of the minimum cut.
937 950
    ///
938
    /// Returns the value of the minimum value cut.
951
    /// This function returns the value of the minimum cut.
952
    ///
953
    /// \pre \ref run(), \ref calculateOut() or \ref calculateIn() 
954
    /// must be called before using this function.
939 955
    Value minCutValue() const {
940 956
      return _min_cut;
941 957
    }
942 958

	
943 959

	
944
    /// \brief Returns a minimum cut.
960
    /// \brief Return a minimum cut.
945 961
    ///
946
    /// Sets \c nodeMap to the characteristic vector of a minimum
947
    /// value cut: it will give a nonempty set \f$ X\subsetneq V \f$
948
    /// with minimal out-degree (i.e. \c nodeMap will be true exactly
949
    /// for the nodes of \f$ X \f$).  \pre nodeMap should be a
950
    /// bool-valued node-map.
951
    template <typename NodeMap>
952
    Value minCutMap(NodeMap& nodeMap) const {
962
    /// This function sets \c cutMap to the characteristic vector of a
963
    /// minimum value cut: it will give a non-empty set \f$ X\subsetneq V \f$
964
    /// with minimal outgoing capacity (i.e. \c cutMap will be \c true exactly
965
    /// for the nodes of \f$ X \f$).
966
    ///
967
    /// \param cutMap A \ref concepts::WriteMap "writable" node map with
968
    /// \c bool (or convertible) value type.
969
    ///
970
    /// \return The value of the minimum cut.
971
    ///
972
    /// \pre \ref run(), \ref calculateOut() or \ref calculateIn() 
973
    /// must be called before using this function.
974
    template <typename CutMap>
975
    Value minCutMap(CutMap& cutMap) const {
953 976
      for (NodeIt it(_graph); it != INVALID; ++it) {
954
        nodeMap.set(it, (*_min_cut_map)[it]);
977
        cutMap.set(it, (*_min_cut_map)[it]);
955 978
      }
956 979
      return _min_cut;
957 980
    }
958 981

	
959 982
    /// @}
960 983

	
961 984
  }; //class HaoOrlin
962 985

	
963

	
964 986
} //namespace lemon
965 987

	
966 988
#endif //LEMON_HAO_ORLIN_H
Ignore white space 6 line context
... ...
@@ -283,27 +283,25 @@
283 283
  /// \brief Hypercube graph class
284 284
  ///
285 285
  /// This class implements a special graph type. The nodes of the graph
286 286
  /// are indiced with integers with at most \c dim binary digits.
287 287
  /// Two nodes are connected in the graph if and only if their indices
288 288
  /// differ only on one position in the binary form.
289 289
  ///
290 290
  /// \note The type of the indices is chosen to \c int for efficiency
291 291
  /// reasons. Thus the maximum dimension of this implementation is 26
292 292
  /// (assuming that the size of \c int is 32 bit).
293 293
  ///
294 294
  /// This graph type fully conforms to the \ref concepts::Graph
295
  /// "Graph" concept, and it also has an important extra feature
296
  /// that its maps are real \ref concepts::ReferenceMap
297
  /// "reference map"s.
295
  /// "Graph concept".
298 296
  class HypercubeGraph : public ExtendedHypercubeGraphBase {
299 297
  public:
300 298

	
301 299
    typedef ExtendedHypercubeGraphBase Parent;
302 300

	
303 301
    /// \brief Constructs a hypercube graph with \c dim dimensions.
304 302
    ///
305 303
    /// Constructs a hypercube graph with \c dim dimensions.
306 304
    HypercubeGraph(int dim) { construct(dim); }
307 305

	
308 306
    /// \brief The number of dimensions.
309 307
    ///
Ignore white space 6 line context
... ...
@@ -239,51 +239,51 @@
239 239
    {
240 240
      typedef typename In::value_type::second_type Value;
241 241

	
242 242
      static Value kruskal(const Graph& graph, const In& in, Out& out) {
243 243
        return _kruskal_bits::kruskal(graph, in, out);
244 244
      }
245 245
    };
246 246

	
247 247
  }
248 248

	
249 249
  /// \ingroup spantree
250 250
  ///
251
  /// \brief Kruskal algorithm to find a minimum cost spanning tree of
251
  /// \brief Kruskal's algorithm for finding a minimum cost spanning tree of
252 252
  /// a graph.
253 253
  ///
254 254
  /// This function runs Kruskal's algorithm to find a minimum cost
255
  /// spanning tree.
255
  /// spanning tree of a graph.
256 256
  /// Due to some C++ hacking, it accepts various input and output types.
257 257
  ///
258 258
  /// \param g The graph the algorithm runs on.
259 259
  /// It can be either \ref concepts::Digraph "directed" or
260 260
  /// \ref concepts::Graph "undirected".
261 261
  /// If the graph is directed, the algorithm consider it to be
262 262
  /// undirected by disregarding the direction of the arcs.
263 263
  ///
264 264
  /// \param in This object is used to describe the arc/edge costs.
265 265
  /// It can be one of the following choices.
266 266
  /// - An STL compatible 'Forward Container' with
267
  /// <tt>std::pair<GR::Arc,X></tt> or
268
  /// <tt>std::pair<GR::Edge,X></tt> as its <tt>value_type</tt>, where
269
  /// \c X is the type of the costs. The pairs indicates the arcs/edges
267
  /// <tt>std::pair<GR::Arc,C></tt> or
268
  /// <tt>std::pair<GR::Edge,C></tt> as its <tt>value_type</tt>, where
269
  /// \c C is the type of the costs. The pairs indicates the arcs/edges
270 270
  /// along with the assigned cost. <em>They must be in a
271 271
  /// cost-ascending order.</em>
272 272
  /// - Any readable arc/edge map. The values of the map indicate the
273 273
  /// arc/edge costs.
274 274
  ///
275 275
  /// \retval out Here we also have a choice.
276
  /// - It can be a writable \c bool arc/edge map. After running the
277
  /// algorithm it will contain the found minimum cost spanning
276
  /// - It can be a writable arc/edge map with \c bool value type. After
277
  /// running the algorithm it will contain the found minimum cost spanning
278 278
  /// tree: the value of an arc/edge will be set to \c true if it belongs
279 279
  /// to the tree, otherwise it will be set to \c false. The value of
280 280
  /// each arc/edge will be set exactly once.
281 281
  /// - It can also be an iteraror of an STL Container with
282 282
  /// <tt>GR::Arc</tt> or <tt>GR::Edge</tt> as its
283 283
  /// <tt>value_type</tt>.  The algorithm copies the elements of the
284 284
  /// found tree into this sequence.  For example, if we know that the
285 285
  /// spanning tree of the graph \c g has say 53 arcs, then we can
286 286
  /// put its arcs into an STL vector \c tree with a code like this.
287 287
  ///\code
288 288
  /// std::vector<Arc> tree(53);
289 289
  /// kruskal(g,cost,tree.begin());
... ...
@@ -292,38 +292,36 @@
292 292
  /// write this.
293 293
  ///\code
294 294
  /// std::vector<Arc> tree;
295 295
  /// kruskal(g,cost,std::back_inserter(tree));
296 296
  ///\endcode
297 297
  ///
298 298
  /// \return The total cost of the found spanning tree.
299 299
  ///
300 300
  /// \note If the input graph is not (weakly) connected, a spanning
301 301
  /// forest is calculated instead of a spanning tree.
302 302

	
303 303
#ifdef DOXYGEN
304
  template <class Graph, class In, class Out>
305
  Value kruskal(GR const& g, const In& in, Out& out)
304
  template <typename Graph, typename In, typename Out>
305
  Value kruskal(const Graph& g, const In& in, Out& out)
306 306
#else
307 307
  template <class Graph, class In, class Out>
308 308
  inline typename _kruskal_bits::KruskalValueSelector<In>::Value
309 309
  kruskal(const Graph& graph, const In& in, Out& out)
310 310
#endif
311 311
  {
312 312
    return _kruskal_bits::KruskalInputSelector<Graph, In, Out>::
313 313
      kruskal(graph, in, out);
314 314
  }
315 315

	
316 316

	
317

	
318

	
319 317
  template <class Graph, class In, class Out>
320 318
  inline typename _kruskal_bits::KruskalValueSelector<In>::Value
321 319
  kruskal(const Graph& graph, const In& in, const Out& out)
322 320
  {
323 321
    return _kruskal_bits::KruskalInputSelector<Graph, In, const Out>::
324 322
      kruskal(graph, in, out);
325 323
  }
326 324

	
327 325
} //namespace lemon
328 326

	
329 327
#endif //LEMON_KRUSKAL_H
Ignore white space 6 line context
... ...
@@ -583,25 +583,25 @@
583 583
      _attributes.swap(other._attributes);
584 584

	
585 585
      _nodes_caption = other._nodes_caption;
586 586
      _arcs_caption = other._arcs_caption;
587 587
      _attributes_caption = other._attributes_caption;
588 588

	
589 589
    }
590 590

	
591 591
    DigraphReader& operator=(const DigraphReader&);
592 592

	
593 593
  public:
594 594

	
595
    /// \name Reading rules
595
    /// \name Reading Rules
596 596
    /// @{
597 597

	
598 598
    /// \brief Node map reading rule
599 599
    ///
600 600
    /// Add a node map reading rule to the reader.
601 601
    template <typename Map>
602 602
    DigraphReader& nodeMap(const std::string& caption, Map& map) {
603 603
      checkConcept<concepts::WriteMap<Node, typename Map::Value>, Map>();
604 604
      _reader_bits::MapStorageBase<Node>* storage =
605 605
        new _reader_bits::MapStorage<Node, Map>(map);
606 606
      _node_maps.push_back(std::make_pair(caption, storage));
607 607
      return *this;
... ...
@@ -688,25 +688,25 @@
688 688
    /// Add an arc reading rule to reader.
689 689
    DigraphReader& arc(const std::string& caption, Arc& arc) {
690 690
      typedef _reader_bits::MapLookUpConverter<Arc> Converter;
691 691
      Converter converter(_arc_index);
692 692
      _reader_bits::ValueStorageBase* storage =
693 693
        new _reader_bits::ValueStorage<Arc, Converter>(arc, converter);
694 694
      _attributes.insert(std::make_pair(caption, storage));
695 695
      return *this;
696 696
    }
697 697

	
698 698
    /// @}
699 699

	
700
    /// \name Select section by name
700
    /// \name Select Section by Name
701 701
    /// @{
702 702

	
703 703
    /// \brief Set \c \@nodes section to be read
704 704
    ///
705 705
    /// Set \c \@nodes section to be read
706 706
    DigraphReader& nodes(const std::string& caption) {
707 707
      _nodes_caption = caption;
708 708
      return *this;
709 709
    }
710 710

	
711 711
    /// \brief Set \c \@arcs section to be read
712 712
    ///
... ...
@@ -717,25 +717,25 @@
717 717
    }
718 718

	
719 719
    /// \brief Set \c \@attributes section to be read
720 720
    ///
721 721
    /// Set \c \@attributes section to be read
722 722
    DigraphReader& attributes(const std::string& caption) {
723 723
      _attributes_caption = caption;
724 724
      return *this;
725 725
    }
726 726

	
727 727
    /// @}
728 728

	
729
    /// \name Using previously constructed node or arc set
729
    /// \name Using Previously Constructed Node or Arc Set
730 730
    /// @{
731 731

	
732 732
    /// \brief Use previously constructed node set
733 733
    ///
734 734
    /// Use previously constructed node set, and specify the node
735 735
    /// label map.
736 736
    template <typename Map>
737 737
    DigraphReader& useNodes(const Map& map) {
738 738
      checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
739 739
      LEMON_ASSERT(!_use_nodes, "Multiple usage of useNodes() member");
740 740
      _use_nodes = true;
741 741
      _writer_bits::DefaultConverter<typename Map::Value> converter;
... ...
@@ -1106,25 +1106,25 @@
1106 1106
      for (typename Attributes::iterator it = _attributes.begin();
1107 1107
           it != _attributes.end(); ++it) {
1108 1108
        if (read_attr.find(it->first) == read_attr.end()) {
1109 1109
          std::ostringstream msg;
1110 1110
          msg << "Attribute not found: " << it->first;
1111 1111
          throw FormatError(msg.str());
1112 1112
        }
1113 1113
      }
1114 1114
    }
1115 1115

	
1116 1116
  public:
1117 1117

	
1118
    /// \name Execution of the reader
1118
    /// \name Execution of the Reader
1119 1119
    /// @{
1120 1120

	
1121 1121
    /// \brief Start the batch processing
1122 1122
    ///
1123 1123
    /// This function starts the batch processing
1124 1124
    void run() {
1125 1125
      LEMON_ASSERT(_is != 0, "This reader assigned to an other reader");
1126 1126

	
1127 1127
      bool nodes_done = _skip_nodes;
1128 1128
      bool arcs_done = _skip_arcs;
1129 1129
      bool attributes_done = false;
1130 1130

	
... ...
@@ -1406,25 +1406,25 @@
1406 1406
      _attributes.swap(other._attributes);
1407 1407

	
1408 1408
      _nodes_caption = other._nodes_caption;
1409 1409
      _edges_caption = other._edges_caption;
1410 1410
      _attributes_caption = other._attributes_caption;
1411 1411

	
1412 1412
    }
1413 1413

	
1414 1414
    GraphReader& operator=(const GraphReader&);
1415 1415

	
1416 1416
  public:
1417 1417

	
1418
    /// \name Reading rules
1418
    /// \name Reading Rules
1419 1419
    /// @{
1420 1420

	
1421 1421
    /// \brief Node map reading rule
1422 1422
    ///
1423 1423
    /// Add a node map reading rule to the reader.
1424 1424
    template <typename Map>
1425 1425
    GraphReader& nodeMap(const std::string& caption, Map& map) {
1426 1426
      checkConcept<concepts::WriteMap<Node, typename Map::Value>, Map>();
1427 1427
      _reader_bits::MapStorageBase<Node>* storage =
1428 1428
        new _reader_bits::MapStorage<Node, Map>(map);
1429 1429
      _node_maps.push_back(std::make_pair(caption, storage));
1430 1430
      return *this;
... ...
@@ -1557,25 +1557,25 @@
1557 1557
    /// Add an arc reading rule to reader.
1558 1558
    GraphReader& arc(const std::string& caption, Arc& arc) {
1559 1559
      typedef _reader_bits::GraphArcLookUpConverter<GR> Converter;
1560 1560
      Converter converter(_graph, _edge_index);
1561 1561
      _reader_bits::ValueStorageBase* storage =
1562 1562
        new _reader_bits::ValueStorage<Arc, Converter>(arc, converter);
1563 1563
      _attributes.insert(std::make_pair(caption, storage));
1564 1564
      return *this;
1565 1565
    }
1566 1566

	
1567 1567
    /// @}
1568 1568

	
1569
    /// \name Select section by name
1569
    /// \name Select Section by Name
1570 1570
    /// @{
1571 1571

	
1572 1572
    /// \brief Set \c \@nodes section to be read
1573 1573
    ///
1574 1574
    /// Set \c \@nodes section to be read.
1575 1575
    GraphReader& nodes(const std::string& caption) {
1576 1576
      _nodes_caption = caption;
1577 1577
      return *this;
1578 1578
    }
1579 1579

	
1580 1580
    /// \brief Set \c \@edges section to be read
1581 1581
    ///
... ...
@@ -1586,25 +1586,25 @@
1586 1586
    }
1587 1587

	
1588 1588
    /// \brief Set \c \@attributes section to be read
1589 1589
    ///
1590 1590
    /// Set \c \@attributes section to be read.
1591 1591
    GraphReader& attributes(const std::string& caption) {
1592 1592
      _attributes_caption = caption;
1593 1593
      return *this;
1594 1594
    }
1595 1595

	
1596 1596
    /// @}
1597 1597

	
1598
    /// \name Using previously constructed node or edge set
1598
    /// \name Using Previously Constructed Node or Edge Set
1599 1599
    /// @{
1600 1600

	
1601 1601
    /// \brief Use previously constructed node set
1602 1602
    ///
1603 1603
    /// Use previously constructed node set, and specify the node
1604 1604
    /// label map.
1605 1605
    template <typename Map>
1606 1606
    GraphReader& useNodes(const Map& map) {
1607 1607
      checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
1608 1608
      LEMON_ASSERT(!_use_nodes, "Multiple usage of useNodes() member");
1609 1609
      _use_nodes = true;
1610 1610
      _writer_bits::DefaultConverter<typename Map::Value> converter;
... ...
@@ -1976,25 +1976,25 @@
1976 1976
      for (typename Attributes::iterator it = _attributes.begin();
1977 1977
           it != _attributes.end(); ++it) {
1978 1978
        if (read_attr.find(it->first) == read_attr.end()) {
1979 1979
          std::ostringstream msg;
1980 1980
          msg << "Attribute not found: " << it->first;
1981 1981
          throw FormatError(msg.str());
1982 1982
        }
1983 1983
      }
1984 1984
    }
1985 1985

	
1986 1986
  public:
1987 1987

	
1988
    /// \name Execution of the reader
1988
    /// \name Execution of the Reader
1989 1989
    /// @{
1990 1990

	
1991 1991
    /// \brief Start the batch processing
1992 1992
    ///
1993 1993
    /// This function starts the batch processing
1994 1994
    void run() {
1995 1995

	
1996 1996
      LEMON_ASSERT(_is != 0, "This reader assigned to an other reader");
1997 1997

	
1998 1998
      bool nodes_done = _skip_nodes;
1999 1999
      bool edges_done = _skip_edges;
2000 2000
      bool attributes_done = false;
... ...
@@ -2200,25 +2200,25 @@
2200 2200
      : _is(other._is), local_is(other.local_is) {
2201 2201

	
2202 2202
      other._is = 0;
2203 2203
      other.local_is = false;
2204 2204

	
2205 2205
      _sections.swap(other._sections);
2206 2206
    }
2207 2207

	
2208 2208
    SectionReader& operator=(const SectionReader&);
2209 2209

	
2210 2210
  public:
2211 2211

	
2212
    /// \name Section readers
2212
    /// \name Section Readers
2213 2213
    /// @{
2214 2214

	
2215 2215
    /// \brief Add a section processor with line oriented reading
2216 2216
    ///
2217 2217
    /// The first parameter is the type descriptor of the section, the
2218 2218
    /// second is a functor, which takes just one \c std::string
2219 2219
    /// parameter. At the reading process, each line of the section
2220 2220
    /// will be given to the functor object. However, the empty lines
2221 2221
    /// and the comment lines are filtered out, and the leading
2222 2222
    /// whitespaces are trimmed from each processed string.
2223 2223
    ///
2224 2224
    /// For example let's see a section, which contain several
... ...
@@ -2299,25 +2299,25 @@
2299 2299
      char c;
2300 2300
      while (readSuccess() && line >> c && c != '@') {
2301 2301
        readLine();
2302 2302
      }
2303 2303
      if (readSuccess()) {
2304 2304
        line.putback(c);
2305 2305
      }
2306 2306
    }
2307 2307

	
2308 2308
  public:
2309 2309

	
2310 2310

	
2311
    /// \name Execution of the reader
2311
    /// \name Execution of the Reader
2312 2312
    /// @{
2313 2313

	
2314 2314
    /// \brief Start the batch processing
2315 2315
    ///
2316 2316
    /// This function starts the batch processing.
2317 2317
    void run() {
2318 2318

	
2319 2319
      LEMON_ASSERT(_is != 0, "This reader assigned to an other reader");
2320 2320

	
2321 2321
      std::set<std::string> extra_sections;
2322 2322

	
2323 2323
      line_num = 0;
... ...
@@ -2491,25 +2491,25 @@
2491 2491
    ~LgfContents() {
2492 2492
      if (local_is) delete _is;
2493 2493
    }
2494 2494

	
2495 2495
  private:
2496 2496

	
2497 2497
    LgfContents(const LgfContents&);
2498 2498
    LgfContents& operator=(const LgfContents&);
2499 2499

	
2500 2500
  public:
2501 2501

	
2502 2502

	
2503
    /// \name Node sections
2503
    /// \name Node Sections
2504 2504
    /// @{
2505 2505

	
2506 2506
    /// \brief Gives back the number of node sections in the file.
2507 2507
    ///
2508 2508
    /// Gives back the number of node sections in the file.
2509 2509
    int nodeSectionNum() const {
2510 2510
      return _node_sections.size();
2511 2511
    }
2512 2512

	
2513 2513
    /// \brief Returns the node section name at the given position.
2514 2514
    ///
2515 2515
    /// Returns the node section name at the given position.
... ...
@@ -2517,25 +2517,25 @@
2517 2517
      return _node_sections[i];
2518 2518
    }
2519 2519

	
2520 2520
    /// \brief Gives back the node maps for the given section.
2521 2521
    ///
2522 2522
    /// Gives back the node maps for the given section.
2523 2523
    const std::vector<std::string>& nodeMapNames(int i) const {
2524 2524
      return _node_maps[i];
2525 2525
    }
2526 2526

	
2527 2527
    /// @}
2528 2528

	
2529
    /// \name Arc/Edge sections
2529
    /// \name Arc/Edge Sections
2530 2530
    /// @{
2531 2531

	
2532 2532
    /// \brief Gives back the number of arc/edge sections in the file.
2533 2533
    ///
2534 2534
    /// Gives back the number of arc/edge sections in the file.
2535 2535
    /// \note It is synonym of \c edgeSectionNum().
2536 2536
    int arcSectionNum() const {
2537 2537
      return _edge_sections.size();
2538 2538
    }
2539 2539

	
2540 2540
    /// \brief Returns the arc/edge section name at the given position.
2541 2541
    ///
... ...
@@ -2575,25 +2575,25 @@
2575 2575
    }
2576 2576

	
2577 2577
    /// \brief Gives back the edge maps for the given section.
2578 2578
    ///
2579 2579
    /// Gives back the edge maps for the given section.
2580 2580
    /// \note It is synonym of \c arcMapNames().
2581 2581
    const std::vector<std::string>& edgeMapNames(int i) const {
2582 2582
      return _edge_maps[i];
2583 2583
    }
2584 2584

	
2585 2585
    /// @}
2586 2586

	
2587
    /// \name Attribute sections
2587
    /// \name Attribute Sections
2588 2588
    /// @{
2589 2589

	
2590 2590
    /// \brief Gives back the number of attribute sections in the file.
2591 2591
    ///
2592 2592
    /// Gives back the number of attribute sections in the file.
2593 2593
    int attributeSectionNum() const {
2594 2594
      return _attribute_sections.size();
2595 2595
    }
2596 2596

	
2597 2597
    /// \brief Returns the attribute section name at the given position.
2598 2598
    ///
2599 2599
    /// Returns the attribute section name at the given position.
... ...
@@ -2601,25 +2601,25 @@
2601 2601
      return _attribute_sections[i];
2602 2602
    }
2603 2603

	
2604 2604
    /// \brief Gives back the attributes for the given section.
2605 2605
    ///
2606 2606
    /// Gives back the attributes for the given section.
2607 2607
    const std::vector<std::string>& attributes(int i) const {
2608 2608
      return _attributes[i];
2609 2609
    }
2610 2610

	
2611 2611
    /// @}
2612 2612

	
2613
    /// \name Extra sections
2613
    /// \name Extra Sections
2614 2614
    /// @{
2615 2615

	
2616 2616
    /// \brief Gives back the number of extra sections in the file.
2617 2617
    ///
2618 2618
    /// Gives back the number of extra sections in the file.
2619 2619
    int extraSectionNum() const {
2620 2620
      return _extra_sections.size();
2621 2621
    }
2622 2622

	
2623 2623
    /// \brief Returns the extra section type at the given position.
2624 2624
    ///
2625 2625
    /// Returns the section type at the given position.
... ...
@@ -2677,25 +2677,25 @@
2677 2677
      while (readSuccess() && line >> c && c != '@') {
2678 2678
        line.putback(c);
2679 2679
        std::string attr;
2680 2680
        _reader_bits::readToken(line, attr);
2681 2681
        attrs.push_back(attr);
2682 2682
        readLine();
2683 2683
      }
2684 2684
      line.putback(c);
2685 2685
    }
2686 2686

	
2687 2687
  public:
2688 2688

	
2689
    /// \name Execution of the contents reader
2689
    /// \name Execution of the Contents Reader
2690 2690
    /// @{
2691 2691

	
2692 2692
    /// \brief Starts the reading
2693 2693
    ///
2694 2694
    /// This function starts the reading.
2695 2695
    void run() {
2696 2696

	
2697 2697
      readLine();
2698 2698
      skipSection();
2699 2699

	
2700 2700
      while (readSuccess()) {
2701 2701

	
Ignore white space 6 line context
... ...
@@ -527,25 +527,25 @@
527 527
      _arc_maps.swap(other._arc_maps);
528 528
      _attributes.swap(other._attributes);
529 529

	
530 530
      _nodes_caption = other._nodes_caption;
531 531
      _arcs_caption = other._arcs_caption;
532 532
      _attributes_caption = other._attributes_caption;
533 533
    }
534 534

	
535 535
    DigraphWriter& operator=(const DigraphWriter&);
536 536

	
537 537
  public:
538 538

	
539
    /// \name Writing rules
539
    /// \name Writing Rules
540 540
    /// @{
541 541

	
542 542
    /// \brief Node map writing rule
543 543
    ///
544 544
    /// Add a node map writing rule to the writer.
545 545
    template <typename Map>
546 546
    DigraphWriter& nodeMap(const std::string& caption, const Map& map) {
547 547
      checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
548 548
      _writer_bits::MapStorageBase<Node>* storage =
549 549
        new _writer_bits::MapStorage<Node, Map>(map);
550 550
      _node_maps.push_back(std::make_pair(caption, storage));
551 551
      return *this;
... ...
@@ -630,25 +630,25 @@
630 630
    /// \brief Arc writing rule
631 631
    ///
632 632
    /// Add an arc writing rule to writer.
633 633
    DigraphWriter& arc(const std::string& caption, const Arc& arc) {
634 634
      typedef _writer_bits::MapLookUpConverter<Arc> Converter;
635 635
      Converter converter(_arc_index);
636 636
      _writer_bits::ValueStorageBase* storage =
637 637
        new _writer_bits::ValueStorage<Arc, Converter>(arc, converter);
638 638
      _attributes.push_back(std::make_pair(caption, storage));
639 639
      return *this;
640 640
    }
641 641

	
642
    /// \name Section captions
642
    /// \name Section Captions
643 643
    /// @{
644 644

	
645 645
    /// \brief Add an additional caption to the \c \@nodes section
646 646
    ///
647 647
    /// Add an additional caption to the \c \@nodes section.
648 648
    DigraphWriter& nodes(const std::string& caption) {
649 649
      _nodes_caption = caption;
650 650
      return *this;
651 651
    }
652 652

	
653 653
    /// \brief Add an additional caption to the \c \@arcs section
654 654
    ///
... ...
@@ -657,25 +657,25 @@
657 657
      _arcs_caption = caption;
658 658
      return *this;
659 659
    }
660 660

	
661 661
    /// \brief Add an additional caption to the \c \@attributes section
662 662
    ///
663 663
    /// Add an additional caption to the \c \@attributes section.
664 664
    DigraphWriter& attributes(const std::string& caption) {
665 665
      _attributes_caption = caption;
666 666
      return *this;
667 667
    }
668 668

	
669
    /// \name Skipping section
669
    /// \name Skipping Section
670 670
    /// @{
671 671

	
672 672
    /// \brief Skip writing the node set
673 673
    ///
674 674
    /// The \c \@nodes section will not be written to the stream.
675 675
    DigraphWriter& skipNodes() {
676 676
      LEMON_ASSERT(!_skip_nodes, "Multiple usage of skipNodes() member");
677 677
      _skip_nodes = true;
678 678
      return *this;
679 679
    }
680 680

	
681 681
    /// \brief Skip writing arc set
... ...
@@ -874,25 +874,25 @@
874 874
      }
875 875
      *_os << std::endl;
876 876
      for (typename Attributes::iterator it = _attributes.begin();
877 877
           it != _attributes.end(); ++it) {
878 878
        _writer_bits::writeToken(*_os, it->first) << ' ';
879 879
        _writer_bits::writeToken(*_os, it->second->get());
880 880
        *_os << std::endl;
881 881
      }
882 882
    }
883 883

	
884 884
  public:
885 885

	
886
    /// \name Execution of the writer
886
    /// \name Execution of the Writer
887 887
    /// @{
888 888

	
889 889
    /// \brief Start the batch processing
890 890
    ///
891 891
    /// This function starts the batch processing.
892 892
    void run() {
893 893
      if (!_skip_nodes) {
894 894
        writeNodes();
895 895
      } else {
896 896
        createNodeIndex();
897 897
      }
898 898
      if (!_skip_arcs) {
... ...
@@ -1120,25 +1120,25 @@
1120 1120
      _edge_maps.swap(other._edge_maps);
1121 1121
      _attributes.swap(other._attributes);
1122 1122

	
1123 1123
      _nodes_caption = other._nodes_caption;
1124 1124
      _edges_caption = other._edges_caption;
1125 1125
      _attributes_caption = other._attributes_caption;
1126 1126
    }
1127 1127

	
1128 1128
    GraphWriter& operator=(const GraphWriter&);
1129 1129

	
1130 1130
  public:
1131 1131

	
1132
    /// \name Writing rules
1132
    /// \name Writing Rules
1133 1133
    /// @{
1134 1134

	
1135 1135
    /// \brief Node map writing rule
1136 1136
    ///
1137 1137
    /// Add a node map writing rule to the writer.
1138 1138
    template <typename Map>
1139 1139
    GraphWriter& nodeMap(const std::string& caption, const Map& map) {
1140 1140
      checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
1141 1141
      _writer_bits::MapStorageBase<Node>* storage =
1142 1142
        new _writer_bits::MapStorage<Node, Map>(map);
1143 1143
      _node_maps.push_back(std::make_pair(caption, storage));
1144 1144
      return *this;
... ...
@@ -1269,25 +1269,25 @@
1269 1269
    /// \brief Arc writing rule
1270 1270
    ///
1271 1271
    /// Add an arc writing rule to writer.
1272 1272
    GraphWriter& arc(const std::string& caption, const Arc& arc) {
1273 1273
      typedef _writer_bits::GraphArcLookUpConverter<GR> Converter;
1274 1274
      Converter converter(_graph, _edge_index);
1275 1275
      _writer_bits::ValueStorageBase* storage =
1276 1276
        new _writer_bits::ValueStorage<Arc, Converter>(arc, converter);
1277 1277
      _attributes.push_back(std::make_pair(caption, storage));
1278 1278
      return *this;
1279 1279
    }
1280 1280

	
1281
    /// \name Section captions
1281
    /// \name Section Captions
1282 1282
    /// @{
1283 1283

	
1284 1284
    /// \brief Add an additional caption to the \c \@nodes section
1285 1285
    ///
1286 1286
    /// Add an additional caption to the \c \@nodes section.
1287 1287
    GraphWriter& nodes(const std::string& caption) {
1288 1288
      _nodes_caption = caption;
1289 1289
      return *this;
1290 1290
    }
1291 1291

	
1292 1292
    /// \brief Add an additional caption to the \c \@arcs section
1293 1293
    ///
... ...
@@ -1296,25 +1296,25 @@
1296 1296
      _edges_caption = caption;
1297 1297
      return *this;
1298 1298
    }
1299 1299

	
1300 1300
    /// \brief Add an additional caption to the \c \@attributes section
1301 1301
    ///
1302 1302
    /// Add an additional caption to the \c \@attributes section.
1303 1303
    GraphWriter& attributes(const std::string& caption) {
1304 1304
      _attributes_caption = caption;
1305 1305
      return *this;
1306 1306
    }
1307 1307

	
1308
    /// \name Skipping section
1308
    /// \name Skipping Section
1309 1309
    /// @{
1310 1310

	
1311 1311
    /// \brief Skip writing the node set
1312 1312
    ///
1313 1313
    /// The \c \@nodes section will not be written to the stream.
1314 1314
    GraphWriter& skipNodes() {
1315 1315
      LEMON_ASSERT(!_skip_nodes, "Multiple usage of skipNodes() member");
1316 1316
      _skip_nodes = true;
1317 1317
      return *this;
1318 1318
    }
1319 1319

	
1320 1320
    /// \brief Skip writing edge set
... ...
@@ -1513,25 +1513,25 @@
1513 1513
      }
1514 1514
      *_os << std::endl;
1515 1515
      for (typename Attributes::iterator it = _attributes.begin();
1516 1516
           it != _attributes.end(); ++it) {
1517 1517
        _writer_bits::writeToken(*_os, it->first) << ' ';
1518 1518
        _writer_bits::writeToken(*_os, it->second->get());
1519 1519
        *_os << std::endl;
1520 1520
      }
1521 1521
    }
1522 1522

	
1523 1523
  public:
1524 1524

	
1525
    /// \name Execution of the writer
1525
    /// \name Execution of the Writer
1526 1526
    /// @{
1527 1527

	
1528 1528
    /// \brief Start the batch processing
1529 1529
    ///
1530 1530
    /// This function starts the batch processing.
1531 1531
    void run() {
1532 1532
      if (!_skip_nodes) {
1533 1533
        writeNodes();
1534 1534
      } else {
1535 1535
        createNodeIndex();
1536 1536
      }
1537 1537
      if (!_skip_edges) {
... ...
@@ -1690,25 +1690,25 @@
1690 1690
      : _os(other._os), local_os(other.local_os) {
1691 1691

	
1692 1692
      other._os = 0;
1693 1693
      other.local_os = false;
1694 1694

	
1695 1695
      _sections.swap(other._sections);
1696 1696
    }
1697 1697

	
1698 1698
    SectionWriter& operator=(const SectionWriter&);
1699 1699

	
1700 1700
  public:
1701 1701

	
1702
    /// \name Section writers
1702
    /// \name Section Writers
1703 1703
    /// @{
1704 1704

	
1705 1705
    /// \brief Add a section writer with line oriented writing
1706 1706
    ///
1707 1707
    /// The first parameter is the type descriptor of the section, the
1708 1708
    /// second is a generator with std::string values. At the writing
1709 1709
    /// process, the returned \c std::string will be written into the
1710 1710
    /// output file until it is an empty string.
1711 1711
    ///
1712 1712
    /// For example, an integer vector is written into a section.
1713 1713
    ///\code
1714 1714
    ///  @numbers
... ...
@@ -1757,25 +1757,25 @@
1757 1757
    SectionWriter& sectionStream(const std::string& type, Functor functor) {
1758 1758
      LEMON_ASSERT(!type.empty(), "Type is empty.");
1759 1759
      _sections.push_back(std::make_pair(type,
1760 1760
         new _writer_bits::StreamSection<Functor>(functor)));
1761 1761
      return *this;
1762 1762
    }
1763 1763

	
1764 1764
    /// @}
1765 1765

	
1766 1766
  public:
1767 1767

	
1768 1768

	
1769
    /// \name Execution of the writer
1769
    /// \name Execution of the Writer
1770 1770
    /// @{
1771 1771

	
1772 1772
    /// \brief Start the batch processing
1773 1773
    ///
1774 1774
    /// This function starts the batch processing.
1775 1775
    void run() {
1776 1776

	
1777 1777
      LEMON_ASSERT(_os != 0, "This writer is assigned to an other writer");
1778 1778

	
1779 1779
      for (Sections::iterator it = _sections.begin();
1780 1780
           it != _sections.end(); ++it) {
1781 1781
        (*_os) << '@' << it->first << std::endl;
Ignore white space 6 line context
... ...
@@ -311,27 +311,24 @@
311 311

	
312 312
  ///A general directed graph structure.
313 313

	
314 314
  ///\ref ListDigraph is a simple and fast <em>directed graph</em>
315 315
  ///implementation based on static linked lists that are stored in
316 316
  ///\c std::vector structures.
317 317
  ///
318 318
  ///It conforms to the \ref concepts::Digraph "Digraph concept" and it
319 319
  ///also provides several useful additional functionalities.
320 320
  ///Most of the member functions and nested classes are documented
321 321
  ///only in the concept class.
322 322
  ///
323
  ///An important extra feature of this digraph implementation is that
324
  ///its maps are real \ref concepts::ReferenceMap "reference map"s.
325
  ///
326 323
  ///\sa concepts::Digraph
327 324

	
328 325
  class ListDigraph : public ExtendedListDigraphBase {
329 326
  private:
330 327
    ///ListDigraph is \e not copy constructible. Use copyDigraph() instead.
331 328

	
332 329
    ///ListDigraph is \e not copy constructible. Use copyDigraph() instead.
333 330
    ///
334 331
    ListDigraph(const ListDigraph &) :ExtendedListDigraphBase() {};
335 332
    ///\brief Assignment of ListDigraph to another one is \e not allowed.
336 333
    ///Use copyDigraph() instead.
337 334

	
... ...
@@ -1167,27 +1164,24 @@
1167 1164

	
1168 1165
  ///A general undirected graph structure.
1169 1166

	
1170 1167
  ///\ref ListGraph is a simple and fast <em>undirected graph</em>
1171 1168
  ///implementation based on static linked lists that are stored in
1172 1169
  ///\c std::vector structures.
1173 1170
  ///
1174 1171
  ///It conforms to the \ref concepts::Graph "Graph concept" and it
1175 1172
  ///also provides several useful additional functionalities.
1176 1173
  ///Most of the member functions and nested classes are documented
1177 1174
  ///only in the concept class.
1178 1175
  ///
1179
  ///An important extra feature of this graph implementation is that
1180
  ///its maps are real \ref concepts::ReferenceMap "reference map"s.
1181
  ///
1182 1176
  ///\sa concepts::Graph
1183 1177

	
1184 1178
  class ListGraph : public ExtendedListGraphBase {
1185 1179
  private:
1186 1180
    ///ListGraph is \e not copy constructible. Use copyGraph() instead.
1187 1181

	
1188 1182
    ///ListGraph is \e not copy constructible. Use copyGraph() instead.
1189 1183
    ///
1190 1184
    ListGraph(const ListGraph &) :ExtendedListGraphBase()  {};
1191 1185
    ///\brief Assignment of ListGraph to another one is \e not allowed.
1192 1186
    ///Use copyGraph() instead.
1193 1187

	
Ignore white space 6 line context
... ...
@@ -43,41 +43,56 @@
43 43
  ///\ingroup lp_group
44 44
  class LpBase {
45 45

	
46 46
  protected:
47 47

	
48 48
    _solver_bits::VarIndex rows;
49 49
    _solver_bits::VarIndex cols;
50 50

	
51 51
  public:
52 52

	
53 53
    ///Possible outcomes of an LP solving procedure
54 54
    enum SolveExitStatus {
55
      ///This means that the problem has been successfully solved: either
55
      /// = 0. It means that the problem has been successfully solved: either
56 56
      ///an optimal solution has been found or infeasibility/unboundedness
57 57
      ///has been proved.
58 58
      SOLVED = 0,
59
      ///Any other case (including the case when some user specified
60
      ///limit has been exceeded)
59
      /// = 1. Any other case (including the case when some user specified
60
      ///limit has been exceeded).
61 61
      UNSOLVED = 1
62 62
    };
63 63

	
64 64
    ///Direction of the optimization
65 65
    enum Sense {
66 66
      /// Minimization
67 67
      MIN,
68 68
      /// Maximization
69 69
      MAX
70 70
    };
71 71

	
72
    ///Enum for \c messageLevel() parameter
73
    enum MessageLevel {
74
      /// No output (default value).
75
      MESSAGE_NOTHING,
76
      /// Error messages only.
77
      MESSAGE_ERROR,
78
      /// Warnings.
79
      MESSAGE_WARNING,
80
      /// Normal output.
81
      MESSAGE_NORMAL,
82
      /// Verbose output.
83
      MESSAGE_VERBOSE
84
    };
85
    
86

	
72 87
    ///The floating point type used by the solver
73 88
    typedef double Value;
74 89
    ///The infinity constant
75 90
    static const Value INF;
76 91
    ///The not a number constant
77 92
    static const Value NaN;
78 93

	
79 94
    friend class Col;
80 95
    friend class ColIt;
81 96
    friend class Row;
82 97
    friend class RowIt;
83 98

	
... ...
@@ -964,40 +979,42 @@
964 979
    virtual void _getObjCoeffs(InsertIterator b) const = 0;
965 980

	
966 981
    virtual void _setObjCoeff(int i, Value obj_coef) = 0;
967 982
    virtual Value _getObjCoeff(int i) const = 0;
968 983

	
969 984
    virtual void _setSense(Sense) = 0;
970 985
    virtual Sense _getSense() const = 0;
971 986

	
972 987
    virtual void _clear() = 0;
973 988

	
974 989
    virtual const char* _solverName() const = 0;
975 990

	
991
    virtual void _messageLevel(MessageLevel level) = 0;
992

	
976 993
    //Own protected stuff
977 994

	
978 995
    //Constant component of the objective function
979 996
    Value obj_const_comp;
980 997

	
981 998
    LpBase() : rows(), cols(), obj_const_comp(0) {}
982 999

	
983 1000
  public:
984 1001

	
985 1002
    /// Virtual destructor
986 1003
    virtual ~LpBase() {}
987 1004

	
988 1005
    ///Gives back the name of the solver.
989 1006
    const char* solverName() const {return _solverName();}
990 1007

	
991
    ///\name Build up and modify the LP
1008
    ///\name Build Up and Modify the LP
992 1009

	
993 1010
    ///@{
994 1011

	
995 1012
    ///Add a new empty column (i.e a new variable) to the LP
996 1013
    Col addCol() { Col c; c._id = _addColId(_addCol()); return c;}
997 1014

	
998 1015
    ///\brief Adds several new columns (i.e variables) at once
999 1016
    ///
1000 1017
    ///This magic function takes a container as its argument and fills
1001 1018
    ///its elements with new columns (i.e. variables)
1002 1019
    ///\param t can be
1003 1020
    ///- a standard STL compatible iterable container with
... ...
@@ -1518,24 +1535,27 @@
1518 1535
    ///Query the direction of the optimization
1519 1536
    Sense sense() const {return _getSense(); }
1520 1537

	
1521 1538
    ///Set the sense to maximization
1522 1539
    void max() { _setSense(MAX); }
1523 1540

	
1524 1541
    ///Set the sense to maximization
1525 1542
    void min() { _setSense(MIN); }
1526 1543

	
1527 1544
    ///Clears the problem
1528 1545
    void clear() { _clear(); }
1529 1546

	
1547
    /// Sets the message level of the solver
1548
    void messageLevel(MessageLevel level) { _messageLevel(level); }
1549

	
1530 1550
    ///@}
1531 1551

	
1532 1552
  };
1533 1553

	
1534 1554
  /// Addition
1535 1555

	
1536 1556
  ///\relates LpBase::Expr
1537 1557
  ///
1538 1558
  inline LpBase::Expr operator+(const LpBase::Expr &a, const LpBase::Expr &b) {
1539 1559
    LpBase::Expr tmp(a);
1540 1560
    tmp+=b;
1541 1561
    return tmp;
... ...
@@ -1759,33 +1779,33 @@
1759 1779
  /// This class is an abstract base class for LP solvers. This class
1760 1780
  /// provides a full interface for set and modify an LP problem,
1761 1781
  /// solve it and retrieve the solution. You can use one of the
1762 1782
  /// descendants as a concrete implementation, or the \c Lp
1763 1783
  /// default LP solver. However, if you would like to handle LP
1764 1784
  /// solvers as reference or pointer in a generic way, you can use
1765 1785
  /// this class directly.
1766 1786
  class LpSolver : virtual public LpBase {
1767 1787
  public:
1768 1788

	
1769 1789
    /// The problem types for primal and dual problems
1770 1790
    enum ProblemType {
1771
      ///Feasible solution hasn't been found (but may exist).
1791
      /// = 0. Feasible solution hasn't been found (but may exist).
1772 1792
      UNDEFINED = 0,
1773
      ///The problem has no feasible solution
1793
      /// = 1. The problem has no feasible solution.
1774 1794
      INFEASIBLE = 1,
1775
      ///Feasible solution found
1795
      /// = 2. Feasible solution found.
1776 1796
      FEASIBLE = 2,
1777
      ///Optimal solution exists and found
1797
      /// = 3. Optimal solution exists and found.
1778 1798
      OPTIMAL = 3,
1779
      ///The cost function is unbounded
1799
      /// = 4. The cost function is unbounded.
1780 1800
      UNBOUNDED = 4
1781 1801
    };
1782 1802

	
1783 1803
    ///The basis status of variables
1784 1804
    enum VarStatus {
1785 1805
      /// The variable is in the basis
1786 1806
      BASIC, 
1787 1807
      /// The variable is free, but not basic
1788 1808
      FREE,
1789 1809
      /// The variable has active lower bound 
1790 1810
      LOWER,
1791 1811
      /// The variable has active upper bound
... ...
@@ -1823,25 +1843,25 @@
1823 1843

	
1824 1844
    ///@{
1825 1845

	
1826 1846
    ///\e Solve the LP problem at hand
1827 1847
    ///
1828 1848
    ///\return The result of the optimization procedure. Possible
1829 1849
    ///values and their meanings can be found in the documentation of
1830 1850
    ///\ref SolveExitStatus.
1831 1851
    SolveExitStatus solve() { return _solve(); }
1832 1852

	
1833 1853
    ///@}
1834 1854

	
1835
    ///\name Obtain the solution
1855
    ///\name Obtain the Solution
1836 1856

	
1837 1857
    ///@{
1838 1858

	
1839 1859
    /// The type of the primal problem
1840 1860
    ProblemType primalType() const {
1841 1861
      return _getPrimalType();
1842 1862
    }
1843 1863

	
1844 1864
    /// The type of the dual problem
1845 1865
    ProblemType dualType() const {
1846 1866
      return _getDualType();
1847 1867
    }
... ...
@@ -1945,85 +1965,84 @@
1945 1965
  /// This class is an abstract base class for MIP solvers. This class
1946 1966
  /// provides a full interface for set and modify an MIP problem,
1947 1967
  /// solve it and retrieve the solution. You can use one of the
1948 1968
  /// descendants as a concrete implementation, or the \c Lp
1949 1969
  /// default MIP solver. However, if you would like to handle MIP
1950 1970
  /// solvers as reference or pointer in a generic way, you can use
1951 1971
  /// this class directly.
1952 1972
  class MipSolver : virtual public LpBase {
1953 1973
  public:
1954 1974

	
1955 1975
    /// The problem types for MIP problems
1956 1976
    enum ProblemType {
1957
      ///Feasible solution hasn't been found (but may exist).
1977
      /// = 0. Feasible solution hasn't been found (but may exist).
1958 1978
      UNDEFINED = 0,
1959
      ///The problem has no feasible solution
1979
      /// = 1. The problem has no feasible solution.
1960 1980
      INFEASIBLE = 1,
1961
      ///Feasible solution found
1981
      /// = 2. Feasible solution found.
1962 1982
      FEASIBLE = 2,
1963
      ///Optimal solution exists and found
1983
      /// = 3. Optimal solution exists and found.
1964 1984
      OPTIMAL = 3,
1965
      ///The cost function is unbounded
1966
      ///
1967
      ///The Mip or at least the relaxed problem is unbounded
1985
      /// = 4. The cost function is unbounded.
1986
      ///The Mip or at least the relaxed problem is unbounded.
1968 1987
      UNBOUNDED = 4
1969 1988
    };
1970 1989

	
1971 1990
    ///Allocate a new MIP problem instance
1972 1991
    virtual MipSolver* newSolver() const = 0;
1973 1992
    ///Make a copy of the MIP problem
1974 1993
    virtual MipSolver* cloneSolver() const = 0;
1975 1994

	
1976 1995
    ///\name Solve the MIP
1977 1996

	
1978 1997
    ///@{
1979 1998

	
1980 1999
    /// Solve the MIP problem at hand
1981 2000
    ///
1982 2001
    ///\return The result of the optimization procedure. Possible
1983 2002
    ///values and their meanings can be found in the documentation of
1984 2003
    ///\ref SolveExitStatus.
1985 2004
    SolveExitStatus solve() { return _solve(); }
1986 2005

	
1987 2006
    ///@}
1988 2007

	
1989
    ///\name Setting column type
2008
    ///\name Set Column Type
1990 2009
    ///@{
1991 2010

	
1992 2011
    ///Possible variable (column) types (e.g. real, integer, binary etc.)
1993 2012
    enum ColTypes {
1994
      ///Continuous variable (default)
2013
      /// = 0. Continuous variable (default).
1995 2014
      REAL = 0,
1996
      ///Integer variable
2015
      /// = 1. Integer variable.
1997 2016
      INTEGER = 1
1998 2017
    };
1999 2018

	
2000 2019
    ///Sets the type of the given column to the given type
2001 2020

	
2002 2021
    ///Sets the type of the given column to the given type.
2003 2022
    ///
2004 2023
    void colType(Col c, ColTypes col_type) {
2005 2024
      _setColType(cols(id(c)),col_type);
2006 2025
    }
2007 2026

	
2008 2027
    ///Gives back the type of the column.
2009 2028

	
2010 2029
    ///Gives back the type of the column.
2011 2030
    ///
2012 2031
    ColTypes colType(Col c) const {
2013 2032
      return _getColType(cols(id(c)));
2014 2033
    }
2015 2034
    ///@}
2016 2035

	
2017
    ///\name Obtain the solution
2036
    ///\name Obtain the Solution
2018 2037

	
2019 2038
    ///@{
2020 2039

	
2021 2040
    /// The type of the MIP problem
2022 2041
    ProblemType type() const {
2023 2042
      return _getType();
2024 2043
    }
2025 2044

	
2026 2045
    /// Return the value of the row in the solution
2027 2046

	
2028 2047
    ///  Return the value of the row in the solution.
2029 2048
    /// \pre The problem is solved.
Ignore white space 6 line context
... ...
@@ -75,24 +75,26 @@
75 75
  void SkeletonSolverBase::_setObjCoeff(int, Value) {}
76 76
  SkeletonSolverBase::Value SkeletonSolverBase::_getObjCoeff(int) const
77 77
  {  return 0; }
78 78

	
79 79
  void SkeletonSolverBase::_setSense(Sense) {}
80 80
  SkeletonSolverBase::Sense SkeletonSolverBase::_getSense() const
81 81
  { return MIN; }
82 82

	
83 83
  void SkeletonSolverBase::_clear() {
84 84
    row_num = col_num = 0;
85 85
  }
86 86

	
87
  void SkeletonSolverBase::_messageLevel(MessageLevel) {}
88

	
87 89
  LpSkeleton::SolveExitStatus LpSkeleton::_solve() { return SOLVED; }
88 90

	
89 91
  LpSkeleton::Value LpSkeleton::_getPrimal(int) const { return 0; }
90 92
  LpSkeleton::Value LpSkeleton::_getDual(int) const { return 0; }
91 93
  LpSkeleton::Value LpSkeleton::_getPrimalValue() const { return 0; }
92 94

	
93 95
  LpSkeleton::Value LpSkeleton::_getPrimalRay(int) const { return 0; }
94 96
  LpSkeleton::Value LpSkeleton::_getDualRay(int) const { return 0; }
95 97

	
96 98
  LpSkeleton::ProblemType LpSkeleton::_getPrimalType() const
97 99
  { return UNDEFINED; }
98 100

	
Ignore white space 6 line context
... ...
@@ -131,24 +131,26 @@
131 131
    virtual void _setObjCoeff(int i, Value obj_coef);
132 132
    /// \e
133 133
    virtual Value _getObjCoeff(int i) const;
134 134

	
135 135
    ///\e
136 136
    virtual void _setSense(Sense);
137 137
    ///\e
138 138
    virtual Sense _getSense() const;
139 139

	
140 140
    ///\e
141 141
    virtual void _clear();
142 142

	
143
    ///\e
144
    virtual void _messageLevel(MessageLevel);
143 145
  };
144 146

	
145 147
  /// \brief Skeleton class for an LP solver interface
146 148
  ///
147 149
  ///This class does nothing, but it can serve as a skeleton when
148 150
  ///implementing an interface to new solvers.
149 151

	
150 152
  ///\ingroup lp_group
151 153
  class LpSkeleton : public LpSolver, public SkeletonSolverBase {
152 154
  public:
153 155
    ///\e
154 156
    LpSkeleton() : LpSolver(), SkeletonSolverBase() {}
Ignore white space 6 line context
... ...
@@ -2719,26 +2719,26 @@
2719 2719
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2720 2720
        _deg[it] = 0;
2721 2721
      }
2722 2722
    }
2723 2723
  private:
2724 2724

	
2725 2725
    const Digraph& _digraph;
2726 2726
    AutoNodeMap _deg;
2727 2727
  };
2728 2728

	
2729 2729
  /// \brief Potential difference map
2730 2730
  ///
2731
  /// PotentialMap returns the difference between the potentials of the
2732
  /// source and target nodes of each arc in a digraph, i.e. it returns
2731
  /// PotentialDifferenceMap returns the difference between the potentials of
2732
  /// the source and target nodes of each arc in a digraph, i.e. it returns
2733 2733
  /// \code
2734 2734
  ///   potential[gr.target(arc)] - potential[gr.source(arc)].
2735 2735
  /// \endcode
2736 2736
  /// \tparam GR The digraph type.
2737 2737
  /// \tparam POT A node map storing the potentials.
2738 2738
  template <typename GR, typename POT>
2739 2739
  class PotentialDifferenceMap {
2740 2740
  public:
2741 2741
    /// Key type
2742 2742
    typedef typename GR::Arc Key;
2743 2743
    /// Value type
2744 2744
    typedef typename POT::Value Value;
Ignore white space 6 line context
... ...
@@ -273,128 +273,128 @@
273 273
            }
274 274
          }
275 275
        }
276 276
      }
277 277

	
278 278
      {
279 279

	
280 280
        Node node = _graph.u(e);
281 281
        Arc arc = _graph.direct(e, true);
282 282
        Node base = (*_blossom_rep)[_blossom_set->find(node)];
283 283

	
284 284
        while (base != nca) {
285
          _ear->set(node, arc);
285
          (*_ear)[node] = arc;
286 286

	
287 287
          Node n = node;
288 288
          while (n != base) {
289 289
            n = _graph.target((*_matching)[n]);
290 290
            Arc a = (*_ear)[n];
291 291
            n = _graph.target(a);
292
            _ear->set(n, _graph.oppositeArc(a));
292
            (*_ear)[n] = _graph.oppositeArc(a);
293 293
          }
294 294
          node = _graph.target((*_matching)[base]);
295 295
          _tree_set->erase(base);
296 296
          _tree_set->erase(node);
297 297
          _blossom_set->insert(node, _blossom_set->find(base));
298
          _status->set(node, EVEN);
298
          (*_status)[node] = EVEN;
299 299
          _node_queue[_last++] = node;
300 300
          arc = _graph.oppositeArc((*_ear)[node]);
301 301
          node = _graph.target((*_ear)[node]);
302 302
          base = (*_blossom_rep)[_blossom_set->find(node)];
303 303
          _blossom_set->join(_graph.target(arc), base);
304 304
        }
305 305
      }
306 306

	
307
      _blossom_rep->set(_blossom_set->find(nca), nca);
307
      (*_blossom_rep)[_blossom_set->find(nca)] = nca;
308 308

	
309 309
      {
310 310

	
311 311
        Node node = _graph.v(e);
312 312
        Arc arc = _graph.direct(e, false);
313 313
        Node base = (*_blossom_rep)[_blossom_set->find(node)];
314 314

	
315 315
        while (base != nca) {
316
          _ear->set(node, arc);
316
          (*_ear)[node] = arc;
317 317

	
318 318
          Node n = node;
319 319
          while (n != base) {
320 320
            n = _graph.target((*_matching)[n]);
321 321
            Arc a = (*_ear)[n];
322 322
            n = _graph.target(a);
323
            _ear->set(n, _graph.oppositeArc(a));
323
            (*_ear)[n] = _graph.oppositeArc(a);
324 324
          }
325 325
          node = _graph.target((*_matching)[base]);
326 326
          _tree_set->erase(base);
327 327
          _tree_set->erase(node);
328 328
          _blossom_set->insert(node, _blossom_set->find(base));
329
          _status->set(node, EVEN);
329
          (*_status)[node] = EVEN;
330 330
          _node_queue[_last++] = node;
331 331
          arc = _graph.oppositeArc((*_ear)[node]);
332 332
          node = _graph.target((*_ear)[node]);
333 333
          base = (*_blossom_rep)[_blossom_set->find(node)];
334 334
          _blossom_set->join(_graph.target(arc), base);
335 335
        }
336 336
      }
337 337

	
338
      _blossom_rep->set(_blossom_set->find(nca), nca);
338
      (*_blossom_rep)[_blossom_set->find(nca)] = nca;
339 339
    }
340 340

	
341 341

	
342 342

	
343 343
    void extendOnArc(const Arc& a) {
344 344
      Node base = _graph.source(a);
345 345
      Node odd = _graph.target(a);
346 346

	
347
      _ear->set(odd, _graph.oppositeArc(a));
347
      (*_ear)[odd] = _graph.oppositeArc(a);
348 348
      Node even = _graph.target((*_matching)[odd]);
349
      _blossom_rep->set(_blossom_set->insert(even), even);
350
      _status->set(odd, ODD);
351
      _status->set(even, EVEN);
349
      (*_blossom_rep)[_blossom_set->insert(even)] = even;
350
      (*_status)[odd] = ODD;
351
      (*_status)[even] = EVEN;
352 352
      int tree = _tree_set->find((*_blossom_rep)[_blossom_set->find(base)]);
353 353
      _tree_set->insert(odd, tree);
354 354
      _tree_set->insert(even, tree);
355 355
      _node_queue[_last++] = even;
356 356

	
357 357
    }
358 358

	
359 359
    void augmentOnArc(const Arc& a) {
360 360
      Node even = _graph.source(a);
361 361
      Node odd = _graph.target(a);
362 362

	
363 363
      int tree = _tree_set->find((*_blossom_rep)[_blossom_set->find(even)]);
364 364

	
365
      _matching->set(odd, _graph.oppositeArc(a));
366
      _status->set(odd, MATCHED);
365
      (*_matching)[odd] = _graph.oppositeArc(a);
366
      (*_status)[odd] = MATCHED;
367 367

	
368 368
      Arc arc = (*_matching)[even];
369
      _matching->set(even, a);
369
      (*_matching)[even] = a;
370 370

	
371 371
      while (arc != INVALID) {
372 372
        odd = _graph.target(arc);
373 373
        arc = (*_ear)[odd];
374 374
        even = _graph.target(arc);
375
        _matching->set(odd, arc);
375
        (*_matching)[odd] = arc;
376 376
        arc = (*_matching)[even];
377
        _matching->set(even, _graph.oppositeArc((*_matching)[odd]));
377
        (*_matching)[even] = _graph.oppositeArc((*_matching)[odd]);
378 378
      }
379 379

	
380 380
      for (typename TreeSet::ItemIt it(*_tree_set, tree);
381 381
           it != INVALID; ++it) {
382 382
        if ((*_status)[it] == ODD) {
383
          _status->set(it, MATCHED);
383
          (*_status)[it] = MATCHED;
384 384
        } else {
385 385
          int blossom = _blossom_set->find(it);
386 386
          for (typename BlossomSet::ItemIt jt(*_blossom_set, blossom);
387 387
               jt != INVALID; ++jt) {
388
            _status->set(jt, MATCHED);
388
            (*_status)[jt] = MATCHED;
389 389
          }
390 390
          _blossom_set->eraseClass(blossom);
391 391
        }
392 392
      }
393 393
      _tree_set->eraseClass(tree);
394 394

	
395 395
    }
396 396

	
397 397
  public:
398 398

	
399 399
    /// \brief Constructor
400 400
    ///
... ...
@@ -418,110 +418,110 @@
418 418
    /// functions first, then you can start the algorithm with the \ref
419 419
    /// startSparse() or startDense() functions.
420 420

	
421 421
    ///@{
422 422

	
423 423
    /// \brief Sets the actual matching to the empty matching.
424 424
    ///
425 425
    /// Sets the actual matching to the empty matching.
426 426
    ///
427 427
    void init() {
428 428
      createStructures();
429 429
      for(NodeIt n(_graph); n != INVALID; ++n) {
430
        _matching->set(n, INVALID);
431
        _status->set(n, UNMATCHED);
430
        (*_matching)[n] = INVALID;
431
        (*_status)[n] = UNMATCHED;
432 432
      }
433 433
    }
434 434

	
435 435
    ///\brief Finds an initial matching in a greedy way
436 436
    ///
437 437
    ///It finds an initial matching in a greedy way.
438 438
    void greedyInit() {
439 439
      createStructures();
440 440
      for (NodeIt n(_graph); n != INVALID; ++n) {
441
        _matching->set(n, INVALID);
442
        _status->set(n, UNMATCHED);
441
        (*_matching)[n] = INVALID;
442
        (*_status)[n] = UNMATCHED;
443 443
      }
444 444
      for (NodeIt n(_graph); n != INVALID; ++n) {
445 445
        if ((*_matching)[n] == INVALID) {
446 446
          for (OutArcIt a(_graph, n); a != INVALID ; ++a) {
447 447
            Node v = _graph.target(a);
448 448
            if ((*_matching)[v] == INVALID && v != n) {
449
              _matching->set(n, a);
450
              _status->set(n, MATCHED);
451
              _matching->set(v, _graph.oppositeArc(a));
452
              _status->set(v, MATCHED);
449
              (*_matching)[n] = a;
450
              (*_status)[n] = MATCHED;
451
              (*_matching)[v] = _graph.oppositeArc(a);
452
              (*_status)[v] = MATCHED;
453 453
              break;
454 454
            }
455 455
          }
456 456
        }
457 457
      }
458 458
    }
459 459

	
460 460

	
461 461
    /// \brief Initialize the matching from a map containing.
462 462
    ///
463 463
    /// Initialize the matching from a \c bool valued \c Edge map. This
464 464
    /// map must have the property that there are no two incident edges
465 465
    /// with true value, ie. it contains a matching.
466 466
    /// \return \c true if the map contains a matching.
467 467
    template <typename MatchingMap>
468 468
    bool matchingInit(const MatchingMap& matching) {
469 469
      createStructures();
470 470

	
471 471
      for (NodeIt n(_graph); n != INVALID; ++n) {
472
        _matching->set(n, INVALID);
473
        _status->set(n, UNMATCHED);
472
        (*_matching)[n] = INVALID;
473
        (*_status)[n] = UNMATCHED;
474 474
      }
475 475
      for(EdgeIt e(_graph); e!=INVALID; ++e) {
476 476
        if (matching[e]) {
477 477

	
478 478
          Node u = _graph.u(e);
479 479
          if ((*_matching)[u] != INVALID) return false;
480
          _matching->set(u, _graph.direct(e, true));
481
          _status->set(u, MATCHED);
480
          (*_matching)[u] = _graph.direct(e, true);
481
          (*_status)[u] = MATCHED;
482 482

	
483 483
          Node v = _graph.v(e);
484 484
          if ((*_matching)[v] != INVALID) return false;
485
          _matching->set(v, _graph.direct(e, false));
486
          _status->set(v, MATCHED);
485
          (*_matching)[v] = _graph.direct(e, false);
486
          (*_status)[v] = MATCHED;
487 487
        }
488 488
      }
489 489
      return true;
490 490
    }
491 491

	
492 492
    /// \brief Starts Edmonds' algorithm
493 493
    ///
494 494
    /// If runs the original Edmonds' algorithm.
495 495
    void startSparse() {
496 496
      for(NodeIt n(_graph); n != INVALID; ++n) {
497 497
        if ((*_status)[n] == UNMATCHED) {
498 498
          (*_blossom_rep)[_blossom_set->insert(n)] = n;
499 499
          _tree_set->insert(n);
500
          _status->set(n, EVEN);
500
          (*_status)[n] = EVEN;
501 501
          processSparse(n);
502 502
        }
503 503
      }
504 504
    }
505 505

	
506 506
    /// \brief Starts Edmonds' algorithm.
507 507
    ///
508 508
    /// It runs Edmonds' algorithm with a heuristic of postponing
509 509
    /// shrinks, therefore resulting in a faster algorithm for dense graphs.
510 510
    void startDense() {
511 511
      for(NodeIt n(_graph); n != INVALID; ++n) {
512 512
        if ((*_status)[n] == UNMATCHED) {
513 513
          (*_blossom_rep)[_blossom_set->insert(n)] = n;
514 514
          _tree_set->insert(n);
515
          _status->set(n, EVEN);
515
          (*_status)[n] = EVEN;
516 516
          processDense(n);
517 517
        }
518 518
      }
519 519
    }
520 520

	
521 521

	
522 522
    /// \brief Runs Edmonds' algorithm
523 523
    ///
524 524
    /// Runs Edmonds' algorithm for sparse graphs (<tt>m<2*n</tt>)
525 525
    /// or Edmonds' algorithm with a heuristic of
526 526
    /// postponing shrinks for dense graphs.
527 527
    void run() {
... ...
@@ -1539,27 +1539,27 @@
1539 1539
        _tree_set->insert(subblossoms[ib], tree);
1540 1540
        (*_blossom_data)[subblossoms[ib]].next = next;
1541 1541
        (*_blossom_data)[subblossoms[ib]].pred = pred;
1542 1542
      }
1543 1543
      _tree_set->erase(blossom);
1544 1544
    }
1545 1545

	
1546 1546
    void extractBlossom(int blossom, const Node& base, const Arc& matching) {
1547 1547
      if (_blossom_set->trivial(blossom)) {
1548 1548
        int bi = (*_node_index)[base];
1549 1549
        Value pot = (*_node_data)[bi].pot;
1550 1550

	
1551
        _matching->set(base, matching);
1551
        (*_matching)[base] = matching;
1552 1552
        _blossom_node_list.push_back(base);
1553
        _node_potential->set(base, pot);
1553
        (*_node_potential)[base] = pot;
1554 1554
      } else {
1555 1555

	
1556 1556
        Value pot = (*_blossom_data)[blossom].pot;
1557 1557
        int bn = _blossom_node_list.size();
1558 1558

	
1559 1559
        std::vector<int> subblossoms;
1560 1560
        _blossom_set->split(blossom, std::back_inserter(subblossoms));
1561 1561
        int b = _blossom_set->find(base);
1562 1562
        int ib = -1;
1563 1563
        for (int i = 0; i < int(subblossoms.size()); ++i) {
1564 1564
          if (subblossoms[i] == b) { ib = i; break; }
1565 1565
        }
... ...
@@ -1635,47 +1635,47 @@
1635 1635
    /// The simplest way to execute the algorithm is to use the
1636 1636
    /// \c run() member function.
1637 1637

	
1638 1638
    ///@{
1639 1639

	
1640 1640
    /// \brief Initialize the algorithm
1641 1641
    ///
1642 1642
    /// Initialize the algorithm
1643 1643
    void init() {
1644 1644
      createStructures();
1645 1645

	
1646 1646
      for (ArcIt e(_graph); e != INVALID; ++e) {
1647
        _node_heap_index->set(e, BinHeap<Value, IntArcMap>::PRE_HEAP);
1647
        (*_node_heap_index)[e] = BinHeap<Value, IntArcMap>::PRE_HEAP;
1648 1648
      }
1649 1649
      for (NodeIt n(_graph); n != INVALID; ++n) {
1650
        _delta1_index->set(n, _delta1->PRE_HEAP);
1650
        (*_delta1_index)[n] = _delta1->PRE_HEAP;
1651 1651
      }
1652 1652
      for (EdgeIt e(_graph); e != INVALID; ++e) {
1653
        _delta3_index->set(e, _delta3->PRE_HEAP);
1653
        (*_delta3_index)[e] = _delta3->PRE_HEAP;
1654 1654
      }
1655 1655
      for (int i = 0; i < _blossom_num; ++i) {
1656
        _delta2_index->set(i, _delta2->PRE_HEAP);
1657
        _delta4_index->set(i, _delta4->PRE_HEAP);
1656
        (*_delta2_index)[i] = _delta2->PRE_HEAP;
1657
        (*_delta4_index)[i] = _delta4->PRE_HEAP;
1658 1658
      }
1659 1659

	
1660 1660
      int index = 0;
1661 1661
      for (NodeIt n(_graph); n != INVALID; ++n) {
1662 1662
        Value max = 0;
1663 1663
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
1664 1664
          if (_graph.target(e) == n) continue;
1665 1665
          if ((dualScale * _weight[e]) / 2 > max) {
1666 1666
            max = (dualScale * _weight[e]) / 2;
1667 1667
          }
1668 1668
        }
1669
        _node_index->set(n, index);
1669
        (*_node_index)[n] = index;
1670 1670
        (*_node_data)[index].pot = max;
1671 1671
        _delta1->push(n, max);
1672 1672
        int blossom =
1673 1673
          _blossom_set->insert(n, std::numeric_limits<Value>::max());
1674 1674

	
1675 1675
        _tree_set->insert(blossom);
1676 1676

	
1677 1677
        (*_blossom_data)[blossom].status = EVEN;
1678 1678
        (*_blossom_data)[blossom].pred = INVALID;
1679 1679
        (*_blossom_data)[blossom].next = INVALID;
1680 1680
        (*_blossom_data)[blossom].pot = 0;
1681 1681
        (*_blossom_data)[blossom].offset = 0;
... ...
@@ -2732,27 +2732,27 @@
2732 2732
        _tree_set->insert(subblossoms[ib], tree);
2733 2733
        (*_blossom_data)[subblossoms[ib]].next = next;
2734 2734
        (*_blossom_data)[subblossoms[ib]].pred = pred;
2735 2735
      }
2736 2736
      _tree_set->erase(blossom);
2737 2737
    }
2738 2738

	
2739 2739
    void extractBlossom(int blossom, const Node& base, const Arc& matching) {
2740 2740
      if (_blossom_set->trivial(blossom)) {
2741 2741
        int bi = (*_node_index)[base];
2742 2742
        Value pot = (*_node_data)[bi].pot;
2743 2743

	
2744
        _matching->set(base, matching);
2744
        (*_matching)[base] = matching;
2745 2745
        _blossom_node_list.push_back(base);
2746
        _node_potential->set(base, pot);
2746
        (*_node_potential)[base] = pot;
2747 2747
      } else {
2748 2748

	
2749 2749
        Value pot = (*_blossom_data)[blossom].pot;
2750 2750
        int bn = _blossom_node_list.size();
2751 2751

	
2752 2752
        std::vector<int> subblossoms;
2753 2753
        _blossom_set->split(blossom, std::back_inserter(subblossoms));
2754 2754
        int b = _blossom_set->find(base);
2755 2755
        int ib = -1;
2756 2756
        for (int i = 0; i < int(subblossoms.size()); ++i) {
2757 2757
          if (subblossoms[i] == b) { ib = i; break; }
2758 2758
        }
... ...
@@ -2822,44 +2822,44 @@
2822 2822
    /// The simplest way to execute the algorithm is to use the
2823 2823
    /// \c run() member function.
2824 2824

	
2825 2825
    ///@{
2826 2826

	
2827 2827
    /// \brief Initialize the algorithm
2828 2828
    ///
2829 2829
    /// Initialize the algorithm
2830 2830
    void init() {
2831 2831
      createStructures();
2832 2832

	
2833 2833
      for (ArcIt e(_graph); e != INVALID; ++e) {
2834
        _node_heap_index->set(e, BinHeap<Value, IntArcMap>::PRE_HEAP);
2834
        (*_node_heap_index)[e] = BinHeap<Value, IntArcMap>::PRE_HEAP;
2835 2835
      }
2836 2836
      for (EdgeIt e(_graph); e != INVALID; ++e) {
2837
        _delta3_index->set(e, _delta3->PRE_HEAP);
2837
        (*_delta3_index)[e] = _delta3->PRE_HEAP;
2838 2838
      }
2839 2839
      for (int i = 0; i < _blossom_num; ++i) {
2840
        _delta2_index->set(i, _delta2->PRE_HEAP);
2841
        _delta4_index->set(i, _delta4->PRE_HEAP);
2840
        (*_delta2_index)[i] = _delta2->PRE_HEAP;
2841
        (*_delta4_index)[i] = _delta4->PRE_HEAP;
2842 2842
      }
2843 2843

	
2844 2844
      int index = 0;
2845 2845
      for (NodeIt n(_graph); n != INVALID; ++n) {
2846 2846
        Value max = - std::numeric_limits<Value>::max();
2847 2847
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
2848 2848
          if (_graph.target(e) == n) continue;
2849 2849
          if ((dualScale * _weight[e]) / 2 > max) {
2850 2850
            max = (dualScale * _weight[e]) / 2;
2851 2851
          }
2852 2852
        }
2853
        _node_index->set(n, index);
2853
        (*_node_index)[n] = index;
2854 2854
        (*_node_data)[index].pot = max;
2855 2855
        int blossom =
2856 2856
          _blossom_set->insert(n, std::numeric_limits<Value>::max());
2857 2857

	
2858 2858
        _tree_set->insert(blossom);
2859 2859

	
2860 2860
        (*_blossom_data)[blossom].status = EVEN;
2861 2861
        (*_blossom_data)[blossom].pred = INVALID;
2862 2862
        (*_blossom_data)[blossom].next = INVALID;
2863 2863
        (*_blossom_data)[blossom].pot = 0;
2864 2864
        (*_blossom_data)[blossom].offset = 0;
2865 2865
        ++index;
Ignore white space 6 line context
... ...
@@ -81,28 +81,28 @@
81 81
    ///
82 82
    /// This function instantiates a \c PredMap.
83 83
    /// \param digraph The digraph to which we would like to define the
84 84
    /// \c PredMap.
85 85
    static PredMap *createPredMap(const Digraph &digraph){
86 86
      return new PredMap(digraph);
87 87
    }
88 88

	
89 89
  };
90 90

	
91 91
  /// \ingroup spantree
92 92
  ///
93
  /// \brief %MinCostArborescence algorithm class.
93
  /// \brief Minimum Cost Arborescence algorithm class.
94 94
  ///
95 95
  /// This class provides an efficient implementation of
96
  /// %MinCostArborescence algorithm. The arborescence is a tree
96
  /// Minimum Cost Arborescence algorithm. The arborescence is a tree
97 97
  /// which is directed from a given source node of the digraph. One or
98 98
  /// more sources should be given for the algorithm and it will calculate
99 99
  /// the minimum cost subgraph which are union of arborescences with the
100 100
  /// given sources and spans all the nodes which are reachable from the
101 101
  /// sources. The time complexity of the algorithm is O(n<sup>2</sup>+e).
102 102
  ///
103 103
  /// The algorithm provides also an optimal dual solution, therefore
104 104
  /// the optimality of the solution can be checked.
105 105
  ///
106 106
  /// \param GR The digraph type the algorithm runs on. The default value
107 107
  /// is \ref ListDigraph.
108 108
  /// \param CM This read-only ArcMap determines the costs of the
... ...
@@ -284,25 +284,25 @@
284 284
          if ((*_cost_arcs)[source].value > value) {
285 285
            (*_cost_arcs)[source].arc = arc;
286 286
            (*_cost_arcs)[source].value = value;
287 287
          }
288 288
        }
289 289
      }
290 290
      CostArc minimum = (*_cost_arcs)[nodes[0]];
291 291
      for (int i = 1; i < int(nodes.size()); ++i) {
292 292
        if ((*_cost_arcs)[nodes[i]].value < minimum.value) {
293 293
          minimum = (*_cost_arcs)[nodes[i]];
294 294
        }
295 295
      }
296
      _arc_order->set(minimum.arc, _dual_variables.size());
296
      (*_arc_order)[minimum.arc] = _dual_variables.size();
297 297
      DualVariable var(_dual_node_list.size() - 1,
298 298
                       _dual_node_list.size(), minimum.value);
299 299
      _dual_variables.push_back(var);
300 300
      for (int i = 0; i < int(nodes.size()); ++i) {
301 301
        (*_cost_arcs)[nodes[i]].value -= minimum.value;
302 302
        level.arcs.push_back((*_cost_arcs)[nodes[i]]);
303 303
        (*_cost_arcs)[nodes[i]].arc = INVALID;
304 304
      }
305 305
      level_stack.push_back(level);
306 306
      return minimum.arc;
307 307
    }
308 308

	
... ...
@@ -326,25 +326,25 @@
326 326
              (*_cost_arcs)[source].value = value;
327 327
            }
328 328
          }
329 329
        }
330 330
        level_stack.pop_back();
331 331
      }
332 332
      CostArc minimum = (*_cost_arcs)[nodes[0]];
333 333
      for (int i = 1; i < int(nodes.size()); ++i) {
334 334
        if ((*_cost_arcs)[nodes[i]].value < minimum.value) {
335 335
          minimum = (*_cost_arcs)[nodes[i]];
336 336
        }
337 337
      }
338
      _arc_order->set(minimum.arc, _dual_variables.size());
338
      (*_arc_order)[minimum.arc] = _dual_variables.size();
339 339
      DualVariable var(node_bottom, _dual_node_list.size(), minimum.value);
340 340
      _dual_variables.push_back(var);
341 341
      StackLevel level;
342 342
      level.node_level = node_bottom;
343 343
      for (int i = 0; i < int(nodes.size()); ++i) {
344 344
        (*_cost_arcs)[nodes[i]].value -= minimum.value;
345 345
        level.arcs.push_back((*_cost_arcs)[nodes[i]]);
346 346
        (*_cost_arcs)[nodes[i]].arc = INVALID;
347 347
      }
348 348
      level_stack.push_back(level);
349 349
      return minimum.arc;
350 350
    }
... ...
@@ -355,25 +355,25 @@
355 355
        --k;
356 356
      }
357 357
      return level_stack[k].node_level;
358 358
    }
359 359

	
360 360
    void finalize(Arc arc) {
361 361
      Node node = _digraph->target(arc);
362 362
      _heap->push(node, (*_arc_order)[arc]);
363 363
      _pred->set(node, arc);
364 364
      while (!_heap->empty()) {
365 365
        Node source = _heap->top();
366 366
        _heap->pop();
367
        _node_order->set(source, -1);
367
        (*_node_order)[source] = -1;
368 368
        for (OutArcIt it(*_digraph, source); it != INVALID; ++it) {
369 369
          if ((*_arc_order)[it] < 0) continue;
370 370
          Node target = _digraph->target(it);
371 371
          switch(_heap->state(target)) {
372 372
          case Heap::PRE_HEAP:
373 373
            _heap->push(target, (*_arc_order)[it]);
374 374
            _pred->set(target, it);
375 375
            break;
376 376
          case Heap::IN_HEAP:
377 377
            if ((*_arc_order)[it] < (*_heap)[target]) {
378 378
              _heap->decrease(target, (*_arc_order)[it]);
379 379
              _pred->set(target, it);
... ...
@@ -381,25 +381,25 @@
381 381
            break;
382 382
          case Heap::POST_HEAP:
383 383
            break;
384 384
          }
385 385
        }
386 386
        _arborescence->set((*_pred)[source], true);
387 387
      }
388 388
    }
389 389

	
390 390

	
391 391
  public:
392 392

	
393
    /// \name Named template parameters
393
    /// \name Named Template Parameters
394 394

	
395 395
    /// @{
396 396

	
397 397
    template <class T>
398 398
    struct DefArborescenceMapTraits : public Traits {
399 399
      typedef T ArborescenceMap;
400 400
      static ArborescenceMap *createArborescenceMap(const Digraph &)
401 401
      {
402 402
        LEMON_ASSERT(false, "ArborescenceMap is not initialized");
403 403
        return 0; // ignore warnings
404 404
      }
405 405
    };
... ...
@@ -621,51 +621,51 @@
621 621
      /// Checks whether the iterator is valid.
622 622
      bool operator!=(Invalid) const {
623 623
        return _index != _last;
624 624
      }
625 625

	
626 626
    private:
627 627
      const MinCostArborescence* _algorithm;
628 628
      int _index, _last;
629 629
    };
630 630

	
631 631
    /// @}
632 632

	
633
    /// \name Execution control
633
    /// \name Execution Control
634 634
    /// The simplest way to execute the algorithm is to use
635 635
    /// one of the member functions called \c run(...). \n
636 636
    /// If you need more control on the execution,
637 637
    /// first you must call \ref init(), then you can add several
638 638
    /// source nodes with \ref addSource().
639 639
    /// Finally \ref start() will perform the arborescence
640 640
    /// computation.
641 641

	
642 642
    ///@{
643 643

	
644 644
    /// \brief Initializes the internal data structures.
645 645
    ///
646 646
    /// Initializes the internal data structures.
647 647
    ///
648 648
    void init() {
649 649
      createStructures();
650 650
      _heap->clear();
651 651
      for (NodeIt it(*_digraph); it != INVALID; ++it) {
652 652
        (*_cost_arcs)[it].arc = INVALID;
653
        _node_order->set(it, -3);
654
        _heap_cross_ref->set(it, Heap::PRE_HEAP);
653
        (*_node_order)[it] = -3;
654
        (*_heap_cross_ref)[it] = Heap::PRE_HEAP;
655 655
        _pred->set(it, INVALID);
656 656
      }
657 657
      for (ArcIt it(*_digraph); it != INVALID; ++it) {
658 658
        _arborescence->set(it, false);
659
        _arc_order->set(it, -1);
659
        (*_arc_order)[it] = -1;
660 660
      }
661 661
      _dual_node_list.clear();
662 662
      _dual_variables.clear();
663 663
    }
664 664

	
665 665
    /// \brief Adds a new source node.
666 666
    ///
667 667
    /// Adds a new source node to the algorithm.
668 668
    void addSource(Node source) {
669 669
      std::vector<Node> nodes;
670 670
      nodes.push_back(source);
671 671
      while (!nodes.empty()) {
Ignore white space 6 line context
... ...
@@ -395,65 +395,65 @@
395 395

	
396 396
    ///@{
397 397

	
398 398
    /// \brief Initializes the internal data structures.
399 399
    ///
400 400
    /// Initializes the internal data structures and sets the initial
401 401
    /// flow to zero on each arc.
402 402
    void init() {
403 403
      createStructures();
404 404

	
405 405
      _phase = true;
406 406
      for (NodeIt n(_graph); n != INVALID; ++n) {
407
        _excess->set(n, 0);
407
        (*_excess)[n] = 0;
408 408
      }
409 409

	
410 410
      for (ArcIt e(_graph); e != INVALID; ++e) {
411 411
        _flow->set(e, 0);
412 412
      }
413 413

	
414 414
      typename Digraph::template NodeMap<bool> reached(_graph, false);
415 415

	
416 416
      _level->initStart();
417 417
      _level->initAddItem(_target);
418 418

	
419 419
      std::vector<Node> queue;
420
      reached.set(_source, true);
420
      reached[_source] = true;
421 421

	
422 422
      queue.push_back(_target);
423
      reached.set(_target, true);
423
      reached[_target] = true;
424 424
      while (!queue.empty()) {
425 425
        _level->initNewLevel();
426 426
        std::vector<Node> nqueue;
427 427
        for (int i = 0; i < int(queue.size()); ++i) {
428 428
          Node n = queue[i];
429 429
          for (InArcIt e(_graph, n); e != INVALID; ++e) {
430 430
            Node u = _graph.source(e);
431 431
            if (!reached[u] && _tolerance.positive((*_capacity)[e])) {
432
              reached.set(u, true);
432
              reached[u] = true;
433 433
              _level->initAddItem(u);
434 434
              nqueue.push_back(u);
435 435
            }
436 436
          }
437 437
        }
438 438
        queue.swap(nqueue);
439 439
      }
440 440
      _level->initFinish();
441 441

	
442 442
      for (OutArcIt e(_graph, _source); e != INVALID; ++e) {
443 443
        if (_tolerance.positive((*_capacity)[e])) {
444 444
          Node u = _graph.target(e);
445 445
          if ((*_level)[u] == _level->maxLevel()) continue;
446 446
          _flow->set(e, (*_capacity)[e]);
447
          _excess->set(u, (*_excess)[u] + (*_capacity)[e]);
447
          (*_excess)[u] += (*_capacity)[e];
448 448
          if (u != _target && !_level->active(u)) {
449 449
            _level->activate(u);
450 450
          }
451 451
        }
452 452
      }
453 453
    }
454 454

	
455 455
    /// \brief Initializes the internal data structures using the
456 456
    /// given flow map.
457 457
    ///
458 458
    /// Initializes the internal data structures and sets the initial
459 459
    /// flow to the given \c flowMap. The \c flowMap should contain a
... ...
@@ -469,83 +469,83 @@
469 469
        _flow->set(e, flowMap[e]);
470 470
      }
471 471

	
472 472
      for (NodeIt n(_graph); n != INVALID; ++n) {
473 473
        Value excess = 0;
474 474
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
475 475
          excess += (*_flow)[e];
476 476
        }
477 477
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
478 478
          excess -= (*_flow)[e];
479 479
        }
480 480
        if (excess < 0 && n != _source) return false;
481
        _excess->set(n, excess);
481
        (*_excess)[n] = excess;
482 482
      }
483 483

	
484 484
      typename Digraph::template NodeMap<bool> reached(_graph, false);
485 485

	
486 486
      _level->initStart();
487 487
      _level->initAddItem(_target);
488 488

	
489 489
      std::vector<Node> queue;
490
      reached.set(_source, true);
490
      reached[_source] = true;
491 491

	
492 492
      queue.push_back(_target);
493
      reached.set(_target, true);
493
      reached[_target] = true;
494 494
      while (!queue.empty()) {
495 495
        _level->initNewLevel();
496 496
        std::vector<Node> nqueue;
497 497
        for (int i = 0; i < int(queue.size()); ++i) {
498 498
          Node n = queue[i];
499 499
          for (InArcIt e(_graph, n); e != INVALID; ++e) {
500 500
            Node u = _graph.source(e);
501 501
            if (!reached[u] &&
502 502
                _tolerance.positive((*_capacity)[e] - (*_flow)[e])) {
503
              reached.set(u, true);
503
              reached[u] = true;
504 504
              _level->initAddItem(u);
505 505
              nqueue.push_back(u);
506 506
            }
507 507
          }
508 508
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
509 509
            Node v = _graph.target(e);
510 510
            if (!reached[v] && _tolerance.positive((*_flow)[e])) {
511
              reached.set(v, true);
511
              reached[v] = true;
512 512
              _level->initAddItem(v);
513 513
              nqueue.push_back(v);
514 514
            }
515 515
          }
516 516
        }
517 517
        queue.swap(nqueue);
518 518
      }
519 519
      _level->initFinish();
520 520

	
521 521
      for (OutArcIt e(_graph, _source); e != INVALID; ++e) {
522 522
        Value rem = (*_capacity)[e] - (*_flow)[e];
523 523
        if (_tolerance.positive(rem)) {
524 524
          Node u = _graph.target(e);
525 525
          if ((*_level)[u] == _level->maxLevel()) continue;
526 526
          _flow->set(e, (*_capacity)[e]);
527
          _excess->set(u, (*_excess)[u] + rem);
527
          (*_excess)[u] += rem;
528 528
          if (u != _target && !_level->active(u)) {
529 529
            _level->activate(u);
530 530
          }
531 531
        }
532 532
      }
533 533
      for (InArcIt e(_graph, _source); e != INVALID; ++e) {
534 534
        Value rem = (*_flow)[e];
535 535
        if (_tolerance.positive(rem)) {
536 536
          Node v = _graph.source(e);
537 537
          if ((*_level)[v] == _level->maxLevel()) continue;
538 538
          _flow->set(e, 0);
539
          _excess->set(v, (*_excess)[v] + rem);
539
          (*_excess)[v] += rem;
540 540
          if (v != _target && !_level->active(v)) {
541 541
            _level->activate(v);
542 542
          }
543 543
        }
544 544
      }
545 545
      return true;
546 546
    }
547 547

	
548 548
    /// \brief Starts the first phase of the preflow algorithm.
549 549
    ///
550 550
    /// The preflow algorithm consists of two phases, this method runs
551 551
    /// the first phase. After the first phase the maximum flow value
... ...
@@ -568,63 +568,63 @@
568 568
          int new_level = _level->maxLevel();
569 569

	
570 570
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
571 571
            Value rem = (*_capacity)[e] - (*_flow)[e];
572 572
            if (!_tolerance.positive(rem)) continue;
573 573
            Node v = _graph.target(e);
574 574
            if ((*_level)[v] < level) {
575 575
              if (!_level->active(v) && v != _target) {
576 576
                _level->activate(v);
577 577
              }
578 578
              if (!_tolerance.less(rem, excess)) {
579 579
                _flow->set(e, (*_flow)[e] + excess);
580
                _excess->set(v, (*_excess)[v] + excess);
580
                (*_excess)[v] += excess;
581 581
                excess = 0;
582 582
                goto no_more_push_1;
583 583
              } else {
584 584
                excess -= rem;
585
                _excess->set(v, (*_excess)[v] + rem);
585
                (*_excess)[v] += rem;
586 586
                _flow->set(e, (*_capacity)[e]);
587 587
              }
588 588
            } else if (new_level > (*_level)[v]) {
589 589
              new_level = (*_level)[v];
590 590
            }
591 591
          }
592 592

	
593 593
          for (InArcIt e(_graph, n); e != INVALID; ++e) {
594 594
            Value rem = (*_flow)[e];
595 595
            if (!_tolerance.positive(rem)) continue;
596 596
            Node v = _graph.source(e);
597 597
            if ((*_level)[v] < level) {
598 598
              if (!_level->active(v) && v != _target) {
599 599
                _level->activate(v);
600 600
              }
601 601
              if (!_tolerance.less(rem, excess)) {
602 602
                _flow->set(e, (*_flow)[e] - excess);
603
                _excess->set(v, (*_excess)[v] + excess);
603
                (*_excess)[v] += excess;
604 604
                excess = 0;
605 605
                goto no_more_push_1;
606 606
              } else {
607 607
                excess -= rem;
608
                _excess->set(v, (*_excess)[v] + rem);
608
                (*_excess)[v] += rem;
609 609
                _flow->set(e, 0);
610 610
              }
611 611
            } else if (new_level > (*_level)[v]) {
612 612
              new_level = (*_level)[v];
613 613
            }
614 614
          }
615 615

	
616 616
        no_more_push_1:
617 617

	
618
          _excess->set(n, excess);
618
          (*_excess)[n] = excess;
619 619

	
620 620
          if (excess != 0) {
621 621
            if (new_level + 1 < _level->maxLevel()) {
622 622
              _level->liftHighestActive(new_level + 1);
623 623
            } else {
624 624
              _level->liftHighestActiveToTop();
625 625
            }
626 626
            if (_level->emptyLevel(level)) {
627 627
              _level->liftToTop(level);
628 628
            }
629 629
          } else {
630 630
            _level->deactivate(n);
... ...
@@ -641,63 +641,63 @@
641 641
          int new_level = _level->maxLevel();
642 642

	
643 643
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
644 644
            Value rem = (*_capacity)[e] - (*_flow)[e];
645 645
            if (!_tolerance.positive(rem)) continue;
646 646
            Node v = _graph.target(e);
647 647
            if ((*_level)[v] < level) {
648 648
              if (!_level->active(v) && v != _target) {
649 649
                _level->activate(v);
650 650
              }
651 651
              if (!_tolerance.less(rem, excess)) {
652 652
                _flow->set(e, (*_flow)[e] + excess);
653
                _excess->set(v, (*_excess)[v] + excess);
653
                (*_excess)[v] += excess;
654 654
                excess = 0;
655 655
                goto no_more_push_2;
656 656
              } else {
657 657
                excess -= rem;
658
                _excess->set(v, (*_excess)[v] + rem);
658
                (*_excess)[v] += rem;
659 659
                _flow->set(e, (*_capacity)[e]);
660 660
              }
661 661
            } else if (new_level > (*_level)[v]) {
662 662
              new_level = (*_level)[v];
663 663
            }
664 664
          }
665 665

	
666 666
          for (InArcIt e(_graph, n); e != INVALID; ++e) {
667 667
            Value rem = (*_flow)[e];
668 668
            if (!_tolerance.positive(rem)) continue;
669 669
            Node v = _graph.source(e);
670 670
            if ((*_level)[v] < level) {
671 671
              if (!_level->active(v) && v != _target) {
672 672
                _level->activate(v);
673 673
              }
674 674
              if (!_tolerance.less(rem, excess)) {
675 675
                _flow->set(e, (*_flow)[e] - excess);
676
                _excess->set(v, (*_excess)[v] + excess);
676
                (*_excess)[v] += excess;
677 677
                excess = 0;
678 678
                goto no_more_push_2;
679 679
              } else {
680 680
                excess -= rem;
681
                _excess->set(v, (*_excess)[v] + rem);
681
                (*_excess)[v] += rem;
682 682
                _flow->set(e, 0);
683 683
              }
684 684
            } else if (new_level > (*_level)[v]) {
685 685
              new_level = (*_level)[v];
686 686
            }
687 687
          }
688 688

	
689 689
        no_more_push_2:
690 690

	
691
          _excess->set(n, excess);
691
          (*_excess)[n] = excess;
692 692

	
693 693
          if (excess != 0) {
694 694
            if (new_level + 1 < _level->maxLevel()) {
695 695
              _level->liftActiveOn(level, new_level + 1);
696 696
            } else {
697 697
              _level->liftActiveToTop(level);
698 698
            }
699 699
            if (_level->emptyLevel(level)) {
700 700
              _level->liftToTop(level);
701 701
            }
702 702
          } else {
703 703
            _level->deactivate(n);
... ...
@@ -722,52 +722,52 @@
722 722
    /// The preflow algorithm consists of two phases, this method runs
723 723
    /// the second phase. After calling one of the \ref init() functions
724 724
    /// and \ref startFirstPhase() and then \ref startSecondPhase(),
725 725
    /// \ref flowMap() returns a maximum flow, \ref flowValue() returns the
726 726
    /// value of a maximum flow, \ref minCut() returns a minimum cut
727 727
    /// \pre One of the \ref init() functions and \ref startFirstPhase()
728 728
    /// must be called before using this function.
729 729
    void startSecondPhase() {
730 730
      _phase = false;
731 731

	
732 732
      typename Digraph::template NodeMap<bool> reached(_graph);
733 733
      for (NodeIt n(_graph); n != INVALID; ++n) {
734
        reached.set(n, (*_level)[n] < _level->maxLevel());
734
        reached[n] = (*_level)[n] < _level->maxLevel();
735 735
      }
736 736

	
737 737
      _level->initStart();
738 738
      _level->initAddItem(_source);
739 739

	
740 740
      std::vector<Node> queue;
741 741
      queue.push_back(_source);
742
      reached.set(_source, true);
742
      reached[_source] = true;
743 743

	
744 744
      while (!queue.empty()) {
745 745
        _level->initNewLevel();
746 746
        std::vector<Node> nqueue;
747 747
        for (int i = 0; i < int(queue.size()); ++i) {
748 748
          Node n = queue[i];
749 749
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
750 750
            Node v = _graph.target(e);
751 751
            if (!reached[v] && _tolerance.positive((*_flow)[e])) {
752
              reached.set(v, true);
752
              reached[v] = true;
753 753
              _level->initAddItem(v);
754 754
              nqueue.push_back(v);
755 755
            }
756 756
          }
757 757
          for (InArcIt e(_graph, n); e != INVALID; ++e) {
758 758
            Node u = _graph.source(e);
759 759
            if (!reached[u] &&
760 760
                _tolerance.positive((*_capacity)[e] - (*_flow)[e])) {
761
              reached.set(u, true);
761
              reached[u] = true;
762 762
              _level->initAddItem(u);
763 763
              nqueue.push_back(u);
764 764
            }
765 765
          }
766 766
        }
767 767
        queue.swap(nqueue);
768 768
      }
769 769
      _level->initFinish();
770 770

	
771 771
      for (NodeIt n(_graph); n != INVALID; ++n) {
772 772
        if (!reached[n]) {
773 773
          _level->dirtyTopButOne(n);
... ...
@@ -783,63 +783,63 @@
783 783
        int new_level = _level->maxLevel();
784 784

	
785 785
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
786 786
          Value rem = (*_capacity)[e] - (*_flow)[e];
787 787
          if (!_tolerance.positive(rem)) continue;
788 788
          Node v = _graph.target(e);
789 789
          if ((*_level)[v] < level) {
790 790
            if (!_level->active(v) && v != _source) {
791 791
              _level->activate(v);
792 792
            }
793 793
            if (!_tolerance.less(rem, excess)) {
794 794
              _flow->set(e, (*_flow)[e] + excess);
795
              _excess->set(v, (*_excess)[v] + excess);
795
              (*_excess)[v] += excess;
796 796
              excess = 0;
797 797
              goto no_more_push;
798 798
            } else {
799 799
              excess -= rem;
800
              _excess->set(v, (*_excess)[v] + rem);
800
              (*_excess)[v] += rem;
801 801
              _flow->set(e, (*_capacity)[e]);
802 802
            }
803 803
          } else if (new_level > (*_level)[v]) {
804 804
            new_level = (*_level)[v];
805 805
          }
806 806
        }
807 807

	
808 808
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
809 809
          Value rem = (*_flow)[e];
810 810
          if (!_tolerance.positive(rem)) continue;
811 811
          Node v = _graph.source(e);
812 812
          if ((*_level)[v] < level) {
813 813
            if (!_level->active(v) && v != _source) {
814 814
              _level->activate(v);
815 815
            }
816 816
            if (!_tolerance.less(rem, excess)) {
817 817
              _flow->set(e, (*_flow)[e] - excess);
818
              _excess->set(v, (*_excess)[v] + excess);
818
              (*_excess)[v] += excess;
819 819
              excess = 0;
820 820
              goto no_more_push;
821 821
            } else {
822 822
              excess -= rem;
823
              _excess->set(v, (*_excess)[v] + rem);
823
              (*_excess)[v] += rem;
824 824
              _flow->set(e, 0);
825 825
            }
826 826
          } else if (new_level > (*_level)[v]) {
827 827
            new_level = (*_level)[v];
828 828
          }
829 829
        }
830 830

	
831 831
      no_more_push:
832 832

	
833
        _excess->set(n, excess);
833
        (*_excess)[n] = excess;
834 834

	
835 835
        if (excess != 0) {
836 836
          if (new_level + 1 < _level->maxLevel()) {
837 837
            _level->liftHighestActive(new_level + 1);
838 838
          } else {
839 839
            // Calculation error
840 840
            _level->liftHighestActiveToTop();
841 841
          }
842 842
          if (_level->emptyLevel(level)) {
843 843
            // Calculation error
844 844
            _level->liftToTop(level);
845 845
          }
Ignore white space 6 line context
... ...
@@ -650,25 +650,25 @@
650 650
#ifndef WIN32
651 651
      timeval tv;
652 652
      gettimeofday(&tv, 0);
653 653
      seed(getpid() + tv.tv_sec + tv.tv_usec);
654 654
#else
655 655
      seed(bits::getWinRndSeed());
656 656
#endif
657 657
      return true;
658 658
    }
659 659

	
660 660
    /// @}
661 661

	
662
    ///\name Uniform distributions
662
    ///\name Uniform Distributions
663 663
    ///
664 664
    /// @{
665 665

	
666 666
    /// \brief Returns a random real number from the range [0, 1)
667 667
    ///
668 668
    /// It returns a random real number from the range [0, 1). The
669 669
    /// default Number type is \c double.
670 670
    template <typename Number>
671 671
    Number real() {
672 672
      return _random_bits::RealConversion<Number, Word>::convert(core);
673 673
    }
674 674

	
... ...
@@ -753,25 +753,25 @@
753 753

	
754 754
    /// \brief Returns a random bool
755 755
    ///
756 756
    /// It returns a random bool. The generator holds a buffer for
757 757
    /// random bits. Every time when it become empty the generator makes
758 758
    /// a new random word and fill the buffer up.
759 759
    bool boolean() {
760 760
      return bool_producer.convert(core);
761 761
    }
762 762

	
763 763
    /// @}
764 764

	
765
    ///\name Non-uniform distributions
765
    ///\name Non-uniform Distributions
766 766
    ///
767 767
    ///@{
768 768

	
769 769
    /// \brief Returns a random bool with given probability of true result.
770 770
    ///
771 771
    /// It returns a random bool with given probability of true result.
772 772
    bool boolean(double p) {
773 773
      return operator()() < p;
774 774
    }
775 775

	
776 776
    /// Standard normal (Gauss) distribution
777 777

	
... ...
@@ -929,25 +929,25 @@
929 929
      const double l = std::exp(-lambda);
930 930
      int k=0;
931 931
      double p = 1.0;
932 932
      do {
933 933
        k++;
934 934
        p*=real<double>();
935 935
      } while (p>=l);
936 936
      return k-1;
937 937
    }
938 938

	
939 939
    ///@}
940 940

	
941
    ///\name Two dimensional distributions
941
    ///\name Two Dimensional Distributions
942 942
    ///
943 943
    ///@{
944 944

	
945 945
    /// Uniform distribution on the full unit circle
946 946

	
947 947
    /// Uniform distribution on the full unit circle.
948 948
    ///
949 949
    dim2::Point<double> disc()
950 950
    {
951 951
      double V1,V2;
952 952
      do {
953 953
        V1=2*real<double>()-1;
Ignore white space 6 line context
... ...
@@ -182,27 +182,25 @@
182 182
  };
183 183

	
184 184
  typedef DigraphExtender<SmartDigraphBase> ExtendedSmartDigraphBase;
185 185

	
186 186
  ///\ingroup graphs
187 187
  ///
188 188
  ///\brief A smart directed graph class.
189 189
  ///
190 190
  ///This is a simple and fast digraph implementation.
191 191
  ///It is also quite memory efficient, but at the price
192 192
  ///that <b> it does support only limited (only stack-like)
193 193
  ///node and arc deletions</b>.
194
  ///It conforms to the \ref concepts::Digraph "Digraph concept" with
195
  ///an important extra feature that its maps are real \ref
196
  ///concepts::ReferenceMap "reference map"s.
194
  ///It fully conforms to the \ref concepts::Digraph "Digraph concept".
197 195
  ///
198 196
  ///\sa concepts::Digraph.
199 197
  class SmartDigraph : public ExtendedSmartDigraphBase {
200 198
  public:
201 199

	
202 200
    typedef ExtendedSmartDigraphBase Parent;
203 201

	
204 202
  private:
205 203

	
206 204
    ///SmartDigraph is \e not copy constructible. Use DigraphCopy() instead.
207 205

	
208 206
    ///SmartDigraph is \e not copy constructible. Use DigraphCopy() instead.
... ...
@@ -620,33 +618,27 @@
620 618
  };
621 619

	
622 620
  typedef GraphExtender<SmartGraphBase> ExtendedSmartGraphBase;
623 621

	
624 622
  /// \ingroup graphs
625 623
  ///
626 624
  /// \brief A smart undirected graph class.
627 625
  ///
628 626
  /// This is a simple and fast graph implementation.
629 627
  /// It is also quite memory efficient, but at the price
630 628
  /// that <b> it does support only limited (only stack-like)
631 629
  /// node and arc deletions</b>.
632
  /// Except from this it conforms to
633
  /// the \ref concepts::Graph "Graph concept".
634
  ///
635
  /// It also has an
636
  /// important extra feature that
637
  /// its maps are real \ref concepts::ReferenceMap "reference map"s.
630
  /// It fully conforms to the \ref concepts::Graph "Graph concept".
638 631
  ///
639 632
  /// \sa concepts::Graph.
640
  ///
641 633
  class SmartGraph : public ExtendedSmartGraphBase {
642 634
  private:
643 635

	
644 636
    ///SmartGraph is \e not copy constructible. Use GraphCopy() instead.
645 637

	
646 638
    ///SmartGraph is \e not copy constructible. Use GraphCopy() instead.
647 639
    ///
648 640
    SmartGraph(const SmartGraph &) : ExtendedSmartGraphBase() {};
649 641

	
650 642
    ///\brief Assignment of SmartGraph to another one is \e not allowed.
651 643
    ///Use GraphCopy() instead.
652 644

	
Ignore white space 6 line context
... ...
@@ -11,51 +11,54 @@
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 <iostream>
20 20
#include <lemon/soplex.h>
21 21

	
22 22
#include <soplex.h>
23
#include <spxout.h>
23 24

	
24 25

	
25 26
///\file
26 27
///\brief Implementation of the LEMON-SOPLEX lp solver interface.
27 28
namespace lemon {
28 29

	
29 30
  SoplexLp::SoplexLp() {
30 31
    soplex = new soplex::SoPlex;
32
    messageLevel(MESSAGE_NOTHING);
31 33
  }
32 34

	
33 35
  SoplexLp::~SoplexLp() {
34 36
    delete soplex;
35 37
  }
36 38

	
37 39
  SoplexLp::SoplexLp(const SoplexLp& lp) {
38 40
    rows = lp.rows;
39 41
    cols = lp.cols;
40 42

	
41 43
    soplex = new soplex::SoPlex;
42 44
    (*static_cast<soplex::SPxLP*>(soplex)) = *(lp.soplex);
43 45

	
44 46
    _col_names = lp._col_names;
45 47
    _col_names_ref = lp._col_names_ref;
46 48

	
47 49
    _row_names = lp._row_names;
48 50
    _row_names_ref = lp._row_names_ref;
49 51

	
52
    messageLevel(MESSAGE_NOTHING);
50 53
  }
51 54

	
52 55
  void SoplexLp::_clear_temporals() {
53 56
    _primal_values.clear();
54 57
    _dual_values.clear();
55 58
  }
56 59

	
57 60
  SoplexLp* SoplexLp::newSolver() const {
58 61
    SoplexLp* newlp = new SoplexLp();
59 62
    return newlp;
60 63
  }
61 64

	
... ...
@@ -262,24 +265,26 @@
262 265

	
263 266
  void SoplexLp::_setObjCoeff(int i, Value obj_coef) {
264 267
    soplex->changeObj(i, obj_coef);
265 268
  }
266 269

	
267 270
  SoplexLp::Value SoplexLp::_getObjCoeff(int i) const {
268 271
    return soplex->obj(i);
269 272
  }
270 273

	
271 274
  SoplexLp::SolveExitStatus SoplexLp::_solve() {
272 275

	
273 276
    _clear_temporals();
277
    
278
    _applyMessageLevel();
274 279

	
275 280
    soplex::SPxSolver::Status status = soplex->solve();
276 281

	
277 282
    switch (status) {
278 283
    case soplex::SPxSolver::OPTIMAL:
279 284
    case soplex::SPxSolver::INFEASIBLE:
280 285
    case soplex::SPxSolver::UNBOUNDED:
281 286
      return SOLVED;
282 287
    default:
283 288
      return UNSOLVED;
284 289
    }
285 290
  }
... ...
@@ -410,14 +415,38 @@
410 415

	
411 416
  void SoplexLp::_clear() {
412 417
    soplex->clear();
413 418
    _col_names.clear();
414 419
    _col_names_ref.clear();
415 420
    _row_names.clear();
416 421
    _row_names_ref.clear();
417 422
    cols.clear();
418 423
    rows.clear();
419 424
    _clear_temporals();
420 425
  }
421 426

	
427
  void SoplexLp::_messageLevel(MessageLevel level) {
428
    switch (level) {
429
    case MESSAGE_NOTHING:
430
      _message_level = -1;
431
      break;
432
    case MESSAGE_ERROR:
433
      _message_level = soplex::SPxOut::ERROR;
434
      break;
435
    case MESSAGE_WARNING:
436
      _message_level = soplex::SPxOut::WARNING;
437
      break;
438
    case MESSAGE_NORMAL:
439
      _message_level = soplex::SPxOut::INFO2;
440
      break;
441
    case MESSAGE_VERBOSE:
442
      _message_level = soplex::SPxOut::DEBUG;
443
      break;
444
    }
445
  }
446

	
447
  void SoplexLp::_applyMessageLevel() {
448
    soplex::Param::setVerbose(_message_level);
449
  }
450

	
422 451
} //namespace lemon
423 452

	
Ignore white space 6 line context
... ...
@@ -135,18 +135,23 @@
135 135

	
136 136
    virtual Value _getPrimalRay(int i) const;
137 137
    virtual Value _getDualRay(int i) const;
138 138

	
139 139
    virtual VarStatus _getColStatus(int i) const;
140 140
    virtual VarStatus _getRowStatus(int i) const;
141 141

	
142 142
    virtual ProblemType _getPrimalType() const;
143 143
    virtual ProblemType _getDualType() const;
144 144

	
145 145
    virtual void _clear();
146 146

	
147
    void _messageLevel(MessageLevel m);
148
    void _applyMessageLevel();
149

	
150
    int _message_level;
151

	
147 152
  };
148 153

	
149 154
} //END OF NAMESPACE LEMON
150 155

	
151 156
#endif //LEMON_SOPLEX_H
152 157

	
Ignore white space 6 line context
... ...
@@ -279,25 +279,25 @@
279 279
    /// minimum cost flow problem.
280 280
    ///
281 281
    /// \return <tt>(*this)</tt>
282 282
    Suurballe& potentialMap(PotentialMap &map) {
283 283
      if (_local_potential) {
284 284
        delete _potential;
285 285
        _local_potential = false;
286 286
      }
287 287
      _potential = &map;
288 288
      return *this;
289 289
    }
290 290

	
291
    /// \name Execution control
291
    /// \name Execution Control
292 292
    /// The simplest way to execute the algorithm is to call the run()
293 293
    /// function.
294 294
    /// \n
295 295
    /// If you only need the flow that is the union of the found
296 296
    /// arc-disjoint paths, you may call init() and findFlow().
297 297

	
298 298
    /// @{
299 299

	
300 300
    /// \brief Run the algorithm.
301 301
    ///
302 302
    /// This function runs the algorithm.
303 303
    ///
Ignore white space 6 line context
... ...
@@ -278,25 +278,25 @@
278 278
    TimeStamp start_time; //This is the relativ start-time if the timer
279 279
                          //is _running, the collected _running time otherwise.
280 280

	
281 281
    void _reset() {if(_running) start_time.stamp(); else start_time.reset();}
282 282

	
283 283
  public:
284 284
    ///Constructor.
285 285

	
286 286
    ///\param run indicates whether or not the timer starts immediately.
287 287
    ///
288 288
    Timer(bool run=true) :_running(run) {_reset();}
289 289

	
290
    ///\name Control the state of the timer
290
    ///\name Control the State of the Timer
291 291
    ///Basically a Timer can be either running or stopped,
292 292
    ///but it provides a bit finer control on the execution.
293 293
    ///The \ref lemon::Timer "Timer" also counts the number of
294 294
    ///\ref lemon::Timer::start() "start()" executions, and it stops
295 295
    ///only after the same amount (or more) \ref lemon::Timer::stop()
296 296
    ///"stop()"s. This can be useful e.g. to compute the running time
297 297
    ///of recursive functions.
298 298

	
299 299
    ///@{
300 300

	
301 301
    ///Reset and stop the time counters
302 302

	
... ...
@@ -386,25 +386,25 @@
386 386

	
387 387
    ///This function is a shorthand for
388 388
    ///a reset() and a start() calls.
389 389
    ///
390 390
    void restart()
391 391
    {
392 392
      reset();
393 393
      start();
394 394
    }
395 395

	
396 396
    ///@}
397 397

	
398
    ///\name Query Functions for the ellapsed time
398
    ///\name Query Functions for the Ellapsed Time
399 399

	
400 400
    ///@{
401 401

	
402 402
    ///Gives back the ellapsed user time of the process
403 403
    double userTime() const
404 404
    {
405 405
      return operator TimeStamp().userTime();
406 406
    }
407 407
    ///Gives back the ellapsed system time of the process
408 408
    double systemTime() const
409 409
    {
410 410
      return operator TimeStamp().systemTime();
Ignore white space 6 line context
... ...
@@ -49,59 +49,98 @@
49 49
  "@attributes\n"
50 50
  "source 0\n"
51 51
  "target 4\n";
52 52

	
53 53
void checkBfsCompile()
54 54
{
55 55
  typedef concepts::Digraph Digraph;
56 56
  typedef Bfs<Digraph> BType;
57 57
  typedef Digraph::Node Node;
58 58
  typedef Digraph::Arc Arc;
59 59

	
60 60
  Digraph G;
61
  Node s, t;
61
  Node s, t, n;
62 62
  Arc e;
63
  int l;
63
  int l, i;
64 64
  bool b;
65 65
  BType::DistMap d(G);
66 66
  BType::PredMap p(G);
67 67
  Path<Digraph> pp;
68
  concepts::ReadMap<Node,bool> nm;
68 69

	
69 70
  {
70 71
    BType bfs_test(G);
72
    const BType& const_bfs_test = bfs_test;
71 73

	
72 74
    bfs_test.run(s);
73 75
    bfs_test.run(s,t);
74 76
    bfs_test.run();
75 77

	
76
    l  = bfs_test.dist(t);
77
    e  = bfs_test.predArc(t);
78
    s  = bfs_test.predNode(t);
79
    b  = bfs_test.reached(t);
80
    d  = bfs_test.distMap();
81
    p  = bfs_test.predMap();
82
    pp = bfs_test.path(t);
78
    bfs_test.init();
79
    bfs_test.addSource(s);
80
    n = bfs_test.processNextNode();
81
    n = bfs_test.processNextNode(t, b);
82
    n = bfs_test.processNextNode(nm, n);
83
    n = const_bfs_test.nextNode();
84
    b = const_bfs_test.emptyQueue();
85
    i = const_bfs_test.queueSize();
86
    
87
    bfs_test.start();
88
    bfs_test.start(t);
89
    bfs_test.start(nm);
90

	
91
    l  = const_bfs_test.dist(t);
92
    e  = const_bfs_test.predArc(t);
93
    s  = const_bfs_test.predNode(t);
94
    b  = const_bfs_test.reached(t);
95
    d  = const_bfs_test.distMap();
96
    p  = const_bfs_test.predMap();
97
    pp = const_bfs_test.path(t);
83 98
  }
84 99
  {
85 100
    BType
86 101
      ::SetPredMap<concepts::ReadWriteMap<Node,Arc> >
87 102
      ::SetDistMap<concepts::ReadWriteMap<Node,int> >
88 103
      ::SetReachedMap<concepts::ReadWriteMap<Node,bool> >
104
      ::SetStandardProcessedMap
89 105
      ::SetProcessedMap<concepts::WriteMap<Node,bool> >
90
      ::SetStandardProcessedMap
91 106
      ::Create bfs_test(G);
107
      
108
    concepts::ReadWriteMap<Node,Arc> pred_map;
109
    concepts::ReadWriteMap<Node,int> dist_map;
110
    concepts::ReadWriteMap<Node,bool> reached_map;
111
    concepts::WriteMap<Node,bool> processed_map;
112
    
113
    bfs_test
114
      .predMap(pred_map)
115
      .distMap(dist_map)
116
      .reachedMap(reached_map)
117
      .processedMap(processed_map);
92 118

	
93 119
    bfs_test.run(s);
94 120
    bfs_test.run(s,t);
95 121
    bfs_test.run();
122
    
123
    bfs_test.init();
124
    bfs_test.addSource(s);
125
    n = bfs_test.processNextNode();
126
    n = bfs_test.processNextNode(t, b);
127
    n = bfs_test.processNextNode(nm, n);
128
    n = bfs_test.nextNode();
129
    b = bfs_test.emptyQueue();
130
    i = bfs_test.queueSize();
131
    
132
    bfs_test.start();
133
    bfs_test.start(t);
134
    bfs_test.start(nm);
96 135

	
97 136
    l  = bfs_test.dist(t);
98 137
    e  = bfs_test.predArc(t);
99 138
    s  = bfs_test.predNode(t);
100 139
    b  = bfs_test.reached(t);
101 140
    pp = bfs_test.path(t);
102 141
  }
103 142
}
104 143

	
105 144
void checkBfsFunctionCompile()
106 145
{
107 146
  typedef int VType;
Ignore white space 6 line context
... ...
@@ -62,45 +62,52 @@
62 62
  typedef concepts::WriteMap<Node,bool> BarrierMap;
63 63

	
64 64
  typedef Elevator<Digraph, Digraph::Node> Elev;
65 65
  typedef LinkedElevator<Digraph, Digraph::Node> LinkedElev;
66 66

	
67 67
  Digraph g;
68 68
  Node n;
69 69
  Arc a;
70 70
  CapMap lcap, ucap;
71 71
  DeltaMap delta;
72 72
  FlowMap flow;
73 73
  BarrierMap bar;
74
  VType v;
75
  bool b;
74 76

	
75
  Circulation<Digraph, CapMap, CapMap, DeltaMap>
76
    ::SetFlowMap<FlowMap>
77
    ::SetElevator<Elev>
78
    ::SetStandardElevator<LinkedElev>
79
    ::Create circ_test(g,lcap,ucap,delta);
80

	
81
  circ_test.lowerCapMap(lcap);
82
  circ_test.upperCapMap(ucap);
83
  circ_test.deltaMap(delta);
84
  flow = circ_test.flowMap();
85
  circ_test.flowMap(flow);
77
  typedef Circulation<Digraph, CapMap, CapMap, DeltaMap>
78
            ::SetFlowMap<FlowMap>
79
            ::SetElevator<Elev>
80
            ::SetStandardElevator<LinkedElev>
81
            ::Create CirculationType;
82
  CirculationType circ_test(g, lcap, ucap, delta);
83
  const CirculationType& const_circ_test = circ_test;
84
   
85
  circ_test
86
    .lowerCapMap(lcap)
87
    .upperCapMap(ucap)
88
    .deltaMap(delta)
89
    .flowMap(flow);
86 90

	
87 91
  circ_test.init();
88 92
  circ_test.greedyInit();
89 93
  circ_test.start();
90 94
  circ_test.run();
91 95

	
92
  circ_test.barrier(n);
93
  circ_test.barrierMap(bar);
94
  circ_test.flow(a);
96
  v = const_circ_test.flow(a);
97
  const FlowMap& fm = const_circ_test.flowMap();
98
  b = const_circ_test.barrier(n);
99
  const_circ_test.barrierMap(bar);
100
  
101
  ignore_unused_variable_warning(fm);
95 102
}
96 103

	
97 104
template <class G, class LM, class UM, class DM>
98 105
void checkCirculation(const G& g, const LM& lm, const UM& um,
99 106
                      const DM& dm, bool find)
100 107
{
101 108
  Circulation<G, LM, UM, DM> circ(g, lm, um, dm);
102 109
  bool ret = circ.run();
103 110
  if (find) {
104 111
    check(ret, "A feasible solution should have been found.");
105 112
    check(circ.checkFlow(), "The found flow is corrupt.");
106 113
    check(!circ.checkBarrier(), "A barrier should not have been found.");
Ignore white space 6 line context
... ...
@@ -53,57 +53,92 @@
53 53
  "target 5\n";
54 54

	
55 55
void checkDfsCompile()
56 56
{
57 57
  typedef concepts::Digraph Digraph;
58 58
  typedef Dfs<Digraph> DType;
59 59
  typedef Digraph::Node Node;
60 60
  typedef Digraph::Arc Arc;
61 61

	
62 62
  Digraph G;
63 63
  Node s, t;
64 64
  Arc e;
65
  int l;
65
  int l, i;
66 66
  bool b;
67 67
  DType::DistMap d(G);
68 68
  DType::PredMap p(G);
69 69
  Path<Digraph> pp;
70
  concepts::ReadMap<Arc,bool> am;
70 71

	
71 72
  {
72 73
    DType dfs_test(G);
74
    const DType& const_dfs_test = dfs_test;
73 75

	
74 76
    dfs_test.run(s);
75 77
    dfs_test.run(s,t);
76 78
    dfs_test.run();
77 79

	
78
    l  = dfs_test.dist(t);
79
    e  = dfs_test.predArc(t);
80
    s  = dfs_test.predNode(t);
81
    b  = dfs_test.reached(t);
82
    d  = dfs_test.distMap();
83
    p  = dfs_test.predMap();
84
    pp = dfs_test.path(t);
80
    dfs_test.init();
81
    dfs_test.addSource(s);
82
    e = dfs_test.processNextArc();
83
    e = const_dfs_test.nextArc();
84
    b = const_dfs_test.emptyQueue();
85
    i = const_dfs_test.queueSize();
86
    
87
    dfs_test.start();
88
    dfs_test.start(t);
89
    dfs_test.start(am);
90

	
91
    l  = const_dfs_test.dist(t);
92
    e  = const_dfs_test.predArc(t);
93
    s  = const_dfs_test.predNode(t);
94
    b  = const_dfs_test.reached(t);
95
    d  = const_dfs_test.distMap();
96
    p  = const_dfs_test.predMap();
97
    pp = const_dfs_test.path(t);
85 98
  }
86 99
  {
87 100
    DType
88 101
      ::SetPredMap<concepts::ReadWriteMap<Node,Arc> >
89 102
      ::SetDistMap<concepts::ReadWriteMap<Node,int> >
90 103
      ::SetReachedMap<concepts::ReadWriteMap<Node,bool> >
104
      ::SetStandardProcessedMap
91 105
      ::SetProcessedMap<concepts::WriteMap<Node,bool> >
92
      ::SetStandardProcessedMap
93 106
      ::Create dfs_test(G);
94 107

	
108
    concepts::ReadWriteMap<Node,Arc> pred_map;
109
    concepts::ReadWriteMap<Node,int> dist_map;
110
    concepts::ReadWriteMap<Node,bool> reached_map;
111
    concepts::WriteMap<Node,bool> processed_map;
112
    
113
    dfs_test
114
      .predMap(pred_map)
115
      .distMap(dist_map)
116
      .reachedMap(reached_map)
117
      .processedMap(processed_map);
118

	
95 119
    dfs_test.run(s);
96 120
    dfs_test.run(s,t);
97 121
    dfs_test.run();
122
    dfs_test.init();
123

	
124
    dfs_test.addSource(s);
125
    e = dfs_test.processNextArc();
126
    e = dfs_test.nextArc();
127
    b = dfs_test.emptyQueue();
128
    i = dfs_test.queueSize();
129
    
130
    dfs_test.start();
131
    dfs_test.start(t);
132
    dfs_test.start(am);
98 133

	
99 134
    l  = dfs_test.dist(t);
100 135
    e  = dfs_test.predArc(t);
101 136
    s  = dfs_test.predNode(t);
102 137
    b  = dfs_test.reached(t);
103 138
    pp = dfs_test.path(t);
104 139
  }
105 140
}
106 141

	
107 142
void checkDfsFunctionCompile()
108 143
{
109 144
  typedef int VType;
Ignore white space 6 line context
... ...
@@ -51,66 +51,112 @@
51 51
  "target 3\n";
52 52

	
53 53
void checkDijkstraCompile()
54 54
{
55 55
  typedef int VType;
56 56
  typedef concepts::Digraph Digraph;
57 57
  typedef concepts::ReadMap<Digraph::Arc,VType> LengthMap;
58 58
  typedef Dijkstra<Digraph, LengthMap> DType;
59 59
  typedef Digraph::Node Node;
60 60
  typedef Digraph::Arc Arc;
61 61

	
62 62
  Digraph G;
63
  Node s, t;
63
  Node s, t, n;
64 64
  Arc e;
65 65
  VType l;
66
  int i;
66 67
  bool b;
67 68
  DType::DistMap d(G);
68 69
  DType::PredMap p(G);
69 70
  LengthMap length;
70 71
  Path<Digraph> pp;
72
  concepts::ReadMap<Node,bool> nm;
71 73

	
72 74
  {
73 75
    DType dijkstra_test(G,length);
76
    const DType& const_dijkstra_test = dijkstra_test;
74 77

	
75 78
    dijkstra_test.run(s);
76 79
    dijkstra_test.run(s,t);
77 80

	
81
    dijkstra_test.init();
82
    dijkstra_test.addSource(s);
83
    dijkstra_test.addSource(s, 1);
84
    n = dijkstra_test.processNextNode();
85
    n = const_dijkstra_test.nextNode();
86
    b = const_dijkstra_test.emptyQueue();
87
    i = const_dijkstra_test.queueSize();
88
    
89
    dijkstra_test.start();
90
    dijkstra_test.start(t);
91
    dijkstra_test.start(nm);
92

	
93
    l  = const_dijkstra_test.dist(t);
94
    e  = const_dijkstra_test.predArc(t);
95
    s  = const_dijkstra_test.predNode(t);
96
    b  = const_dijkstra_test.reached(t);
97
    b  = const_dijkstra_test.processed(t);
98
    d  = const_dijkstra_test.distMap();
99
    p  = const_dijkstra_test.predMap();
100
    pp = const_dijkstra_test.path(t);
101
    l  = const_dijkstra_test.currentDist(t);
102
  }
103
  {
104
    DType
105
      ::SetPredMap<concepts::ReadWriteMap<Node,Arc> >
106
      ::SetDistMap<concepts::ReadWriteMap<Node,VType> >
107
      ::SetStandardProcessedMap
108
      ::SetProcessedMap<concepts::WriteMap<Node,bool> >
109
      ::SetOperationTraits<DijkstraDefaultOperationTraits<VType> >
110
      ::SetHeap<BinHeap<VType, concepts::ReadWriteMap<Node,int> > >
111
      ::SetStandardHeap<BinHeap<VType, concepts::ReadWriteMap<Node,int> > >
112
      ::SetHeap<BinHeap<VType, concepts::ReadWriteMap<Node,int> >, 
113
                concepts::ReadWriteMap<Node,int> >
114
      ::Create dijkstra_test(G,length);
115

	
116
    LengthMap length_map;
117
    concepts::ReadWriteMap<Node,Arc> pred_map;
118
    concepts::ReadWriteMap<Node,VType> dist_map;
119
    concepts::WriteMap<Node,bool> processed_map;
120
    concepts::ReadWriteMap<Node,int> heap_cross_ref;
121
    BinHeap<VType, concepts::ReadWriteMap<Node,int> > heap(heap_cross_ref);
122
    
123
    dijkstra_test
124
      .lengthMap(length_map)
125
      .predMap(pred_map)
126
      .distMap(dist_map)
127
      .processedMap(processed_map)
128
      .heap(heap, heap_cross_ref);
129

	
130
    dijkstra_test.run(s);
131
    dijkstra_test.run(s,t);
132

	
133
    dijkstra_test.addSource(s);
134
    dijkstra_test.addSource(s, 1);
135
    n = dijkstra_test.processNextNode();
136
    n = dijkstra_test.nextNode();
137
    b = dijkstra_test.emptyQueue();
138
    i = dijkstra_test.queueSize();
139
    
140
    dijkstra_test.start();
141
    dijkstra_test.start(t);
142
    dijkstra_test.start(nm);
143

	
78 144
    l  = dijkstra_test.dist(t);
79 145
    e  = dijkstra_test.predArc(t);
80 146
    s  = dijkstra_test.predNode(t);
81 147
    b  = dijkstra_test.reached(t);
82
    d  = dijkstra_test.distMap();
83
    p  = dijkstra_test.predMap();
148
    b  = dijkstra_test.processed(t);
84 149
    pp = dijkstra_test.path(t);
85
  }
86
  {
87
    DType
88
      ::SetPredMap<concepts::ReadWriteMap<Node,Arc> >
89
      ::SetDistMap<concepts::ReadWriteMap<Node,VType> >
90
      ::SetProcessedMap<concepts::WriteMap<Node,bool> >
91
      ::SetStandardProcessedMap
92
      ::SetOperationTraits<DijkstraDefaultOperationTraits<VType> >
93
      ::SetHeap<BinHeap<VType, concepts::ReadWriteMap<Node,int> > >
94
      ::SetStandardHeap<BinHeap<VType, concepts::ReadWriteMap<Node,int> > >
95
      ::Create dijkstra_test(G,length);
96

	
97
    dijkstra_test.run(s);
98
    dijkstra_test.run(s,t);
99

	
100
    l  = dijkstra_test.dist(t);
101
    e  = dijkstra_test.predArc(t);
102
    s  = dijkstra_test.predNode(t);
103
    b  = dijkstra_test.reached(t);
104
    pp = dijkstra_test.path(t);
150
    l  = dijkstra_test.currentDist(t);
105 151
  }
106 152

	
107 153
}
108 154

	
109 155
void checkDijkstraFunctionCompile()
110 156
{
111 157
  typedef int VType;
112 158
  typedef concepts::Digraph Digraph;
113 159
  typedef Digraph::Arc Arc;
114 160
  typedef Digraph::Node Node;
115 161
  typedef concepts::ReadMap<Digraph::Arc,VType> LengthMap;
116 162

	
Ignore white space 6 line context
1 1
#include <iostream>
2 2

	
3 3
#include "test_tools.h"
4 4
#include <lemon/smart_graph.h>
5
#include <lemon/concepts/graph.h>
6
#include <lemon/concepts/maps.h>
5 7
#include <lemon/lgf_reader.h>
6 8
#include <lemon/gomory_hu.h>
7 9
#include <cstdlib>
8 10

	
9 11
using namespace std;
10 12
using namespace lemon;
11 13

	
12 14
typedef SmartGraph Graph;
13 15

	
14 16
char test_lgf[] =
15 17
  "@nodes\n"
16 18
  "label\n"
... ...
@@ -23,24 +25,54 @@
23 25
  "     label capacity\n"
24 26
  "0 1  0     1\n"
25 27
  "1 2  1     1\n"
26 28
  "2 3  2     1\n"
27 29
  "0 3  4     5\n"
28 30
  "0 3  5     10\n"
29 31
  "0 3  6     7\n"
30 32
  "4 2  7     1\n"
31 33
  "@attributes\n"
32 34
  "source 0\n"
33 35
  "target 3\n";
34 36
  
37
void checkGomoryHuCompile()
38
{
39
  typedef int Value;
40
  typedef concepts::Graph Graph;
41

	
42
  typedef Graph::Node Node;
43
  typedef Graph::Edge Edge;
44
  typedef concepts::ReadMap<Edge, Value> CapMap;
45
  typedef concepts::ReadWriteMap<Node, bool> CutMap;
46

	
47
  Graph g;
48
  Node n;
49
  CapMap cap;
50
  CutMap cut;
51
  Value v;
52
  int d;
53

	
54
  GomoryHu<Graph, CapMap> gh_test(g, cap);
55
  const GomoryHu<Graph, CapMap>&
56
    const_gh_test = gh_test;
57

	
58
  gh_test.run();
59

	
60
  n = const_gh_test.predNode(n);
61
  v = const_gh_test.predValue(n);
62
  d = const_gh_test.rootDist(n);
63
  v = const_gh_test.minCutValue(n, n);
64
  v = const_gh_test.minCutMap(n, n, cut);
65
}
66

	
35 67
GRAPH_TYPEDEFS(Graph);
36 68
typedef Graph::EdgeMap<int> IntEdgeMap;
37 69
typedef Graph::NodeMap<bool> BoolNodeMap;
38 70

	
39 71
int cutValue(const Graph& graph, const BoolNodeMap& cut,
40 72
	     const IntEdgeMap& capacity) {
41 73

	
42 74
  int sum = 0;
43 75
  for (EdgeIt e(graph); e != INVALID; ++e) {
44 76
    Node s = graph.u(e);
45 77
    Node t = graph.v(e);
46 78

	
... ...
@@ -61,32 +93,31 @@
61 93
    edgeMap("capacity", capacity).run();
62 94

	
63 95
  GomoryHu<Graph> ght(graph, capacity);
64 96
  ght.run();
65 97

	
66 98
  for (NodeIt u(graph); u != INVALID; ++u) {
67 99
    for (NodeIt v(graph); v != u; ++v) {
68 100
      Preflow<Graph, IntEdgeMap> pf(graph, capacity, u, v);
69 101
      pf.runMinCut();
70 102
      BoolNodeMap cm(graph);
71 103
      ght.minCutMap(u, v, cm);
72 104
      check(pf.flowValue() == ght.minCutValue(u, v), "Wrong cut 1");
73
      check(cm[u] != cm[v], "Wrong cut 3");
74
      check(pf.flowValue() == cutValue(graph, cm, capacity), "Wrong cut 2");
105
      check(cm[u] != cm[v], "Wrong cut 2");
106
      check(pf.flowValue() == cutValue(graph, cm, capacity), "Wrong cut 3");
75 107

	
76 108
      int sum=0;
77 109
      for(GomoryHu<Graph>::MinCutEdgeIt a(ght, u, v);a!=INVALID;++a)
78 110
        sum+=capacity[a]; 
79 111
      check(sum == ght.minCutValue(u, v), "Problem with MinCutEdgeIt");
80 112

	
81 113
      sum=0;
82 114
      for(GomoryHu<Graph>::MinCutNodeIt n(ght, u, v,true);n!=INVALID;++n)
83 115
        sum++;
84 116
      for(GomoryHu<Graph>::MinCutNodeIt n(ght, u, v,false);n!=INVALID;++n)
85 117
        sum++;
86 118
      check(sum == countNodes(graph), "Problem with MinCutNodeIt");
87
      
88 119
    }
89 120
  }
90 121
  
91 122
  return 0;
92 123
}
Ignore white space 6 line context
... ...
@@ -10,54 +10,154 @@
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

	
21 21
#include <lemon/smart_graph.h>
22
#include <lemon/adaptors.h>
23
#include <lemon/concepts/digraph.h>
24
#include <lemon/concepts/maps.h>
25
#include <lemon/lgf_reader.h>
22 26
#include <lemon/hao_orlin.h>
23 27

	
24
#include <lemon/lgf_reader.h>
25 28
#include "test_tools.h"
26 29

	
27 30
using namespace lemon;
28 31
using namespace std;
29 32

	
30 33
const std::string lgf =
31 34
  "@nodes\n"
32 35
  "label\n"
33 36
  "0\n"
34 37
  "1\n"
35 38
  "2\n"
36 39
  "3\n"
37 40
  "4\n"
38 41
  "5\n"
39 42
  "@edges\n"
40
  "     label  capacity\n"
41
  "0 1  0      2\n"
42
  "1 2  1      2\n"
43
  "2 0  2      2\n"
44
  "3 4  3      2\n"
45
  "4 5  4      2\n"
46
  "5 3  5      2\n"
47
  "2 3  6      3\n";
43
  "     cap1 cap2 cap3\n"
44
  "0 1  1    1    1   \n"
45
  "0 2  2    2    4   \n"
46
  "1 2  4    4    4   \n"
47
  "3 4  1    1    1   \n"
48
  "3 5  2    2    4   \n"
49
  "4 5  4    4    4   \n"
50
  "5 4  4    4    4   \n"
51
  "2 3  1    6    6   \n"
52
  "4 0  1    6    6   \n";
53

	
54
void checkHaoOrlinCompile()
55
{
56
  typedef int Value;
57
  typedef concepts::Digraph Digraph;
58

	
59
  typedef Digraph::Node Node;
60
  typedef Digraph::Arc Arc;
61
  typedef concepts::ReadMap<Arc, Value> CapMap;
62
  typedef concepts::WriteMap<Node, bool> CutMap;
63

	
64
  Digraph g;
65
  Node n;
66
  CapMap cap;
67
  CutMap cut;
68
  Value v;
69

	
70
  HaoOrlin<Digraph, CapMap> ho_test(g, cap);
71
  const HaoOrlin<Digraph, CapMap>&
72
    const_ho_test = ho_test;
73

	
74
  ho_test.init();
75
  ho_test.init(n);
76
  ho_test.calculateOut();
77
  ho_test.calculateIn();
78
  ho_test.run();
79
  ho_test.run(n);
80

	
81
  v = const_ho_test.minCutValue();
82
  v = const_ho_test.minCutMap(cut);
83
}
84

	
85
template <typename Graph, typename CapMap, typename CutMap>
86
typename CapMap::Value 
87
  cutValue(const Graph& graph, const CapMap& cap, const CutMap& cut)
88
{
89
  typename CapMap::Value sum = 0;
90
  for (typename Graph::ArcIt a(graph); a != INVALID; ++a) {
91
    if (cut[graph.source(a)] && !cut[graph.target(a)])
92
      sum += cap[a];
93
  }
94
  return sum;
95
}
48 96

	
49 97
int main() {
50
  SmartGraph graph;
51
  SmartGraph::EdgeMap<int> capacity(graph);
98
  SmartDigraph graph;
99
  SmartDigraph::ArcMap<int> cap1(graph), cap2(graph), cap3(graph);
100
  SmartDigraph::NodeMap<bool> cut(graph);
52 101

	
53
  istringstream lgfs(lgf);
54
  graphReader(graph, lgfs).
55
    edgeMap("capacity", capacity).run();
102
  istringstream input(lgf);
103
  digraphReader(graph, input)
104
    .arcMap("cap1", cap1)
105
    .arcMap("cap2", cap2)
106
    .arcMap("cap3", cap3)
107
    .run();
56 108

	
57
  HaoOrlin<SmartGraph, SmartGraph::EdgeMap<int> > ho(graph, capacity);
58
  ho.run();
109
  {
110
    HaoOrlin<SmartDigraph> ho(graph, cap1);
111
    ho.run();
112
    ho.minCutMap(cut);
113
    
114
    check(ho.minCutValue() == 1, "Wrong cut value");
115
    check(ho.minCutValue() == cutValue(graph, cap1, cut), "Wrong cut value");
116
  }
117
  {
118
    HaoOrlin<SmartDigraph> ho(graph, cap2);
119
    ho.run();
120
    ho.minCutMap(cut);
59 121

	
60
  check(ho.minCutValue() == 3, "Wrong cut value");
122
    check(ho.minCutValue() == 1, "Wrong cut value");
123
    check(ho.minCutValue() == cutValue(graph, cap2, cut), "Wrong cut value");
124
  }
125
  {
126
    HaoOrlin<SmartDigraph> ho(graph, cap3);
127
    ho.run();
128
    ho.minCutMap(cut);
129
    
130
    check(ho.minCutValue() == 1, "Wrong cut value");
131
    check(ho.minCutValue() == cutValue(graph, cap3, cut), "Wrong cut value");
132
  }
133
  
134
  typedef Undirector<SmartDigraph> UGraph;
135
  UGraph ugraph(graph);
136
  
137
  {
138
    HaoOrlin<UGraph, SmartDigraph::ArcMap<int> > ho(ugraph, cap1);
139
    ho.run();
140
    ho.minCutMap(cut);
141
    
142
    check(ho.minCutValue() == 2, "Wrong cut value");
143
    check(ho.minCutValue() == cutValue(ugraph, cap1, cut), "Wrong cut value");
144
  }
145
  {
146
    HaoOrlin<UGraph, SmartDigraph::ArcMap<int> > ho(ugraph, cap2);
147
    ho.run();
148
    ho.minCutMap(cut);
149
    
150
    check(ho.minCutValue() == 5, "Wrong cut value");
151
    check(ho.minCutValue() == cutValue(ugraph, cap2, cut), "Wrong cut value");
152
  }
153
  {
154
    HaoOrlin<UGraph, SmartDigraph::ArcMap<int> > ho(ugraph, cap3);
155
    ho.run();
156
    ho.minCutMap(cut);
157
    
158
    check(ho.minCutValue() == 5, "Wrong cut value");
159
    check(ho.minCutValue() == cutValue(ugraph, cap3, cut), "Wrong cut value");
160
  }
61 161

	
62 162
  return 0;
63 163
}
Ignore white space 6 line context
... ...
@@ -90,34 +90,34 @@
90 90

	
91 91
  ECostMap edge_cost_map(G, 2);
92 92
  EBoolMap tree_map(G);
93 93

	
94 94

	
95 95
  //Test with const map.
96 96
  check(kruskal(G, ConstMap<ListGraph::Edge,int>(2), tree_map)==10,
97 97
        "Total cost should be 10");
98 98
  //Test with an edge map (filled with uniform costs).
99 99
  check(kruskal(G, edge_cost_map, tree_map)==10,
100 100
        "Total cost should be 10");
101 101

	
102
  edge_cost_map.set(e1, -10);
103
  edge_cost_map.set(e2, -9);
104
  edge_cost_map.set(e3, -8);
105
  edge_cost_map.set(e4, -7);
106
  edge_cost_map.set(e5, -6);
107
  edge_cost_map.set(e6, -5);
108
  edge_cost_map.set(e7, -4);
109
  edge_cost_map.set(e8, -3);
110
  edge_cost_map.set(e9, -2);
111
  edge_cost_map.set(e10, -1);
102
  edge_cost_map[e1] = -10;
103
  edge_cost_map[e2] = -9;
104
  edge_cost_map[e3] = -8;
105
  edge_cost_map[e4] = -7;
106
  edge_cost_map[e5] = -6;
107
  edge_cost_map[e6] = -5;
108
  edge_cost_map[e7] = -4;
109
  edge_cost_map[e8] = -3;
110
  edge_cost_map[e9] = -2;
111
  edge_cost_map[e10] = -1;
112 112

	
113 113
  vector<Edge> tree_edge_vec(5);
114 114

	
115 115
  //Test with a edge map and inserter.
116 116
  check(kruskal(G, edge_cost_map,
117 117
                 tree_edge_vec.begin())
118 118
        ==-31,
119 119
        "Total cost should be -31.");
120 120

	
121 121
  tree_edge_vec.clear();
122 122

	
123 123
  check(kruskal(G, edge_cost_map,
Ignore white space 6 line context
... ...
@@ -386,30 +386,25 @@
386 386
    aTest(lp_glpk2);
387 387
    cloneTest<GlpkLp>();
388 388
  }
389 389
#endif
390 390

	
391 391
#ifdef HAVE_CPLEX
392 392
  try {
393 393
    CplexLp lp_cplex1,lp_cplex2;
394 394
    lpTest(lp_cplex1);
395 395
    aTest(lp_cplex2);
396 396
    cloneTest<CplexLp>();
397 397
  } catch (CplexEnv::LicenseError& error) {
398
#ifdef LEMON_FORCE_CPLEX_CHECK
399 398
    check(false, error.what());
400
#else
401
    std::cerr << error.what() << std::endl;
402
    std::cerr << "Cplex license check failed, lp check skipped" << std::endl;
403
#endif
404 399
  }
405 400
#endif
406 401

	
407 402
#ifdef HAVE_SOPLEX
408 403
  {
409 404
    SoplexLp lp_soplex1,lp_soplex2;
410 405
    lpTest(lp_soplex1);
411 406
    aTest(lp_soplex2);
412 407
    cloneTest<SoplexLp>();
413 408
  }
414 409
#endif
415 410

	
Ignore white space 6 line context
... ...
@@ -134,30 +134,25 @@
134 134
    GlpkMip mip1;
135 135
    aTest(mip1);
136 136
    cloneTest<GlpkMip>();
137 137
  }
138 138
#endif
139 139

	
140 140
#ifdef HAVE_CPLEX
141 141
  try {
142 142
    CplexMip mip2;
143 143
    aTest(mip2);
144 144
    cloneTest<CplexMip>();
145 145
  } catch (CplexEnv::LicenseError& error) {
146
#ifdef LEMON_FORCE_CPLEX_CHECK
147 146
    check(false, error.what());
148
#else
149
    std::cerr << error.what() << std::endl;
150
    std::cerr << "Cplex license check failed, lp check skipped" << std::endl;
151
#endif
152 147
  }
153 148
#endif
154 149

	
155 150
#ifdef HAVE_CBC
156 151
  {
157 152
    CbcMip mip1;
158 153
    aTest(mip1);
159 154
    cloneTest<CbcMip>();
160 155
  }
161 156
#endif
162 157

	
163 158
  return 0;
Ignore white space 6 line context
... ...
@@ -75,49 +75,55 @@
75 75
  typedef concepts::ReadWriteMap<Arc,VType> FlowMap;
76 76
  typedef concepts::WriteMap<Node,bool> CutMap;
77 77

	
78 78
  typedef Elevator<Digraph, Digraph::Node> Elev;
79 79
  typedef LinkedElevator<Digraph, Digraph::Node> LinkedElev;
80 80

	
81 81
  Digraph g;
82 82
  Node n;
83 83
  Arc e;
84 84
  CapMap cap;
85 85
  FlowMap flow;
86 86
  CutMap cut;
87
  VType v;
88
  bool b;
87 89

	
88
  Preflow<Digraph, CapMap>
89
    ::SetFlowMap<FlowMap>
90
    ::SetElevator<Elev>
91
    ::SetStandardElevator<LinkedElev>
92
    ::Create preflow_test(g,cap,n,n);
90
  typedef Preflow<Digraph, CapMap>
91
            ::SetFlowMap<FlowMap>
92
            ::SetElevator<Elev>
93
            ::SetStandardElevator<LinkedElev>
94
            ::Create PreflowType;
95
  PreflowType preflow_test(g, cap, n, n);
96
  const PreflowType& const_preflow_test = preflow_test;
93 97

	
94
  preflow_test.capacityMap(cap);
95
  flow = preflow_test.flowMap();
96
  preflow_test.flowMap(flow);
97
  preflow_test.source(n);
98
  preflow_test.target(n);
98
  preflow_test
99
    .capacityMap(cap)
100
    .flowMap(flow)
101
    .source(n)
102
    .target(n);
99 103

	
100 104
  preflow_test.init();
101 105
  preflow_test.init(cap);
102 106
  preflow_test.startFirstPhase();
103 107
  preflow_test.startSecondPhase();
104 108
  preflow_test.run();
105 109
  preflow_test.runMinCut();
106 110

	
107
  preflow_test.flowValue();
108
  preflow_test.minCut(n);
109
  preflow_test.minCutMap(cut);
110
  preflow_test.flow(e);
111

	
111
  v = const_preflow_test.flowValue();
112
  v = const_preflow_test.flow(e);
113
  const FlowMap& fm = const_preflow_test.flowMap();
114
  b = const_preflow_test.minCut(n);
115
  const_preflow_test.minCutMap(cut);
116
  
117
  ignore_unused_variable_warning(fm);
112 118
}
113 119

	
114 120
int cutValue (const SmartDigraph& g,
115 121
              const SmartDigraph::NodeMap<bool>& cut,
116 122
              const SmartDigraph::ArcMap<int>& cap) {
117 123

	
118 124
  int c=0;
119 125
  for(SmartDigraph::ArcIt e(g); e!=INVALID; ++e) {
120 126
    if (cut[g.source(e)] && !cut[g.target(e)]) c+=cap[e];
121 127
  }
122 128
  return c;
123 129
}
Ignore white space 6 line context
... ...
@@ -14,29 +14,28 @@
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
///\ingroup tools
20 20
///\file
21 21
///\brief DIMACS problem solver.
22 22
///
23 23
/// This program solves various problems given in DIMACS format.
24 24
///
25 25
/// See
26
/// \verbatim
27
///  dimacs-solver --help
28
/// \endverbatim
26
/// \code
27
///   dimacs-solver --help
28
/// \endcode
29 29
/// for more info on usage.
30
///
31 30

	
32 31
#include <iostream>
33 32
#include <fstream>
34 33
#include <cstring>
35 34

	
36 35
#include <lemon/smart_graph.h>
37 36
#include <lemon/dimacs.h>
38 37
#include <lemon/lgf_writer.h>
39 38
#include <lemon/time_measure.h>
40 39

	
41 40
#include <lemon/arg_parser.h>
42 41
#include <lemon/error.h>
Ignore white space 6 line context
... ...
@@ -15,29 +15,28 @@
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\ingroup tools
20 20
///\file
21 21
///\brief DIMACS to LGF converter.
22 22
///
23 23
/// This program converts various DIMACS formats to the LEMON Digraph Format
24 24
/// (LGF).
25 25
///
26 26
/// See
27
/// \verbatim
28
///  dimacs-to-lgf --help
29
/// \endverbatim
30
/// for more info on usage.
31
///
27
/// \code
28
///   dimacs-to-lgf --help
29
/// \endcode
30
/// for more info on the usage.
32 31

	
33 32
#include <iostream>
34 33
#include <fstream>
35 34
#include <cstring>
36 35

	
37 36
#include <lemon/smart_graph.h>
38 37
#include <lemon/dimacs.h>
39 38
#include <lemon/lgf_writer.h>
40 39

	
41 40
#include <lemon/arg_parser.h>
42 41
#include <lemon/error.h>
43 42

	
Ignore white space 6 line context
... ...
@@ -80,24 +80,28 @@
80 80
        -e "s/\<DefProcessedMapToBeDefaultMap\>/SetStandardProcessedMap/g"\
81 81
        -e "s/\<copyGraph\>/graphCopy/g"\
82 82
        -e "s/\<copyDigraph\>/digraphCopy/g"\
83 83
        -e "s/\<HyperCubeDigraph\>/HypercubeGraph/g"\
84 84
        -e "s/\<IntegerMap\>/RangeMap/g"\
85 85
        -e "s/\<integerMap\>/rangeMap/g"\
86 86
        -e "s/\<\([sS]\)tdMap\>/\1parseMap/g"\
87 87
        -e "s/\<\([Ff]\)unctorMap\>/\1unctorToMap/g"\
88 88
        -e "s/\<\([Mm]\)apFunctor\>/\1apToFunctor/g"\
89 89
        -e "s/\<\([Ff]\)orkWriteMap\>/\1orkMap/g"\
90 90
        -e "s/\<StoreBoolMap\>/LoggerBoolMap/g"\
91 91
        -e "s/\<storeBoolMap\>/loggerBoolMap/g"\
92
        -e "s/\<InvertableMap\>/CrossRefMap/g"\
93
        -e "s/\<invertableMap\>/crossRefMap/g"\
94
        -e "s/\<DescriptorMap\>/RangeIdMap/g"\
95
        -e "s/\<descriptorMap\>/rangeIdMap/g"\
92 96
        -e "s/\<BoundingBox\>/Box/g"\
93 97
        -e "s/\<readNauty\>/readNautyGraph/g"\
94 98
        -e "s/\<RevDigraphAdaptor\>/ReverseDigraph/g"\
95 99
        -e "s/\<revDigraphAdaptor\>/reverseDigraph/g"\
96 100
        -e "s/\<SubDigraphAdaptor\>/SubDigraph/g"\
97 101
        -e "s/\<subDigraphAdaptor\>/subDigraph/g"\
98 102
        -e "s/\<SubGraphAdaptor\>/SubGraph/g"\
99 103
        -e "s/\<subGraphAdaptor\>/subGraph/g"\
100 104
        -e "s/\<NodeSubDigraphAdaptor\>/FilterNodes/g"\
101 105
        -e "s/\<nodeSubDigraphAdaptor\>/filterNodes/g"\
102 106
        -e "s/\<ArcSubDigraphAdaptor\>/FilterArcs/g"\
103 107
        -e "s/\<arcSubDigraphAdaptor\>/filterArcs/g"\
Ignore white space 6 line context
... ...
@@ -14,30 +14,28 @@
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
/// \ingroup tools
20 20
/// \file
21 21
/// \brief Special plane digraph generator.
22 22
///
23 23
/// Graph generator application for various types of plane graphs.
24 24
///
25 25
/// See
26
/// \verbatim
27
///  lgf-gen --help
28
/// \endverbatim
26
/// \code
27
///   lgf-gen --help
28
/// \endcode
29 29
/// for more info on the usage.
30
///
31

	
32 30

	
33 31
#include <algorithm>
34 32
#include <set>
35 33
#include <ctime>
36 34
#include <lemon/list_graph.h>
37 35
#include <lemon/random.h>
38 36
#include <lemon/dim2.h>
39 37
#include <lemon/bfs.h>
40 38
#include <lemon/counter.h>
41 39
#include <lemon/suurballe.h>
42 40
#include <lemon/graph_to_eps.h>
43 41
#include <lemon/lgf_writer.h>
0 comments (0 inline)