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 12 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 12 line context
... ...
@@ -11,30 +11,43 @@
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/
Ignore white space 12 line context
... ...
@@ -18,14 +18,23 @@
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

	
... ...
@@ -42,12 +51,23 @@
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 \
Ignore white space 12 line context
... ...
@@ -404,13 +404,13 @@
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

	
Ignore white space 12 line context
... ...
@@ -2189,12 +2189,15 @@
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;
Ignore white space 12 line context
... ...
@@ -70,15 +70,15 @@
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;
... ...
@@ -19,14 +19,12 @@
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

	
Ignore white space 12 line context
... ...
@@ -44,12 +44,14 @@
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;
... ...
@@ -184,12 +186,14 @@
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;
Ignore white space 12 line context
... ...
@@ -52,18 +52,21 @@
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;
... ...
@@ -267,30 +270,14 @@
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() &&
... ...
@@ -450,11 +437,27 @@
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 12 line context
... ...
@@ -112,39 +112,18 @@
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 12 line context
... ...
@@ -450,19 +450,19 @@
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)
... ...
@@ -479,29 +479,29 @@
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);
... ...
@@ -534,22 +534,22 @@
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];
... ...
@@ -558,31 +558,31 @@
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
        }
Ignore white space 12 line context
... ...
@@ -21,21 +21,21 @@
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
  }
... ...
@@ -427,11 +427,27 @@
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 12 line context
... ...
@@ -133,12 +133,14 @@
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.
... ...
@@ -150,32 +152,12 @@
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 12 line context
... ...
@@ -418,62 +418,63 @@
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

	
Ignore white space 12 line context
... ...
@@ -494,77 +494,77 @@
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
        }
... ...
@@ -745,12 +745,13 @@
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

	
Ignore white space 12 line context
... ...
@@ -28,130 +28,127 @@
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 {
... ...
@@ -171,114 +168,120 @@
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
          }
... ...
@@ -286,65 +289,63 @@
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 >();
... ...
@@ -364,52 +365,51 @@
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();
... ...
@@ -417,286 +417,298 @@
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 {
... ...
@@ -732,31 +744,31 @@
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;
... ...
@@ -764,81 +776,77 @@
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 {
... ...
@@ -861,59 +869,60 @@
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 {
... ...
@@ -927,211 +936,220 @@
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

	
... ...
@@ -1175,60 +1193,61 @@
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

	
... ...
@@ -1242,13 +1261,13 @@
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
... ...
@@ -1259,41 +1278,41 @@
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 {
... ...
@@ -1307,39 +1326,38 @@
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() {
... ...
@@ -1352,140 +1370,143 @@
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
}
Ignore white space 12 line context
... ...
@@ -68,15 +68,15 @@
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
Ignore white space 12 line context
... ...
@@ -29,21 +29,21 @@
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.
... ...
@@ -60,13 +60,13 @@
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.
... ...
@@ -102,25 +102,27 @@
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>();
... ...
@@ -224,13 +226,13 @@
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.
... ...
@@ -282,13 +284,13 @@
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
... ...
@@ -346,31 +348,33 @@
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>();
... ...
@@ -413,13 +417,13 @@
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
... ...
@@ -697,13 +701,13 @@
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.
... ...
@@ -712,13 +716,13 @@
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
... ...
@@ -747,28 +751,30 @@
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;
... ...
@@ -790,13 +796,13 @@
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
... ...
@@ -1020,13 +1026,13 @@
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.
... ...
@@ -1035,13 +1041,13 @@
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
... ...
@@ -1070,28 +1076,30 @@
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>();
... ...
@@ -1112,13 +1120,13 @@
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
... ...
@@ -1176,13 +1184,13 @@
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.
... ...
@@ -1215,13 +1223,13 @@
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
  ///
... ...
@@ -1270,13 +1278,13 @@
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.
... ...
@@ -1312,13 +1320,13 @@
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.
... ...
@@ -1346,13 +1354,13 @@
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.
... ...
@@ -1438,13 +1446,13 @@
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.
... ...
@@ -1475,20 +1483,24 @@
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){
Ignore white space 12 line context
... ...
@@ -1312,189 +1312,189 @@
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]]) {
Ignore white space 12 line context
... ...
@@ -69,26 +69,29 @@
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

	
... ...
@@ -435,12 +438,31 @@
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)
... ...
@@ -504,27 +526,31 @@
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);
... ...
@@ -597,13 +623,13 @@
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
... ...
@@ -644,13 +670,13 @@
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:
... ...
@@ -715,13 +741,12 @@
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
... ...
@@ -748,13 +773,13 @@
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
... ...
@@ -861,12 +886,13 @@
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

	
Ignore white space 12 line context
... ...
@@ -141,20 +141,35 @@
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
  ///
Ignore white space 12 line context
... ...
@@ -203,13 +203,13 @@
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;
Ignore white space 12 line context
... ...
@@ -283,13 +283,13 @@
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;
Ignore white space 12 line context
... ...
@@ -34,34 +34,39 @@
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;
... ...
@@ -93,14 +98,13 @@
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
... ...
@@ -250,13 +254,13 @@
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
... ...
@@ -284,13 +288,13 @@
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
... ...
@@ -310,13 +314,13 @@
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.
... ...
@@ -356,17 +360,17 @@
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
Ignore white space 12 line context
... ...
@@ -73,29 +73,29 @@
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.
... ...
@@ -223,13 +223,13 @@
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

	
... ...
@@ -246,13 +246,13 @@
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
... ...
@@ -266,13 +266,13 @@
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

	
... ...
@@ -296,13 +296,13 @@
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

	
... ...
@@ -316,13 +316,13 @@
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)"
... ...
@@ -336,13 +336,13 @@
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
      }
... ...
@@ -367,37 +367,37 @@
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;
... ...
@@ -430,23 +430,23 @@
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.
... ...
@@ -548,57 +548,57 @@
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;
... ...
@@ -682,27 +682,27 @@
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

	
... ...
@@ -711,39 +711,39 @@
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))
... ...
@@ -771,26 +771,26 @@
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
    }
... ...
@@ -800,26 +800,26 @@
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
    }
... ...
@@ -829,19 +829,19 @@
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

	
... ...
@@ -853,29 +853,29 @@
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
    }
... ...
@@ -885,24 +885,24 @@
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) {
... ...
@@ -934,29 +934,29 @@
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

	
Ignore white space 12 line context
... ...
@@ -21,25 +21,25 @@
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
... ...
@@ -120,13 +120,13 @@
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
... ...
@@ -225,13 +225,13 @@
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
Ignore white space 12 line context
... ...
@@ -154,15 +154,14 @@
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
... ...
@@ -524,15 +523,13 @@
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
Ignore white space 12 line context
... ...
@@ -28,20 +28,22 @@
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

	
... ...
@@ -523,25 +525,43 @@
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

	
... ...
@@ -559,26 +579,13 @@
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:
... ...
@@ -601,26 +608,13 @@
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)) {
... ...
@@ -855,26 +849,20 @@
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);
... ...
@@ -897,26 +885,13 @@
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:
... ...
@@ -935,26 +910,13 @@
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

	
... ...
@@ -999,11 +961,7 @@
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 12 line context
... ...
@@ -97,23 +97,29 @@
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.
... ...
@@ -188,36 +194,12 @@
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
... ...
@@ -241,36 +223,12 @@
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
Ignore white space 12 line context
... ...
@@ -39,43 +39,41 @@
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

	
... ...
@@ -114,43 +112,43 @@
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);
... ...
@@ -161,39 +159,39 @@
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:
... ...
@@ -212,49 +210,59 @@
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]) {
... ...
@@ -271,22 +279,29 @@
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
      
... ...
@@ -306,15 +321,15 @@
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;
... ...
@@ -335,13 +350,13 @@
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);
... ...
@@ -432,26 +447,26 @@
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;
... ...
@@ -465,23 +480,27 @@
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);
Ignore white space 12 line context
... ...
@@ -265,28 +265,24 @@
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;
Ignore white space 12 line context
... ...
@@ -494,15 +494,13 @@
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>.
Ignore white space 12 line context
... ...
@@ -28,63 +28,70 @@
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;
... ...
@@ -158,92 +165,93 @@
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;
... ...
@@ -254,33 +262,33 @@
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

	
... ...
@@ -315,20 +323,20 @@
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

	
... ...
@@ -339,29 +347,29 @@
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(),
... ...
@@ -373,32 +381,32 @@
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()) {
... ...
@@ -406,16 +414,16 @@
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 {
... ...
@@ -431,38 +439,38 @@
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())
... ...
@@ -472,35 +480,35 @@
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
          }
... ...
@@ -514,36 +522,37 @@
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;
... ...
@@ -554,33 +563,33 @@
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]) {
... ...
@@ -615,20 +624,20 @@
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

	
... ...
@@ -639,29 +648,29 @@
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(),
... ...
@@ -673,48 +682,48 @@
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 {
... ...
@@ -730,38 +739,38 @@
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())
... ...
@@ -771,35 +780,35 @@
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
          }
... ...
@@ -812,37 +821,38 @@
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);
... ...
@@ -876,91 +886,103 @@
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 12 line context
... ...
@@ -289,15 +289,13 @@
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.
Ignore white space 12 line context
... ...
@@ -245,39 +245,39 @@
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
... ...
@@ -298,27 +298,25 @@
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);
Ignore white space 12 line context
... ...
@@ -589,13 +589,13 @@
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>
... ...
@@ -694,13 +694,13 @@
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) {
... ...
@@ -723,13 +723,13 @@
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.
... ...
@@ -1112,13 +1112,13 @@
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() {
... ...
@@ -1412,13 +1412,13 @@
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>
... ...
@@ -1563,13 +1563,13 @@
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) {
... ...
@@ -1592,13 +1592,13 @@
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.
... ...
@@ -1982,13 +1982,13 @@
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() {
... ...
@@ -2206,13 +2206,13 @@
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
... ...
@@ -2305,13 +2305,13 @@
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() {
... ...
@@ -2497,13 +2497,13 @@
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 {
... ...
@@ -2523,13 +2523,13 @@
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().
... ...
@@ -2581,13 +2581,13 @@
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 {
... ...
@@ -2607,13 +2607,13 @@
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 {
... ...
@@ -2683,13 +2683,13 @@
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() {
Ignore white space 12 line context
... ...
@@ -533,13 +533,13 @@
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>
... ...
@@ -636,13 +636,13 @@
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) {
... ...
@@ -663,13 +663,13 @@
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() {
... ...
@@ -880,13 +880,13 @@
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() {
... ...
@@ -1126,13 +1126,13 @@
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>
... ...
@@ -1275,13 +1275,13 @@
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) {
... ...
@@ -1302,13 +1302,13 @@
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() {
... ...
@@ -1519,13 +1519,13 @@
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() {
... ...
@@ -1696,13 +1696,13 @@
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
... ...
@@ -1763,13 +1763,13 @@
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() {
Ignore white space 12 line context
... ...
@@ -317,15 +317,12 @@
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

	
... ...
@@ -1173,15 +1170,12 @@
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

	
Ignore white space 12 line context
... ...
@@ -49,29 +49,44 @@
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;
... ...
@@ -970,12 +985,14 @@
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) {}
... ...
@@ -985,13 +1002,13 @@
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

	
... ...
@@ -1524,12 +1541,15 @@
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

	
... ...
@@ -1765,21 +1785,21 @@
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
... ...
@@ -1829,13 +1849,13 @@
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();
... ...
@@ -1951,23 +1971,22 @@
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
... ...
@@ -1983,20 +2002,20 @@
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.
... ...
@@ -2011,13 +2030,13 @@
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();
Ignore white space 12 line context
... ...
@@ -81,12 +81,14 @@
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

	
Ignore white space 12 line context
... ...
@@ -137,12 +137,14 @@
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.
Ignore white space 12 line context
... ...
@@ -2725,14 +2725,14 @@
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>
Ignore white space 12 line context
... ...
@@ -279,79 +279,79 @@
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
    }
... ...
@@ -359,36 +359,36 @@
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

	
... ...
@@ -424,35 +424,35 @@
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
    }
... ...
@@ -466,27 +466,27 @@
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
... ...
@@ -494,13 +494,13 @@
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.
... ...
@@ -509,13 +509,13 @@
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

	
... ...
@@ -1545,15 +1545,15 @@
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;
... ...
@@ -1641,35 +1641,35 @@
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);
... ...
@@ -2738,15 +2738,15 @@
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;
... ...
@@ -2828,32 +2828,32 @@
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

	
Ignore white space 12 line context
... ...
@@ -87,16 +87,16 @@
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
  ///
... ...
@@ -290,13 +290,13 @@
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]]);
... ...
@@ -332,13 +332,13 @@
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;
... ...
@@ -361,13 +361,13 @@
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]);
... ...
@@ -387,13 +387,13 @@
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;
... ...
@@ -627,13 +627,13 @@
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
... ...
@@ -647,19 +647,19 @@
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.
Ignore white space 12 line context
... ...
@@ -401,38 +401,38 @@
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);
... ...
@@ -441,13 +441,13 @@
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
    }
... ...
@@ -475,43 +475,43 @@
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);
... ...
@@ -521,25 +521,25 @@
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;
... ...
@@ -574,18 +574,18 @@
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
          }
... ...
@@ -597,28 +597,28 @@
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();
... ...
@@ -647,18 +647,18 @@
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
          }
... ...
@@ -670,28 +670,28 @@
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);
... ...
@@ -728,40 +728,40 @@
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);
... ...
@@ -789,18 +789,18 @@
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
        }
... ...
@@ -812,28 +812,28 @@
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
Ignore white space 12 line context
... ...
@@ -656,13 +656,13 @@
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
... ...
@@ -759,13 +759,13 @@
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.
... ...
@@ -935,13 +935,13 @@
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.
Ignore white space 12 line context
... ...
@@ -188,15 +188,13 @@
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;
... ...
@@ -626,21 +624,15 @@
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.
Ignore white space 12 line context
... ...
@@ -17,20 +17,22 @@
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

	
... ...
@@ -44,12 +46,13 @@
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
  }
... ...
@@ -268,12 +271,14 @@
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:
... ...
@@ -416,8 +421,32 @@
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 12 line context
... ...
@@ -141,12 +141,17 @@
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 12 line context
... ...
@@ -285,13 +285,13 @@
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

	
Ignore white space 12 line context
... ...
@@ -284,13 +284,13 @@
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
... ...
@@ -392,13 +392,13 @@
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
    {
Ignore white space 12 line context
... ...
@@ -55,47 +55,86 @@
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);
Ignore white space 12 line context
... ...
@@ -68,33 +68,40 @@
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
{
Ignore white space 12 line context
... ...
@@ -59,45 +59,80 @@
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);
Ignore white space 12 line context
... ...
@@ -57,54 +57,100 @@
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
{
Ignore white space 12 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;
... ...
@@ -29,12 +31,42 @@
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) {
... ...
@@ -67,26 +99,25 @@
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 12 line context
... ...
@@ -16,15 +16,18 @@
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 =
... ...
@@ -34,30 +37,127 @@
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 12 line context
... ...
@@ -96,22 +96,22 @@
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())
Ignore white space 12 line context
... ...
@@ -392,18 +392,13 @@
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;
Ignore white space 12 line context
... ...
@@ -140,18 +140,13 @@
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;
Ignore white space 12 line context
... ...
@@ -81,37 +81,43 @@
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

	
Ignore white space 12 line context
... ...
@@ -20,17 +20,16 @@
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>
Ignore white space 12 line context
... ...
@@ -21,17 +21,16 @@
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>
Ignore white space 12 line context
... ...
@@ -86,12 +86,16 @@
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"\
Ignore white space 12 line context
... ...
@@ -20,18 +20,16 @@
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>
0 comments (0 inline)