gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge
0 105 25
merge default
20 files changed with 23512 insertions and 3550 deletions:
22
8
1319
68
↑ Collapse diff ↑
Ignore white space 6 line context
1
%!PS-Adobe-2.0 EPSF-2.0
2
%%Creator: LEMON, graphToEps()
3
%%CreationDate: Sun Mar 14 09:08:34 2010
4
%%BoundingBox: -353 -264 559 292
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
/nfemale { 0 0 0 setrgbcolor 3 index 0.0909091 1.5 mul mul setlinewidth
30
  newpath 5 index 5 index moveto 5 index 5 index 5 index 3.01 mul sub
31
  lineto 5 index 4 index .7 mul sub 5 index 5 index 2.2 mul sub moveto
32
  5 index 4 index .7 mul add 5 index 5 index 2.2 mul sub lineto stroke
33
  5 index 5 index 5 index c fill
34
  setrgbcolor 1.1 div c fill
35
  } bind def
36
/nmale {
37
  0 0 0 setrgbcolor 3 index 0.0909091 1.5 mul mul setlinewidth
38
  newpath 5 index 5 index moveto
39
  5 index 4 index 1 mul 1.5 mul add
40
  5 index 5 index 3 sqrt 1.5 mul mul add
41
  1 index 1 index lineto
42
  1 index 1 index 7 index sub moveto
43
  1 index 1 index lineto
44
  exch 5 index 3 sqrt .5 mul mul sub exch 5 index .5 mul sub lineto
45
  stroke
46
  5 index 5 index 5 index c fill
47
  setrgbcolor 1.1 div c fill
48
  } bind def
49
/arrl 1 def
50
/arrw 0.3 def
51
/lrl { 2 index mul exch 2 index mul exch rlineto pop} bind def
52
/arr { setrgbcolor /y1 exch def /x1 exch def /dy exch def /dx exch def
53
       /w exch def /len exch def
54
       newpath x1 dy w 2 div mul add y1 dx w 2 div mul sub moveto
55
       len w sub arrl sub dx dy lrl
56
       arrw dy dx neg lrl
57
       dx arrl w add mul dy w 2 div arrw add mul sub
58
       dy arrl w add mul dx w 2 div arrw add mul add rlineto
59
       dx arrl w add mul neg dy w 2 div arrw add mul sub
60
       dy arrl w add mul neg dx w 2 div arrw add mul add rlineto
61
       arrw dy dx neg lrl
62
       len w sub arrl sub neg dx dy lrl
63
       closepath fill } bind def
64
/cshow { 2 index 2 index moveto dup stringwidth pop
65
         neg 2 div fosi .35 mul neg rmoveto show pop pop} def
66

	
67
gsave
68
%Arcs:
69
gsave
70
140.321 266.249 -327.729 150.06 0 0 0 4.99223 l
71
82.1207 -238.726 -245.288 -110.743 0 0 0 4.99223 l
72
336.635 -229.036 533.603 13.109 0 0 0 4.99223 l
73
53.8598 -45.8071 -245.288 -110.743 0 0 0 4.99223 l
74
-75.5617 118.579 -327.729 150.06 0 0 0 4.99223 l
75
-327.729 150.06 -245.288 -110.743 1 0 0 11.9813 l
76
533.603 13.109 218.184 -84.2955 0 0 0 4.99223 l
77
39.87 175.035 141.163 67.2575 0 0 0 4.99223 l
78
53.8598 -45.8071 -75.5617 118.579 0 0 0 4.99223 l
79
-102.406 -141.267 82.1207 -238.726 0 0 0 4.99223 l
80
399.144 166.894 533.603 13.109 1 0 0 11.9813 l
81
39.87 175.035 140.321 266.249 1 0 0 11.9813 l
82
399.144 166.894 140.321 266.249 0 0 0 4.99223 l
83
399.144 166.894 141.163 67.2575 0 0 0 4.99223 l
84
53.8598 -45.8071 204.765 -173.77 0 0 0 4.99223 l
85
82.1207 -238.726 204.765 -173.77 0 0 0 4.99223 l
86
258.227 61.658 399.144 166.894 0 0 0 4.99223 l
87
53.8598 -45.8071 -102.406 -141.267 1 0 0 11.9813 l
88
175.073 -37.4477 141.163 67.2575 0 0 0 4.99223 l
89
258.227 61.658 380 0 0 0 0 4.99223 l
90
34.6739 40.8267 -75.5617 118.579 1 0 0 11.9813 l
91
380 0 533.603 13.109 0 0 0 4.99223 l
92
175.073 -37.4477 380 0 0 0 0 4.99223 l
93
218.184 -84.2955 204.765 -173.77 0 0 0 4.99223 l
94
53.8598 -45.8071 34.6739 40.8267 0 0 0 4.99223 l
95
167.905 -213.988 82.1207 -238.726 1 0 0 11.9813 l
96
336.635 -229.036 204.765 -173.77 1 0 0 11.9813 l
97
336.635 -229.036 167.905 -213.988 0 0 0 4.99223 l
98
329.08 -26.3098 218.184 -84.2955 0 0 0 4.99223 l
99
39.87 175.035 -75.5617 118.579 0 0 0 4.99223 l
100
53.8598 -45.8071 175.073 -37.4477 0 0 0 4.99223 l
101
34.6739 40.8267 141.163 67.2575 0 0 0 4.99223 l
102
258.227 61.658 141.163 67.2575 1 0 0 11.9813 l
103
175.073 -37.4477 218.184 -84.2955 1 0 0 11.9813 l
104
380 0 329.08 -26.3098 1 0 0 11.9813 l
105
grestore
106
%Nodes:
107
gsave
108
-245.288 -110.743 14.9767 1 1 1 nc
109
204.765 -173.77 14.9767 1 1 1 nc
110
-327.729 150.06 14.9767 1 1 1 nc
111
-75.5617 118.579 14.9767 1 1 1 nc
112
218.184 -84.2955 14.9767 1 1 1 nc
113
140.321 266.249 14.9767 1 1 1 nc
114
141.163 67.2575 14.9767 1 1 1 nc
115
82.1207 -238.726 14.9767 1 1 1 nc
116
329.08 -26.3098 14.9767 1 1 1 nc
117
-102.406 -141.267 14.9767 1 1 1 nc
118
533.603 13.109 14.9767 1 1 1 nc
119
167.905 -213.988 14.9767 1 1 1 nc
120
336.635 -229.036 14.9767 1 1 1 nc
121
380 0 14.9767 1 1 1 nc
122
399.144 166.894 14.9767 1 1 1 nc
123
34.6739 40.8267 14.9767 1 1 1 nc
124
39.87 175.035 14.9767 1 1 1 nc
125
175.073 -37.4477 14.9767 1 1 1 nc
126
53.8598 -45.8071 14.9767 1 1 1 nc
127
258.227 61.658 14.9767 1 1 1 nc
128
grestore
129
grestore
130
showpage
Ignore white space 6 line context
1
%!PS-Adobe-2.0 EPSF-2.0
2
%%Creator: LEMON, graphToEps()
3
%%CreationDate: Fri Oct 19 18:32:32 2007
4
%%BoundingBox: 0 0 596 842
5
%%DocumentPaperSizes: a4
6
%%EndComments
7
/lb { setlinewidth setrgbcolor newpath moveto
8
      4 2 roll 1 index 1 index curveto stroke } bind def
9
/l { setlinewidth setrgbcolor newpath moveto lineto stroke } bind def
10
/c { newpath dup 3 index add 2 index moveto 0 360 arc closepath } bind def
11
/sq { newpath 2 index 1 index add 2 index 2 index add moveto
12
      2 index 1 index sub 2 index 2 index add lineto
13
      2 index 1 index sub 2 index 2 index sub lineto
14
      2 index 1 index add 2 index 2 index sub lineto
15
      closepath pop pop pop} bind def
16
/di { newpath 2 index 1 index add 2 index moveto
17
      2 index             2 index 2 index add lineto
18
      2 index 1 index sub 2 index             lineto
19
      2 index             2 index 2 index sub lineto
20
      closepath pop pop pop} bind def
21
/nc { 0 0 0 setrgbcolor 5 index 5 index 5 index c fill
22
     setrgbcolor 1.1 div c fill
23
   } bind def
24
/nsq { 0 0 0 setrgbcolor 5 index 5 index 5 index sq fill
25
     setrgbcolor 1.1 div sq fill
26
   } bind def
27
/ndi { 0 0 0 setrgbcolor 5 index 5 index 5 index di fill
28
     setrgbcolor 1.1 div di fill
29
   } bind def
30
/nfemale { 0 0 0 setrgbcolor 3 index 0.0909091 1.5 mul mul setlinewidth
31
  newpath 5 index 5 index moveto 5 index 5 index 5 index 3.01 mul sub
32
  lineto 5 index 4 index .7 mul sub 5 index 5 index 2.2 mul sub moveto
33
  5 index 4 index .7 mul add 5 index 5 index 2.2 mul sub lineto stroke
34
  5 index 5 index 5 index c fill
35
  setrgbcolor 1.1 div c fill
36
  } bind def
37
/nmale {
38
  0 0 0 setrgbcolor 3 index 0.0909091 1.5 mul mul setlinewidth
39
  newpath 5 index 5 index moveto
40
  5 index 4 index 1 mul 1.5 mul add
41
  5 index 5 index 3 sqrt 1.5 mul mul add
42
  1 index 1 index lineto
43
  1 index 1 index 7 index sub moveto
44
  1 index 1 index lineto
45
  exch 5 index 3 sqrt .5 mul mul sub exch 5 index .5 mul sub lineto
46
  stroke
47
  5 index 5 index 5 index c fill
48
  setrgbcolor 1.1 div c fill
49
  } bind def
50
/arrl 1 def
51
/arrw 0.3 def
52
/lrl { 2 index mul exch 2 index mul exch rlineto pop} bind def
53
/arr { setrgbcolor /y1 exch def /x1 exch def /dy exch def /dx exch def
54
       /w exch def /len exch def
55
       newpath x1 dy w 2 div mul add y1 dx w 2 div mul sub moveto
56
       len w sub arrl sub dx dy lrl
57
       arrw dy dx neg lrl
58
       dx arrl w add mul dy w 2 div arrw add mul sub
59
       dy arrl w add mul dx w 2 div arrw add mul add rlineto
60
       dx arrl w add mul neg dy w 2 div arrw add mul sub
61
       dy arrl w add mul neg dx w 2 div arrw add mul add rlineto
62
       arrw dy dx neg lrl
63
       len w sub arrl sub neg dx dy lrl
64
       closepath fill } bind def
65
/cshow { 2 index 2 index moveto dup stringwidth pop
66
         neg 2 div fosi .35 mul neg rmoveto show pop pop} def
67

	
68
gsave
69
15 138.307 translate
70
12.7843 dup scale
71
90 rotate
72
0.608112 -43.6081 translate
73
%Edges:
74
gsave
75
9 31 9.5 30.5 10 30 0 0 0 0.091217 lb
76
9 31 5.5 34.5 2 38 0 0 0 0.091217 lb
77
9 31 25.5 16 42 1 0 0 0 0.091217 lb
78
3 40 23 20.5 43 1 0 0 0 0.091217 lb
79
3 40 22.5 20.5 42 1 0 0 0 0.091217 lb
80
3 40 2.5 40.5 2 41 0 0 0 0.091217 lb
81
13 25 10.5 24.5 8 24 0 0 0 0.091217 lb
82
13 25 12 27 11 29 0 0 0 0.091217 lb
83
3 4 2.5 3 2 2 0 0 0 0.091217 lb
84
3 4 4.5 3 6 2 0 0 0 0.091217 lb
85
6 25 7 24.5 8 24 0 0 0 0.091217 lb
86
6 25 6 24.5 6 24 0 0 0 0.091217 lb
87
34 2 33.5 2 33 2 0 0 0 0.091217 lb
88
34 2 35 2 36 2 0 0 0 0.091217 lb
89
6 8 16 9 26 10 0 0 0 0.091217 lb
90
6 8 6 10.5 6 13 0 0 0 0.091217 lb
91
6 8 6 7.5 6 7 0 0 0 0.091217 lb
92
26 10 27.5 8.5 29 7 0 0 0 0.091217 lb
93
26 10 27.5 9 29 8 0 0 0 0.091217 lb
94
10 30 10.5 29.5 11 29 0 0 0 0.091217 lb
95
8 24 7 23.5 6 23 0 0 0 0.091217 lb
96
8 24 8 24.5 8 25 0 0 0 0.091217 lb
97
33 2 32.5 2 32 2 0 0 0 0.091217 lb
98
29 7 17.5 7 6 7 0 0 0 0.091217 lb
99
2 2 1.5 22 1 42 0 0 0 0.091217 lb
100
2 2 3.5 2 5 2 0 0 0 0.091217 lb
101
21 15 13.5 14.5 6 14 0 0 0 0.091217 lb
102
21 15 21 15.5 21 16 0 0 0 0.091217 lb
103
1 42 0.5 42.5 0 43 0 0 0 0.091217 lb
104
1 42 1.5 41.5 2 41 0 0 0 0.091217 lb
105
6 15 6 15.5 6 16 0 0 0 0.091217 lb
106
6 15 6 14.5 6 14 0 0 0 0.091217 lb
107
43 1 22 0.5 1 0 0 0 0 0.091217 lb
108
31 2 18.5 2 6 2 0 0 0 0.091217 lb
109
31 2 31.5 2 32 2 0 0 0 0.091217 lb
110
6 24 6 23.5 6 23 0 0 0 0.091217 lb
111
6 16 6 16.5 6 17 0 0 0 0.091217 lb
112
6 23 6 20 6 17 0 0 0 0.091217 lb
113
6 2 5.5 2 5 2 0 0 0 0.091217 lb
114
6 2 6 4.5 6 7 0 0 0 0.091217 lb
115
0 43 0.5 21.5 1 0 0 0 0 0.091217 lb
116
1 1 19.5 1.5 38 2 0 0 0 0.091217 lb
117
1 1 1 0.5 1 0 0 0 0 0.091217 lb
118
2 38 5.5 31.5 9 25 0 0 0 0.091217 lb
119
25 13 15.5 13 6 13 0 0 0 0.091217 lb
120
25 13 15.5 13.5 6 14 0 0 0 0.091217 lb
121
8 25 8.5 25 9 25 0 0 0 0.091217 lb
122
11 29 24.5 15.5 38 2 0 0 0 0.091217 lb
123
6 17 11.5 18 17 19 0 0 0 0.091217 lb
124
16 23 26.5 12.5 37 2 0 0 0 0.091217 lb
125
16 23 18.5 19.5 21 16 0 0 0 0.091217 lb
126
36 2 36.5 2 37 2 0 0 0 0.091217 lb
127
36 2 32.5 5 29 8 0 0 0 0.091217 lb
128
6 13 6 13.5 6 14 0 0 0 0.091217 lb
129
37 2 37.5 2 38 2 0 0 0 0.091217 lb
130
21 16 19 17.5 17 19 0 0 0 0.091217 lb
131
grestore
132
%Nodes:
133
gsave
134
29 8 0.304556 1 1 1 nc
135
2 41 0.304556 1 1 1 nc
136
6 7 0.304556 1 1 1 nc
137
5 2 0.304556 1 1 1 nc
138
17 19 0.304556 1 1 1 nc
139
21 16 0.304556 1 1 1 nc
140
1 0 0.304556 1 1 1 nc
141
9 25 0.304556 1 1 1 nc
142
6 14 0.304556 1 1 1 nc
143
42 1 0.304556 1 1 1 nc
144
38 2 0.304556 1 1 1 nc
145
37 2 0.304556 1 1 1 nc
146
6 13 0.304556 1 1 1 nc
147
36 2 0.304556 1 1 1 nc
148
16 23 0.304556 1 1 1 nc
149
6 17 0.304556 1 1 1 nc
150
11 29 0.304556 1 1 1 nc
151
8 25 0.304556 1 1 1 nc
152
32 2 0.304556 1 1 1 nc
153
25 13 0.304556 1 1 1 nc
154
2 38 0.304556 1 1 1 nc
155
1 1 0.304556 1 1 1 nc
156
0 43 0.304556 1 1 1 nc
157
6 2 0.304556 1 1 1 nc
158
6 23 0.304556 1 1 1 nc
159
6 16 0.304556 1 1 1 nc
160
6 24 0.304556 1 1 1 nc
161
31 2 0.304556 1 1 1 nc
162
43 1 0.304556 1 1 1 nc
163
6 15 0.304556 1 1 1 nc
164
1 42 0.304556 1 1 1 nc
165
21 15 0.304556 1 1 1 nc
166
2 2 0.304556 1 1 1 nc
167
29 7 0.304556 1 1 1 nc
168
33 2 0.304556 1 1 1 nc
169
8 24 0.304556 1 1 1 nc
170
10 30 0.304556 1 1 1 nc
171
26 10 0.304556 1 1 1 nc
172
6 8 0.304556 1 1 1 nc
173
34 2 0.304556 1 1 1 nc
174
6 25 0.304556 1 1 1 nc
175
3 4 0.304556 1 1 1 nc
176
13 25 0.304556 1 1 1 nc
177
3 40 0.304556 1 1 1 nc
178
9 31 0.304556 1 1 1 nc
179
grestore
180
grestore
181
showpage
Ignore white space 6 line context
1
%%%%% Defining LEMON %%%%%
2

	
3
@misc{lemon,
4
  key =          {LEMON},
5
  title =        {{LEMON} -- {L}ibrary for {E}fficient {M}odeling and
6
                  {O}ptimization in {N}etworks},
7
  howpublished = {\url{http://lemon.cs.elte.hu/}},
8
  year =         2009
9
}
10

	
11
@misc{egres,
12
  key =          {EGRES},
13
  title =        {{EGRES} -- {E}gerv{\'a}ry {R}esearch {G}roup on
14
                  {C}ombinatorial {O}ptimization},
15
  url =          {http://www.cs.elte.hu/egres/}
16
}
17

	
18
@misc{coinor,
19
  key =          {COIN-OR},
20
  title =        {{COIN-OR} -- {C}omputational {I}nfrastructure for
21
                  {O}perations {R}esearch},
22
  url =          {http://www.coin-or.org/}
23
}
24

	
25

	
26
%%%%% Other libraries %%%%%%
27

	
28
@misc{boost,
29
  key =          {Boost},
30
  title =        {{B}oost {C++} {L}ibraries},
31
  url =          {http://www.boost.org/}
32
}
33

	
34
@book{bglbook,
35
  author =       {Jeremy G. Siek and Lee-Quan Lee and Andrew
36
                  Lumsdaine},
37
  title =        {The Boost Graph Library: User Guide and Reference
38
                  Manual},
39
  publisher =    {Addison-Wesley},
40
  year =         2002
41
}
42

	
43
@misc{leda,
44
  key =          {LEDA},
45
  title =        {{LEDA} -- {L}ibrary of {E}fficient {D}ata {T}ypes and
46
                  {A}lgorithms},
47
  url =          {http://www.algorithmic-solutions.com/}
48
}
49

	
50
@book{ledabook,
51
  author =       {Kurt Mehlhorn and Stefan N{\"a}her},
52
  title =        {{LEDA}: {A} platform for combinatorial and geometric
53
                  computing},
54
  isbn =         {0-521-56329-1},
55
  publisher =    {Cambridge University Press},
56
  address =      {New York, NY, USA},
57
  year =         1999
58
}
59

	
60

	
61
%%%%% Tools that LEMON depends on %%%%%
62

	
63
@misc{cmake,
64
  key =          {CMake},
65
  title =        {{CMake} -- {C}ross {P}latform {M}ake},
66
  url =          {http://www.cmake.org/}
67
}
68

	
69
@misc{doxygen,
70
  key =          {Doxygen},
71
  title =        {{Doxygen} -- {S}ource code documentation generator
72
                  tool},
73
  url =          {http://www.doxygen.org/}
74
}
75

	
76

	
77
%%%%% LP/MIP libraries %%%%%
78

	
79
@misc{glpk,
80
  key =          {GLPK},
81
  title =        {{GLPK} -- {GNU} {L}inear {P}rogramming {K}it},
82
  url =          {http://www.gnu.org/software/glpk/}
83
}
84

	
85
@misc{clp,
86
  key =          {Clp},
87
  title =        {{Clp} -- {Coin-Or} {L}inear {P}rogramming},
88
  url =          {http://projects.coin-or.org/Clp/}
89
}
90

	
91
@misc{cbc,
92
  key =          {Cbc},
93
  title =        {{Cbc} -- {Coin-Or} {B}ranch and {C}ut},
94
  url =          {http://projects.coin-or.org/Cbc/}
95
}
96

	
97
@misc{cplex,
98
  key =          {CPLEX},
99
  title =        {{ILOG} {CPLEX}},
100
  url =          {http://www.ilog.com/}
101
}
102

	
103
@misc{soplex,
104
  key =          {SoPlex},
105
  title =        {{SoPlex} -- {T}he {S}equential {O}bject-{O}riented
106
                  {S}implex},
107
  url =          {http://soplex.zib.de/}
108
}
109

	
110

	
111
%%%%% General books %%%%%
112

	
113
@book{amo93networkflows,
114
  author =       {Ravindra K. Ahuja and Thomas L. Magnanti and James
115
                  B. Orlin},
116
  title =        {Network Flows: Theory, Algorithms, and Applications},
117
  publisher =    {Prentice-Hall, Inc.},
118
  year =         1993,
119
  month =        feb,
120
  isbn =         {978-0136175490}
121
}
122

	
123
@book{schrijver03combinatorial,
124
  author =       {Alexander Schrijver},
125
  title =        {Combinatorial Optimization: Polyhedra and Efficiency},
126
  publisher =    {Springer-Verlag},
127
  year =         2003,
128
  isbn =         {978-3540443896}
129
}
130

	
131
@book{clrs01algorithms,
132
  author =       {Thomas H. Cormen and Charles E. Leiserson and Ronald
133
                  L. Rivest and Clifford Stein},
134
  title =        {Introduction to Algorithms},
135
  publisher =    {The MIT Press},
136
  year =         2001,
137
  edition =      {2nd}
138
}
139

	
140
@book{stroustrup00cpp,
141
  author =       {Bjarne Stroustrup},
142
  title =        {The C++ Programming Language},
143
  edition =      {3rd},
144
  publisher =    {Addison-Wesley Professional},
145
  isbn =         0201700735,
146
  month =        {February},
147
  year =         2000
148
}
149

	
150

	
151
%%%%% Maximum flow algorithms %%%%%
152

	
153
@article{edmondskarp72theoretical,
154
  author =       {Jack Edmonds and Richard M. Karp},
155
  title =        {Theoretical improvements in algorithmic efficiency
156
                  for network flow problems},
157
  journal =      {Journal of the ACM},
158
  year =         1972,
159
  volume =       19,
160
  number =       2,
161
  pages =        {248-264}
162
}
163

	
164
@article{goldberg88newapproach,
165
  author =       {Andrew V. Goldberg and Robert E. Tarjan},
166
  title =        {A new approach to the maximum flow problem},
167
  journal =      {Journal of the ACM},
168
  year =         1988,
169
  volume =       35,
170
  number =       4,
171
  pages =        {921-940}
172
}
173

	
174
@article{dinic70algorithm,
175
  author =       {E. A. Dinic},
176
  title =        {Algorithm for solution of a problem of maximum flow
177
                  in a network with power estimation},
178
  journal =      {Soviet Math. Doklady},
179
  year =         1970,
180
  volume =       11,
181
  pages =        {1277-1280}
182
}
183

	
184
@article{goldberg08partial,
185
  author =       {Andrew V. Goldberg},
186
  title =        {The Partial Augment-Relabel Algorithm for the
187
                  Maximum Flow Problem},
188
  journal =      {16th Annual European Symposium on Algorithms},
189
  year =         2008,
190
  pages =        {466-477}
191
}
192

	
193
@article{sleator83dynamic,
194
  author =       {Daniel D. Sleator and Robert E. Tarjan},
195
  title =        {A data structure for dynamic trees},
196
  journal =      {Journal of Computer and System Sciences},
197
  year =         1983,
198
  volume =       26,
199
  number =       3,
200
  pages =        {362-391}
201
}
202

	
203

	
204
%%%%% Minimum mean cycle algorithms %%%%%
205

	
206
@article{karp78characterization,
207
  author =       {Richard M. Karp},
208
  title =        {A characterization of the minimum cycle mean in a
209
                  digraph},
210
  journal =      {Discrete Math.},
211
  year =         1978,
212
  volume =       23,
213
  pages =        {309-311}
214
}
215

	
216
@article{dasdan98minmeancycle,
217
  author =       {Ali Dasdan and Rajesh K. Gupta},
218
  title =        {Faster Maximum and Minimum Mean Cycle Alogrithms for
219
                  System Performance Analysis},
220
  journal =      {IEEE Transactions on Computer-Aided Design of
221
                  Integrated Circuits and Systems},
222
  year =         1998,
223
  volume =       17,
224
  number =       10,
225
  pages =        {889-899}
226
}
227

	
228

	
229
%%%%% Minimum cost flow algorithms %%%%%
230

	
231
@article{klein67primal,
232
  author =       {Morton Klein},
233
  title =        {A primal method for minimal cost flows with
234
                  applications to the assignment and transportation
235
                  problems},
236
  journal =      {Management Science},
237
  year =         1967,
238
  volume =       14,
239
  pages =        {205-220}
240
}
241

	
242
@article{goldberg89cyclecanceling,
243
  author =       {Andrew V. Goldberg and Robert E. Tarjan},
244
  title =        {Finding minimum-cost circulations by canceling
245
                  negative cycles},
246
  journal =      {Journal of the ACM},
247
  year =         1989,
248
  volume =       36,
249
  number =       4,
250
  pages =        {873-886}
251
}
252

	
253
@article{goldberg90approximation,
254
  author =       {Andrew V. Goldberg and Robert E. Tarjan},
255
  title =        {Finding Minimum-Cost Circulations by Successive
256
                  Approximation},
257
  journal =      {Mathematics of Operations Research},
258
  year =         1990,
259
  volume =       15,
260
  number =       3,
261
  pages =        {430-466}
262
}
263

	
264
@article{goldberg97efficient,
265
  author =       {Andrew V. Goldberg},
266
  title =        {An Efficient Implementation of a Scaling
267
                  Minimum-Cost Flow Algorithm},
268
  journal =      {Journal of Algorithms},
269
  year =         1997,
270
  volume =       22,
271
  number =       1,
272
  pages =        {1-29}
273
}
274

	
275
@article{bunnagel98efficient,
276
  author =       {Ursula B{\"u}nnagel and Bernhard Korte and Jens
277
                  Vygen},
278
  title =        {Efficient implementation of the {G}oldberg-{T}arjan
279
                  minimum-cost flow algorithm},
280
  journal =      {Optimization Methods and Software},
281
  year =         1998,
282
  volume =       10,
283
  pages =        {157-174}
284
}
285

	
286
@book{dantzig63linearprog,
287
  author =       {George B. Dantzig},
288
  title =        {Linear Programming and Extensions},
289
  publisher =    {Princeton University Press},
290
  year =         1963
291
}
292

	
293
@mastersthesis{kellyoneill91netsimplex,
294
  author =       {Damian J. Kelly and Garrett M. O'Neill},
295
  title =        {The Minimum Cost Flow Problem and The Network
296
                  Simplex Method},
297
  school =       {University College},
298
  address =      {Dublin, Ireland},
299
  year =         1991,
300
  month =        sep,
301
}
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2010
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_BELLMAN_FORD_H
20
#define LEMON_BELLMAN_FORD_H
21

	
22
/// \ingroup shortest_path
23
/// \file
24
/// \brief Bellman-Ford algorithm.
25

	
26
#include <lemon/list_graph.h>
27
#include <lemon/bits/path_dump.h>
28
#include <lemon/core.h>
29
#include <lemon/error.h>
30
#include <lemon/maps.h>
31
#include <lemon/tolerance.h>
32
#include <lemon/path.h>
33

	
34
#include <limits>
35

	
36
namespace lemon {
37

	
38
  /// \brief Default operation traits for the BellmanFord algorithm class.
39
  ///
40
  /// This operation traits class defines all computational operations
41
  /// and constants that are used in the Bellman-Ford algorithm.
42
  /// The default implementation is based on the \c numeric_limits class.
43
  /// If the numeric type does not have infinity value, then the maximum
44
  /// value is used as extremal infinity value.
45
  ///
46
  /// \see BellmanFordToleranceOperationTraits
47
  template <
48
    typename V,
49
    bool has_inf = std::numeric_limits<V>::has_infinity>
50
  struct BellmanFordDefaultOperationTraits {
51
    /// \brief Value type for the algorithm.
52
    typedef V Value;
53
    /// \brief Gives back the zero value of the type.
54
    static Value zero() {
55
      return static_cast<Value>(0);
56
    }
57
    /// \brief Gives back the positive infinity value of the type.
58
    static Value infinity() {
59
      return std::numeric_limits<Value>::infinity();
60
    }
61
    /// \brief Gives back the sum of the given two elements.
62
    static Value plus(const Value& left, const Value& right) {
63
      return left + right;
64
    }
65
    /// \brief Gives back \c true only if the first value is less than
66
    /// the second.
67
    static bool less(const Value& left, const Value& right) {
68
      return left < right;
69
    }
70
  };
71

	
72
  template <typename V>
73
  struct BellmanFordDefaultOperationTraits<V, false> {
74
    typedef V Value;
75
    static Value zero() {
76
      return static_cast<Value>(0);
77
    }
78
    static Value infinity() {
79
      return std::numeric_limits<Value>::max();
80
    }
81
    static Value plus(const Value& left, const Value& right) {
82
      if (left == infinity() || right == infinity()) return infinity();
83
      return left + right;
84
    }
85
    static bool less(const Value& left, const Value& right) {
86
      return left < right;
87
    }
88
  };
89

	
90
  /// \brief Operation traits for the BellmanFord algorithm class
91
  /// using tolerance.
92
  ///
93
  /// This operation traits class defines all computational operations
94
  /// and constants that are used in the Bellman-Ford algorithm.
95
  /// The only difference between this implementation and
96
  /// \ref BellmanFordDefaultOperationTraits is that this class uses
97
  /// the \ref Tolerance "tolerance technique" in its \ref less()
98
  /// function.
99
  ///
100
  /// \tparam V The value type.
101
  /// \tparam eps The epsilon value for the \ref less() function.
102
  /// By default, it is the epsilon value used by \ref Tolerance
103
  /// "Tolerance<V>".
104
  ///
105
  /// \see BellmanFordDefaultOperationTraits
106
#ifdef DOXYGEN
107
  template <typename V, V eps>
108
#else
109
  template <
110
    typename V,
111
    V eps = Tolerance<V>::def_epsilon>
112
#endif
113
  struct BellmanFordToleranceOperationTraits {
114
    /// \brief Value type for the algorithm.
115
    typedef V Value;
116
    /// \brief Gives back the zero value of the type.
117
    static Value zero() {
118
      return static_cast<Value>(0);
119
    }
120
    /// \brief Gives back the positive infinity value of the type.
121
    static Value infinity() {
122
      return std::numeric_limits<Value>::infinity();
123
    }
124
    /// \brief Gives back the sum of the given two elements.
125
    static Value plus(const Value& left, const Value& right) {
126
      return left + right;
127
    }
128
    /// \brief Gives back \c true only if the first value is less than
129
    /// the second.
130
    static bool less(const Value& left, const Value& right) {
131
      return left + eps < right;
132
    }
133
  };
134

	
135
  /// \brief Default traits class of BellmanFord class.
136
  ///
137
  /// Default traits class of BellmanFord class.
138
  /// \param GR The type of the digraph.
139
  /// \param LEN The type of the length map.
140
  template<typename GR, typename LEN>
141
  struct BellmanFordDefaultTraits {
142
    /// The type of the digraph the algorithm runs on.
143
    typedef GR Digraph;
144

	
145
    /// \brief The type of the map that stores the arc lengths.
146
    ///
147
    /// The type of the map that stores the arc lengths.
148
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
149
    typedef LEN LengthMap;
150

	
151
    /// The type of the arc lengths.
152
    typedef typename LEN::Value Value;
153

	
154
    /// \brief Operation traits for Bellman-Ford algorithm.
155
    ///
156
    /// It defines the used operations and the infinity value for the
157
    /// given \c Value type.
158
    /// \see BellmanFordDefaultOperationTraits,
159
    /// BellmanFordToleranceOperationTraits
160
    typedef BellmanFordDefaultOperationTraits<Value> OperationTraits;
161

	
162
    /// \brief The type of the map that stores the last arcs of the
163
    /// shortest paths.
164
    ///
165
    /// The type of the map that stores the last
166
    /// arcs of the shortest paths.
167
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
168
    typedef typename GR::template NodeMap<typename GR::Arc> PredMap;
169

	
170
    /// \brief Instantiates a \c PredMap.
171
    ///
172
    /// This function instantiates a \ref PredMap.
173
    /// \param g is the digraph to which we would like to define the
174
    /// \ref PredMap.
175
    static PredMap *createPredMap(const GR& g) {
176
      return new PredMap(g);
177
    }
178

	
179
    /// \brief The type of the map that stores the distances of the nodes.
180
    ///
181
    /// The type of the map that stores the distances of the nodes.
182
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
183
    typedef typename GR::template NodeMap<typename LEN::Value> DistMap;
184

	
185
    /// \brief Instantiates a \c DistMap.
186
    ///
187
    /// This function instantiates a \ref DistMap.
188
    /// \param g is the digraph to which we would like to define the
189
    /// \ref DistMap.
190
    static DistMap *createDistMap(const GR& g) {
191
      return new DistMap(g);
192
    }
193

	
194
  };
195

	
196
  /// \brief %BellmanFord algorithm class.
197
  ///
198
  /// \ingroup shortest_path
199
  /// This class provides an efficient implementation of the Bellman-Ford
200
  /// algorithm. The maximum time complexity of the algorithm is
201
  /// <tt>O(ne)</tt>.
202
  ///
203
  /// The Bellman-Ford algorithm solves the single-source shortest path
204
  /// problem when the arcs can have negative lengths, but the digraph
205
  /// should not contain directed cycles with negative total length.
206
  /// If all arc costs are non-negative, consider to use the Dijkstra
207
  /// algorithm instead, since it is more efficient.
208
  ///
209
  /// The arc lengths are passed to the algorithm using a
210
  /// \ref concepts::ReadMap "ReadMap", so it is easy to change it to any
211
  /// kind of length. The type of the length values is determined by the
212
  /// \ref concepts::ReadMap::Value "Value" type of the length map.
213
  ///
214
  /// There is also a \ref bellmanFord() "function-type interface" for the
215
  /// Bellman-Ford algorithm, which is convenient in the simplier cases and
216
  /// it can be used easier.
217
  ///
218
  /// \tparam GR The type of the digraph the algorithm runs on.
219
  /// The default type is \ref ListDigraph.
220
  /// \tparam LEN A \ref concepts::ReadMap "readable" arc map that specifies
221
  /// the lengths of the arcs. The default map type is
222
  /// \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
223
  /// \tparam TR The traits class that defines various types used by the
224
  /// algorithm. By default, it is \ref BellmanFordDefaultTraits
225
  /// "BellmanFordDefaultTraits<GR, LEN>".
226
  /// In most cases, this parameter should not be set directly,
227
  /// consider to use the named template parameters instead.
228
#ifdef DOXYGEN
229
  template <typename GR, typename LEN, typename TR>
230
#else
231
  template <typename GR=ListDigraph,
232
            typename LEN=typename GR::template ArcMap<int>,
233
            typename TR=BellmanFordDefaultTraits<GR,LEN> >
234
#endif
235
  class BellmanFord {
236
  public:
237

	
238
    ///The type of the underlying digraph.
239
    typedef typename TR::Digraph Digraph;
240

	
241
    /// \brief The type of the arc lengths.
242
    typedef typename TR::LengthMap::Value Value;
243
    /// \brief The type of the map that stores the arc lengths.
244
    typedef typename TR::LengthMap LengthMap;
245
    /// \brief The type of the map that stores the last
246
    /// arcs of the shortest paths.
247
    typedef typename TR::PredMap PredMap;
248
    /// \brief The type of the map that stores the distances of the nodes.
249
    typedef typename TR::DistMap DistMap;
250
    /// The type of the paths.
251
    typedef PredMapPath<Digraph, PredMap> Path;
252
    ///\brief The \ref BellmanFordDefaultOperationTraits
253
    /// "operation traits class" of the algorithm.
254
    typedef typename TR::OperationTraits OperationTraits;
255

	
256
    ///The \ref BellmanFordDefaultTraits "traits class" of the algorithm.
257
    typedef TR Traits;
258

	
259
  private:
260

	
261
    typedef typename Digraph::Node Node;
262
    typedef typename Digraph::NodeIt NodeIt;
263
    typedef typename Digraph::Arc Arc;
264
    typedef typename Digraph::OutArcIt OutArcIt;
265

	
266
    // Pointer to the underlying digraph.
267
    const Digraph *_gr;
268
    // Pointer to the length map
269
    const LengthMap *_length;
270
    // Pointer to the map of predecessors arcs.
271
    PredMap *_pred;
272
    // Indicates if _pred is locally allocated (true) or not.
273
    bool _local_pred;
274
    // Pointer to the map of distances.
275
    DistMap *_dist;
276
    // Indicates if _dist is locally allocated (true) or not.
277
    bool _local_dist;
278

	
279
    typedef typename Digraph::template NodeMap<bool> MaskMap;
280
    MaskMap *_mask;
281

	
282
    std::vector<Node> _process;
283

	
284
    // Creates the maps if necessary.
285
    void create_maps() {
286
      if(!_pred) {
287
        _local_pred = true;
288
        _pred = Traits::createPredMap(*_gr);
289
      }
290
      if(!_dist) {
291
        _local_dist = true;
292
        _dist = Traits::createDistMap(*_gr);
293
      }
294
      if(!_mask) {
295
        _mask = new MaskMap(*_gr);
296
      }
297
    }
298

	
299
  public :
300

	
301
    typedef BellmanFord Create;
302

	
303
    /// \name Named Template Parameters
304

	
305
    ///@{
306

	
307
    template <class T>
308
    struct SetPredMapTraits : public Traits {
309
      typedef T PredMap;
310
      static PredMap *createPredMap(const Digraph&) {
311
        LEMON_ASSERT(false, "PredMap is not initialized");
312
        return 0; // ignore warnings
313
      }
314
    };
315

	
316
    /// \brief \ref named-templ-param "Named parameter" for setting
317
    /// \c PredMap type.
318
    ///
319
    /// \ref named-templ-param "Named parameter" for setting
320
    /// \c PredMap type.
321
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
322
    template <class T>
323
    struct SetPredMap
324
      : public BellmanFord< Digraph, LengthMap, SetPredMapTraits<T> > {
325
      typedef BellmanFord< Digraph, LengthMap, SetPredMapTraits<T> > Create;
326
    };
327

	
328
    template <class T>
329
    struct SetDistMapTraits : public Traits {
330
      typedef T DistMap;
331
      static DistMap *createDistMap(const Digraph&) {
332
        LEMON_ASSERT(false, "DistMap is not initialized");
333
        return 0; // ignore warnings
334
      }
335
    };
336

	
337
    /// \brief \ref named-templ-param "Named parameter" for setting
338
    /// \c DistMap type.
339
    ///
340
    /// \ref named-templ-param "Named parameter" for setting
341
    /// \c DistMap type.
342
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
343
    template <class T>
344
    struct SetDistMap
345
      : public BellmanFord< Digraph, LengthMap, SetDistMapTraits<T> > {
346
      typedef BellmanFord< Digraph, LengthMap, SetDistMapTraits<T> > Create;
347
    };
348

	
349
    template <class T>
350
    struct SetOperationTraitsTraits : public Traits {
351
      typedef T OperationTraits;
352
    };
353

	
354
    /// \brief \ref named-templ-param "Named parameter" for setting
355
    /// \c OperationTraits type.
356
    ///
357
    /// \ref named-templ-param "Named parameter" for setting
358
    /// \c OperationTraits type.
359
    /// For more information, see \ref BellmanFordDefaultOperationTraits.
360
    template <class T>
361
    struct SetOperationTraits
362
      : public BellmanFord< Digraph, LengthMap, SetOperationTraitsTraits<T> > {
363
      typedef BellmanFord< Digraph, LengthMap, SetOperationTraitsTraits<T> >
364
      Create;
365
    };
366

	
367
    ///@}
368

	
369
  protected:
370

	
371
    BellmanFord() {}
372

	
373
  public:
374

	
375
    /// \brief Constructor.
376
    ///
377
    /// Constructor.
378
    /// \param g The digraph the algorithm runs on.
379
    /// \param length The length map used by the algorithm.
380
    BellmanFord(const Digraph& g, const LengthMap& length) :
381
      _gr(&g), _length(&length),
382
      _pred(0), _local_pred(false),
383
      _dist(0), _local_dist(false), _mask(0) {}
384

	
385
    ///Destructor.
386
    ~BellmanFord() {
387
      if(_local_pred) delete _pred;
388
      if(_local_dist) delete _dist;
389
      if(_mask) delete _mask;
390
    }
391

	
392
    /// \brief Sets the length map.
393
    ///
394
    /// Sets the length map.
395
    /// \return <tt>(*this)</tt>
396
    BellmanFord &lengthMap(const LengthMap &map) {
397
      _length = &map;
398
      return *this;
399
    }
400

	
401
    /// \brief Sets the map that stores the predecessor arcs.
402
    ///
403
    /// Sets the map that stores the predecessor arcs.
404
    /// If you don't use this function before calling \ref run()
405
    /// or \ref init(), an instance will be allocated automatically.
406
    /// The destructor deallocates this automatically allocated map,
407
    /// of course.
408
    /// \return <tt>(*this)</tt>
409
    BellmanFord &predMap(PredMap &map) {
410
      if(_local_pred) {
411
        delete _pred;
412
        _local_pred=false;
413
      }
414
      _pred = &map;
415
      return *this;
416
    }
417

	
418
    /// \brief Sets the map that stores the distances of the nodes.
419
    ///
420
    /// Sets the map that stores the distances of the nodes calculated
421
    /// by the algorithm.
422
    /// If you don't use this function before calling \ref run()
423
    /// or \ref init(), an instance will be allocated automatically.
424
    /// The destructor deallocates this automatically allocated map,
425
    /// of course.
426
    /// \return <tt>(*this)</tt>
427
    BellmanFord &distMap(DistMap &map) {
428
      if(_local_dist) {
429
        delete _dist;
430
        _local_dist=false;
431
      }
432
      _dist = &map;
433
      return *this;
434
    }
435

	
436
    /// \name Execution Control
437
    /// The simplest way to execute the Bellman-Ford algorithm is to use
438
    /// one of the member functions called \ref run().\n
439
    /// If you need better control on the execution, you have to call
440
    /// \ref init() first, then you can add several source nodes
441
    /// with \ref addSource(). Finally the actual path computation can be
442
    /// performed with \ref start(), \ref checkedStart() or
443
    /// \ref limitedStart().
444

	
445
    ///@{
446

	
447
    /// \brief Initializes the internal data structures.
448
    ///
449
    /// Initializes the internal data structures. The optional parameter
450
    /// is the initial distance of each node.
451
    void init(const Value value = OperationTraits::infinity()) {
452
      create_maps();
453
      for (NodeIt it(*_gr); it != INVALID; ++it) {
454
        _pred->set(it, INVALID);
455
        _dist->set(it, value);
456
      }
457
      _process.clear();
458
      if (OperationTraits::less(value, OperationTraits::infinity())) {
459
        for (NodeIt it(*_gr); it != INVALID; ++it) {
460
          _process.push_back(it);
461
          _mask->set(it, true);
462
        }
463
      } else {
464
        for (NodeIt it(*_gr); it != INVALID; ++it) {
465
          _mask->set(it, false);
466
        }
467
      }
468
    }
469

	
470
    /// \brief Adds a new source node.
471
    ///
472
    /// This function adds a new source node. The optional second parameter
473
    /// is the initial distance of the node.
474
    void addSource(Node source, Value dst = OperationTraits::zero()) {
475
      _dist->set(source, dst);
476
      if (!(*_mask)[source]) {
477
        _process.push_back(source);
478
        _mask->set(source, true);
479
      }
480
    }
481

	
482
    /// \brief Executes one round from the Bellman-Ford algorithm.
483
    ///
484
    /// If the algoritm calculated the distances in the previous round
485
    /// exactly for the paths of at most \c k arcs, then this function
486
    /// will calculate the distances exactly for the paths of at most
487
    /// <tt>k+1</tt> arcs. Performing \c k iterations using this function
488
    /// calculates the shortest path distances exactly for the paths
489
    /// consisting of at most \c k arcs.
490
    ///
491
    /// \warning The paths with limited arc number cannot be retrieved
492
    /// easily with \ref path() or \ref predArc() functions. If you also
493
    /// need the shortest paths and not only the distances, you should
494
    /// store the \ref predMap() "predecessor map" after each iteration
495
    /// and build the path manually.
496
    ///
497
    /// \return \c true when the algorithm have not found more shorter
498
    /// paths.
499
    ///
500
    /// \see ActiveIt
501
    bool processNextRound() {
502
      for (int i = 0; i < int(_process.size()); ++i) {
503
        _mask->set(_process[i], false);
504
      }
505
      std::vector<Node> nextProcess;
506
      std::vector<Value> values(_process.size());
507
      for (int i = 0; i < int(_process.size()); ++i) {
508
        values[i] = (*_dist)[_process[i]];
509
      }
510
      for (int i = 0; i < int(_process.size()); ++i) {
511
        for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) {
512
          Node target = _gr->target(it);
513
          Value relaxed = OperationTraits::plus(values[i], (*_length)[it]);
514
          if (OperationTraits::less(relaxed, (*_dist)[target])) {
515
            _pred->set(target, it);
516
            _dist->set(target, relaxed);
517
            if (!(*_mask)[target]) {
518
              _mask->set(target, true);
519
              nextProcess.push_back(target);
520
            }
521
          }
522
        }
523
      }
524
      _process.swap(nextProcess);
525
      return _process.empty();
526
    }
527

	
528
    /// \brief Executes one weak round from the Bellman-Ford algorithm.
529
    ///
530
    /// If the algorithm calculated the distances in the previous round
531
    /// at least for the paths of at most \c k arcs, then this function
532
    /// will calculate the distances at least for the paths of at most
533
    /// <tt>k+1</tt> arcs.
534
    /// This function does not make it possible to calculate the shortest
535
    /// path distances exactly for paths consisting of at most \c k arcs,
536
    /// this is why it is called weak round.
537
    ///
538
    /// \return \c true when the algorithm have not found more shorter
539
    /// paths.
540
    ///
541
    /// \see ActiveIt
542
    bool processNextWeakRound() {
543
      for (int i = 0; i < int(_process.size()); ++i) {
544
        _mask->set(_process[i], false);
545
      }
546
      std::vector<Node> nextProcess;
547
      for (int i = 0; i < int(_process.size()); ++i) {
548
        for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) {
549
          Node target = _gr->target(it);
550
          Value relaxed =
551
            OperationTraits::plus((*_dist)[_process[i]], (*_length)[it]);
552
          if (OperationTraits::less(relaxed, (*_dist)[target])) {
553
            _pred->set(target, it);
554
            _dist->set(target, relaxed);
555
            if (!(*_mask)[target]) {
556
              _mask->set(target, true);
557
              nextProcess.push_back(target);
558
            }
559
          }
560
        }
561
      }
562
      _process.swap(nextProcess);
563
      return _process.empty();
564
    }
565

	
566
    /// \brief Executes the algorithm.
567
    ///
568
    /// Executes the algorithm.
569
    ///
570
    /// This method runs the Bellman-Ford algorithm from the root node(s)
571
    /// in order to compute the shortest path to each node.
572
    ///
573
    /// The algorithm computes
574
    /// - the shortest path tree (forest),
575
    /// - the distance of each node from the root(s).
576
    ///
577
    /// \pre init() must be called and at least one root node should be
578
    /// added with addSource() before using this function.
579
    void start() {
580
      int num = countNodes(*_gr) - 1;
581
      for (int i = 0; i < num; ++i) {
582
        if (processNextWeakRound()) break;
583
      }
584
    }
585

	
586
    /// \brief Executes the algorithm and checks the negative cycles.
587
    ///
588
    /// Executes the algorithm and checks the negative cycles.
589
    ///
590
    /// This method runs the Bellman-Ford algorithm from the root node(s)
591
    /// in order to compute the shortest path to each node and also checks
592
    /// if the digraph contains cycles with negative total length.
593
    ///
594
    /// The algorithm computes
595
    /// - the shortest path tree (forest),
596
    /// - the distance of each node from the root(s).
597
    ///
598
    /// \return \c false if there is a negative cycle in the digraph.
599
    ///
600
    /// \pre init() must be called and at least one root node should be
601
    /// added with addSource() before using this function.
602
    bool checkedStart() {
603
      int num = countNodes(*_gr);
604
      for (int i = 0; i < num; ++i) {
605
        if (processNextWeakRound()) return true;
606
      }
607
      return _process.empty();
608
    }
609

	
610
    /// \brief Executes the algorithm with arc number limit.
611
    ///
612
    /// Executes the algorithm with arc number limit.
613
    ///
614
    /// This method runs the Bellman-Ford algorithm from the root node(s)
615
    /// in order to compute the shortest path distance for each node
616
    /// using only the paths consisting of at most \c num arcs.
617
    ///
618
    /// The algorithm computes
619
    /// - the limited distance of each node from the root(s),
620
    /// - the predecessor arc for each node.
621
    ///
622
    /// \warning The paths with limited arc number cannot be retrieved
623
    /// easily with \ref path() or \ref predArc() functions. If you also
624
    /// need the shortest paths and not only the distances, you should
625
    /// store the \ref predMap() "predecessor map" after each iteration
626
    /// and build the path manually.
627
    ///
628
    /// \pre init() must be called and at least one root node should be
629
    /// added with addSource() before using this function.
630
    void limitedStart(int num) {
631
      for (int i = 0; i < num; ++i) {
632
        if (processNextRound()) break;
633
      }
634
    }
635

	
636
    /// \brief Runs the algorithm from the given root node.
637
    ///
638
    /// This method runs the Bellman-Ford algorithm from the given root
639
    /// node \c s in order to compute the shortest path to each node.
640
    ///
641
    /// The algorithm computes
642
    /// - the shortest path tree (forest),
643
    /// - the distance of each node from the root(s).
644
    ///
645
    /// \note bf.run(s) is just a shortcut of the following code.
646
    /// \code
647
    ///   bf.init();
648
    ///   bf.addSource(s);
649
    ///   bf.start();
650
    /// \endcode
651
    void run(Node s) {
652
      init();
653
      addSource(s);
654
      start();
655
    }
656

	
657
    /// \brief Runs the algorithm from the given root node with arc
658
    /// number limit.
659
    ///
660
    /// This method runs the Bellman-Ford algorithm from the given root
661
    /// node \c s in order to compute the shortest path distance for each
662
    /// node using only the paths consisting of at most \c num arcs.
663
    ///
664
    /// The algorithm computes
665
    /// - the limited distance of each node from the root(s),
666
    /// - the predecessor arc for each node.
667
    ///
668
    /// \warning The paths with limited arc number cannot be retrieved
669
    /// easily with \ref path() or \ref predArc() functions. If you also
670
    /// need the shortest paths and not only the distances, you should
671
    /// store the \ref predMap() "predecessor map" after each iteration
672
    /// and build the path manually.
673
    ///
674
    /// \note bf.run(s, num) is just a shortcut of the following code.
675
    /// \code
676
    ///   bf.init();
677
    ///   bf.addSource(s);
678
    ///   bf.limitedStart(num);
679
    /// \endcode
680
    void run(Node s, int num) {
681
      init();
682
      addSource(s);
683
      limitedStart(num);
684
    }
685

	
686
    ///@}
687

	
688
    /// \brief LEMON iterator for getting the active nodes.
689
    ///
690
    /// This class provides a common style LEMON iterator that traverses
691
    /// the active nodes of the Bellman-Ford algorithm after the last
692
    /// phase. These nodes should be checked in the next phase to
693
    /// find augmenting arcs outgoing from them.
694
    class ActiveIt {
695
    public:
696

	
697
      /// \brief Constructor.
698
      ///
699
      /// Constructor for getting the active nodes of the given BellmanFord
700
      /// instance.
701
      ActiveIt(const BellmanFord& algorithm) : _algorithm(&algorithm)
702
      {
703
        _index = _algorithm->_process.size() - 1;
704
      }
705

	
706
      /// \brief Invalid constructor.
707
      ///
708
      /// Invalid constructor.
709
      ActiveIt(Invalid) : _algorithm(0), _index(-1) {}
710

	
711
      /// \brief Conversion to \c Node.
712
      ///
713
      /// Conversion to \c Node.
714
      operator Node() const {
715
        return _index >= 0 ? _algorithm->_process[_index] : INVALID;
716
      }
717

	
718
      /// \brief Increment operator.
719
      ///
720
      /// Increment operator.
721
      ActiveIt& operator++() {
722
        --_index;
723
        return *this;
724
      }
725

	
726
      bool operator==(const ActiveIt& it) const {
727
        return static_cast<Node>(*this) == static_cast<Node>(it);
728
      }
729
      bool operator!=(const ActiveIt& it) const {
730
        return static_cast<Node>(*this) != static_cast<Node>(it);
731
      }
732
      bool operator<(const ActiveIt& it) const {
733
        return static_cast<Node>(*this) < static_cast<Node>(it);
734
      }
735

	
736
    private:
737
      const BellmanFord* _algorithm;
738
      int _index;
739
    };
740

	
741
    /// \name Query Functions
742
    /// The result of the Bellman-Ford algorithm can be obtained using these
743
    /// functions.\n
744
    /// Either \ref run() or \ref init() should be called before using them.
745

	
746
    ///@{
747

	
748
    /// \brief The shortest path to the given node.
749
    ///
750
    /// Gives back the shortest path to the given node from the root(s).
751
    ///
752
    /// \warning \c t should be reached from the root(s).
753
    ///
754
    /// \pre Either \ref run() or \ref init() must be called before
755
    /// using this function.
756
    Path path(Node t) const
757
    {
758
      return Path(*_gr, *_pred, t);
759
    }
760

	
761
    /// \brief The distance of the given node from the root(s).
762
    ///
763
    /// Returns the distance of the given node from the root(s).
764
    ///
765
    /// \warning If node \c v is not reached from the root(s), then
766
    /// the return value of this function is undefined.
767
    ///
768
    /// \pre Either \ref run() or \ref init() must be called before
769
    /// using this function.
770
    Value dist(Node v) const { return (*_dist)[v]; }
771

	
772
    /// \brief Returns the 'previous arc' of the shortest path tree for
773
    /// the given node.
774
    ///
775
    /// This function returns the 'previous arc' of the shortest path
776
    /// tree for node \c v, i.e. it returns the last arc of a
777
    /// shortest path from a root to \c v. It is \c INVALID if \c v
778
    /// is not reached from the root(s) or if \c v is a root.
779
    ///
780
    /// The shortest path tree used here is equal to the shortest path
781
    /// tree used in \ref predNode() and \ref predMap().
782
    ///
783
    /// \pre Either \ref run() or \ref init() must be called before
784
    /// using this function.
785
    Arc predArc(Node v) const { return (*_pred)[v]; }
786

	
787
    /// \brief Returns the 'previous node' of the shortest path tree for
788
    /// the given node.
789
    ///
790
    /// This function returns the 'previous node' of the shortest path
791
    /// tree for node \c v, i.e. it returns the last but one node of
792
    /// a shortest path from a root to \c v. It is \c INVALID if \c v
793
    /// is not reached from the root(s) or if \c v is a root.
794
    ///
795
    /// The shortest path tree used here is equal to the shortest path
796
    /// tree used in \ref predArc() and \ref predMap().
797
    ///
798
    /// \pre Either \ref run() or \ref init() must be called before
799
    /// using this function.
800
    Node predNode(Node v) const {
801
      return (*_pred)[v] == INVALID ? INVALID : _gr->source((*_pred)[v]);
802
    }
803

	
804
    /// \brief Returns a const reference to the node map that stores the
805
    /// distances of the nodes.
806
    ///
807
    /// Returns a const reference to the node map that stores the distances
808
    /// of the nodes calculated by the algorithm.
809
    ///
810
    /// \pre Either \ref run() or \ref init() must be called before
811
    /// using this function.
812
    const DistMap &distMap() const { return *_dist;}
813

	
814
    /// \brief Returns a const reference to the node map that stores the
815
    /// predecessor arcs.
816
    ///
817
    /// Returns a const reference to the node map that stores the predecessor
818
    /// arcs, which form the shortest path tree (forest).
819
    ///
820
    /// \pre Either \ref run() or \ref init() must be called before
821
    /// using this function.
822
    const PredMap &predMap() const { return *_pred; }
823

	
824
    /// \brief Checks if a node is reached from the root(s).
825
    ///
826
    /// Returns \c true if \c v is reached from the root(s).
827
    ///
828
    /// \pre Either \ref run() or \ref init() must be called before
829
    /// using this function.
830
    bool reached(Node v) const {
831
      return (*_dist)[v] != OperationTraits::infinity();
832
    }
833

	
834
    /// \brief Gives back a negative cycle.
835
    ///
836
    /// This function gives back a directed cycle with negative total
837
    /// length if the algorithm has already found one.
838
    /// Otherwise it gives back an empty path.
839
    lemon::Path<Digraph> negativeCycle() const {
840
      typename Digraph::template NodeMap<int> state(*_gr, -1);
841
      lemon::Path<Digraph> cycle;
842
      for (int i = 0; i < int(_process.size()); ++i) {
843
        if (state[_process[i]] != -1) continue;
844
        for (Node v = _process[i]; (*_pred)[v] != INVALID;
845
             v = _gr->source((*_pred)[v])) {
846
          if (state[v] == i) {
847
            cycle.addFront((*_pred)[v]);
848
            for (Node u = _gr->source((*_pred)[v]); u != v;
849
                 u = _gr->source((*_pred)[u])) {
850
              cycle.addFront((*_pred)[u]);
851
            }
852
            return cycle;
853
          }
854
          else if (state[v] >= 0) {
855
            break;
856
          }
857
          state[v] = i;
858
        }
859
      }
860
      return cycle;
861
    }
862

	
863
    ///@}
864
  };
865

	
866
  /// \brief Default traits class of bellmanFord() function.
867
  ///
868
  /// Default traits class of bellmanFord() function.
869
  /// \tparam GR The type of the digraph.
870
  /// \tparam LEN The type of the length map.
871
  template <typename GR, typename LEN>
872
  struct BellmanFordWizardDefaultTraits {
873
    /// The type of the digraph the algorithm runs on.
874
    typedef GR Digraph;
875

	
876
    /// \brief The type of the map that stores the arc lengths.
877
    ///
878
    /// The type of the map that stores the arc lengths.
879
    /// It must meet the \ref concepts::ReadMap "ReadMap" concept.
880
    typedef LEN LengthMap;
881

	
882
    /// The type of the arc lengths.
883
    typedef typename LEN::Value Value;
884

	
885
    /// \brief Operation traits for Bellman-Ford algorithm.
886
    ///
887
    /// It defines the used operations and the infinity value for the
888
    /// given \c Value type.
889
    /// \see BellmanFordDefaultOperationTraits,
890
    /// BellmanFordToleranceOperationTraits
891
    typedef BellmanFordDefaultOperationTraits<Value> OperationTraits;
892

	
893
    /// \brief The type of the map that stores the last
894
    /// arcs of the shortest paths.
895
    ///
896
    /// The type of the map that stores the last arcs of the shortest paths.
897
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
898
    typedef typename GR::template NodeMap<typename GR::Arc> PredMap;
899

	
900
    /// \brief Instantiates a \c PredMap.
901
    ///
902
    /// This function instantiates a \ref PredMap.
903
    /// \param g is the digraph to which we would like to define the
904
    /// \ref PredMap.
905
    static PredMap *createPredMap(const GR &g) {
906
      return new PredMap(g);
907
    }
908

	
909
    /// \brief The type of the map that stores the distances of the nodes.
910
    ///
911
    /// The type of the map that stores the distances of the nodes.
912
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
913
    typedef typename GR::template NodeMap<Value> DistMap;
914

	
915
    /// \brief Instantiates a \c DistMap.
916
    ///
917
    /// This function instantiates a \ref DistMap.
918
    /// \param g is the digraph to which we would like to define the
919
    /// \ref DistMap.
920
    static DistMap *createDistMap(const GR &g) {
921
      return new DistMap(g);
922
    }
923

	
924
    ///The type of the shortest paths.
925

	
926
    ///The type of the shortest paths.
927
    ///It must meet the \ref concepts::Path "Path" concept.
928
    typedef lemon::Path<Digraph> Path;
929
  };
930

	
931
  /// \brief Default traits class used by BellmanFordWizard.
932
  ///
933
  /// Default traits class used by BellmanFordWizard.
934
  /// \tparam GR The type of the digraph.
935
  /// \tparam LEN The type of the length map.
936
  template <typename GR, typename LEN>
937
  class BellmanFordWizardBase
938
    : public BellmanFordWizardDefaultTraits<GR, LEN> {
939

	
940
    typedef BellmanFordWizardDefaultTraits<GR, LEN> Base;
941
  protected:
942
    // Type of the nodes in the digraph.
943
    typedef typename Base::Digraph::Node Node;
944

	
945
    // Pointer to the underlying digraph.
946
    void *_graph;
947
    // Pointer to the length map
948
    void *_length;
949
    // Pointer to the map of predecessors arcs.
950
    void *_pred;
951
    // Pointer to the map of distances.
952
    void *_dist;
953
    //Pointer to the shortest path to the target node.
954
    void *_path;
955
    //Pointer to the distance of the target node.
956
    void *_di;
957

	
958
    public:
959
    /// Constructor.
960

	
961
    /// This constructor does not require parameters, it initiates
962
    /// all of the attributes to default values \c 0.
963
    BellmanFordWizardBase() :
964
      _graph(0), _length(0), _pred(0), _dist(0), _path(0), _di(0) {}
965

	
966
    /// Constructor.
967

	
968
    /// This constructor requires two parameters,
969
    /// others are initiated to \c 0.
970
    /// \param gr The digraph the algorithm runs on.
971
    /// \param len The length map.
972
    BellmanFordWizardBase(const GR& gr,
973
                          const LEN& len) :
974
      _graph(reinterpret_cast<void*>(const_cast<GR*>(&gr))),
975
      _length(reinterpret_cast<void*>(const_cast<LEN*>(&len))),
976
      _pred(0), _dist(0), _path(0), _di(0) {}
977

	
978
  };
979

	
980
  /// \brief Auxiliary class for the function-type interface of the
981
  /// \ref BellmanFord "Bellman-Ford" algorithm.
982
  ///
983
  /// This auxiliary class is created to implement the
984
  /// \ref bellmanFord() "function-type interface" of the
985
  /// \ref BellmanFord "Bellman-Ford" algorithm.
986
  /// It does not have own \ref run() method, it uses the
987
  /// functions and features of the plain \ref BellmanFord.
988
  ///
989
  /// This class should only be used through the \ref bellmanFord()
990
  /// function, which makes it easier to use the algorithm.
991
  ///
992
  /// \tparam TR The traits class that defines various types used by the
993
  /// algorithm.
994
  template<class TR>
995
  class BellmanFordWizard : public TR {
996
    typedef TR Base;
997

	
998
    typedef typename TR::Digraph Digraph;
999

	
1000
    typedef typename Digraph::Node Node;
1001
    typedef typename Digraph::NodeIt NodeIt;
1002
    typedef typename Digraph::Arc Arc;
1003
    typedef typename Digraph::OutArcIt ArcIt;
1004

	
1005
    typedef typename TR::LengthMap LengthMap;
1006
    typedef typename LengthMap::Value Value;
1007
    typedef typename TR::PredMap PredMap;
1008
    typedef typename TR::DistMap DistMap;
1009
    typedef typename TR::Path Path;
1010

	
1011
  public:
1012
    /// Constructor.
1013
    BellmanFordWizard() : TR() {}
1014

	
1015
    /// \brief Constructor that requires parameters.
1016
    ///
1017
    /// Constructor that requires parameters.
1018
    /// These parameters will be the default values for the traits class.
1019
    /// \param gr The digraph the algorithm runs on.
1020
    /// \param len The length map.
1021
    BellmanFordWizard(const Digraph& gr, const LengthMap& len)
1022
      : TR(gr, len) {}
1023

	
1024
    /// \brief Copy constructor
1025
    BellmanFordWizard(const TR &b) : TR(b) {}
1026

	
1027
    ~BellmanFordWizard() {}
1028

	
1029
    /// \brief Runs the Bellman-Ford algorithm from the given source node.
1030
    ///
1031
    /// This method runs the Bellman-Ford algorithm from the given source
1032
    /// node in order to compute the shortest path to each node.
1033
    void run(Node s) {
1034
      BellmanFord<Digraph,LengthMap,TR>
1035
        bf(*reinterpret_cast<const Digraph*>(Base::_graph),
1036
           *reinterpret_cast<const LengthMap*>(Base::_length));
1037
      if (Base::_pred) bf.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1038
      if (Base::_dist) bf.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1039
      bf.run(s);
1040
    }
1041

	
1042
    /// \brief Runs the Bellman-Ford algorithm to find the shortest path
1043
    /// between \c s and \c t.
1044
    ///
1045
    /// This method runs the Bellman-Ford algorithm from node \c s
1046
    /// in order to compute the shortest path to node \c t.
1047
    /// Actually, it computes the shortest path to each node, but using
1048
    /// this function you can retrieve the distance and the shortest path
1049
    /// for a single target node easier.
1050
    ///
1051
    /// \return \c true if \c t is reachable form \c s.
1052
    bool run(Node s, Node t) {
1053
      BellmanFord<Digraph,LengthMap,TR>
1054
        bf(*reinterpret_cast<const Digraph*>(Base::_graph),
1055
           *reinterpret_cast<const LengthMap*>(Base::_length));
1056
      if (Base::_pred) bf.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1057
      if (Base::_dist) bf.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1058
      bf.run(s);
1059
      if (Base::_path) *reinterpret_cast<Path*>(Base::_path) = bf.path(t);
1060
      if (Base::_di) *reinterpret_cast<Value*>(Base::_di) = bf.dist(t);
1061
      return bf.reached(t);
1062
    }
1063

	
1064
    template<class T>
1065
    struct SetPredMapBase : public Base {
1066
      typedef T PredMap;
1067
      static PredMap *createPredMap(const Digraph &) { return 0; };
1068
      SetPredMapBase(const TR &b) : TR(b) {}
1069
    };
1070

	
1071
    /// \brief \ref named-templ-param "Named parameter" for setting
1072
    /// the predecessor map.
1073
    ///
1074
    /// \ref named-templ-param "Named parameter" for setting
1075
    /// the map that stores the predecessor arcs of the nodes.
1076
    template<class T>
1077
    BellmanFordWizard<SetPredMapBase<T> > predMap(const T &t) {
1078
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1079
      return BellmanFordWizard<SetPredMapBase<T> >(*this);
1080
    }
1081

	
1082
    template<class T>
1083
    struct SetDistMapBase : public Base {
1084
      typedef T DistMap;
1085
      static DistMap *createDistMap(const Digraph &) { return 0; };
1086
      SetDistMapBase(const TR &b) : TR(b) {}
1087
    };
1088

	
1089
    /// \brief \ref named-templ-param "Named parameter" for setting
1090
    /// the distance map.
1091
    ///
1092
    /// \ref named-templ-param "Named parameter" for setting
1093
    /// the map that stores the distances of the nodes calculated
1094
    /// by the algorithm.
1095
    template<class T>
1096
    BellmanFordWizard<SetDistMapBase<T> > distMap(const T &t) {
1097
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1098
      return BellmanFordWizard<SetDistMapBase<T> >(*this);
1099
    }
1100

	
1101
    template<class T>
1102
    struct SetPathBase : public Base {
1103
      typedef T Path;
1104
      SetPathBase(const TR &b) : TR(b) {}
1105
    };
1106

	
1107
    /// \brief \ref named-func-param "Named parameter" for getting
1108
    /// the shortest path to the target node.
1109
    ///
1110
    /// \ref named-func-param "Named parameter" for getting
1111
    /// the shortest path to the target node.
1112
    template<class T>
1113
    BellmanFordWizard<SetPathBase<T> > path(const T &t)
1114
    {
1115
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1116
      return BellmanFordWizard<SetPathBase<T> >(*this);
1117
    }
1118

	
1119
    /// \brief \ref named-func-param "Named parameter" for getting
1120
    /// the distance of the target node.
1121
    ///
1122
    /// \ref named-func-param "Named parameter" for getting
1123
    /// the distance of the target node.
1124
    BellmanFordWizard dist(const Value &d)
1125
    {
1126
      Base::_di=reinterpret_cast<void*>(const_cast<Value*>(&d));
1127
      return *this;
1128
    }
1129

	
1130
  };
1131

	
1132
  /// \brief Function type interface for the \ref BellmanFord "Bellman-Ford"
1133
  /// algorithm.
1134
  ///
1135
  /// \ingroup shortest_path
1136
  /// Function type interface for the \ref BellmanFord "Bellman-Ford"
1137
  /// algorithm.
1138
  ///
1139
  /// This function also has several \ref named-templ-func-param
1140
  /// "named parameters", they are declared as the members of class
1141
  /// \ref BellmanFordWizard.
1142
  /// The following examples show how to use these parameters.
1143
  /// \code
1144
  ///   // Compute shortest path from node s to each node
1145
  ///   bellmanFord(g,length).predMap(preds).distMap(dists).run(s);
1146
  ///
1147
  ///   // Compute shortest path from s to t
1148
  ///   bool reached = bellmanFord(g,length).path(p).dist(d).run(s,t);
1149
  /// \endcode
1150
  /// \warning Don't forget to put the \ref BellmanFordWizard::run() "run()"
1151
  /// to the end of the parameter list.
1152
  /// \sa BellmanFordWizard
1153
  /// \sa BellmanFord
1154
  template<typename GR, typename LEN>
1155
  BellmanFordWizard<BellmanFordWizardBase<GR,LEN> >
1156
  bellmanFord(const GR& digraph,
1157
              const LEN& length)
1158
  {
1159
    return BellmanFordWizard<BellmanFordWizardBase<GR,LEN> >(digraph, length);
1160
  }
1161

	
1162
} //END OF NAMESPACE LEMON
1163

	
1164
#endif
1165

	
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2010
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_BINOMIAL_HEAP_H
20
#define LEMON_BINOMIAL_HEAP_H
21

	
22
///\file
23
///\ingroup heaps
24
///\brief Binomial Heap implementation.
25

	
26
#include <vector>
27
#include <utility>
28
#include <functional>
29
#include <lemon/math.h>
30
#include <lemon/counter.h>
31

	
32
namespace lemon {
33

	
34
  /// \ingroup heaps
35
  ///
36
  ///\brief Binomial heap data structure.
37
  ///
38
  /// This class implements the \e binomial \e heap data structure.
39
  /// It fully conforms to the \ref concepts::Heap "heap concept".
40
  ///
41
  /// The methods \ref increase() and \ref erase() are not efficient
42
  /// in a binomial heap. In case of many calls of these operations,
43
  /// it is better to use other heap structure, e.g. \ref BinHeap
44
  /// "binary heap".
45
  ///
46
  /// \tparam PR Type of the priorities of the items.
47
  /// \tparam IM A read-writable item map with \c int values, used
48
  /// internally to handle the cross references.
49
  /// \tparam CMP A functor class for comparing the priorities.
50
  /// The default is \c std::less<PR>.
51
#ifdef DOXYGEN
52
  template <typename PR, typename IM, typename CMP>
53
#else
54
  template <typename PR, typename IM, typename CMP = std::less<PR> >
55
#endif
56
  class BinomialHeap {
57
  public:
58
    /// Type of the item-int map.
59
    typedef IM ItemIntMap;
60
    /// Type of the priorities.
61
    typedef PR Prio;
62
    /// Type of the items stored in the heap.
63
    typedef typename ItemIntMap::Key Item;
64
    /// Functor type for comparing the priorities.
65
    typedef CMP Compare;
66

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

	
81
  private:
82
    class Store;
83

	
84
    std::vector<Store> _data;
85
    int _min, _head;
86
    ItemIntMap &_iim;
87
    Compare _comp;
88
    int _num_items;
89

	
90
  public:
91
    /// \brief Constructor.
92
    ///
93
    /// Constructor.
94
    /// \param map A map that assigns \c int values to the items.
95
    /// It is used internally to handle the cross references.
96
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
97
    explicit BinomialHeap(ItemIntMap &map)
98
      : _min(0), _head(-1), _iim(map), _num_items(0) {}
99

	
100
    /// \brief Constructor.
101
    ///
102
    /// Constructor.
103
    /// \param map A map that assigns \c int values to the items.
104
    /// It is used internally to handle the cross references.
105
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
106
    /// \param comp The function object used for comparing the priorities.
107
    BinomialHeap(ItemIntMap &map, const Compare &comp)
108
      : _min(0), _head(-1), _iim(map), _comp(comp), _num_items(0) {}
109

	
110
    /// \brief The number of items stored in the heap.
111
    ///
112
    /// This function returns the number of items stored in the heap.
113
    int size() const { return _num_items; }
114

	
115
    /// \brief Check if the heap is empty.
116
    ///
117
    /// This function returns \c true if the heap is empty.
118
    bool empty() const { return _num_items==0; }
119

	
120
    /// \brief Make the heap empty.
121
    ///
122
    /// This functon makes the heap empty.
123
    /// It does not change the cross reference map. If you want to reuse
124
    /// a heap that is not surely empty, you should first clear it and
125
    /// then you should set the cross reference map to \c PRE_HEAP
126
    /// for each item.
127
    void clear() {
128
      _data.clear(); _min=0; _num_items=0; _head=-1;
129
    }
130

	
131
    /// \brief Set the priority of an item or insert it, if it is
132
    /// not stored in the heap.
133
    ///
134
    /// This method sets the priority of the given item if it is
135
    /// already stored in the heap. Otherwise it inserts the given
136
    /// item into the heap with the given priority.
137
    /// \param item The item.
138
    /// \param value The priority.
139
    void set (const Item& item, const Prio& value) {
140
      int i=_iim[item];
141
      if ( i >= 0 && _data[i].in ) {
142
        if ( _comp(value, _data[i].prio) ) decrease(item, value);
143
        if ( _comp(_data[i].prio, value) ) increase(item, value);
144
      } else push(item, value);
145
    }
146

	
147
    /// \brief Insert an item into the heap with the given priority.
148
    ///
149
    /// This function inserts the given item into the heap with the
150
    /// given priority.
151
    /// \param item The item to insert.
152
    /// \param value The priority of the item.
153
    /// \pre \e item must not be stored in the heap.
154
    void push (const Item& item, const Prio& value) {
155
      int i=_iim[item];
156
      if ( i<0 ) {
157
        int s=_data.size();
158
        _iim.set( item,s );
159
        Store st;
160
        st.name=item;
161
        st.prio=value;
162
        _data.push_back(st);
163
        i=s;
164
      }
165
      else {
166
        _data[i].parent=_data[i].right_neighbor=_data[i].child=-1;
167
        _data[i].degree=0;
168
        _data[i].in=true;
169
        _data[i].prio=value;
170
      }
171

	
172
      if( 0==_num_items ) {
173
        _head=i;
174
        _min=i;
175
      } else {
176
        merge(i);
177
        if( _comp(_data[i].prio, _data[_min].prio) ) _min=i;
178
      }
179
      ++_num_items;
180
    }
181

	
182
    /// \brief Return the item having minimum priority.
183
    ///
184
    /// This function returns the item having minimum priority.
185
    /// \pre The heap must be non-empty.
186
    Item top() const { return _data[_min].name; }
187

	
188
    /// \brief The minimum priority.
189
    ///
190
    /// This function returns the minimum priority.
191
    /// \pre The heap must be non-empty.
192
    Prio prio() const { return _data[_min].prio; }
193

	
194
    /// \brief The priority of the given item.
195
    ///
196
    /// This function returns the priority of the given item.
197
    /// \param item The item.
198
    /// \pre \e item must be in the heap.
199
    const Prio& operator[](const Item& item) const {
200
      return _data[_iim[item]].prio;
201
    }
202

	
203
    /// \brief Remove the item having minimum priority.
204
    ///
205
    /// This function removes the item having minimum priority.
206
    /// \pre The heap must be non-empty.
207
    void pop() {
208
      _data[_min].in=false;
209

	
210
      int head_child=-1;
211
      if ( _data[_min].child!=-1 ) {
212
        int child=_data[_min].child;
213
        int neighb;
214
        while( child!=-1 ) {
215
          neighb=_data[child].right_neighbor;
216
          _data[child].parent=-1;
217
          _data[child].right_neighbor=head_child;
218
          head_child=child;
219
          child=neighb;
220
        }
221
      }
222

	
223
      if ( _data[_head].right_neighbor==-1 ) {
224
        // there was only one root
225
        _head=head_child;
226
      }
227
      else {
228
        // there were more roots
229
        if( _head!=_min )  { unlace(_min); }
230
        else { _head=_data[_head].right_neighbor; }
231
        merge(head_child);
232
      }
233
      _min=findMin();
234
      --_num_items;
235
    }
236

	
237
    /// \brief Remove the given item from the heap.
238
    ///
239
    /// This function removes the given item from the heap if it is
240
    /// already stored.
241
    /// \param item The item to delete.
242
    /// \pre \e item must be in the heap.
243
    void erase (const Item& item) {
244
      int i=_iim[item];
245
      if ( i >= 0 && _data[i].in ) {
246
        decrease( item, _data[_min].prio-1 );
247
        pop();
248
      }
249
    }
250

	
251
    /// \brief Decrease the priority of an item to the given value.
252
    ///
253
    /// This function decreases the priority of an item to the given value.
254
    /// \param item The item.
255
    /// \param value The priority.
256
    /// \pre \e item must be stored in the heap with priority at least \e value.
257
    void decrease (Item item, const Prio& value) {
258
      int i=_iim[item];
259
      int p=_data[i].parent;
260
      _data[i].prio=value;
261

	
262
      while( p!=-1 && _comp(value, _data[p].prio) ) {
263
        _data[i].name=_data[p].name;
264
        _data[i].prio=_data[p].prio;
265
        _data[p].name=item;
266
        _data[p].prio=value;
267
        _iim[_data[i].name]=i;
268
        i=p;
269
        p=_data[p].parent;
270
      }
271
      _iim[item]=i;
272
      if ( _comp(value, _data[_min].prio) ) _min=i;
273
    }
274

	
275
    /// \brief Increase the priority of an item to the given value.
276
    ///
277
    /// This function increases the priority of an item to the given value.
278
    /// \param item The item.
279
    /// \param value The priority.
280
    /// \pre \e item must be stored in the heap with priority at most \e value.
281
    void increase (Item item, const Prio& value) {
282
      erase(item);
283
      push(item, value);
284
    }
285

	
286
    /// \brief Return the state of an item.
287
    ///
288
    /// This method returns \c PRE_HEAP if the given item has never
289
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
290
    /// and \c POST_HEAP otherwise.
291
    /// In the latter case it is possible that the item will get back
292
    /// to the heap again.
293
    /// \param item The item.
294
    State state(const Item &item) const {
295
      int i=_iim[item];
296
      if( i>=0 ) {
297
        if ( _data[i].in ) i=0;
298
        else i=-2;
299
      }
300
      return State(i);
301
    }
302

	
303
    /// \brief Set the state of an item in the heap.
304
    ///
305
    /// This function sets the state of the given item in the heap.
306
    /// It can be used to manually clear the heap when it is important
307
    /// to achive better time complexity.
308
    /// \param i The item.
309
    /// \param st The state. It should not be \c IN_HEAP.
310
    void state(const Item& i, State st) {
311
      switch (st) {
312
      case POST_HEAP:
313
      case PRE_HEAP:
314
        if (state(i) == IN_HEAP) {
315
          erase(i);
316
        }
317
        _iim[i] = st;
318
        break;
319
      case IN_HEAP:
320
        break;
321
      }
322
    }
323

	
324
  private:
325

	
326
    // Find the minimum of the roots
327
    int findMin() {
328
      if( _head!=-1 ) {
329
        int min_loc=_head, min_val=_data[_head].prio;
330
        for( int x=_data[_head].right_neighbor; x!=-1;
331
             x=_data[x].right_neighbor ) {
332
          if( _comp( _data[x].prio,min_val ) ) {
333
            min_val=_data[x].prio;
334
            min_loc=x;
335
          }
336
        }
337
        return min_loc;
338
      }
339
      else return -1;
340
    }
341

	
342
    // Merge the heap with another heap starting at the given position
343
    void merge(int a) {
344
      if( _head==-1 || a==-1 ) return;
345
      if( _data[a].right_neighbor==-1 &&
346
          _data[a].degree<=_data[_head].degree ) {
347
        _data[a].right_neighbor=_head;
348
        _head=a;
349
      } else {
350
        interleave(a);
351
      }
352
      if( _data[_head].right_neighbor==-1 ) return;
353

	
354
      int x=_head;
355
      int x_prev=-1, x_next=_data[x].right_neighbor;
356
      while( x_next!=-1 ) {
357
        if( _data[x].degree!=_data[x_next].degree ||
358
            ( _data[x_next].right_neighbor!=-1 &&
359
              _data[_data[x_next].right_neighbor].degree==_data[x].degree ) ) {
360
          x_prev=x;
361
          x=x_next;
362
        }
363
        else {
364
          if( _comp(_data[x_next].prio,_data[x].prio) ) {
365
            if( x_prev==-1 ) {
366
              _head=x_next;
367
            } else {
368
              _data[x_prev].right_neighbor=x_next;
369
            }
370
            fuse(x,x_next);
371
            x=x_next;
372
          }
373
          else {
374
            _data[x].right_neighbor=_data[x_next].right_neighbor;
375
            fuse(x_next,x);
376
          }
377
        }
378
        x_next=_data[x].right_neighbor;
379
      }
380
    }
381

	
382
    // Interleave the elements of the given list into the list of the roots
383
    void interleave(int a) {
384
      int p=_head, q=a;
385
      int curr=_data.size();
386
      _data.push_back(Store());
387

	
388
      while( p!=-1 || q!=-1 ) {
389
        if( q==-1 || ( p!=-1 && _data[p].degree<_data[q].degree ) ) {
390
          _data[curr].right_neighbor=p;
391
          curr=p;
392
          p=_data[p].right_neighbor;
393
        }
394
        else {
395
          _data[curr].right_neighbor=q;
396
          curr=q;
397
          q=_data[q].right_neighbor;
398
        }
399
      }
400

	
401
      _head=_data.back().right_neighbor;
402
      _data.pop_back();
403
    }
404

	
405
    // Lace node a under node b
406
    void fuse(int a, int b) {
407
      _data[a].parent=b;
408
      _data[a].right_neighbor=_data[b].child;
409
      _data[b].child=a;
410

	
411
      ++_data[b].degree;
412
    }
413

	
414
    // Unlace node a (if it has siblings)
415
    void unlace(int a) {
416
      int neighb=_data[a].right_neighbor;
417
      int other=_head;
418

	
419
      while( _data[other].right_neighbor!=a )
420
        other=_data[other].right_neighbor;
421
      _data[other].right_neighbor=neighb;
422
    }
423

	
424
  private:
425

	
426
    class Store {
427
      friend class BinomialHeap;
428

	
429
      Item name;
430
      int parent;
431
      int right_neighbor;
432
      int child;
433
      int degree;
434
      bool in;
435
      Prio prio;
436

	
437
      Store() : parent(-1), right_neighbor(-1), child(-1), degree(0),
438
        in(true) {}
439
    };
440
  };
441

	
442
} //namespace lemon
443

	
444
#endif //LEMON_BINOMIAL_HEAP_H
445

	
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2010
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_CAPACITY_SCALING_H
20
#define LEMON_CAPACITY_SCALING_H
21

	
22
/// \ingroup min_cost_flow_algs
23
///
24
/// \file
25
/// \brief Capacity Scaling algorithm for finding a minimum cost flow.
26

	
27
#include <vector>
28
#include <limits>
29
#include <lemon/core.h>
30
#include <lemon/bin_heap.h>
31

	
32
namespace lemon {
33

	
34
  /// \brief Default traits class of CapacityScaling algorithm.
35
  ///
36
  /// Default traits class of CapacityScaling algorithm.
37
  /// \tparam GR Digraph type.
38
  /// \tparam V The number type used for flow amounts, capacity bounds
39
  /// and supply values. By default it is \c int.
40
  /// \tparam C The number type used for costs and potentials.
41
  /// By default it is the same as \c V.
42
  template <typename GR, typename V = int, typename C = V>
43
  struct CapacityScalingDefaultTraits
44
  {
45
    /// The type of the digraph
46
    typedef GR Digraph;
47
    /// The type of the flow amounts, capacity bounds and supply values
48
    typedef V Value;
49
    /// The type of the arc costs
50
    typedef C Cost;
51

	
52
    /// \brief The type of the heap used for internal Dijkstra computations.
53
    ///
54
    /// The type of the heap used for internal Dijkstra computations.
55
    /// It must conform to the \ref lemon::concepts::Heap "Heap" concept,
56
    /// its priority type must be \c Cost and its cross reference type
57
    /// must be \ref RangeMap "RangeMap<int>".
58
    typedef BinHeap<Cost, RangeMap<int> > Heap;
59
  };
60

	
61
  /// \addtogroup min_cost_flow_algs
62
  /// @{
63

	
64
  /// \brief Implementation of the Capacity Scaling algorithm for
65
  /// finding a \ref min_cost_flow "minimum cost flow".
66
  ///
67
  /// \ref CapacityScaling implements the capacity scaling version
68
  /// of the successive shortest path algorithm for finding a
69
  /// \ref min_cost_flow "minimum cost flow" \ref amo93networkflows,
70
  /// \ref edmondskarp72theoretical. It is an efficient dual
71
  /// solution method.
72
  ///
73
  /// Most of the parameters of the problem (except for the digraph)
74
  /// can be given using separate functions, and the algorithm can be
75
  /// executed using the \ref run() function. If some parameters are not
76
  /// specified, then default values will be used.
77
  ///
78
  /// \tparam GR The digraph type the algorithm runs on.
79
  /// \tparam V The number type used for flow amounts, capacity bounds
80
  /// and supply values in the algorithm. By default, it is \c int.
81
  /// \tparam C The number type used for costs and potentials in the
82
  /// algorithm. By default, it is the same as \c V.
83
  /// \tparam TR The traits class that defines various types used by the
84
  /// algorithm. By default, it is \ref CapacityScalingDefaultTraits
85
  /// "CapacityScalingDefaultTraits<GR, V, C>".
86
  /// In most cases, this parameter should not be set directly,
87
  /// consider to use the named template parameters instead.
88
  ///
89
  /// \warning Both number types must be signed and all input data must
90
  /// be integer.
91
  /// \warning This algorithm does not support negative costs for such
92
  /// arcs that have infinite upper bound.
93
#ifdef DOXYGEN
94
  template <typename GR, typename V, typename C, typename TR>
95
#else
96
  template < typename GR, typename V = int, typename C = V,
97
             typename TR = CapacityScalingDefaultTraits<GR, V, C> >
98
#endif
99
  class CapacityScaling
100
  {
101
  public:
102

	
103
    /// The type of the digraph
104
    typedef typename TR::Digraph Digraph;
105
    /// The type of the flow amounts, capacity bounds and supply values
106
    typedef typename TR::Value Value;
107
    /// The type of the arc costs
108
    typedef typename TR::Cost Cost;
109

	
110
    /// The type of the heap used for internal Dijkstra computations
111
    typedef typename TR::Heap Heap;
112

	
113
    /// The \ref CapacityScalingDefaultTraits "traits class" of the algorithm
114
    typedef TR Traits;
115

	
116
  public:
117

	
118
    /// \brief Problem type constants for the \c run() function.
119
    ///
120
    /// Enum type containing the problem type constants that can be
121
    /// returned by the \ref run() function of the algorithm.
122
    enum ProblemType {
123
      /// The problem has no feasible solution (flow).
124
      INFEASIBLE,
125
      /// The problem has optimal solution (i.e. it is feasible and
126
      /// bounded), and the algorithm has found optimal flow and node
127
      /// potentials (primal and dual solutions).
128
      OPTIMAL,
129
      /// The digraph contains an arc of negative cost and infinite
130
      /// upper bound. It means that the objective function is unbounded
131
      /// on that arc, however, note that it could actually be bounded
132
      /// over the feasible flows, but this algroithm cannot handle
133
      /// these cases.
134
      UNBOUNDED
135
    };
136

	
137
  private:
138

	
139
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
140

	
141
    typedef std::vector<int> IntVector;
142
    typedef std::vector<Value> ValueVector;
143
    typedef std::vector<Cost> CostVector;
144
    typedef std::vector<char> BoolVector;
145
    // Note: vector<char> is used instead of vector<bool> for efficiency reasons
146

	
147
  private:
148

	
149
    // Data related to the underlying digraph
150
    const GR &_graph;
151
    int _node_num;
152
    int _arc_num;
153
    int _res_arc_num;
154
    int _root;
155

	
156
    // Parameters of the problem
157
    bool _have_lower;
158
    Value _sum_supply;
159

	
160
    // Data structures for storing the digraph
161
    IntNodeMap _node_id;
162
    IntArcMap _arc_idf;
163
    IntArcMap _arc_idb;
164
    IntVector _first_out;
165
    BoolVector _forward;
166
    IntVector _source;
167
    IntVector _target;
168
    IntVector _reverse;
169

	
170
    // Node and arc data
171
    ValueVector _lower;
172
    ValueVector _upper;
173
    CostVector _cost;
174
    ValueVector _supply;
175

	
176
    ValueVector _res_cap;
177
    CostVector _pi;
178
    ValueVector _excess;
179
    IntVector _excess_nodes;
180
    IntVector _deficit_nodes;
181

	
182
    Value _delta;
183
    int _factor;
184
    IntVector _pred;
185

	
186
  public:
187

	
188
    /// \brief Constant for infinite upper bounds (capacities).
189
    ///
190
    /// Constant for infinite upper bounds (capacities).
191
    /// It is \c std::numeric_limits<Value>::infinity() if available,
192
    /// \c std::numeric_limits<Value>::max() otherwise.
193
    const Value INF;
194

	
195
  private:
196

	
197
    // Special implementation of the Dijkstra algorithm for finding
198
    // shortest paths in the residual network of the digraph with
199
    // respect to the reduced arc costs and modifying the node
200
    // potentials according to the found distance labels.
201
    class ResidualDijkstra
202
    {
203
    private:
204

	
205
      int _node_num;
206
      bool _geq;
207
      const IntVector &_first_out;
208
      const IntVector &_target;
209
      const CostVector &_cost;
210
      const ValueVector &_res_cap;
211
      const ValueVector &_excess;
212
      CostVector &_pi;
213
      IntVector &_pred;
214

	
215
      IntVector _proc_nodes;
216
      CostVector _dist;
217

	
218
    public:
219

	
220
      ResidualDijkstra(CapacityScaling& cs) :
221
        _node_num(cs._node_num), _geq(cs._sum_supply < 0),
222
        _first_out(cs._first_out), _target(cs._target), _cost(cs._cost),
223
        _res_cap(cs._res_cap), _excess(cs._excess), _pi(cs._pi),
224
        _pred(cs._pred), _dist(cs._node_num)
225
      {}
226

	
227
      int run(int s, Value delta = 1) {
228
        RangeMap<int> heap_cross_ref(_node_num, Heap::PRE_HEAP);
229
        Heap heap(heap_cross_ref);
230
        heap.push(s, 0);
231
        _pred[s] = -1;
232
        _proc_nodes.clear();
233

	
234
        // Process nodes
235
        while (!heap.empty() && _excess[heap.top()] > -delta) {
236
          int u = heap.top(), v;
237
          Cost d = heap.prio() + _pi[u], dn;
238
          _dist[u] = heap.prio();
239
          _proc_nodes.push_back(u);
240
          heap.pop();
241

	
242
          // Traverse outgoing residual arcs
243
          int last_out = _geq ? _first_out[u+1] : _first_out[u+1] - 1;
244
          for (int a = _first_out[u]; a != last_out; ++a) {
245
            if (_res_cap[a] < delta) continue;
246
            v = _target[a];
247
            switch (heap.state(v)) {
248
              case Heap::PRE_HEAP:
249
                heap.push(v, d + _cost[a] - _pi[v]);
250
                _pred[v] = a;
251
                break;
252
              case Heap::IN_HEAP:
253
                dn = d + _cost[a] - _pi[v];
254
                if (dn < heap[v]) {
255
                  heap.decrease(v, dn);
256
                  _pred[v] = a;
257
                }
258
                break;
259
              case Heap::POST_HEAP:
260
                break;
261
            }
262
          }
263
        }
264
        if (heap.empty()) return -1;
265

	
266
        // Update potentials of processed nodes
267
        int t = heap.top();
268
        Cost dt = heap.prio();
269
        for (int i = 0; i < int(_proc_nodes.size()); ++i) {
270
          _pi[_proc_nodes[i]] += _dist[_proc_nodes[i]] - dt;
271
        }
272

	
273
        return t;
274
      }
275

	
276
    }; //class ResidualDijkstra
277

	
278
  public:
279

	
280
    /// \name Named Template Parameters
281
    /// @{
282

	
283
    template <typename T>
284
    struct SetHeapTraits : public Traits {
285
      typedef T Heap;
286
    };
287

	
288
    /// \brief \ref named-templ-param "Named parameter" for setting
289
    /// \c Heap type.
290
    ///
291
    /// \ref named-templ-param "Named parameter" for setting \c Heap
292
    /// type, which is used for internal Dijkstra computations.
293
    /// It must conform to the \ref lemon::concepts::Heap "Heap" concept,
294
    /// its priority type must be \c Cost and its cross reference type
295
    /// must be \ref RangeMap "RangeMap<int>".
296
    template <typename T>
297
    struct SetHeap
298
      : public CapacityScaling<GR, V, C, SetHeapTraits<T> > {
299
      typedef  CapacityScaling<GR, V, C, SetHeapTraits<T> > Create;
300
    };
301

	
302
    /// @}
303

	
304
  protected:
305

	
306
    CapacityScaling() {}
307

	
308
  public:
309

	
310
    /// \brief Constructor.
311
    ///
312
    /// The constructor of the class.
313
    ///
314
    /// \param graph The digraph the algorithm runs on.
315
    CapacityScaling(const GR& graph) :
316
      _graph(graph), _node_id(graph), _arc_idf(graph), _arc_idb(graph),
317
      INF(std::numeric_limits<Value>::has_infinity ?
318
          std::numeric_limits<Value>::infinity() :
319
          std::numeric_limits<Value>::max())
320
    {
321
      // Check the number types
322
      LEMON_ASSERT(std::numeric_limits<Value>::is_signed,
323
        "The flow type of CapacityScaling must be signed");
324
      LEMON_ASSERT(std::numeric_limits<Cost>::is_signed,
325
        "The cost type of CapacityScaling must be signed");
326

	
327
      // Reset data structures
328
      reset();
329
    }
330

	
331
    /// \name Parameters
332
    /// The parameters of the algorithm can be specified using these
333
    /// functions.
334

	
335
    /// @{
336

	
337
    /// \brief Set the lower bounds on the arcs.
338
    ///
339
    /// This function sets the lower bounds on the arcs.
340
    /// If it is not used before calling \ref run(), the lower bounds
341
    /// will be set to zero on all arcs.
342
    ///
343
    /// \param map An arc map storing the lower bounds.
344
    /// Its \c Value type must be convertible to the \c Value type
345
    /// of the algorithm.
346
    ///
347
    /// \return <tt>(*this)</tt>
348
    template <typename LowerMap>
349
    CapacityScaling& lowerMap(const LowerMap& map) {
350
      _have_lower = true;
351
      for (ArcIt a(_graph); a != INVALID; ++a) {
352
        _lower[_arc_idf[a]] = map[a];
353
        _lower[_arc_idb[a]] = map[a];
354
      }
355
      return *this;
356
    }
357

	
358
    /// \brief Set the upper bounds (capacities) on the arcs.
359
    ///
360
    /// This function sets the upper bounds (capacities) on the arcs.
361
    /// If it is not used before calling \ref run(), the upper bounds
362
    /// will be set to \ref INF on all arcs (i.e. the flow value will be
363
    /// unbounded from above).
364
    ///
365
    /// \param map An arc map storing the upper bounds.
366
    /// Its \c Value type must be convertible to the \c Value type
367
    /// of the algorithm.
368
    ///
369
    /// \return <tt>(*this)</tt>
370
    template<typename UpperMap>
371
    CapacityScaling& upperMap(const UpperMap& map) {
372
      for (ArcIt a(_graph); a != INVALID; ++a) {
373
        _upper[_arc_idf[a]] = map[a];
374
      }
375
      return *this;
376
    }
377

	
378
    /// \brief Set the costs of the arcs.
379
    ///
380
    /// This function sets the costs of the arcs.
381
    /// If it is not used before calling \ref run(), the costs
382
    /// will be set to \c 1 on all arcs.
383
    ///
384
    /// \param map An arc map storing the costs.
385
    /// Its \c Value type must be convertible to the \c Cost type
386
    /// of the algorithm.
387
    ///
388
    /// \return <tt>(*this)</tt>
389
    template<typename CostMap>
390
    CapacityScaling& costMap(const CostMap& map) {
391
      for (ArcIt a(_graph); a != INVALID; ++a) {
392
        _cost[_arc_idf[a]] =  map[a];
393
        _cost[_arc_idb[a]] = -map[a];
394
      }
395
      return *this;
396
    }
397

	
398
    /// \brief Set the supply values of the nodes.
399
    ///
400
    /// This function sets the supply values of the nodes.
401
    /// If neither this function nor \ref stSupply() is used before
402
    /// calling \ref run(), the supply of each node will be set to zero.
403
    ///
404
    /// \param map A node map storing the supply values.
405
    /// Its \c Value type must be convertible to the \c Value type
406
    /// of the algorithm.
407
    ///
408
    /// \return <tt>(*this)</tt>
409
    template<typename SupplyMap>
410
    CapacityScaling& supplyMap(const SupplyMap& map) {
411
      for (NodeIt n(_graph); n != INVALID; ++n) {
412
        _supply[_node_id[n]] = map[n];
413
      }
414
      return *this;
415
    }
416

	
417
    /// \brief Set single source and target nodes and a supply value.
418
    ///
419
    /// This function sets a single source node and a single target node
420
    /// and the required flow value.
421
    /// If neither this function nor \ref supplyMap() is used before
422
    /// calling \ref run(), the supply of each node will be set to zero.
423
    ///
424
    /// Using this function has the same effect as using \ref supplyMap()
425
    /// with such a map in which \c k is assigned to \c s, \c -k is
426
    /// assigned to \c t and all other nodes have zero supply value.
427
    ///
428
    /// \param s The source node.
429
    /// \param t The target node.
430
    /// \param k The required amount of flow from node \c s to node \c t
431
    /// (i.e. the supply of \c s and the demand of \c t).
432
    ///
433
    /// \return <tt>(*this)</tt>
434
    CapacityScaling& stSupply(const Node& s, const Node& t, Value k) {
435
      for (int i = 0; i != _node_num; ++i) {
436
        _supply[i] = 0;
437
      }
438
      _supply[_node_id[s]] =  k;
439
      _supply[_node_id[t]] = -k;
440
      return *this;
441
    }
442

	
443
    /// @}
444

	
445
    /// \name Execution control
446
    /// The algorithm can be executed using \ref run().
447

	
448
    /// @{
449

	
450
    /// \brief Run the algorithm.
451
    ///
452
    /// This function runs the algorithm.
453
    /// The paramters can be specified using functions \ref lowerMap(),
454
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
455
    /// For example,
456
    /// \code
457
    ///   CapacityScaling<ListDigraph> cs(graph);
458
    ///   cs.lowerMap(lower).upperMap(upper).costMap(cost)
459
    ///     .supplyMap(sup).run();
460
    /// \endcode
461
    ///
462
    /// This function can be called more than once. All the given parameters
463
    /// are kept for the next call, unless \ref resetParams() or \ref reset()
464
    /// is used, thus only the modified parameters have to be set again.
465
    /// If the underlying digraph was also modified after the construction
466
    /// of the class (or the last \ref reset() call), then the \ref reset()
467
    /// function must be called.
468
    ///
469
    /// \param factor The capacity scaling factor. It must be larger than
470
    /// one to use scaling. If it is less or equal to one, then scaling
471
    /// will be disabled.
472
    ///
473
    /// \return \c INFEASIBLE if no feasible flow exists,
474
    /// \n \c OPTIMAL if the problem has optimal solution
475
    /// (i.e. it is feasible and bounded), and the algorithm has found
476
    /// optimal flow and node potentials (primal and dual solutions),
477
    /// \n \c UNBOUNDED if the digraph contains an arc of negative cost
478
    /// and infinite upper bound. It means that the objective function
479
    /// is unbounded on that arc, however, note that it could actually be
480
    /// bounded over the feasible flows, but this algroithm cannot handle
481
    /// these cases.
482
    ///
483
    /// \see ProblemType
484
    /// \see resetParams(), reset()
485
    ProblemType run(int factor = 4) {
486
      _factor = factor;
487
      ProblemType pt = init();
488
      if (pt != OPTIMAL) return pt;
489
      return start();
490
    }
491

	
492
    /// \brief Reset all the parameters that have been given before.
493
    ///
494
    /// This function resets all the paramaters that have been given
495
    /// before using functions \ref lowerMap(), \ref upperMap(),
496
    /// \ref costMap(), \ref supplyMap(), \ref stSupply().
497
    ///
498
    /// It is useful for multiple \ref run() calls. Basically, all the given
499
    /// parameters are kept for the next \ref run() call, unless
500
    /// \ref resetParams() or \ref reset() is used.
501
    /// If the underlying digraph was also modified after the construction
502
    /// of the class or the last \ref reset() call, then the \ref reset()
503
    /// function must be used, otherwise \ref resetParams() is sufficient.
504
    ///
505
    /// For example,
506
    /// \code
507
    ///   CapacityScaling<ListDigraph> cs(graph);
508
    ///
509
    ///   // First run
510
    ///   cs.lowerMap(lower).upperMap(upper).costMap(cost)
511
    ///     .supplyMap(sup).run();
512
    ///
513
    ///   // Run again with modified cost map (resetParams() is not called,
514
    ///   // so only the cost map have to be set again)
515
    ///   cost[e] += 100;
516
    ///   cs.costMap(cost).run();
517
    ///
518
    ///   // Run again from scratch using resetParams()
519
    ///   // (the lower bounds will be set to zero on all arcs)
520
    ///   cs.resetParams();
521
    ///   cs.upperMap(capacity).costMap(cost)
522
    ///     .supplyMap(sup).run();
523
    /// \endcode
524
    ///
525
    /// \return <tt>(*this)</tt>
526
    ///
527
    /// \see reset(), run()
528
    CapacityScaling& resetParams() {
529
      for (int i = 0; i != _node_num; ++i) {
530
        _supply[i] = 0;
531
      }
532
      for (int j = 0; j != _res_arc_num; ++j) {
533
        _lower[j] = 0;
534
        _upper[j] = INF;
535
        _cost[j] = _forward[j] ? 1 : -1;
536
      }
537
      _have_lower = false;
538
      return *this;
539
    }
540

	
541
    /// \brief Reset the internal data structures and all the parameters
542
    /// that have been given before.
543
    ///
544
    /// This function resets the internal data structures and all the
545
    /// paramaters that have been given before using functions \ref lowerMap(),
546
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
547
    ///
548
    /// It is useful for multiple \ref run() calls. Basically, all the given
549
    /// parameters are kept for the next \ref run() call, unless
550
    /// \ref resetParams() or \ref reset() is used.
551
    /// If the underlying digraph was also modified after the construction
552
    /// of the class or the last \ref reset() call, then the \ref reset()
553
    /// function must be used, otherwise \ref resetParams() is sufficient.
554
    ///
555
    /// See \ref resetParams() for examples.
556
    ///
557
    /// \return <tt>(*this)</tt>
558
    ///
559
    /// \see resetParams(), run()
560
    CapacityScaling& reset() {
561
      // Resize vectors
562
      _node_num = countNodes(_graph);
563
      _arc_num = countArcs(_graph);
564
      _res_arc_num = 2 * (_arc_num + _node_num);
565
      _root = _node_num;
566
      ++_node_num;
567

	
568
      _first_out.resize(_node_num + 1);
569
      _forward.resize(_res_arc_num);
570
      _source.resize(_res_arc_num);
571
      _target.resize(_res_arc_num);
572
      _reverse.resize(_res_arc_num);
573

	
574
      _lower.resize(_res_arc_num);
575
      _upper.resize(_res_arc_num);
576
      _cost.resize(_res_arc_num);
577
      _supply.resize(_node_num);
578

	
579
      _res_cap.resize(_res_arc_num);
580
      _pi.resize(_node_num);
581
      _excess.resize(_node_num);
582
      _pred.resize(_node_num);
583

	
584
      // Copy the graph
585
      int i = 0, j = 0, k = 2 * _arc_num + _node_num - 1;
586
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
587
        _node_id[n] = i;
588
      }
589
      i = 0;
590
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
591
        _first_out[i] = j;
592
        for (OutArcIt a(_graph, n); a != INVALID; ++a, ++j) {
593
          _arc_idf[a] = j;
594
          _forward[j] = true;
595
          _source[j] = i;
596
          _target[j] = _node_id[_graph.runningNode(a)];
597
        }
598
        for (InArcIt a(_graph, n); a != INVALID; ++a, ++j) {
599
          _arc_idb[a] = j;
600
          _forward[j] = false;
601
          _source[j] = i;
602
          _target[j] = _node_id[_graph.runningNode(a)];
603
        }
604
        _forward[j] = false;
605
        _source[j] = i;
606
        _target[j] = _root;
607
        _reverse[j] = k;
608
        _forward[k] = true;
609
        _source[k] = _root;
610
        _target[k] = i;
611
        _reverse[k] = j;
612
        ++j; ++k;
613
      }
614
      _first_out[i] = j;
615
      _first_out[_node_num] = k;
616
      for (ArcIt a(_graph); a != INVALID; ++a) {
617
        int fi = _arc_idf[a];
618
        int bi = _arc_idb[a];
619
        _reverse[fi] = bi;
620
        _reverse[bi] = fi;
621
      }
622

	
623
      // Reset parameters
624
      resetParams();
625
      return *this;
626
    }
627

	
628
    /// @}
629

	
630
    /// \name Query Functions
631
    /// The results of the algorithm can be obtained using these
632
    /// functions.\n
633
    /// The \ref run() function must be called before using them.
634

	
635
    /// @{
636

	
637
    /// \brief Return the total cost of the found flow.
638
    ///
639
    /// This function returns the total cost of the found flow.
640
    /// Its complexity is O(e).
641
    ///
642
    /// \note The return type of the function can be specified as a
643
    /// template parameter. For example,
644
    /// \code
645
    ///   cs.totalCost<double>();
646
    /// \endcode
647
    /// It is useful if the total cost cannot be stored in the \c Cost
648
    /// type of the algorithm, which is the default return type of the
649
    /// function.
650
    ///
651
    /// \pre \ref run() must be called before using this function.
652
    template <typename Number>
653
    Number totalCost() const {
654
      Number c = 0;
655
      for (ArcIt a(_graph); a != INVALID; ++a) {
656
        int i = _arc_idb[a];
657
        c += static_cast<Number>(_res_cap[i]) *
658
             (-static_cast<Number>(_cost[i]));
659
      }
660
      return c;
661
    }
662

	
663
#ifndef DOXYGEN
664
    Cost totalCost() const {
665
      return totalCost<Cost>();
666
    }
667
#endif
668

	
669
    /// \brief Return the flow on the given arc.
670
    ///
671
    /// This function returns the flow on the given arc.
672
    ///
673
    /// \pre \ref run() must be called before using this function.
674
    Value flow(const Arc& a) const {
675
      return _res_cap[_arc_idb[a]];
676
    }
677

	
678
    /// \brief Return the flow map (the primal solution).
679
    ///
680
    /// This function copies the flow value on each arc into the given
681
    /// map. The \c Value type of the algorithm must be convertible to
682
    /// the \c Value type of the map.
683
    ///
684
    /// \pre \ref run() must be called before using this function.
685
    template <typename FlowMap>
686
    void flowMap(FlowMap &map) const {
687
      for (ArcIt a(_graph); a != INVALID; ++a) {
688
        map.set(a, _res_cap[_arc_idb[a]]);
689
      }
690
    }
691

	
692
    /// \brief Return the potential (dual value) of the given node.
693
    ///
694
    /// This function returns the potential (dual value) of the
695
    /// given node.
696
    ///
697
    /// \pre \ref run() must be called before using this function.
698
    Cost potential(const Node& n) const {
699
      return _pi[_node_id[n]];
700
    }
701

	
702
    /// \brief Return the potential map (the dual solution).
703
    ///
704
    /// This function copies the potential (dual value) of each node
705
    /// into the given map.
706
    /// The \c Cost type of the algorithm must be convertible to the
707
    /// \c Value type of the map.
708
    ///
709
    /// \pre \ref run() must be called before using this function.
710
    template <typename PotentialMap>
711
    void potentialMap(PotentialMap &map) const {
712
      for (NodeIt n(_graph); n != INVALID; ++n) {
713
        map.set(n, _pi[_node_id[n]]);
714
      }
715
    }
716

	
717
    /// @}
718

	
719
  private:
720

	
721
    // Initialize the algorithm
722
    ProblemType init() {
723
      if (_node_num <= 1) return INFEASIBLE;
724

	
725
      // Check the sum of supply values
726
      _sum_supply = 0;
727
      for (int i = 0; i != _root; ++i) {
728
        _sum_supply += _supply[i];
729
      }
730
      if (_sum_supply > 0) return INFEASIBLE;
731

	
732
      // Initialize vectors
733
      for (int i = 0; i != _root; ++i) {
734
        _pi[i] = 0;
735
        _excess[i] = _supply[i];
736
      }
737

	
738
      // Remove non-zero lower bounds
739
      const Value MAX = std::numeric_limits<Value>::max();
740
      int last_out;
741
      if (_have_lower) {
742
        for (int i = 0; i != _root; ++i) {
743
          last_out = _first_out[i+1];
744
          for (int j = _first_out[i]; j != last_out; ++j) {
745
            if (_forward[j]) {
746
              Value c = _lower[j];
747
              if (c >= 0) {
748
                _res_cap[j] = _upper[j] < MAX ? _upper[j] - c : INF;
749
              } else {
750
                _res_cap[j] = _upper[j] < MAX + c ? _upper[j] - c : INF;
751
              }
752
              _excess[i] -= c;
753
              _excess[_target[j]] += c;
754
            } else {
755
              _res_cap[j] = 0;
756
            }
757
          }
758
        }
759
      } else {
760
        for (int j = 0; j != _res_arc_num; ++j) {
761
          _res_cap[j] = _forward[j] ? _upper[j] : 0;
762
        }
763
      }
764

	
765
      // Handle negative costs
766
      for (int i = 0; i != _root; ++i) {
767
        last_out = _first_out[i+1] - 1;
768
        for (int j = _first_out[i]; j != last_out; ++j) {
769
          Value rc = _res_cap[j];
770
          if (_cost[j] < 0 && rc > 0) {
771
            if (rc >= MAX) return UNBOUNDED;
772
            _excess[i] -= rc;
773
            _excess[_target[j]] += rc;
774
            _res_cap[j] = 0;
775
            _res_cap[_reverse[j]] += rc;
776
          }
777
        }
778
      }
779

	
780
      // Handle GEQ supply type
781
      if (_sum_supply < 0) {
782
        _pi[_root] = 0;
783
        _excess[_root] = -_sum_supply;
784
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
785
          int ra = _reverse[a];
786
          _res_cap[a] = -_sum_supply + 1;
787
          _res_cap[ra] = 0;
788
          _cost[a] = 0;
789
          _cost[ra] = 0;
790
        }
791
      } else {
792
        _pi[_root] = 0;
793
        _excess[_root] = 0;
794
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
795
          int ra = _reverse[a];
796
          _res_cap[a] = 1;
797
          _res_cap[ra] = 0;
798
          _cost[a] = 0;
799
          _cost[ra] = 0;
800
        }
801
      }
802

	
803
      // Initialize delta value
804
      if (_factor > 1) {
805
        // With scaling
806
        Value max_sup = 0, max_dem = 0, max_cap = 0;
807
        for (int i = 0; i != _root; ++i) {
808
          Value ex = _excess[i];
809
          if ( ex > max_sup) max_sup =  ex;
810
          if (-ex > max_dem) max_dem = -ex;
811
          int last_out = _first_out[i+1] - 1;
812
          for (int j = _first_out[i]; j != last_out; ++j) {
813
            if (_res_cap[j] > max_cap) max_cap = _res_cap[j];
814
          }
815
        }
816
        max_sup = std::min(std::min(max_sup, max_dem), max_cap);
817
        for (_delta = 1; 2 * _delta <= max_sup; _delta *= 2) ;
818
      } else {
819
        // Without scaling
820
        _delta = 1;
821
      }
822

	
823
      return OPTIMAL;
824
    }
825

	
826
    ProblemType start() {
827
      // Execute the algorithm
828
      ProblemType pt;
829
      if (_delta > 1)
830
        pt = startWithScaling();
831
      else
832
        pt = startWithoutScaling();
833

	
834
      // Handle non-zero lower bounds
835
      if (_have_lower) {
836
        int limit = _first_out[_root];
837
        for (int j = 0; j != limit; ++j) {
838
          if (!_forward[j]) _res_cap[j] += _lower[j];
839
        }
840
      }
841

	
842
      // Shift potentials if necessary
843
      Cost pr = _pi[_root];
844
      if (_sum_supply < 0 || pr > 0) {
845
        for (int i = 0; i != _node_num; ++i) {
846
          _pi[i] -= pr;
847
        }
848
      }
849

	
850
      return pt;
851
    }
852

	
853
    // Execute the capacity scaling algorithm
854
    ProblemType startWithScaling() {
855
      // Perform capacity scaling phases
856
      int s, t;
857
      ResidualDijkstra _dijkstra(*this);
858
      while (true) {
859
        // Saturate all arcs not satisfying the optimality condition
860
        int last_out;
861
        for (int u = 0; u != _node_num; ++u) {
862
          last_out = _sum_supply < 0 ?
863
            _first_out[u+1] : _first_out[u+1] - 1;
864
          for (int a = _first_out[u]; a != last_out; ++a) {
865
            int v = _target[a];
866
            Cost c = _cost[a] + _pi[u] - _pi[v];
867
            Value rc = _res_cap[a];
868
            if (c < 0 && rc >= _delta) {
869
              _excess[u] -= rc;
870
              _excess[v] += rc;
871
              _res_cap[a] = 0;
872
              _res_cap[_reverse[a]] += rc;
873
            }
874
          }
875
        }
876

	
877
        // Find excess nodes and deficit nodes
878
        _excess_nodes.clear();
879
        _deficit_nodes.clear();
880
        for (int u = 0; u != _node_num; ++u) {
881
          Value ex = _excess[u];
882
          if (ex >=  _delta) _excess_nodes.push_back(u);
883
          if (ex <= -_delta) _deficit_nodes.push_back(u);
884
        }
885
        int next_node = 0, next_def_node = 0;
886

	
887
        // Find augmenting shortest paths
888
        while (next_node < int(_excess_nodes.size())) {
889
          // Check deficit nodes
890
          if (_delta > 1) {
891
            bool delta_deficit = false;
892
            for ( ; next_def_node < int(_deficit_nodes.size());
893
                    ++next_def_node ) {
894
              if (_excess[_deficit_nodes[next_def_node]] <= -_delta) {
895
                delta_deficit = true;
896
                break;
897
              }
898
            }
899
            if (!delta_deficit) break;
900
          }
901

	
902
          // Run Dijkstra in the residual network
903
          s = _excess_nodes[next_node];
904
          if ((t = _dijkstra.run(s, _delta)) == -1) {
905
            if (_delta > 1) {
906
              ++next_node;
907
              continue;
908
            }
909
            return INFEASIBLE;
910
          }
911

	
912
          // Augment along a shortest path from s to t
913
          Value d = std::min(_excess[s], -_excess[t]);
914
          int u = t;
915
          int a;
916
          if (d > _delta) {
917
            while ((a = _pred[u]) != -1) {
918
              if (_res_cap[a] < d) d = _res_cap[a];
919
              u = _source[a];
920
            }
921
          }
922
          u = t;
923
          while ((a = _pred[u]) != -1) {
924
            _res_cap[a] -= d;
925
            _res_cap[_reverse[a]] += d;
926
            u = _source[a];
927
          }
928
          _excess[s] -= d;
929
          _excess[t] += d;
930

	
931
          if (_excess[s] < _delta) ++next_node;
932
        }
933

	
934
        if (_delta == 1) break;
935
        _delta = _delta <= _factor ? 1 : _delta / _factor;
936
      }
937

	
938
      return OPTIMAL;
939
    }
940

	
941
    // Execute the successive shortest path algorithm
942
    ProblemType startWithoutScaling() {
943
      // Find excess nodes
944
      _excess_nodes.clear();
945
      for (int i = 0; i != _node_num; ++i) {
946
        if (_excess[i] > 0) _excess_nodes.push_back(i);
947
      }
948
      if (_excess_nodes.size() == 0) return OPTIMAL;
949
      int next_node = 0;
950

	
951
      // Find shortest paths
952
      int s, t;
953
      ResidualDijkstra _dijkstra(*this);
954
      while ( _excess[_excess_nodes[next_node]] > 0 ||
955
              ++next_node < int(_excess_nodes.size()) )
956
      {
957
        // Run Dijkstra in the residual network
958
        s = _excess_nodes[next_node];
959
        if ((t = _dijkstra.run(s)) == -1) return INFEASIBLE;
960

	
961
        // Augment along a shortest path from s to t
962
        Value d = std::min(_excess[s], -_excess[t]);
963
        int u = t;
964
        int a;
965
        if (d > 1) {
966
          while ((a = _pred[u]) != -1) {
967
            if (_res_cap[a] < d) d = _res_cap[a];
968
            u = _source[a];
969
          }
970
        }
971
        u = t;
972
        while ((a = _pred[u]) != -1) {
973
          _res_cap[a] -= d;
974
          _res_cap[_reverse[a]] += d;
975
          u = _source[a];
976
        }
977
        _excess[s] -= d;
978
        _excess[t] += d;
979
      }
980

	
981
      return OPTIMAL;
982
    }
983

	
984
  }; //class CapacityScaling
985

	
986
  ///@}
987

	
988
} //namespace lemon
989

	
990
#endif //LEMON_CAPACITY_SCALING_H
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2010
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_COST_SCALING_H
20
#define LEMON_COST_SCALING_H
21

	
22
/// \ingroup min_cost_flow_algs
23
/// \file
24
/// \brief Cost scaling algorithm for finding a minimum cost flow.
25

	
26
#include <vector>
27
#include <deque>
28
#include <limits>
29

	
30
#include <lemon/core.h>
31
#include <lemon/maps.h>
32
#include <lemon/math.h>
33
#include <lemon/static_graph.h>
34
#include <lemon/circulation.h>
35
#include <lemon/bellman_ford.h>
36

	
37
namespace lemon {
38

	
39
  /// \brief Default traits class of CostScaling algorithm.
40
  ///
41
  /// Default traits class of CostScaling algorithm.
42
  /// \tparam GR Digraph type.
43
  /// \tparam V The number type used for flow amounts, capacity bounds
44
  /// and supply values. By default it is \c int.
45
  /// \tparam C The number type used for costs and potentials.
46
  /// By default it is the same as \c V.
47
#ifdef DOXYGEN
48
  template <typename GR, typename V = int, typename C = V>
49
#else
50
  template < typename GR, typename V = int, typename C = V,
51
             bool integer = std::numeric_limits<C>::is_integer >
52
#endif
53
  struct CostScalingDefaultTraits
54
  {
55
    /// The type of the digraph
56
    typedef GR Digraph;
57
    /// The type of the flow amounts, capacity bounds and supply values
58
    typedef V Value;
59
    /// The type of the arc costs
60
    typedef C Cost;
61

	
62
    /// \brief The large cost type used for internal computations
63
    ///
64
    /// The large cost type used for internal computations.
65
    /// It is \c long \c long if the \c Cost type is integer,
66
    /// otherwise it is \c double.
67
    /// \c Cost must be convertible to \c LargeCost.
68
    typedef double LargeCost;
69
  };
70

	
71
  // Default traits class for integer cost types
72
  template <typename GR, typename V, typename C>
73
  struct CostScalingDefaultTraits<GR, V, C, true>
74
  {
75
    typedef GR Digraph;
76
    typedef V Value;
77
    typedef C Cost;
78
#ifdef LEMON_HAVE_LONG_LONG
79
    typedef long long LargeCost;
80
#else
81
    typedef long LargeCost;
82
#endif
83
  };
84

	
85

	
86
  /// \addtogroup min_cost_flow_algs
87
  /// @{
88

	
89
  /// \brief Implementation of the Cost Scaling algorithm for
90
  /// finding a \ref min_cost_flow "minimum cost flow".
91
  ///
92
  /// \ref CostScaling implements a cost scaling algorithm that performs
93
  /// push/augment and relabel operations for finding a \ref min_cost_flow
94
  /// "minimum cost flow" \ref amo93networkflows, \ref goldberg90approximation,
95
  /// \ref goldberg97efficient, \ref bunnagel98efficient.
96
  /// It is a highly efficient primal-dual solution method, which
97
  /// can be viewed as the generalization of the \ref Preflow
98
  /// "preflow push-relabel" algorithm for the maximum flow problem.
99
  ///
100
  /// Most of the parameters of the problem (except for the digraph)
101
  /// can be given using separate functions, and the algorithm can be
102
  /// executed using the \ref run() function. If some parameters are not
103
  /// specified, then default values will be used.
104
  ///
105
  /// \tparam GR The digraph type the algorithm runs on.
106
  /// \tparam V The number type used for flow amounts, capacity bounds
107
  /// and supply values in the algorithm. By default, it is \c int.
108
  /// \tparam C The number type used for costs and potentials in the
109
  /// algorithm. By default, it is the same as \c V.
110
  /// \tparam TR The traits class that defines various types used by the
111
  /// algorithm. By default, it is \ref CostScalingDefaultTraits
112
  /// "CostScalingDefaultTraits<GR, V, C>".
113
  /// In most cases, this parameter should not be set directly,
114
  /// consider to use the named template parameters instead.
115
  ///
116
  /// \warning Both number types must be signed and all input data must
117
  /// be integer.
118
  /// \warning This algorithm does not support negative costs for such
119
  /// arcs that have infinite upper bound.
120
  ///
121
  /// \note %CostScaling provides three different internal methods,
122
  /// from which the most efficient one is used by default.
123
  /// For more information, see \ref Method.
124
#ifdef DOXYGEN
125
  template <typename GR, typename V, typename C, typename TR>
126
#else
127
  template < typename GR, typename V = int, typename C = V,
128
             typename TR = CostScalingDefaultTraits<GR, V, C> >
129
#endif
130
  class CostScaling
131
  {
132
  public:
133

	
134
    /// The type of the digraph
135
    typedef typename TR::Digraph Digraph;
136
    /// The type of the flow amounts, capacity bounds and supply values
137
    typedef typename TR::Value Value;
138
    /// The type of the arc costs
139
    typedef typename TR::Cost Cost;
140

	
141
    /// \brief The large cost type
142
    ///
143
    /// The large cost type used for internal computations.
144
    /// By default, it is \c long \c long if the \c Cost type is integer,
145
    /// otherwise it is \c double.
146
    typedef typename TR::LargeCost LargeCost;
147

	
148
    /// The \ref CostScalingDefaultTraits "traits class" of the algorithm
149
    typedef TR Traits;
150

	
151
  public:
152

	
153
    /// \brief Problem type constants for the \c run() function.
154
    ///
155
    /// Enum type containing the problem type constants that can be
156
    /// returned by the \ref run() function of the algorithm.
157
    enum ProblemType {
158
      /// The problem has no feasible solution (flow).
159
      INFEASIBLE,
160
      /// The problem has optimal solution (i.e. it is feasible and
161
      /// bounded), and the algorithm has found optimal flow and node
162
      /// potentials (primal and dual solutions).
163
      OPTIMAL,
164
      /// The digraph contains an arc of negative cost and infinite
165
      /// upper bound. It means that the objective function is unbounded
166
      /// on that arc, however, note that it could actually be bounded
167
      /// over the feasible flows, but this algroithm cannot handle
168
      /// these cases.
169
      UNBOUNDED
170
    };
171

	
172
    /// \brief Constants for selecting the internal method.
173
    ///
174
    /// Enum type containing constants for selecting the internal method
175
    /// for the \ref run() function.
176
    ///
177
    /// \ref CostScaling provides three internal methods that differ mainly
178
    /// in their base operations, which are used in conjunction with the
179
    /// relabel operation.
180
    /// By default, the so called \ref PARTIAL_AUGMENT
181
    /// "Partial Augment-Relabel" method is used, which proved to be
182
    /// the most efficient and the most robust on various test inputs.
183
    /// However, the other methods can be selected using the \ref run()
184
    /// function with the proper parameter.
185
    enum Method {
186
      /// Local push operations are used, i.e. flow is moved only on one
187
      /// admissible arc at once.
188
      PUSH,
189
      /// Augment operations are used, i.e. flow is moved on admissible
190
      /// paths from a node with excess to a node with deficit.
191
      AUGMENT,
192
      /// Partial augment operations are used, i.e. flow is moved on
193
      /// admissible paths started from a node with excess, but the
194
      /// lengths of these paths are limited. This method can be viewed
195
      /// as a combined version of the previous two operations.
196
      PARTIAL_AUGMENT
197
    };
198

	
199
  private:
200

	
201
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
202

	
203
    typedef std::vector<int> IntVector;
204
    typedef std::vector<Value> ValueVector;
205
    typedef std::vector<Cost> CostVector;
206
    typedef std::vector<LargeCost> LargeCostVector;
207
    typedef std::vector<char> BoolVector;
208
    // Note: vector<char> is used instead of vector<bool> for efficiency reasons
209

	
210
  private:
211

	
212
    template <typename KT, typename VT>
213
    class StaticVectorMap {
214
    public:
215
      typedef KT Key;
216
      typedef VT Value;
217

	
218
      StaticVectorMap(std::vector<Value>& v) : _v(v) {}
219

	
220
      const Value& operator[](const Key& key) const {
221
        return _v[StaticDigraph::id(key)];
222
      }
223

	
224
      Value& operator[](const Key& key) {
225
        return _v[StaticDigraph::id(key)];
226
      }
227

	
228
      void set(const Key& key, const Value& val) {
229
        _v[StaticDigraph::id(key)] = val;
230
      }
231

	
232
    private:
233
      std::vector<Value>& _v;
234
    };
235

	
236
    typedef StaticVectorMap<StaticDigraph::Node, LargeCost> LargeCostNodeMap;
237
    typedef StaticVectorMap<StaticDigraph::Arc, LargeCost> LargeCostArcMap;
238

	
239
  private:
240

	
241
    // Data related to the underlying digraph
242
    const GR &_graph;
243
    int _node_num;
244
    int _arc_num;
245
    int _res_node_num;
246
    int _res_arc_num;
247
    int _root;
248

	
249
    // Parameters of the problem
250
    bool _have_lower;
251
    Value _sum_supply;
252
    int _sup_node_num;
253

	
254
    // Data structures for storing the digraph
255
    IntNodeMap _node_id;
256
    IntArcMap _arc_idf;
257
    IntArcMap _arc_idb;
258
    IntVector _first_out;
259
    BoolVector _forward;
260
    IntVector _source;
261
    IntVector _target;
262
    IntVector _reverse;
263

	
264
    // Node and arc data
265
    ValueVector _lower;
266
    ValueVector _upper;
267
    CostVector _scost;
268
    ValueVector _supply;
269

	
270
    ValueVector _res_cap;
271
    LargeCostVector _cost;
272
    LargeCostVector _pi;
273
    ValueVector _excess;
274
    IntVector _next_out;
275
    std::deque<int> _active_nodes;
276

	
277
    // Data for scaling
278
    LargeCost _epsilon;
279
    int _alpha;
280

	
281
    IntVector _buckets;
282
    IntVector _bucket_next;
283
    IntVector _bucket_prev;
284
    IntVector _rank;
285
    int _max_rank;
286

	
287
    // Data for a StaticDigraph structure
288
    typedef std::pair<int, int> IntPair;
289
    StaticDigraph _sgr;
290
    std::vector<IntPair> _arc_vec;
291
    std::vector<LargeCost> _cost_vec;
292
    LargeCostArcMap _cost_map;
293
    LargeCostNodeMap _pi_map;
294

	
295
  public:
296

	
297
    /// \brief Constant for infinite upper bounds (capacities).
298
    ///
299
    /// Constant for infinite upper bounds (capacities).
300
    /// It is \c std::numeric_limits<Value>::infinity() if available,
301
    /// \c std::numeric_limits<Value>::max() otherwise.
302
    const Value INF;
303

	
304
  public:
305

	
306
    /// \name Named Template Parameters
307
    /// @{
308

	
309
    template <typename T>
310
    struct SetLargeCostTraits : public Traits {
311
      typedef T LargeCost;
312
    };
313

	
314
    /// \brief \ref named-templ-param "Named parameter" for setting
315
    /// \c LargeCost type.
316
    ///
317
    /// \ref named-templ-param "Named parameter" for setting \c LargeCost
318
    /// type, which is used for internal computations in the algorithm.
319
    /// \c Cost must be convertible to \c LargeCost.
320
    template <typename T>
321
    struct SetLargeCost
322
      : public CostScaling<GR, V, C, SetLargeCostTraits<T> > {
323
      typedef  CostScaling<GR, V, C, SetLargeCostTraits<T> > Create;
324
    };
325

	
326
    /// @}
327

	
328
  protected:
329

	
330
    CostScaling() {}
331

	
332
  public:
333

	
334
    /// \brief Constructor.
335
    ///
336
    /// The constructor of the class.
337
    ///
338
    /// \param graph The digraph the algorithm runs on.
339
    CostScaling(const GR& graph) :
340
      _graph(graph), _node_id(graph), _arc_idf(graph), _arc_idb(graph),
341
      _cost_map(_cost_vec), _pi_map(_pi),
342
      INF(std::numeric_limits<Value>::has_infinity ?
343
          std::numeric_limits<Value>::infinity() :
344
          std::numeric_limits<Value>::max())
345
    {
346
      // Check the number types
347
      LEMON_ASSERT(std::numeric_limits<Value>::is_signed,
348
        "The flow type of CostScaling must be signed");
349
      LEMON_ASSERT(std::numeric_limits<Cost>::is_signed,
350
        "The cost type of CostScaling must be signed");
351

	
352
      // Reset data structures
353
      reset();
354
    }
355

	
356
    /// \name Parameters
357
    /// The parameters of the algorithm can be specified using these
358
    /// functions.
359

	
360
    /// @{
361

	
362
    /// \brief Set the lower bounds on the arcs.
363
    ///
364
    /// This function sets the lower bounds on the arcs.
365
    /// If it is not used before calling \ref run(), the lower bounds
366
    /// will be set to zero on all arcs.
367
    ///
368
    /// \param map An arc map storing the lower bounds.
369
    /// Its \c Value type must be convertible to the \c Value type
370
    /// of the algorithm.
371
    ///
372
    /// \return <tt>(*this)</tt>
373
    template <typename LowerMap>
374
    CostScaling& lowerMap(const LowerMap& map) {
375
      _have_lower = true;
376
      for (ArcIt a(_graph); a != INVALID; ++a) {
377
        _lower[_arc_idf[a]] = map[a];
378
        _lower[_arc_idb[a]] = map[a];
379
      }
380
      return *this;
381
    }
382

	
383
    /// \brief Set the upper bounds (capacities) on the arcs.
384
    ///
385
    /// This function sets the upper bounds (capacities) on the arcs.
386
    /// If it is not used before calling \ref run(), the upper bounds
387
    /// will be set to \ref INF on all arcs (i.e. the flow value will be
388
    /// unbounded from above).
389
    ///
390
    /// \param map An arc map storing the upper bounds.
391
    /// Its \c Value type must be convertible to the \c Value type
392
    /// of the algorithm.
393
    ///
394
    /// \return <tt>(*this)</tt>
395
    template<typename UpperMap>
396
    CostScaling& upperMap(const UpperMap& map) {
397
      for (ArcIt a(_graph); a != INVALID; ++a) {
398
        _upper[_arc_idf[a]] = map[a];
399
      }
400
      return *this;
401
    }
402

	
403
    /// \brief Set the costs of the arcs.
404
    ///
405
    /// This function sets the costs of the arcs.
406
    /// If it is not used before calling \ref run(), the costs
407
    /// will be set to \c 1 on all arcs.
408
    ///
409
    /// \param map An arc map storing the costs.
410
    /// Its \c Value type must be convertible to the \c Cost type
411
    /// of the algorithm.
412
    ///
413
    /// \return <tt>(*this)</tt>
414
    template<typename CostMap>
415
    CostScaling& costMap(const CostMap& map) {
416
      for (ArcIt a(_graph); a != INVALID; ++a) {
417
        _scost[_arc_idf[a]] =  map[a];
418
        _scost[_arc_idb[a]] = -map[a];
419
      }
420
      return *this;
421
    }
422

	
423
    /// \brief Set the supply values of the nodes.
424
    ///
425
    /// This function sets the supply values of the nodes.
426
    /// If neither this function nor \ref stSupply() is used before
427
    /// calling \ref run(), the supply of each node will be set to zero.
428
    ///
429
    /// \param map A node map storing the supply values.
430
    /// Its \c Value type must be convertible to the \c Value type
431
    /// of the algorithm.
432
    ///
433
    /// \return <tt>(*this)</tt>
434
    template<typename SupplyMap>
435
    CostScaling& supplyMap(const SupplyMap& map) {
436
      for (NodeIt n(_graph); n != INVALID; ++n) {
437
        _supply[_node_id[n]] = map[n];
438
      }
439
      return *this;
440
    }
441

	
442
    /// \brief Set single source and target nodes and a supply value.
443
    ///
444
    /// This function sets a single source node and a single target node
445
    /// and the required flow value.
446
    /// If neither this function nor \ref supplyMap() is used before
447
    /// calling \ref run(), the supply of each node will be set to zero.
448
    ///
449
    /// Using this function has the same effect as using \ref supplyMap()
450
    /// with such a map in which \c k is assigned to \c s, \c -k is
451
    /// assigned to \c t and all other nodes have zero supply value.
452
    ///
453
    /// \param s The source node.
454
    /// \param t The target node.
455
    /// \param k The required amount of flow from node \c s to node \c t
456
    /// (i.e. the supply of \c s and the demand of \c t).
457
    ///
458
    /// \return <tt>(*this)</tt>
459
    CostScaling& stSupply(const Node& s, const Node& t, Value k) {
460
      for (int i = 0; i != _res_node_num; ++i) {
461
        _supply[i] = 0;
462
      }
463
      _supply[_node_id[s]] =  k;
464
      _supply[_node_id[t]] = -k;
465
      return *this;
466
    }
467

	
468
    /// @}
469

	
470
    /// \name Execution control
471
    /// The algorithm can be executed using \ref run().
472

	
473
    /// @{
474

	
475
    /// \brief Run the algorithm.
476
    ///
477
    /// This function runs the algorithm.
478
    /// The paramters can be specified using functions \ref lowerMap(),
479
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
480
    /// For example,
481
    /// \code
482
    ///   CostScaling<ListDigraph> cs(graph);
483
    ///   cs.lowerMap(lower).upperMap(upper).costMap(cost)
484
    ///     .supplyMap(sup).run();
485
    /// \endcode
486
    ///
487
    /// This function can be called more than once. All the given parameters
488
    /// are kept for the next call, unless \ref resetParams() or \ref reset()
489
    /// is used, thus only the modified parameters have to be set again.
490
    /// If the underlying digraph was also modified after the construction
491
    /// of the class (or the last \ref reset() call), then the \ref reset()
492
    /// function must be called.
493
    ///
494
    /// \param method The internal method that will be used in the
495
    /// algorithm. For more information, see \ref Method.
496
    /// \param factor The cost scaling factor. It must be larger than one.
497
    ///
498
    /// \return \c INFEASIBLE if no feasible flow exists,
499
    /// \n \c OPTIMAL if the problem has optimal solution
500
    /// (i.e. it is feasible and bounded), and the algorithm has found
501
    /// optimal flow and node potentials (primal and dual solutions),
502
    /// \n \c UNBOUNDED if the digraph contains an arc of negative cost
503
    /// and infinite upper bound. It means that the objective function
504
    /// is unbounded on that arc, however, note that it could actually be
505
    /// bounded over the feasible flows, but this algroithm cannot handle
506
    /// these cases.
507
    ///
508
    /// \see ProblemType, Method
509
    /// \see resetParams(), reset()
510
    ProblemType run(Method method = PARTIAL_AUGMENT, int factor = 8) {
511
      _alpha = factor;
512
      ProblemType pt = init();
513
      if (pt != OPTIMAL) return pt;
514
      start(method);
515
      return OPTIMAL;
516
    }
517

	
518
    /// \brief Reset all the parameters that have been given before.
519
    ///
520
    /// This function resets all the paramaters that have been given
521
    /// before using functions \ref lowerMap(), \ref upperMap(),
522
    /// \ref costMap(), \ref supplyMap(), \ref stSupply().
523
    ///
524
    /// It is useful for multiple \ref run() calls. Basically, all the given
525
    /// parameters are kept for the next \ref run() call, unless
526
    /// \ref resetParams() or \ref reset() is used.
527
    /// If the underlying digraph was also modified after the construction
528
    /// of the class or the last \ref reset() call, then the \ref reset()
529
    /// function must be used, otherwise \ref resetParams() is sufficient.
530
    ///
531
    /// For example,
532
    /// \code
533
    ///   CostScaling<ListDigraph> cs(graph);
534
    ///
535
    ///   // First run
536
    ///   cs.lowerMap(lower).upperMap(upper).costMap(cost)
537
    ///     .supplyMap(sup).run();
538
    ///
539
    ///   // Run again with modified cost map (resetParams() is not called,
540
    ///   // so only the cost map have to be set again)
541
    ///   cost[e] += 100;
542
    ///   cs.costMap(cost).run();
543
    ///
544
    ///   // Run again from scratch using resetParams()
545
    ///   // (the lower bounds will be set to zero on all arcs)
546
    ///   cs.resetParams();
547
    ///   cs.upperMap(capacity).costMap(cost)
548
    ///     .supplyMap(sup).run();
549
    /// \endcode
550
    ///
551
    /// \return <tt>(*this)</tt>
552
    ///
553
    /// \see reset(), run()
554
    CostScaling& resetParams() {
555
      for (int i = 0; i != _res_node_num; ++i) {
556
        _supply[i] = 0;
557
      }
558
      int limit = _first_out[_root];
559
      for (int j = 0; j != limit; ++j) {
560
        _lower[j] = 0;
561
        _upper[j] = INF;
562
        _scost[j] = _forward[j] ? 1 : -1;
563
      }
564
      for (int j = limit; j != _res_arc_num; ++j) {
565
        _lower[j] = 0;
566
        _upper[j] = INF;
567
        _scost[j] = 0;
568
        _scost[_reverse[j]] = 0;
569
      }
570
      _have_lower = false;
571
      return *this;
572
    }
573

	
574
    /// \brief Reset all the parameters that have been given before.
575
    ///
576
    /// This function resets all the paramaters that have been given
577
    /// before using functions \ref lowerMap(), \ref upperMap(),
578
    /// \ref costMap(), \ref supplyMap(), \ref stSupply().
579
    ///
580
    /// It is useful for multiple run() calls. If this function is not
581
    /// used, all the parameters given before are kept for the next
582
    /// \ref run() call.
583
    /// However, the underlying digraph must not be modified after this
584
    /// class have been constructed, since it copies and extends the graph.
585
    /// \return <tt>(*this)</tt>
586
    CostScaling& reset() {
587
      // Resize vectors
588
      _node_num = countNodes(_graph);
589
      _arc_num = countArcs(_graph);
590
      _res_node_num = _node_num + 1;
591
      _res_arc_num = 2 * (_arc_num + _node_num);
592
      _root = _node_num;
593

	
594
      _first_out.resize(_res_node_num + 1);
595
      _forward.resize(_res_arc_num);
596
      _source.resize(_res_arc_num);
597
      _target.resize(_res_arc_num);
598
      _reverse.resize(_res_arc_num);
599

	
600
      _lower.resize(_res_arc_num);
601
      _upper.resize(_res_arc_num);
602
      _scost.resize(_res_arc_num);
603
      _supply.resize(_res_node_num);
604

	
605
      _res_cap.resize(_res_arc_num);
606
      _cost.resize(_res_arc_num);
607
      _pi.resize(_res_node_num);
608
      _excess.resize(_res_node_num);
609
      _next_out.resize(_res_node_num);
610

	
611
      _arc_vec.reserve(_res_arc_num);
612
      _cost_vec.reserve(_res_arc_num);
613

	
614
      // Copy the graph
615
      int i = 0, j = 0, k = 2 * _arc_num + _node_num;
616
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
617
        _node_id[n] = i;
618
      }
619
      i = 0;
620
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
621
        _first_out[i] = j;
622
        for (OutArcIt a(_graph, n); a != INVALID; ++a, ++j) {
623
          _arc_idf[a] = j;
624
          _forward[j] = true;
625
          _source[j] = i;
626
          _target[j] = _node_id[_graph.runningNode(a)];
627
        }
628
        for (InArcIt a(_graph, n); a != INVALID; ++a, ++j) {
629
          _arc_idb[a] = j;
630
          _forward[j] = false;
631
          _source[j] = i;
632
          _target[j] = _node_id[_graph.runningNode(a)];
633
        }
634
        _forward[j] = false;
635
        _source[j] = i;
636
        _target[j] = _root;
637
        _reverse[j] = k;
638
        _forward[k] = true;
639
        _source[k] = _root;
640
        _target[k] = i;
641
        _reverse[k] = j;
642
        ++j; ++k;
643
      }
644
      _first_out[i] = j;
645
      _first_out[_res_node_num] = k;
646
      for (ArcIt a(_graph); a != INVALID; ++a) {
647
        int fi = _arc_idf[a];
648
        int bi = _arc_idb[a];
649
        _reverse[fi] = bi;
650
        _reverse[bi] = fi;
651
      }
652

	
653
      // Reset parameters
654
      resetParams();
655
      return *this;
656
    }
657

	
658
    /// @}
659

	
660
    /// \name Query Functions
661
    /// The results of the algorithm can be obtained using these
662
    /// functions.\n
663
    /// The \ref run() function must be called before using them.
664

	
665
    /// @{
666

	
667
    /// \brief Return the total cost of the found flow.
668
    ///
669
    /// This function returns the total cost of the found flow.
670
    /// Its complexity is O(e).
671
    ///
672
    /// \note The return type of the function can be specified as a
673
    /// template parameter. For example,
674
    /// \code
675
    ///   cs.totalCost<double>();
676
    /// \endcode
677
    /// It is useful if the total cost cannot be stored in the \c Cost
678
    /// type of the algorithm, which is the default return type of the
679
    /// function.
680
    ///
681
    /// \pre \ref run() must be called before using this function.
682
    template <typename Number>
683
    Number totalCost() const {
684
      Number c = 0;
685
      for (ArcIt a(_graph); a != INVALID; ++a) {
686
        int i = _arc_idb[a];
687
        c += static_cast<Number>(_res_cap[i]) *
688
             (-static_cast<Number>(_scost[i]));
689
      }
690
      return c;
691
    }
692

	
693
#ifndef DOXYGEN
694
    Cost totalCost() const {
695
      return totalCost<Cost>();
696
    }
697
#endif
698

	
699
    /// \brief Return the flow on the given arc.
700
    ///
701
    /// This function returns the flow on the given arc.
702
    ///
703
    /// \pre \ref run() must be called before using this function.
704
    Value flow(const Arc& a) const {
705
      return _res_cap[_arc_idb[a]];
706
    }
707

	
708
    /// \brief Return the flow map (the primal solution).
709
    ///
710
    /// This function copies the flow value on each arc into the given
711
    /// map. The \c Value type of the algorithm must be convertible to
712
    /// the \c Value type of the map.
713
    ///
714
    /// \pre \ref run() must be called before using this function.
715
    template <typename FlowMap>
716
    void flowMap(FlowMap &map) const {
717
      for (ArcIt a(_graph); a != INVALID; ++a) {
718
        map.set(a, _res_cap[_arc_idb[a]]);
719
      }
720
    }
721

	
722
    /// \brief Return the potential (dual value) of the given node.
723
    ///
724
    /// This function returns the potential (dual value) of the
725
    /// given node.
726
    ///
727
    /// \pre \ref run() must be called before using this function.
728
    Cost potential(const Node& n) const {
729
      return static_cast<Cost>(_pi[_node_id[n]]);
730
    }
731

	
732
    /// \brief Return the potential map (the dual solution).
733
    ///
734
    /// This function copies the potential (dual value) of each node
735
    /// into the given map.
736
    /// The \c Cost type of the algorithm must be convertible to the
737
    /// \c Value type of the map.
738
    ///
739
    /// \pre \ref run() must be called before using this function.
740
    template <typename PotentialMap>
741
    void potentialMap(PotentialMap &map) const {
742
      for (NodeIt n(_graph); n != INVALID; ++n) {
743
        map.set(n, static_cast<Cost>(_pi[_node_id[n]]));
744
      }
745
    }
746

	
747
    /// @}
748

	
749
  private:
750

	
751
    // Initialize the algorithm
752
    ProblemType init() {
753
      if (_res_node_num <= 1) return INFEASIBLE;
754

	
755
      // Check the sum of supply values
756
      _sum_supply = 0;
757
      for (int i = 0; i != _root; ++i) {
758
        _sum_supply += _supply[i];
759
      }
760
      if (_sum_supply > 0) return INFEASIBLE;
761

	
762

	
763
      // Initialize vectors
764
      for (int i = 0; i != _res_node_num; ++i) {
765
        _pi[i] = 0;
766
        _excess[i] = _supply[i];
767
      }
768

	
769
      // Remove infinite upper bounds and check negative arcs
770
      const Value MAX = std::numeric_limits<Value>::max();
771
      int last_out;
772
      if (_have_lower) {
773
        for (int i = 0; i != _root; ++i) {
774
          last_out = _first_out[i+1];
775
          for (int j = _first_out[i]; j != last_out; ++j) {
776
            if (_forward[j]) {
777
              Value c = _scost[j] < 0 ? _upper[j] : _lower[j];
778
              if (c >= MAX) return UNBOUNDED;
779
              _excess[i] -= c;
780
              _excess[_target[j]] += c;
781
            }
782
          }
783
        }
784
      } else {
785
        for (int i = 0; i != _root; ++i) {
786
          last_out = _first_out[i+1];
787
          for (int j = _first_out[i]; j != last_out; ++j) {
788
            if (_forward[j] && _scost[j] < 0) {
789
              Value c = _upper[j];
790
              if (c >= MAX) return UNBOUNDED;
791
              _excess[i] -= c;
792
              _excess[_target[j]] += c;
793
            }
794
          }
795
        }
796
      }
797
      Value ex, max_cap = 0;
798
      for (int i = 0; i != _res_node_num; ++i) {
799
        ex = _excess[i];
800
        _excess[i] = 0;
801
        if (ex < 0) max_cap -= ex;
802
      }
803
      for (int j = 0; j != _res_arc_num; ++j) {
804
        if (_upper[j] >= MAX) _upper[j] = max_cap;
805
      }
806

	
807
      // Initialize the large cost vector and the epsilon parameter
808
      _epsilon = 0;
809
      LargeCost lc;
810
      for (int i = 0; i != _root; ++i) {
811
        last_out = _first_out[i+1];
812
        for (int j = _first_out[i]; j != last_out; ++j) {
813
          lc = static_cast<LargeCost>(_scost[j]) * _res_node_num * _alpha;
814
          _cost[j] = lc;
815
          if (lc > _epsilon) _epsilon = lc;
816
        }
817
      }
818
      _epsilon /= _alpha;
819

	
820
      // Initialize maps for Circulation and remove non-zero lower bounds
821
      ConstMap<Arc, Value> low(0);
822
      typedef typename Digraph::template ArcMap<Value> ValueArcMap;
823
      typedef typename Digraph::template NodeMap<Value> ValueNodeMap;
824
      ValueArcMap cap(_graph), flow(_graph);
825
      ValueNodeMap sup(_graph);
826
      for (NodeIt n(_graph); n != INVALID; ++n) {
827
        sup[n] = _supply[_node_id[n]];
828
      }
829
      if (_have_lower) {
830
        for (ArcIt a(_graph); a != INVALID; ++a) {
831
          int j = _arc_idf[a];
832
          Value c = _lower[j];
833
          cap[a] = _upper[j] - c;
834
          sup[_graph.source(a)] -= c;
835
          sup[_graph.target(a)] += c;
836
        }
837
      } else {
838
        for (ArcIt a(_graph); a != INVALID; ++a) {
839
          cap[a] = _upper[_arc_idf[a]];
840
        }
841
      }
842

	
843
      _sup_node_num = 0;
844
      for (NodeIt n(_graph); n != INVALID; ++n) {
845
        if (sup[n] > 0) ++_sup_node_num;
846
      }
847

	
848
      // Find a feasible flow using Circulation
849
      Circulation<Digraph, ConstMap<Arc, Value>, ValueArcMap, ValueNodeMap>
850
        circ(_graph, low, cap, sup);
851
      if (!circ.flowMap(flow).run()) return INFEASIBLE;
852

	
853
      // Set residual capacities and handle GEQ supply type
854
      if (_sum_supply < 0) {
855
        for (ArcIt a(_graph); a != INVALID; ++a) {
856
          Value fa = flow[a];
857
          _res_cap[_arc_idf[a]] = cap[a] - fa;
858
          _res_cap[_arc_idb[a]] = fa;
859
          sup[_graph.source(a)] -= fa;
860
          sup[_graph.target(a)] += fa;
861
        }
862
        for (NodeIt n(_graph); n != INVALID; ++n) {
863
          _excess[_node_id[n]] = sup[n];
864
        }
865
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
866
          int u = _target[a];
867
          int ra = _reverse[a];
868
          _res_cap[a] = -_sum_supply + 1;
869
          _res_cap[ra] = -_excess[u];
870
          _cost[a] = 0;
871
          _cost[ra] = 0;
872
          _excess[u] = 0;
873
        }
874
      } else {
875
        for (ArcIt a(_graph); a != INVALID; ++a) {
876
          Value fa = flow[a];
877
          _res_cap[_arc_idf[a]] = cap[a] - fa;
878
          _res_cap[_arc_idb[a]] = fa;
879
        }
880
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
881
          int ra = _reverse[a];
882
          _res_cap[a] = 0;
883
          _res_cap[ra] = 0;
884
          _cost[a] = 0;
885
          _cost[ra] = 0;
886
        }
887
      }
888

	
889
      return OPTIMAL;
890
    }
891

	
892
    // Execute the algorithm and transform the results
893
    void start(Method method) {
894
      // Maximum path length for partial augment
895
      const int MAX_PATH_LENGTH = 4;
896

	
897
      // Initialize data structures for buckets
898
      _max_rank = _alpha * _res_node_num;
899
      _buckets.resize(_max_rank);
900
      _bucket_next.resize(_res_node_num + 1);
901
      _bucket_prev.resize(_res_node_num + 1);
902
      _rank.resize(_res_node_num + 1);
903

	
904
      // Execute the algorithm
905
      switch (method) {
906
        case PUSH:
907
          startPush();
908
          break;
909
        case AUGMENT:
910
          startAugment(_res_node_num - 1);
911
          break;
912
        case PARTIAL_AUGMENT:
913
          startAugment(MAX_PATH_LENGTH);
914
          break;
915
      }
916

	
917
      // Compute node potentials for the original costs
918
      _arc_vec.clear();
919
      _cost_vec.clear();
920
      for (int j = 0; j != _res_arc_num; ++j) {
921
        if (_res_cap[j] > 0) {
922
          _arc_vec.push_back(IntPair(_source[j], _target[j]));
923
          _cost_vec.push_back(_scost[j]);
924
        }
925
      }
926
      _sgr.build(_res_node_num, _arc_vec.begin(), _arc_vec.end());
927

	
928
      typename BellmanFord<StaticDigraph, LargeCostArcMap>
929
        ::template SetDistMap<LargeCostNodeMap>::Create bf(_sgr, _cost_map);
930
      bf.distMap(_pi_map);
931
      bf.init(0);
932
      bf.start();
933

	
934
      // Handle non-zero lower bounds
935
      if (_have_lower) {
936
        int limit = _first_out[_root];
937
        for (int j = 0; j != limit; ++j) {
938
          if (!_forward[j]) _res_cap[j] += _lower[j];
939
        }
940
      }
941
    }
942

	
943
    // Initialize a cost scaling phase
944
    void initPhase() {
945
      // Saturate arcs not satisfying the optimality condition
946
      for (int u = 0; u != _res_node_num; ++u) {
947
        int last_out = _first_out[u+1];
948
        LargeCost pi_u = _pi[u];
949
        for (int a = _first_out[u]; a != last_out; ++a) {
950
          int v = _target[a];
951
          if (_res_cap[a] > 0 && _cost[a] + pi_u - _pi[v] < 0) {
952
            Value delta = _res_cap[a];
953
            _excess[u] -= delta;
954
            _excess[v] += delta;
955
            _res_cap[a] = 0;
956
            _res_cap[_reverse[a]] += delta;
957
          }
958
        }
959
      }
960

	
961
      // Find active nodes (i.e. nodes with positive excess)
962
      for (int u = 0; u != _res_node_num; ++u) {
963
        if (_excess[u] > 0) _active_nodes.push_back(u);
964
      }
965

	
966
      // Initialize the next arcs
967
      for (int u = 0; u != _res_node_num; ++u) {
968
        _next_out[u] = _first_out[u];
969
      }
970
    }
971

	
972
    // Early termination heuristic
973
    bool earlyTermination() {
974
      const double EARLY_TERM_FACTOR = 3.0;
975

	
976
      // Build a static residual graph
977
      _arc_vec.clear();
978
      _cost_vec.clear();
979
      for (int j = 0; j != _res_arc_num; ++j) {
980
        if (_res_cap[j] > 0) {
981
          _arc_vec.push_back(IntPair(_source[j], _target[j]));
982
          _cost_vec.push_back(_cost[j] + 1);
983
        }
984
      }
985
      _sgr.build(_res_node_num, _arc_vec.begin(), _arc_vec.end());
986

	
987
      // Run Bellman-Ford algorithm to check if the current flow is optimal
988
      BellmanFord<StaticDigraph, LargeCostArcMap> bf(_sgr, _cost_map);
989
      bf.init(0);
990
      bool done = false;
991
      int K = int(EARLY_TERM_FACTOR * std::sqrt(double(_res_node_num)));
992
      for (int i = 0; i < K && !done; ++i) {
993
        done = bf.processNextWeakRound();
994
      }
995
      return done;
996
    }
997

	
998
    // Global potential update heuristic
999
    void globalUpdate() {
1000
      int bucket_end = _root + 1;
1001

	
1002
      // Initialize buckets
1003
      for (int r = 0; r != _max_rank; ++r) {
1004
        _buckets[r] = bucket_end;
1005
      }
1006
      Value total_excess = 0;
1007
      for (int i = 0; i != _res_node_num; ++i) {
1008
        if (_excess[i] < 0) {
1009
          _rank[i] = 0;
1010
          _bucket_next[i] = _buckets[0];
1011
          _bucket_prev[_buckets[0]] = i;
1012
          _buckets[0] = i;
1013
        } else {
1014
          total_excess += _excess[i];
1015
          _rank[i] = _max_rank;
1016
        }
1017
      }
1018
      if (total_excess == 0) return;
1019

	
1020
      // Search the buckets
1021
      int r = 0;
1022
      for ( ; r != _max_rank; ++r) {
1023
        while (_buckets[r] != bucket_end) {
1024
          // Remove the first node from the current bucket
1025
          int u = _buckets[r];
1026
          _buckets[r] = _bucket_next[u];
1027

	
1028
          // Search the incomming arcs of u
1029
          LargeCost pi_u = _pi[u];
1030
          int last_out = _first_out[u+1];
1031
          for (int a = _first_out[u]; a != last_out; ++a) {
1032
            int ra = _reverse[a];
1033
            if (_res_cap[ra] > 0) {
1034
              int v = _source[ra];
1035
              int old_rank_v = _rank[v];
1036
              if (r < old_rank_v) {
1037
                // Compute the new rank of v
1038
                LargeCost nrc = (_cost[ra] + _pi[v] - pi_u) / _epsilon;
1039
                int new_rank_v = old_rank_v;
1040
                if (nrc < LargeCost(_max_rank))
1041
                  new_rank_v = r + 1 + int(nrc);
1042

	
1043
                // Change the rank of v
1044
                if (new_rank_v < old_rank_v) {
1045
                  _rank[v] = new_rank_v;
1046
                  _next_out[v] = _first_out[v];
1047

	
1048
                  // Remove v from its old bucket
1049
                  if (old_rank_v < _max_rank) {
1050
                    if (_buckets[old_rank_v] == v) {
1051
                      _buckets[old_rank_v] = _bucket_next[v];
1052
                    } else {
1053
                      _bucket_next[_bucket_prev[v]] = _bucket_next[v];
1054
                      _bucket_prev[_bucket_next[v]] = _bucket_prev[v];
1055
                    }
1056
                  }
1057

	
1058
                  // Insert v to its new bucket
1059
                  _bucket_next[v] = _buckets[new_rank_v];
1060
                  _bucket_prev[_buckets[new_rank_v]] = v;
1061
                  _buckets[new_rank_v] = v;
1062
                }
1063
              }
1064
            }
1065
          }
1066

	
1067
          // Finish search if there are no more active nodes
1068
          if (_excess[u] > 0) {
1069
            total_excess -= _excess[u];
1070
            if (total_excess <= 0) break;
1071
          }
1072
        }
1073
        if (total_excess <= 0) break;
1074
      }
1075

	
1076
      // Relabel nodes
1077
      for (int u = 0; u != _res_node_num; ++u) {
1078
        int k = std::min(_rank[u], r);
1079
        if (k > 0) {
1080
          _pi[u] -= _epsilon * k;
1081
          _next_out[u] = _first_out[u];
1082
        }
1083
      }
1084
    }
1085

	
1086
    /// Execute the algorithm performing augment and relabel operations
1087
    void startAugment(int max_length) {
1088
      // Paramters for heuristics
1089
      const int EARLY_TERM_EPSILON_LIMIT = 1000;
1090
      const double GLOBAL_UPDATE_FACTOR = 3.0;
1091

	
1092
      const int global_update_freq = int(GLOBAL_UPDATE_FACTOR *
1093
        (_res_node_num + _sup_node_num * _sup_node_num));
1094
      int next_update_limit = global_update_freq;
1095

	
1096
      int relabel_cnt = 0;
1097

	
1098
      // Perform cost scaling phases
1099
      std::vector<int> path;
1100
      for ( ; _epsilon >= 1; _epsilon = _epsilon < _alpha && _epsilon > 1 ?
1101
                                        1 : _epsilon / _alpha )
1102
      {
1103
        // Early termination heuristic
1104
        if (_epsilon <= EARLY_TERM_EPSILON_LIMIT) {
1105
          if (earlyTermination()) break;
1106
        }
1107

	
1108
        // Initialize current phase
1109
        initPhase();
1110

	
1111
        // Perform partial augment and relabel operations
1112
        while (true) {
1113
          // Select an active node (FIFO selection)
1114
          while (_active_nodes.size() > 0 &&
1115
                 _excess[_active_nodes.front()] <= 0) {
1116
            _active_nodes.pop_front();
1117
          }
1118
          if (_active_nodes.size() == 0) break;
1119
          int start = _active_nodes.front();
1120

	
1121
          // Find an augmenting path from the start node
1122
          path.clear();
1123
          int tip = start;
1124
          while (_excess[tip] >= 0 && int(path.size()) < max_length) {
1125
            int u;
1126
            LargeCost min_red_cost, rc, pi_tip = _pi[tip];
1127
            int last_out = _first_out[tip+1];
1128
            for (int a = _next_out[tip]; a != last_out; ++a) {
1129
              u = _target[a];
1130
              if (_res_cap[a] > 0 && _cost[a] + pi_tip - _pi[u] < 0) {
1131
                path.push_back(a);
1132
                _next_out[tip] = a;
1133
                tip = u;
1134
                goto next_step;
1135
              }
1136
            }
1137

	
1138
            // Relabel tip node
1139
            min_red_cost = std::numeric_limits<LargeCost>::max();
1140
            if (tip != start) {
1141
              int ra = _reverse[path.back()];
1142
              min_red_cost = _cost[ra] + pi_tip - _pi[_target[ra]];
1143
            }
1144
            for (int a = _first_out[tip]; a != last_out; ++a) {
1145
              rc = _cost[a] + pi_tip - _pi[_target[a]];
1146
              if (_res_cap[a] > 0 && rc < min_red_cost) {
1147
                min_red_cost = rc;
1148
              }
1149
            }
1150
            _pi[tip] -= min_red_cost + _epsilon;
1151
            _next_out[tip] = _first_out[tip];
1152
            ++relabel_cnt;
1153

	
1154
            // Step back
1155
            if (tip != start) {
1156
              tip = _source[path.back()];
1157
              path.pop_back();
1158
            }
1159

	
1160
          next_step: ;
1161
          }
1162

	
1163
          // Augment along the found path (as much flow as possible)
1164
          Value delta;
1165
          int pa, u, v = start;
1166
          for (int i = 0; i != int(path.size()); ++i) {
1167
            pa = path[i];
1168
            u = v;
1169
            v = _target[pa];
1170
            delta = std::min(_res_cap[pa], _excess[u]);
1171
            _res_cap[pa] -= delta;
1172
            _res_cap[_reverse[pa]] += delta;
1173
            _excess[u] -= delta;
1174
            _excess[v] += delta;
1175
            if (_excess[v] > 0 && _excess[v] <= delta)
1176
              _active_nodes.push_back(v);
1177
          }
1178

	
1179
          // Global update heuristic
1180
          if (relabel_cnt >= next_update_limit) {
1181
            globalUpdate();
1182
            next_update_limit += global_update_freq;
1183
          }
1184
        }
1185
      }
1186
    }
1187

	
1188
    /// Execute the algorithm performing push and relabel operations
1189
    void startPush() {
1190
      // Paramters for heuristics
1191
      const int EARLY_TERM_EPSILON_LIMIT = 1000;
1192
      const double GLOBAL_UPDATE_FACTOR = 2.0;
1193

	
1194
      const int global_update_freq = int(GLOBAL_UPDATE_FACTOR *
1195
        (_res_node_num + _sup_node_num * _sup_node_num));
1196
      int next_update_limit = global_update_freq;
1197

	
1198
      int relabel_cnt = 0;
1199

	
1200
      // Perform cost scaling phases
1201
      BoolVector hyper(_res_node_num, false);
1202
      LargeCostVector hyper_cost(_res_node_num);
1203
      for ( ; _epsilon >= 1; _epsilon = _epsilon < _alpha && _epsilon > 1 ?
1204
                                        1 : _epsilon / _alpha )
1205
      {
1206
        // Early termination heuristic
1207
        if (_epsilon <= EARLY_TERM_EPSILON_LIMIT) {
1208
          if (earlyTermination()) break;
1209
        }
1210

	
1211
        // Initialize current phase
1212
        initPhase();
1213

	
1214
        // Perform push and relabel operations
1215
        while (_active_nodes.size() > 0) {
1216
          LargeCost min_red_cost, rc, pi_n;
1217
          Value delta;
1218
          int n, t, a, last_out = _res_arc_num;
1219

	
1220
        next_node:
1221
          // Select an active node (FIFO selection)
1222
          n = _active_nodes.front();
1223
          last_out = _first_out[n+1];
1224
          pi_n = _pi[n];
1225

	
1226
          // Perform push operations if there are admissible arcs
1227
          if (_excess[n] > 0) {
1228
            for (a = _next_out[n]; a != last_out; ++a) {
1229
              if (_res_cap[a] > 0 &&
1230
                  _cost[a] + pi_n - _pi[_target[a]] < 0) {
1231
                delta = std::min(_res_cap[a], _excess[n]);
1232
                t = _target[a];
1233

	
1234
                // Push-look-ahead heuristic
1235
                Value ahead = -_excess[t];
1236
                int last_out_t = _first_out[t+1];
1237
                LargeCost pi_t = _pi[t];
1238
                for (int ta = _next_out[t]; ta != last_out_t; ++ta) {
1239
                  if (_res_cap[ta] > 0 &&
1240
                      _cost[ta] + pi_t - _pi[_target[ta]] < 0)
1241
                    ahead += _res_cap[ta];
1242
                  if (ahead >= delta) break;
1243
                }
1244
                if (ahead < 0) ahead = 0;
1245

	
1246
                // Push flow along the arc
1247
                if (ahead < delta && !hyper[t]) {
1248
                  _res_cap[a] -= ahead;
1249
                  _res_cap[_reverse[a]] += ahead;
1250
                  _excess[n] -= ahead;
1251
                  _excess[t] += ahead;
1252
                  _active_nodes.push_front(t);
1253
                  hyper[t] = true;
1254
                  hyper_cost[t] = _cost[a] + pi_n - pi_t;
1255
                  _next_out[n] = a;
1256
                  goto next_node;
1257
                } else {
1258
                  _res_cap[a] -= delta;
1259
                  _res_cap[_reverse[a]] += delta;
1260
                  _excess[n] -= delta;
1261
                  _excess[t] += delta;
1262
                  if (_excess[t] > 0 && _excess[t] <= delta)
1263
                    _active_nodes.push_back(t);
1264
                }
1265

	
1266
                if (_excess[n] == 0) {
1267
                  _next_out[n] = a;
1268
                  goto remove_nodes;
1269
                }
1270
              }
1271
            }
1272
            _next_out[n] = a;
1273
          }
1274

	
1275
          // Relabel the node if it is still active (or hyper)
1276
          if (_excess[n] > 0 || hyper[n]) {
1277
             min_red_cost = hyper[n] ? -hyper_cost[n] :
1278
               std::numeric_limits<LargeCost>::max();
1279
            for (int a = _first_out[n]; a != last_out; ++a) {
1280
              rc = _cost[a] + pi_n - _pi[_target[a]];
1281
              if (_res_cap[a] > 0 && rc < min_red_cost) {
1282
                min_red_cost = rc;
1283
              }
1284
            }
1285
            _pi[n] -= min_red_cost + _epsilon;
1286
            _next_out[n] = _first_out[n];
1287
            hyper[n] = false;
1288
            ++relabel_cnt;
1289
          }
1290

	
1291
          // Remove nodes that are not active nor hyper
1292
        remove_nodes:
1293
          while ( _active_nodes.size() > 0 &&
1294
                  _excess[_active_nodes.front()] <= 0 &&
1295
                  !hyper[_active_nodes.front()] ) {
1296
            _active_nodes.pop_front();
1297
          }
1298

	
1299
          // Global update heuristic
1300
          if (relabel_cnt >= next_update_limit) {
1301
            globalUpdate();
1302
            for (int u = 0; u != _res_node_num; ++u)
1303
              hyper[u] = false;
1304
            next_update_limit += global_update_freq;
1305
          }
1306
        }
1307
      }
1308
    }
1309

	
1310
  }; //class CostScaling
1311

	
1312
  ///@}
1313

	
1314
} //namespace lemon
1315

	
1316
#endif //LEMON_COST_SCALING_H
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2010
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_CYCLE_CANCELING_H
20
#define LEMON_CYCLE_CANCELING_H
21

	
22
/// \ingroup min_cost_flow_algs
23
/// \file
24
/// \brief Cycle-canceling algorithms for finding a minimum cost flow.
25

	
26
#include <vector>
27
#include <limits>
28

	
29
#include <lemon/core.h>
30
#include <lemon/maps.h>
31
#include <lemon/path.h>
32
#include <lemon/math.h>
33
#include <lemon/static_graph.h>
34
#include <lemon/adaptors.h>
35
#include <lemon/circulation.h>
36
#include <lemon/bellman_ford.h>
37
#include <lemon/howard_mmc.h>
38

	
39
namespace lemon {
40

	
41
  /// \addtogroup min_cost_flow_algs
42
  /// @{
43

	
44
  /// \brief Implementation of cycle-canceling algorithms for
45
  /// finding a \ref min_cost_flow "minimum cost flow".
46
  ///
47
  /// \ref CycleCanceling implements three different cycle-canceling
48
  /// algorithms for finding a \ref min_cost_flow "minimum cost flow"
49
  /// \ref amo93networkflows, \ref klein67primal,
50
  /// \ref goldberg89cyclecanceling.
51
  /// The most efficent one (both theoretically and practically)
52
  /// is the \ref CANCEL_AND_TIGHTEN "Cancel and Tighten" algorithm,
53
  /// thus it is the default method.
54
  /// It is strongly polynomial, but in practice, it is typically much
55
  /// slower than the scaling algorithms and NetworkSimplex.
56
  ///
57
  /// Most of the parameters of the problem (except for the digraph)
58
  /// can be given using separate functions, and the algorithm can be
59
  /// executed using the \ref run() function. If some parameters are not
60
  /// specified, then default values will be used.
61
  ///
62
  /// \tparam GR The digraph type the algorithm runs on.
63
  /// \tparam V The number type used for flow amounts, capacity bounds
64
  /// and supply values in the algorithm. By default, it is \c int.
65
  /// \tparam C The number type used for costs and potentials in the
66
  /// algorithm. By default, it is the same as \c V.
67
  ///
68
  /// \warning Both number types must be signed and all input data must
69
  /// be integer.
70
  /// \warning This algorithm does not support negative costs for such
71
  /// arcs that have infinite upper bound.
72
  ///
73
  /// \note For more information about the three available methods,
74
  /// see \ref Method.
75
#ifdef DOXYGEN
76
  template <typename GR, typename V, typename C>
77
#else
78
  template <typename GR, typename V = int, typename C = V>
79
#endif
80
  class CycleCanceling
81
  {
82
  public:
83

	
84
    /// The type of the digraph
85
    typedef GR Digraph;
86
    /// The type of the flow amounts, capacity bounds and supply values
87
    typedef V Value;
88
    /// The type of the arc costs
89
    typedef C Cost;
90

	
91
  public:
92

	
93
    /// \brief Problem type constants for the \c run() function.
94
    ///
95
    /// Enum type containing the problem type constants that can be
96
    /// returned by the \ref run() function of the algorithm.
97
    enum ProblemType {
98
      /// The problem has no feasible solution (flow).
99
      INFEASIBLE,
100
      /// The problem has optimal solution (i.e. it is feasible and
101
      /// bounded), and the algorithm has found optimal flow and node
102
      /// potentials (primal and dual solutions).
103
      OPTIMAL,
104
      /// The digraph contains an arc of negative cost and infinite
105
      /// upper bound. It means that the objective function is unbounded
106
      /// on that arc, however, note that it could actually be bounded
107
      /// over the feasible flows, but this algroithm cannot handle
108
      /// these cases.
109
      UNBOUNDED
110
    };
111

	
112
    /// \brief Constants for selecting the used method.
113
    ///
114
    /// Enum type containing constants for selecting the used method
115
    /// for the \ref run() function.
116
    ///
117
    /// \ref CycleCanceling provides three different cycle-canceling
118
    /// methods. By default, \ref CANCEL_AND_TIGHTEN "Cancel and Tighten"
119
    /// is used, which proved to be the most efficient and the most robust
120
    /// on various test inputs.
121
    /// However, the other methods can be selected using the \ref run()
122
    /// function with the proper parameter.
123
    enum Method {
124
      /// A simple cycle-canceling method, which uses the
125
      /// \ref BellmanFord "Bellman-Ford" algorithm with limited iteration
126
      /// number for detecting negative cycles in the residual network.
127
      SIMPLE_CYCLE_CANCELING,
128
      /// The "Minimum Mean Cycle-Canceling" algorithm, which is a
129
      /// well-known strongly polynomial method
130
      /// \ref goldberg89cyclecanceling. It improves along a
131
      /// \ref min_mean_cycle "minimum mean cycle" in each iteration.
132
      /// Its running time complexity is O(n<sup>2</sup>m<sup>3</sup>log(n)).
133
      MINIMUM_MEAN_CYCLE_CANCELING,
134
      /// The "Cancel And Tighten" algorithm, which can be viewed as an
135
      /// improved version of the previous method
136
      /// \ref goldberg89cyclecanceling.
137
      /// It is faster both in theory and in practice, its running time
138
      /// complexity is O(n<sup>2</sup>m<sup>2</sup>log(n)).
139
      CANCEL_AND_TIGHTEN
140
    };
141

	
142
  private:
143

	
144
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
145

	
146
    typedef std::vector<int> IntVector;
147
    typedef std::vector<double> DoubleVector;
148
    typedef std::vector<Value> ValueVector;
149
    typedef std::vector<Cost> CostVector;
150
    typedef std::vector<char> BoolVector;
151
    // Note: vector<char> is used instead of vector<bool> for efficiency reasons
152

	
153
  private:
154

	
155
    template <typename KT, typename VT>
156
    class StaticVectorMap {
157
    public:
158
      typedef KT Key;
159
      typedef VT Value;
160

	
161
      StaticVectorMap(std::vector<Value>& v) : _v(v) {}
162

	
163
      const Value& operator[](const Key& key) const {
164
        return _v[StaticDigraph::id(key)];
165
      }
166

	
167
      Value& operator[](const Key& key) {
168
        return _v[StaticDigraph::id(key)];
169
      }
170

	
171
      void set(const Key& key, const Value& val) {
172
        _v[StaticDigraph::id(key)] = val;
173
      }
174

	
175
    private:
176
      std::vector<Value>& _v;
177
    };
178

	
179
    typedef StaticVectorMap<StaticDigraph::Node, Cost> CostNodeMap;
180
    typedef StaticVectorMap<StaticDigraph::Arc, Cost> CostArcMap;
181

	
182
  private:
183

	
184

	
185
    // Data related to the underlying digraph
186
    const GR &_graph;
187
    int _node_num;
188
    int _arc_num;
189
    int _res_node_num;
190
    int _res_arc_num;
191
    int _root;
192

	
193
    // Parameters of the problem
194
    bool _have_lower;
195
    Value _sum_supply;
196

	
197
    // Data structures for storing the digraph
198
    IntNodeMap _node_id;
199
    IntArcMap _arc_idf;
200
    IntArcMap _arc_idb;
201
    IntVector _first_out;
202
    BoolVector _forward;
203
    IntVector _source;
204
    IntVector _target;
205
    IntVector _reverse;
206

	
207
    // Node and arc data
208
    ValueVector _lower;
209
    ValueVector _upper;
210
    CostVector _cost;
211
    ValueVector _supply;
212

	
213
    ValueVector _res_cap;
214
    CostVector _pi;
215

	
216
    // Data for a StaticDigraph structure
217
    typedef std::pair<int, int> IntPair;
218
    StaticDigraph _sgr;
219
    std::vector<IntPair> _arc_vec;
220
    std::vector<Cost> _cost_vec;
221
    IntVector _id_vec;
222
    CostArcMap _cost_map;
223
    CostNodeMap _pi_map;
224

	
225
  public:
226

	
227
    /// \brief Constant for infinite upper bounds (capacities).
228
    ///
229
    /// Constant for infinite upper bounds (capacities).
230
    /// It is \c std::numeric_limits<Value>::infinity() if available,
231
    /// \c std::numeric_limits<Value>::max() otherwise.
232
    const Value INF;
233

	
234
  public:
235

	
236
    /// \brief Constructor.
237
    ///
238
    /// The constructor of the class.
239
    ///
240
    /// \param graph The digraph the algorithm runs on.
241
    CycleCanceling(const GR& graph) :
242
      _graph(graph), _node_id(graph), _arc_idf(graph), _arc_idb(graph),
243
      _cost_map(_cost_vec), _pi_map(_pi),
244
      INF(std::numeric_limits<Value>::has_infinity ?
245
          std::numeric_limits<Value>::infinity() :
246
          std::numeric_limits<Value>::max())
247
    {
248
      // Check the number types
249
      LEMON_ASSERT(std::numeric_limits<Value>::is_signed,
250
        "The flow type of CycleCanceling must be signed");
251
      LEMON_ASSERT(std::numeric_limits<Cost>::is_signed,
252
        "The cost type of CycleCanceling must be signed");
253

	
254
      // Reset data structures
255
      reset();
256
    }
257

	
258
    /// \name Parameters
259
    /// The parameters of the algorithm can be specified using these
260
    /// functions.
261

	
262
    /// @{
263

	
264
    /// \brief Set the lower bounds on the arcs.
265
    ///
266
    /// This function sets the lower bounds on the arcs.
267
    /// If it is not used before calling \ref run(), the lower bounds
268
    /// will be set to zero on all arcs.
269
    ///
270
    /// \param map An arc map storing the lower bounds.
271
    /// Its \c Value type must be convertible to the \c Value type
272
    /// of the algorithm.
273
    ///
274
    /// \return <tt>(*this)</tt>
275
    template <typename LowerMap>
276
    CycleCanceling& lowerMap(const LowerMap& map) {
277
      _have_lower = true;
278
      for (ArcIt a(_graph); a != INVALID; ++a) {
279
        _lower[_arc_idf[a]] = map[a];
280
        _lower[_arc_idb[a]] = map[a];
281
      }
282
      return *this;
283
    }
284

	
285
    /// \brief Set the upper bounds (capacities) on the arcs.
286
    ///
287
    /// This function sets the upper bounds (capacities) on the arcs.
288
    /// If it is not used before calling \ref run(), the upper bounds
289
    /// will be set to \ref INF on all arcs (i.e. the flow value will be
290
    /// unbounded from above).
291
    ///
292
    /// \param map An arc map storing the upper bounds.
293
    /// Its \c Value type must be convertible to the \c Value type
294
    /// of the algorithm.
295
    ///
296
    /// \return <tt>(*this)</tt>
297
    template<typename UpperMap>
298
    CycleCanceling& upperMap(const UpperMap& map) {
299
      for (ArcIt a(_graph); a != INVALID; ++a) {
300
        _upper[_arc_idf[a]] = map[a];
301
      }
302
      return *this;
303
    }
304

	
305
    /// \brief Set the costs of the arcs.
306
    ///
307
    /// This function sets the costs of the arcs.
308
    /// If it is not used before calling \ref run(), the costs
309
    /// will be set to \c 1 on all arcs.
310
    ///
311
    /// \param map An arc map storing the costs.
312
    /// Its \c Value type must be convertible to the \c Cost type
313
    /// of the algorithm.
314
    ///
315
    /// \return <tt>(*this)</tt>
316
    template<typename CostMap>
317
    CycleCanceling& costMap(const CostMap& map) {
318
      for (ArcIt a(_graph); a != INVALID; ++a) {
319
        _cost[_arc_idf[a]] =  map[a];
320
        _cost[_arc_idb[a]] = -map[a];
321
      }
322
      return *this;
323
    }
324

	
325
    /// \brief Set the supply values of the nodes.
326
    ///
327
    /// This function sets the supply values of the nodes.
328
    /// If neither this function nor \ref stSupply() is used before
329
    /// calling \ref run(), the supply of each node will be set to zero.
330
    ///
331
    /// \param map A node map storing the supply values.
332
    /// Its \c Value type must be convertible to the \c Value type
333
    /// of the algorithm.
334
    ///
335
    /// \return <tt>(*this)</tt>
336
    template<typename SupplyMap>
337
    CycleCanceling& supplyMap(const SupplyMap& map) {
338
      for (NodeIt n(_graph); n != INVALID; ++n) {
339
        _supply[_node_id[n]] = map[n];
340
      }
341
      return *this;
342
    }
343

	
344
    /// \brief Set single source and target nodes and a supply value.
345
    ///
346
    /// This function sets a single source node and a single target node
347
    /// and the required flow value.
348
    /// If neither this function nor \ref supplyMap() is used before
349
    /// calling \ref run(), the supply of each node will be set to zero.
350
    ///
351
    /// Using this function has the same effect as using \ref supplyMap()
352
    /// with such a map in which \c k is assigned to \c s, \c -k is
353
    /// assigned to \c t and all other nodes have zero supply value.
354
    ///
355
    /// \param s The source node.
356
    /// \param t The target node.
357
    /// \param k The required amount of flow from node \c s to node \c t
358
    /// (i.e. the supply of \c s and the demand of \c t).
359
    ///
360
    /// \return <tt>(*this)</tt>
361
    CycleCanceling& stSupply(const Node& s, const Node& t, Value k) {
362
      for (int i = 0; i != _res_node_num; ++i) {
363
        _supply[i] = 0;
364
      }
365
      _supply[_node_id[s]] =  k;
366
      _supply[_node_id[t]] = -k;
367
      return *this;
368
    }
369

	
370
    /// @}
371

	
372
    /// \name Execution control
373
    /// The algorithm can be executed using \ref run().
374

	
375
    /// @{
376

	
377
    /// \brief Run the algorithm.
378
    ///
379
    /// This function runs the algorithm.
380
    /// The paramters can be specified using functions \ref lowerMap(),
381
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
382
    /// For example,
383
    /// \code
384
    ///   CycleCanceling<ListDigraph> cc(graph);
385
    ///   cc.lowerMap(lower).upperMap(upper).costMap(cost)
386
    ///     .supplyMap(sup).run();
387
    /// \endcode
388
    ///
389
    /// This function can be called more than once. All the given parameters
390
    /// are kept for the next call, unless \ref resetParams() or \ref reset()
391
    /// is used, thus only the modified parameters have to be set again.
392
    /// If the underlying digraph was also modified after the construction
393
    /// of the class (or the last \ref reset() call), then the \ref reset()
394
    /// function must be called.
395
    ///
396
    /// \param method The cycle-canceling method that will be used.
397
    /// For more information, see \ref Method.
398
    ///
399
    /// \return \c INFEASIBLE if no feasible flow exists,
400
    /// \n \c OPTIMAL if the problem has optimal solution
401
    /// (i.e. it is feasible and bounded), and the algorithm has found
402
    /// optimal flow and node potentials (primal and dual solutions),
403
    /// \n \c UNBOUNDED if the digraph contains an arc of negative cost
404
    /// and infinite upper bound. It means that the objective function
405
    /// is unbounded on that arc, however, note that it could actually be
406
    /// bounded over the feasible flows, but this algroithm cannot handle
407
    /// these cases.
408
    ///
409
    /// \see ProblemType, Method
410
    /// \see resetParams(), reset()
411
    ProblemType run(Method method = CANCEL_AND_TIGHTEN) {
412
      ProblemType pt = init();
413
      if (pt != OPTIMAL) return pt;
414
      start(method);
415
      return OPTIMAL;
416
    }
417

	
418
    /// \brief Reset all the parameters that have been given before.
419
    ///
420
    /// This function resets all the paramaters that have been given
421
    /// before using functions \ref lowerMap(), \ref upperMap(),
422
    /// \ref costMap(), \ref supplyMap(), \ref stSupply().
423
    ///
424
    /// It is useful for multiple \ref run() calls. Basically, all the given
425
    /// parameters are kept for the next \ref run() call, unless
426
    /// \ref resetParams() or \ref reset() is used.
427
    /// If the underlying digraph was also modified after the construction
428
    /// of the class or the last \ref reset() call, then the \ref reset()
429
    /// function must be used, otherwise \ref resetParams() is sufficient.
430
    ///
431
    /// For example,
432
    /// \code
433
    ///   CycleCanceling<ListDigraph> cs(graph);
434
    ///
435
    ///   // First run
436
    ///   cc.lowerMap(lower).upperMap(upper).costMap(cost)
437
    ///     .supplyMap(sup).run();
438
    ///
439
    ///   // Run again with modified cost map (resetParams() is not called,
440
    ///   // so only the cost map have to be set again)
441
    ///   cost[e] += 100;
442
    ///   cc.costMap(cost).run();
443
    ///
444
    ///   // Run again from scratch using resetParams()
445
    ///   // (the lower bounds will be set to zero on all arcs)
446
    ///   cc.resetParams();
447
    ///   cc.upperMap(capacity).costMap(cost)
448
    ///     .supplyMap(sup).run();
449
    /// \endcode
450
    ///
451
    /// \return <tt>(*this)</tt>
452
    ///
453
    /// \see reset(), run()
454
    CycleCanceling& resetParams() {
455
      for (int i = 0; i != _res_node_num; ++i) {
456
        _supply[i] = 0;
457
      }
458
      int limit = _first_out[_root];
459
      for (int j = 0; j != limit; ++j) {
460
        _lower[j] = 0;
461
        _upper[j] = INF;
462
        _cost[j] = _forward[j] ? 1 : -1;
463
      }
464
      for (int j = limit; j != _res_arc_num; ++j) {
465
        _lower[j] = 0;
466
        _upper[j] = INF;
467
        _cost[j] = 0;
468
        _cost[_reverse[j]] = 0;
469
      }
470
      _have_lower = false;
471
      return *this;
472
    }
473

	
474
    /// \brief Reset the internal data structures and all the parameters
475
    /// that have been given before.
476
    ///
477
    /// This function resets the internal data structures and all the
478
    /// paramaters that have been given before using functions \ref lowerMap(),
479
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
480
    ///
481
    /// It is useful for multiple \ref run() calls. Basically, all the given
482
    /// parameters are kept for the next \ref run() call, unless
483
    /// \ref resetParams() or \ref reset() is used.
484
    /// If the underlying digraph was also modified after the construction
485
    /// of the class or the last \ref reset() call, then the \ref reset()
486
    /// function must be used, otherwise \ref resetParams() is sufficient.
487
    ///
488
    /// See \ref resetParams() for examples.
489
    ///
490
    /// \return <tt>(*this)</tt>
491
    ///
492
    /// \see resetParams(), run()
493
    CycleCanceling& reset() {
494
      // Resize vectors
495
      _node_num = countNodes(_graph);
496
      _arc_num = countArcs(_graph);
497
      _res_node_num = _node_num + 1;
498
      _res_arc_num = 2 * (_arc_num + _node_num);
499
      _root = _node_num;
500

	
501
      _first_out.resize(_res_node_num + 1);
502
      _forward.resize(_res_arc_num);
503
      _source.resize(_res_arc_num);
504
      _target.resize(_res_arc_num);
505
      _reverse.resize(_res_arc_num);
506

	
507
      _lower.resize(_res_arc_num);
508
      _upper.resize(_res_arc_num);
509
      _cost.resize(_res_arc_num);
510
      _supply.resize(_res_node_num);
511

	
512
      _res_cap.resize(_res_arc_num);
513
      _pi.resize(_res_node_num);
514

	
515
      _arc_vec.reserve(_res_arc_num);
516
      _cost_vec.reserve(_res_arc_num);
517
      _id_vec.reserve(_res_arc_num);
518

	
519
      // Copy the graph
520
      int i = 0, j = 0, k = 2 * _arc_num + _node_num;
521
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
522
        _node_id[n] = i;
523
      }
524
      i = 0;
525
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
526
        _first_out[i] = j;
527
        for (OutArcIt a(_graph, n); a != INVALID; ++a, ++j) {
528
          _arc_idf[a] = j;
529
          _forward[j] = true;
530
          _source[j] = i;
531
          _target[j] = _node_id[_graph.runningNode(a)];
532
        }
533
        for (InArcIt a(_graph, n); a != INVALID; ++a, ++j) {
534
          _arc_idb[a] = j;
535
          _forward[j] = false;
536
          _source[j] = i;
537
          _target[j] = _node_id[_graph.runningNode(a)];
538
        }
539
        _forward[j] = false;
540
        _source[j] = i;
541
        _target[j] = _root;
542
        _reverse[j] = k;
543
        _forward[k] = true;
544
        _source[k] = _root;
545
        _target[k] = i;
546
        _reverse[k] = j;
547
        ++j; ++k;
548
      }
549
      _first_out[i] = j;
550
      _first_out[_res_node_num] = k;
551
      for (ArcIt a(_graph); a != INVALID; ++a) {
552
        int fi = _arc_idf[a];
553
        int bi = _arc_idb[a];
554
        _reverse[fi] = bi;
555
        _reverse[bi] = fi;
556
      }
557

	
558
      // Reset parameters
559
      resetParams();
560
      return *this;
561
    }
562

	
563
    /// @}
564

	
565
    /// \name Query Functions
566
    /// The results of the algorithm can be obtained using these
567
    /// functions.\n
568
    /// The \ref run() function must be called before using them.
569

	
570
    /// @{
571

	
572
    /// \brief Return the total cost of the found flow.
573
    ///
574
    /// This function returns the total cost of the found flow.
575
    /// Its complexity is O(e).
576
    ///
577
    /// \note The return type of the function can be specified as a
578
    /// template parameter. For example,
579
    /// \code
580
    ///   cc.totalCost<double>();
581
    /// \endcode
582
    /// It is useful if the total cost cannot be stored in the \c Cost
583
    /// type of the algorithm, which is the default return type of the
584
    /// function.
585
    ///
586
    /// \pre \ref run() must be called before using this function.
587
    template <typename Number>
588
    Number totalCost() const {
589
      Number c = 0;
590
      for (ArcIt a(_graph); a != INVALID; ++a) {
591
        int i = _arc_idb[a];
592
        c += static_cast<Number>(_res_cap[i]) *
593
             (-static_cast<Number>(_cost[i]));
594
      }
595
      return c;
596
    }
597

	
598
#ifndef DOXYGEN
599
    Cost totalCost() const {
600
      return totalCost<Cost>();
601
    }
602
#endif
603

	
604
    /// \brief Return the flow on the given arc.
605
    ///
606
    /// This function returns the flow on the given arc.
607
    ///
608
    /// \pre \ref run() must be called before using this function.
609
    Value flow(const Arc& a) const {
610
      return _res_cap[_arc_idb[a]];
611
    }
612

	
613
    /// \brief Return the flow map (the primal solution).
614
    ///
615
    /// This function copies the flow value on each arc into the given
616
    /// map. The \c Value type of the algorithm must be convertible to
617
    /// the \c Value type of the map.
618
    ///
619
    /// \pre \ref run() must be called before using this function.
620
    template <typename FlowMap>
621
    void flowMap(FlowMap &map) const {
622
      for (ArcIt a(_graph); a != INVALID; ++a) {
623
        map.set(a, _res_cap[_arc_idb[a]]);
624
      }
625
    }
626

	
627
    /// \brief Return the potential (dual value) of the given node.
628
    ///
629
    /// This function returns the potential (dual value) of the
630
    /// given node.
631
    ///
632
    /// \pre \ref run() must be called before using this function.
633
    Cost potential(const Node& n) const {
634
      return static_cast<Cost>(_pi[_node_id[n]]);
635
    }
636

	
637
    /// \brief Return the potential map (the dual solution).
638
    ///
639
    /// This function copies the potential (dual value) of each node
640
    /// into the given map.
641
    /// The \c Cost type of the algorithm must be convertible to the
642
    /// \c Value type of the map.
643
    ///
644
    /// \pre \ref run() must be called before using this function.
645
    template <typename PotentialMap>
646
    void potentialMap(PotentialMap &map) const {
647
      for (NodeIt n(_graph); n != INVALID; ++n) {
648
        map.set(n, static_cast<Cost>(_pi[_node_id[n]]));
649
      }
650
    }
651

	
652
    /// @}
653

	
654
  private:
655

	
656
    // Initialize the algorithm
657
    ProblemType init() {
658
      if (_res_node_num <= 1) return INFEASIBLE;
659

	
660
      // Check the sum of supply values
661
      _sum_supply = 0;
662
      for (int i = 0; i != _root; ++i) {
663
        _sum_supply += _supply[i];
664
      }
665
      if (_sum_supply > 0) return INFEASIBLE;
666

	
667

	
668
      // Initialize vectors
669
      for (int i = 0; i != _res_node_num; ++i) {
670
        _pi[i] = 0;
671
      }
672
      ValueVector excess(_supply);
673

	
674
      // Remove infinite upper bounds and check negative arcs
675
      const Value MAX = std::numeric_limits<Value>::max();
676
      int last_out;
677
      if (_have_lower) {
678
        for (int i = 0; i != _root; ++i) {
679
          last_out = _first_out[i+1];
680
          for (int j = _first_out[i]; j != last_out; ++j) {
681
            if (_forward[j]) {
682
              Value c = _cost[j] < 0 ? _upper[j] : _lower[j];
683
              if (c >= MAX) return UNBOUNDED;
684
              excess[i] -= c;
685
              excess[_target[j]] += c;
686
            }
687
          }
688
        }
689
      } else {
690
        for (int i = 0; i != _root; ++i) {
691
          last_out = _first_out[i+1];
692
          for (int j = _first_out[i]; j != last_out; ++j) {
693
            if (_forward[j] && _cost[j] < 0) {
694
              Value c = _upper[j];
695
              if (c >= MAX) return UNBOUNDED;
696
              excess[i] -= c;
697
              excess[_target[j]] += c;
698
            }
699
          }
700
        }
701
      }
702
      Value ex, max_cap = 0;
703
      for (int i = 0; i != _res_node_num; ++i) {
704
        ex = excess[i];
705
        if (ex < 0) max_cap -= ex;
706
      }
707
      for (int j = 0; j != _res_arc_num; ++j) {
708
        if (_upper[j] >= MAX) _upper[j] = max_cap;
709
      }
710

	
711
      // Initialize maps for Circulation and remove non-zero lower bounds
712
      ConstMap<Arc, Value> low(0);
713
      typedef typename Digraph::template ArcMap<Value> ValueArcMap;
714
      typedef typename Digraph::template NodeMap<Value> ValueNodeMap;
715
      ValueArcMap cap(_graph), flow(_graph);
716
      ValueNodeMap sup(_graph);
717
      for (NodeIt n(_graph); n != INVALID; ++n) {
718
        sup[n] = _supply[_node_id[n]];
719
      }
720
      if (_have_lower) {
721
        for (ArcIt a(_graph); a != INVALID; ++a) {
722
          int j = _arc_idf[a];
723
          Value c = _lower[j];
724
          cap[a] = _upper[j] - c;
725
          sup[_graph.source(a)] -= c;
726
          sup[_graph.target(a)] += c;
727
        }
728
      } else {
729
        for (ArcIt a(_graph); a != INVALID; ++a) {
730
          cap[a] = _upper[_arc_idf[a]];
731
        }
732
      }
733

	
734
      // Find a feasible flow using Circulation
735
      Circulation<Digraph, ConstMap<Arc, Value>, ValueArcMap, ValueNodeMap>
736
        circ(_graph, low, cap, sup);
737
      if (!circ.flowMap(flow).run()) return INFEASIBLE;
738

	
739
      // Set residual capacities and handle GEQ supply type
740
      if (_sum_supply < 0) {
741
        for (ArcIt a(_graph); a != INVALID; ++a) {
742
          Value fa = flow[a];
743
          _res_cap[_arc_idf[a]] = cap[a] - fa;
744
          _res_cap[_arc_idb[a]] = fa;
745
          sup[_graph.source(a)] -= fa;
746
          sup[_graph.target(a)] += fa;
747
        }
748
        for (NodeIt n(_graph); n != INVALID; ++n) {
749
          excess[_node_id[n]] = sup[n];
750
        }
751
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
752
          int u = _target[a];
753
          int ra = _reverse[a];
754
          _res_cap[a] = -_sum_supply + 1;
755
          _res_cap[ra] = -excess[u];
756
          _cost[a] = 0;
757
          _cost[ra] = 0;
758
        }
759
      } else {
760
        for (ArcIt a(_graph); a != INVALID; ++a) {
761
          Value fa = flow[a];
762
          _res_cap[_arc_idf[a]] = cap[a] - fa;
763
          _res_cap[_arc_idb[a]] = fa;
764
        }
765
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
766
          int ra = _reverse[a];
767
          _res_cap[a] = 1;
768
          _res_cap[ra] = 0;
769
          _cost[a] = 0;
770
          _cost[ra] = 0;
771
        }
772
      }
773

	
774
      return OPTIMAL;
775
    }
776

	
777
    // Build a StaticDigraph structure containing the current
778
    // residual network
779
    void buildResidualNetwork() {
780
      _arc_vec.clear();
781
      _cost_vec.clear();
782
      _id_vec.clear();
783
      for (int j = 0; j != _res_arc_num; ++j) {
784
        if (_res_cap[j] > 0) {
785
          _arc_vec.push_back(IntPair(_source[j], _target[j]));
786
          _cost_vec.push_back(_cost[j]);
787
          _id_vec.push_back(j);
788
        }
789
      }
790
      _sgr.build(_res_node_num, _arc_vec.begin(), _arc_vec.end());
791
    }
792

	
793
    // Execute the algorithm and transform the results
794
    void start(Method method) {
795
      // Execute the algorithm
796
      switch (method) {
797
        case SIMPLE_CYCLE_CANCELING:
798
          startSimpleCycleCanceling();
799
          break;
800
        case MINIMUM_MEAN_CYCLE_CANCELING:
801
          startMinMeanCycleCanceling();
802
          break;
803
        case CANCEL_AND_TIGHTEN:
804
          startCancelAndTighten();
805
          break;
806
      }
807

	
808
      // Compute node potentials
809
      if (method != SIMPLE_CYCLE_CANCELING) {
810
        buildResidualNetwork();
811
        typename BellmanFord<StaticDigraph, CostArcMap>
812
          ::template SetDistMap<CostNodeMap>::Create bf(_sgr, _cost_map);
813
        bf.distMap(_pi_map);
814
        bf.init(0);
815
        bf.start();
816
      }
817

	
818
      // Handle non-zero lower bounds
819
      if (_have_lower) {
820
        int limit = _first_out[_root];
821
        for (int j = 0; j != limit; ++j) {
822
          if (!_forward[j]) _res_cap[j] += _lower[j];
823
        }
824
      }
825
    }
826

	
827
    // Execute the "Simple Cycle Canceling" method
828
    void startSimpleCycleCanceling() {
829
      // Constants for computing the iteration limits
830
      const int BF_FIRST_LIMIT  = 2;
831
      const double BF_LIMIT_FACTOR = 1.5;
832

	
833
      typedef StaticVectorMap<StaticDigraph::Arc, Value> FilterMap;
834
      typedef FilterArcs<StaticDigraph, FilterMap> ResDigraph;
835
      typedef StaticVectorMap<StaticDigraph::Node, StaticDigraph::Arc> PredMap;
836
      typedef typename BellmanFord<ResDigraph, CostArcMap>
837
        ::template SetDistMap<CostNodeMap>
838
        ::template SetPredMap<PredMap>::Create BF;
839

	
840
      // Build the residual network
841
      _arc_vec.clear();
842
      _cost_vec.clear();
843
      for (int j = 0; j != _res_arc_num; ++j) {
844
        _arc_vec.push_back(IntPair(_source[j], _target[j]));
845
        _cost_vec.push_back(_cost[j]);
846
      }
847
      _sgr.build(_res_node_num, _arc_vec.begin(), _arc_vec.end());
848

	
849
      FilterMap filter_map(_res_cap);
850
      ResDigraph rgr(_sgr, filter_map);
851
      std::vector<int> cycle;
852
      std::vector<StaticDigraph::Arc> pred(_res_arc_num);
853
      PredMap pred_map(pred);
854
      BF bf(rgr, _cost_map);
855
      bf.distMap(_pi_map).predMap(pred_map);
856

	
857
      int length_bound = BF_FIRST_LIMIT;
858
      bool optimal = false;
859
      while (!optimal) {
860
        bf.init(0);
861
        int iter_num = 0;
862
        bool cycle_found = false;
863
        while (!cycle_found) {
864
          // Perform some iterations of the Bellman-Ford algorithm
865
          int curr_iter_num = iter_num + length_bound <= _node_num ?
866
            length_bound : _node_num - iter_num;
867
          iter_num += curr_iter_num;
868
          int real_iter_num = curr_iter_num;
869
          for (int i = 0; i < curr_iter_num; ++i) {
870
            if (bf.processNextWeakRound()) {
871
              real_iter_num = i;
872
              break;
873
            }
874
          }
875
          if (real_iter_num < curr_iter_num) {
876
            // Optimal flow is found
877
            optimal = true;
878
            break;
879
          } else {
880
            // Search for node disjoint negative cycles
881
            std::vector<int> state(_res_node_num, 0);
882
            int id = 0;
883
            for (int u = 0; u != _res_node_num; ++u) {
884
              if (state[u] != 0) continue;
885
              ++id;
886
              int v = u;
887
              for (; v != -1 && state[v] == 0; v = pred[v] == INVALID ?
888
                   -1 : rgr.id(rgr.source(pred[v]))) {
889
                state[v] = id;
890
              }
891
              if (v != -1 && state[v] == id) {
892
                // A negative cycle is found
893
                cycle_found = true;
894
                cycle.clear();
895
                StaticDigraph::Arc a = pred[v];
896
                Value d, delta = _res_cap[rgr.id(a)];
897
                cycle.push_back(rgr.id(a));
898
                while (rgr.id(rgr.source(a)) != v) {
899
                  a = pred_map[rgr.source(a)];
900
                  d = _res_cap[rgr.id(a)];
901
                  if (d < delta) delta = d;
902
                  cycle.push_back(rgr.id(a));
903
                }
904

	
905
                // Augment along the cycle
906
                for (int i = 0; i < int(cycle.size()); ++i) {
907
                  int j = cycle[i];
908
                  _res_cap[j] -= delta;
909
                  _res_cap[_reverse[j]] += delta;
910
                }
911
              }
912
            }
913
          }
914

	
915
          // Increase iteration limit if no cycle is found
916
          if (!cycle_found) {
917
            length_bound = static_cast<int>(length_bound * BF_LIMIT_FACTOR);
918
          }
919
        }
920
      }
921
    }
922

	
923
    // Execute the "Minimum Mean Cycle Canceling" method
924
    void startMinMeanCycleCanceling() {
925
      typedef SimplePath<StaticDigraph> SPath;
926
      typedef typename SPath::ArcIt SPathArcIt;
927
      typedef typename HowardMmc<StaticDigraph, CostArcMap>
928
        ::template SetPath<SPath>::Create MMC;
929

	
930
      SPath cycle;
931
      MMC mmc(_sgr, _cost_map);
932
      mmc.cycle(cycle);
933
      buildResidualNetwork();
934
      while (mmc.findCycleMean() && mmc.cycleCost() < 0) {
935
        // Find the cycle
936
        mmc.findCycle();
937

	
938
        // Compute delta value
939
        Value delta = INF;
940
        for (SPathArcIt a(cycle); a != INVALID; ++a) {
941
          Value d = _res_cap[_id_vec[_sgr.id(a)]];
942
          if (d < delta) delta = d;
943
        }
944

	
945
        // Augment along the cycle
946
        for (SPathArcIt a(cycle); a != INVALID; ++a) {
947
          int j = _id_vec[_sgr.id(a)];
948
          _res_cap[j] -= delta;
949
          _res_cap[_reverse[j]] += delta;
950
        }
951

	
952
        // Rebuild the residual network
953
        buildResidualNetwork();
954
      }
955
    }
956

	
957
    // Execute the "Cancel And Tighten" method
958
    void startCancelAndTighten() {
959
      // Constants for the min mean cycle computations
960
      const double LIMIT_FACTOR = 1.0;
961
      const int MIN_LIMIT = 5;
962

	
963
      // Contruct auxiliary data vectors
964
      DoubleVector pi(_res_node_num, 0.0);
965
      IntVector level(_res_node_num);
966
      BoolVector reached(_res_node_num);
967
      BoolVector processed(_res_node_num);
968
      IntVector pred_node(_res_node_num);
969
      IntVector pred_arc(_res_node_num);
970
      std::vector<int> stack(_res_node_num);
971
      std::vector<int> proc_vector(_res_node_num);
972

	
973
      // Initialize epsilon
974
      double epsilon = 0;
975
      for (int a = 0; a != _res_arc_num; ++a) {
976
        if (_res_cap[a] > 0 && -_cost[a] > epsilon)
977
          epsilon = -_cost[a];
978
      }
979

	
980
      // Start phases
981
      Tolerance<double> tol;
982
      tol.epsilon(1e-6);
983
      int limit = int(LIMIT_FACTOR * std::sqrt(double(_res_node_num)));
984
      if (limit < MIN_LIMIT) limit = MIN_LIMIT;
985
      int iter = limit;
986
      while (epsilon * _res_node_num >= 1) {
987
        // Find and cancel cycles in the admissible network using DFS
988
        for (int u = 0; u != _res_node_num; ++u) {
989
          reached[u] = false;
990
          processed[u] = false;
991
        }
992
        int stack_head = -1;
993
        int proc_head = -1;
994
        for (int start = 0; start != _res_node_num; ++start) {
995
          if (reached[start]) continue;
996

	
997
          // New start node
998
          reached[start] = true;
999
          pred_arc[start] = -1;
1000
          pred_node[start] = -1;
1001

	
1002
          // Find the first admissible outgoing arc
1003
          double p = pi[start];
1004
          int a = _first_out[start];
1005
          int last_out = _first_out[start+1];
1006
          for (; a != last_out && (_res_cap[a] == 0 ||
1007
               !tol.negative(_cost[a] + p - pi[_target[a]])); ++a) ;
1008
          if (a == last_out) {
1009
            processed[start] = true;
1010
            proc_vector[++proc_head] = start;
1011
            continue;
1012
          }
1013
          stack[++stack_head] = a;
1014

	
1015
          while (stack_head >= 0) {
1016
            int sa = stack[stack_head];
1017
            int u = _source[sa];
1018
            int v = _target[sa];
1019

	
1020
            if (!reached[v]) {
1021
              // A new node is reached
1022
              reached[v] = true;
1023
              pred_node[v] = u;
1024
              pred_arc[v] = sa;
1025
              p = pi[v];
1026
              a = _first_out[v];
1027
              last_out = _first_out[v+1];
1028
              for (; a != last_out && (_res_cap[a] == 0 ||
1029
                   !tol.negative(_cost[a] + p - pi[_target[a]])); ++a) ;
1030
              stack[++stack_head] = a == last_out ? -1 : a;
1031
            } else {
1032
              if (!processed[v]) {
1033
                // A cycle is found
1034
                int n, w = u;
1035
                Value d, delta = _res_cap[sa];
1036
                for (n = u; n != v; n = pred_node[n]) {
1037
                  d = _res_cap[pred_arc[n]];
1038
                  if (d <= delta) {
1039
                    delta = d;
1040
                    w = pred_node[n];
1041
                  }
1042
                }
1043

	
1044
                // Augment along the cycle
1045
                _res_cap[sa] -= delta;
1046
                _res_cap[_reverse[sa]] += delta;
1047
                for (n = u; n != v; n = pred_node[n]) {
1048
                  int pa = pred_arc[n];
1049
                  _res_cap[pa] -= delta;
1050
                  _res_cap[_reverse[pa]] += delta;
1051
                }
1052
                for (n = u; stack_head > 0 && n != w; n = pred_node[n]) {
1053
                  --stack_head;
1054
                  reached[n] = false;
1055
                }
1056
                u = w;
1057
              }
1058
              v = u;
1059

	
1060
              // Find the next admissible outgoing arc
1061
              p = pi[v];
1062
              a = stack[stack_head] + 1;
1063
              last_out = _first_out[v+1];
1064
              for (; a != last_out && (_res_cap[a] == 0 ||
1065
                   !tol.negative(_cost[a] + p - pi[_target[a]])); ++a) ;
1066
              stack[stack_head] = a == last_out ? -1 : a;
1067
            }
1068

	
1069
            while (stack_head >= 0 && stack[stack_head] == -1) {
1070
              processed[v] = true;
1071
              proc_vector[++proc_head] = v;
1072
              if (--stack_head >= 0) {
1073
                // Find the next admissible outgoing arc
1074
                v = _source[stack[stack_head]];
1075
                p = pi[v];
1076
                a = stack[stack_head] + 1;
1077
                last_out = _first_out[v+1];
1078
                for (; a != last_out && (_res_cap[a] == 0 ||
1079
                     !tol.negative(_cost[a] + p - pi[_target[a]])); ++a) ;
1080
                stack[stack_head] = a == last_out ? -1 : a;
1081
              }
1082
            }
1083
          }
1084
        }
1085

	
1086
        // Tighten potentials and epsilon
1087
        if (--iter > 0) {
1088
          for (int u = 0; u != _res_node_num; ++u) {
1089
            level[u] = 0;
1090
          }
1091
          for (int i = proc_head; i > 0; --i) {
1092
            int u = proc_vector[i];
1093
            double p = pi[u];
1094
            int l = level[u] + 1;
1095
            int last_out = _first_out[u+1];
1096
            for (int a = _first_out[u]; a != last_out; ++a) {
1097
              int v = _target[a];
1098
              if (_res_cap[a] > 0 && tol.negative(_cost[a] + p - pi[v]) &&
1099
                  l > level[v]) level[v] = l;
1100
            }
1101
          }
1102

	
1103
          // Modify potentials
1104
          double q = std::numeric_limits<double>::max();
1105
          for (int u = 0; u != _res_node_num; ++u) {
1106
            int lu = level[u];
1107
            double p, pu = pi[u];
1108
            int last_out = _first_out[u+1];
1109
            for (int a = _first_out[u]; a != last_out; ++a) {
1110
              if (_res_cap[a] == 0) continue;
1111
              int v = _target[a];
1112
              int ld = lu - level[v];
1113
              if (ld > 0) {
1114
                p = (_cost[a] + pu - pi[v] + epsilon) / (ld + 1);
1115
                if (p < q) q = p;
1116
              }
1117
            }
1118
          }
1119
          for (int u = 0; u != _res_node_num; ++u) {
1120
            pi[u] -= q * level[u];
1121
          }
1122

	
1123
          // Modify epsilon
1124
          epsilon = 0;
1125
          for (int u = 0; u != _res_node_num; ++u) {
1126
            double curr, pu = pi[u];
1127
            int last_out = _first_out[u+1];
1128
            for (int a = _first_out[u]; a != last_out; ++a) {
1129
              if (_res_cap[a] == 0) continue;
1130
              curr = _cost[a] + pu - pi[_target[a]];
1131
              if (-curr > epsilon) epsilon = -curr;
1132
            }
1133
          }
1134
        } else {
1135
          typedef HowardMmc<StaticDigraph, CostArcMap> MMC;
1136
          typedef typename BellmanFord<StaticDigraph, CostArcMap>
1137
            ::template SetDistMap<CostNodeMap>::Create BF;
1138

	
1139
          // Set epsilon to the minimum cycle mean
1140
          buildResidualNetwork();
1141
          MMC mmc(_sgr, _cost_map);
1142
          mmc.findCycleMean();
1143
          epsilon = -mmc.cycleMean();
1144
          Cost cycle_cost = mmc.cycleCost();
1145
          int cycle_size = mmc.cycleSize();
1146

	
1147
          // Compute feasible potentials for the current epsilon
1148
          for (int i = 0; i != int(_cost_vec.size()); ++i) {
1149
            _cost_vec[i] = cycle_size * _cost_vec[i] - cycle_cost;
1150
          }
1151
          BF bf(_sgr, _cost_map);
1152
          bf.distMap(_pi_map);
1153
          bf.init(0);
1154
          bf.start();
1155
          for (int u = 0; u != _res_node_num; ++u) {
1156
            pi[u] = static_cast<double>(_pi[u]) / cycle_size;
1157
          }
1158

	
1159
          iter = limit;
1160
        }
1161
      }
1162
    }
1163

	
1164
  }; //class CycleCanceling
1165

	
1166
  ///@}
1167

	
1168
} //namespace lemon
1169

	
1170
#endif //LEMON_CYCLE_CANCELING_H
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2009
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_DHEAP_H
20
#define LEMON_DHEAP_H
21

	
22
///\ingroup heaps
23
///\file
24
///\brief D-ary heap implementation.
25

	
26
#include <vector>
27
#include <utility>
28
#include <functional>
29

	
30
namespace lemon {
31

	
32
  /// \ingroup heaps
33
  ///
34
  ///\brief D-ary heap data structure.
35
  ///
36
  /// This class implements the \e D-ary \e heap data structure.
37
  /// It fully conforms to the \ref concepts::Heap "heap concept".
38
  ///
39
  /// The \ref DHeap "D-ary heap" is a generalization of the
40
  /// \ref BinHeap "binary heap" structure, its nodes have at most
41
  /// \c D children, instead of two.
42
  /// \ref BinHeap and \ref QuadHeap are specialized implementations
43
  /// of this structure for <tt>D=2</tt> and <tt>D=4</tt>, respectively.
44
  ///
45
  /// \tparam PR Type of the priorities of the items.
46
  /// \tparam IM A read-writable item map with \c int values, used
47
  /// internally to handle the cross references.
48
  /// \tparam D The degree of the heap, each node have at most \e D
49
  /// children. The default is 16. Powers of two are suggested to use
50
  /// so that the multiplications and divisions needed to traverse the
51
  /// nodes of the heap could be performed faster.
52
  /// \tparam CMP A functor class for comparing the priorities.
53
  /// The default is \c std::less<PR>.
54
  ///
55
  ///\sa BinHeap
56
  ///\sa FouraryHeap
57
#ifdef DOXYGEN
58
  template <typename PR, typename IM, int D, typename CMP>
59
#else
60
  template <typename PR, typename IM, int D = 16,
61
            typename CMP = std::less<PR> >
62
#endif
63
  class DHeap {
64
  public:
65
    /// Type of the item-int map.
66
    typedef IM ItemIntMap;
67
    /// Type of the priorities.
68
    typedef PR Prio;
69
    /// Type of the items stored in the heap.
70
    typedef typename ItemIntMap::Key Item;
71
    /// Type of the item-priority pairs.
72
    typedef std::pair<Item,Prio> Pair;
73
    /// Functor type for comparing the priorities.
74
    typedef CMP Compare;
75

	
76
    /// \brief Type to represent the states of the items.
77
    ///
78
    /// Each item has a state associated to it. It can be "in heap",
79
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
80
    /// heap's point of view, but may be useful to the user.
81
    ///
82
    /// The item-int map must be initialized in such way that it assigns
83
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
84
    enum State {
85
      IN_HEAP = 0,    ///< = 0.
86
      PRE_HEAP = -1,  ///< = -1.
87
      POST_HEAP = -2  ///< = -2.
88
    };
89

	
90
  private:
91
    std::vector<Pair> _data;
92
    Compare _comp;
93
    ItemIntMap &_iim;
94

	
95
  public:
96
    /// \brief Constructor.
97
    ///
98
    /// Constructor.
99
    /// \param map A map that assigns \c int values to the items.
100
    /// It is used internally to handle the cross references.
101
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
102
    explicit DHeap(ItemIntMap &map) : _iim(map) {}
103

	
104
    /// \brief Constructor.
105
    ///
106
    /// Constructor.
107
    /// \param map A map that assigns \c int values to the items.
108
    /// It is used internally to handle the cross references.
109
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
110
    /// \param comp The function object used for comparing the priorities.
111
    DHeap(ItemIntMap &map, const Compare &comp)
112
      : _iim(map), _comp(comp) {}
113

	
114
    /// \brief The number of items stored in the heap.
115
    ///
116
    /// This function returns the number of items stored in the heap.
117
    int size() const { return _data.size(); }
118

	
119
    /// \brief Check if the heap is empty.
120
    ///
121
    /// This function returns \c true if the heap is empty.
122
    bool empty() const { return _data.empty(); }
123

	
124
    /// \brief Make the heap empty.
125
    ///
126
    /// This functon makes the heap empty.
127
    /// It does not change the cross reference map. If you want to reuse
128
    /// a heap that is not surely empty, you should first clear it and
129
    /// then you should set the cross reference map to \c PRE_HEAP
130
    /// for each item.
131
    void clear() { _data.clear(); }
132

	
133
  private:
134
    int parent(int i) { return (i-1)/D; }
135
    int firstChild(int i) { return D*i+1; }
136

	
137
    bool less(const Pair &p1, const Pair &p2) const {
138
      return _comp(p1.second, p2.second);
139
    }
140

	
141
    void bubbleUp(int hole, Pair p) {
142
      int par = parent(hole);
143
      while( hole>0 && less(p,_data[par]) ) {
144
        move(_data[par],hole);
145
        hole = par;
146
        par = parent(hole);
147
      }
148
      move(p, hole);
149
    }
150

	
151
    void bubbleDown(int hole, Pair p, int length) {
152
      if( length>1 ) {
153
        int child = firstChild(hole);
154
        while( child+D<=length ) {
155
          int min=child;
156
          for (int i=1; i<D; ++i) {
157
            if( less(_data[child+i], _data[min]) )
158
              min=child+i;
159
          }
160
          if( !less(_data[min], p) )
161
            goto ok;
162
          move(_data[min], hole);
163
          hole = min;
164
          child = firstChild(hole);
165
        }
166
        if ( child<length ) {
167
          int min = child;
168
          while (++child < length) {
169
            if( less(_data[child], _data[min]) )
170
              min=child;
171
          }
172
          if( less(_data[min], p) ) {
173
            move(_data[min], hole);
174
            hole = min;
175
          }
176
        }
177
      }
178
    ok:
179
      move(p, hole);
180
    }
181

	
182
    void move(const Pair &p, int i) {
183
      _data[i] = p;
184
      _iim.set(p.first, i);
185
    }
186

	
187
  public:
188
    /// \brief Insert a pair of item and priority into the heap.
189
    ///
190
    /// This function inserts \c p.first to the heap with priority
191
    /// \c p.second.
192
    /// \param p The pair to insert.
193
    /// \pre \c p.first must not be stored in the heap.
194
    void push(const Pair &p) {
195
      int n = _data.size();
196
      _data.resize(n+1);
197
      bubbleUp(n, p);
198
    }
199

	
200
    /// \brief Insert an item into the heap with the given priority.
201
    ///
202
    /// This function inserts the given item into the heap with the
203
    /// given priority.
204
    /// \param i The item to insert.
205
    /// \param p The priority of the item.
206
    /// \pre \e i must not be stored in the heap.
207
    void push(const Item &i, const Prio &p) { push(Pair(i,p)); }
208

	
209
    /// \brief Return the item having minimum priority.
210
    ///
211
    /// This function returns the item having minimum priority.
212
    /// \pre The heap must be non-empty.
213
    Item top() const { return _data[0].first; }
214

	
215
    /// \brief The minimum priority.
216
    ///
217
    /// This function returns the minimum priority.
218
    /// \pre The heap must be non-empty.
219
    Prio prio() const { return _data[0].second; }
220

	
221
    /// \brief Remove the item having minimum priority.
222
    ///
223
    /// This function removes the item having minimum priority.
224
    /// \pre The heap must be non-empty.
225
    void pop() {
226
      int n = _data.size()-1;
227
      _iim.set(_data[0].first, POST_HEAP);
228
      if (n>0) bubbleDown(0, _data[n], n);
229
      _data.pop_back();
230
    }
231

	
232
    /// \brief Remove the given item from the heap.
233
    ///
234
    /// This function removes the given item from the heap if it is
235
    /// already stored.
236
    /// \param i The item to delete.
237
    /// \pre \e i must be in the heap.
238
    void erase(const Item &i) {
239
      int h = _iim[i];
240
      int n = _data.size()-1;
241
      _iim.set(_data[h].first, POST_HEAP);
242
      if( h<n ) {
243
        if( less(_data[parent(h)], _data[n]) )
244
          bubbleDown(h, _data[n], n);
245
        else
246
          bubbleUp(h, _data[n]);
247
      }
248
      _data.pop_back();
249
    }
250

	
251
    /// \brief The priority of the given item.
252
    ///
253
    /// This function returns the priority of the given item.
254
    /// \param i The item.
255
    /// \pre \e i must be in the heap.
256
    Prio operator[](const Item &i) const {
257
      int idx = _iim[i];
258
      return _data[idx].second;
259
    }
260

	
261
    /// \brief Set the priority of an item or insert it, if it is
262
    /// not stored in the heap.
263
    ///
264
    /// This method sets the priority of the given item if it is
265
    /// already stored in the heap. Otherwise it inserts the given
266
    /// item into the heap with the given priority.
267
    /// \param i The item.
268
    /// \param p The priority.
269
    void set(const Item &i, const Prio &p) {
270
      int idx = _iim[i];
271
      if( idx<0 )
272
        push(i,p);
273
      else if( _comp(p, _data[idx].second) )
274
        bubbleUp(idx, Pair(i,p));
275
      else
276
        bubbleDown(idx, Pair(i,p), _data.size());
277
    }
278

	
279
    /// \brief Decrease the priority of an item to the given value.
280
    ///
281
    /// This function decreases the priority of an item to the given value.
282
    /// \param i The item.
283
    /// \param p The priority.
284
    /// \pre \e i must be stored in the heap with priority at least \e p.
285
    void decrease(const Item &i, const Prio &p) {
286
      int idx = _iim[i];
287
      bubbleUp(idx, Pair(i,p));
288
    }
289

	
290
    /// \brief Increase the priority of an item to the given value.
291
    ///
292
    /// This function increases the priority of an item to the given value.
293
    /// \param i The item.
294
    /// \param p The priority.
295
    /// \pre \e i must be stored in the heap with priority at most \e p.
296
    void increase(const Item &i, const Prio &p) {
297
      int idx = _iim[i];
298
      bubbleDown(idx, Pair(i,p), _data.size());
299
    }
300

	
301
    /// \brief Return the state of an item.
302
    ///
303
    /// This method returns \c PRE_HEAP if the given item has never
304
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
305
    /// and \c POST_HEAP otherwise.
306
    /// In the latter case it is possible that the item will get back
307
    /// to the heap again.
308
    /// \param i The item.
309
    State state(const Item &i) const {
310
      int s = _iim[i];
311
      if (s>=0) s=0;
312
      return State(s);
313
    }
314

	
315
    /// \brief Set the state of an item in the heap.
316
    ///
317
    /// This function sets the state of the given item in the heap.
318
    /// It can be used to manually clear the heap when it is important
319
    /// to achive better time complexity.
320
    /// \param i The item.
321
    /// \param st The state. It should not be \c IN_HEAP.
322
    void state(const Item& i, State st) {
323
      switch (st) {
324
        case POST_HEAP:
325
        case PRE_HEAP:
326
          if (state(i) == IN_HEAP) erase(i);
327
          _iim[i] = st;
328
          break;
329
        case IN_HEAP:
330
          break;
331
      }
332
    }
333

	
334
    /// \brief Replace an item in the heap.
335
    ///
336
    /// This function replaces item \c i with item \c j.
337
    /// Item \c i must be in the heap, while \c j must be out of the heap.
338
    /// After calling this method, item \c i will be out of the
339
    /// heap and \c j will be in the heap with the same prioriority
340
    /// as item \c i had before.
341
    void replace(const Item& i, const Item& j) {
342
      int idx=_iim[i];
343
      _iim.set(i, _iim[j]);
344
      _iim.set(j, idx);
345
      _data[idx].first=j;
346
    }
347

	
348
  }; // class DHeap
349

	
350
} // namespace lemon
351

	
352
#endif // LEMON_DHEAP_H
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2010
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_FRACTIONAL_MATCHING_H
20
#define LEMON_FRACTIONAL_MATCHING_H
21

	
22
#include <vector>
23
#include <queue>
24
#include <set>
25
#include <limits>
26

	
27
#include <lemon/core.h>
28
#include <lemon/unionfind.h>
29
#include <lemon/bin_heap.h>
30
#include <lemon/maps.h>
31
#include <lemon/assert.h>
32
#include <lemon/elevator.h>
33

	
34
///\ingroup matching
35
///\file
36
///\brief Fractional matching algorithms in general graphs.
37

	
38
namespace lemon {
39

	
40
  /// \brief Default traits class of MaxFractionalMatching class.
41
  ///
42
  /// Default traits class of MaxFractionalMatching class.
43
  /// \tparam GR Graph type.
44
  template <typename GR>
45
  struct MaxFractionalMatchingDefaultTraits {
46

	
47
    /// \brief The type of the graph the algorithm runs on.
48
    typedef GR Graph;
49

	
50
    /// \brief The type of the map that stores the matching.
51
    ///
52
    /// The type of the map that stores the matching arcs.
53
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
54
    typedef typename Graph::template NodeMap<typename GR::Arc> MatchingMap;
55

	
56
    /// \brief Instantiates a MatchingMap.
57
    ///
58
    /// This function instantiates a \ref MatchingMap.
59
    /// \param graph The graph for which we would like to define
60
    /// the matching map.
61
    static MatchingMap* createMatchingMap(const Graph& graph) {
62
      return new MatchingMap(graph);
63
    }
64

	
65
    /// \brief The elevator type used by MaxFractionalMatching algorithm.
66
    ///
67
    /// The elevator type used by MaxFractionalMatching algorithm.
68
    ///
69
    /// \sa Elevator
70
    /// \sa LinkedElevator
71
    typedef LinkedElevator<Graph, typename Graph::Node> Elevator;
72

	
73
    /// \brief Instantiates an Elevator.
74
    ///
75
    /// This function instantiates an \ref Elevator.
76
    /// \param graph The graph for which we would like to define
77
    /// the elevator.
78
    /// \param max_level The maximum level of the elevator.
79
    static Elevator* createElevator(const Graph& graph, int max_level) {
80
      return new Elevator(graph, max_level);
81
    }
82
  };
83

	
84
  /// \ingroup matching
85
  ///
86
  /// \brief Max cardinality fractional matching
87
  ///
88
  /// This class provides an implementation of fractional matching
89
  /// algorithm based on push-relabel principle.
90
  ///
91
  /// The maximum cardinality fractional matching is a relaxation of the
92
  /// maximum cardinality matching problem where the odd set constraints
93
  /// are omitted.
94
  /// It can be formulated with the following linear program.
95
  /// \f[ \sum_{e \in \delta(u)}x_e \le 1 \quad \forall u\in V\f]
96
  /// \f[x_e \ge 0\quad \forall e\in E\f]
97
  /// \f[\max \sum_{e\in E}x_e\f]
98
  /// where \f$\delta(X)\f$ is the set of edges incident to a node in
99
  /// \f$X\f$. The result can be represented as the union of a
100
  /// matching with one value edges and a set of odd length cycles
101
  /// with half value edges.
102
  ///
103
  /// The algorithm calculates an optimal fractional matching and a
104
  /// barrier. The number of adjacents of any node set minus the size
105
  /// of node set is a lower bound on the uncovered nodes in the
106
  /// graph. For maximum matching a barrier is computed which
107
  /// maximizes this difference.
108
  ///
109
  /// The algorithm can be executed with the run() function.  After it
110
  /// the matching (the primal solution) and the barrier (the dual
111
  /// solution) can be obtained using the query functions.
112
  ///
113
  /// The primal solution is multiplied by
114
  /// \ref MaxFractionalMatching::primalScale "2".
115
  ///
116
  /// \tparam GR The undirected graph type the algorithm runs on.
117
#ifdef DOXYGEN
118
  template <typename GR, typename TR>
119
#else
120
  template <typename GR,
121
            typename TR = MaxFractionalMatchingDefaultTraits<GR> >
122
#endif
123
  class MaxFractionalMatching {
124
  public:
125

	
126
    /// \brief The \ref MaxFractionalMatchingDefaultTraits "traits
127
    /// class" of the algorithm.
128
    typedef TR Traits;
129
    /// The type of the graph the algorithm runs on.
130
    typedef typename TR::Graph Graph;
131
    /// The type of the matching map.
132
    typedef typename TR::MatchingMap MatchingMap;
133
    /// The type of the elevator.
134
    typedef typename TR::Elevator Elevator;
135

	
136
    /// \brief Scaling factor for primal solution
137
    ///
138
    /// Scaling factor for primal solution.
139
    static const int primalScale = 2;
140

	
141
  private:
142

	
143
    const Graph &_graph;
144
    int _node_num;
145
    bool _allow_loops;
146
    int _empty_level;
147

	
148
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
149

	
150
    bool _local_matching;
151
    MatchingMap *_matching;
152

	
153
    bool _local_level;
154
    Elevator *_level;
155

	
156
    typedef typename Graph::template NodeMap<int> InDegMap;
157
    InDegMap *_indeg;
158

	
159
    void createStructures() {
160
      _node_num = countNodes(_graph);
161

	
162
      if (!_matching) {
163
        _local_matching = true;
164
        _matching = Traits::createMatchingMap(_graph);
165
      }
166
      if (!_level) {
167
        _local_level = true;
168
        _level = Traits::createElevator(_graph, _node_num);
169
      }
170
      if (!_indeg) {
171
        _indeg = new InDegMap(_graph);
172
      }
173
    }
174

	
175
    void destroyStructures() {
176
      if (_local_matching) {
177
        delete _matching;
178
      }
179
      if (_local_level) {
180
        delete _level;
181
      }
182
      if (_indeg) {
183
        delete _indeg;
184
      }
185
    }
186

	
187
    void postprocessing() {
188
      for (NodeIt n(_graph); n != INVALID; ++n) {
189
        if ((*_indeg)[n] != 0) continue;
190
        _indeg->set(n, -1);
191
        Node u = n;
192
        while ((*_matching)[u] != INVALID) {
193
          Node v = _graph.target((*_matching)[u]);
194
          _indeg->set(v, -1);
195
          Arc a = _graph.oppositeArc((*_matching)[u]);
196
          u = _graph.target((*_matching)[v]);
197
          _indeg->set(u, -1);
198
          _matching->set(v, a);
199
        }
200
      }
201

	
202
      for (NodeIt n(_graph); n != INVALID; ++n) {
203
        if ((*_indeg)[n] != 1) continue;
204
        _indeg->set(n, -1);
205

	
206
        int num = 1;
207
        Node u = _graph.target((*_matching)[n]);
208
        while (u != n) {
209
          _indeg->set(u, -1);
210
          u = _graph.target((*_matching)[u]);
211
          ++num;
212
        }
213
        if (num % 2 == 0 && num > 2) {
214
          Arc prev = _graph.oppositeArc((*_matching)[n]);
215
          Node v = _graph.target((*_matching)[n]);
216
          u = _graph.target((*_matching)[v]);
217
          _matching->set(v, prev);
218
          while (u != n) {
219
            prev = _graph.oppositeArc((*_matching)[u]);
220
            v = _graph.target((*_matching)[u]);
221
            u = _graph.target((*_matching)[v]);
222
            _matching->set(v, prev);
223
          }
224
        }
225
      }
226
    }
227

	
228
  public:
229

	
230
    typedef MaxFractionalMatching Create;
231

	
232
    ///\name Named Template Parameters
233

	
234
    ///@{
235

	
236
    template <typename T>
237
    struct SetMatchingMapTraits : public Traits {
238
      typedef T MatchingMap;
239
      static MatchingMap *createMatchingMap(const Graph&) {
240
        LEMON_ASSERT(false, "MatchingMap is not initialized");
241
        return 0; // ignore warnings
242
      }
243
    };
244

	
245
    /// \brief \ref named-templ-param "Named parameter" for setting
246
    /// MatchingMap type
247
    ///
248
    /// \ref named-templ-param "Named parameter" for setting MatchingMap
249
    /// type.
250
    template <typename T>
251
    struct SetMatchingMap
252
      : public MaxFractionalMatching<Graph, SetMatchingMapTraits<T> > {
253
      typedef MaxFractionalMatching<Graph, SetMatchingMapTraits<T> > Create;
254
    };
255

	
256
    template <typename T>
257
    struct SetElevatorTraits : public Traits {
258
      typedef T Elevator;
259
      static Elevator *createElevator(const Graph&, int) {
260
        LEMON_ASSERT(false, "Elevator is not initialized");
261
        return 0; // ignore warnings
262
      }
263
    };
264

	
265
    /// \brief \ref named-templ-param "Named parameter" for setting
266
    /// Elevator type
267
    ///
268
    /// \ref named-templ-param "Named parameter" for setting Elevator
269
    /// type. If this named parameter is used, then an external
270
    /// elevator object must be passed to the algorithm using the
271
    /// \ref elevator(Elevator&) "elevator()" function before calling
272
    /// \ref run() or \ref init().
273
    /// \sa SetStandardElevator
274
    template <typename T>
275
    struct SetElevator
276
      : public MaxFractionalMatching<Graph, SetElevatorTraits<T> > {
277
      typedef MaxFractionalMatching<Graph, SetElevatorTraits<T> > Create;
278
    };
279

	
280
    template <typename T>
281
    struct SetStandardElevatorTraits : public Traits {
282
      typedef T Elevator;
283
      static Elevator *createElevator(const Graph& graph, int max_level) {
284
        return new Elevator(graph, max_level);
285
      }
286
    };
287

	
288
    /// \brief \ref named-templ-param "Named parameter" for setting
289
    /// Elevator type with automatic allocation
290
    ///
291
    /// \ref named-templ-param "Named parameter" for setting Elevator
292
    /// type with automatic allocation.
293
    /// The Elevator should have standard constructor interface to be
294
    /// able to automatically created by the algorithm (i.e. the
295
    /// graph and the maximum level should be passed to it).
296
    /// However an external elevator object could also be passed to the
297
    /// algorithm with the \ref elevator(Elevator&) "elevator()" function
298
    /// before calling \ref run() or \ref init().
299
    /// \sa SetElevator
300
    template <typename T>
301
    struct SetStandardElevator
302
      : public MaxFractionalMatching<Graph, SetStandardElevatorTraits<T> > {
303
      typedef MaxFractionalMatching<Graph,
304
                                    SetStandardElevatorTraits<T> > Create;
305
    };
306

	
307
    /// @}
308

	
309
  protected:
310

	
311
    MaxFractionalMatching() {}
312

	
313
  public:
314

	
315
    /// \brief Constructor
316
    ///
317
    /// Constructor.
318
    ///
319
    MaxFractionalMatching(const Graph &graph, bool allow_loops = true)
320
      : _graph(graph), _allow_loops(allow_loops),
321
        _local_matching(false), _matching(0),
322
        _local_level(false), _level(0),  _indeg(0)
323
    {}
324

	
325
    ~MaxFractionalMatching() {
326
      destroyStructures();
327
    }
328

	
329
    /// \brief Sets the matching map.
330
    ///
331
    /// Sets the matching map.
332
    /// If you don't use this function before calling \ref run() or
333
    /// \ref init(), an instance will be allocated automatically.
334
    /// The destructor deallocates this automatically allocated map,
335
    /// of course.
336
    /// \return <tt>(*this)</tt>
337
    MaxFractionalMatching& matchingMap(MatchingMap& map) {
338
      if (_local_matching) {
339
        delete _matching;
340
        _local_matching = false;
341
      }
342
      _matching = &map;
343
      return *this;
344
    }
345

	
346
    /// \brief Sets the elevator used by algorithm.
347
    ///
348
    /// Sets the elevator used by algorithm.
349
    /// If you don't use this function before calling \ref run() or
350
    /// \ref init(), an instance will be allocated automatically.
351
    /// The destructor deallocates this automatically allocated elevator,
352
    /// of course.
353
    /// \return <tt>(*this)</tt>
354
    MaxFractionalMatching& elevator(Elevator& elevator) {
355
      if (_local_level) {
356
        delete _level;
357
        _local_level = false;
358
      }
359
      _level = &elevator;
360
      return *this;
361
    }
362

	
363
    /// \brief Returns a const reference to the elevator.
364
    ///
365
    /// Returns a const reference to the elevator.
366
    ///
367
    /// \pre Either \ref run() or \ref init() must be called before
368
    /// using this function.
369
    const Elevator& elevator() const {
370
      return *_level;
371
    }
372

	
373
    /// \name Execution control
374
    /// The simplest way to execute the algorithm is to use one of the
375
    /// member functions called \c run(). \n
376
    /// If you need more control on the execution, first
377
    /// you must call \ref init() and then one variant of the start()
378
    /// member.
379

	
380
    /// @{
381

	
382
    /// \brief Initializes the internal data structures.
383
    ///
384
    /// Initializes the internal data structures and sets the initial
385
    /// matching.
386
    void init() {
387
      createStructures();
388

	
389
      _level->initStart();
390
      for (NodeIt n(_graph); n != INVALID; ++n) {
391
        _indeg->set(n, 0);
392
        _matching->set(n, INVALID);
393
        _level->initAddItem(n);
394
      }
395
      _level->initFinish();
396

	
397
      _empty_level = _node_num;
398
      for (NodeIt n(_graph); n != INVALID; ++n) {
399
        for (OutArcIt a(_graph, n); a != INVALID; ++a) {
400
          if (_graph.target(a) == n && !_allow_loops) continue;
401
          _matching->set(n, a);
402
          Node v = _graph.target((*_matching)[n]);
403
          _indeg->set(v, (*_indeg)[v] + 1);
404
          break;
405
        }
406
      }
407

	
408
      for (NodeIt n(_graph); n != INVALID; ++n) {
409
        if ((*_indeg)[n] == 0) {
410
          _level->activate(n);
411
        }
412
      }
413
    }
414

	
415
    /// \brief Starts the algorithm and computes a fractional matching
416
    ///
417
    /// The algorithm computes a maximum fractional matching.
418
    ///
419
    /// \param postprocess The algorithm computes first a matching
420
    /// which is a union of a matching with one value edges, cycles
421
    /// with half value edges and even length paths with half value
422
    /// edges. If the parameter is true, then after the push-relabel
423
    /// algorithm it postprocesses the matching to contain only
424
    /// matching edges and half value odd cycles.
425
    void start(bool postprocess = true) {
426
      Node n;
427
      while ((n = _level->highestActive()) != INVALID) {
428
        int level = _level->highestActiveLevel();
429
        int new_level = _level->maxLevel();
430
        for (InArcIt a(_graph, n); a != INVALID; ++a) {
431
          Node u = _graph.source(a);
432
          if (n == u && !_allow_loops) continue;
433
          Node v = _graph.target((*_matching)[u]);
434
          if ((*_level)[v] < level) {
435
            _indeg->set(v, (*_indeg)[v] - 1);
436
            if ((*_indeg)[v] == 0) {
437
              _level->activate(v);
438
            }
439
            _matching->set(u, a);
440
            _indeg->set(n, (*_indeg)[n] + 1);
441
            _level->deactivate(n);
442
            goto no_more_push;
443
          } else if (new_level > (*_level)[v]) {
444
            new_level = (*_level)[v];
445
          }
446
        }
447

	
448
        if (new_level + 1 < _level->maxLevel()) {
449
          _level->liftHighestActive(new_level + 1);
450
        } else {
451
          _level->liftHighestActiveToTop();
452
        }
453
        if (_level->emptyLevel(level)) {
454
          _level->liftToTop(level);
455
        }
456
      no_more_push:
457
        ;
458
      }
459
      for (NodeIt n(_graph); n != INVALID; ++n) {
460
        if ((*_matching)[n] == INVALID) continue;
461
        Node u = _graph.target((*_matching)[n]);
462
        if ((*_indeg)[u] > 1) {
463
          _indeg->set(u, (*_indeg)[u] - 1);
464
          _matching->set(n, INVALID);
465
        }
466
      }
467
      if (postprocess) {
468
        postprocessing();
469
      }
470
    }
471

	
472
    /// \brief Starts the algorithm and computes a perfect fractional
473
    /// matching
474
    ///
475
    /// The algorithm computes a perfect fractional matching. If it
476
    /// does not exists, then the algorithm returns false and the
477
    /// matching is undefined and the barrier.
478
    ///
479
    /// \param postprocess The algorithm computes first a matching
480
    /// which is a union of a matching with one value edges, cycles
481
    /// with half value edges and even length paths with half value
482
    /// edges. If the parameter is true, then after the push-relabel
483
    /// algorithm it postprocesses the matching to contain only
484
    /// matching edges and half value odd cycles.
485
    bool startPerfect(bool postprocess = true) {
486
      Node n;
487
      while ((n = _level->highestActive()) != INVALID) {
488
        int level = _level->highestActiveLevel();
489
        int new_level = _level->maxLevel();
490
        for (InArcIt a(_graph, n); a != INVALID; ++a) {
491
          Node u = _graph.source(a);
492
          if (n == u && !_allow_loops) continue;
493
          Node v = _graph.target((*_matching)[u]);
494
          if ((*_level)[v] < level) {
495
            _indeg->set(v, (*_indeg)[v] - 1);
496
            if ((*_indeg)[v] == 0) {
497
              _level->activate(v);
498
            }
499
            _matching->set(u, a);
500
            _indeg->set(n, (*_indeg)[n] + 1);
501
            _level->deactivate(n);
502
            goto no_more_push;
503
          } else if (new_level > (*_level)[v]) {
504
            new_level = (*_level)[v];
505
          }
506
        }
507

	
508
        if (new_level + 1 < _level->maxLevel()) {
509
          _level->liftHighestActive(new_level + 1);
510
        } else {
511
          _level->liftHighestActiveToTop();
512
          _empty_level = _level->maxLevel() - 1;
513
          return false;
514
        }
515
        if (_level->emptyLevel(level)) {
516
          _level->liftToTop(level);
517
          _empty_level = level;
518
          return false;
519
        }
520
      no_more_push:
521
        ;
522
      }
523
      if (postprocess) {
524
        postprocessing();
525
      }
526
      return true;
527
    }
528

	
529
    /// \brief Runs the algorithm
530
    ///
531
    /// Just a shortcut for the next code:
532
    ///\code
533
    /// init();
534
    /// start();
535
    ///\endcode
536
    void run(bool postprocess = true) {
537
      init();
538
      start(postprocess);
539
    }
540

	
541
    /// \brief Runs the algorithm to find a perfect fractional matching
542
    ///
543
    /// Just a shortcut for the next code:
544
    ///\code
545
    /// init();
546
    /// startPerfect();
547
    ///\endcode
548
    bool runPerfect(bool postprocess = true) {
549
      init();
550
      return startPerfect(postprocess);
551
    }
552

	
553
    ///@}
554

	
555
    /// \name Query Functions
556
    /// The result of the %Matching algorithm can be obtained using these
557
    /// functions.\n
558
    /// Before the use of these functions,
559
    /// either run() or start() must be called.
560
    ///@{
561

	
562

	
563
    /// \brief Return the number of covered nodes in the matching.
564
    ///
565
    /// This function returns the number of covered nodes in the matching.
566
    ///
567
    /// \pre Either run() or start() must be called before using this function.
568
    int matchingSize() const {
569
      int num = 0;
570
      for (NodeIt n(_graph); n != INVALID; ++n) {
571
        if ((*_matching)[n] != INVALID) {
572
          ++num;
573
        }
574
      }
575
      return num;
576
    }
577

	
578
    /// \brief Returns a const reference to the matching map.
579
    ///
580
    /// Returns a const reference to the node map storing the found
581
    /// fractional matching. This method can be called after
582
    /// running the algorithm.
583
    ///
584
    /// \pre Either \ref run() or \ref init() must be called before
585
    /// using this function.
586
    const MatchingMap& matchingMap() const {
587
      return *_matching;
588
    }
589

	
590
    /// \brief Return \c true if the given edge is in the matching.
591
    ///
592
    /// This function returns \c true if the given edge is in the
593
    /// found matching. The result is scaled by \ref primalScale
594
    /// "primal scale".
595
    ///
596
    /// \pre Either run() or start() must be called before using this function.
597
    int matching(const Edge& edge) const {
598
      return (edge == (*_matching)[_graph.u(edge)] ? 1 : 0) +
599
        (edge == (*_matching)[_graph.v(edge)] ? 1 : 0);
600
    }
601

	
602
    /// \brief Return the fractional matching arc (or edge) incident
603
    /// to the given node.
604
    ///
605
    /// This function returns one of the fractional matching arc (or
606
    /// edge) incident to the given node in the found matching or \c
607
    /// INVALID if the node is not covered by the matching or if the
608
    /// node is on an odd length cycle then it is the successor edge
609
    /// on the cycle.
610
    ///
611
    /// \pre Either run() or start() must be called before using this function.
612
    Arc matching(const Node& node) const {
613
      return (*_matching)[node];
614
    }
615

	
616
    /// \brief Returns true if the node is in the barrier
617
    ///
618
    /// The barrier is a subset of the nodes. If the nodes in the
619
    /// barrier have less adjacent nodes than the size of the barrier,
620
    /// then at least as much nodes cannot be covered as the
621
    /// difference of the two subsets.
622
    bool barrier(const Node& node) const {
623
      return (*_level)[node] >= _empty_level;
624
    }
625

	
626
    /// @}
627

	
628
  };
629

	
630
  /// \ingroup matching
631
  ///
632
  /// \brief Weighted fractional matching in general graphs
633
  ///
634
  /// This class provides an efficient implementation of fractional
635
  /// matching algorithm. The implementation uses priority queues and
636
  /// provides \f$O(nm\log n)\f$ time complexity.
637
  ///
638
  /// The maximum weighted fractional matching is a relaxation of the
639
  /// maximum weighted matching problem where the odd set constraints
640
  /// are omitted.
641
  /// It can be formulated with the following linear program.
642
  /// \f[ \sum_{e \in \delta(u)}x_e \le 1 \quad \forall u\in V\f]
643
  /// \f[x_e \ge 0\quad \forall e\in E\f]
644
  /// \f[\max \sum_{e\in E}x_ew_e\f]
645
  /// where \f$\delta(X)\f$ is the set of edges incident to a node in
646
  /// \f$X\f$. The result must be the union of a matching with one
647
  /// value edges and a set of odd length cycles with half value edges.
648
  ///
649
  /// The algorithm calculates an optimal fractional matching and a
650
  /// proof of the optimality. The solution of the dual problem can be
651
  /// used to check the result of the algorithm. The dual linear
652
  /// problem is the following.
653
  /// \f[ y_u + y_v \ge w_{uv} \quad \forall uv\in E\f]
654
  /// \f[y_u \ge 0 \quad \forall u \in V\f]
655
  /// \f[\min \sum_{u \in V}y_u \f]
656
  ///
657
  /// The algorithm can be executed with the run() function.
658
  /// After it the matching (the primal solution) and the dual solution
659
  /// can be obtained using the query functions.
660
  ///
661
  /// The primal solution is multiplied by
662
  /// \ref MaxWeightedFractionalMatching::primalScale "2".
663
  /// If the value type is integer, then the dual
664
  /// solution is scaled by
665
  /// \ref MaxWeightedFractionalMatching::dualScale "4".
666
  ///
667
  /// \tparam GR The undirected graph type the algorithm runs on.
668
  /// \tparam WM The type edge weight map. The default type is
669
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<int>".
670
#ifdef DOXYGEN
671
  template <typename GR, typename WM>
672
#else
673
  template <typename GR,
674
            typename WM = typename GR::template EdgeMap<int> >
675
#endif
676
  class MaxWeightedFractionalMatching {
677
  public:
678

	
679
    /// The graph type of the algorithm
680
    typedef GR Graph;
681
    /// The type of the edge weight map
682
    typedef WM WeightMap;
683
    /// The value type of the edge weights
684
    typedef typename WeightMap::Value Value;
685

	
686
    /// The type of the matching map
687
    typedef typename Graph::template NodeMap<typename Graph::Arc>
688
    MatchingMap;
689

	
690
    /// \brief Scaling factor for primal solution
691
    ///
692
    /// Scaling factor for primal solution.
693
    static const int primalScale = 2;
694

	
695
    /// \brief Scaling factor for dual solution
696
    ///
697
    /// Scaling factor for dual solution. It is equal to 4 or 1
698
    /// according to the value type.
699
    static const int dualScale =
700
      std::numeric_limits<Value>::is_integer ? 4 : 1;
701

	
702
  private:
703

	
704
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
705

	
706
    typedef typename Graph::template NodeMap<Value> NodePotential;
707

	
708
    const Graph& _graph;
709
    const WeightMap& _weight;
710

	
711
    MatchingMap* _matching;
712
    NodePotential* _node_potential;
713

	
714
    int _node_num;
715
    bool _allow_loops;
716

	
717
    enum Status {
718
      EVEN = -1, MATCHED = 0, ODD = 1
719
    };
720

	
721
    typedef typename Graph::template NodeMap<Status> StatusMap;
722
    StatusMap* _status;
723

	
724
    typedef typename Graph::template NodeMap<Arc> PredMap;
725
    PredMap* _pred;
726

	
727
    typedef ExtendFindEnum<IntNodeMap> TreeSet;
728

	
729
    IntNodeMap *_tree_set_index;
730
    TreeSet *_tree_set;
731

	
732
    IntNodeMap *_delta1_index;
733
    BinHeap<Value, IntNodeMap> *_delta1;
734

	
735
    IntNodeMap *_delta2_index;
736
    BinHeap<Value, IntNodeMap> *_delta2;
737

	
738
    IntEdgeMap *_delta3_index;
739
    BinHeap<Value, IntEdgeMap> *_delta3;
740

	
741
    Value _delta_sum;
742

	
743
    void createStructures() {
744
      _node_num = countNodes(_graph);
745

	
746
      if (!_matching) {
747
        _matching = new MatchingMap(_graph);
748
      }
749
      if (!_node_potential) {
750
        _node_potential = new NodePotential(_graph);
751
      }
752
      if (!_status) {
753
        _status = new StatusMap(_graph);
754
      }
755
      if (!_pred) {
756
        _pred = new PredMap(_graph);
757
      }
758
      if (!_tree_set) {
759
        _tree_set_index = new IntNodeMap(_graph);
760
        _tree_set = new TreeSet(*_tree_set_index);
761
      }
762
      if (!_delta1) {
763
        _delta1_index = new IntNodeMap(_graph);
764
        _delta1 = new BinHeap<Value, IntNodeMap>(*_delta1_index);
765
      }
766
      if (!_delta2) {
767
        _delta2_index = new IntNodeMap(_graph);
768
        _delta2 = new BinHeap<Value, IntNodeMap>(*_delta2_index);
769
      }
770
      if (!_delta3) {
771
        _delta3_index = new IntEdgeMap(_graph);
772
        _delta3 = new BinHeap<Value, IntEdgeMap>(*_delta3_index);
773
      }
774
    }
775

	
776
    void destroyStructures() {
777
      if (_matching) {
778
        delete _matching;
779
      }
780
      if (_node_potential) {
781
        delete _node_potential;
782
      }
783
      if (_status) {
784
        delete _status;
785
      }
786
      if (_pred) {
787
        delete _pred;
788
      }
789
      if (_tree_set) {
790
        delete _tree_set_index;
791
        delete _tree_set;
792
      }
793
      if (_delta1) {
794
        delete _delta1_index;
795
        delete _delta1;
796
      }
797
      if (_delta2) {
798
        delete _delta2_index;
799
        delete _delta2;
800
      }
801
      if (_delta3) {
802
        delete _delta3_index;
803
        delete _delta3;
804
      }
805
    }
806

	
807
    void matchedToEven(Node node, int tree) {
808
      _tree_set->insert(node, tree);
809
      _node_potential->set(node, (*_node_potential)[node] + _delta_sum);
810
      _delta1->push(node, (*_node_potential)[node]);
811

	
812
      if (_delta2->state(node) == _delta2->IN_HEAP) {
813
        _delta2->erase(node);
814
      }
815

	
816
      for (InArcIt a(_graph, node); a != INVALID; ++a) {
817
        Node v = _graph.source(a);
818
        Value rw = (*_node_potential)[node] + (*_node_potential)[v] -
819
          dualScale * _weight[a];
820
        if (node == v) {
821
          if (_allow_loops && _graph.direction(a)) {
822
            _delta3->push(a, rw / 2);
823
          }
824
        } else if ((*_status)[v] == EVEN) {
825
          _delta3->push(a, rw / 2);
826
        } else if ((*_status)[v] == MATCHED) {
827
          if (_delta2->state(v) != _delta2->IN_HEAP) {
828
            _pred->set(v, a);
829
            _delta2->push(v, rw);
830
          } else if ((*_delta2)[v] > rw) {
831
            _pred->set(v, a);
832
            _delta2->decrease(v, rw);
833
          }
834
        }
835
      }
836
    }
837

	
838
    void matchedToOdd(Node node, int tree) {
839
      _tree_set->insert(node, tree);
840
      _node_potential->set(node, (*_node_potential)[node] - _delta_sum);
841

	
842
      if (_delta2->state(node) == _delta2->IN_HEAP) {
843
        _delta2->erase(node);
844
      }
845
    }
846

	
847
    void evenToMatched(Node node, int tree) {
848
      _delta1->erase(node);
849
      _node_potential->set(node, (*_node_potential)[node] - _delta_sum);
850
      Arc min = INVALID;
851
      Value minrw = std::numeric_limits<Value>::max();
852
      for (InArcIt a(_graph, node); a != INVALID; ++a) {
853
        Node v = _graph.source(a);
854
        Value rw = (*_node_potential)[node] + (*_node_potential)[v] -
855
          dualScale * _weight[a];
856

	
857
        if (node == v) {
858
          if (_allow_loops && _graph.direction(a)) {
859
            _delta3->erase(a);
860
          }
861
        } else if ((*_status)[v] == EVEN) {
862
          _delta3->erase(a);
863
          if (minrw > rw) {
864
            min = _graph.oppositeArc(a);
865
            minrw = rw;
866
          }
867
        } else if ((*_status)[v]  == MATCHED) {
868
          if ((*_pred)[v] == a) {
869
            Arc mina = INVALID;
870
            Value minrwa = std::numeric_limits<Value>::max();
871
            for (OutArcIt aa(_graph, v); aa != INVALID; ++aa) {
872
              Node va = _graph.target(aa);
873
              if ((*_status)[va] != EVEN ||
874
                  _tree_set->find(va) == tree) continue;
875
              Value rwa = (*_node_potential)[v] + (*_node_potential)[va] -
876
                dualScale * _weight[aa];
877
              if (minrwa > rwa) {
878
                minrwa = rwa;
879
                mina = aa;
880
              }
881
            }
882
            if (mina != INVALID) {
883
              _pred->set(v, mina);
884
              _delta2->increase(v, minrwa);
885
            } else {
886
              _pred->set(v, INVALID);
887
              _delta2->erase(v);
888
            }
889
          }
890
        }
891
      }
892
      if (min != INVALID) {
893
        _pred->set(node, min);
894
        _delta2->push(node, minrw);
895
      } else {
896
        _pred->set(node, INVALID);
897
      }
898
    }
899

	
900
    void oddToMatched(Node node) {
901
      _node_potential->set(node, (*_node_potential)[node] + _delta_sum);
902
      Arc min = INVALID;
903
      Value minrw = std::numeric_limits<Value>::max();
904
      for (InArcIt a(_graph, node); a != INVALID; ++a) {
905
        Node v = _graph.source(a);
906
        if ((*_status)[v] != EVEN) continue;
907
        Value rw = (*_node_potential)[node] + (*_node_potential)[v] -
908
          dualScale * _weight[a];
909

	
910
        if (minrw > rw) {
911
          min = _graph.oppositeArc(a);
912
          minrw = rw;
913
        }
914
      }
915
      if (min != INVALID) {
916
        _pred->set(node, min);
917
        _delta2->push(node, minrw);
918
      } else {
919
        _pred->set(node, INVALID);
920
      }
921
    }
922

	
923
    void alternatePath(Node even, int tree) {
924
      Node odd;
925

	
926
      _status->set(even, MATCHED);
927
      evenToMatched(even, tree);
928

	
929
      Arc prev = (*_matching)[even];
930
      while (prev != INVALID) {
931
        odd = _graph.target(prev);
932
        even = _graph.target((*_pred)[odd]);
933
        _matching->set(odd, (*_pred)[odd]);
934
        _status->set(odd, MATCHED);
935
        oddToMatched(odd);
936

	
937
        prev = (*_matching)[even];
938
        _status->set(even, MATCHED);
939
        _matching->set(even, _graph.oppositeArc((*_matching)[odd]));
940
        evenToMatched(even, tree);
941
      }
942
    }
943

	
944
    void destroyTree(int tree) {
945
      for (typename TreeSet::ItemIt n(*_tree_set, tree); n != INVALID; ++n) {
946
        if ((*_status)[n] == EVEN) {
947
          _status->set(n, MATCHED);
948
          evenToMatched(n, tree);
949
        } else if ((*_status)[n] == ODD) {
950
          _status->set(n, MATCHED);
951
          oddToMatched(n);
952
        }
953
      }
954
      _tree_set->eraseClass(tree);
955
    }
956

	
957

	
958
    void unmatchNode(const Node& node) {
959
      int tree = _tree_set->find(node);
960

	
961
      alternatePath(node, tree);
962
      destroyTree(tree);
963

	
964
      _matching->set(node, INVALID);
965
    }
966

	
967

	
968
    void augmentOnEdge(const Edge& edge) {
969
      Node left = _graph.u(edge);
970
      int left_tree = _tree_set->find(left);
971

	
972
      alternatePath(left, left_tree);
973
      destroyTree(left_tree);
974
      _matching->set(left, _graph.direct(edge, true));
975

	
976
      Node right = _graph.v(edge);
977
      int right_tree = _tree_set->find(right);
978

	
979
      alternatePath(right, right_tree);
980
      destroyTree(right_tree);
981
      _matching->set(right, _graph.direct(edge, false));
982
    }
983

	
984
    void augmentOnArc(const Arc& arc) {
985
      Node left = _graph.source(arc);
986
      _status->set(left, MATCHED);
987
      _matching->set(left, arc);
988
      _pred->set(left, arc);
989

	
990
      Node right = _graph.target(arc);
991
      int right_tree = _tree_set->find(right);
992

	
993
      alternatePath(right, right_tree);
994
      destroyTree(right_tree);
995
      _matching->set(right, _graph.oppositeArc(arc));
996
    }
997

	
998
    void extendOnArc(const Arc& arc) {
999
      Node base = _graph.target(arc);
1000
      int tree = _tree_set->find(base);
1001

	
1002
      Node odd = _graph.source(arc);
1003
      _tree_set->insert(odd, tree);
1004
      _status->set(odd, ODD);
1005
      matchedToOdd(odd, tree);
1006
      _pred->set(odd, arc);
1007

	
1008
      Node even = _graph.target((*_matching)[odd]);
1009
      _tree_set->insert(even, tree);
1010
      _status->set(even, EVEN);
1011
      matchedToEven(even, tree);
1012
    }
1013

	
1014
    void cycleOnEdge(const Edge& edge, int tree) {
1015
      Node nca = INVALID;
1016
      std::vector<Node> left_path, right_path;
1017

	
1018
      {
1019
        std::set<Node> left_set, right_set;
1020
        Node left = _graph.u(edge);
1021
        left_path.push_back(left);
1022
        left_set.insert(left);
1023

	
1024
        Node right = _graph.v(edge);
1025
        right_path.push_back(right);
1026
        right_set.insert(right);
1027

	
1028
        while (true) {
1029

	
1030
          if (left_set.find(right) != left_set.end()) {
1031
            nca = right;
1032
            break;
1033
          }
1034

	
1035
          if ((*_matching)[left] == INVALID) break;
1036

	
1037
          left = _graph.target((*_matching)[left]);
1038
          left_path.push_back(left);
1039
          left = _graph.target((*_pred)[left]);
1040
          left_path.push_back(left);
1041

	
1042
          left_set.insert(left);
1043

	
1044
          if (right_set.find(left) != right_set.end()) {
1045
            nca = left;
1046
            break;
1047
          }
1048

	
1049
          if ((*_matching)[right] == INVALID) break;
1050

	
1051
          right = _graph.target((*_matching)[right]);
1052
          right_path.push_back(right);
1053
          right = _graph.target((*_pred)[right]);
1054
          right_path.push_back(right);
1055

	
1056
          right_set.insert(right);
1057

	
1058
        }
1059

	
1060
        if (nca == INVALID) {
1061
          if ((*_matching)[left] == INVALID) {
1062
            nca = right;
1063
            while (left_set.find(nca) == left_set.end()) {
1064
              nca = _graph.target((*_matching)[nca]);
1065
              right_path.push_back(nca);
1066
              nca = _graph.target((*_pred)[nca]);
1067
              right_path.push_back(nca);
1068
            }
1069
          } else {
1070
            nca = left;
1071
            while (right_set.find(nca) == right_set.end()) {
1072
              nca = _graph.target((*_matching)[nca]);
1073
              left_path.push_back(nca);
1074
              nca = _graph.target((*_pred)[nca]);
1075
              left_path.push_back(nca);
1076
            }
1077
          }
1078
        }
1079
      }
1080

	
1081
      alternatePath(nca, tree);
1082
      Arc prev;
1083

	
1084
      prev = _graph.direct(edge, true);
1085
      for (int i = 0; left_path[i] != nca; i += 2) {
1086
        _matching->set(left_path[i], prev);
1087
        _status->set(left_path[i], MATCHED);
1088
        evenToMatched(left_path[i], tree);
1089

	
1090
        prev = _graph.oppositeArc((*_pred)[left_path[i + 1]]);
1091
        _status->set(left_path[i + 1], MATCHED);
1092
        oddToMatched(left_path[i + 1]);
1093
      }
1094
      _matching->set(nca, prev);
1095

	
1096
      for (int i = 0; right_path[i] != nca; i += 2) {
1097
        _status->set(right_path[i], MATCHED);
1098
        evenToMatched(right_path[i], tree);
1099

	
1100
        _matching->set(right_path[i + 1], (*_pred)[right_path[i + 1]]);
1101
        _status->set(right_path[i + 1], MATCHED);
1102
        oddToMatched(right_path[i + 1]);
1103
      }
1104

	
1105
      destroyTree(tree);
1106
    }
1107

	
1108
    void extractCycle(const Arc &arc) {
1109
      Node left = _graph.source(arc);
1110
      Node odd = _graph.target((*_matching)[left]);
1111
      Arc prev;
1112
      while (odd != left) {
1113
        Node even = _graph.target((*_matching)[odd]);
1114
        prev = (*_matching)[odd];
1115
        odd = _graph.target((*_matching)[even]);
1116
        _matching->set(even, _graph.oppositeArc(prev));
1117
      }
1118
      _matching->set(left, arc);
1119

	
1120
      Node right = _graph.target(arc);
1121
      int right_tree = _tree_set->find(right);
1122
      alternatePath(right, right_tree);
1123
      destroyTree(right_tree);
1124
      _matching->set(right, _graph.oppositeArc(arc));
1125
    }
1126

	
1127
  public:
1128

	
1129
    /// \brief Constructor
1130
    ///
1131
    /// Constructor.
1132
    MaxWeightedFractionalMatching(const Graph& graph, const WeightMap& weight,
1133
                                  bool allow_loops = true)
1134
      : _graph(graph), _weight(weight), _matching(0),
1135
      _node_potential(0), _node_num(0), _allow_loops(allow_loops),
1136
      _status(0),  _pred(0),
1137
      _tree_set_index(0), _tree_set(0),
1138

	
1139
      _delta1_index(0), _delta1(0),
1140
      _delta2_index(0), _delta2(0),
1141
      _delta3_index(0), _delta3(0),
1142

	
1143
      _delta_sum() {}
1144

	
1145
    ~MaxWeightedFractionalMatching() {
1146
      destroyStructures();
1147
    }
1148

	
1149
    /// \name Execution Control
1150
    /// The simplest way to execute the algorithm is to use the
1151
    /// \ref run() member function.
1152

	
1153
    ///@{
1154

	
1155
    /// \brief Initialize the algorithm
1156
    ///
1157
    /// This function initializes the algorithm.
1158
    void init() {
1159
      createStructures();
1160

	
1161
      for (NodeIt n(_graph); n != INVALID; ++n) {
1162
        (*_delta1_index)[n] = _delta1->PRE_HEAP;
1163
        (*_delta2_index)[n] = _delta2->PRE_HEAP;
1164
      }
1165
      for (EdgeIt e(_graph); e != INVALID; ++e) {
1166
        (*_delta3_index)[e] = _delta3->PRE_HEAP;
1167
      }
1168

	
1169
      _delta1->clear();
1170
      _delta2->clear();
1171
      _delta3->clear();
1172
      _tree_set->clear();
1173

	
1174
      for (NodeIt n(_graph); n != INVALID; ++n) {
1175
        Value max = 0;
1176
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
1177
          if (_graph.target(e) == n && !_allow_loops) continue;
1178
          if ((dualScale * _weight[e]) / 2 > max) {
1179
            max = (dualScale * _weight[e]) / 2;
1180
          }
1181
        }
1182
        _node_potential->set(n, max);
1183
        _delta1->push(n, max);
1184

	
1185
        _tree_set->insert(n);
1186

	
1187
        _matching->set(n, INVALID);
1188
        _status->set(n, EVEN);
1189
      }
1190

	
1191
      for (EdgeIt e(_graph); e != INVALID; ++e) {
1192
        Node left = _graph.u(e);
1193
        Node right = _graph.v(e);
1194
        if (left == right && !_allow_loops) continue;
1195
        _delta3->push(e, ((*_node_potential)[left] +
1196
                          (*_node_potential)[right] -
1197
                          dualScale * _weight[e]) / 2);
1198
      }
1199
    }
1200

	
1201
    /// \brief Start the algorithm
1202
    ///
1203
    /// This function starts the algorithm.
1204
    ///
1205
    /// \pre \ref init() must be called before using this function.
1206
    void start() {
1207
      enum OpType {
1208
        D1, D2, D3
1209
      };
1210

	
1211
      int unmatched = _node_num;
1212
      while (unmatched > 0) {
1213
        Value d1 = !_delta1->empty() ?
1214
          _delta1->prio() : std::numeric_limits<Value>::max();
1215

	
1216
        Value d2 = !_delta2->empty() ?
1217
          _delta2->prio() : std::numeric_limits<Value>::max();
1218

	
1219
        Value d3 = !_delta3->empty() ?
1220
          _delta3->prio() : std::numeric_limits<Value>::max();
1221

	
1222
        _delta_sum = d3; OpType ot = D3;
1223
        if (d1 < _delta_sum) { _delta_sum = d1; ot = D1; }
1224
        if (d2 < _delta_sum) { _delta_sum = d2; ot = D2; }
1225

	
1226
        switch (ot) {
1227
        case D1:
1228
          {
1229
            Node n = _delta1->top();
1230
            unmatchNode(n);
1231
            --unmatched;
1232
          }
1233
          break;
1234
        case D2:
1235
          {
1236
            Node n = _delta2->top();
1237
            Arc a = (*_pred)[n];
1238
            if ((*_matching)[n] == INVALID) {
1239
              augmentOnArc(a);
1240
              --unmatched;
1241
            } else {
1242
              Node v = _graph.target((*_matching)[n]);
1243
              if ((*_matching)[n] !=
1244
                  _graph.oppositeArc((*_matching)[v])) {
1245
                extractCycle(a);
1246
                --unmatched;
1247
              } else {
1248
                extendOnArc(a);
1249
              }
1250
            }
1251
          } break;
1252
        case D3:
1253
          {
1254
            Edge e = _delta3->top();
1255

	
1256
            Node left = _graph.u(e);
1257
            Node right = _graph.v(e);
1258

	
1259
            int left_tree = _tree_set->find(left);
1260
            int right_tree = _tree_set->find(right);
1261

	
1262
            if (left_tree == right_tree) {
1263
              cycleOnEdge(e, left_tree);
1264
              --unmatched;
1265
            } else {
1266
              augmentOnEdge(e);
1267
              unmatched -= 2;
1268
            }
1269
          } break;
1270
        }
1271
      }
1272
    }
1273

	
1274
    /// \brief Run the algorithm.
1275
    ///
1276
    /// This method runs the \c %MaxWeightedFractionalMatching algorithm.
1277
    ///
1278
    /// \note mwfm.run() is just a shortcut of the following code.
1279
    /// \code
1280
    ///   mwfm.init();
1281
    ///   mwfm.start();
1282
    /// \endcode
1283
    void run() {
1284
      init();
1285
      start();
1286
    }
1287

	
1288
    /// @}
1289

	
1290
    /// \name Primal Solution
1291
    /// Functions to get the primal solution, i.e. the maximum weighted
1292
    /// matching.\n
1293
    /// Either \ref run() or \ref start() function should be called before
1294
    /// using them.
1295

	
1296
    /// @{
1297

	
1298
    /// \brief Return the weight of the matching.
1299
    ///
1300
    /// This function returns the weight of the found matching. This
1301
    /// value is scaled by \ref primalScale "primal scale".
1302
    ///
1303
    /// \pre Either run() or start() must be called before using this function.
1304
    Value matchingWeight() const {
1305
      Value sum = 0;
1306
      for (NodeIt n(_graph); n != INVALID; ++n) {
1307
        if ((*_matching)[n] != INVALID) {
1308
          sum += _weight[(*_matching)[n]];
1309
        }
1310
      }
1311
      return sum * primalScale / 2;
1312
    }
1313

	
1314
    /// \brief Return the number of covered nodes in the matching.
1315
    ///
1316
    /// This function returns the number of covered nodes in the matching.
1317
    ///
1318
    /// \pre Either run() or start() must be called before using this function.
1319
    int matchingSize() const {
1320
      int num = 0;
1321
      for (NodeIt n(_graph); n != INVALID; ++n) {
1322
        if ((*_matching)[n] != INVALID) {
1323
          ++num;
1324
        }
1325
      }
1326
      return num;
1327
    }
1328

	
1329
    /// \brief Return \c true if the given edge is in the matching.
1330
    ///
1331
    /// This function returns \c true if the given edge is in the
1332
    /// found matching. The result is scaled by \ref primalScale
1333
    /// "primal scale".
1334
    ///
1335
    /// \pre Either run() or start() must be called before using this function.
1336
    int matching(const Edge& edge) const {
1337
      return (edge == (*_matching)[_graph.u(edge)] ? 1 : 0)
1338
        + (edge == (*_matching)[_graph.v(edge)] ? 1 : 0);
1339
    }
1340

	
1341
    /// \brief Return the fractional matching arc (or edge) incident
1342
    /// to the given node.
1343
    ///
1344
    /// This function returns one of the fractional matching arc (or
1345
    /// edge) incident to the given node in the found matching or \c
1346
    /// INVALID if the node is not covered by the matching or if the
1347
    /// node is on an odd length cycle then it is the successor edge
1348
    /// on the cycle.
1349
    ///
1350
    /// \pre Either run() or start() must be called before using this function.
1351
    Arc matching(const Node& node) const {
1352
      return (*_matching)[node];
1353
    }
1354

	
1355
    /// \brief Return a const reference to the matching map.
1356
    ///
1357
    /// This function returns a const reference to a node map that stores
1358
    /// the matching arc (or edge) incident to each node.
1359
    const MatchingMap& matchingMap() const {
1360
      return *_matching;
1361
    }
1362

	
1363
    /// @}
1364

	
1365
    /// \name Dual Solution
1366
    /// Functions to get the dual solution.\n
1367
    /// Either \ref run() or \ref start() function should be called before
1368
    /// using them.
1369

	
1370
    /// @{
1371

	
1372
    /// \brief Return the value of the dual solution.
1373
    ///
1374
    /// This function returns the value of the dual solution.
1375
    /// It should be equal to the primal value scaled by \ref dualScale
1376
    /// "dual scale".
1377
    ///
1378
    /// \pre Either run() or start() must be called before using this function.
1379
    Value dualValue() const {
1380
      Value sum = 0;
1381
      for (NodeIt n(_graph); n != INVALID; ++n) {
1382
        sum += nodeValue(n);
1383
      }
1384
      return sum;
1385
    }
1386

	
1387
    /// \brief Return the dual value (potential) of the given node.
1388
    ///
1389
    /// This function returns the dual value (potential) of the given node.
1390
    ///
1391
    /// \pre Either run() or start() must be called before using this function.
1392
    Value nodeValue(const Node& n) const {
1393
      return (*_node_potential)[n];
1394
    }
1395

	
1396
    /// @}
1397

	
1398
  };
1399

	
1400
  /// \ingroup matching
1401
  ///
1402
  /// \brief Weighted fractional perfect matching in general graphs
1403
  ///
1404
  /// This class provides an efficient implementation of fractional
1405
  /// matching algorithm. The implementation uses priority queues and
1406
  /// provides \f$O(nm\log n)\f$ time complexity.
1407
  ///
1408
  /// The maximum weighted fractional perfect matching is a relaxation
1409
  /// of the maximum weighted perfect matching problem where the odd
1410
  /// set constraints are omitted.
1411
  /// It can be formulated with the following linear program.
1412
  /// \f[ \sum_{e \in \delta(u)}x_e = 1 \quad \forall u\in V\f]
1413
  /// \f[x_e \ge 0\quad \forall e\in E\f]
1414
  /// \f[\max \sum_{e\in E}x_ew_e\f]
1415
  /// where \f$\delta(X)\f$ is the set of edges incident to a node in
1416
  /// \f$X\f$. The result must be the union of a matching with one
1417
  /// value edges and a set of odd length cycles with half value edges.
1418
  ///
1419
  /// The algorithm calculates an optimal fractional matching and a
1420
  /// proof of the optimality. The solution of the dual problem can be
1421
  /// used to check the result of the algorithm. The dual linear
1422
  /// problem is the following.
1423
  /// \f[ y_u + y_v \ge w_{uv} \quad \forall uv\in E\f]
1424
  /// \f[\min \sum_{u \in V}y_u \f]
1425
  ///
1426
  /// The algorithm can be executed with the run() function.
1427
  /// After it the matching (the primal solution) and the dual solution
1428
  /// can be obtained using the query functions.
1429
  ///
1430
  /// The primal solution is multiplied by
1431
  /// \ref MaxWeightedPerfectFractionalMatching::primalScale "2".
1432
  /// If the value type is integer, then the dual
1433
  /// solution is scaled by
1434
  /// \ref MaxWeightedPerfectFractionalMatching::dualScale "4".
1435
  ///
1436
  /// \tparam GR The undirected graph type the algorithm runs on.
1437
  /// \tparam WM The type edge weight map. The default type is
1438
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<int>".
1439
#ifdef DOXYGEN
1440
  template <typename GR, typename WM>
1441
#else
1442
  template <typename GR,
1443
            typename WM = typename GR::template EdgeMap<int> >
1444
#endif
1445
  class MaxWeightedPerfectFractionalMatching {
1446
  public:
1447

	
1448
    /// The graph type of the algorithm
1449
    typedef GR Graph;
1450
    /// The type of the edge weight map
1451
    typedef WM WeightMap;
1452
    /// The value type of the edge weights
1453
    typedef typename WeightMap::Value Value;
1454

	
1455
    /// The type of the matching map
1456
    typedef typename Graph::template NodeMap<typename Graph::Arc>
1457
    MatchingMap;
1458

	
1459
    /// \brief Scaling factor for primal solution
1460
    ///
1461
    /// Scaling factor for primal solution.
1462
    static const int primalScale = 2;
1463

	
1464
    /// \brief Scaling factor for dual solution
1465
    ///
1466
    /// Scaling factor for dual solution. It is equal to 4 or 1
1467
    /// according to the value type.
1468
    static const int dualScale =
1469
      std::numeric_limits<Value>::is_integer ? 4 : 1;
1470

	
1471
  private:
1472

	
1473
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
1474

	
1475
    typedef typename Graph::template NodeMap<Value> NodePotential;
1476

	
1477
    const Graph& _graph;
1478
    const WeightMap& _weight;
1479

	
1480
    MatchingMap* _matching;
1481
    NodePotential* _node_potential;
1482

	
1483
    int _node_num;
1484
    bool _allow_loops;
1485

	
1486
    enum Status {
1487
      EVEN = -1, MATCHED = 0, ODD = 1
1488
    };
1489

	
1490
    typedef typename Graph::template NodeMap<Status> StatusMap;
1491
    StatusMap* _status;
1492

	
1493
    typedef typename Graph::template NodeMap<Arc> PredMap;
1494
    PredMap* _pred;
1495

	
1496
    typedef ExtendFindEnum<IntNodeMap> TreeSet;
1497

	
1498
    IntNodeMap *_tree_set_index;
1499
    TreeSet *_tree_set;
1500

	
1501
    IntNodeMap *_delta2_index;
1502
    BinHeap<Value, IntNodeMap> *_delta2;
1503

	
1504
    IntEdgeMap *_delta3_index;
1505
    BinHeap<Value, IntEdgeMap> *_delta3;
1506

	
1507
    Value _delta_sum;
1508

	
1509
    void createStructures() {
1510
      _node_num = countNodes(_graph);
1511

	
1512
      if (!_matching) {
1513
        _matching = new MatchingMap(_graph);
1514
      }
1515
      if (!_node_potential) {
1516
        _node_potential = new NodePotential(_graph);
1517
      }
1518
      if (!_status) {
1519
        _status = new StatusMap(_graph);
1520
      }
1521
      if (!_pred) {
1522
        _pred = new PredMap(_graph);
1523
      }
1524
      if (!_tree_set) {
1525
        _tree_set_index = new IntNodeMap(_graph);
1526
        _tree_set = new TreeSet(*_tree_set_index);
1527
      }
1528
      if (!_delta2) {
1529
        _delta2_index = new IntNodeMap(_graph);
1530
        _delta2 = new BinHeap<Value, IntNodeMap>(*_delta2_index);
1531
      }
1532
      if (!_delta3) {
1533
        _delta3_index = new IntEdgeMap(_graph);
1534
        _delta3 = new BinHeap<Value, IntEdgeMap>(*_delta3_index);
1535
      }
1536
    }
1537

	
1538
    void destroyStructures() {
1539
      if (_matching) {
1540
        delete _matching;
1541
      }
1542
      if (_node_potential) {
1543
        delete _node_potential;
1544
      }
1545
      if (_status) {
1546
        delete _status;
1547
      }
1548
      if (_pred) {
1549
        delete _pred;
1550
      }
1551
      if (_tree_set) {
1552
        delete _tree_set_index;
1553
        delete _tree_set;
1554
      }
1555
      if (_delta2) {
1556
        delete _delta2_index;
1557
        delete _delta2;
1558
      }
1559
      if (_delta3) {
1560
        delete _delta3_index;
1561
        delete _delta3;
1562
      }
1563
    }
1564

	
1565
    void matchedToEven(Node node, int tree) {
1566
      _tree_set->insert(node, tree);
1567
      _node_potential->set(node, (*_node_potential)[node] + _delta_sum);
1568

	
1569
      if (_delta2->state(node) == _delta2->IN_HEAP) {
1570
        _delta2->erase(node);
1571
      }
1572

	
1573
      for (InArcIt a(_graph, node); a != INVALID; ++a) {
1574
        Node v = _graph.source(a);
1575
        Value rw = (*_node_potential)[node] + (*_node_potential)[v] -
1576
          dualScale * _weight[a];
1577
        if (node == v) {
1578
          if (_allow_loops && _graph.direction(a)) {
1579
            _delta3->push(a, rw / 2);
1580
          }
1581
        } else if ((*_status)[v] == EVEN) {
1582
          _delta3->push(a, rw / 2);
1583
        } else if ((*_status)[v] == MATCHED) {
1584
          if (_delta2->state(v) != _delta2->IN_HEAP) {
1585
            _pred->set(v, a);
1586
            _delta2->push(v, rw);
1587
          } else if ((*_delta2)[v] > rw) {
1588
            _pred->set(v, a);
1589
            _delta2->decrease(v, rw);
1590
          }
1591
        }
1592
      }
1593
    }
1594

	
1595
    void matchedToOdd(Node node, int tree) {
1596
      _tree_set->insert(node, tree);
1597
      _node_potential->set(node, (*_node_potential)[node] - _delta_sum);
1598

	
1599
      if (_delta2->state(node) == _delta2->IN_HEAP) {
1600
        _delta2->erase(node);
1601
      }
1602
    }
1603

	
1604
    void evenToMatched(Node node, int tree) {
1605
      _node_potential->set(node, (*_node_potential)[node] - _delta_sum);
1606
      Arc min = INVALID;
1607
      Value minrw = std::numeric_limits<Value>::max();
1608
      for (InArcIt a(_graph, node); a != INVALID; ++a) {
1609
        Node v = _graph.source(a);
1610
        Value rw = (*_node_potential)[node] + (*_node_potential)[v] -
1611
          dualScale * _weight[a];
1612

	
1613
        if (node == v) {
1614
          if (_allow_loops && _graph.direction(a)) {
1615
            _delta3->erase(a);
1616
          }
1617
        } else if ((*_status)[v] == EVEN) {
1618
          _delta3->erase(a);
1619
          if (minrw > rw) {
1620
            min = _graph.oppositeArc(a);
1621
            minrw = rw;
1622
          }
1623
        } else if ((*_status)[v]  == MATCHED) {
1624
          if ((*_pred)[v] == a) {
1625
            Arc mina = INVALID;
1626
            Value minrwa = std::numeric_limits<Value>::max();
1627
            for (OutArcIt aa(_graph, v); aa != INVALID; ++aa) {
1628
              Node va = _graph.target(aa);
1629
              if ((*_status)[va] != EVEN ||
1630
                  _tree_set->find(va) == tree) continue;
1631
              Value rwa = (*_node_potential)[v] + (*_node_potential)[va] -
1632
                dualScale * _weight[aa];
1633
              if (minrwa > rwa) {
1634
                minrwa = rwa;
1635
                mina = aa;
1636
              }
1637
            }
1638
            if (mina != INVALID) {
1639
              _pred->set(v, mina);
1640
              _delta2->increase(v, minrwa);
1641
            } else {
1642
              _pred->set(v, INVALID);
1643
              _delta2->erase(v);
1644
            }
1645
          }
1646
        }
1647
      }
1648
      if (min != INVALID) {
1649
        _pred->set(node, min);
1650
        _delta2->push(node, minrw);
1651
      } else {
1652
        _pred->set(node, INVALID);
1653
      }
1654
    }
1655

	
1656
    void oddToMatched(Node node) {
1657
      _node_potential->set(node, (*_node_potential)[node] + _delta_sum);
1658
      Arc min = INVALID;
1659
      Value minrw = std::numeric_limits<Value>::max();
1660
      for (InArcIt a(_graph, node); a != INVALID; ++a) {
1661
        Node v = _graph.source(a);
1662
        if ((*_status)[v] != EVEN) continue;
1663
        Value rw = (*_node_potential)[node] + (*_node_potential)[v] -
1664
          dualScale * _weight[a];
1665

	
1666
        if (minrw > rw) {
1667
          min = _graph.oppositeArc(a);
1668
          minrw = rw;
1669
        }
1670
      }
1671
      if (min != INVALID) {
1672
        _pred->set(node, min);
1673
        _delta2->push(node, minrw);
1674
      } else {
1675
        _pred->set(node, INVALID);
1676
      }
1677
    }
1678

	
1679
    void alternatePath(Node even, int tree) {
1680
      Node odd;
1681

	
1682
      _status->set(even, MATCHED);
1683
      evenToMatched(even, tree);
1684

	
1685
      Arc prev = (*_matching)[even];
1686
      while (prev != INVALID) {
1687
        odd = _graph.target(prev);
1688
        even = _graph.target((*_pred)[odd]);
1689
        _matching->set(odd, (*_pred)[odd]);
1690
        _status->set(odd, MATCHED);
1691
        oddToMatched(odd);
1692

	
1693
        prev = (*_matching)[even];
1694
        _status->set(even, MATCHED);
1695
        _matching->set(even, _graph.oppositeArc((*_matching)[odd]));
1696
        evenToMatched(even, tree);
1697
      }
1698
    }
1699

	
1700
    void destroyTree(int tree) {
1701
      for (typename TreeSet::ItemIt n(*_tree_set, tree); n != INVALID; ++n) {
1702
        if ((*_status)[n] == EVEN) {
1703
          _status->set(n, MATCHED);
1704
          evenToMatched(n, tree);
1705
        } else if ((*_status)[n] == ODD) {
1706
          _status->set(n, MATCHED);
1707
          oddToMatched(n);
1708
        }
1709
      }
1710
      _tree_set->eraseClass(tree);
1711
    }
1712

	
1713
    void augmentOnEdge(const Edge& edge) {
1714
      Node left = _graph.u(edge);
1715
      int left_tree = _tree_set->find(left);
1716

	
1717
      alternatePath(left, left_tree);
1718
      destroyTree(left_tree);
1719
      _matching->set(left, _graph.direct(edge, true));
1720

	
1721
      Node right = _graph.v(edge);
1722
      int right_tree = _tree_set->find(right);
1723

	
1724
      alternatePath(right, right_tree);
1725
      destroyTree(right_tree);
1726
      _matching->set(right, _graph.direct(edge, false));
1727
    }
1728

	
1729
    void augmentOnArc(const Arc& arc) {
1730
      Node left = _graph.source(arc);
1731
      _status->set(left, MATCHED);
1732
      _matching->set(left, arc);
1733
      _pred->set(left, arc);
1734

	
1735
      Node right = _graph.target(arc);
1736
      int right_tree = _tree_set->find(right);
1737

	
1738
      alternatePath(right, right_tree);
1739
      destroyTree(right_tree);
1740
      _matching->set(right, _graph.oppositeArc(arc));
1741
    }
1742

	
1743
    void extendOnArc(const Arc& arc) {
1744
      Node base = _graph.target(arc);
1745
      int tree = _tree_set->find(base);
1746

	
1747
      Node odd = _graph.source(arc);
1748
      _tree_set->insert(odd, tree);
1749
      _status->set(odd, ODD);
1750
      matchedToOdd(odd, tree);
1751
      _pred->set(odd, arc);
1752

	
1753
      Node even = _graph.target((*_matching)[odd]);
1754
      _tree_set->insert(even, tree);
1755
      _status->set(even, EVEN);
1756
      matchedToEven(even, tree);
1757
    }
1758

	
1759
    void cycleOnEdge(const Edge& edge, int tree) {
1760
      Node nca = INVALID;
1761
      std::vector<Node> left_path, right_path;
1762

	
1763
      {
1764
        std::set<Node> left_set, right_set;
1765
        Node left = _graph.u(edge);
1766
        left_path.push_back(left);
1767
        left_set.insert(left);
1768

	
1769
        Node right = _graph.v(edge);
1770
        right_path.push_back(right);
1771
        right_set.insert(right);
1772

	
1773
        while (true) {
1774

	
1775
          if (left_set.find(right) != left_set.end()) {
1776
            nca = right;
1777
            break;
1778
          }
1779

	
1780
          if ((*_matching)[left] == INVALID) break;
1781

	
1782
          left = _graph.target((*_matching)[left]);
1783
          left_path.push_back(left);
1784
          left = _graph.target((*_pred)[left]);
1785
          left_path.push_back(left);
1786

	
1787
          left_set.insert(left);
1788

	
1789
          if (right_set.find(left) != right_set.end()) {
1790
            nca = left;
1791
            break;
1792
          }
1793

	
1794
          if ((*_matching)[right] == INVALID) break;
1795

	
1796
          right = _graph.target((*_matching)[right]);
1797
          right_path.push_back(right);
1798
          right = _graph.target((*_pred)[right]);
1799
          right_path.push_back(right);
1800

	
1801
          right_set.insert(right);
1802

	
1803
        }
1804

	
1805
        if (nca == INVALID) {
1806
          if ((*_matching)[left] == INVALID) {
1807
            nca = right;
1808
            while (left_set.find(nca) == left_set.end()) {
1809
              nca = _graph.target((*_matching)[nca]);
1810
              right_path.push_back(nca);
1811
              nca = _graph.target((*_pred)[nca]);
1812
              right_path.push_back(nca);
1813
            }
1814
          } else {
1815
            nca = left;
1816
            while (right_set.find(nca) == right_set.end()) {
1817
              nca = _graph.target((*_matching)[nca]);
1818
              left_path.push_back(nca);
1819
              nca = _graph.target((*_pred)[nca]);
1820
              left_path.push_back(nca);
1821
            }
1822
          }
1823
        }
1824
      }
1825

	
1826
      alternatePath(nca, tree);
1827
      Arc prev;
1828

	
1829
      prev = _graph.direct(edge, true);
1830
      for (int i = 0; left_path[i] != nca; i += 2) {
1831
        _matching->set(left_path[i], prev);
1832
        _status->set(left_path[i], MATCHED);
1833
        evenToMatched(left_path[i], tree);
1834

	
1835
        prev = _graph.oppositeArc((*_pred)[left_path[i + 1]]);
1836
        _status->set(left_path[i + 1], MATCHED);
1837
        oddToMatched(left_path[i + 1]);
1838
      }
1839
      _matching->set(nca, prev);
1840

	
1841
      for (int i = 0; right_path[i] != nca; i += 2) {
1842
        _status->set(right_path[i], MATCHED);
1843
        evenToMatched(right_path[i], tree);
1844

	
1845
        _matching->set(right_path[i + 1], (*_pred)[right_path[i + 1]]);
1846
        _status->set(right_path[i + 1], MATCHED);
1847
        oddToMatched(right_path[i + 1]);
1848
      }
1849

	
1850
      destroyTree(tree);
1851
    }
1852

	
1853
    void extractCycle(const Arc &arc) {
1854
      Node left = _graph.source(arc);
1855
      Node odd = _graph.target((*_matching)[left]);
1856
      Arc prev;
1857
      while (odd != left) {
1858
        Node even = _graph.target((*_matching)[odd]);
1859
        prev = (*_matching)[odd];
1860
        odd = _graph.target((*_matching)[even]);
1861
        _matching->set(even, _graph.oppositeArc(prev));
1862
      }
1863
      _matching->set(left, arc);
1864

	
1865
      Node right = _graph.target(arc);
1866
      int right_tree = _tree_set->find(right);
1867
      alternatePath(right, right_tree);
1868
      destroyTree(right_tree);
1869
      _matching->set(right, _graph.oppositeArc(arc));
1870
    }
1871

	
1872
  public:
1873

	
1874
    /// \brief Constructor
1875
    ///
1876
    /// Constructor.
1877
    MaxWeightedPerfectFractionalMatching(const Graph& graph,
1878
                                         const WeightMap& weight,
1879
                                         bool allow_loops = true)
1880
      : _graph(graph), _weight(weight), _matching(0),
1881
      _node_potential(0), _node_num(0), _allow_loops(allow_loops),
1882
      _status(0),  _pred(0),
1883
      _tree_set_index(0), _tree_set(0),
1884

	
1885
      _delta2_index(0), _delta2(0),
1886
      _delta3_index(0), _delta3(0),
1887

	
1888
      _delta_sum() {}
1889

	
1890
    ~MaxWeightedPerfectFractionalMatching() {
1891
      destroyStructures();
1892
    }
1893

	
1894
    /// \name Execution Control
1895
    /// The simplest way to execute the algorithm is to use the
1896
    /// \ref run() member function.
1897

	
1898
    ///@{
1899

	
1900
    /// \brief Initialize the algorithm
1901
    ///
1902
    /// This function initializes the algorithm.
1903
    void init() {
1904
      createStructures();
1905

	
1906
      for (NodeIt n(_graph); n != INVALID; ++n) {
1907
        (*_delta2_index)[n] = _delta2->PRE_HEAP;
1908
      }
1909
      for (EdgeIt e(_graph); e != INVALID; ++e) {
1910
        (*_delta3_index)[e] = _delta3->PRE_HEAP;
1911
      }
1912

	
1913
      _delta2->clear();
1914
      _delta3->clear();
1915
      _tree_set->clear();
1916

	
1917
      for (NodeIt n(_graph); n != INVALID; ++n) {
1918
        Value max = - std::numeric_limits<Value>::max();
1919
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
1920
          if (_graph.target(e) == n && !_allow_loops) continue;
1921
          if ((dualScale * _weight[e]) / 2 > max) {
1922
            max = (dualScale * _weight[e]) / 2;
1923
          }
1924
        }
1925
        _node_potential->set(n, max);
1926

	
1927
        _tree_set->insert(n);
1928

	
1929
        _matching->set(n, INVALID);
1930
        _status->set(n, EVEN);
1931
      }
1932

	
1933
      for (EdgeIt e(_graph); e != INVALID; ++e) {
1934
        Node left = _graph.u(e);
1935
        Node right = _graph.v(e);
1936
        if (left == right && !_allow_loops) continue;
1937
        _delta3->push(e, ((*_node_potential)[left] +
1938
                          (*_node_potential)[right] -
1939
                          dualScale * _weight[e]) / 2);
1940
      }
1941
    }
1942

	
1943
    /// \brief Start the algorithm
1944
    ///
1945
    /// This function starts the algorithm.
1946
    ///
1947
    /// \pre \ref init() must be called before using this function.
1948
    bool start() {
1949
      enum OpType {
1950
        D2, D3
1951
      };
1952

	
1953
      int unmatched = _node_num;
1954
      while (unmatched > 0) {
1955
        Value d2 = !_delta2->empty() ?
1956
          _delta2->prio() : std::numeric_limits<Value>::max();
1957

	
1958
        Value d3 = !_delta3->empty() ?
1959
          _delta3->prio() : std::numeric_limits<Value>::max();
1960

	
1961
        _delta_sum = d3; OpType ot = D3;
1962
        if (d2 < _delta_sum) { _delta_sum = d2; ot = D2; }
1963

	
1964
        if (_delta_sum == std::numeric_limits<Value>::max()) {
1965
          return false;
1966
        }
1967

	
1968
        switch (ot) {
1969
        case D2:
1970
          {
1971
            Node n = _delta2->top();
1972
            Arc a = (*_pred)[n];
1973
            if ((*_matching)[n] == INVALID) {
1974
              augmentOnArc(a);
1975
              --unmatched;
1976
            } else {
1977
              Node v = _graph.target((*_matching)[n]);
1978
              if ((*_matching)[n] !=
1979
                  _graph.oppositeArc((*_matching)[v])) {
1980
                extractCycle(a);
1981
                --unmatched;
1982
              } else {
1983
                extendOnArc(a);
1984
              }
1985
            }
1986
          } break;
1987
        case D3:
1988
          {
1989
            Edge e = _delta3->top();
1990

	
1991
            Node left = _graph.u(e);
1992
            Node right = _graph.v(e);
1993

	
1994
            int left_tree = _tree_set->find(left);
1995
            int right_tree = _tree_set->find(right);
1996

	
1997
            if (left_tree == right_tree) {
1998
              cycleOnEdge(e, left_tree);
1999
              --unmatched;
2000
            } else {
2001
              augmentOnEdge(e);
2002
              unmatched -= 2;
2003
            }
2004
          } break;
2005
        }
2006
      }
2007
      return true;
2008
    }
2009

	
2010
    /// \brief Run the algorithm.
2011
    ///
2012
    /// This method runs the \c %MaxWeightedPerfectFractionalMatching
2013
    /// algorithm.
2014
    ///
2015
    /// \note mwfm.run() is just a shortcut of the following code.
2016
    /// \code
2017
    ///   mwpfm.init();
2018
    ///   mwpfm.start();
2019
    /// \endcode
2020
    bool run() {
2021
      init();
2022
      return start();
2023
    }
2024

	
2025
    /// @}
2026

	
2027
    /// \name Primal Solution
2028
    /// Functions to get the primal solution, i.e. the maximum weighted
2029
    /// matching.\n
2030
    /// Either \ref run() or \ref start() function should be called before
2031
    /// using them.
2032

	
2033
    /// @{
2034

	
2035
    /// \brief Return the weight of the matching.
2036
    ///
2037
    /// This function returns the weight of the found matching. This
2038
    /// value is scaled by \ref primalScale "primal scale".
2039
    ///
2040
    /// \pre Either run() or start() must be called before using this function.
2041
    Value matchingWeight() const {
2042
      Value sum = 0;
2043
      for (NodeIt n(_graph); n != INVALID; ++n) {
2044
        if ((*_matching)[n] != INVALID) {
2045
          sum += _weight[(*_matching)[n]];
2046
        }
2047
      }
2048
      return sum * primalScale / 2;
2049
    }
2050

	
2051
    /// \brief Return the number of covered nodes in the matching.
2052
    ///
2053
    /// This function returns the number of covered nodes in the matching.
2054
    ///
2055
    /// \pre Either run() or start() must be called before using this function.
2056
    int matchingSize() const {
2057
      int num = 0;
2058
      for (NodeIt n(_graph); n != INVALID; ++n) {
2059
        if ((*_matching)[n] != INVALID) {
2060
          ++num;
2061
        }
2062
      }
2063
      return num;
2064
    }
2065

	
2066
    /// \brief Return \c true if the given edge is in the matching.
2067
    ///
2068
    /// This function returns \c true if the given edge is in the
2069
    /// found matching. The result is scaled by \ref primalScale
2070
    /// "primal scale".
2071
    ///
2072
    /// \pre Either run() or start() must be called before using this function.
2073
    int matching(const Edge& edge) const {
2074
      return (edge == (*_matching)[_graph.u(edge)] ? 1 : 0)
2075
        + (edge == (*_matching)[_graph.v(edge)] ? 1 : 0);
2076
    }
2077

	
2078
    /// \brief Return the fractional matching arc (or edge) incident
2079
    /// to the given node.
2080
    ///
2081
    /// This function returns one of the fractional matching arc (or
2082
    /// edge) incident to the given node in the found matching or \c
2083
    /// INVALID if the node is not covered by the matching or if the
2084
    /// node is on an odd length cycle then it is the successor edge
2085
    /// on the cycle.
2086
    ///
2087
    /// \pre Either run() or start() must be called before using this function.
2088
    Arc matching(const Node& node) const {
2089
      return (*_matching)[node];
2090
    }
2091

	
2092
    /// \brief Return a const reference to the matching map.
2093
    ///
2094
    /// This function returns a const reference to a node map that stores
2095
    /// the matching arc (or edge) incident to each node.
2096
    const MatchingMap& matchingMap() const {
2097
      return *_matching;
2098
    }
2099

	
2100
    /// @}
2101

	
2102
    /// \name Dual Solution
2103
    /// Functions to get the dual solution.\n
2104
    /// Either \ref run() or \ref start() function should be called before
2105
    /// using them.
2106

	
2107
    /// @{
2108

	
2109
    /// \brief Return the value of the dual solution.
2110
    ///
2111
    /// This function returns the value of the dual solution.
2112
    /// It should be equal to the primal value scaled by \ref dualScale
2113
    /// "dual scale".
2114
    ///
2115
    /// \pre Either run() or start() must be called before using this function.
2116
    Value dualValue() const {
2117
      Value sum = 0;
2118
      for (NodeIt n(_graph); n != INVALID; ++n) {
2119
        sum += nodeValue(n);
2120
      }
2121
      return sum;
2122
    }
2123

	
2124
    /// \brief Return the dual value (potential) of the given node.
2125
    ///
2126
    /// This function returns the dual value (potential) of the given node.
2127
    ///
2128
    /// \pre Either run() or start() must be called before using this function.
2129
    Value nodeValue(const Node& n) const {
2130
      return (*_node_potential)[n];
2131
    }
2132

	
2133
    /// @}
2134

	
2135
  };
2136

	
2137
} //END OF NAMESPACE LEMON
2138

	
2139
#endif //LEMON_FRACTIONAL_MATCHING_H
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2010
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_HARTMANN_ORLIN_MMC_H
20
#define LEMON_HARTMANN_ORLIN_MMC_H
21

	
22
/// \ingroup min_mean_cycle
23
///
24
/// \file
25
/// \brief Hartmann-Orlin's algorithm for finding a minimum mean cycle.
26

	
27
#include <vector>
28
#include <limits>
29
#include <lemon/core.h>
30
#include <lemon/path.h>
31
#include <lemon/tolerance.h>
32
#include <lemon/connectivity.h>
33

	
34
namespace lemon {
35

	
36
  /// \brief Default traits class of HartmannOrlinMmc class.
37
  ///
38
  /// Default traits class of HartmannOrlinMmc class.
39
  /// \tparam GR The type of the digraph.
40
  /// \tparam CM The type of the cost map.
41
  /// It must conform to the \ref concepts::Rea_data "Rea_data" concept.
42
#ifdef DOXYGEN
43
  template <typename GR, typename CM>
44
#else
45
  template <typename GR, typename CM,
46
    bool integer = std::numeric_limits<typename CM::Value>::is_integer>
47
#endif
48
  struct HartmannOrlinMmcDefaultTraits
49
  {
50
    /// The type of the digraph
51
    typedef GR Digraph;
52
    /// The type of the cost map
53
    typedef CM CostMap;
54
    /// The type of the arc costs
55
    typedef typename CostMap::Value Cost;
56

	
57
    /// \brief The large cost type used for internal computations
58
    ///
59
    /// The large cost type used for internal computations.
60
    /// It is \c long \c long if the \c Cost type is integer,
61
    /// otherwise it is \c double.
62
    /// \c Cost must be convertible to \c LargeCost.
63
    typedef double LargeCost;
64

	
65
    /// The tolerance type used for internal computations
66
    typedef lemon::Tolerance<LargeCost> Tolerance;
67

	
68
    /// \brief The path type of the found cycles
69
    ///
70
    /// The path type of the found cycles.
71
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
72
    /// and it must have an \c addFront() function.
73
    typedef lemon::Path<Digraph> Path;
74
  };
75

	
76
  // Default traits class for integer cost types
77
  template <typename GR, typename CM>
78
  struct HartmannOrlinMmcDefaultTraits<GR, CM, true>
79
  {
80
    typedef GR Digraph;
81
    typedef CM CostMap;
82
    typedef typename CostMap::Value Cost;
83
#ifdef LEMON_HAVE_LONG_LONG
84
    typedef long long LargeCost;
85
#else
86
    typedef long LargeCost;
87
#endif
88
    typedef lemon::Tolerance<LargeCost> Tolerance;
89
    typedef lemon::Path<Digraph> Path;
90
  };
91

	
92

	
93
  /// \addtogroup min_mean_cycle
94
  /// @{
95

	
96
  /// \brief Implementation of the Hartmann-Orlin algorithm for finding
97
  /// a minimum mean cycle.
98
  ///
99
  /// This class implements the Hartmann-Orlin algorithm for finding
100
  /// a directed cycle of minimum mean cost in a digraph
101
  /// \ref amo93networkflows, \ref dasdan98minmeancycle.
102
  /// It is an improved version of \ref Karp "Karp"'s original algorithm,
103
  /// it applies an efficient early termination scheme.
104
  /// It runs in time O(ne) and uses space O(n<sup>2</sup>+e).
105
  ///
106
  /// \tparam GR The type of the digraph the algorithm runs on.
107
  /// \tparam CM The type of the cost map. The default
108
  /// map type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
109
  /// \tparam TR The traits class that defines various types used by the
110
  /// algorithm. By default, it is \ref HartmannOrlinMmcDefaultTraits
111
  /// "HartmannOrlinMmcDefaultTraits<GR, CM>".
112
  /// In most cases, this parameter should not be set directly,
113
  /// consider to use the named template parameters instead.
114
#ifdef DOXYGEN
115
  template <typename GR, typename CM, typename TR>
116
#else
117
  template < typename GR,
118
             typename CM = typename GR::template ArcMap<int>,
119
             typename TR = HartmannOrlinMmcDefaultTraits<GR, CM> >
120
#endif
121
  class HartmannOrlinMmc
122
  {
123
  public:
124

	
125
    /// The type of the digraph
126
    typedef typename TR::Digraph Digraph;
127
    /// The type of the cost map
128
    typedef typename TR::CostMap CostMap;
129
    /// The type of the arc costs
130
    typedef typename TR::Cost Cost;
131

	
132
    /// \brief The large cost type
133
    ///
134
    /// The large cost type used for internal computations.
135
    /// By default, it is \c long \c long if the \c Cost type is integer,
136
    /// otherwise it is \c double.
137
    typedef typename TR::LargeCost LargeCost;
138

	
139
    /// The tolerance type
140
    typedef typename TR::Tolerance Tolerance;
141

	
142
    /// \brief The path type of the found cycles
143
    ///
144
    /// The path type of the found cycles.
145
    /// Using the \ref HartmannOrlinMmcDefaultTraits "default traits class",
146
    /// it is \ref lemon::Path "Path<Digraph>".
147
    typedef typename TR::Path Path;
148

	
149
    /// The \ref HartmannOrlinMmcDefaultTraits "traits class" of the algorithm
150
    typedef TR Traits;
151

	
152
  private:
153

	
154
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
155

	
156
    // Data sturcture for path data
157
    struct PathData
158
    {
159
      LargeCost dist;
160
      Arc pred;
161
      PathData(LargeCost d, Arc p = INVALID) :
162
        dist(d), pred(p) {}
163
    };
164

	
165
    typedef typename Digraph::template NodeMap<std::vector<PathData> >
166
      PathDataNodeMap;
167

	
168
  private:
169

	
170
    // The digraph the algorithm runs on
171
    const Digraph &_gr;
172
    // The cost of the arcs
173
    const CostMap &_cost;
174

	
175
    // Data for storing the strongly connected components
176
    int _comp_num;
177
    typename Digraph::template NodeMap<int> _comp;
178
    std::vector<std::vector<Node> > _comp_nodes;
179
    std::vector<Node>* _nodes;
180
    typename Digraph::template NodeMap<std::vector<Arc> > _out_arcs;
181

	
182
    // Data for the found cycles
183
    bool _curr_found, _best_found;
184
    LargeCost _curr_cost, _best_cost;
185
    int _curr_size, _best_size;
186
    Node _curr_node, _best_node;
187
    int _curr_level, _best_level;
188

	
189
    Path *_cycle_path;
190
    bool _local_path;
191

	
192
    // Node map for storing path data
193
    PathDataNodeMap _data;
194
    // The processed nodes in the last round
195
    std::vector<Node> _process;
196

	
197
    Tolerance _tolerance;
198

	
199
    // Infinite constant
200
    const LargeCost INF;
201

	
202
  public:
203

	
204
    /// \name Named Template Parameters
205
    /// @{
206

	
207
    template <typename T>
208
    struct SetLargeCostTraits : public Traits {
209
      typedef T LargeCost;
210
      typedef lemon::Tolerance<T> Tolerance;
211
    };
212

	
213
    /// \brief \ref named-templ-param "Named parameter" for setting
214
    /// \c LargeCost type.
215
    ///
216
    /// \ref named-templ-param "Named parameter" for setting \c LargeCost
217
    /// type. It is used for internal computations in the algorithm.
218
    template <typename T>
219
    struct SetLargeCost
220
      : public HartmannOrlinMmc<GR, CM, SetLargeCostTraits<T> > {
221
      typedef HartmannOrlinMmc<GR, CM, SetLargeCostTraits<T> > Create;
222
    };
223

	
224
    template <typename T>
225
    struct SetPathTraits : public Traits {
226
      typedef T Path;
227
    };
228

	
229
    /// \brief \ref named-templ-param "Named parameter" for setting
230
    /// \c %Path type.
231
    ///
232
    /// \ref named-templ-param "Named parameter" for setting the \c %Path
233
    /// type of the found cycles.
234
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
235
    /// and it must have an \c addFront() function.
236
    template <typename T>
237
    struct SetPath
238
      : public HartmannOrlinMmc<GR, CM, SetPathTraits<T> > {
239
      typedef HartmannOrlinMmc<GR, CM, SetPathTraits<T> > Create;
240
    };
241

	
242
    /// @}
243

	
244
  protected:
245

	
246
    HartmannOrlinMmc() {}
247

	
248
  public:
249

	
250
    /// \brief Constructor.
251
    ///
252
    /// The constructor of the class.
253
    ///
254
    /// \param digraph The digraph the algorithm runs on.
255
    /// \param cost The costs of the arcs.
256
    HartmannOrlinMmc( const Digraph &digraph,
257
                      const CostMap &cost ) :
258
      _gr(digraph), _cost(cost), _comp(digraph), _out_arcs(digraph),
259
      _best_found(false), _best_cost(0), _best_size(1),
260
      _cycle_path(NULL), _local_path(false), _data(digraph),
261
      INF(std::numeric_limits<LargeCost>::has_infinity ?
262
          std::numeric_limits<LargeCost>::infinity() :
263
          std::numeric_limits<LargeCost>::max())
264
    {}
265

	
266
    /// Destructor.
267
    ~HartmannOrlinMmc() {
268
      if (_local_path) delete _cycle_path;
269
    }
270

	
271
    /// \brief Set the path structure for storing the found cycle.
272
    ///
273
    /// This function sets an external path structure for storing the
274
    /// found cycle.
275
    ///
276
    /// If you don't call this function before calling \ref run() or
277
    /// \ref findCycleMean(), it will allocate a local \ref Path "path"
278
    /// structure. The destuctor deallocates this automatically
279
    /// allocated object, of course.
280
    ///
281
    /// \note The algorithm calls only the \ref lemon::Path::addFront()
282
    /// "addFront()" function of the given path structure.
283
    ///
284
    /// \return <tt>(*this)</tt>
285
    HartmannOrlinMmc& cycle(Path &path) {
286
      if (_local_path) {
287
        delete _cycle_path;
288
        _local_path = false;
289
      }
290
      _cycle_path = &path;
291
      return *this;
292
    }
293

	
294
    /// \brief Set the tolerance used by the algorithm.
295
    ///
296
    /// This function sets the tolerance object used by the algorithm.
297
    ///
298
    /// \return <tt>(*this)</tt>
299
    HartmannOrlinMmc& tolerance(const Tolerance& tolerance) {
300
      _tolerance = tolerance;
301
      return *this;
302
    }
303

	
304
    /// \brief Return a const reference to the tolerance.
305
    ///
306
    /// This function returns a const reference to the tolerance object
307
    /// used by the algorithm.
308
    const Tolerance& tolerance() const {
309
      return _tolerance;
310
    }
311

	
312
    /// \name Execution control
313
    /// The simplest way to execute the algorithm is to call the \ref run()
314
    /// function.\n
315
    /// If you only need the minimum mean cost, you may call
316
    /// \ref findCycleMean().
317

	
318
    /// @{
319

	
320
    /// \brief Run the algorithm.
321
    ///
322
    /// This function runs the algorithm.
323
    /// It can be called more than once (e.g. if the underlying digraph
324
    /// and/or the arc costs have been modified).
325
    ///
326
    /// \return \c true if a directed cycle exists in the digraph.
327
    ///
328
    /// \note <tt>mmc.run()</tt> is just a shortcut of the following code.
329
    /// \code
330
    ///   return mmc.findCycleMean() && mmc.findCycle();
331
    /// \endcode
332
    bool run() {
333
      return findCycleMean() && findCycle();
334
    }
335

	
336
    /// \brief Find the minimum cycle mean.
337
    ///
338
    /// This function finds the minimum mean cost of the directed
339
    /// cycles in the digraph.
340
    ///
341
    /// \return \c true if a directed cycle exists in the digraph.
342
    bool findCycleMean() {
343
      // Initialization and find strongly connected components
344
      init();
345
      findComponents();
346

	
347
      // Find the minimum cycle mean in the components
348
      for (int comp = 0; comp < _comp_num; ++comp) {
349
        if (!initComponent(comp)) continue;
350
        processRounds();
351

	
352
        // Update the best cycle (global minimum mean cycle)
353
        if ( _curr_found && (!_best_found ||
354
             _curr_cost * _best_size < _best_cost * _curr_size) ) {
355
          _best_found = true;
356
          _best_cost = _curr_cost;
357
          _best_size = _curr_size;
358
          _best_node = _curr_node;
359
          _best_level = _curr_level;
360
        }
361
      }
362
      return _best_found;
363
    }
364

	
365
    /// \brief Find a minimum mean directed cycle.
366
    ///
367
    /// This function finds a directed cycle of minimum mean cost
368
    /// in the digraph using the data computed by findCycleMean().
369
    ///
370
    /// \return \c true if a directed cycle exists in the digraph.
371
    ///
372
    /// \pre \ref findCycleMean() must be called before using this function.
373
    bool findCycle() {
374
      if (!_best_found) return false;
375
      IntNodeMap reached(_gr, -1);
376
      int r = _best_level + 1;
377
      Node u = _best_node;
378
      while (reached[u] < 0) {
379
        reached[u] = --r;
380
        u = _gr.source(_data[u][r].pred);
381
      }
382
      r = reached[u];
383
      Arc e = _data[u][r].pred;
384
      _cycle_path->addFront(e);
385
      _best_cost = _cost[e];
386
      _best_size = 1;
387
      Node v;
388
      while ((v = _gr.source(e)) != u) {
389
        e = _data[v][--r].pred;
390
        _cycle_path->addFront(e);
391
        _best_cost += _cost[e];
392
        ++_best_size;
393
      }
394
      return true;
395
    }
396

	
397
    /// @}
398

	
399
    /// \name Query Functions
400
    /// The results of the algorithm can be obtained using these
401
    /// functions.\n
402
    /// The algorithm should be executed before using them.
403

	
404
    /// @{
405

	
406
    /// \brief Return the total cost of the found cycle.
407
    ///
408
    /// This function returns the total cost of the found cycle.
409
    ///
410
    /// \pre \ref run() or \ref findCycleMean() must be called before
411
    /// using this function.
412
    Cost cycleCost() const {
413
      return static_cast<Cost>(_best_cost);
414
    }
415

	
416
    /// \brief Return the number of arcs on the found cycle.
417
    ///
418
    /// This function returns the number of arcs on the found cycle.
419
    ///
420
    /// \pre \ref run() or \ref findCycleMean() must be called before
421
    /// using this function.
422
    int cycleSize() const {
423
      return _best_size;
424
    }
425

	
426
    /// \brief Return the mean cost of the found cycle.
427
    ///
428
    /// This function returns the mean cost of the found cycle.
429
    ///
430
    /// \note <tt>alg.cycleMean()</tt> is just a shortcut of the
431
    /// following code.
432
    /// \code
433
    ///   return static_cast<double>(alg.cycleCost()) / alg.cycleSize();
434
    /// \endcode
435
    ///
436
    /// \pre \ref run() or \ref findCycleMean() must be called before
437
    /// using this function.
438
    double cycleMean() const {
439
      return static_cast<double>(_best_cost) / _best_size;
440
    }
441

	
442
    /// \brief Return the found cycle.
443
    ///
444
    /// This function returns a const reference to the path structure
445
    /// storing the found cycle.
446
    ///
447
    /// \pre \ref run() or \ref findCycle() must be called before using
448
    /// this function.
449
    const Path& cycle() const {
450
      return *_cycle_path;
451
    }
452

	
453
    ///@}
454

	
455
  private:
456

	
457
    // Initialization
458
    void init() {
459
      if (!_cycle_path) {
460
        _local_path = true;
461
        _cycle_path = new Path;
462
      }
463
      _cycle_path->clear();
464
      _best_found = false;
465
      _best_cost = 0;
466
      _best_size = 1;
467
      _cycle_path->clear();
468
      for (NodeIt u(_gr); u != INVALID; ++u)
469
        _data[u].clear();
470
    }
471

	
472
    // Find strongly connected components and initialize _comp_nodes
473
    // and _out_arcs
474
    void findComponents() {
475
      _comp_num = stronglyConnectedComponents(_gr, _comp);
476
      _comp_nodes.resize(_comp_num);
477
      if (_comp_num == 1) {
478
        _comp_nodes[0].clear();
479
        for (NodeIt n(_gr); n != INVALID; ++n) {
480
          _comp_nodes[0].push_back(n);
481
          _out_arcs[n].clear();
482
          for (OutArcIt a(_gr, n); a != INVALID; ++a) {
483
            _out_arcs[n].push_back(a);
484
          }
485
        }
486
      } else {
487
        for (int i = 0; i < _comp_num; ++i)
488
          _comp_nodes[i].clear();
489
        for (NodeIt n(_gr); n != INVALID; ++n) {
490
          int k = _comp[n];
491
          _comp_nodes[k].push_back(n);
492
          _out_arcs[n].clear();
493
          for (OutArcIt a(_gr, n); a != INVALID; ++a) {
494
            if (_comp[_gr.target(a)] == k) _out_arcs[n].push_back(a);
495
          }
496
        }
497
      }
498
    }
499

	
500
    // Initialize path data for the current component
501
    bool initComponent(int comp) {
502
      _nodes = &(_comp_nodes[comp]);
503
      int n = _nodes->size();
504
      if (n < 1 || (n == 1 && _out_arcs[(*_nodes)[0]].size() == 0)) {
505
        return false;
506
      }
507
      for (int i = 0; i < n; ++i) {
508
        _data[(*_nodes)[i]].resize(n + 1, PathData(INF));
509
      }
510
      return true;
511
    }
512

	
513
    // Process all rounds of computing path data for the current component.
514
    // _data[v][k] is the cost of a shortest directed walk from the root
515
    // node to node v containing exactly k arcs.
516
    void processRounds() {
517
      Node start = (*_nodes)[0];
518
      _data[start][0] = PathData(0);
519
      _process.clear();
520
      _process.push_back(start);
521

	
522
      int k, n = _nodes->size();
523
      int next_check = 4;
524
      bool terminate = false;
525
      for (k = 1; k <= n && int(_process.size()) < n && !terminate; ++k) {
526
        processNextBuildRound(k);
527
        if (k == next_check || k == n) {
528
          terminate = checkTermination(k);
529
          next_check = next_check * 3 / 2;
530
        }
531
      }
532
      for ( ; k <= n && !terminate; ++k) {
533
        processNextFullRound(k);
534
        if (k == next_check || k == n) {
535
          terminate = checkTermination(k);
536
          next_check = next_check * 3 / 2;
537
        }
538
      }
539
    }
540

	
541
    // Process one round and rebuild _process
542
    void processNextBuildRound(int k) {
543
      std::vector<Node> next;
544
      Node u, v;
545
      Arc e;
546
      LargeCost d;
547
      for (int i = 0; i < int(_process.size()); ++i) {
548
        u = _process[i];
549
        for (int j = 0; j < int(_out_arcs[u].size()); ++j) {
550
          e = _out_arcs[u][j];
551
          v = _gr.target(e);
552
          d = _data[u][k-1].dist + _cost[e];
553
          if (_tolerance.less(d, _data[v][k].dist)) {
554
            if (_data[v][k].dist == INF) next.push_back(v);
555
            _data[v][k] = PathData(d, e);
556
          }
557
        }
558
      }
559
      _process.swap(next);
560
    }
561

	
562
    // Process one round using _nodes instead of _process
563
    void processNextFullRound(int k) {
564
      Node u, v;
565
      Arc e;
566
      LargeCost d;
567
      for (int i = 0; i < int(_nodes->size()); ++i) {
568
        u = (*_nodes)[i];
569
        for (int j = 0; j < int(_out_arcs[u].size()); ++j) {
570
          e = _out_arcs[u][j];
571
          v = _gr.target(e);
572
          d = _data[u][k-1].dist + _cost[e];
573
          if (_tolerance.less(d, _data[v][k].dist)) {
574
            _data[v][k] = PathData(d, e);
575
          }
576
        }
577
      }
578
    }
579

	
580
    // Check early termination
581
    bool checkTermination(int k) {
582
      typedef std::pair<int, int> Pair;
583
      typename GR::template NodeMap<Pair> level(_gr, Pair(-1, 0));
584
      typename GR::template NodeMap<LargeCost> pi(_gr);
585
      int n = _nodes->size();
586
      LargeCost cost;
587
      int size;
588
      Node u;
589

	
590
      // Search for cycles that are already found
591
      _curr_found = false;
592
      for (int i = 0; i < n; ++i) {
593
        u = (*_nodes)[i];
594
        if (_data[u][k].dist == INF) continue;
595
        for (int j = k; j >= 0; --j) {
596
          if (level[u].first == i && level[u].second > 0) {
597
            // A cycle is found
598
            cost = _data[u][level[u].second].dist - _data[u][j].dist;
599
            size = level[u].second - j;
600
            if (!_curr_found || cost * _curr_size < _curr_cost * size) {
601
              _curr_cost = cost;
602
              _curr_size = size;
603
              _curr_node = u;
604
              _curr_level = level[u].second;
605
              _curr_found = true;
606
            }
607
          }
608
          level[u] = Pair(i, j);
609
          if (j != 0) {
610
            u = _gr.source(_data[u][j].pred);
611
          }
612
        }
613
      }
614

	
615
      // If at least one cycle is found, check the optimality condition
616
      LargeCost d;
617
      if (_curr_found && k < n) {
618
        // Find node potentials
619
        for (int i = 0; i < n; ++i) {
620
          u = (*_nodes)[i];
621
          pi[u] = INF;
622
          for (int j = 0; j <= k; ++j) {
623
            if (_data[u][j].dist < INF) {
624
              d = _data[u][j].dist * _curr_size - j * _curr_cost;
625
              if (_tolerance.less(d, pi[u])) pi[u] = d;
626
            }
627
          }
628
        }
629

	
630
        // Check the optimality condition for all arcs
631
        bool done = true;
632
        for (ArcIt a(_gr); a != INVALID; ++a) {
633
          if (_tolerance.less(_cost[a] * _curr_size - _curr_cost,
634
                              pi[_gr.target(a)] - pi[_gr.source(a)]) ) {
635
            done = false;
636
            break;
637
          }
638
        }
639
        return done;
640
      }
641
      return (k == n);
642
    }
643

	
644
  }; //class HartmannOrlinMmc
645

	
646
  ///@}
647

	
648
} //namespace lemon
649

	
650
#endif //LEMON_HARTMANN_ORLIN_MMC_H
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2010
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_HOWARD_MMC_H
20
#define LEMON_HOWARD_MMC_H
21

	
22
/// \ingroup min_mean_cycle
23
///
24
/// \file
25
/// \brief Howard's algorithm for finding a minimum mean cycle.
26

	
27
#include <vector>
28
#include <limits>
29
#include <lemon/core.h>
30
#include <lemon/path.h>
31
#include <lemon/tolerance.h>
32
#include <lemon/connectivity.h>
33

	
34
namespace lemon {
35

	
36
  /// \brief Default traits class of HowardMmc class.
37
  ///
38
  /// Default traits class of HowardMmc class.
39
  /// \tparam GR The type of the digraph.
40
  /// \tparam CM The type of the cost map.
41
  /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
42
#ifdef DOXYGEN
43
  template <typename GR, typename CM>
44
#else
45
  template <typename GR, typename CM,
46
    bool integer = std::numeric_limits<typename CM::Value>::is_integer>
47
#endif
48
  struct HowardMmcDefaultTraits
49
  {
50
    /// The type of the digraph
51
    typedef GR Digraph;
52
    /// The type of the cost map
53
    typedef CM CostMap;
54
    /// The type of the arc costs
55
    typedef typename CostMap::Value Cost;
56

	
57
    /// \brief The large cost type used for internal computations
58
    ///
59
    /// The large cost type used for internal computations.
60
    /// It is \c long \c long if the \c Cost type is integer,
61
    /// otherwise it is \c double.
62
    /// \c Cost must be convertible to \c LargeCost.
63
    typedef double LargeCost;
64

	
65
    /// The tolerance type used for internal computations
66
    typedef lemon::Tolerance<LargeCost> Tolerance;
67

	
68
    /// \brief The path type of the found cycles
69
    ///
70
    /// The path type of the found cycles.
71
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
72
    /// and it must have an \c addBack() function.
73
    typedef lemon::Path<Digraph> Path;
74
  };
75

	
76
  // Default traits class for integer cost types
77
  template <typename GR, typename CM>
78
  struct HowardMmcDefaultTraits<GR, CM, true>
79
  {
80
    typedef GR Digraph;
81
    typedef CM CostMap;
82
    typedef typename CostMap::Value Cost;
83
#ifdef LEMON_HAVE_LONG_LONG
84
    typedef long long LargeCost;
85
#else
86
    typedef long LargeCost;
87
#endif
88
    typedef lemon::Tolerance<LargeCost> Tolerance;
89
    typedef lemon::Path<Digraph> Path;
90
  };
91

	
92

	
93
  /// \addtogroup min_mean_cycle
94
  /// @{
95

	
96
  /// \brief Implementation of Howard's algorithm for finding a minimum
97
  /// mean cycle.
98
  ///
99
  /// This class implements Howard's policy iteration algorithm for finding
100
  /// a directed cycle of minimum mean cost in a digraph
101
  /// \ref amo93networkflows, \ref dasdan98minmeancycle.
102
  /// This class provides the most efficient algorithm for the
103
  /// minimum mean cycle problem, though the best known theoretical
104
  /// bound on its running time is exponential.
105
  ///
106
  /// \tparam GR The type of the digraph the algorithm runs on.
107
  /// \tparam CM The type of the cost map. The default
108
  /// map type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
109
  /// \tparam TR The traits class that defines various types used by the
110
  /// algorithm. By default, it is \ref HowardMmcDefaultTraits
111
  /// "HowardMmcDefaultTraits<GR, CM>".
112
  /// In most cases, this parameter should not be set directly,
113
  /// consider to use the named template parameters instead.
114
#ifdef DOXYGEN
115
  template <typename GR, typename CM, typename TR>
116
#else
117
  template < typename GR,
118
             typename CM = typename GR::template ArcMap<int>,
119
             typename TR = HowardMmcDefaultTraits<GR, CM> >
120
#endif
121
  class HowardMmc
122
  {
123
  public:
124

	
125
    /// The type of the digraph
126
    typedef typename TR::Digraph Digraph;
127
    /// The type of the cost map
128
    typedef typename TR::CostMap CostMap;
129
    /// The type of the arc costs
130
    typedef typename TR::Cost Cost;
131

	
132
    /// \brief The large cost type
133
    ///
134
    /// The large cost type used for internal computations.
135
    /// By default, it is \c long \c long if the \c Cost type is integer,
136
    /// otherwise it is \c double.
137
    typedef typename TR::LargeCost LargeCost;
138

	
139
    /// The tolerance type
140
    typedef typename TR::Tolerance Tolerance;
141

	
142
    /// \brief The path type of the found cycles
143
    ///
144
    /// The path type of the found cycles.
145
    /// Using the \ref HowardMmcDefaultTraits "default traits class",
146
    /// it is \ref lemon::Path "Path<Digraph>".
147
    typedef typename TR::Path Path;
148

	
149
    /// The \ref HowardMmcDefaultTraits "traits class" of the algorithm
150
    typedef TR Traits;
151

	
152
  private:
153

	
154
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
155

	
156
    // The digraph the algorithm runs on
157
    const Digraph &_gr;
158
    // The cost of the arcs
159
    const CostMap &_cost;
160

	
161
    // Data for the found cycles
162
    bool _curr_found, _best_found;
163
    LargeCost _curr_cost, _best_cost;
164
    int _curr_size, _best_size;
165
    Node _curr_node, _best_node;
166

	
167
    Path *_cycle_path;
168
    bool _local_path;
169

	
170
    // Internal data used by the algorithm
171
    typename Digraph::template NodeMap<Arc> _policy;
172
    typename Digraph::template NodeMap<bool> _reached;
173
    typename Digraph::template NodeMap<int> _level;
174
    typename Digraph::template NodeMap<LargeCost> _dist;
175

	
176
    // Data for storing the strongly connected components
177
    int _comp_num;
178
    typename Digraph::template NodeMap<int> _comp;
179
    std::vector<std::vector<Node> > _comp_nodes;
180
    std::vector<Node>* _nodes;
181
    typename Digraph::template NodeMap<std::vector<Arc> > _in_arcs;
182

	
183
    // Queue used for BFS search
184
    std::vector<Node> _queue;
185
    int _qfront, _qback;
186

	
187
    Tolerance _tolerance;
188

	
189
    // Infinite constant
190
    const LargeCost INF;
191

	
192
  public:
193

	
194
    /// \name Named Template Parameters
195
    /// @{
196

	
197
    template <typename T>
198
    struct SetLargeCostTraits : public Traits {
199
      typedef T LargeCost;
200
      typedef lemon::Tolerance<T> Tolerance;
201
    };
202

	
203
    /// \brief \ref named-templ-param "Named parameter" for setting
204
    /// \c LargeCost type.
205
    ///
206
    /// \ref named-templ-param "Named parameter" for setting \c LargeCost
207
    /// type. It is used for internal computations in the algorithm.
208
    template <typename T>
209
    struct SetLargeCost
210
      : public HowardMmc<GR, CM, SetLargeCostTraits<T> > {
211
      typedef HowardMmc<GR, CM, SetLargeCostTraits<T> > Create;
212
    };
213

	
214
    template <typename T>
215
    struct SetPathTraits : public Traits {
216
      typedef T Path;
217
    };
218

	
219
    /// \brief \ref named-templ-param "Named parameter" for setting
220
    /// \c %Path type.
221
    ///
222
    /// \ref named-templ-param "Named parameter" for setting the \c %Path
223
    /// type of the found cycles.
224
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
225
    /// and it must have an \c addBack() function.
226
    template <typename T>
227
    struct SetPath
228
      : public HowardMmc<GR, CM, SetPathTraits<T> > {
229
      typedef HowardMmc<GR, CM, SetPathTraits<T> > Create;
230
    };
231

	
232
    /// @}
233

	
234
  protected:
235

	
236
    HowardMmc() {}
237

	
238
  public:
239

	
240
    /// \brief Constructor.
241
    ///
242
    /// The constructor of the class.
243
    ///
244
    /// \param digraph The digraph the algorithm runs on.
245
    /// \param cost The costs of the arcs.
246
    HowardMmc( const Digraph &digraph,
247
               const CostMap &cost ) :
248
      _gr(digraph), _cost(cost), _best_found(false),
249
      _best_cost(0), _best_size(1), _cycle_path(NULL), _local_path(false),
250
      _policy(digraph), _reached(digraph), _level(digraph), _dist(digraph),
251
      _comp(digraph), _in_arcs(digraph),
252
      INF(std::numeric_limits<LargeCost>::has_infinity ?
253
          std::numeric_limits<LargeCost>::infinity() :
254
          std::numeric_limits<LargeCost>::max())
255
    {}
256

	
257
    /// Destructor.
258
    ~HowardMmc() {
259
      if (_local_path) delete _cycle_path;
260
    }
261

	
262
    /// \brief Set the path structure for storing the found cycle.
263
    ///
264
    /// This function sets an external path structure for storing the
265
    /// found cycle.
266
    ///
267
    /// If you don't call this function before calling \ref run() or
268
    /// \ref findCycleMean(), it will allocate a local \ref Path "path"
269
    /// structure. The destuctor deallocates this automatically
270
    /// allocated object, of course.
271
    ///
272
    /// \note The algorithm calls only the \ref lemon::Path::addBack()
273
    /// "addBack()" function of the given path structure.
274
    ///
275
    /// \return <tt>(*this)</tt>
276
    HowardMmc& cycle(Path &path) {
277
      if (_local_path) {
278
        delete _cycle_path;
279
        _local_path = false;
280
      }
281
      _cycle_path = &path;
282
      return *this;
283
    }
284

	
285
    /// \brief Set the tolerance used by the algorithm.
286
    ///
287
    /// This function sets the tolerance object used by the algorithm.
288
    ///
289
    /// \return <tt>(*this)</tt>
290
    HowardMmc& tolerance(const Tolerance& tolerance) {
291
      _tolerance = tolerance;
292
      return *this;
293
    }
294

	
295
    /// \brief Return a const reference to the tolerance.
296
    ///
297
    /// This function returns a const reference to the tolerance object
298
    /// used by the algorithm.
299
    const Tolerance& tolerance() const {
300
      return _tolerance;
301
    }
302

	
303
    /// \name Execution control
304
    /// The simplest way to execute the algorithm is to call the \ref run()
305
    /// function.\n
306
    /// If you only need the minimum mean cost, you may call
307
    /// \ref findCycleMean().
308

	
309
    /// @{
310

	
311
    /// \brief Run the algorithm.
312
    ///
313
    /// This function runs the algorithm.
314
    /// It can be called more than once (e.g. if the underlying digraph
315
    /// and/or the arc costs have been modified).
316
    ///
317
    /// \return \c true if a directed cycle exists in the digraph.
318
    ///
319
    /// \note <tt>mmc.run()</tt> is just a shortcut of the following code.
320
    /// \code
321
    ///   return mmc.findCycleMean() && mmc.findCycle();
322
    /// \endcode
323
    bool run() {
324
      return findCycleMean() && findCycle();
325
    }
326

	
327
    /// \brief Find the minimum cycle mean.
328
    ///
329
    /// This function finds the minimum mean cost of the directed
330
    /// cycles in the digraph.
331
    ///
332
    /// \return \c true if a directed cycle exists in the digraph.
333
    bool findCycleMean() {
334
      // Initialize and find strongly connected components
335
      init();
336
      findComponents();
337

	
338
      // Find the minimum cycle mean in the components
339
      for (int comp = 0; comp < _comp_num; ++comp) {
340
        // Find the minimum mean cycle in the current component
341
        if (!buildPolicyGraph(comp)) continue;
342
        while (true) {
343
          findPolicyCycle();
344
          if (!computeNodeDistances()) break;
345
        }
346
        // Update the best cycle (global minimum mean cycle)
347
        if ( _curr_found && (!_best_found ||
348
             _curr_cost * _best_size < _best_cost * _curr_size) ) {
349
          _best_found = true;
350
          _best_cost = _curr_cost;
351
          _best_size = _curr_size;
352
          _best_node = _curr_node;
353
        }
354
      }
355
      return _best_found;
356
    }
357

	
358
    /// \brief Find a minimum mean directed cycle.
359
    ///
360
    /// This function finds a directed cycle of minimum mean cost
361
    /// in the digraph using the data computed by findCycleMean().
362
    ///
363
    /// \return \c true if a directed cycle exists in the digraph.
364
    ///
365
    /// \pre \ref findCycleMean() must be called before using this function.
366
    bool findCycle() {
367
      if (!_best_found) return false;
368
      _cycle_path->addBack(_policy[_best_node]);
369
      for ( Node v = _best_node;
370
            (v = _gr.target(_policy[v])) != _best_node; ) {
371
        _cycle_path->addBack(_policy[v]);
372
      }
373
      return true;
374
    }
375

	
376
    /// @}
377

	
378
    /// \name Query Functions
379
    /// The results of the algorithm can be obtained using these
380
    /// functions.\n
381
    /// The algorithm should be executed before using them.
382

	
383
    /// @{
384

	
385
    /// \brief Return the total cost of the found cycle.
386
    ///
387
    /// This function returns the total cost of the found cycle.
388
    ///
389
    /// \pre \ref run() or \ref findCycleMean() must be called before
390
    /// using this function.
391
    Cost cycleCost() const {
392
      return static_cast<Cost>(_best_cost);
393
    }
394

	
395
    /// \brief Return the number of arcs on the found cycle.
396
    ///
397
    /// This function returns the number of arcs on the found cycle.
398
    ///
399
    /// \pre \ref run() or \ref findCycleMean() must be called before
400
    /// using this function.
401
    int cycleSize() const {
402
      return _best_size;
403
    }
404

	
405
    /// \brief Return the mean cost of the found cycle.
406
    ///
407
    /// This function returns the mean cost of the found cycle.
408
    ///
409
    /// \note <tt>alg.cycleMean()</tt> is just a shortcut of the
410
    /// following code.
411
    /// \code
412
    ///   return static_cast<double>(alg.cycleCost()) / alg.cycleSize();
413
    /// \endcode
414
    ///
415
    /// \pre \ref run() or \ref findCycleMean() must be called before
416
    /// using this function.
417
    double cycleMean() const {
418
      return static_cast<double>(_best_cost) / _best_size;
419
    }
420

	
421
    /// \brief Return the found cycle.
422
    ///
423
    /// This function returns a const reference to the path structure
424
    /// storing the found cycle.
425
    ///
426
    /// \pre \ref run() or \ref findCycle() must be called before using
427
    /// this function.
428
    const Path& cycle() const {
429
      return *_cycle_path;
430
    }
431

	
432
    ///@}
433

	
434
  private:
435

	
436
    // Initialize
437
    void init() {
438
      if (!_cycle_path) {
439
        _local_path = true;
440
        _cycle_path = new Path;
441
      }
442
      _queue.resize(countNodes(_gr));
443
      _best_found = false;
444
      _best_cost = 0;
445
      _best_size = 1;
446
      _cycle_path->clear();
447
    }
448

	
449
    // Find strongly connected components and initialize _comp_nodes
450
    // and _in_arcs
451
    void findComponents() {
452
      _comp_num = stronglyConnectedComponents(_gr, _comp);
453
      _comp_nodes.resize(_comp_num);
454
      if (_comp_num == 1) {
455
        _comp_nodes[0].clear();
456
        for (NodeIt n(_gr); n != INVALID; ++n) {
457
          _comp_nodes[0].push_back(n);
458
          _in_arcs[n].clear();
459
          for (InArcIt a(_gr, n); a != INVALID; ++a) {
460
            _in_arcs[n].push_back(a);
461
          }
462
        }
463
      } else {
464
        for (int i = 0; i < _comp_num; ++i)
465
          _comp_nodes[i].clear();
466
        for (NodeIt n(_gr); n != INVALID; ++n) {
467
          int k = _comp[n];
468
          _comp_nodes[k].push_back(n);
469
          _in_arcs[n].clear();
470
          for (InArcIt a(_gr, n); a != INVALID; ++a) {
471
            if (_comp[_gr.source(a)] == k) _in_arcs[n].push_back(a);
472
          }
473
        }
474
      }
475
    }
476

	
477
    // Build the policy graph in the given strongly connected component
478
    // (the out-degree of every node is 1)
479
    bool buildPolicyGraph(int comp) {
480
      _nodes = &(_comp_nodes[comp]);
481
      if (_nodes->size() < 1 ||
482
          (_nodes->size() == 1 && _in_arcs[(*_nodes)[0]].size() == 0)) {
483
        return false;
484
      }
485
      for (int i = 0; i < int(_nodes->size()); ++i) {
486
        _dist[(*_nodes)[i]] = INF;
487
      }
488
      Node u, v;
489
      Arc e;
490
      for (int i = 0; i < int(_nodes->size()); ++i) {
491
        v = (*_nodes)[i];
492
        for (int j = 0; j < int(_in_arcs[v].size()); ++j) {
493
          e = _in_arcs[v][j];
494
          u = _gr.source(e);
495
          if (_cost[e] < _dist[u]) {
496
            _dist[u] = _cost[e];
497
            _policy[u] = e;
498
          }
499
        }
500
      }
501
      return true;
502
    }
503

	
504
    // Find the minimum mean cycle in the policy graph
505
    void findPolicyCycle() {
506
      for (int i = 0; i < int(_nodes->size()); ++i) {
507
        _level[(*_nodes)[i]] = -1;
508
      }
509
      LargeCost ccost;
510
      int csize;
511
      Node u, v;
512
      _curr_found = false;
513
      for (int i = 0; i < int(_nodes->size()); ++i) {
514
        u = (*_nodes)[i];
515
        if (_level[u] >= 0) continue;
516
        for (; _level[u] < 0; u = _gr.target(_policy[u])) {
517
          _level[u] = i;
518
        }
519
        if (_level[u] == i) {
520
          // A cycle is found
521
          ccost = _cost[_policy[u]];
522
          csize = 1;
523
          for (v = u; (v = _gr.target(_policy[v])) != u; ) {
524
            ccost += _cost[_policy[v]];
525
            ++csize;
526
          }
527
          if ( !_curr_found ||
528
               (ccost * _curr_size < _curr_cost * csize) ) {
529
            _curr_found = true;
530
            _curr_cost = ccost;
531
            _curr_size = csize;
532
            _curr_node = u;
533
          }
534
        }
535
      }
536
    }
537

	
538
    // Contract the policy graph and compute node distances
539
    bool computeNodeDistances() {
540
      // Find the component of the main cycle and compute node distances
541
      // using reverse BFS
542
      for (int i = 0; i < int(_nodes->size()); ++i) {
543
        _reached[(*_nodes)[i]] = false;
544
      }
545
      _qfront = _qback = 0;
546
      _queue[0] = _curr_node;
547
      _reached[_curr_node] = true;
548
      _dist[_curr_node] = 0;
549
      Node u, v;
550
      Arc e;
551
      while (_qfront <= _qback) {
552
        v = _queue[_qfront++];
553
        for (int j = 0; j < int(_in_arcs[v].size()); ++j) {
554
          e = _in_arcs[v][j];
555
          u = _gr.source(e);
556
          if (_policy[u] == e && !_reached[u]) {
557
            _reached[u] = true;
558
            _dist[u] = _dist[v] + _cost[e] * _curr_size - _curr_cost;
559
            _queue[++_qback] = u;
560
          }
561
        }
562
      }
563

	
564
      // Connect all other nodes to this component and compute node
565
      // distances using reverse BFS
566
      _qfront = 0;
567
      while (_qback < int(_nodes->size())-1) {
568
        v = _queue[_qfront++];
569
        for (int j = 0; j < int(_in_arcs[v].size()); ++j) {
570
          e = _in_arcs[v][j];
571
          u = _gr.source(e);
572
          if (!_reached[u]) {
573
            _reached[u] = true;
574
            _policy[u] = e;
575
            _dist[u] = _dist[v] + _cost[e] * _curr_size - _curr_cost;
576
            _queue[++_qback] = u;
577
          }
578
        }
579
      }
580

	
581
      // Improve node distances
582
      bool improved = false;
583
      for (int i = 0; i < int(_nodes->size()); ++i) {
584
        v = (*_nodes)[i];
585
        for (int j = 0; j < int(_in_arcs[v].size()); ++j) {
586
          e = _in_arcs[v][j];
587
          u = _gr.source(e);
588
          LargeCost delta = _dist[v] + _cost[e] * _curr_size - _curr_cost;
589
          if (_tolerance.less(delta, _dist[u])) {
590
            _dist[u] = delta;
591
            _policy[u] = e;
592
            improved = true;
593
          }
594
        }
595
      }
596
      return improved;
597
    }
598

	
599
  }; //class HowardMmc
600

	
601
  ///@}
602

	
603
} //namespace lemon
604

	
605
#endif //LEMON_HOWARD_MMC_H
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2010
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_KARP_MMC_H
20
#define LEMON_KARP_MMC_H
21

	
22
/// \ingroup min_mean_cycle
23
///
24
/// \file
25
/// \brief Karp's algorithm for finding a minimum mean cycle.
26

	
27
#include <vector>
28
#include <limits>
29
#include <lemon/core.h>
30
#include <lemon/path.h>
31
#include <lemon/tolerance.h>
32
#include <lemon/connectivity.h>
33

	
34
namespace lemon {
35

	
36
  /// \brief Default traits class of KarpMmc class.
37
  ///
38
  /// Default traits class of KarpMmc class.
39
  /// \tparam GR The type of the digraph.
40
  /// \tparam CM The type of the cost map.
41
  /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
42
#ifdef DOXYGEN
43
  template <typename GR, typename CM>
44
#else
45
  template <typename GR, typename CM,
46
    bool integer = std::numeric_limits<typename CM::Value>::is_integer>
47
#endif
48
  struct KarpMmcDefaultTraits
49
  {
50
    /// The type of the digraph
51
    typedef GR Digraph;
52
    /// The type of the cost map
53
    typedef CM CostMap;
54
    /// The type of the arc costs
55
    typedef typename CostMap::Value Cost;
56

	
57
    /// \brief The large cost type used for internal computations
58
    ///
59
    /// The large cost type used for internal computations.
60
    /// It is \c long \c long if the \c Cost type is integer,
61
    /// otherwise it is \c double.
62
    /// \c Cost must be convertible to \c LargeCost.
63
    typedef double LargeCost;
64

	
65
    /// The tolerance type used for internal computations
66
    typedef lemon::Tolerance<LargeCost> Tolerance;
67

	
68
    /// \brief The path type of the found cycles
69
    ///
70
    /// The path type of the found cycles.
71
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
72
    /// and it must have an \c addFront() function.
73
    typedef lemon::Path<Digraph> Path;
74
  };
75

	
76
  // Default traits class for integer cost types
77
  template <typename GR, typename CM>
78
  struct KarpMmcDefaultTraits<GR, CM, true>
79
  {
80
    typedef GR Digraph;
81
    typedef CM CostMap;
82
    typedef typename CostMap::Value Cost;
83
#ifdef LEMON_HAVE_LONG_LONG
84
    typedef long long LargeCost;
85
#else
86
    typedef long LargeCost;
87
#endif
88
    typedef lemon::Tolerance<LargeCost> Tolerance;
89
    typedef lemon::Path<Digraph> Path;
90
  };
91

	
92

	
93
  /// \addtogroup min_mean_cycle
94
  /// @{
95

	
96
  /// \brief Implementation of Karp's algorithm for finding a minimum
97
  /// mean cycle.
98
  ///
99
  /// This class implements Karp's algorithm for finding a directed
100
  /// cycle of minimum mean cost in a digraph
101
  /// \ref amo93networkflows, \ref dasdan98minmeancycle.
102
  /// It runs in time O(ne) and uses space O(n<sup>2</sup>+e).
103
  ///
104
  /// \tparam GR The type of the digraph the algorithm runs on.
105
  /// \tparam CM The type of the cost map. The default
106
  /// map type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
107
  /// \tparam TR The traits class that defines various types used by the
108
  /// algorithm. By default, it is \ref KarpMmcDefaultTraits
109
  /// "KarpMmcDefaultTraits<GR, CM>".
110
  /// In most cases, this parameter should not be set directly,
111
  /// consider to use the named template parameters instead.
112
#ifdef DOXYGEN
113
  template <typename GR, typename CM, typename TR>
114
#else
115
  template < typename GR,
116
             typename CM = typename GR::template ArcMap<int>,
117
             typename TR = KarpMmcDefaultTraits<GR, CM> >
118
#endif
119
  class KarpMmc
120
  {
121
  public:
122

	
123
    /// The type of the digraph
124
    typedef typename TR::Digraph Digraph;
125
    /// The type of the cost map
126
    typedef typename TR::CostMap CostMap;
127
    /// The type of the arc costs
128
    typedef typename TR::Cost Cost;
129

	
130
    /// \brief The large cost type
131
    ///
132
    /// The large cost type used for internal computations.
133
    /// By default, it is \c long \c long if the \c Cost type is integer,
134
    /// otherwise it is \c double.
135
    typedef typename TR::LargeCost LargeCost;
136

	
137
    /// The tolerance type
138
    typedef typename TR::Tolerance Tolerance;
139

	
140
    /// \brief The path type of the found cycles
141
    ///
142
    /// The path type of the found cycles.
143
    /// Using the \ref KarpMmcDefaultTraits "default traits class",
144
    /// it is \ref lemon::Path "Path<Digraph>".
145
    typedef typename TR::Path Path;
146

	
147
    /// The \ref KarpMmcDefaultTraits "traits class" of the algorithm
148
    typedef TR Traits;
149

	
150
  private:
151

	
152
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
153

	
154
    // Data sturcture for path data
155
    struct PathData
156
    {
157
      LargeCost dist;
158
      Arc pred;
159
      PathData(LargeCost d, Arc p = INVALID) :
160
        dist(d), pred(p) {}
161
    };
162

	
163
    typedef typename Digraph::template NodeMap<std::vector<PathData> >
164
      PathDataNodeMap;
165

	
166
  private:
167

	
168
    // The digraph the algorithm runs on
169
    const Digraph &_gr;
170
    // The cost of the arcs
171
    const CostMap &_cost;
172

	
173
    // Data for storing the strongly connected components
174
    int _comp_num;
175
    typename Digraph::template NodeMap<int> _comp;
176
    std::vector<std::vector<Node> > _comp_nodes;
177
    std::vector<Node>* _nodes;
178
    typename Digraph::template NodeMap<std::vector<Arc> > _out_arcs;
179

	
180
    // Data for the found cycle
181
    LargeCost _cycle_cost;
182
    int _cycle_size;
183
    Node _cycle_node;
184

	
185
    Path *_cycle_path;
186
    bool _local_path;
187

	
188
    // Node map for storing path data
189
    PathDataNodeMap _data;
190
    // The processed nodes in the last round
191
    std::vector<Node> _process;
192

	
193
    Tolerance _tolerance;
194

	
195
    // Infinite constant
196
    const LargeCost INF;
197

	
198
  public:
199

	
200
    /// \name Named Template Parameters
201
    /// @{
202

	
203
    template <typename T>
204
    struct SetLargeCostTraits : public Traits {
205
      typedef T LargeCost;
206
      typedef lemon::Tolerance<T> Tolerance;
207
    };
208

	
209
    /// \brief \ref named-templ-param "Named parameter" for setting
210
    /// \c LargeCost type.
211
    ///
212
    /// \ref named-templ-param "Named parameter" for setting \c LargeCost
213
    /// type. It is used for internal computations in the algorithm.
214
    template <typename T>
215
    struct SetLargeCost
216
      : public KarpMmc<GR, CM, SetLargeCostTraits<T> > {
217
      typedef KarpMmc<GR, CM, SetLargeCostTraits<T> > Create;
218
    };
219

	
220
    template <typename T>
221
    struct SetPathTraits : public Traits {
222
      typedef T Path;
223
    };
224

	
225
    /// \brief \ref named-templ-param "Named parameter" for setting
226
    /// \c %Path type.
227
    ///
228
    /// \ref named-templ-param "Named parameter" for setting the \c %Path
229
    /// type of the found cycles.
230
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
231
    /// and it must have an \c addFront() function.
232
    template <typename T>
233
    struct SetPath
234
      : public KarpMmc<GR, CM, SetPathTraits<T> > {
235
      typedef KarpMmc<GR, CM, SetPathTraits<T> > Create;
236
    };
237

	
238
    /// @}
239

	
240
  protected:
241

	
242
    KarpMmc() {}
243

	
244
  public:
245

	
246
    /// \brief Constructor.
247
    ///
248
    /// The constructor of the class.
249
    ///
250
    /// \param digraph The digraph the algorithm runs on.
251
    /// \param cost The costs of the arcs.
252
    KarpMmc( const Digraph &digraph,
253
             const CostMap &cost ) :
254
      _gr(digraph), _cost(cost), _comp(digraph), _out_arcs(digraph),
255
      _cycle_cost(0), _cycle_size(1), _cycle_node(INVALID),
256
      _cycle_path(NULL), _local_path(false), _data(digraph),
257
      INF(std::numeric_limits<LargeCost>::has_infinity ?
258
          std::numeric_limits<LargeCost>::infinity() :
259
          std::numeric_limits<LargeCost>::max())
260
    {}
261

	
262
    /// Destructor.
263
    ~KarpMmc() {
264
      if (_local_path) delete _cycle_path;
265
    }
266

	
267
    /// \brief Set the path structure for storing the found cycle.
268
    ///
269
    /// This function sets an external path structure for storing the
270
    /// found cycle.
271
    ///
272
    /// If you don't call this function before calling \ref run() or
273
    /// \ref findCycleMean(), it will allocate a local \ref Path "path"
274
    /// structure. The destuctor deallocates this automatically
275
    /// allocated object, of course.
276
    ///
277
    /// \note The algorithm calls only the \ref lemon::Path::addFront()
278
    /// "addFront()" function of the given path structure.
279
    ///
280
    /// \return <tt>(*this)</tt>
281
    KarpMmc& cycle(Path &path) {
282
      if (_local_path) {
283
        delete _cycle_path;
284
        _local_path = false;
285
      }
286
      _cycle_path = &path;
287
      return *this;
288
    }
289

	
290
    /// \brief Set the tolerance used by the algorithm.
291
    ///
292
    /// This function sets the tolerance object used by the algorithm.
293
    ///
294
    /// \return <tt>(*this)</tt>
295
    KarpMmc& tolerance(const Tolerance& tolerance) {
296
      _tolerance = tolerance;
297
      return *this;
298
    }
299

	
300
    /// \brief Return a const reference to the tolerance.
301
    ///
302
    /// This function returns a const reference to the tolerance object
303
    /// used by the algorithm.
304
    const Tolerance& tolerance() const {
305
      return _tolerance;
306
    }
307

	
308
    /// \name Execution control
309
    /// The simplest way to execute the algorithm is to call the \ref run()
310
    /// function.\n
311
    /// If you only need the minimum mean cost, you may call
312
    /// \ref findCycleMean().
313

	
314
    /// @{
315

	
316
    /// \brief Run the algorithm.
317
    ///
318
    /// This function runs the algorithm.
319
    /// It can be called more than once (e.g. if the underlying digraph
320
    /// and/or the arc costs have been modified).
321
    ///
322
    /// \return \c true if a directed cycle exists in the digraph.
323
    ///
324
    /// \note <tt>mmc.run()</tt> is just a shortcut of the following code.
325
    /// \code
326
    ///   return mmc.findCycleMean() && mmc.findCycle();
327
    /// \endcode
328
    bool run() {
329
      return findCycleMean() && findCycle();
330
    }
331

	
332
    /// \brief Find the minimum cycle mean.
333
    ///
334
    /// This function finds the minimum mean cost of the directed
335
    /// cycles in the digraph.
336
    ///
337
    /// \return \c true if a directed cycle exists in the digraph.
338
    bool findCycleMean() {
339
      // Initialization and find strongly connected components
340
      init();
341
      findComponents();
342

	
343
      // Find the minimum cycle mean in the components
344
      for (int comp = 0; comp < _comp_num; ++comp) {
345
        if (!initComponent(comp)) continue;
346
        processRounds();
347
        updateMinMean();
348
      }
349
      return (_cycle_node != INVALID);
350
    }
351

	
352
    /// \brief Find a minimum mean directed cycle.
353
    ///
354
    /// This function finds a directed cycle of minimum mean cost
355
    /// in the digraph using the data computed by findCycleMean().
356
    ///
357
    /// \return \c true if a directed cycle exists in the digraph.
358
    ///
359
    /// \pre \ref findCycleMean() must be called before using this function.
360
    bool findCycle() {
361
      if (_cycle_node == INVALID) return false;
362
      IntNodeMap reached(_gr, -1);
363
      int r = _data[_cycle_node].size();
364
      Node u = _cycle_node;
365
      while (reached[u] < 0) {
366
        reached[u] = --r;
367
        u = _gr.source(_data[u][r].pred);
368
      }
369
      r = reached[u];
370
      Arc e = _data[u][r].pred;
371
      _cycle_path->addFront(e);
372
      _cycle_cost = _cost[e];
373
      _cycle_size = 1;
374
      Node v;
375
      while ((v = _gr.source(e)) != u) {
376
        e = _data[v][--r].pred;
377
        _cycle_path->addFront(e);
378
        _cycle_cost += _cost[e];
379
        ++_cycle_size;
380
      }
381
      return true;
382
    }
383

	
384
    /// @}
385

	
386
    /// \name Query Functions
387
    /// The results of the algorithm can be obtained using these
388
    /// functions.\n
389
    /// The algorithm should be executed before using them.
390

	
391
    /// @{
392

	
393
    /// \brief Return the total cost of the found cycle.
394
    ///
395
    /// This function returns the total cost of the found cycle.
396
    ///
397
    /// \pre \ref run() or \ref findCycleMean() must be called before
398
    /// using this function.
399
    Cost cycleCost() const {
400
      return static_cast<Cost>(_cycle_cost);
401
    }
402

	
403
    /// \brief Return the number of arcs on the found cycle.
404
    ///
405
    /// This function returns the number of arcs on the found cycle.
406
    ///
407
    /// \pre \ref run() or \ref findCycleMean() must be called before
408
    /// using this function.
409
    int cycleSize() const {
410
      return _cycle_size;
411
    }
412

	
413
    /// \brief Return the mean cost of the found cycle.
414
    ///
415
    /// This function returns the mean cost of the found cycle.
416
    ///
417
    /// \note <tt>alg.cycleMean()</tt> is just a shortcut of the
418
    /// following code.
419
    /// \code
420
    ///   return static_cast<double>(alg.cycleCost()) / alg.cycleSize();
421
    /// \endcode
422
    ///
423
    /// \pre \ref run() or \ref findCycleMean() must be called before
424
    /// using this function.
425
    double cycleMean() const {
426
      return static_cast<double>(_cycle_cost) / _cycle_size;
427
    }
428

	
429
    /// \brief Return the found cycle.
430
    ///
431
    /// This function returns a const reference to the path structure
432
    /// storing the found cycle.
433
    ///
434
    /// \pre \ref run() or \ref findCycle() must be called before using
435
    /// this function.
436
    const Path& cycle() const {
437
      return *_cycle_path;
438
    }
439

	
440
    ///@}
441

	
442
  private:
443

	
444
    // Initialization
445
    void init() {
446
      if (!_cycle_path) {
447
        _local_path = true;
448
        _cycle_path = new Path;
449
      }
450
      _cycle_path->clear();
451
      _cycle_cost = 0;
452
      _cycle_size = 1;
453
      _cycle_node = INVALID;
454
      for (NodeIt u(_gr); u != INVALID; ++u)
455
        _data[u].clear();
456
    }
457

	
458
    // Find strongly connected components and initialize _comp_nodes
459
    // and _out_arcs
460
    void findComponents() {
461
      _comp_num = stronglyConnectedComponents(_gr, _comp);
462
      _comp_nodes.resize(_comp_num);
463
      if (_comp_num == 1) {
464
        _comp_nodes[0].clear();
465
        for (NodeIt n(_gr); n != INVALID; ++n) {
466
          _comp_nodes[0].push_back(n);
467
          _out_arcs[n].clear();
468
          for (OutArcIt a(_gr, n); a != INVALID; ++a) {
469
            _out_arcs[n].push_back(a);
470
          }
471
        }
472
      } else {
473
        for (int i = 0; i < _comp_num; ++i)
474
          _comp_nodes[i].clear();
475
        for (NodeIt n(_gr); n != INVALID; ++n) {
476
          int k = _comp[n];
477
          _comp_nodes[k].push_back(n);
478
          _out_arcs[n].clear();
479
          for (OutArcIt a(_gr, n); a != INVALID; ++a) {
480
            if (_comp[_gr.target(a)] == k) _out_arcs[n].push_back(a);
481
          }
482
        }
483
      }
484
    }
485

	
486
    // Initialize path data for the current component
487
    bool initComponent(int comp) {
488
      _nodes = &(_comp_nodes[comp]);
489
      int n = _nodes->size();
490
      if (n < 1 || (n == 1 && _out_arcs[(*_nodes)[0]].size() == 0)) {
491
        return false;
492
      }
493
      for (int i = 0; i < n; ++i) {
494
        _data[(*_nodes)[i]].resize(n + 1, PathData(INF));
495
      }
496
      return true;
497
    }
498

	
499
    // Process all rounds of computing path data for the current component.
500
    // _data[v][k] is the cost of a shortest directed walk from the root
501
    // node to node v containing exactly k arcs.
502
    void processRounds() {
503
      Node start = (*_nodes)[0];
504
      _data[start][0] = PathData(0);
505
      _process.clear();
506
      _process.push_back(start);
507

	
508
      int k, n = _nodes->size();
509
      for (k = 1; k <= n && int(_process.size()) < n; ++k) {
510
        processNextBuildRound(k);
511
      }
512
      for ( ; k <= n; ++k) {
513
        processNextFullRound(k);
514
      }
515
    }
516

	
517
    // Process one round and rebuild _process
518
    void processNextBuildRound(int k) {
519
      std::vector<Node> next;
520
      Node u, v;
521
      Arc e;
522
      LargeCost d;
523
      for (int i = 0; i < int(_process.size()); ++i) {
524
        u = _process[i];
525
        for (int j = 0; j < int(_out_arcs[u].size()); ++j) {
526
          e = _out_arcs[u][j];
527
          v = _gr.target(e);
528
          d = _data[u][k-1].dist + _cost[e];
529
          if (_tolerance.less(d, _data[v][k].dist)) {
530
            if (_data[v][k].dist == INF) next.push_back(v);
531
            _data[v][k] = PathData(d, e);
532
          }
533
        }
534
      }
535
      _process.swap(next);
536
    }
537

	
538
    // Process one round using _nodes instead of _process
539
    void processNextFullRound(int k) {
540
      Node u, v;
541
      Arc e;
542
      LargeCost d;
543
      for (int i = 0; i < int(_nodes->size()); ++i) {
544
        u = (*_nodes)[i];
545
        for (int j = 0; j < int(_out_arcs[u].size()); ++j) {
546
          e = _out_arcs[u][j];
547
          v = _gr.target(e);
548
          d = _data[u][k-1].dist + _cost[e];
549
          if (_tolerance.less(d, _data[v][k].dist)) {
550
            _data[v][k] = PathData(d, e);
551
          }
552
        }
553
      }
554
    }
555

	
556
    // Update the minimum cycle mean
557
    void updateMinMean() {
558
      int n = _nodes->size();
559
      for (int i = 0; i < n; ++i) {
560
        Node u = (*_nodes)[i];
561
        if (_data[u][n].dist == INF) continue;
562
        LargeCost cost, max_cost = 0;
563
        int size, max_size = 1;
564
        bool found_curr = false;
565
        for (int k = 0; k < n; ++k) {
566
          if (_data[u][k].dist == INF) continue;
567
          cost = _data[u][n].dist - _data[u][k].dist;
568
          size = n - k;
569
          if (!found_curr || cost * max_size > max_cost * size) {
570
            found_curr = true;
571
            max_cost = cost;
572
            max_size = size;
573
          }
574
        }
575
        if ( found_curr && (_cycle_node == INVALID ||
576
             max_cost * _cycle_size < _cycle_cost * max_size) ) {
577
          _cycle_cost = max_cost;
578
          _cycle_size = max_size;
579
          _cycle_node = u;
580
        }
581
      }
582
    }
583

	
584
  }; //class KarpMmc
585

	
586
  ///@}
587

	
588
} //namespace lemon
589

	
590
#endif //LEMON_KARP_MMC_H
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2009
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_PAIRING_HEAP_H
20
#define LEMON_PAIRING_HEAP_H
21

	
22
///\file
23
///\ingroup heaps
24
///\brief Pairing heap implementation.
25

	
26
#include <vector>
27
#include <utility>
28
#include <functional>
29
#include <lemon/math.h>
30

	
31
namespace lemon {
32

	
33
  /// \ingroup heaps
34
  ///
35
  ///\brief Pairing Heap.
36
  ///
37
  /// This class implements the \e pairing \e heap data structure.
38
  /// It fully conforms to the \ref concepts::Heap "heap concept".
39
  ///
40
  /// The methods \ref increase() and \ref erase() are not efficient
41
  /// in a pairing heap. In case of many calls of these operations,
42
  /// it is better to use other heap structure, e.g. \ref BinHeap
43
  /// "binary heap".
44
  ///
45
  /// \tparam PR Type of the priorities of the items.
46
  /// \tparam IM A read-writable item map with \c int values, used
47
  /// internally to handle the cross references.
48
  /// \tparam CMP A functor class for comparing the priorities.
49
  /// The default is \c std::less<PR>.
50
#ifdef DOXYGEN
51
  template <typename PR, typename IM, typename CMP>
52
#else
53
  template <typename PR, typename IM, typename CMP = std::less<PR> >
54
#endif
55
  class PairingHeap {
56
  public:
57
    /// Type of the item-int map.
58
    typedef IM ItemIntMap;
59
    /// Type of the priorities.
60
    typedef PR Prio;
61
    /// Type of the items stored in the heap.
62
    typedef typename ItemIntMap::Key Item;
63
    /// Functor type for comparing the priorities.
64
    typedef CMP Compare;
65

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

	
80
  private:
81
    class store;
82

	
83
    std::vector<store> _data;
84
    int _min;
85
    ItemIntMap &_iim;
86
    Compare _comp;
87
    int _num_items;
88

	
89
  public:
90
    /// \brief Constructor.
91
    ///
92
    /// Constructor.
93
    /// \param map A map that assigns \c int values to the items.
94
    /// It is used internally to handle the cross references.
95
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
96
    explicit PairingHeap(ItemIntMap &map)
97
      : _min(0), _iim(map), _num_items(0) {}
98

	
99
    /// \brief Constructor.
100
    ///
101
    /// Constructor.
102
    /// \param map A map that assigns \c int values to the items.
103
    /// It is used internally to handle the cross references.
104
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
105
    /// \param comp The function object used for comparing the priorities.
106
    PairingHeap(ItemIntMap &map, const Compare &comp)
107
      : _min(0), _iim(map), _comp(comp), _num_items(0) {}
108

	
109
    /// \brief The number of items stored in the heap.
110
    ///
111
    /// This function returns the number of items stored in the heap.
112
    int size() const { return _num_items; }
113

	
114
    /// \brief Check if the heap is empty.
115
    ///
116
    /// This function returns \c true if the heap is empty.
117
    bool empty() const { return _num_items==0; }
118

	
119
    /// \brief Make the heap empty.
120
    ///
121
    /// This functon makes the heap empty.
122
    /// It does not change the cross reference map. If you want to reuse
123
    /// a heap that is not surely empty, you should first clear it and
124
    /// then you should set the cross reference map to \c PRE_HEAP
125
    /// for each item.
126
    void clear() {
127
      _data.clear();
128
      _min = 0;
129
      _num_items = 0;
130
    }
131

	
132
    /// \brief Set the priority of an item or insert it, if it is
133
    /// not stored in the heap.
134
    ///
135
    /// This method sets the priority of the given item if it is
136
    /// already stored in the heap. Otherwise it inserts the given
137
    /// item into the heap with the given priority.
138
    /// \param item The item.
139
    /// \param value The priority.
140
    void set (const Item& item, const Prio& value) {
141
      int i=_iim[item];
142
      if ( i>=0 && _data[i].in ) {
143
        if ( _comp(value, _data[i].prio) ) decrease(item, value);
144
        if ( _comp(_data[i].prio, value) ) increase(item, value);
145
      } else push(item, value);
146
    }
147

	
148
    /// \brief Insert an item into the heap with the given priority.
149
    ///
150
    /// This function inserts the given item into the heap with the
151
    /// given priority.
152
    /// \param item The item to insert.
153
    /// \param value The priority of the item.
154
    /// \pre \e item must not be stored in the heap.
155
    void push (const Item& item, const Prio& value) {
156
      int i=_iim[item];
157
      if( i<0 ) {
158
        int s=_data.size();
159
        _iim.set(item, s);
160
        store st;
161
        st.name=item;
162
        _data.push_back(st);
163
        i=s;
164
      } else {
165
        _data[i].parent=_data[i].child=-1;
166
        _data[i].left_child=false;
167
        _data[i].degree=0;
168
        _data[i].in=true;
169
      }
170

	
171
      _data[i].prio=value;
172

	
173
      if ( _num_items!=0 ) {
174
        if ( _comp( value, _data[_min].prio) ) {
175
          fuse(i,_min);
176
          _min=i;
177
        }
178
        else fuse(_min,i);
179
      }
180
      else _min=i;
181

	
182
      ++_num_items;
183
    }
184

	
185
    /// \brief Return the item having minimum priority.
186
    ///
187
    /// This function returns the item having minimum priority.
188
    /// \pre The heap must be non-empty.
189
    Item top() const { return _data[_min].name; }
190

	
191
    /// \brief The minimum priority.
192
    ///
193
    /// This function returns the minimum priority.
194
    /// \pre The heap must be non-empty.
195
    const Prio& prio() const { return _data[_min].prio; }
196

	
197
    /// \brief The priority of the given item.
198
    ///
199
    /// This function returns the priority of the given item.
200
    /// \param item The item.
201
    /// \pre \e item must be in the heap.
202
    const Prio& operator[](const Item& item) const {
203
      return _data[_iim[item]].prio;
204
    }
205

	
206
    /// \brief Remove the item having minimum priority.
207
    ///
208
    /// This function removes the item having minimum priority.
209
    /// \pre The heap must be non-empty.
210
    void pop() {
211
      std::vector<int> trees;
212
      int i=0, child_right = 0;
213
      _data[_min].in=false;
214

	
215
      if( -1!=_data[_min].child ) {
216
        i=_data[_min].child;
217
        trees.push_back(i);
218
        _data[i].parent = -1;
219
        _data[_min].child = -1;
220

	
221
        int ch=-1;
222
        while( _data[i].child!=-1 ) {
223
          ch=_data[i].child;
224
          if( _data[ch].left_child && i==_data[ch].parent ) {
225
            break;
226
          } else {
227
            if( _data[ch].left_child ) {
228
              child_right=_data[ch].parent;
229
              _data[ch].parent = i;
230
              --_data[i].degree;
231
            }
232
            else {
233
              child_right=ch;
234
              _data[i].child=-1;
235
              _data[i].degree=0;
236
            }
237
            _data[child_right].parent = -1;
238
            trees.push_back(child_right);
239
            i = child_right;
240
          }
241
        }
242

	
243
        int num_child = trees.size();
244
        int other;
245
        for( i=0; i<num_child-1; i+=2 ) {
246
          if ( !_comp(_data[trees[i]].prio, _data[trees[i+1]].prio) ) {
247
            other=trees[i];
248
            trees[i]=trees[i+1];
249
            trees[i+1]=other;
250
          }
251
          fuse( trees[i], trees[i+1] );
252
        }
253

	
254
        i = (0==(num_child % 2)) ? num_child-2 : num_child-1;
255
        while(i>=2) {
256
          if ( _comp(_data[trees[i]].prio, _data[trees[i-2]].prio) ) {
257
            other=trees[i];
258
            trees[i]=trees[i-2];
259
            trees[i-2]=other;
260
          }
261
          fuse( trees[i-2], trees[i] );
262
          i-=2;
263
        }
264
        _min = trees[0];
265
      }
266
      else {
267
        _min = _data[_min].child;
268
      }
269

	
270
      if (_min >= 0) _data[_min].left_child = false;
271
      --_num_items;
272
    }
273

	
274
    /// \brief Remove the given item from the heap.
275
    ///
276
    /// This function removes the given item from the heap if it is
277
    /// already stored.
278
    /// \param item The item to delete.
279
    /// \pre \e item must be in the heap.
280
    void erase (const Item& item) {
281
      int i=_iim[item];
282
      if ( i>=0 && _data[i].in ) {
283
        decrease( item, _data[_min].prio-1 );
284
        pop();
285
      }
286
    }
287

	
288
    /// \brief Decrease the priority of an item to the given value.
289
    ///
290
    /// This function decreases the priority of an item to the given value.
291
    /// \param item The item.
292
    /// \param value The priority.
293
    /// \pre \e item must be stored in the heap with priority at least \e value.
294
    void decrease (Item item, const Prio& value) {
295
      int i=_iim[item];
296
      _data[i].prio=value;
297
      int p=_data[i].parent;
298

	
299
      if( _data[i].left_child && i!=_data[p].child ) {
300
        p=_data[p].parent;
301
      }
302

	
303
      if ( p!=-1 && _comp(value,_data[p].prio) ) {
304
        cut(i,p);
305
        if ( _comp(_data[_min].prio,value) ) {
306
          fuse(_min,i);
307
        } else {
308
          fuse(i,_min);
309
          _min=i;
310
        }
311
      }
312
    }
313

	
314
    /// \brief Increase the priority of an item to the given value.
315
    ///
316
    /// This function increases the priority of an item to the given value.
317
    /// \param item The item.
318
    /// \param value The priority.
319
    /// \pre \e item must be stored in the heap with priority at most \e value.
320
    void increase (Item item, const Prio& value) {
321
      erase(item);
322
      push(item,value);
323
    }
324

	
325
    /// \brief Return the state of an item.
326
    ///
327
    /// This method returns \c PRE_HEAP if the given item has never
328
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
329
    /// and \c POST_HEAP otherwise.
330
    /// In the latter case it is possible that the item will get back
331
    /// to the heap again.
332
    /// \param item The item.
333
    State state(const Item &item) const {
334
      int i=_iim[item];
335
      if( i>=0 ) {
336
        if( _data[i].in ) i=0;
337
        else i=-2;
338
      }
339
      return State(i);
340
    }
341

	
342
    /// \brief Set the state of an item in the heap.
343
    ///
344
    /// This function sets the state of the given item in the heap.
345
    /// It can be used to manually clear the heap when it is important
346
    /// to achive better time complexity.
347
    /// \param i The item.
348
    /// \param st The state. It should not be \c IN_HEAP.
349
    void state(const Item& i, State st) {
350
      switch (st) {
351
      case POST_HEAP:
352
      case PRE_HEAP:
353
        if (state(i) == IN_HEAP) erase(i);
354
        _iim[i]=st;
355
        break;
356
      case IN_HEAP:
357
        break;
358
      }
359
    }
360

	
361
  private:
362

	
363
    void cut(int a, int b) {
364
      int child_a;
365
      switch (_data[a].degree) {
366
        case 2:
367
          child_a = _data[_data[a].child].parent;
368
          if( _data[a].left_child ) {
369
            _data[child_a].left_child=true;
370
            _data[b].child=child_a;
371
            _data[child_a].parent=_data[a].parent;
372
          }
373
          else {
374
            _data[child_a].left_child=false;
375
            _data[child_a].parent=b;
376
            if( a!=_data[b].child )
377
              _data[_data[b].child].parent=child_a;
378
            else
379
              _data[b].child=child_a;
380
          }
381
          --_data[a].degree;
382
          _data[_data[a].child].parent=a;
383
          break;
384

	
385
        case 1:
386
          child_a = _data[a].child;
387
          if( !_data[child_a].left_child ) {
388
            --_data[a].degree;
389
            if( _data[a].left_child ) {
390
              _data[child_a].left_child=true;
391
              _data[child_a].parent=_data[a].parent;
392
              _data[b].child=child_a;
393
            }
394
            else {
395
              _data[child_a].left_child=false;
396
              _data[child_a].parent=b;
397
              if( a!=_data[b].child )
398
                _data[_data[b].child].parent=child_a;
399
              else
400
                _data[b].child=child_a;
401
            }
402
            _data[a].child=-1;
403
          }
404
          else {
405
            --_data[b].degree;
406
            if( _data[a].left_child ) {
407
              _data[b].child =
408
                (1==_data[b].degree) ? _data[a].parent : -1;
409
            } else {
410
              if (1==_data[b].degree)
411
                _data[_data[b].child].parent=b;
412
              else
413
                _data[b].child=-1;
414
            }
415
          }
416
          break;
417

	
418
        case 0:
419
          --_data[b].degree;
420
          if( _data[a].left_child ) {
421
            _data[b].child =
422
              (0!=_data[b].degree) ? _data[a].parent : -1;
423
          } else {
424
            if( 0!=_data[b].degree )
425
              _data[_data[b].child].parent=b;
426
            else
427
              _data[b].child=-1;
428
          }
429
          break;
430
      }
431
      _data[a].parent=-1;
432
      _data[a].left_child=false;
433
    }
434

	
435
    void fuse(int a, int b) {
436
      int child_a = _data[a].child;
437
      int child_b = _data[b].child;
438
      _data[a].child=b;
439
      _data[b].parent=a;
440
      _data[b].left_child=true;
441

	
442
      if( -1!=child_a ) {
443
        _data[b].child=child_a;
444
        _data[child_a].parent=b;
445
        _data[child_a].left_child=false;
446
        ++_data[b].degree;
447

	
448
        if( -1!=child_b ) {
449
           _data[b].child=child_b;
450
           _data[child_b].parent=child_a;
451
        }
452
      }
453
      else { ++_data[a].degree; }
454
    }
455

	
456
    class store {
457
      friend class PairingHeap;
458

	
459
      Item name;
460
      int parent;
461
      int child;
462
      bool left_child;
463
      int degree;
464
      bool in;
465
      Prio prio;
466

	
467
      store() : parent(-1), child(-1), left_child(false), degree(0), in(true) {}
468
    };
469
  };
470

	
471
} //namespace lemon
472

	
473
#endif //LEMON_PAIRING_HEAP_H
474

	
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2010
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_PLANARITY_H
20
#define LEMON_PLANARITY_H
21

	
22
/// \ingroup planar
23
/// \file
24
/// \brief Planarity checking, embedding, drawing and coloring
25

	
26
#include <vector>
27
#include <list>
28

	
29
#include <lemon/dfs.h>
30
#include <lemon/bfs.h>
31
#include <lemon/radix_sort.h>
32
#include <lemon/maps.h>
33
#include <lemon/path.h>
34
#include <lemon/bucket_heap.h>
35
#include <lemon/adaptors.h>
36
#include <lemon/edge_set.h>
37
#include <lemon/color.h>
38
#include <lemon/dim2.h>
39

	
40
namespace lemon {
41

	
42
  namespace _planarity_bits {
43

	
44
    template <typename Graph>
45
    struct PlanarityVisitor : DfsVisitor<Graph> {
46

	
47
      TEMPLATE_GRAPH_TYPEDEFS(Graph);
48

	
49
      typedef typename Graph::template NodeMap<Arc> PredMap;
50

	
51
      typedef typename Graph::template EdgeMap<bool> TreeMap;
52

	
53
      typedef typename Graph::template NodeMap<int> OrderMap;
54
      typedef std::vector<Node> OrderList;
55

	
56
      typedef typename Graph::template NodeMap<int> LowMap;
57
      typedef typename Graph::template NodeMap<int> AncestorMap;
58

	
59
      PlanarityVisitor(const Graph& graph,
60
                       PredMap& pred_map, TreeMap& tree_map,
61
                       OrderMap& order_map, OrderList& order_list,
62
                       AncestorMap& ancestor_map, LowMap& low_map)
63
        : _graph(graph), _pred_map(pred_map), _tree_map(tree_map),
64
          _order_map(order_map), _order_list(order_list),
65
          _ancestor_map(ancestor_map), _low_map(low_map) {}
66

	
67
      void reach(const Node& node) {
68
        _order_map[node] = _order_list.size();
69
        _low_map[node] = _order_list.size();
70
        _ancestor_map[node] = _order_list.size();
71
        _order_list.push_back(node);
72
      }
73

	
74
      void discover(const Arc& arc) {
75
        Node source = _graph.source(arc);
76
        Node target = _graph.target(arc);
77

	
78
        _tree_map[arc] = true;
79
        _pred_map[target] = arc;
80
      }
81

	
82
      void examine(const Arc& arc) {
83
        Node source = _graph.source(arc);
84
        Node target = _graph.target(arc);
85

	
86
        if (_order_map[target] < _order_map[source] && !_tree_map[arc]) {
87
          if (_low_map[source] > _order_map[target]) {
88
            _low_map[source] = _order_map[target];
89
          }
90
          if (_ancestor_map[source] > _order_map[target]) {
91
            _ancestor_map[source] = _order_map[target];
92
          }
93
        }
94
      }
95

	
96
      void backtrack(const Arc& arc) {
97
        Node source = _graph.source(arc);
98
        Node target = _graph.target(arc);
99

	
100
        if (_low_map[source] > _low_map[target]) {
101
          _low_map[source] = _low_map[target];
102
        }
103
      }
104

	
105
      const Graph& _graph;
106
      PredMap& _pred_map;
107
      TreeMap& _tree_map;
108
      OrderMap& _order_map;
109
      OrderList& _order_list;
110
      AncestorMap& _ancestor_map;
111
      LowMap& _low_map;
112
    };
113

	
114
    template <typename Graph, bool embedding = true>
115
    struct NodeDataNode {
116
      int prev, next;
117
      int visited;
118
      typename Graph::Arc first;
119
      bool inverted;
120
    };
121

	
122
    template <typename Graph>
123
    struct NodeDataNode<Graph, false> {
124
      int prev, next;
125
      int visited;
126
    };
127

	
128
    template <typename Graph>
129
    struct ChildListNode {
130
      typedef typename Graph::Node Node;
131
      Node first;
132
      Node prev, next;
133
    };
134

	
135
    template <typename Graph>
136
    struct ArcListNode {
137
      typename Graph::Arc prev, next;
138
    };
139

	
140
    template <typename Graph>
141
    class PlanarityChecking {
142
    private:
143

	
144
      TEMPLATE_GRAPH_TYPEDEFS(Graph);
145

	
146
      const Graph& _graph;
147

	
148
    private:
149

	
150
      typedef typename Graph::template NodeMap<Arc> PredMap;
151

	
152
      typedef typename Graph::template EdgeMap<bool> TreeMap;
153

	
154
      typedef typename Graph::template NodeMap<int> OrderMap;
155
      typedef std::vector<Node> OrderList;
156

	
157
      typedef typename Graph::template NodeMap<int> LowMap;
158
      typedef typename Graph::template NodeMap<int> AncestorMap;
159

	
160
      typedef _planarity_bits::NodeDataNode<Graph> NodeDataNode;
161
      typedef std::vector<NodeDataNode> NodeData;
162

	
163
      typedef _planarity_bits::ChildListNode<Graph> ChildListNode;
164
      typedef typename Graph::template NodeMap<ChildListNode> ChildLists;
165

	
166
      typedef typename Graph::template NodeMap<std::list<int> > MergeRoots;
167

	
168
      typedef typename Graph::template NodeMap<bool> EmbedArc;
169

	
170
    public:
171

	
172
      PlanarityChecking(const Graph& graph) : _graph(graph) {}
173

	
174
      bool run() {
175
        typedef _planarity_bits::PlanarityVisitor<Graph> Visitor;
176

	
177
        PredMap pred_map(_graph, INVALID);
178
        TreeMap tree_map(_graph, false);
179

	
180
        OrderMap order_map(_graph, -1);
181
        OrderList order_list;
182

	
183
        AncestorMap ancestor_map(_graph, -1);
184
        LowMap low_map(_graph, -1);
185

	
186
        Visitor visitor(_graph, pred_map, tree_map,
187
                        order_map, order_list, ancestor_map, low_map);
188
        DfsVisit<Graph, Visitor> visit(_graph, visitor);
189
        visit.run();
190

	
191
        ChildLists child_lists(_graph);
192
        createChildLists(tree_map, order_map, low_map, child_lists);
193

	
194
        NodeData node_data(2 * order_list.size());
195

	
196
        EmbedArc embed_arc(_graph, false);
197

	
198
        MergeRoots merge_roots(_graph);
199

	
200
        for (int i = order_list.size() - 1; i >= 0; --i) {
201

	
202
          Node node = order_list[i];
203

	
204
          Node source = node;
205
          for (OutArcIt e(_graph, node); e != INVALID; ++e) {
206
            Node target = _graph.target(e);
207

	
208
            if (order_map[source] < order_map[target] && tree_map[e]) {
209
              initFace(target, node_data, order_map, order_list);
210
            }
211
          }
212

	
213
          for (OutArcIt e(_graph, node); e != INVALID; ++e) {
214
            Node target = _graph.target(e);
215

	
216
            if (order_map[source] < order_map[target] && !tree_map[e]) {
217
              embed_arc[target] = true;
218
              walkUp(target, source, i, pred_map, low_map,
219
                     order_map, order_list, node_data, merge_roots);
220
            }
221
          }
222

	
223
          for (typename MergeRoots::Value::iterator it =
224
                 merge_roots[node].begin();
225
               it != merge_roots[node].end(); ++it) {
226
            int rn = *it;
227
            walkDown(rn, i, node_data, order_list, child_lists,
228
                     ancestor_map, low_map, embed_arc, merge_roots);
229
          }
230
          merge_roots[node].clear();
231

	
232
          for (OutArcIt e(_graph, node); e != INVALID; ++e) {
233
            Node target = _graph.target(e);
234

	
235
            if (order_map[source] < order_map[target] && !tree_map[e]) {
236
              if (embed_arc[target]) {
237
                return false;
238
              }
239
            }
240
          }
241
        }
242

	
243
        return true;
244
      }
245

	
246
    private:
247

	
248
      void createChildLists(const TreeMap& tree_map, const OrderMap& order_map,
249
                            const LowMap& low_map, ChildLists& child_lists) {
250

	
251
        for (NodeIt n(_graph); n != INVALID; ++n) {
252
          Node source = n;
253

	
254
          std::vector<Node> targets;
255
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
256
            Node target = _graph.target(e);
257

	
258
            if (order_map[source] < order_map[target] && tree_map[e]) {
259
              targets.push_back(target);
260
            }
261
          }
262

	
263
          if (targets.size() == 0) {
264
            child_lists[source].first = INVALID;
265
          } else if (targets.size() == 1) {
266
            child_lists[source].first = targets[0];
267
            child_lists[targets[0]].prev = INVALID;
268
            child_lists[targets[0]].next = INVALID;
269
          } else {
270
            radixSort(targets.begin(), targets.end(), mapToFunctor(low_map));
271
            for (int i = 1; i < int(targets.size()); ++i) {
272
              child_lists[targets[i]].prev = targets[i - 1];
273
              child_lists[targets[i - 1]].next = targets[i];
274
            }
275
            child_lists[targets.back()].next = INVALID;
276
            child_lists[targets.front()].prev = INVALID;
277
            child_lists[source].first = targets.front();
278
          }
279
        }
280
      }
281

	
282
      void walkUp(const Node& node, Node root, int rorder,
283
                  const PredMap& pred_map, const LowMap& low_map,
284
                  const OrderMap& order_map, const OrderList& order_list,
285
                  NodeData& node_data, MergeRoots& merge_roots) {
286

	
287
        int na, nb;
288
        bool da, db;
289

	
290
        na = nb = order_map[node];
291
        da = true; db = false;
292

	
293
        while (true) {
294

	
295
          if (node_data[na].visited == rorder) break;
296
          if (node_data[nb].visited == rorder) break;
297

	
298
          node_data[na].visited = rorder;
299
          node_data[nb].visited = rorder;
300

	
301
          int rn = -1;
302

	
303
          if (na >= int(order_list.size())) {
304
            rn = na;
305
          } else if (nb >= int(order_list.size())) {
306
            rn = nb;
307
          }
308

	
309
          if (rn == -1) {
310
            int nn;
311

	
312
            nn = da ? node_data[na].prev : node_data[na].next;
313
            da = node_data[nn].prev != na;
314
            na = nn;
315

	
316
            nn = db ? node_data[nb].prev : node_data[nb].next;
317
            db = node_data[nn].prev != nb;
318
            nb = nn;
319

	
320
          } else {
321

	
322
            Node rep = order_list[rn - order_list.size()];
323
            Node parent = _graph.source(pred_map[rep]);
324

	
325
            if (low_map[rep] < rorder) {
326
              merge_roots[parent].push_back(rn);
327
            } else {
328
              merge_roots[parent].push_front(rn);
329
            }
330

	
331
            if (parent != root) {
332
              na = nb = order_map[parent];
333
              da = true; db = false;
334
            } else {
335
              break;
336
            }
337
          }
338
        }
339
      }
340

	
341
      void walkDown(int rn, int rorder, NodeData& node_data,
342
                    OrderList& order_list, ChildLists& child_lists,
343
                    AncestorMap& ancestor_map, LowMap& low_map,
344
                    EmbedArc& embed_arc, MergeRoots& merge_roots) {
345

	
346
        std::vector<std::pair<int, bool> > merge_stack;
347

	
348
        for (int di = 0; di < 2; ++di) {
349
          bool rd = di == 0;
350
          int pn = rn;
351
          int n = rd ? node_data[rn].next : node_data[rn].prev;
352

	
353
          while (n != rn) {
354

	
355
            Node node = order_list[n];
356

	
357
            if (embed_arc[node]) {
358

	
359
              // Merging components on the critical path
360
              while (!merge_stack.empty()) {
361

	
362
                // Component root
363
                int cn = merge_stack.back().first;
364
                bool cd = merge_stack.back().second;
365
                merge_stack.pop_back();
366

	
367
                // Parent of component
368
                int dn = merge_stack.back().first;
369
                bool dd = merge_stack.back().second;
370
                merge_stack.pop_back();
371

	
372
                Node parent = order_list[dn];
373

	
374
                // Erasing from merge_roots
375
                merge_roots[parent].pop_front();
376

	
377
                Node child = order_list[cn - order_list.size()];
378

	
379
                // Erasing from child_lists
380
                if (child_lists[child].prev != INVALID) {
381
                  child_lists[child_lists[child].prev].next =
382
                    child_lists[child].next;
383
                } else {
384
                  child_lists[parent].first = child_lists[child].next;
385
                }
386

	
387
                if (child_lists[child].next != INVALID) {
388
                  child_lists[child_lists[child].next].prev =
389
                    child_lists[child].prev;
390
                }
391

	
392
                // Merging external faces
393
                {
394
                  int en = cn;
395
                  cn = cd ? node_data[cn].prev : node_data[cn].next;
396
                  cd = node_data[cn].next == en;
397

	
398
                }
399

	
400
                if (cd) node_data[cn].next = dn; else node_data[cn].prev = dn;
401
                if (dd) node_data[dn].prev = cn; else node_data[dn].next = cn;
402

	
403
              }
404

	
405
              bool d = pn == node_data[n].prev;
406

	
407
              if (node_data[n].prev == node_data[n].next &&
408
                  node_data[n].inverted) {
409
                d = !d;
410
              }
411

	
412
              // Embedding arc into external face
413
              if (rd) node_data[rn].next = n; else node_data[rn].prev = n;
414
              if (d) node_data[n].prev = rn; else node_data[n].next = rn;
415
              pn = rn;
416

	
417
              embed_arc[order_list[n]] = false;
418
            }
419

	
420
            if (!merge_roots[node].empty()) {
421

	
422
              bool d = pn == node_data[n].prev;
423

	
424
              merge_stack.push_back(std::make_pair(n, d));
425

	
426
              int rn = merge_roots[node].front();
427

	
428
              int xn = node_data[rn].next;
429
              Node xnode = order_list[xn];
430

	
431
              int yn = node_data[rn].prev;
432
              Node ynode = order_list[yn];
433

	
434
              bool rd;
435
              if (!external(xnode, rorder, child_lists,
436
                            ancestor_map, low_map)) {
437
                rd = true;
438
              } else if (!external(ynode, rorder, child_lists,
439
                                   ancestor_map, low_map)) {
440
                rd = false;
441
              } else if (pertinent(xnode, embed_arc, merge_roots)) {
442
                rd = true;
443
              } else {
444
                rd = false;
445
              }
446

	
447
              merge_stack.push_back(std::make_pair(rn, rd));
448

	
449
              pn = rn;
450
              n = rd ? xn : yn;
451

	
452
            } else if (!external(node, rorder, child_lists,
453
                                 ancestor_map, low_map)) {
454
              int nn = (node_data[n].next != pn ?
455
                        node_data[n].next : node_data[n].prev);
456

	
457
              bool nd = n == node_data[nn].prev;
458

	
459
              if (nd) node_data[nn].prev = pn;
460
              else node_data[nn].next = pn;
461

	
462
              if (n == node_data[pn].prev) node_data[pn].prev = nn;
463
              else node_data[pn].next = nn;
464

	
465
              node_data[nn].inverted =
466
                (node_data[nn].prev == node_data[nn].next && nd != rd);
467

	
468
              n = nn;
469
            }
470
            else break;
471

	
472
          }
473

	
474
          if (!merge_stack.empty() || n == rn) {
475
            break;
476
          }
477
        }
478
      }
479

	
480
      void initFace(const Node& node, NodeData& node_data,
481
                    const OrderMap& order_map, const OrderList& order_list) {
482
        int n = order_map[node];
483
        int rn = n + order_list.size();
484

	
485
        node_data[n].next = node_data[n].prev = rn;
486
        node_data[rn].next = node_data[rn].prev = n;
487

	
488
        node_data[n].visited = order_list.size();
489
        node_data[rn].visited = order_list.size();
490

	
491
      }
492

	
493
      bool external(const Node& node, int rorder,
494
                    ChildLists& child_lists, AncestorMap& ancestor_map,
495
                    LowMap& low_map) {
496
        Node child = child_lists[node].first;
497

	
498
        if (child != INVALID) {
499
          if (low_map[child] < rorder) return true;
500
        }
501

	
502
        if (ancestor_map[node] < rorder) return true;
503

	
504
        return false;
505
      }
506

	
507
      bool pertinent(const Node& node, const EmbedArc& embed_arc,
508
                     const MergeRoots& merge_roots) {
509
        return !merge_roots[node].empty() || embed_arc[node];
510
      }
511

	
512
    };
513

	
514
  }
515

	
516
  /// \ingroup planar
517
  ///
518
  /// \brief Planarity checking of an undirected simple graph
519
  ///
520
  /// This function implements the Boyer-Myrvold algorithm for
521
  /// planarity checking of an undirected simple graph. It is a simplified
522
  /// version of the PlanarEmbedding algorithm class because neither
523
  /// the embedding nor the Kuratowski subdivisons are computed.
524
  template <typename GR>
525
  bool checkPlanarity(const GR& graph) {
526
    _planarity_bits::PlanarityChecking<GR> pc(graph);
527
    return pc.run();
528
  }
529

	
530
  /// \ingroup planar
531
  ///
532
  /// \brief Planar embedding of an undirected simple graph
533
  ///
534
  /// This class implements the Boyer-Myrvold algorithm for planar
535
  /// embedding of an undirected simple graph. The planar embedding is an
536
  /// ordering of the outgoing edges of the nodes, which is a possible
537
  /// configuration to draw the graph in the plane. If there is not
538
  /// such ordering then the graph contains a K<sub>5</sub> (full graph
539
  /// with 5 nodes) or a K<sub>3,3</sub> (complete bipartite graph on
540
  /// 3 Red and 3 Blue nodes) subdivision.
541
  ///
542
  /// The current implementation calculates either an embedding or a
543
  /// Kuratowski subdivision. The running time of the algorithm is O(n).
544
  ///
545
  /// \see PlanarDrawing, checkPlanarity()
546
  template <typename Graph>
547
  class PlanarEmbedding {
548
  private:
549

	
550
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
551

	
552
    const Graph& _graph;
553
    typename Graph::template ArcMap<Arc> _embedding;
554

	
555
    typename Graph::template EdgeMap<bool> _kuratowski;
556

	
557
  private:
558

	
559
    typedef typename Graph::template NodeMap<Arc> PredMap;
560

	
561
    typedef typename Graph::template EdgeMap<bool> TreeMap;
562

	
563
    typedef typename Graph::template NodeMap<int> OrderMap;
564
    typedef std::vector<Node> OrderList;
565

	
566
    typedef typename Graph::template NodeMap<int> LowMap;
567
    typedef typename Graph::template NodeMap<int> AncestorMap;
568

	
569
    typedef _planarity_bits::NodeDataNode<Graph> NodeDataNode;
570
    typedef std::vector<NodeDataNode> NodeData;
571

	
572
    typedef _planarity_bits::ChildListNode<Graph> ChildListNode;
573
    typedef typename Graph::template NodeMap<ChildListNode> ChildLists;
574

	
575
    typedef typename Graph::template NodeMap<std::list<int> > MergeRoots;
576

	
577
    typedef typename Graph::template NodeMap<Arc> EmbedArc;
578

	
579
    typedef _planarity_bits::ArcListNode<Graph> ArcListNode;
580
    typedef typename Graph::template ArcMap<ArcListNode> ArcLists;
581

	
582
    typedef typename Graph::template NodeMap<bool> FlipMap;
583

	
584
    typedef typename Graph::template NodeMap<int> TypeMap;
585

	
586
    enum IsolatorNodeType {
587
      HIGHX = 6, LOWX = 7,
588
      HIGHY = 8, LOWY = 9,
589
      ROOT = 10, PERTINENT = 11,
590
      INTERNAL = 12
591
    };
592

	
593
  public:
594

	
595
    /// \brief The map type for storing the embedding
596
    ///
597
    /// The map type for storing the embedding.
598
    /// \see embeddingMap()
599
    typedef typename Graph::template ArcMap<Arc> EmbeddingMap;
600

	
601
    /// \brief Constructor
602
    ///
603
    /// Constructor.
604
    /// \pre The graph must be simple, i.e. it should not
605
    /// contain parallel or loop arcs.
606
    PlanarEmbedding(const Graph& graph)
607
      : _graph(graph), _embedding(_graph), _kuratowski(graph, false) {}
608

	
609
    /// \brief Run the algorithm.
610
    ///
611
    /// This function runs the algorithm.
612
    /// \param kuratowski If this parameter is set to \c false, then the
613
    /// algorithm does not compute a Kuratowski subdivision.
614
    /// \return \c true if the graph is planar.
615
    bool run(bool kuratowski = true) {
616
      typedef _planarity_bits::PlanarityVisitor<Graph> Visitor;
617

	
618
      PredMap pred_map(_graph, INVALID);
619
      TreeMap tree_map(_graph, false);
620

	
621
      OrderMap order_map(_graph, -1);
622
      OrderList order_list;
623

	
624
      AncestorMap ancestor_map(_graph, -1);
625
      LowMap low_map(_graph, -1);
626

	
627
      Visitor visitor(_graph, pred_map, tree_map,
628
                      order_map, order_list, ancestor_map, low_map);
629
      DfsVisit<Graph, Visitor> visit(_graph, visitor);
630
      visit.run();
631

	
632
      ChildLists child_lists(_graph);
633
      createChildLists(tree_map, order_map, low_map, child_lists);
634

	
635
      NodeData node_data(2 * order_list.size());
636

	
637
      EmbedArc embed_arc(_graph, INVALID);
638

	
639
      MergeRoots merge_roots(_graph);
640

	
641
      ArcLists arc_lists(_graph);
642

	
643
      FlipMap flip_map(_graph, false);
644

	
645
      for (int i = order_list.size() - 1; i >= 0; --i) {
646

	
647
        Node node = order_list[i];
648

	
649
        node_data[i].first = INVALID;
650

	
651
        Node source = node;
652
        for (OutArcIt e(_graph, node); e != INVALID; ++e) {
653
          Node target = _graph.target(e);
654

	
655
          if (order_map[source] < order_map[target] && tree_map[e]) {
656
            initFace(target, arc_lists, node_data,
657
                     pred_map, order_map, order_list);
658
          }
659
        }
660

	
661
        for (OutArcIt e(_graph, node); e != INVALID; ++e) {
662
          Node target = _graph.target(e);
663

	
664
          if (order_map[source] < order_map[target] && !tree_map[e]) {
665
            embed_arc[target] = e;
666
            walkUp(target, source, i, pred_map, low_map,
667
                   order_map, order_list, node_data, merge_roots);
668
          }
669
        }
670

	
671
        for (typename MergeRoots::Value::iterator it =
672
               merge_roots[node].begin(); it != merge_roots[node].end(); ++it) {
673
          int rn = *it;
674
          walkDown(rn, i, node_data, arc_lists, flip_map, order_list,
675
                   child_lists, ancestor_map, low_map, embed_arc, merge_roots);
676
        }
677
        merge_roots[node].clear();
678

	
679
        for (OutArcIt e(_graph, node); e != INVALID; ++e) {
680
          Node target = _graph.target(e);
681

	
682
          if (order_map[source] < order_map[target] && !tree_map[e]) {
683
            if (embed_arc[target] != INVALID) {
684
              if (kuratowski) {
685
                isolateKuratowski(e, node_data, arc_lists, flip_map,
686
                                  order_map, order_list, pred_map, child_lists,
687
                                  ancestor_map, low_map,
688
                                  embed_arc, merge_roots);
689
              }
690
              return false;
691
            }
692
          }
693
        }
694
      }
695

	
696
      for (int i = 0; i < int(order_list.size()); ++i) {
697

	
698
        mergeRemainingFaces(order_list[i], node_data, order_list, order_map,
699
                            child_lists, arc_lists);
700
        storeEmbedding(order_list[i], node_data, order_map, pred_map,
701
                       arc_lists, flip_map);
702
      }
703

	
704
      return true;
705
    }
706

	
707
    /// \brief Give back the successor of an arc
708
    ///
709
    /// This function gives back the successor of an arc. It makes
710
    /// possible to query the cyclic order of the outgoing arcs from
711
    /// a node.
712
    Arc next(const Arc& arc) const {
713
      return _embedding[arc];
714
    }
715

	
716
    /// \brief Give back the calculated embedding map
717
    ///
718
    /// This function gives back the calculated embedding map, which
719
    /// contains the successor of each arc in the cyclic order of the
720
    /// outgoing arcs of its source node.
721
    const EmbeddingMap& embeddingMap() const {
722
      return _embedding;
723
    }
724

	
725
    /// \brief Give back \c true if the given edge is in the Kuratowski
726
    /// subdivision
727
    ///
728
    /// This function gives back \c true if the given edge is in the found
729
    /// Kuratowski subdivision.
730
    /// \pre The \c run() function must be called with \c true parameter
731
    /// before using this function.
732
    bool kuratowski(const Edge& edge) const {
733
      return _kuratowski[edge];
734
    }
735

	
736
  private:
737

	
738
    void createChildLists(const TreeMap& tree_map, const OrderMap& order_map,
739
                          const LowMap& low_map, ChildLists& child_lists) {
740

	
741
      for (NodeIt n(_graph); n != INVALID; ++n) {
742
        Node source = n;
743

	
744
        std::vector<Node> targets;
745
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
746
          Node target = _graph.target(e);
747

	
748
          if (order_map[source] < order_map[target] && tree_map[e]) {
749
            targets.push_back(target);
750
          }
751
        }
752

	
753
        if (targets.size() == 0) {
754
          child_lists[source].first = INVALID;
755
        } else if (targets.size() == 1) {
756
          child_lists[source].first = targets[0];
757
          child_lists[targets[0]].prev = INVALID;
758
          child_lists[targets[0]].next = INVALID;
759
        } else {
760
          radixSort(targets.begin(), targets.end(), mapToFunctor(low_map));
761
          for (int i = 1; i < int(targets.size()); ++i) {
762
            child_lists[targets[i]].prev = targets[i - 1];
763
            child_lists[targets[i - 1]].next = targets[i];
764
          }
765
          child_lists[targets.back()].next = INVALID;
766
          child_lists[targets.front()].prev = INVALID;
767
          child_lists[source].first = targets.front();
768
        }
769
      }
770
    }
771

	
772
    void walkUp(const Node& node, Node root, int rorder,
773
                const PredMap& pred_map, const LowMap& low_map,
774
                const OrderMap& order_map, const OrderList& order_list,
775
                NodeData& node_data, MergeRoots& merge_roots) {
776

	
777
      int na, nb;
778
      bool da, db;
779

	
780
      na = nb = order_map[node];
781
      da = true; db = false;
782

	
783
      while (true) {
784

	
785
        if (node_data[na].visited == rorder) break;
786
        if (node_data[nb].visited == rorder) break;
787

	
788
        node_data[na].visited = rorder;
789
        node_data[nb].visited = rorder;
790

	
791
        int rn = -1;
792

	
793
        if (na >= int(order_list.size())) {
794
          rn = na;
795
        } else if (nb >= int(order_list.size())) {
796
          rn = nb;
797
        }
798

	
799
        if (rn == -1) {
800
          int nn;
801

	
802
          nn = da ? node_data[na].prev : node_data[na].next;
803
          da = node_data[nn].prev != na;
804
          na = nn;
805

	
806
          nn = db ? node_data[nb].prev : node_data[nb].next;
807
          db = node_data[nn].prev != nb;
808
          nb = nn;
809

	
810
        } else {
811

	
812
          Node rep = order_list[rn - order_list.size()];
813
          Node parent = _graph.source(pred_map[rep]);
814

	
815
          if (low_map[rep] < rorder) {
816
            merge_roots[parent].push_back(rn);
817
          } else {
818
            merge_roots[parent].push_front(rn);
819
          }
820

	
821
          if (parent != root) {
822
            na = nb = order_map[parent];
823
            da = true; db = false;
824
          } else {
825
            break;
826
          }
827
        }
828
      }
829
    }
830

	
831
    void walkDown(int rn, int rorder, NodeData& node_data,
832
                  ArcLists& arc_lists, FlipMap& flip_map,
833
                  OrderList& order_list, ChildLists& child_lists,
834
                  AncestorMap& ancestor_map, LowMap& low_map,
835
                  EmbedArc& embed_arc, MergeRoots& merge_roots) {
836

	
837
      std::vector<std::pair<int, bool> > merge_stack;
838

	
839
      for (int di = 0; di < 2; ++di) {
840
        bool rd = di == 0;
841
        int pn = rn;
842
        int n = rd ? node_data[rn].next : node_data[rn].prev;
843

	
844
        while (n != rn) {
845

	
846
          Node node = order_list[n];
847

	
848
          if (embed_arc[node] != INVALID) {
849

	
850
            // Merging components on the critical path
851
            while (!merge_stack.empty()) {
852

	
853
              // Component root
854
              int cn = merge_stack.back().first;
855
              bool cd = merge_stack.back().second;
856
              merge_stack.pop_back();
857

	
858
              // Parent of component
859
              int dn = merge_stack.back().first;
860
              bool dd = merge_stack.back().second;
861
              merge_stack.pop_back();
862

	
863
              Node parent = order_list[dn];
864

	
865
              // Erasing from merge_roots
866
              merge_roots[parent].pop_front();
867

	
868
              Node child = order_list[cn - order_list.size()];
869

	
870
              // Erasing from child_lists
871
              if (child_lists[child].prev != INVALID) {
872
                child_lists[child_lists[child].prev].next =
873
                  child_lists[child].next;
874
              } else {
875
                child_lists[parent].first = child_lists[child].next;
876
              }
877

	
878
              if (child_lists[child].next != INVALID) {
879
                child_lists[child_lists[child].next].prev =
880
                  child_lists[child].prev;
881
              }
882

	
883
              // Merging arcs + flipping
884
              Arc de = node_data[dn].first;
885
              Arc ce = node_data[cn].first;
886

	
887
              flip_map[order_list[cn - order_list.size()]] = cd != dd;
888
              if (cd != dd) {
889
                std::swap(arc_lists[ce].prev, arc_lists[ce].next);
890
                ce = arc_lists[ce].prev;
891
                std::swap(arc_lists[ce].prev, arc_lists[ce].next);
892
              }
893

	
894
              {
895
                Arc dne = arc_lists[de].next;
896
                Arc cne = arc_lists[ce].next;
897

	
898
                arc_lists[de].next = cne;
899
                arc_lists[ce].next = dne;
900

	
901
                arc_lists[dne].prev = ce;
902
                arc_lists[cne].prev = de;
903
              }
904

	
905
              if (dd) {
906
                node_data[dn].first = ce;
907
              }
908

	
909
              // Merging external faces
910
              {
911
                int en = cn;
912
                cn = cd ? node_data[cn].prev : node_data[cn].next;
913
                cd = node_data[cn].next == en;
914

	
915
                 if (node_data[cn].prev == node_data[cn].next &&
916
                    node_data[cn].inverted) {
917
                   cd = !cd;
918
                 }
919
              }
920

	
921
              if (cd) node_data[cn].next = dn; else node_data[cn].prev = dn;
922
              if (dd) node_data[dn].prev = cn; else node_data[dn].next = cn;
923

	
924
            }
925

	
926
            bool d = pn == node_data[n].prev;
927

	
928
            if (node_data[n].prev == node_data[n].next &&
929
                node_data[n].inverted) {
930
              d = !d;
931
            }
932

	
933
            // Add new arc
934
            {
935
              Arc arc = embed_arc[node];
936
              Arc re = node_data[rn].first;
937

	
938
              arc_lists[arc_lists[re].next].prev = arc;
939
              arc_lists[arc].next = arc_lists[re].next;
940
              arc_lists[arc].prev = re;
941
              arc_lists[re].next = arc;
942

	
943
              if (!rd) {
944
                node_data[rn].first = arc;
945
              }
946

	
947
              Arc rev = _graph.oppositeArc(arc);
948
              Arc e = node_data[n].first;
949

	
950
              arc_lists[arc_lists[e].next].prev = rev;
951
              arc_lists[rev].next = arc_lists[e].next;
952
              arc_lists[rev].prev = e;
953
              arc_lists[e].next = rev;
954

	
955
              if (d) {
956
                node_data[n].first = rev;
957
              }
958

	
959
            }
960

	
961
            // Embedding arc into external face
962
            if (rd) node_data[rn].next = n; else node_data[rn].prev = n;
963
            if (d) node_data[n].prev = rn; else node_data[n].next = rn;
964
            pn = rn;
965

	
966
            embed_arc[order_list[n]] = INVALID;
967
          }
968

	
969
          if (!merge_roots[node].empty()) {
970

	
971
            bool d = pn == node_data[n].prev;
972
            if (node_data[n].prev == node_data[n].next &&
973
                node_data[n].inverted) {
974
              d = !d;
975
            }
976

	
977
            merge_stack.push_back(std::make_pair(n, d));
978

	
979
            int rn = merge_roots[node].front();
980

	
981
            int xn = node_data[rn].next;
982
            Node xnode = order_list[xn];
983

	
984
            int yn = node_data[rn].prev;
985
            Node ynode = order_list[yn];
986

	
987
            bool rd;
988
            if (!external(xnode, rorder, child_lists, ancestor_map, low_map)) {
989
              rd = true;
990
            } else if (!external(ynode, rorder, child_lists,
991
                                 ancestor_map, low_map)) {
992
              rd = false;
993
            } else if (pertinent(xnode, embed_arc, merge_roots)) {
994
              rd = true;
995
            } else {
996
              rd = false;
997
            }
998

	
999
            merge_stack.push_back(std::make_pair(rn, rd));
1000

	
1001
            pn = rn;
1002
            n = rd ? xn : yn;
1003

	
1004
          } else if (!external(node, rorder, child_lists,
1005
                               ancestor_map, low_map)) {
1006
            int nn = (node_data[n].next != pn ?
1007
                      node_data[n].next : node_data[n].prev);
1008

	
1009
            bool nd = n == node_data[nn].prev;
1010

	
1011
            if (nd) node_data[nn].prev = pn;
1012
            else node_data[nn].next = pn;
1013

	
1014
            if (n == node_data[pn].prev) node_data[pn].prev = nn;
1015
            else node_data[pn].next = nn;
1016

	
1017
            node_data[nn].inverted =
1018
              (node_data[nn].prev == node_data[nn].next && nd != rd);
1019

	
1020
            n = nn;
1021
          }
1022
          else break;
1023

	
1024
        }
1025

	
1026
        if (!merge_stack.empty() || n == rn) {
1027
          break;
1028
        }
1029
      }
1030
    }
1031

	
1032
    void initFace(const Node& node, ArcLists& arc_lists,
1033
                  NodeData& node_data, const PredMap& pred_map,
1034
                  const OrderMap& order_map, const OrderList& order_list) {
1035
      int n = order_map[node];
1036
      int rn = n + order_list.size();
1037

	
1038
      node_data[n].next = node_data[n].prev = rn;
1039
      node_data[rn].next = node_data[rn].prev = n;
1040

	
1041
      node_data[n].visited = order_list.size();
1042
      node_data[rn].visited = order_list.size();
1043

	
1044
      node_data[n].inverted = false;
1045
      node_data[rn].inverted = false;
1046

	
1047
      Arc arc = pred_map[node];
1048
      Arc rev = _graph.oppositeArc(arc);
1049

	
1050
      node_data[rn].first = arc;
1051
      node_data[n].first = rev;
1052

	
1053
      arc_lists[arc].prev = arc;
1054
      arc_lists[arc].next = arc;
1055

	
1056
      arc_lists[rev].prev = rev;
1057
      arc_lists[rev].next = rev;
1058

	
1059
    }
1060

	
1061
    void mergeRemainingFaces(const Node& node, NodeData& node_data,
1062
                             OrderList& order_list, OrderMap& order_map,
1063
                             ChildLists& child_lists, ArcLists& arc_lists) {
1064
      while (child_lists[node].first != INVALID) {
1065
        int dd = order_map[node];
1066
        Node child = child_lists[node].first;
1067
        int cd = order_map[child] + order_list.size();
1068
        child_lists[node].first = child_lists[child].next;
1069

	
1070
        Arc de = node_data[dd].first;
1071
        Arc ce = node_data[cd].first;
1072

	
1073
        if (de != INVALID) {
1074
          Arc dne = arc_lists[de].next;
1075
          Arc cne = arc_lists[ce].next;
1076

	
1077
          arc_lists[de].next = cne;
1078
          arc_lists[ce].next = dne;
1079

	
1080
          arc_lists[dne].prev = ce;
1081
          arc_lists[cne].prev = de;
1082
        }
1083

	
1084
        node_data[dd].first = ce;
1085

	
1086
      }
1087
    }
1088

	
1089
    void storeEmbedding(const Node& node, NodeData& node_data,
1090
                        OrderMap& order_map, PredMap& pred_map,
1091
                        ArcLists& arc_lists, FlipMap& flip_map) {
1092

	
1093
      if (node_data[order_map[node]].first == INVALID) return;
1094

	
1095
      if (pred_map[node] != INVALID) {
1096
        Node source = _graph.source(pred_map[node]);
1097
        flip_map[node] = flip_map[node] != flip_map[source];
1098
      }
1099

	
1100
      Arc first = node_data[order_map[node]].first;
1101
      Arc prev = first;
1102

	
1103
      Arc arc = flip_map[node] ?
1104
        arc_lists[prev].prev : arc_lists[prev].next;
1105

	
1106
      _embedding[prev] = arc;
1107

	
1108
      while (arc != first) {
1109
        Arc next = arc_lists[arc].prev == prev ?
1110
          arc_lists[arc].next : arc_lists[arc].prev;
1111
        prev = arc; arc = next;
1112
        _embedding[prev] = arc;
1113
      }
1114
    }
1115

	
1116

	
1117
    bool external(const Node& node, int rorder,
1118
                  ChildLists& child_lists, AncestorMap& ancestor_map,
1119
                  LowMap& low_map) {
1120
      Node child = child_lists[node].first;
1121

	
1122
      if (child != INVALID) {
1123
        if (low_map[child] < rorder) return true;
1124
      }
1125

	
1126
      if (ancestor_map[node] < rorder) return true;
1127

	
1128
      return false;
1129
    }
1130

	
1131
    bool pertinent(const Node& node, const EmbedArc& embed_arc,
1132
                   const MergeRoots& merge_roots) {
1133
      return !merge_roots[node].empty() || embed_arc[node] != INVALID;
1134
    }
1135

	
1136
    int lowPoint(const Node& node, OrderMap& order_map, ChildLists& child_lists,
1137
                 AncestorMap& ancestor_map, LowMap& low_map) {
1138
      int low_point;
1139

	
1140
      Node child = child_lists[node].first;
1141

	
1142
      if (child != INVALID) {
1143
        low_point = low_map[child];
1144
      } else {
1145
        low_point = order_map[node];
1146
      }
1147

	
1148
      if (low_point > ancestor_map[node]) {
1149
        low_point = ancestor_map[node];
1150
      }
1151

	
1152
      return low_point;
1153
    }
1154

	
1155
    int findComponentRoot(Node root, Node node, ChildLists& child_lists,
1156
                          OrderMap& order_map, OrderList& order_list) {
1157

	
1158
      int order = order_map[root];
1159
      int norder = order_map[node];
1160

	
1161
      Node child = child_lists[root].first;
1162
      while (child != INVALID) {
1163
        int corder = order_map[child];
1164
        if (corder > order && corder < norder) {
1165
          order = corder;
1166
        }
1167
        child = child_lists[child].next;
1168
      }
1169
      return order + order_list.size();
1170
    }
1171

	
1172
    Node findPertinent(Node node, OrderMap& order_map, NodeData& node_data,
1173
                       EmbedArc& embed_arc, MergeRoots& merge_roots) {
1174
      Node wnode =_graph.target(node_data[order_map[node]].first);
1175
      while (!pertinent(wnode, embed_arc, merge_roots)) {
1176
        wnode = _graph.target(node_data[order_map[wnode]].first);
1177
      }
1178
      return wnode;
1179
    }
1180

	
1181

	
1182
    Node findExternal(Node node, int rorder, OrderMap& order_map,
1183
                      ChildLists& child_lists, AncestorMap& ancestor_map,
1184
                      LowMap& low_map, NodeData& node_data) {
1185
      Node wnode =_graph.target(node_data[order_map[node]].first);
1186
      while (!external(wnode, rorder, child_lists, ancestor_map, low_map)) {
1187
        wnode = _graph.target(node_data[order_map[wnode]].first);
1188
      }
1189
      return wnode;
1190
    }
1191

	
1192
    void markCommonPath(Node node, int rorder, Node& wnode, Node& znode,
1193
                        OrderList& order_list, OrderMap& order_map,
1194
                        NodeData& node_data, ArcLists& arc_lists,
1195
                        EmbedArc& embed_arc, MergeRoots& merge_roots,
1196
                        ChildLists& child_lists, AncestorMap& ancestor_map,
1197
                        LowMap& low_map) {
1198

	
1199
      Node cnode = node;
1200
      Node pred = INVALID;
1201

	
1202
      while (true) {
1203

	
1204
        bool pert = pertinent(cnode, embed_arc, merge_roots);
1205
        bool ext = external(cnode, rorder, child_lists, ancestor_map, low_map);
1206

	
1207
        if (pert && ext) {
1208
          if (!merge_roots[cnode].empty()) {
1209
            int cn = merge_roots[cnode].back();
1210

	
1211
            if (low_map[order_list[cn - order_list.size()]] < rorder) {
1212
              Arc arc = node_data[cn].first;
1213
              _kuratowski.set(arc, true);
1214

	
1215
              pred = cnode;
1216
              cnode = _graph.target(arc);
1217

	
1218
              continue;
1219
            }
1220
          }
1221
          wnode = znode = cnode;
1222
          return;
1223

	
1224
        } else if (pert) {
1225
          wnode = cnode;
1226

	
1227
          while (!external(cnode, rorder, child_lists, ancestor_map, low_map)) {
1228
            Arc arc = node_data[order_map[cnode]].first;
1229

	
1230
            if (_graph.target(arc) == pred) {
1231
              arc = arc_lists[arc].next;
1232
            }
1233
            _kuratowski.set(arc, true);
1234

	
1235
            Node next = _graph.target(arc);
1236
            pred = cnode; cnode = next;
1237
          }
1238

	
1239
          znode = cnode;
1240
          return;
1241

	
1242
        } else if (ext) {
1243
          znode = cnode;
1244

	
1245
          while (!pertinent(cnode, embed_arc, merge_roots)) {
1246
            Arc arc = node_data[order_map[cnode]].first;
1247

	
1248
            if (_graph.target(arc) == pred) {
1249
              arc = arc_lists[arc].next;
1250
            }
1251
            _kuratowski.set(arc, true);
1252

	
1253
            Node next = _graph.target(arc);
1254
            pred = cnode; cnode = next;
1255
          }
1256

	
1257
          wnode = cnode;
1258
          return;
1259

	
1260
        } else {
1261
          Arc arc = node_data[order_map[cnode]].first;
1262

	
1263
          if (_graph.target(arc) == pred) {
1264
            arc = arc_lists[arc].next;
1265
          }
1266
          _kuratowski.set(arc, true);
1267

	
1268
          Node next = _graph.target(arc);
1269
          pred = cnode; cnode = next;
1270
        }
1271

	
1272
      }
1273

	
1274
    }
1275

	
1276
    void orientComponent(Node root, int rn, OrderMap& order_map,
1277
                         PredMap& pred_map, NodeData& node_data,
1278
                         ArcLists& arc_lists, FlipMap& flip_map,
1279
                         TypeMap& type_map) {
1280
      node_data[order_map[root]].first = node_data[rn].first;
1281
      type_map[root] = 1;
1282

	
1283
      std::vector<Node> st, qu;
1284

	
1285
      st.push_back(root);
1286
      while (!st.empty()) {
1287
        Node node = st.back();
1288
        st.pop_back();
1289
        qu.push_back(node);
1290

	
1291
        Arc arc = node_data[order_map[node]].first;
1292

	
1293
        if (type_map[_graph.target(arc)] == 0) {
1294
          st.push_back(_graph.target(arc));
1295
          type_map[_graph.target(arc)] = 1;
1296
        }
1297

	
1298
        Arc last = arc, pred = arc;
1299
        arc = arc_lists[arc].next;
1300
        while (arc != last) {
1301

	
1302
          if (type_map[_graph.target(arc)] == 0) {
1303
            st.push_back(_graph.target(arc));
1304
            type_map[_graph.target(arc)] = 1;
1305
          }
1306

	
1307
          Arc next = arc_lists[arc].next != pred ?
1308
            arc_lists[arc].next : arc_lists[arc].prev;
1309
          pred = arc; arc = next;
1310
        }
1311

	
1312
      }
1313

	
1314
      type_map[root] = 2;
1315
      flip_map[root] = false;
1316

	
1317
      for (int i = 1; i < int(qu.size()); ++i) {
1318

	
1319
        Node node = qu[i];
1320

	
1321
        while (type_map[node] != 2) {
1322
          st.push_back(node);
1323
          type_map[node] = 2;
1324
          node = _graph.source(pred_map[node]);
1325
        }
1326

	
1327
        bool flip = flip_map[node];
1328

	
1329
        while (!st.empty()) {
1330
          node = st.back();
1331
          st.pop_back();
1332

	
1333
          flip_map[node] = flip != flip_map[node];
1334
          flip = flip_map[node];
1335

	
1336
          if (flip) {
1337
            Arc arc = node_data[order_map[node]].first;
1338
            std::swap(arc_lists[arc].prev, arc_lists[arc].next);
1339
            arc = arc_lists[arc].prev;
1340
            std::swap(arc_lists[arc].prev, arc_lists[arc].next);
1341
            node_data[order_map[node]].first = arc;
1342
          }
1343
        }
1344
      }
1345

	
1346
      for (int i = 0; i < int(qu.size()); ++i) {
1347

	
1348
        Arc arc = node_data[order_map[qu[i]]].first;
1349
        Arc last = arc, pred = arc;
1350

	
1351
        arc = arc_lists[arc].next;
1352
        while (arc != last) {
1353

	
1354
          if (arc_lists[arc].next == pred) {
1355
            std::swap(arc_lists[arc].next, arc_lists[arc].prev);
1356
          }
1357
          pred = arc; arc = arc_lists[arc].next;
1358
        }
1359

	
1360
      }
1361
    }
1362

	
1363
    void setFaceFlags(Node root, Node wnode, Node ynode, Node xnode,
1364
                      OrderMap& order_map, NodeData& node_data,
1365
                      TypeMap& type_map) {
1366
      Node node = _graph.target(node_data[order_map[root]].first);
1367

	
1368
      while (node != ynode) {
1369
        type_map[node] = HIGHY;
1370
        node = _graph.target(node_data[order_map[node]].first);
1371
      }
1372

	
1373
      while (node != wnode) {
1374
        type_map[node] = LOWY;
1375
        node = _graph.target(node_data[order_map[node]].first);
1376
      }
1377

	
1378
      node = _graph.target(node_data[order_map[wnode]].first);
1379

	
1380
      while (node != xnode) {
1381
        type_map[node] = LOWX;
1382
        node = _graph.target(node_data[order_map[node]].first);
1383
      }
1384
      type_map[node] = LOWX;
1385

	
1386
      node = _graph.target(node_data[order_map[xnode]].first);
1387
      while (node != root) {
1388
        type_map[node] = HIGHX;
1389
        node = _graph.target(node_data[order_map[node]].first);
1390
      }
1391

	
1392
      type_map[wnode] = PERTINENT;
1393
      type_map[root] = ROOT;
1394
    }
1395

	
1396
    void findInternalPath(std::vector<Arc>& ipath,
1397
                          Node wnode, Node root, TypeMap& type_map,
1398
                          OrderMap& order_map, NodeData& node_data,
1399
                          ArcLists& arc_lists) {
1400
      std::vector<Arc> st;
1401

	
1402
      Node node = wnode;
1403

	
1404
      while (node != root) {
1405
        Arc arc = arc_lists[node_data[order_map[node]].first].next;
1406
        st.push_back(arc);
1407
        node = _graph.target(arc);
1408
      }
1409

	
1410
      while (true) {
1411
        Arc arc = st.back();
1412
        if (type_map[_graph.target(arc)] == LOWX ||
1413
            type_map[_graph.target(arc)] == HIGHX) {
1414
          break;
1415
        }
1416
        if (type_map[_graph.target(arc)] == 2) {
1417
          type_map[_graph.target(arc)] = 3;
1418

	
1419
          arc = arc_lists[_graph.oppositeArc(arc)].next;
1420
          st.push_back(arc);
1421
        } else {
1422
          st.pop_back();
1423
          arc = arc_lists[arc].next;
1424

	
1425
          while (_graph.oppositeArc(arc) == st.back()) {
1426
            arc = st.back();
1427
            st.pop_back();
1428
            arc = arc_lists[arc].next;
1429
          }
1430
          st.push_back(arc);
1431
        }
1432
      }
1433

	
1434
      for (int i = 0; i < int(st.size()); ++i) {
1435
        if (type_map[_graph.target(st[i])] != LOWY &&
1436
            type_map[_graph.target(st[i])] != HIGHY) {
1437
          for (; i < int(st.size()); ++i) {
1438
            ipath.push_back(st[i]);
1439
          }
1440
        }
1441
      }
1442
    }
1443

	
1444
    void setInternalFlags(std::vector<Arc>& ipath, TypeMap& type_map) {
1445
      for (int i = 1; i < int(ipath.size()); ++i) {
1446
        type_map[_graph.source(ipath[i])] = INTERNAL;
1447
      }
1448
    }
1449

	
1450
    void findPilePath(std::vector<Arc>& ppath,
1451
                      Node root, TypeMap& type_map, OrderMap& order_map,
1452
                      NodeData& node_data, ArcLists& arc_lists) {
1453
      std::vector<Arc> st;
1454

	
1455
      st.push_back(_graph.oppositeArc(node_data[order_map[root]].first));
1456
      st.push_back(node_data[order_map[root]].first);
1457

	
1458
      while (st.size() > 1) {
1459
        Arc arc = st.back();
1460
        if (type_map[_graph.target(arc)] == INTERNAL) {
1461
          break;
1462
        }
1463
        if (type_map[_graph.target(arc)] == 3) {
1464
          type_map[_graph.target(arc)] = 4;
1465

	
1466
          arc = arc_lists[_graph.oppositeArc(arc)].next;
1467
          st.push_back(arc);
1468
        } else {
1469
          st.pop_back();
1470
          arc = arc_lists[arc].next;
1471

	
1472
          while (!st.empty() && _graph.oppositeArc(arc) == st.back()) {
1473
            arc = st.back();
1474
            st.pop_back();
1475
            arc = arc_lists[arc].next;
1476
          }
1477
          st.push_back(arc);
1478
        }
1479
      }
1480

	
1481
      for (int i = 1; i < int(st.size()); ++i) {
1482
        ppath.push_back(st[i]);
1483
      }
1484
    }
1485

	
1486

	
1487
    int markExternalPath(Node node, OrderMap& order_map,
1488
                         ChildLists& child_lists, PredMap& pred_map,
1489
                         AncestorMap& ancestor_map, LowMap& low_map) {
1490
      int lp = lowPoint(node, order_map, child_lists,
1491
                        ancestor_map, low_map);
1492

	
1493
      if (ancestor_map[node] != lp) {
1494
        node = child_lists[node].first;
1495
        _kuratowski[pred_map[node]] = true;
1496

	
1497
        while (ancestor_map[node] != lp) {
1498
          for (OutArcIt e(_graph, node); e != INVALID; ++e) {
1499
            Node tnode = _graph.target(e);
1500
            if (order_map[tnode] > order_map[node] && low_map[tnode] == lp) {
1501
              node = tnode;
1502
              _kuratowski[e] = true;
1503
              break;
1504
            }
1505
          }
1506
        }
1507
      }
1508

	
1509
      for (OutArcIt e(_graph, node); e != INVALID; ++e) {
1510
        if (order_map[_graph.target(e)] == lp) {
1511
          _kuratowski[e] = true;
1512
          break;
1513
        }
1514
      }
1515

	
1516
      return lp;
1517
    }
1518

	
1519
    void markPertinentPath(Node node, OrderMap& order_map,
1520
                           NodeData& node_data, ArcLists& arc_lists,
1521
                           EmbedArc& embed_arc, MergeRoots& merge_roots) {
1522
      while (embed_arc[node] == INVALID) {
1523
        int n = merge_roots[node].front();
1524
        Arc arc = node_data[n].first;
1525

	
1526
        _kuratowski.set(arc, true);
1527

	
1528
        Node pred = node;
1529
        node = _graph.target(arc);
1530
        while (!pertinent(node, embed_arc, merge_roots)) {
1531
          arc = node_data[order_map[node]].first;
1532
          if (_graph.target(arc) == pred) {
1533
            arc = arc_lists[arc].next;
1534
          }
1535
          _kuratowski.set(arc, true);
1536
          pred = node;
1537
          node = _graph.target(arc);
1538
        }
1539
      }
1540
      _kuratowski.set(embed_arc[node], true);
1541
    }
1542

	
1543
    void markPredPath(Node node, Node snode, PredMap& pred_map) {
1544
      while (node != snode) {
1545
        _kuratowski.set(pred_map[node], true);
1546
        node = _graph.source(pred_map[node]);
1547
      }
1548
    }
1549

	
1550
    void markFacePath(Node ynode, Node xnode,
1551
                      OrderMap& order_map, NodeData& node_data) {
1552
      Arc arc = node_data[order_map[ynode]].first;
1553
      Node node = _graph.target(arc);
1554
      _kuratowski.set(arc, true);
1555

	
1556
      while (node != xnode) {
1557
        arc = node_data[order_map[node]].first;
1558
        _kuratowski.set(arc, true);
1559
        node = _graph.target(arc);
1560
      }
1561
    }
1562

	
1563
    void markInternalPath(std::vector<Arc>& path) {
1564
      for (int i = 0; i < int(path.size()); ++i) {
1565
        _kuratowski.set(path[i], true);
1566
      }
1567
    }
1568

	
1569
    void markPilePath(std::vector<Arc>& path) {
1570
      for (int i = 0; i < int(path.size()); ++i) {
1571
        _kuratowski.set(path[i], true);
1572
      }
1573
    }
1574

	
1575
    void isolateKuratowski(Arc arc, NodeData& node_data,
1576
                           ArcLists& arc_lists, FlipMap& flip_map,
1577
                           OrderMap& order_map, OrderList& order_list,
1578
                           PredMap& pred_map, ChildLists& child_lists,
1579
                           AncestorMap& ancestor_map, LowMap& low_map,
1580
                           EmbedArc& embed_arc, MergeRoots& merge_roots) {
1581

	
1582
      Node root = _graph.source(arc);
1583
      Node enode = _graph.target(arc);
1584

	
1585
      int rorder = order_map[root];
1586

	
1587
      TypeMap type_map(_graph, 0);
1588

	
1589
      int rn = findComponentRoot(root, enode, child_lists,
1590
                                 order_map, order_list);
1591

	
1592
      Node xnode = order_list[node_data[rn].next];
1593
      Node ynode = order_list[node_data[rn].prev];
1594

	
1595
      // Minor-A
1596
      {
1597
        while (!merge_roots[xnode].empty() || !merge_roots[ynode].empty()) {
1598

	
1599
          if (!merge_roots[xnode].empty()) {
1600
            root = xnode;
1601
            rn = merge_roots[xnode].front();
1602
          } else {
1603
            root = ynode;
1604
            rn = merge_roots[ynode].front();
1605
          }
1606

	
1607
          xnode = order_list[node_data[rn].next];
1608
          ynode = order_list[node_data[rn].prev];
1609
        }
1610

	
1611
        if (root != _graph.source(arc)) {
1612
          orientComponent(root, rn, order_map, pred_map,
1613
                          node_data, arc_lists, flip_map, type_map);
1614
          markFacePath(root, root, order_map, node_data);
1615
          int xlp = markExternalPath(xnode, order_map, child_lists,
1616
                                     pred_map, ancestor_map, low_map);
1617
          int ylp = markExternalPath(ynode, order_map, child_lists,
1618
                                     pred_map, ancestor_map, low_map);
1619
          markPredPath(root, order_list[xlp < ylp ? xlp : ylp], pred_map);
1620
          Node lwnode = findPertinent(ynode, order_map, node_data,
1621
                                      embed_arc, merge_roots);
1622

	
1623
          markPertinentPath(lwnode, order_map, node_data, arc_lists,
1624
                            embed_arc, merge_roots);
1625

	
1626
          return;
1627
        }
1628
      }
1629

	
1630
      orientComponent(root, rn, order_map, pred_map,
1631
                      node_data, arc_lists, flip_map, type_map);
1632

	
1633
      Node wnode = findPertinent(ynode, order_map, node_data,
1634
                                 embed_arc, merge_roots);
1635
      setFaceFlags(root, wnode, ynode, xnode, order_map, node_data, type_map);
1636

	
1637

	
1638
      //Minor-B
1639
      if (!merge_roots[wnode].empty()) {
1640
        int cn = merge_roots[wnode].back();
1641
        Node rep = order_list[cn - order_list.size()];
1642
        if (low_map[rep] < rorder) {
1643
          markFacePath(root, root, order_map, node_data);
1644
          int xlp = markExternalPath(xnode, order_map, child_lists,
1645
                                     pred_map, ancestor_map, low_map);
1646
          int ylp = markExternalPath(ynode, order_map, child_lists,
1647
                                     pred_map, ancestor_map, low_map);
1648

	
1649
          Node lwnode, lznode;
1650
          markCommonPath(wnode, rorder, lwnode, lznode, order_list,
1651
                         order_map, node_data, arc_lists, embed_arc,
1652
                         merge_roots, child_lists, ancestor_map, low_map);
1653

	
1654
          markPertinentPath(lwnode, order_map, node_data, arc_lists,
1655
                            embed_arc, merge_roots);
1656
          int zlp = markExternalPath(lznode, order_map, child_lists,
1657
                                     pred_map, ancestor_map, low_map);
1658

	
1659
          int minlp = xlp < ylp ? xlp : ylp;
1660
          if (zlp < minlp) minlp = zlp;
1661

	
1662
          int maxlp = xlp > ylp ? xlp : ylp;
1663
          if (zlp > maxlp) maxlp = zlp;
1664

	
1665
          markPredPath(order_list[maxlp], order_list[minlp], pred_map);
1666

	
1667
          return;
1668
        }
1669
      }
1670

	
1671
      Node pxnode, pynode;
1672
      std::vector<Arc> ipath;
1673
      findInternalPath(ipath, wnode, root, type_map, order_map,
1674
                       node_data, arc_lists);
1675
      setInternalFlags(ipath, type_map);
1676
      pynode = _graph.source(ipath.front());
1677
      pxnode = _graph.target(ipath.back());
1678

	
1679
      wnode = findPertinent(pynode, order_map, node_data,
1680
                            embed_arc, merge_roots);
1681

	
1682
      // Minor-C
1683
      {
1684
        if (type_map[_graph.source(ipath.front())] == HIGHY) {
1685
          if (type_map[_graph.target(ipath.back())] == HIGHX) {
1686
            markFacePath(xnode, pxnode, order_map, node_data);
1687
          }
1688
          markFacePath(root, xnode, order_map, node_data);
1689
          markPertinentPath(wnode, order_map, node_data, arc_lists,
1690
                            embed_arc, merge_roots);
1691
          markInternalPath(ipath);
1692
          int xlp = markExternalPath(xnode, order_map, child_lists,
1693
                                     pred_map, ancestor_map, low_map);
1694
          int ylp = markExternalPath(ynode, order_map, child_lists,
1695
                                     pred_map, ancestor_map, low_map);
1696
          markPredPath(root, order_list[xlp < ylp ? xlp : ylp], pred_map);
1697
          return;
1698
        }
1699

	
1700
        if (type_map[_graph.target(ipath.back())] == HIGHX) {
1701
          markFacePath(ynode, root, order_map, node_data);
1702
          markPertinentPath(wnode, order_map, node_data, arc_lists,
1703
                            embed_arc, merge_roots);
1704
          markInternalPath(ipath);
1705
          int xlp = markExternalPath(xnode, order_map, child_lists,
1706
                                     pred_map, ancestor_map, low_map);
1707
          int ylp = markExternalPath(ynode, order_map, child_lists,
1708
                                     pred_map, ancestor_map, low_map);
1709
          markPredPath(root, order_list[xlp < ylp ? xlp : ylp], pred_map);
1710
          return;
1711
        }
1712
      }
1713

	
1714
      std::vector<Arc> ppath;
1715
      findPilePath(ppath, root, type_map, order_map, node_data, arc_lists);
1716

	
1717
      // Minor-D
1718
      if (!ppath.empty()) {
1719
        markFacePath(ynode, xnode, order_map, node_data);
1720
        markPertinentPath(wnode, order_map, node_data, arc_lists,
1721
                          embed_arc, merge_roots);
1722
        markPilePath(ppath);
1723
        markInternalPath(ipath);
1724
        int xlp = markExternalPath(xnode, order_map, child_lists,
1725
                                   pred_map, ancestor_map, low_map);
1726
        int ylp = markExternalPath(ynode, order_map, child_lists,
1727
                                   pred_map, ancestor_map, low_map);
1728
        markPredPath(root, order_list[xlp < ylp ? xlp : ylp], pred_map);
1729
        return;
1730
      }
1731

	
1732
      // Minor-E*
1733
      {
1734

	
1735
        if (!external(wnode, rorder, child_lists, ancestor_map, low_map)) {
1736
          Node znode = findExternal(pynode, rorder, order_map,
1737
                                    child_lists, ancestor_map,
1738
                                    low_map, node_data);
1739

	
1740
          if (type_map[znode] == LOWY) {
1741
            markFacePath(root, xnode, order_map, node_data);
1742
            markPertinentPath(wnode, order_map, node_data, arc_lists,
1743
                              embed_arc, merge_roots);
1744
            markInternalPath(ipath);
1745
            int xlp = markExternalPath(xnode, order_map, child_lists,
1746
                                       pred_map, ancestor_map, low_map);
1747
            int zlp = markExternalPath(znode, order_map, child_lists,
1748
                                       pred_map, ancestor_map, low_map);
1749
            markPredPath(root, order_list[xlp < zlp ? xlp : zlp], pred_map);
1750
          } else {
1751
            markFacePath(ynode, root, order_map, node_data);
1752
            markPertinentPath(wnode, order_map, node_data, arc_lists,
1753
                              embed_arc, merge_roots);
1754
            markInternalPath(ipath);
1755
            int ylp = markExternalPath(ynode, order_map, child_lists,
1756
                                       pred_map, ancestor_map, low_map);
1757
            int zlp = markExternalPath(znode, order_map, child_lists,
1758
                                       pred_map, ancestor_map, low_map);
1759
            markPredPath(root, order_list[ylp < zlp ? ylp : zlp], pred_map);
1760
          }
1761
          return;
1762
        }
1763

	
1764
        int xlp = markExternalPath(xnode, order_map, child_lists,
1765
                                   pred_map, ancestor_map, low_map);
1766
        int ylp = markExternalPath(ynode, order_map, child_lists,
1767
                                   pred_map, ancestor_map, low_map);
1768
        int wlp = markExternalPath(wnode, order_map, child_lists,
1769
                                   pred_map, ancestor_map, low_map);
1770

	
1771
        if (wlp > xlp && wlp > ylp) {
1772
          markFacePath(root, root, order_map, node_data);
1773
          markPredPath(root, order_list[xlp < ylp ? xlp : ylp], pred_map);
1774
          return;
1775
        }
1776

	
1777
        markInternalPath(ipath);
1778
        markPertinentPath(wnode, order_map, node_data, arc_lists,
1779
                          embed_arc, merge_roots);
1780

	
1781
        if (xlp > ylp && xlp > wlp) {
1782
          markFacePath(root, pynode, order_map, node_data);
1783
          markFacePath(wnode, xnode, order_map, node_data);
1784
          markPredPath(root, order_list[ylp < wlp ? ylp : wlp], pred_map);
1785
          return;
1786
        }
1787

	
1788
        if (ylp > xlp && ylp > wlp) {
1789
          markFacePath(pxnode, root, order_map, node_data);
1790
          markFacePath(ynode, wnode, order_map, node_data);
1791
          markPredPath(root, order_list[xlp < wlp ? xlp : wlp], pred_map);
1792
          return;
1793
        }
1794

	
1795
        if (pynode != ynode) {
1796
          markFacePath(pxnode, wnode, order_map, node_data);
1797

	
1798
          int minlp = xlp < ylp ? xlp : ylp;
1799
          if (wlp < minlp) minlp = wlp;
1800

	
1801
          int maxlp = xlp > ylp ? xlp : ylp;
1802
          if (wlp > maxlp) maxlp = wlp;
1803

	
1804
          markPredPath(order_list[maxlp], order_list[minlp], pred_map);
1805
          return;
1806
        }
1807

	
1808
        if (pxnode != xnode) {
1809
          markFacePath(wnode, pynode, order_map, node_data);
1810

	
1811
          int minlp = xlp < ylp ? xlp : ylp;
1812
          if (wlp < minlp) minlp = wlp;
1813

	
1814
          int maxlp = xlp > ylp ? xlp : ylp;
1815
          if (wlp > maxlp) maxlp = wlp;
1816

	
1817
          markPredPath(order_list[maxlp], order_list[minlp], pred_map);
1818
          return;
1819
        }
1820

	
1821
        markFacePath(root, root, order_map, node_data);
1822
        int minlp = xlp < ylp ? xlp : ylp;
1823
        if (wlp < minlp) minlp = wlp;
1824
        markPredPath(root, order_list[minlp], pred_map);
1825
        return;
1826
      }
1827

	
1828
    }
1829

	
1830
  };
1831

	
1832
  namespace _planarity_bits {
1833

	
1834
    template <typename Graph, typename EmbeddingMap>
1835
    void makeConnected(Graph& graph, EmbeddingMap& embedding) {
1836
      DfsVisitor<Graph> null_visitor;
1837
      DfsVisit<Graph, DfsVisitor<Graph> > dfs(graph, null_visitor);
1838
      dfs.init();
1839

	
1840
      typename Graph::Node u = INVALID;
1841
      for (typename Graph::NodeIt n(graph); n != INVALID; ++n) {
1842
        if (!dfs.reached(n)) {
1843
          dfs.addSource(n);
1844
          dfs.start();
1845
          if (u == INVALID) {
1846
            u = n;
1847
          } else {
1848
            typename Graph::Node v = n;
1849

	
1850
            typename Graph::Arc ue = typename Graph::OutArcIt(graph, u);
1851
            typename Graph::Arc ve = typename Graph::OutArcIt(graph, v);
1852

	
1853
            typename Graph::Arc e = graph.direct(graph.addEdge(u, v), true);
1854

	
1855
            if (ue != INVALID) {
1856
              embedding[e] = embedding[ue];
1857
              embedding[ue] = e;
1858
            } else {
1859
              embedding[e] = e;
1860
            }
1861

	
1862
            if (ve != INVALID) {
1863
              embedding[graph.oppositeArc(e)] = embedding[ve];
1864
              embedding[ve] = graph.oppositeArc(e);
1865
            } else {
1866
              embedding[graph.oppositeArc(e)] = graph.oppositeArc(e);
1867
            }
1868
          }
1869
        }
1870
      }
1871
    }
1872

	
1873
    template <typename Graph, typename EmbeddingMap>
1874
    void makeBiNodeConnected(Graph& graph, EmbeddingMap& embedding) {
1875
      typename Graph::template ArcMap<bool> processed(graph);
1876

	
1877
      std::vector<typename Graph::Arc> arcs;
1878
      for (typename Graph::ArcIt e(graph); e != INVALID; ++e) {
1879
        arcs.push_back(e);
1880
      }
1881

	
1882
      IterableBoolMap<Graph, typename Graph::Node> visited(graph, false);
1883

	
1884
      for (int i = 0; i < int(arcs.size()); ++i) {
1885
        typename Graph::Arc pp = arcs[i];
1886
        if (processed[pp]) continue;
1887

	
1888
        typename Graph::Arc e = embedding[graph.oppositeArc(pp)];
1889
        processed[e] = true;
1890
        visited.set(graph.source(e), true);
1891

	
1892
        typename Graph::Arc p = e, l = e;
1893
        e = embedding[graph.oppositeArc(e)];
1894

	
1895
        while (e != l) {
1896
          processed[e] = true;
1897

	
1898
          if (visited[graph.source(e)]) {
1899

	
1900
            typename Graph::Arc n =
1901
              graph.direct(graph.addEdge(graph.source(p),
1902
                                           graph.target(e)), true);
1903
            embedding[n] = p;
1904
            embedding[graph.oppositeArc(pp)] = n;
1905

	
1906
            embedding[graph.oppositeArc(n)] =
1907
              embedding[graph.oppositeArc(e)];
1908
            embedding[graph.oppositeArc(e)] =
1909
              graph.oppositeArc(n);
1910

	
1911
            p = n;
1912
            e = embedding[graph.oppositeArc(n)];
1913
          } else {
1914
            visited.set(graph.source(e), true);
1915
            pp = p;
1916
            p = e;
1917
            e = embedding[graph.oppositeArc(e)];
1918
          }
1919
        }
1920
        visited.setAll(false);
1921
      }
1922
    }
1923

	
1924

	
1925
    template <typename Graph, typename EmbeddingMap>
1926
    void makeMaxPlanar(Graph& graph, EmbeddingMap& embedding) {
1927

	
1928
      typename Graph::template NodeMap<int> degree(graph);
1929

	
1930
      for (typename Graph::NodeIt n(graph); n != INVALID; ++n) {
1931
        degree[n] = countIncEdges(graph, n);
1932
      }
1933

	
1934
      typename Graph::template ArcMap<bool> processed(graph);
1935
      IterableBoolMap<Graph, typename Graph::Node> visited(graph, false);
1936

	
1937
      std::vector<typename Graph::Arc> arcs;
1938
      for (typename Graph::ArcIt e(graph); e != INVALID; ++e) {
1939
        arcs.push_back(e);
1940
      }
1941

	
1942
      for (int i = 0; i < int(arcs.size()); ++i) {
1943
        typename Graph::Arc e = arcs[i];
1944

	
1945
        if (processed[e]) continue;
1946
        processed[e] = true;
1947

	
1948
        typename Graph::Arc mine = e;
1949
        int mind = degree[graph.source(e)];
1950

	
1951
        int face_size = 1;
1952

	
1953
        typename Graph::Arc l = e;
1954
        e = embedding[graph.oppositeArc(e)];
1955
        while (l != e) {
1956
          processed[e] = true;
1957

	
1958
          ++face_size;
1959

	
1960
          if (degree[graph.source(e)] < mind) {
1961
            mine = e;
1962
            mind = degree[graph.source(e)];
1963
          }
1964

	
1965
          e = embedding[graph.oppositeArc(e)];
1966
        }
1967

	
1968
        if (face_size < 4) {
1969
          continue;
1970
        }
1971

	
1972
        typename Graph::Node s = graph.source(mine);
1973
        for (typename Graph::OutArcIt e(graph, s); e != INVALID; ++e) {
1974
          visited.set(graph.target(e), true);
1975
        }
1976

	
1977
        typename Graph::Arc oppe = INVALID;
1978

	
1979
        e = embedding[graph.oppositeArc(mine)];
1980
        e = embedding[graph.oppositeArc(e)];
1981
        while (graph.target(e) != s) {
1982
          if (visited[graph.source(e)]) {
1983
            oppe = e;
1984
            break;
1985
          }
1986
          e = embedding[graph.oppositeArc(e)];
1987
        }
1988
        visited.setAll(false);
1989

	
1990
        if (oppe == INVALID) {
1991

	
1992
          e = embedding[graph.oppositeArc(mine)];
1993
          typename Graph::Arc pn = mine, p = e;
1994

	
1995
          e = embedding[graph.oppositeArc(e)];
1996
          while (graph.target(e) != s) {
1997
            typename Graph::Arc n =
1998
              graph.direct(graph.addEdge(s, graph.source(e)), true);
1999

	
2000
            embedding[n] = pn;
2001
            embedding[graph.oppositeArc(n)] = e;
2002
            embedding[graph.oppositeArc(p)] = graph.oppositeArc(n);
2003

	
2004
            pn = n;
2005

	
2006
            p = e;
2007
            e = embedding[graph.oppositeArc(e)];
2008
          }
2009

	
2010
          embedding[graph.oppositeArc(e)] = pn;
2011

	
2012
        } else {
2013

	
2014
          mine = embedding[graph.oppositeArc(mine)];
2015
          s = graph.source(mine);
2016
          oppe = embedding[graph.oppositeArc(oppe)];
2017
          typename Graph::Node t = graph.source(oppe);
2018

	
2019
          typename Graph::Arc ce = graph.direct(graph.addEdge(s, t), true);
2020
          embedding[ce] = mine;
2021
          embedding[graph.oppositeArc(ce)] = oppe;
2022

	
2023
          typename Graph::Arc pn = ce, p = oppe;
2024
          e = embedding[graph.oppositeArc(oppe)];
2025
          while (graph.target(e) != s) {
2026
            typename Graph::Arc n =
2027
              graph.direct(graph.addEdge(s, graph.source(e)), true);
2028

	
2029
            embedding[n] = pn;
2030
            embedding[graph.oppositeArc(n)] = e;
2031
            embedding[graph.oppositeArc(p)] = graph.oppositeArc(n);
2032

	
2033
            pn = n;
2034

	
2035
            p = e;
2036
            e = embedding[graph.oppositeArc(e)];
2037

	
2038
          }
2039
          embedding[graph.oppositeArc(e)] = pn;
2040

	
2041
          pn = graph.oppositeArc(ce), p = mine;
2042
          e = embedding[graph.oppositeArc(mine)];
2043
          while (graph.target(e) != t) {
2044
            typename Graph::Arc n =
2045
              graph.direct(graph.addEdge(t, graph.source(e)), true);
2046

	
2047
            embedding[n] = pn;
2048
            embedding[graph.oppositeArc(n)] = e;
2049
            embedding[graph.oppositeArc(p)] = graph.oppositeArc(n);
2050

	
2051
            pn = n;
2052

	
2053
            p = e;
2054
            e = embedding[graph.oppositeArc(e)];
2055

	
2056
          }
2057
          embedding[graph.oppositeArc(e)] = pn;
2058
        }
2059
      }
2060
    }
2061

	
2062
  }
2063

	
2064
  /// \ingroup planar
2065
  ///
2066
  /// \brief Schnyder's planar drawing algorithm
2067
  ///
2068
  /// The planar drawing algorithm calculates positions for the nodes
2069
  /// in the plane. These coordinates satisfy that if the edges are
2070
  /// represented with straight lines, then they will not intersect
2071
  /// each other.
2072
  ///
2073
  /// Scnyder's algorithm embeds the graph on an \c (n-2)x(n-2) size grid,
2074
  /// i.e. each node will be located in the \c [0..n-2]x[0..n-2] square.
2075
  /// The time complexity of the algorithm is O(n).
2076
  ///
2077
  /// \see PlanarEmbedding
2078
  template <typename Graph>
2079
  class PlanarDrawing {
2080
  public:
2081

	
2082
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
2083

	
2084
    /// \brief The point type for storing coordinates
2085
    typedef dim2::Point<int> Point;
2086
    /// \brief The map type for storing the coordinates of the nodes
2087
    typedef typename Graph::template NodeMap<Point> PointMap;
2088

	
2089

	
2090
    /// \brief Constructor
2091
    ///
2092
    /// Constructor
2093
    /// \pre The graph must be simple, i.e. it should not
2094
    /// contain parallel or loop arcs.
2095
    PlanarDrawing(const Graph& graph)
2096
      : _graph(graph), _point_map(graph) {}
2097

	
2098
  private:
2099

	
2100
    template <typename AuxGraph, typename AuxEmbeddingMap>
2101
    void drawing(const AuxGraph& graph,
2102
                 const AuxEmbeddingMap& next,
2103
                 PointMap& point_map) {
2104
      TEMPLATE_GRAPH_TYPEDEFS(AuxGraph);
2105

	
2106
      typename AuxGraph::template ArcMap<Arc> prev(graph);
2107

	
2108
      for (NodeIt n(graph); n != INVALID; ++n) {
2109
        Arc e = OutArcIt(graph, n);
2110

	
2111
        Arc p = e, l = e;
2112

	
2113
        e = next[e];
2114
        while (e != l) {
2115
          prev[e] = p;
2116
          p = e;
2117
          e = next[e];
2118
        }
2119
        prev[e] = p;
2120
      }
2121

	
2122
      Node anode, bnode, cnode;
2123

	
2124
      {
2125
        Arc e = ArcIt(graph);
2126
        anode = graph.source(e);
2127
        bnode = graph.target(e);
2128
        cnode = graph.target(next[graph.oppositeArc(e)]);
2129
      }
2130

	
2131
      IterableBoolMap<AuxGraph, Node> proper(graph, false);
2132
      typename AuxGraph::template NodeMap<int> conn(graph, -1);
2133

	
2134
      conn[anode] = conn[bnode] = -2;
2135
      {
2136
        for (OutArcIt e(graph, anode); e != INVALID; ++e) {
2137
          Node m = graph.target(e);
2138
          if (conn[m] == -1) {
2139
            conn[m] = 1;
2140
          }
2141
        }
2142
        conn[cnode] = 2;
2143

	
2144
        for (OutArcIt e(graph, bnode); e != INVALID; ++e) {
2145
          Node m = graph.target(e);
2146
          if (conn[m] == -1) {
2147
            conn[m] = 1;
2148
          } else if (conn[m] != -2) {
2149
            conn[m] += 1;
2150
            Arc pe = graph.oppositeArc(e);
2151
            if (conn[graph.target(next[pe])] == -2) {
2152
              conn[m] -= 1;
2153
            }
2154
            if (conn[graph.target(prev[pe])] == -2) {
2155
              conn[m] -= 1;
2156
            }
2157

	
2158
            proper.set(m, conn[m] == 1);
2159
          }
2160
        }
2161
      }
2162

	
2163

	
2164
      typename AuxGraph::template ArcMap<int> angle(graph, -1);
2165

	
2166
      while (proper.trueNum() != 0) {
2167
        Node n = typename IterableBoolMap<AuxGraph, Node>::TrueIt(proper);
2168
        proper.set(n, false);
2169
        conn[n] = -2;
2170

	
2171
        for (OutArcIt e(graph, n); e != INVALID; ++e) {
2172
          Node m = graph.target(e);
2173
          if (conn[m] == -1) {
2174
            conn[m] = 1;
2175
          } else if (conn[m] != -2) {
2176
            conn[m] += 1;
2177
            Arc pe = graph.oppositeArc(e);
2178
            if (conn[graph.target(next[pe])] == -2) {
2179
              conn[m] -= 1;
2180
            }
2181
            if (conn[graph.target(prev[pe])] == -2) {
2182
              conn[m] -= 1;
2183
            }
2184

	
2185
            proper.set(m, conn[m] == 1);
2186
          }
2187
        }
2188

	
2189
        {
2190
          Arc e = OutArcIt(graph, n);
2191
          Arc p = e, l = e;
2192

	
2193
          e = next[e];
2194
          while (e != l) {
2195

	
2196
            if (conn[graph.target(e)] == -2 && conn[graph.target(p)] == -2) {
2197
              Arc f = e;
2198
              angle[f] = 0;
2199
              f = next[graph.oppositeArc(f)];
2200
              angle[f] = 1;
2201
              f = next[graph.oppositeArc(f)];
2202
              angle[f] = 2;
2203
            }
2204

	
2205
            p = e;
2206
            e = next[e];
2207
          }
2208

	
2209
          if (conn[graph.target(e)] == -2 && conn[graph.target(p)] == -2) {
2210
            Arc f = e;
2211
            angle[f] = 0;
2212
            f = next[graph.oppositeArc(f)];
2213
            angle[f] = 1;
2214
            f = next[graph.oppositeArc(f)];
2215
            angle[f] = 2;
2216
          }
2217
        }
2218
      }
2219

	
2220
      typename AuxGraph::template NodeMap<Node> apred(graph, INVALID);
2221
      typename AuxGraph::template NodeMap<Node> bpred(graph, INVALID);
2222
      typename AuxGraph::template NodeMap<Node> cpred(graph, INVALID);
2223

	
2224
      typename AuxGraph::template NodeMap<int> apredid(graph, -1);
2225
      typename AuxGraph::template NodeMap<int> bpredid(graph, -1);
2226
      typename AuxGraph::template NodeMap<int> cpredid(graph, -1);
2227

	
2228
      for (ArcIt e(graph); e != INVALID; ++e) {
2229
        if (angle[e] == angle[next[e]]) {
2230
          switch (angle[e]) {
2231
          case 2:
2232
            apred[graph.target(e)] = graph.source(e);
2233
            apredid[graph.target(e)] = graph.id(graph.source(e));
2234
            break;
2235
          case 1:
2236
            bpred[graph.target(e)] = graph.source(e);
2237
            bpredid[graph.target(e)] = graph.id(graph.source(e));
2238
            break;
2239
          case 0:
2240
            cpred[graph.target(e)] = graph.source(e);
2241
            cpredid[graph.target(e)] = graph.id(graph.source(e));
2242
            break;
2243
          }
2244
        }
2245
      }
2246

	
2247
      cpred[anode] = INVALID;
2248
      cpred[bnode] = INVALID;
2249

	
2250
      std::vector<Node> aorder, border, corder;
2251

	
2252
      {
2253
        typename AuxGraph::template NodeMap<bool> processed(graph, false);
2254
        std::vector<Node> st;
2255
        for (NodeIt n(graph); n != INVALID; ++n) {
2256
          if (!processed[n] && n != bnode && n != cnode) {
2257
            st.push_back(n);
2258
            processed[n] = true;
2259
            Node m = apred[n];
2260
            while (m != INVALID && !processed[m]) {
2261
              st.push_back(m);
2262
              processed[m] = true;
2263
              m = apred[m];
2264
            }
2265
            while (!st.empty()) {
2266
              aorder.push_back(st.back());
2267
              st.pop_back();
2268
            }
2269
          }
2270
        }
2271
      }
2272

	
2273
      {
2274
        typename AuxGraph::template NodeMap<bool> processed(graph, false);
2275
        std::vector<Node> st;
2276
        for (NodeIt n(graph); n != INVALID; ++n) {
2277
          if (!processed[n] && n != cnode && n != anode) {
2278
            st.push_back(n);
2279
            processed[n] = true;
2280
            Node m = bpred[n];
2281
            while (m != INVALID && !processed[m]) {
2282
              st.push_back(m);
2283
              processed[m] = true;
2284
              m = bpred[m];
2285
            }
2286
            while (!st.empty()) {
2287
              border.push_back(st.back());
2288
              st.pop_back();
2289
            }
2290
          }
2291
        }
2292
      }
2293

	
2294
      {
2295
        typename AuxGraph::template NodeMap<bool> processed(graph, false);
2296
        std::vector<Node> st;
2297
        for (NodeIt n(graph); n != INVALID; ++n) {
2298
          if (!processed[n] && n != anode && n != bnode) {
2299
            st.push_back(n);
2300
            processed[n] = true;
2301
            Node m = cpred[n];
2302
            while (m != INVALID && !processed[m]) {
2303
              st.push_back(m);
2304
              processed[m] = true;
2305
              m = cpred[m];
2306
            }
2307
            while (!st.empty()) {
2308
              corder.push_back(st.back());
2309
              st.pop_back();
2310
            }
2311
          }
2312
        }
2313
      }
2314

	
2315
      typename AuxGraph::template NodeMap<int> atree(graph, 0);
2316
      for (int i = aorder.size() - 1; i >= 0; --i) {
2317
        Node n = aorder[i];
2318
        atree[n] = 1;
2319
        for (OutArcIt e(graph, n); e != INVALID; ++e) {
2320
          if (apred[graph.target(e)] == n) {
2321
            atree[n] += atree[graph.target(e)];
2322
          }
2323
        }
2324
      }
2325

	
2326
      typename AuxGraph::template NodeMap<int> btree(graph, 0);
2327
      for (int i = border.size() - 1; i >= 0; --i) {
2328
        Node n = border[i];
2329
        btree[n] = 1;
2330
        for (OutArcIt e(graph, n); e != INVALID; ++e) {
2331
          if (bpred[graph.target(e)] == n) {
2332
            btree[n] += btree[graph.target(e)];
2333
          }
2334
        }
2335
      }
2336

	
2337
      typename AuxGraph::template NodeMap<int> apath(graph, 0);
2338
      apath[bnode] = apath[cnode] = 1;
2339
      typename AuxGraph::template NodeMap<int> apath_btree(graph, 0);
2340
      apath_btree[bnode] = btree[bnode];
2341
      for (int i = 1; i < int(aorder.size()); ++i) {
2342
        Node n = aorder[i];
2343
        apath[n] = apath[apred[n]] + 1;
2344
        apath_btree[n] = btree[n] + apath_btree[apred[n]];
2345
      }
2346

	
2347
      typename AuxGraph::template NodeMap<int> bpath_atree(graph, 0);
2348
      bpath_atree[anode] = atree[anode];
2349
      for (int i = 1; i < int(border.size()); ++i) {
2350
        Node n = border[i];
2351
        bpath_atree[n] = atree[n] + bpath_atree[bpred[n]];
2352
      }
2353

	
2354
      typename AuxGraph::template NodeMap<int> cpath(graph, 0);
2355
      cpath[anode] = cpath[bnode] = 1;
2356
      typename AuxGraph::template NodeMap<int> cpath_atree(graph, 0);
2357
      cpath_atree[anode] = atree[anode];
2358
      typename AuxGraph::template NodeMap<int> cpath_btree(graph, 0);
2359
      cpath_btree[bnode] = btree[bnode];
2360
      for (int i = 1; i < int(corder.size()); ++i) {
2361
        Node n = corder[i];
2362
        cpath[n] = cpath[cpred[n]] + 1;
2363
        cpath_atree[n] = atree[n] + cpath_atree[cpred[n]];
2364
        cpath_btree[n] = btree[n] + cpath_btree[cpred[n]];
2365
      }
2366

	
2367
      typename AuxGraph::template NodeMap<int> third(graph);
2368
      for (NodeIt n(graph); n != INVALID; ++n) {
2369
        point_map[n].x =
2370
          bpath_atree[n] + cpath_atree[n] - atree[n] - cpath[n] + 1;
2371
        point_map[n].y =
2372
          cpath_btree[n] + apath_btree[n] - btree[n] - apath[n] + 1;
2373
      }
2374

	
2375
    }
2376

	
2377
  public:
2378

	
2379
    /// \brief Calculate the node positions
2380
    ///
2381
    /// This function calculates the node positions on the plane.
2382
    /// \return \c true if the graph is planar.
2383
    bool run() {
2384
      PlanarEmbedding<Graph> pe(_graph);
2385
      if (!pe.run()) return false;
2386

	
2387
      run(pe);
2388
      return true;
2389
    }
2390

	
2391
    /// \brief Calculate the node positions according to a
2392
    /// combinatorical embedding
2393
    ///
2394
    /// This function calculates the node positions on the plane.
2395
    /// The given \c embedding map should contain a valid combinatorical
2396
    /// embedding, i.e. a valid cyclic order of the arcs.
2397
    /// It can be computed using PlanarEmbedding.
2398
    template <typename EmbeddingMap>
2399
    void run(const EmbeddingMap& embedding) {
2400
      typedef SmartEdgeSet<Graph> AuxGraph;
2401

	
2402
      if (3 * countNodes(_graph) - 6 == countEdges(_graph)) {
2403
        drawing(_graph, embedding, _point_map);
2404
        return;
2405
      }
2406

	
2407
      AuxGraph aux_graph(_graph);
2408
      typename AuxGraph::template ArcMap<typename AuxGraph::Arc>
2409
        aux_embedding(aux_graph);
2410

	
2411
      {
2412

	
2413
        typename Graph::template EdgeMap<typename AuxGraph::Edge>
2414
          ref(_graph);
2415

	
2416
        for (EdgeIt e(_graph); e != INVALID; ++e) {
2417
          ref[e] = aux_graph.addEdge(_graph.u(e), _graph.v(e));
2418
        }
2419

	
2420
        for (EdgeIt e(_graph); e != INVALID; ++e) {
2421
          Arc ee = embedding[_graph.direct(e, true)];
2422
          aux_embedding[aux_graph.direct(ref[e], true)] =
2423
            aux_graph.direct(ref[ee], _graph.direction(ee));
2424
          ee = embedding[_graph.direct(e, false)];
2425
          aux_embedding[aux_graph.direct(ref[e], false)] =
2426
            aux_graph.direct(ref[ee], _graph.direction(ee));
2427
        }
2428
      }
2429
      _planarity_bits::makeConnected(aux_graph, aux_embedding);
2430
      _planarity_bits::makeBiNodeConnected(aux_graph, aux_embedding);
2431
      _planarity_bits::makeMaxPlanar(aux_graph, aux_embedding);
2432
      drawing(aux_graph, aux_embedding, _point_map);
2433
    }
2434

	
2435
    /// \brief The coordinate of the given node
2436
    ///
2437
    /// This function returns the coordinate of the given node.
2438
    Point operator[](const Node& node) const {
2439
      return _point_map[node];
2440
    }
2441

	
2442
    /// \brief Return the grid embedding in a node map
2443
    ///
2444
    /// This function returns the grid embedding in a node map of
2445
    /// \c dim2::Point<int> coordinates.
2446
    const PointMap& coords() const {
2447
      return _point_map;
2448
    }
2449

	
2450
  private:
2451

	
2452
    const Graph& _graph;
2453
    PointMap _point_map;
2454

	
2455
  };
2456

	
2457
  namespace _planarity_bits {
2458

	
2459
    template <typename ColorMap>
2460
    class KempeFilter {
2461
    public:
2462
      typedef typename ColorMap::Key Key;
2463
      typedef bool Value;
2464

	
2465
      KempeFilter(const ColorMap& color_map,
2466
                  const typename ColorMap::Value& first,
2467
                  const typename ColorMap::Value& second)
2468
        : _color_map(color_map), _first(first), _second(second) {}
2469

	
2470
      Value operator[](const Key& key) const {
2471
        return _color_map[key] == _first || _color_map[key] == _second;
2472
      }
2473

	
2474
    private:
2475
      const ColorMap& _color_map;
2476
      typename ColorMap::Value _first, _second;
2477
    };
2478
  }
2479

	
2480
  /// \ingroup planar
2481
  ///
2482
  /// \brief Coloring planar graphs
2483
  ///
2484
  /// The graph coloring problem is the coloring of the graph nodes
2485
  /// so that there are no adjacent nodes with the same color. The
2486
  /// planar graphs can always be colored with four colors, which is
2487
  /// proved by Appel and Haken. Their proofs provide a quadratic
2488
  /// time algorithm for four coloring, but it could not be used to
2489
  /// implement an efficient algorithm. The five and six coloring can be
2490
  /// made in linear time, but in this class, the five coloring has
2491
  /// quadratic worst case time complexity. The two coloring (if
2492
  /// possible) is solvable with a graph search algorithm and it is
2493
  /// implemented in \ref bipartitePartitions() function in LEMON. To
2494
  /// decide whether a planar graph is three colorable is NP-complete.
2495
  ///
2496
  /// This class contains member functions for calculate colorings
2497
  /// with five and six colors. The six coloring algorithm is a simple
2498
  /// greedy coloring on the backward minimum outgoing order of nodes.
2499
  /// This order can be computed by selecting the node with least
2500
  /// outgoing arcs to unprocessed nodes in each phase. This order
2501
  /// guarantees that when a node is chosen for coloring it has at
2502
  /// most five already colored adjacents. The five coloring algorithm
2503
  /// use the same method, but if the greedy approach fails to color
2504
  /// with five colors, i.e. the node has five already different
2505
  /// colored neighbours, it swaps the colors in one of the connected
2506
  /// two colored sets with the Kempe recoloring method.
2507
  template <typename Graph>
2508
  class PlanarColoring {
2509
  public:
2510

	
2511
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
2512

	
2513
    /// \brief The map type for storing color indices
2514
    typedef typename Graph::template NodeMap<int> IndexMap;
2515
    /// \brief The map type for storing colors
2516
    ///
2517
    /// The map type for storing colors.
2518
    /// \see Palette, Color
2519
    typedef ComposeMap<Palette, IndexMap> ColorMap;
2520

	
2521
    /// \brief Constructor
2522
    ///
2523
    /// Constructor.
2524
    /// \pre The graph must be simple, i.e. it should not
2525
    /// contain parallel or loop arcs.
2526
    PlanarColoring(const Graph& graph)
2527
      : _graph(graph), _color_map(graph), _palette(0) {
2528
      _palette.add(Color(1,0,0));
2529
      _palette.add(Color(0,1,0));
2530
      _palette.add(Color(0,0,1));
2531
      _palette.add(Color(1,1,0));
2532
      _palette.add(Color(1,0,1));
2533
      _palette.add(Color(0,1,1));
2534
    }
2535

	
2536
    /// \brief Return the node map of color indices
2537
    ///
2538
    /// This function returns the node map of color indices. The values are
2539
    /// in the range \c [0..4] or \c [0..5] according to the coloring method.
2540
    IndexMap colorIndexMap() const {
2541
      return _color_map;
2542
    }
2543

	
2544
    /// \brief Return the node map of colors
2545
    ///
2546
    /// This function returns the node map of colors. The values are among
2547
    /// five or six distinct \ref lemon::Color "colors".
2548
    ColorMap colorMap() const {
2549
      return composeMap(_palette, _color_map);
2550
    }
2551

	
2552
    /// \brief Return the color index of the node
2553
    ///
2554
    /// This function returns the color index of the given node. The value is
2555
    /// in the range \c [0..4] or \c [0..5] according to the coloring method.
2556
    int colorIndex(const Node& node) const {
2557
      return _color_map[node];
2558
    }
2559

	
2560
    /// \brief Return the color of the node
2561
    ///
2562
    /// This function returns the color of the given node. The value is among
2563
    /// five or six distinct \ref lemon::Color "colors".
2564
    Color color(const Node& node) const {
2565
      return _palette[_color_map[node]];
2566
    }
2567

	
2568

	
2569
    /// \brief Calculate a coloring with at most six colors
2570
    ///
2571
    /// This function calculates a coloring with at most six colors. The time
2572
    /// complexity of this variant is linear in the size of the graph.
2573
    /// \return \c true if the algorithm could color the graph with six colors.
2574
    /// If the algorithm fails, then the graph is not planar.
2575
    /// \note This function can return \c true if the graph is not
2576
    /// planar, but it can be colored with at most six colors.
2577
    bool runSixColoring() {
2578

	
2579
      typename Graph::template NodeMap<int> heap_index(_graph, -1);
2580
      BucketHeap<typename Graph::template NodeMap<int> > heap(heap_index);
2581

	
2582
      for (NodeIt n(_graph); n != INVALID; ++n) {
2583
        _color_map[n] = -2;
2584
        heap.push(n, countOutArcs(_graph, n));
2585
      }
2586

	
2587
      std::vector<Node> order;
2588

	
2589
      while (!heap.empty()) {
2590
        Node n = heap.top();
2591
        heap.pop();
2592
        _color_map[n] = -1;
2593
        order.push_back(n);
2594
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
2595
          Node t = _graph.runningNode(e);
2596
          if (_color_map[t] == -2) {
2597
            heap.decrease(t, heap[t] - 1);
2598
          }
2599
        }
2600
      }
2601

	
2602
      for (int i = order.size() - 1; i >= 0; --i) {
2603
        std::vector<bool> forbidden(6, false);
2604
        for (OutArcIt e(_graph, order[i]); e != INVALID; ++e) {
2605
          Node t = _graph.runningNode(e);
2606
          if (_color_map[t] != -1) {
2607
            forbidden[_color_map[t]] = true;
2608
          }
2609
        }
2610
               for (int k = 0; k < 6; ++k) {
2611
          if (!forbidden[k]) {
2612
            _color_map[order[i]] = k;
2613
            break;
2614
          }
2615
        }
2616
        if (_color_map[order[i]] == -1) {
2617
          return false;
2618
        }
2619
      }
2620
      return true;
2621
    }
2622

	
2623
  private:
2624

	
2625
    bool recolor(const Node& u, const Node& v) {
2626
      int ucolor = _color_map[u];
2627
      int vcolor = _color_map[v];
2628
      typedef _planarity_bits::KempeFilter<IndexMap> KempeFilter;
2629
      KempeFilter filter(_color_map, ucolor, vcolor);
2630

	
2631
      typedef FilterNodes<const Graph, const KempeFilter> KempeGraph;
2632
      KempeGraph kempe_graph(_graph, filter);
2633

	
2634
      std::vector<Node> comp;
2635
      Bfs<KempeGraph> bfs(kempe_graph);
2636
      bfs.init();
2637
      bfs.addSource(u);
2638
      while (!bfs.emptyQueue()) {
2639
        Node n = bfs.nextNode();
2640
        if (n == v) return false;
2641
        comp.push_back(n);
2642
        bfs.processNextNode();
2643
      }
2644

	
2645
      int scolor = ucolor + vcolor;
2646
      for (int i = 0; i < static_cast<int>(comp.size()); ++i) {
2647
        _color_map[comp[i]] = scolor - _color_map[comp[i]];
2648
      }
2649

	
2650
      return true;
2651
    }
2652

	
2653
    template <typename EmbeddingMap>
2654
    void kempeRecoloring(const Node& node, const EmbeddingMap& embedding) {
2655
      std::vector<Node> nodes;
2656
      nodes.reserve(4);
2657

	
2658
      for (Arc e = OutArcIt(_graph, node); e != INVALID; e = embedding[e]) {
2659
        Node t = _graph.target(e);
2660
        if (_color_map[t] != -1) {
2661
          nodes.push_back(t);
2662
          if (nodes.size() == 4) break;
2663
        }
2664
      }
2665

	
2666
      int color = _color_map[nodes[0]];
2667
      if (recolor(nodes[0], nodes[2])) {
2668
        _color_map[node] = color;
2669
      } else {
2670
        color = _color_map[nodes[1]];
2671
        recolor(nodes[1], nodes[3]);
2672
        _color_map[node] = color;
2673
      }
2674
    }
2675

	
2676
  public:
2677

	
2678
    /// \brief Calculate a coloring with at most five colors
2679
    ///
2680
    /// This function calculates a coloring with at most five
2681
    /// colors. The worst case time complexity of this variant is
2682
    /// quadratic in the size of the graph.
2683
    /// \param embedding This map should contain a valid combinatorical
2684
    /// embedding, i.e. a valid cyclic order of the arcs.
2685
    /// It can be computed using PlanarEmbedding.
2686
    template <typename EmbeddingMap>
2687
    void runFiveColoring(const EmbeddingMap& embedding) {
2688

	
2689
      typename Graph::template NodeMap<int> heap_index(_graph, -1);
2690
      BucketHeap<typename Graph::template NodeMap<int> > heap(heap_index);
2691

	
2692
      for (NodeIt n(_graph); n != INVALID; ++n) {
2693
        _color_map[n] = -2;
2694
        heap.push(n, countOutArcs(_graph, n));
2695
      }
2696

	
2697
      std::vector<Node> order;
2698

	
2699
      while (!heap.empty()) {
2700
        Node n = heap.top();
2701
        heap.pop();
2702
        _color_map[n] = -1;
2703
        order.push_back(n);
2704
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
2705
          Node t = _graph.runningNode(e);
2706
          if (_color_map[t] == -2) {
2707
            heap.decrease(t, heap[t] - 1);
2708
          }
2709
        }
2710
      }
2711

	
2712
      for (int i = order.size() - 1; i >= 0; --i) {
2713
        std::vector<bool> forbidden(5, false);
2714
        for (OutArcIt e(_graph, order[i]); e != INVALID; ++e) {
2715
          Node t = _graph.runningNode(e);
2716
          if (_color_map[t] != -1) {
2717
            forbidden[_color_map[t]] = true;
2718
          }
2719
        }
2720
        for (int k = 0; k < 5; ++k) {
2721
          if (!forbidden[k]) {
2722
            _color_map[order[i]] = k;
2723
            break;
2724
          }
2725
        }
2726
        if (_color_map[order[i]] == -1) {
2727
          kempeRecoloring(order[i], embedding);
2728
        }
2729
      }
2730
    }
2731

	
2732
    /// \brief Calculate a coloring with at most five colors
2733
    ///
2734
    /// This function calculates a coloring with at most five
2735
    /// colors. The worst case time complexity of this variant is
2736
    /// quadratic in the size of the graph.
2737
    /// \return \c true if the graph is planar.
2738
    bool runFiveColoring() {
2739
      PlanarEmbedding<Graph> pe(_graph);
2740
      if (!pe.run()) return false;
2741

	
2742
      runFiveColoring(pe.embeddingMap());
2743
      return true;
2744
    }
2745

	
2746
  private:
2747

	
2748
    const Graph& _graph;
2749
    IndexMap _color_map;
2750
    Palette _palette;
2751
  };
2752

	
2753
}
2754

	
2755
#endif
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2009
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_QUAD_HEAP_H
20
#define LEMON_QUAD_HEAP_H
21

	
22
///\ingroup heaps
23
///\file
24
///\brief Fourary (quaternary) heap implementation.
25

	
26
#include <vector>
27
#include <utility>
28
#include <functional>
29

	
30
namespace lemon {
31

	
32
  /// \ingroup heaps
33
  ///
34
  ///\brief Fourary (quaternary) heap data structure.
35
  ///
36
  /// This class implements the \e Fourary (\e quaternary) \e heap
37
  /// data structure.
38
  /// It fully conforms to the \ref concepts::Heap "heap concept".
39
  ///
40
  /// The fourary heap is a specialization of the \ref DHeap "D-ary heap"
41
  /// for <tt>D=4</tt>. It is similar to the \ref BinHeap "binary heap",
42
  /// but its nodes have at most four children, instead of two.
43
  ///
44
  /// \tparam PR Type of the priorities of the items.
45
  /// \tparam IM A read-writable item map with \c int values, used
46
  /// internally to handle the cross references.
47
  /// \tparam CMP A functor class for comparing the priorities.
48
  /// The default is \c std::less<PR>.
49
  ///
50
  ///\sa BinHeap
51
  ///\sa DHeap
52
#ifdef DOXYGEN
53
  template <typename PR, typename IM, typename CMP>
54
#else
55
  template <typename PR, typename IM, typename CMP = std::less<PR> >
56
#endif
57
  class QuadHeap {
58
  public:
59
    /// Type of the item-int map.
60
    typedef IM ItemIntMap;
61
    /// Type of the priorities.
62
    typedef PR Prio;
63
    /// Type of the items stored in the heap.
64
    typedef typename ItemIntMap::Key Item;
65
    /// Type of the item-priority pairs.
66
    typedef std::pair<Item,Prio> Pair;
67
    /// Functor type for comparing the priorities.
68
    typedef CMP Compare;
69

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

	
84
  private:
85
    std::vector<Pair> _data;
86
    Compare _comp;
87
    ItemIntMap &_iim;
88

	
89
  public:
90
    /// \brief Constructor.
91
    ///
92
    /// Constructor.
93
    /// \param map A map that assigns \c int values to the items.
94
    /// It is used internally to handle the cross references.
95
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
96
    explicit QuadHeap(ItemIntMap &map) : _iim(map) {}
97

	
98
    /// \brief Constructor.
99
    ///
100
    /// Constructor.
101
    /// \param map A map that assigns \c int values to the items.
102
    /// It is used internally to handle the cross references.
103
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
104
    /// \param comp The function object used for comparing the priorities.
105
    QuadHeap(ItemIntMap &map, const Compare &comp)
106
      : _iim(map), _comp(comp) {}
107

	
108
    /// \brief The number of items stored in the heap.
109
    ///
110
    /// This function returns the number of items stored in the heap.
111
    int size() const { return _data.size(); }
112

	
113
    /// \brief Check if the heap is empty.
114
    ///
115
    /// This function returns \c true if the heap is empty.
116
    bool empty() const { return _data.empty(); }
117

	
118
    /// \brief Make the heap empty.
119
    ///
120
    /// This functon makes the heap empty.
121
    /// It does not change the cross reference map. If you want to reuse
122
    /// a heap that is not surely empty, you should first clear it and
123
    /// then you should set the cross reference map to \c PRE_HEAP
124
    /// for each item.
125
    void clear() { _data.clear(); }
126

	
127
  private:
128
    static int parent(int i) { return (i-1)/4; }
129
    static int firstChild(int i) { return 4*i+1; }
130

	
131
    bool less(const Pair &p1, const Pair &p2) const {
132
      return _comp(p1.second, p2.second);
133
    }
134

	
135
    void bubbleUp(int hole, Pair p) {
136
      int par = parent(hole);
137
      while( hole>0 && less(p,_data[par]) ) {
138
        move(_data[par],hole);
139
        hole = par;
140
        par = parent(hole);
141
      }
142
      move(p, hole);
143
    }
144

	
145
    void bubbleDown(int hole, Pair p, int length) {
146
      if( length>1 ) {
147
        int child = firstChild(hole);
148
        while( child+3<length ) {
149
          int min=child;
150
          if( less(_data[++child], _data[min]) ) min=child;
151
          if( less(_data[++child], _data[min]) ) min=child;
152
          if( less(_data[++child], _data[min]) ) min=child;
153
          if( !less(_data[min], p) )
154
            goto ok;
155
          move(_data[min], hole);
156
          hole = min;
157
          child = firstChild(hole);
158
        }
159
        if ( child<length ) {
160
          int min = child;
161
          if( ++child<length && less(_data[child], _data[min]) ) min=child;
162
          if( ++child<length && less(_data[child], _data[min]) ) min=child;
163
          if( less(_data[min], p) ) {
164
            move(_data[min], hole);
165
            hole = min;
166
          }
167
        }
168
      }
169
    ok:
170
      move(p, hole);
171
    }
172

	
173
    void move(const Pair &p, int i) {
174
      _data[i] = p;
175
      _iim.set(p.first, i);
176
    }
177

	
178
  public:
179
    /// \brief Insert a pair of item and priority into the heap.
180
    ///
181
    /// This function inserts \c p.first to the heap with priority
182
    /// \c p.second.
183
    /// \param p The pair to insert.
184
    /// \pre \c p.first must not be stored in the heap.
185
    void push(const Pair &p) {
186
      int n = _data.size();
187
      _data.resize(n+1);
188
      bubbleUp(n, p);
189
    }
190

	
191
    /// \brief Insert an item into the heap with the given priority.
192
    ///
193
    /// This function inserts the given item into the heap with the
194
    /// given priority.
195
    /// \param i The item to insert.
196
    /// \param p The priority of the item.
197
    /// \pre \e i must not be stored in the heap.
198
    void push(const Item &i, const Prio &p) { push(Pair(i,p)); }
199

	
200
    /// \brief Return the item having minimum priority.
201
    ///
202
    /// This function returns the item having minimum priority.
203
    /// \pre The heap must be non-empty.
204
    Item top() const { return _data[0].first; }
205

	
206
    /// \brief The minimum priority.
207
    ///
208
    /// This function returns the minimum priority.
209
    /// \pre The heap must be non-empty.
210
    Prio prio() const { return _data[0].second; }
211

	
212
    /// \brief Remove the item having minimum priority.
213
    ///
214
    /// This function removes the item having minimum priority.
215
    /// \pre The heap must be non-empty.
216
    void pop() {
217
      int n = _data.size()-1;
218
      _iim.set(_data[0].first, POST_HEAP);
219
      if (n>0) bubbleDown(0, _data[n], n);
220
      _data.pop_back();
221
    }
222

	
223
    /// \brief Remove the given item from the heap.
224
    ///
225
    /// This function removes the given item from the heap if it is
226
    /// already stored.
227
    /// \param i The item to delete.
228
    /// \pre \e i must be in the heap.
229
    void erase(const Item &i) {
230
      int h = _iim[i];
231
      int n = _data.size()-1;
232
      _iim.set(_data[h].first, POST_HEAP);
233
      if( h<n ) {
234
        if( less(_data[parent(h)], _data[n]) )
235
          bubbleDown(h, _data[n], n);
236
        else
237
          bubbleUp(h, _data[n]);
238
      }
239
      _data.pop_back();
240
    }
241

	
242
    /// \brief The priority of the given item.
243
    ///
244
    /// This function returns the priority of the given item.
245
    /// \param i The item.
246
    /// \pre \e i must be in the heap.
247
    Prio operator[](const Item &i) const {
248
      int idx = _iim[i];
249
      return _data[idx].second;
250
    }
251

	
252
    /// \brief Set the priority of an item or insert it, if it is
253
    /// not stored in the heap.
254
    ///
255
    /// This method sets the priority of the given item if it is
256
    /// already stored in the heap. Otherwise it inserts the given
257
    /// item into the heap with the given priority.
258
    /// \param i The item.
259
    /// \param p The priority.
260
    void set(const Item &i, const Prio &p) {
261
      int idx = _iim[i];
262
      if( idx < 0 )
263
        push(i,p);
264
      else if( _comp(p, _data[idx].second) )
265
        bubbleUp(idx, Pair(i,p));
266
      else
267
        bubbleDown(idx, Pair(i,p), _data.size());
268
    }
269

	
270
    /// \brief Decrease the priority of an item to the given value.
271
    ///
272
    /// This function decreases the priority of an item to the given value.
273
    /// \param i The item.
274
    /// \param p The priority.
275
    /// \pre \e i must be stored in the heap with priority at least \e p.
276
    void decrease(const Item &i, const Prio &p) {
277
      int idx = _iim[i];
278
      bubbleUp(idx, Pair(i,p));
279
    }
280

	
281
    /// \brief Increase the priority of an item to the given value.
282
    ///
283
    /// This function increases the priority of an item to the given value.
284
    /// \param i The item.
285
    /// \param p The priority.
286
    /// \pre \e i must be stored in the heap with priority at most \e p.
287
    void increase(const Item &i, const Prio &p) {
288
      int idx = _iim[i];
289
      bubbleDown(idx, Pair(i,p), _data.size());
290
    }
291

	
292
    /// \brief Return the state of an item.
293
    ///
294
    /// This method returns \c PRE_HEAP if the given item has never
295
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
296
    /// and \c POST_HEAP otherwise.
297
    /// In the latter case it is possible that the item will get back
298
    /// to the heap again.
299
    /// \param i The item.
300
    State state(const Item &i) const {
301
      int s = _iim[i];
302
      if (s>=0) s=0;
303
      return State(s);
304
    }
305

	
306
    /// \brief Set the state of an item in the heap.
307
    ///
308
    /// This function sets the state of the given item in the heap.
309
    /// It can be used to manually clear the heap when it is important
310
    /// to achive better time complexity.
311
    /// \param i The item.
312
    /// \param st The state. It should not be \c IN_HEAP.
313
    void state(const Item& i, State st) {
314
      switch (st) {
315
        case POST_HEAP:
316
        case PRE_HEAP:
317
          if (state(i) == IN_HEAP) erase(i);
318
          _iim[i] = st;
319
          break;
320
        case IN_HEAP:
321
          break;
322
      }
323
    }
324

	
325
    /// \brief Replace an item in the heap.
326
    ///
327
    /// This function replaces item \c i with item \c j.
328
    /// Item \c i must be in the heap, while \c j must be out of the heap.
329
    /// After calling this method, item \c i will be out of the
330
    /// heap and \c j will be in the heap with the same prioriority
331
    /// as item \c i had before.
332
    void replace(const Item& i, const Item& j) {
333
      int idx = _iim[i];
334
      _iim.set(i, _iim[j]);
335
      _iim.set(j, idx);
336
      _data[idx].first = j;
337
    }
338

	
339
  }; // class QuadHeap
340

	
341
} // namespace lemon
342

	
343
#endif // LEMON_FOURARY_HEAP_H
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2010
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_STATIC_GRAPH_H
20
#define LEMON_STATIC_GRAPH_H
21

	
22
///\ingroup graphs
23
///\file
24
///\brief StaticDigraph class.
25

	
26
#include <lemon/core.h>
27
#include <lemon/bits/graph_extender.h>
28

	
29
namespace lemon {
30

	
31
  class StaticDigraphBase {
32
  public:
33

	
34
    StaticDigraphBase()
35
      : built(false), node_num(0), arc_num(0),
36
        node_first_out(NULL), node_first_in(NULL),
37
        arc_source(NULL), arc_target(NULL),
38
        arc_next_in(NULL), arc_next_out(NULL) {}
39

	
40
    ~StaticDigraphBase() {
41
      if (built) {
42
        delete[] node_first_out;
43
        delete[] node_first_in;
44
        delete[] arc_source;
45
        delete[] arc_target;
46
        delete[] arc_next_out;
47
        delete[] arc_next_in;
48
      }
49
    }
50

	
51
    class Node {
52
      friend class StaticDigraphBase;
53
    protected:
54
      int id;
55
      Node(int _id) : id(_id) {}
56
    public:
57
      Node() {}
58
      Node (Invalid) : id(-1) {}
59
      bool operator==(const Node& node) const { return id == node.id; }
60
      bool operator!=(const Node& node) const { return id != node.id; }
61
      bool operator<(const Node& node) const { return id < node.id; }
62
    };
63

	
64
    class Arc {
65
      friend class StaticDigraphBase;
66
    protected:
67
      int id;
68
      Arc(int _id) : id(_id) {}
69
    public:
70
      Arc() { }
71
      Arc (Invalid) : id(-1) {}
72
      bool operator==(const Arc& arc) const { return id == arc.id; }
73
      bool operator!=(const Arc& arc) const { return id != arc.id; }
74
      bool operator<(const Arc& arc) const { return id < arc.id; }
75
    };
76

	
77
    Node source(const Arc& e) const { return Node(arc_source[e.id]); }
78
    Node target(const Arc& e) const { return Node(arc_target[e.id]); }
79

	
80
    void first(Node& n) const { n.id = node_num - 1; }
81
    static void next(Node& n) { --n.id; }
82

	
83
    void first(Arc& e) const { e.id = arc_num - 1; }
84
    static void next(Arc& e) { --e.id; }
85

	
86
    void firstOut(Arc& e, const Node& n) const {
87
      e.id = node_first_out[n.id] != node_first_out[n.id + 1] ?
88
        node_first_out[n.id] : -1;
89
    }
90
    void nextOut(Arc& e) const { e.id = arc_next_out[e.id]; }
91

	
92
    void firstIn(Arc& e, const Node& n) const { e.id = node_first_in[n.id]; }
93
    void nextIn(Arc& e) const { e.id = arc_next_in[e.id]; }
94

	
95
    static int id(const Node& n) { return n.id; }
96
    static Node nodeFromId(int id) { return Node(id); }
97
    int maxNodeId() const { return node_num - 1; }
98

	
99
    static int id(const Arc& e) { return e.id; }
100
    static Arc arcFromId(int id) { return Arc(id); }
101
    int maxArcId() const { return arc_num - 1; }
102

	
103
    typedef True NodeNumTag;
104
    typedef True ArcNumTag;
105

	
106
    int nodeNum() const { return node_num; }
107
    int arcNum() const { return arc_num; }
108

	
109
  private:
110

	
111
    template <typename Digraph, typename NodeRefMap>
112
    class ArcLess {
113
    public:
114
      typedef typename Digraph::Arc Arc;
115

	
116
      ArcLess(const Digraph &_graph, const NodeRefMap& _nodeRef)
117
        : digraph(_graph), nodeRef(_nodeRef) {}
118

	
119
      bool operator()(const Arc& left, const Arc& right) const {
120
        return nodeRef[digraph.target(left)] < nodeRef[digraph.target(right)];
121
      }
122
    private:
123
      const Digraph& digraph;
124
      const NodeRefMap& nodeRef;
125
    };
126

	
127
  public:
128

	
129
    typedef True BuildTag;
130

	
131
    void clear() {
132
      if (built) {
133
        delete[] node_first_out;
134
        delete[] node_first_in;
135
        delete[] arc_source;
136
        delete[] arc_target;
137
        delete[] arc_next_out;
138
        delete[] arc_next_in;
139
      }
140
      built = false;
141
      node_num = 0;
142
      arc_num = 0;
143
    }
144

	
145
    template <typename Digraph, typename NodeRefMap, typename ArcRefMap>
146
    void build(const Digraph& digraph, NodeRefMap& nodeRef, ArcRefMap& arcRef) {
147
      typedef typename Digraph::Node GNode;
148
      typedef typename Digraph::Arc GArc;
149

	
150
      built = true;
151

	
152
      node_num = countNodes(digraph);
153
      arc_num = countArcs(digraph);
154

	
155
      node_first_out = new int[node_num + 1];
156
      node_first_in = new int[node_num];
157

	
158
      arc_source = new int[arc_num];
159
      arc_target = new int[arc_num];
160
      arc_next_out = new int[arc_num];
161
      arc_next_in = new int[arc_num];
162

	
163
      int node_index = 0;
164
      for (typename Digraph::NodeIt n(digraph); n != INVALID; ++n) {
165
        nodeRef[n] = Node(node_index);
166
        node_first_in[node_index] = -1;
167
        ++node_index;
168
      }
169

	
170
      ArcLess<Digraph, NodeRefMap> arcLess(digraph, nodeRef);
171

	
172
      int arc_index = 0;
173
      for (typename Digraph::NodeIt n(digraph); n != INVALID; ++n) {
174
        int source = nodeRef[n].id;
175
        std::vector<GArc> arcs;
176
        for (typename Digraph::OutArcIt e(digraph, n); e != INVALID; ++e) {
177
          arcs.push_back(e);
178
        }
179
        if (!arcs.empty()) {
180
          node_first_out[source] = arc_index;
181
          std::sort(arcs.begin(), arcs.end(), arcLess);
182
          for (typename std::vector<GArc>::iterator it = arcs.begin();
183
               it != arcs.end(); ++it) {
184
            int target = nodeRef[digraph.target(*it)].id;
185
            arcRef[*it] = Arc(arc_index);
186
            arc_source[arc_index] = source;
187
            arc_target[arc_index] = target;
188
            arc_next_in[arc_index] = node_first_in[target];
189
            node_first_in[target] = arc_index;
190
            arc_next_out[arc_index] = arc_index + 1;
191
            ++arc_index;
192
          }
193
          arc_next_out[arc_index - 1] = -1;
194
        } else {
195
          node_first_out[source] = arc_index;
196
        }
197
      }
198
      node_first_out[node_num] = arc_num;
199
    }
200

	
201
    template <typename ArcListIterator>
202
    void build(int n, ArcListIterator first, ArcListIterator last) {
203
      built = true;
204

	
205
      node_num = n;
206
      arc_num = std::distance(first, last);
207

	
208
      node_first_out = new int[node_num + 1];
209
      node_first_in = new int[node_num];
210

	
211
      arc_source = new int[arc_num];
212
      arc_target = new int[arc_num];
213
      arc_next_out = new int[arc_num];
214
      arc_next_in = new int[arc_num];
215

	
216
      for (int i = 0; i != node_num; ++i) {
217
        node_first_in[i] = -1;
218
      }
219

	
220
      int arc_index = 0;
221
      for (int i = 0; i != node_num; ++i) {
222
        node_first_out[i] = arc_index;
223
        for ( ; first != last && (*first).first == i; ++first) {
224
          int j = (*first).second;
225
          LEMON_ASSERT(j >= 0 && j < node_num,
226
            "Wrong arc list for StaticDigraph::build()");
227
          arc_source[arc_index] = i;
228
          arc_target[arc_index] = j;
229
          arc_next_in[arc_index] = node_first_in[j];
230
          node_first_in[j] = arc_index;
231
          arc_next_out[arc_index] = arc_index + 1;
232
          ++arc_index;
233
        }
234
        if (arc_index > node_first_out[i])
235
          arc_next_out[arc_index - 1] = -1;
236
      }
237
      LEMON_ASSERT(first == last,
238
        "Wrong arc list for StaticDigraph::build()");
239
      node_first_out[node_num] = arc_num;
240
    }
241

	
242
  protected:
243

	
244
    void fastFirstOut(Arc& e, const Node& n) const {
245
      e.id = node_first_out[n.id];
246
    }
247

	
248
    static void fastNextOut(Arc& e) {
249
      ++e.id;
250
    }
251
    void fastLastOut(Arc& e, const Node& n) const {
252
      e.id = node_first_out[n.id + 1];
253
    }
254

	
255
  protected:
256
    bool built;
257
    int node_num;
258
    int arc_num;
259
    int *node_first_out;
260
    int *node_first_in;
261
    int *arc_source;
262
    int *arc_target;
263
    int *arc_next_in;
264
    int *arc_next_out;
265
  };
266

	
267
  typedef DigraphExtender<StaticDigraphBase> ExtendedStaticDigraphBase;
268

	
269

	
270
  /// \ingroup graphs
271
  ///
272
  /// \brief A static directed graph class.
273
  ///
274
  /// \ref StaticDigraph is a highly efficient digraph implementation,
275
  /// but it is fully static.
276
  /// It stores only two \c int values for each node and only four \c int
277
  /// values for each arc. Moreover it provides faster item iteration than
278
  /// \ref ListDigraph and \ref SmartDigraph, especially using \c OutArcIt
279
  /// iterators, since its arcs are stored in an appropriate order.
280
  /// However it only provides build() and clear() functions and does not
281
  /// support any other modification of the digraph.
282
  ///
283
  /// Since this digraph structure is completely static, its nodes and arcs
284
  /// can be indexed with integers from the ranges <tt>[0..nodeNum()-1]</tt>
285
  /// and <tt>[0..arcNum()-1]</tt>, respectively.
286
  /// The index of an item is the same as its ID, it can be obtained
287
  /// using the corresponding \ref index() or \ref concepts::Digraph::id()
288
  /// "id()" function. A node or arc with a certain index can be obtained
289
  /// using node() or arc().
290
  ///
291
  /// This type fully conforms to the \ref concepts::Digraph "Digraph concept".
292
  /// Most of its member functions and nested classes are documented
293
  /// only in the concept class.
294
  ///
295
  /// This class provides constant time counting for nodes and arcs.
296
  ///
297
  /// \sa concepts::Digraph
298
  class StaticDigraph : public ExtendedStaticDigraphBase {
299
  public:
300

	
301
    typedef ExtendedStaticDigraphBase Parent;
302

	
303
  public:
304

	
305
    /// \brief Constructor
306
    ///
307
    /// Default constructor.
308
    StaticDigraph() : Parent() {}
309

	
310
    /// \brief The node with the given index.
311
    ///
312
    /// This function returns the node with the given index.
313
    /// \sa index()
314
    static Node node(int ix) { return Parent::nodeFromId(ix); }
315

	
316
    /// \brief The arc with the given index.
317
    ///
318
    /// This function returns the arc with the given index.
319
    /// \sa index()
320
    static Arc arc(int ix) { return Parent::arcFromId(ix); }
321

	
322
    /// \brief The index of the given node.
323
    ///
324
    /// This function returns the index of the the given node.
325
    /// \sa node()
326
    static int index(Node node) { return Parent::id(node); }
327

	
328
    /// \brief The index of the given arc.
329
    ///
330
    /// This function returns the index of the the given arc.
331
    /// \sa arc()
332
    static int index(Arc arc) { return Parent::id(arc); }
333

	
334
    /// \brief Number of nodes.
335
    ///
336
    /// This function returns the number of nodes.
337
    int nodeNum() const { return node_num; }
338

	
339
    /// \brief Number of arcs.
340
    ///
341
    /// This function returns the number of arcs.
342
    int arcNum() const { return arc_num; }
343

	
344
    /// \brief Build the digraph copying another digraph.
345
    ///
346
    /// This function builds the digraph copying another digraph of any
347
    /// kind. It can be called more than once, but in such case, the whole
348
    /// structure and all maps will be cleared and rebuilt.
349
    ///
350
    /// This method also makes possible to copy a digraph to a StaticDigraph
351
    /// structure using \ref DigraphCopy.
352
    ///
353
    /// \param digraph An existing digraph to be copied.
354
    /// \param nodeRef The node references will be copied into this map.
355
    /// Its key type must be \c Digraph::Node and its value type must be
356
    /// \c StaticDigraph::Node.
357
    /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap"
358
    /// concept.
359
    /// \param arcRef The arc references will be copied into this map.
360
    /// Its key type must be \c Digraph::Arc and its value type must be
361
    /// \c StaticDigraph::Arc.
362
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
363
    ///
364
    /// \note If you do not need the arc references, then you could use
365
    /// \ref NullMap for the last parameter. However the node references
366
    /// are required by the function itself, thus they must be readable
367
    /// from the map.
368
    template <typename Digraph, typename NodeRefMap, typename ArcRefMap>
369
    void build(const Digraph& digraph, NodeRefMap& nodeRef, ArcRefMap& arcRef) {
370
      if (built) Parent::clear();
371
      Parent::build(digraph, nodeRef, arcRef);
372
    }
373

	
374
    /// \brief Build the digraph from an arc list.
375
    ///
376
    /// This function builds the digraph from the given arc list.
377
    /// It can be called more than once, but in such case, the whole
378
    /// structure and all maps will be cleared and rebuilt.
379
    ///
380
    /// The list of the arcs must be given in the range <tt>[begin, end)</tt>
381
    /// specified by STL compatible itartors whose \c value_type must be
382
    /// <tt>std::pair<int,int></tt>.
383
    /// Each arc must be specified by a pair of integer indices
384
    /// from the range <tt>[0..n-1]</tt>. <i>The pairs must be in a
385
    /// non-decreasing order with respect to their first values.</i>
386
    /// If the k-th pair in the list is <tt>(i,j)</tt>, then
387
    /// <tt>arc(k-1)</tt> will connect <tt>node(i)</tt> to <tt>node(j)</tt>.
388
    ///
389
    /// \param n The number of nodes.
390
    /// \param begin An iterator pointing to the beginning of the arc list.
391
    /// \param end An iterator pointing to the end of the arc list.
392
    ///
393
    /// For example, a simple digraph can be constructed like this.
394
    /// \code
395
    ///   std::vector<std::pair<int,int> > arcs;
396
    ///   arcs.push_back(std::make_pair(0,1));
397
    ///   arcs.push_back(std::make_pair(0,2));
398
    ///   arcs.push_back(std::make_pair(1,3));
399
    ///   arcs.push_back(std::make_pair(1,2));
400
    ///   arcs.push_back(std::make_pair(3,0));
401
    ///   StaticDigraph gr;
402
    ///   gr.build(4, arcs.begin(), arcs.end());
403
    /// \endcode
404
    template <typename ArcListIterator>
405
    void build(int n, ArcListIterator begin, ArcListIterator end) {
406
      if (built) Parent::clear();
407
      StaticDigraphBase::build(n, begin, end);
408
      notifier(Node()).build();
409
      notifier(Arc()).build();
410
    }
411

	
412
    /// \brief Clear the digraph.
413
    ///
414
    /// This function erases all nodes and arcs from the digraph.
415
    void clear() {
416
      Parent::clear();
417
    }
418

	
419
  protected:
420

	
421
    using Parent::fastFirstOut;
422
    using Parent::fastNextOut;
423
    using Parent::fastLastOut;
424

	
425
  public:
426

	
427
    class OutArcIt : public Arc {
428
    public:
429

	
430
      OutArcIt() { }
431

	
432
      OutArcIt(Invalid i) : Arc(i) { }
433

	
434
      OutArcIt(const StaticDigraph& digraph, const Node& node) {
435
        digraph.fastFirstOut(*this, node);
436
        digraph.fastLastOut(last, node);
437
        if (last == *this) *this = INVALID;
438
      }
439

	
440
      OutArcIt(const StaticDigraph& digraph, const Arc& arc) : Arc(arc) {
441
        if (arc != INVALID) {
442
          digraph.fastLastOut(last, digraph.source(arc));
443
        }
444
      }
445

	
446
      OutArcIt& operator++() {
447
        StaticDigraph::fastNextOut(*this);
448
        if (last == *this) *this = INVALID;
449
        return *this;
450
      }
451

	
452
    private:
453
      Arc last;
454
    };
455

	
456
    Node baseNode(const OutArcIt &arc) const {
457
      return Parent::source(static_cast<const Arc&>(arc));
458
    }
459

	
460
    Node runningNode(const OutArcIt &arc) const {
461
      return Parent::target(static_cast<const Arc&>(arc));
462
    }
463

	
464
    Node baseNode(const InArcIt &arc) const {
465
      return Parent::target(static_cast<const Arc&>(arc));
466
    }
467

	
468
    Node runningNode(const InArcIt &arc) const {
469
      return Parent::source(static_cast<const Arc&>(arc));
470
    }
471

	
472
  };
473

	
474
}
475

	
476
#endif
Ignore white space 6 line context
1
EXTRA_DIST += \
2
	scripts/bib2dox.py \
3
	scripts/bootstrap.sh \
4
	scripts/chg-len.py \
5
	scripts/mk-release.sh \
6
	scripts/unify-sources.sh \
7
	scripts/valgrind-wrapper.sh
Ignore white space 6 line context
1
#! /usr/bin/env python
2
"""
3
  BibTeX to Doxygen converter
4
  Usage: python bib2dox.py bibfile.bib > bibfile.dox
5

	
6
  This file is a part of LEMON, a generic C++ optimization library.
7

	
8
  **********************************************************************
9

	
10
  This code is the modification of the BibTeX to XML converter
11
  by Vidar Bronken Gundersen et al.
12
  See the original copyright notices below. 
13

	
14
  **********************************************************************
15

	
16
  Decoder for bibliographic data, BibTeX
17
  Usage: python bibtex2xml.py bibfile.bib > bibfile.xml
18

	
19
  v.8
20
  (c)2002-06-23 Vidar Bronken Gundersen
21
  http://bibtexml.sf.net/
22
  Reuse approved as long as this notification is kept.
23
  Licence: GPL.
24

	
25
  Contributions/thanks to:
26
  Egon Willighagen, http://sf.net/projects/jreferences/
27
  Richard Mahoney (for providing a test case)
28

	
29
  Editted by Sara Sprenkle to be more robust and handle more bibtex features.
30
  (c) 2003-01-15
31

	
32
  1.  Changed bibtex: tags to bibxml: tags.
33
  2.  Use xmlns:bibxml="http://bibtexml.sf.net/"
34
  3.  Allow spaces between @type and first {
35
  4.  "author" fields with multiple authors split by " and "
36
      are put in separate xml "bibxml:author" tags.
37
  5.  Option for Titles: words are capitalized
38
      only if first letter in title or capitalized inside braces
39
  6.  Removes braces from within field values
40
  7.  Ignores comments in bibtex file (including @comment{ or % )
41
  8.  Replaces some special latex tags, e.g., replaces ~ with '&#160;'
42
  9.  Handles bibtex @string abbreviations
43
        --> includes bibtex's default abbreviations for months
44
        --> does concatenation of abbr # " more " and " more " # abbr
45
  10. Handles @type( ... ) or @type{ ... }
46
  11. The keywords field is split on , or ; and put into separate xml
47
      "bibxml:keywords" tags
48
  12. Ignores @preamble
49

	
50
  Known Limitations
51
  1.  Does not transform Latex encoding like math mode and special
52
      latex symbols.
53
  2.  Does not parse author fields into first and last names.
54
      E.g., It does not do anything special to an author whose name is
55
      in the form LAST_NAME, FIRST_NAME
56
      In "author" tag, will show up as
57
      <bibxml:author>LAST_NAME, FIRST_NAME</bibxml:author>
58
  3.  Does not handle "crossref" fields other than to print
59
      <bibxml:crossref>...</bibxml:crossref>
60
  4.  Does not inform user of the input's format errors.  You just won't
61
      be able to transform the file later with XSL
62

	
63
  You will have to manually edit the XML output if you need to handle
64
  these (and unknown) limitations.
65

	
66
"""
67

	
68
import string, re
69

	
70
# set of valid name characters
71
valid_name_chars = '[\w\-:]'
72

	
73
#
74
# define global regular expression variables
75
#
76
author_rex = re.compile('\s+and\s+')
77
rembraces_rex = re.compile('[{}]')
78
capitalize_rex = re.compile('({[^}]*})')
79

	
80
# used by bibtexkeywords(data)
81
keywords_rex = re.compile('[,;]')
82

	
83
# used by concat_line(line)
84
concatsplit_rex = re.compile('\s*#\s*')
85

	
86
# split on {, }, or " in verify_out_of_braces
87
delimiter_rex = re.compile('([{}"])',re.I)
88

	
89
field_rex = re.compile('\s*(\w*)\s*=\s*(.*)')
90
data_rex = re.compile('\s*(\w*)\s*=\s*([^,]*),?')
91

	
92
url_rex = re.compile('\\\url\{([^}]*)\}')
93

	
94
#
95
# styles for html formatting
96
#
97
divstyle = 'margin-top: -4ex; margin-left: 8em;'
98

	
99
#
100
# return the string parameter without braces
101
#
102
def transformurls(str):
103
    return url_rex.sub(r'<a href="\1">\1</a>', str)
104

	
105
#
106
# return the string parameter without braces
107
#
108
def removebraces(str):
109
    return rembraces_rex.sub('', str)
110

	
111
#
112
# latex-specific replacements
113
# (do this after braces were removed)
114
#
115
def latexreplacements(line):
116
    line = string.replace(line, '~', '&nbsp;')
117
    line = string.replace(line, '\\\'a', '&aacute;')
118
    line = string.replace(line, '\\"a', '&auml;')
119
    line = string.replace(line, '\\\'e', '&eacute;')
120
    line = string.replace(line, '\\"e', '&euml;')
121
    line = string.replace(line, '\\\'i', '&iacute;')
122
    line = string.replace(line, '\\"i', '&iuml;')
123
    line = string.replace(line, '\\\'o', '&oacute;')
124
    line = string.replace(line, '\\"o', '&ouml;')
125
    line = string.replace(line, '\\\'u', '&uacute;')
126
    line = string.replace(line, '\\"u', '&uuml;')
127
    line = string.replace(line, '\\H o', '&otilde;')
128
    line = string.replace(line, '\\H u', '&uuml;')   # &utilde; does not exist
129
    line = string.replace(line, '\\\'A', '&Aacute;')
130
    line = string.replace(line, '\\"A', '&Auml;')
131
    line = string.replace(line, '\\\'E', '&Eacute;')
132
    line = string.replace(line, '\\"E', '&Euml;')
133
    line = string.replace(line, '\\\'I', '&Iacute;')
134
    line = string.replace(line, '\\"I', '&Iuml;')
135
    line = string.replace(line, '\\\'O', '&Oacute;')
136
    line = string.replace(line, '\\"O', '&Ouml;')
137
    line = string.replace(line, '\\\'U', '&Uacute;')
138
    line = string.replace(line, '\\"U', '&Uuml;')
139
    line = string.replace(line, '\\H O', '&Otilde;')
140
    line = string.replace(line, '\\H U', '&Uuml;')   # &Utilde; does not exist
141

	
142
    return line
143

	
144
#
145
# copy characters form a string decoding html expressions (&xyz;)
146
#
147
def copychars(str, ifrom, count):
148
    result = ''
149
    i = ifrom
150
    c = 0
151
    html_spec = False
152
    while (i < len(str)) and (c < count):
153
        if str[i] == '&':
154
            html_spec = True;
155
            if i+1 < len(str):
156
                result += str[i+1]
157
            c += 1
158
            i += 2
159
        else:
160
            if not html_spec:
161
                if ((str[i] >= 'A') and (str[i] <= 'Z')) or \
162
                   ((str[i] >= 'a') and (str[i] <= 'z')):
163
                    result += str[i]
164
                    c += 1
165
            elif str[i] == ';':
166
                html_spec = False;
167
            i += 1
168
    
169
    return result
170

	
171

	
172
# 
173
# Handle a list of authors (separated by 'and').
174
# It gives back an array of the follwing values:
175
#  - num: the number of authors,
176
#  - list: the list of the author names,
177
#  - text: the bibtex text (separated by commas and/or 'and')
178
#  - abbrev: abbreviation that can be used for indicate the
179
#    bibliography entries
180
#
181
def bibtexauthor(data):
182
    result = {}
183
    bibtex = ''
184
    result['list'] = author_rex.split(data)
185
    result['num'] = len(result['list'])
186
    for i, author in enumerate(result['list']):
187
        # general transformations
188
        author = latexreplacements(removebraces(author.strip()))
189
        # transform "Xyz, A. B." to "A. B. Xyz"
190
        pos = author.find(',')
191
        if pos != -1:
192
            author = author[pos+1:].strip() + ' ' + author[:pos].strip()
193
        result['list'][i] = author
194
        bibtex += author + '#'
195
    bibtex = bibtex[:-1]
196
    if result['num'] > 1:
197
        ix = bibtex.rfind('#')
198
        if result['num'] == 2:
199
            bibtex = bibtex[:ix] + ' and ' + bibtex[ix+1:]
200
        else:
201
            bibtex = bibtex[:ix] + ', and ' + bibtex[ix+1:]
202
    bibtex = bibtex.replace('#', ', ')
203
    result['text'] = bibtex
204
    
205
    result['abbrev'] = ''
206
    for author in result['list']:
207
        pos = author.rfind(' ') + 1
208
        count = 1
209
        if result['num'] == 1:
210
            count = 3
211
        result['abbrev'] += copychars(author, pos, count)
212

	
213
    return result
214

	
215

	
216
#
217
# data = title string
218
# @return the capitalized title (first letter is capitalized), rest are capitalized
219
# only if capitalized inside braces
220
#
221
def capitalizetitle(data):
222
    title_list = capitalize_rex.split(data)
223
    title = ''
224
    count = 0
225
    for phrase in title_list:
226
         check = string.lstrip(phrase)
227

	
228
         # keep phrase's capitalization the same
229
         if check.find('{') == 0:
230
              title += removebraces(phrase)
231
         else:
232
         # first word --> capitalize first letter (after spaces)
233
              if count == 0:
234
                  title += check.capitalize()
235
              else:
236
                  title += phrase.lower()
237
         count = count + 1
238

	
239
    return title
240

	
241

	
242
#
243
# @return the bibtex for the title
244
# @param data --> title string
245
# braces are removed from title
246
#
247
def bibtextitle(data, entrytype):
248
    if entrytype in ('book', 'inbook'):
249
        title = removebraces(data.strip())
250
    else:
251
        title = removebraces(capitalizetitle(data.strip()))
252
    bibtex = title
253
    return bibtex
254

	
255

	
256
#
257
# function to compare entry lists
258
#
259
def entry_cmp(x, y):
260
    return cmp(x[0], y[0])
261

	
262

	
263
#
264
# print the XML for the transformed "filecont_source"
265
#
266
def bibtexdecoder(filecont_source):
267
    filecont = []
268
    file = []
269
    
270
    # want @<alphanumeric chars><spaces>{<spaces><any chars>,
271
    pubtype_rex = re.compile('@(\w*)\s*{\s*(.*),')
272
    endtype_rex = re.compile('}\s*$')
273
    endtag_rex = re.compile('^\s*}\s*$')
274

	
275
    bracefield_rex = re.compile('\s*(\w*)\s*=\s*(.*)')
276
    bracedata_rex = re.compile('\s*(\w*)\s*=\s*{(.*)},?')
277

	
278
    quotefield_rex = re.compile('\s*(\w*)\s*=\s*(.*)')
279
    quotedata_rex = re.compile('\s*(\w*)\s*=\s*"(.*)",?')
280

	
281
    for line in filecont_source:
282
        line = line[:-1]
283

	
284
        # encode character entities
285
        line = string.replace(line, '&', '&amp;')
286
        line = string.replace(line, '<', '&lt;')
287
        line = string.replace(line, '>', '&gt;')
288

	
289
        # start entry: publication type (store for later use)
290
        if pubtype_rex.match(line):
291
        # want @<alphanumeric chars><spaces>{<spaces><any chars>,
292
            entrycont = {}
293
            entry = []
294
            entrytype = pubtype_rex.sub('\g<1>',line)
295
            entrytype = string.lower(entrytype)
296
            entryid   = pubtype_rex.sub('\g<2>', line)
297

	
298
        # end entry if just a }
299
        elif endtype_rex.match(line):
300
            # generate doxygen code for the entry
301

	
302
            # enty type related formattings
303
            if entrytype in ('book', 'inbook'):
304
                entrycont['title'] = '<em>' + entrycont['title'] + '</em>'
305
                if not entrycont.has_key('author'):
306
                    entrycont['author'] = entrycont['editor']
307
                    entrycont['author']['text'] += ', editors'
308
            elif entrytype == 'article':
309
                entrycont['journal'] = '<em>' + entrycont['journal'] + '</em>'
310
            elif entrytype in ('inproceedings', 'incollection', 'conference'):
311
                entrycont['booktitle'] = '<em>' + entrycont['booktitle'] + '</em>'
312
            elif entrytype == 'techreport':
313
                if not entrycont.has_key('type'):
314
                    entrycont['type'] = 'Technical report'
315
            elif entrytype == 'mastersthesis':
316
                entrycont['type'] = 'Master\'s thesis'
317
            elif entrytype == 'phdthesis':
318
                entrycont['type'] = 'PhD thesis'
319

	
320
            for eline in entrycont:
321
                if eline != '':
322
                    eline = latexreplacements(eline)
323

	
324
            if entrycont.has_key('pages') and (entrycont['pages'] != ''):
325
                entrycont['pages'] = string.replace(entrycont['pages'], '--', '-')
326

	
327
            if entrycont.has_key('author') and (entrycont['author'] != ''):
328
                entry.append(entrycont['author']['text'] + '.')
329
            if entrycont.has_key('title') and (entrycont['title'] != ''):
330
                entry.append(entrycont['title'] + '.')
331
            if entrycont.has_key('journal') and (entrycont['journal'] != ''):
332
                entry.append(entrycont['journal'] + ',')
333
            if entrycont.has_key('booktitle') and (entrycont['booktitle'] != ''):
334
                entry.append('In ' + entrycont['booktitle'] + ',')
335
            if entrycont.has_key('type') and (entrycont['type'] != ''):
336
                eline = entrycont['type']
337
                if entrycont.has_key('number') and (entrycont['number'] != ''):
338
                    eline += ' ' + entrycont['number']
339
                eline += ','
340
                entry.append(eline)
341
            if entrycont.has_key('institution') and (entrycont['institution'] != ''):
342
                entry.append(entrycont['institution'] + ',')
343
            if entrycont.has_key('publisher') and (entrycont['publisher'] != ''):
344
                entry.append(entrycont['publisher'] + ',')
345
            if entrycont.has_key('school') and (entrycont['school'] != ''):
346
                entry.append(entrycont['school'] + ',')
347
            if entrycont.has_key('address') and (entrycont['address'] != ''):
348
                entry.append(entrycont['address'] + ',')
349
            if entrycont.has_key('edition') and (entrycont['edition'] != ''):
350
                entry.append(entrycont['edition'] + ' edition,')
351
            if entrycont.has_key('howpublished') and (entrycont['howpublished'] != ''):
352
                entry.append(entrycont['howpublished'] + ',')
353
            if entrycont.has_key('volume') and (entrycont['volume'] != ''):
354
                eline = entrycont['volume'];
355
                if entrycont.has_key('number') and (entrycont['number'] != ''):
356
                    eline += '(' + entrycont['number'] + ')'
357
                if entrycont.has_key('pages') and (entrycont['pages'] != ''):
358
                    eline += ':' + entrycont['pages']
359
                eline += ','
360
                entry.append(eline)
361
            else:
362
                if entrycont.has_key('pages') and (entrycont['pages'] != ''):
363
                    entry.append('pages ' + entrycont['pages'] + ',')
364
            if entrycont.has_key('year') and (entrycont['year'] != ''):
365
                if entrycont.has_key('month') and (entrycont['month'] != ''):
366
                    entry.append(entrycont['month'] + ' ' + entrycont['year'] + '.')
367
                else:
368
                    entry.append(entrycont['year'] + '.')
369
            if entrycont.has_key('note') and (entrycont['note'] != ''):
370
                entry.append(entrycont['note'] + '.')
371
            if entrycont.has_key('url') and (entrycont['url'] != ''):
372
                entry.append(entrycont['url'] + '.')
373

	
374
            # generate keys for sorting and for the output
375
            sortkey = ''
376
            bibkey = ''
377
            if entrycont.has_key('author'):
378
                for author in entrycont['author']['list']:
379
                    sortkey += copychars(author, author.rfind(' ')+1, len(author))
380
                bibkey = entrycont['author']['abbrev']
381
            else:
382
                bibkey = 'x'
383
            if entrycont.has_key('year'):
384
                sortkey += entrycont['year']
385
                bibkey += entrycont['year'][-2:]
386
            if entrycont.has_key('title'):
387
                sortkey += entrycont['title']
388
            if entrycont.has_key('key'):
389
                sortkey = entrycont['key'] + sortkey
390
                bibkey = entrycont['key']
391
            entry.insert(0, sortkey)
392
            entry.insert(1, bibkey)
393
            entry.insert(2, entryid)
394
           
395
            # add the entry to the file contents
396
            filecont.append(entry)
397

	
398
        else:
399
            # field, publication info
400
            field = ''
401
            data = ''
402
            
403
            # field = {data} entries
404
            if bracedata_rex.match(line):
405
                field = bracefield_rex.sub('\g<1>', line)
406
                field = string.lower(field)
407
                data =  bracedata_rex.sub('\g<2>', line)
408

	
409
            # field = "data" entries
410
            elif quotedata_rex.match(line):
411
                field = quotefield_rex.sub('\g<1>', line)
412
                field = string.lower(field)
413
                data =  quotedata_rex.sub('\g<2>', line)
414

	
415
            # field = data entries
416
            elif data_rex.match(line):
417
                field = field_rex.sub('\g<1>', line)
418
                field = string.lower(field)
419
                data =  data_rex.sub('\g<2>', line)
420

	
421
            if field == 'url':
422
                data = '\\url{' + data.strip() + '}'
423
            
424
            if field in ('author', 'editor'):
425
                entrycont[field] = bibtexauthor(data)
426
                line = ''
427
            elif field == 'title':
428
                line = bibtextitle(data, entrytype)
429
            elif field != '':
430
                line = removebraces(transformurls(data.strip()))
431

	
432
            if line != '':
433
                line = latexreplacements(line)
434
                entrycont[field] = line
435

	
436

	
437
    # sort entries
438
    filecont.sort(entry_cmp)
439
    
440
    # count the bibtex keys
441
    keytable = {}
442
    counttable = {}
443
    for entry in filecont:
444
        bibkey = entry[1]
445
        if not keytable.has_key(bibkey):
446
            keytable[bibkey] = 1
447
        else:
448
            keytable[bibkey] += 1
449

	
450
    for bibkey in keytable.keys():
451
        counttable[bibkey] = 0
452
    
453
    # generate output
454
    for entry in filecont:
455
        # generate output key form the bibtex key
456
        bibkey = entry[1]
457
        entryid = entry[2]
458
        if keytable[bibkey] == 1:
459
            outkey = bibkey
460
        else:
461
            outkey = bibkey + chr(97 + counttable[bibkey])
462
        counttable[bibkey] += 1
463
        
464
        # append the entry code to the output
465
        file.append('\\section ' + entryid + ' [' + outkey + ']')
466
        file.append('<div style="' + divstyle + '">')
467
        for line in entry[3:]:
468
            file.append(line)
469
        file.append('</div>')
470
        file.append('')
471

	
472
    return file
473

	
474

	
475
#
476
# return 1 iff abbr is in line but not inside braces or quotes
477
# assumes that abbr appears only once on the line (out of braces and quotes)
478
#
479
def verify_out_of_braces(line, abbr):
480

	
481
    phrase_split = delimiter_rex.split(line)
482

	
483
    abbr_rex = re.compile( '\\b' + abbr + '\\b', re.I)
484

	
485
    open_brace = 0
486
    open_quote = 0
487

	
488
    for phrase in phrase_split:
489
        if phrase == "{":
490
            open_brace = open_brace + 1
491
        elif phrase == "}":
492
            open_brace = open_brace - 1
493
        elif phrase == '"':
494
            if open_quote == 1:
495
                open_quote = 0
496
            else:
497
                open_quote = 1
498
        elif abbr_rex.search(phrase):
499
            if open_brace == 0 and open_quote == 0:
500
                return 1
501

	
502
    return 0
503

	
504

	
505
#
506
# a line in the form phrase1 # phrase2 # ... # phrasen
507
# is returned as phrase1 phrase2 ... phrasen
508
# with the correct punctuation
509
# Bug: Doesn't always work with multiple abbreviations plugged in
510
#
511
def concat_line(line):
512
    # only look at part after equals
513
    field = field_rex.sub('\g<1>',line)
514
    rest = field_rex.sub('\g<2>',line)
515

	
516
    concat_line = field + ' ='
517

	
518
    pound_split = concatsplit_rex.split(rest)
519

	
520
    phrase_count = 0
521
    length = len(pound_split)
522

	
523
    for phrase in pound_split:
524
        phrase = phrase.strip()
525
        if phrase_count != 0:
526
            if phrase.startswith('"') or phrase.startswith('{'):
527
                phrase = phrase[1:]
528
        elif phrase.startswith('"'):
529
            phrase = phrase.replace('"','{',1)
530

	
531
        if phrase_count != length-1:
532
            if phrase.endswith('"') or phrase.endswith('}'):
533
                phrase = phrase[:-1]
534
        else:
535
            if phrase.endswith('"'):
536
                phrase = phrase[:-1]
537
                phrase = phrase + "}"
538
            elif phrase.endswith('",'):
539
                phrase = phrase[:-2]
540
                phrase = phrase + "},"
541

	
542
        # if phrase did have \#, add the \# back
543
        if phrase.endswith('\\'):
544
            phrase = phrase + "#"
545
        concat_line = concat_line + ' ' + phrase
546

	
547
        phrase_count = phrase_count + 1
548

	
549
    return concat_line
550

	
551

	
552
#
553
# substitute abbreviations into filecont
554
# @param filecont_source - string of data from file
555
#
556
def bibtex_replace_abbreviations(filecont_source):
557
    filecont = filecont_source.splitlines()
558

	
559
    #  These are defined in bibtex, so we'll define them too
560
    abbr_list = ['jan','feb','mar','apr','may','jun',
561
                 'jul','aug','sep','oct','nov','dec']
562
    value_list = ['January','February','March','April',
563
                  'May','June','July','August','September',
564
                  'October','November','December']
565

	
566
    abbr_rex = []
567
    total_abbr_count = 0
568

	
569
    front = '\\b'
570
    back = '(,?)\\b'
571

	
572
    for x in abbr_list:
573
        abbr_rex.append( re.compile( front + abbr_list[total_abbr_count] + back, re.I ) )
574
        total_abbr_count = total_abbr_count + 1
575

	
576

	
577
    abbrdef_rex = re.compile('\s*@string\s*{\s*('+ valid_name_chars +'*)\s*=(.*)',
578
                             re.I)
579

	
580
    comment_rex = re.compile('@comment\s*{',re.I)
581
    preamble_rex = re.compile('@preamble\s*{',re.I)
582

	
583
    waiting_for_end_string = 0
584
    i = 0
585
    filecont2 = ''
586

	
587
    for line in filecont:
588
        if line == ' ' or line == '':
589
            continue
590

	
591
        if waiting_for_end_string:
592
            if re.search('}',line):
593
                waiting_for_end_string = 0
594
                continue
595

	
596
        if abbrdef_rex.search(line):
597
            abbr = abbrdef_rex.sub('\g<1>', line)
598

	
599
            if abbr_list.count(abbr) == 0:
600
                val = abbrdef_rex.sub('\g<2>', line)
601
                abbr_list.append(abbr)
602
                value_list.append(string.strip(val))
603
                abbr_rex.append( re.compile( front + abbr_list[total_abbr_count] + back, re.I ) )
604
                total_abbr_count = total_abbr_count + 1
605
            waiting_for_end_string = 1
606
            continue
607

	
608
        if comment_rex.search(line):
609
            waiting_for_end_string = 1
610
            continue
611

	
612
        if preamble_rex.search(line):
613
            waiting_for_end_string = 1
614
            continue
615

	
616

	
617
        # replace subsequent abbreviations with the value
618
        abbr_count = 0
619

	
620
        for x in abbr_list:
621

	
622
            if abbr_rex[abbr_count].search(line):
623
                if verify_out_of_braces(line,abbr_list[abbr_count]) == 1:
624
                    line = abbr_rex[abbr_count].sub( value_list[abbr_count] + '\g<1>', line)
625
                # Check for # concatenations
626
                if concatsplit_rex.search(line):
627
                    line = concat_line(line)
628
            abbr_count = abbr_count + 1
629

	
630

	
631
        filecont2 = filecont2 + line + '\n'
632
        i = i+1
633

	
634

	
635
    # Do one final pass over file
636

	
637
    # make sure that didn't end up with {" or }" after the substitution
638
    filecont2 = filecont2.replace('{"','{{')
639
    filecont2 = filecont2.replace('"}','}}')
640

	
641
    afterquotevalue_rex = re.compile('"\s*,\s*')
642
    afterbrace_rex = re.compile('"\s*}')
643
    afterbracevalue_rex = re.compile('(=\s*{[^=]*)},\s*')
644

	
645
    # add new lines to data that changed because of abbreviation substitutions
646
    filecont2 = afterquotevalue_rex.sub('",\n', filecont2)
647
    filecont2 = afterbrace_rex.sub('"\n}', filecont2)
648
    filecont2 = afterbracevalue_rex.sub('\g<1>},\n', filecont2)
649

	
650
    return filecont2
651

	
652
#
653
# convert @type( ... ) to @type{ ... }
654
#
655
def no_outer_parens(filecont):
656

	
657
    # do checking for open parens
658
    # will convert to braces
659
    paren_split = re.split('([(){}])',filecont)
660

	
661
    open_paren_count = 0
662
    open_type = 0
663
    look_next = 0
664

	
665
    # rebuild filecont
666
    filecont = ''
667

	
668
    at_rex = re.compile('@\w*')
669

	
670
    for phrase in paren_split:
671
        if look_next == 1:
672
            if phrase == '(':
673
                phrase = '{'
674
                open_paren_count = open_paren_count + 1
675
            else:
676
                open_type = 0
677
            look_next = 0
678

	
679
        if phrase == '(':
680
            open_paren_count = open_paren_count + 1
681

	
682
        elif phrase == ')':
683
            open_paren_count = open_paren_count - 1
684
            if open_type == 1 and open_paren_count == 0:
685
                phrase = '}'
686
                open_type = 0
687

	
688
        elif at_rex.search( phrase ):
689
            open_type = 1
690
            look_next = 1
691

	
692
        filecont = filecont + phrase
693

	
694
    return filecont
695

	
696

	
697
#
698
# make all whitespace into just one space
699
# format the bibtex file into a usable form.
700
#
701
def bibtexwasher(filecont_source):
702

	
703
    space_rex = re.compile('\s+')
704
    comment_rex = re.compile('\s*%')
705

	
706
    filecont = []
707

	
708
    # remove trailing and excessive whitespace
709
    # ignore comments
710
    for line in filecont_source:
711
        line = string.strip(line)
712
        line = space_rex.sub(' ', line)
713
        # ignore comments
714
        if not comment_rex.match(line) and line != '':
715
            filecont.append(' '+ line)
716

	
717
    filecont = string.join(filecont, '')
718

	
719
    # the file is in one long string
720

	
721
    filecont = no_outer_parens(filecont)
722

	
723
    #
724
    # split lines according to preferred syntax scheme
725
    #
726
    filecont = re.sub('(=\s*{[^=]*)},', '\g<1>},\n', filecont)
727

	
728
    # add new lines after commas that are after values
729
    filecont = re.sub('"\s*,', '",\n', filecont)
730
    filecont = re.sub('=\s*([\w\d]+)\s*,', '= \g<1>,\n', filecont)
731
    filecont = re.sub('(@\w*)\s*({(\s*)[^,\s]*)\s*,',
732
                          '\n\n\g<1>\g<2>,\n', filecont)
733

	
734
    # add new lines after }
735
    filecont = re.sub('"\s*}','"\n}\n', filecont)
736
    filecont = re.sub('}\s*,','},\n', filecont)
737

	
738

	
739
    filecont = re.sub('@(\w*)', '\n@\g<1>', filecont)
740

	
741
    # character encoding, reserved latex characters
742
    filecont = re.sub('{\\\&}', '&', filecont)
743
    filecont = re.sub('\\\&', '&', filecont)
744

	
745
    # do checking for open braces to get format correct
746
    open_brace_count = 0
747
    brace_split = re.split('([{}])',filecont)
748

	
749
    # rebuild filecont
750
    filecont = ''
751

	
752
    for phrase in brace_split:
753
        if phrase == '{':
754
            open_brace_count = open_brace_count + 1
755
        elif phrase == '}':
756
            open_brace_count = open_brace_count - 1
757
            if open_brace_count == 0:
758
                filecont = filecont + '\n'
759

	
760
        filecont = filecont + phrase
761

	
762
    filecont2 = bibtex_replace_abbreviations(filecont)
763

	
764
    # gather
765
    filecont = filecont2.splitlines()
766
    i=0
767
    j=0         # count the number of blank lines
768
    for line in filecont:
769
        # ignore blank lines
770
        if line == '' or line == ' ':
771
            j = j+1
772
            continue
773
        filecont[i] = line + '\n'
774
        i = i+1
775

	
776
    # get rid of the extra stuff at the end of the array
777
    # (The extra stuff are duplicates that are in the array because
778
    # blank lines were removed.)
779
    length = len( filecont)
780
    filecont[length-j:length] = []
781

	
782
    return filecont
783

	
784

	
785
def filehandler(filepath):
786
    try:
787
        fd = open(filepath, 'r')
788
        filecont_source = fd.readlines()
789
        fd.close()
790
    except:
791
        print 'Could not open file:', filepath
792
    washeddata = bibtexwasher(filecont_source)
793
    outdata = bibtexdecoder(washeddata)
794
    print '/**'
795
    print '\page references References'
796
    print
797
    for line in outdata:
798
        print line
799
    print '*/'
800

	
801

	
802
# main program
803

	
804
def main():
805
    import sys
806
    if sys.argv[1:]:
807
        filepath = sys.argv[1]
808
    else:
809
        print "No input file"
810
        sys.exit()
811
    filehandler(filepath)
812

	
813
if __name__ == "__main__": main()
814

	
815

	
816
# end python script
Ignore white space 6 line context
1
#!/bin/bash
2
#
3
# This file is a part of LEMON, a generic C++ optimization library.
4
#
5
# Copyright (C) 2003-2009
6
# Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
# (Egervary Research Group on Combinatorial Optimization, EGRES).
8
#
9
# Permission to use, modify and distribute this software is granted
10
# provided that this copyright notice appears in all copies. For
11
# precise terms see the accompanying LICENSE file.
12
#
13
# This software is provided "AS IS" with no warranty of any kind,
14
# express or implied, and with no claim as to its suitability for any
15
# purpose.
16

	
17

	
18
if [ ! -f ~/.lemon-bootstrap ]; then
19
    echo 'Create ~/.lemon-bootstrap'.
20
    cat >~/.lemon-bootstrap <<EOF
21
#
22
# Default settings for bootstraping the LEMON source code repository
23
#
24
EOF
25
fi
26

	
27
source ~/.lemon-bootstrap
28
if [ -f ../../../.lemon-bootstrap ]; then source ../../../.lemon-bootstrap; fi
29
if [ -f ../../.lemon-bootstrap ]; then source ../../.lemon-bootstrap; fi
30
if [ -f ../.lemon-bootstrap ]; then source ../.lemon-bootstrap; fi
31
if [ -f ./.lemon-bootstrap ]; then source ./.lemon-bootstrap; fi
32

	
33

	
34
function augment_config() { 
35
    if [ "x${!1}" == "x" ]; then
36
        eval $1=$2
37
        echo Add "'$1'" to '~/.lemon-bootstrap'.
38
        echo >>~/.lemon-bootstrap
39
        echo $3 >>~/.lemon-bootstrap
40
        echo $1=$2 >>~/.lemon-bootstrap
41
    fi
42
}
43

	
44
augment_config LEMON_INSTALL_PREFIX /usr/local \
45
    "# LEMON installation prefix"
46

	
47
augment_config GLPK_PREFIX /usr/local/ \
48
    "# GLPK installation root prefix"
49

	
50
augment_config COIN_OR_PREFIX /usr/local/coin-or \
51
    "# COIN-OR installation root prefix (used for CLP/CBC)"
52

	
53
augment_config SOPLEX_PREFIX /usr/local/soplex \
54
    "# Soplex build prefix"
55

	
56

	
57
function ask() {
58
echo -n "$1 [$2]? "
59
read _an
60
if [ "x$_an" == "x" ]; then
61
    ret="$2"
62
else
63
    ret=$_an
64
fi
65
}
66

	
67
function yesorno() {
68
    ret='rossz'
69
    while [ "$ret" != "y" -a "$ret" != "n" -a "$ret" != "yes" -a "$ret" != "no" ]; do
70
        ask "$1" "$2"
71
    done
72
    if [ "$ret" != "y" -a "$ret" != "yes" ]; then
73
        return 1
74
    else
75
        return 0
76
    fi
77
}
78

	
79
if yesorno "External build" "n"
80
then
81
    CONFIGURE_PATH=".."
82
else
83
    CONFIGURE_PATH="."
84
    if yesorno "Autoreconf" "y"
85
    then
86
        AUTORE=yes
87
    else
88
        AUTORE=no
89
    fi
90
fi
91

	
92
if yesorno "Optimize" "n" 
93
then
94
    opt_flags=' -O2'
95
else
96
    opt_flags=''
97
fi
98

	
99
if yesorno "Stop on warning" "y" 
100
then
101
    werror_flags=' -Werror'
102
else
103
    werror_flags=''
104
fi
105

	
106
cxx_flags="CXXFLAGS=-ggdb$opt_flags$werror_flags"
107

	
108
if yesorno "Check with valgrind" "n" 
109
then
110
    valgrind_flags=' --enable-valgrind'
111
else
112
    valgrind_flags=''
113
fi
114

	
115
if [ -f ${GLPK_PREFIX}/include/glpk.h ]; then
116
    if yesorno "Use GLPK" "y"
117
    then
118
        glpk_flag="--with-glpk=$GLPK_PREFIX"
119
    else
120
        glpk_flag="--without-glpk"
121
    fi
122
else
123
    glpk_flag="--without-glpk"        
124
fi
125

	
126
if [ -f ${COIN_OR_PREFIX}/include/coin/config_coinutils.h ]; then
127
    if yesorno "Use COIN-OR (CBC/CLP)" "n"
128
    then
129
        coin_flag="--with-coin=$COIN_OR_PREFIX"
130
    else
131
        coin_flag="--without-coin"
132
    fi
133
else
134
    coin_flag="--without-coin"        
135
fi
136

	
137
if [ -f ${SOPLEX_PREFIX}/src/soplex.h ]; then
138
    if yesorno "Use Soplex" "n"
139
    then
140
        soplex_flag="--with-soplex=$SOPLEX_PREFIX"
141
    else
142
        soplex_flag="--without-soplex"
143
    fi
144
else
145
    soplex_flag="--without-soplex"
146
fi
147

	
148
if [ "x$AUTORE" == "xyes" ]; then
149
    autoreconf -vif;
150
fi
151
${CONFIGURE_PATH}/configure --prefix=$LEMON_INSTALL_PREFIX \
152
$valgrind_flags \
153
"$cxx_flags" \
154
$glpk_flag \
155
$coin_flag \
156
$soplex_flag \
157
$*
Ignore white space 6 line context
1
#!/bin/sh
2

	
3
# Run in valgrind, with leak checking enabled
4

	
5
valgrind -q --leak-check=full "$@" 2> .valgrind-log
6

	
7
# Save the test result
8

	
9
result="$?"
10

	
11
# Valgrind should generate no error messages
12

	
13
log_contents="`cat .valgrind-log`"
14

	
15
if [ "$log_contents" != "" ]; then
16
        cat .valgrind-log >&2
17
        result=1
18
fi
19

	
20
rm -f .valgrind-log
21

	
22
exit $result
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2010
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#include <lemon/concepts/digraph.h>
20
#include <lemon/smart_graph.h>
21
#include <lemon/list_graph.h>
22
#include <lemon/lgf_reader.h>
23
#include <lemon/bellman_ford.h>
24
#include <lemon/path.h>
25

	
26
#include "graph_test.h"
27
#include "test_tools.h"
28

	
29
using namespace lemon;
30

	
31
char test_lgf[] =
32
  "@nodes\n"
33
  "label\n"
34
  "0\n"
35
  "1\n"
36
  "2\n"
37
  "3\n"
38
  "4\n"
39
  "@arcs\n"
40
  "    length\n"
41
  "0 1 3\n"
42
  "1 2 -3\n"
43
  "1 2 -5\n"
44
  "1 3 -2\n"
45
  "0 2 -1\n"
46
  "1 2 -4\n"
47
  "0 3 2\n"
48
  "4 2 -5\n"
49
  "2 3 1\n"
50
  "@attributes\n"
51
  "source 0\n"
52
  "target 3\n";
53

	
54

	
55
void checkBellmanFordCompile()
56
{
57
  typedef int Value;
58
  typedef concepts::Digraph Digraph;
59
  typedef concepts::ReadMap<Digraph::Arc,Value> LengthMap;
60
  typedef BellmanFord<Digraph, LengthMap> BF;
61
  typedef Digraph::Node Node;
62
  typedef Digraph::Arc Arc;
63

	
64
  Digraph gr;
65
  Node s, t, n;
66
  Arc e;
67
  Value l;
68
  int k=3;
69
  bool b;
70
  BF::DistMap d(gr);
71
  BF::PredMap p(gr);
72
  LengthMap length;
73
  concepts::Path<Digraph> pp;
74

	
75
  {
76
    BF bf_test(gr,length);
77
    const BF& const_bf_test = bf_test;
78

	
79
    bf_test.run(s);
80
    bf_test.run(s,k);
81

	
82
    bf_test.init();
83
    bf_test.addSource(s);
84
    bf_test.addSource(s, 1);
85
    b = bf_test.processNextRound();
86
    b = bf_test.processNextWeakRound();
87

	
88
    bf_test.start();
89
    bf_test.checkedStart();
90
    bf_test.limitedStart(k);
91

	
92
    l  = const_bf_test.dist(t);
93
    e  = const_bf_test.predArc(t);
94
    s  = const_bf_test.predNode(t);
95
    b  = const_bf_test.reached(t);
96
    d  = const_bf_test.distMap();
97
    p  = const_bf_test.predMap();
98
    pp = const_bf_test.path(t);
99
    pp = const_bf_test.negativeCycle();
100

	
101
    for (BF::ActiveIt it(const_bf_test); it != INVALID; ++it) {}
102
  }
103
  {
104
    BF::SetPredMap<concepts::ReadWriteMap<Node,Arc> >
105
      ::SetDistMap<concepts::ReadWriteMap<Node,Value> >
106
      ::SetOperationTraits<BellmanFordDefaultOperationTraits<Value> >
107
      ::SetOperationTraits<BellmanFordToleranceOperationTraits<Value, 0> >
108
      ::Create bf_test(gr,length);
109

	
110
    LengthMap length_map;
111
    concepts::ReadWriteMap<Node,Arc> pred_map;
112
    concepts::ReadWriteMap<Node,Value> dist_map;
113

	
114
    bf_test
115
      .lengthMap(length_map)
116
      .predMap(pred_map)
117
      .distMap(dist_map);
118

	
119
    bf_test.run(s);
120
    bf_test.run(s,k);
121

	
122
    bf_test.init();
123
    bf_test.addSource(s);
124
    bf_test.addSource(s, 1);
125
    b = bf_test.processNextRound();
126
    b = bf_test.processNextWeakRound();
127

	
128
    bf_test.start();
129
    bf_test.checkedStart();
130
    bf_test.limitedStart(k);
131

	
132
    l  = bf_test.dist(t);
133
    e  = bf_test.predArc(t);
134
    s  = bf_test.predNode(t);
135
    b  = bf_test.reached(t);
136
    pp = bf_test.path(t);
137
    pp = bf_test.negativeCycle();
138
  }
139
}
140

	
141
void checkBellmanFordFunctionCompile()
142
{
143
  typedef int Value;
144
  typedef concepts::Digraph Digraph;
145
  typedef Digraph::Arc Arc;
146
  typedef Digraph::Node Node;
147
  typedef concepts::ReadMap<Digraph::Arc,Value> LengthMap;
148

	
149
  Digraph g;
150
  bool b;
151
  bellmanFord(g,LengthMap()).run(Node());
152
  b = bellmanFord(g,LengthMap()).run(Node(),Node());
153
  bellmanFord(g,LengthMap())
154
    .predMap(concepts::ReadWriteMap<Node,Arc>())
155
    .distMap(concepts::ReadWriteMap<Node,Value>())
156
    .run(Node());
157
  b=bellmanFord(g,LengthMap())
158
    .predMap(concepts::ReadWriteMap<Node,Arc>())
159
    .distMap(concepts::ReadWriteMap<Node,Value>())
160
    .path(concepts::Path<Digraph>())
161
    .dist(Value())
162
    .run(Node(),Node());
163
}
164

	
165

	
166
template <typename Digraph, typename Value>
167
void checkBellmanFord() {
168
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
169
  typedef typename Digraph::template ArcMap<Value> LengthMap;
170

	
171
  Digraph gr;
172
  Node s, t;
173
  LengthMap length(gr);
174

	
175
  std::istringstream input(test_lgf);
176
  digraphReader(gr, input).
177
    arcMap("length", length).
178
    node("source", s).
179
    node("target", t).
180
    run();
181

	
182
  BellmanFord<Digraph, LengthMap>
183
    bf(gr, length);
184
  bf.run(s);
185
  Path<Digraph> p = bf.path(t);
186

	
187
  check(bf.reached(t) && bf.dist(t) == -1, "Bellman-Ford found a wrong path.");
188
  check(p.length() == 3, "path() found a wrong path.");
189
  check(checkPath(gr, p), "path() found a wrong path.");
190
  check(pathSource(gr, p) == s, "path() found a wrong path.");
191
  check(pathTarget(gr, p) == t, "path() found a wrong path.");
192

	
193
  ListPath<Digraph> path;
194
  Value dist;
195
  bool reached = bellmanFord(gr,length).path(path).dist(dist).run(s,t);
196

	
197
  check(reached && dist == -1, "Bellman-Ford found a wrong path.");
198
  check(path.length() == 3, "path() found a wrong path.");
199
  check(checkPath(gr, path), "path() found a wrong path.");
200
  check(pathSource(gr, path) == s, "path() found a wrong path.");
201
  check(pathTarget(gr, path) == t, "path() found a wrong path.");
202

	
203
  for(ArcIt e(gr); e!=INVALID; ++e) {
204
    Node u=gr.source(e);
205
    Node v=gr.target(e);
206
    check(!bf.reached(u) || (bf.dist(v) - bf.dist(u) <= length[e]),
207
          "Wrong output. dist(target)-dist(source)-arc_length=" <<
208
          bf.dist(v) - bf.dist(u) - length[e]);
209
  }
210

	
211
  for(NodeIt v(gr); v!=INVALID; ++v) {
212
    if (bf.reached(v)) {
213
      check(v==s || bf.predArc(v)!=INVALID, "Wrong tree.");
214
      if (bf.predArc(v)!=INVALID ) {
215
        Arc e=bf.predArc(v);
216
        Node u=gr.source(e);
217
        check(u==bf.predNode(v),"Wrong tree.");
218
        check(bf.dist(v) - bf.dist(u) == length[e],
219
              "Wrong distance! Difference: " <<
220
              bf.dist(v) - bf.dist(u) - length[e]);
221
      }
222
    }
223
  }
224
}
225

	
226
void checkBellmanFordNegativeCycle() {
227
  DIGRAPH_TYPEDEFS(SmartDigraph);
228

	
229
  SmartDigraph gr;
230
  IntArcMap length(gr);
231

	
232
  Node n1 = gr.addNode();
233
  Node n2 = gr.addNode();
234
  Node n3 = gr.addNode();
235
  Node n4 = gr.addNode();
236

	
237
  Arc a1 = gr.addArc(n1, n2);
238
  Arc a2 = gr.addArc(n2, n2);
239

	
240
  length[a1] = 2;
241
  length[a2] = -1;
242

	
243
  {
244
    BellmanFord<SmartDigraph, IntArcMap> bf(gr, length);
245
    bf.run(n1);
246
    StaticPath<SmartDigraph> p = bf.negativeCycle();
247
    check(p.length() == 1 && p.front() == p.back() && p.front() == a2,
248
          "Wrong negative cycle.");
249
  }
250

	
251
  length[a2] = 0;
252

	
253
  {
254
    BellmanFord<SmartDigraph, IntArcMap> bf(gr, length);
255
    bf.run(n1);
256
    check(bf.negativeCycle().empty(),
257
          "Negative cycle should not be found.");
258
  }
259

	
260
  length[gr.addArc(n1, n3)] = 5;
261
  length[gr.addArc(n4, n3)] = 1;
262
  length[gr.addArc(n2, n4)] = 2;
263
  length[gr.addArc(n3, n2)] = -4;
264

	
265
  {
266
    BellmanFord<SmartDigraph, IntArcMap> bf(gr, length);
267
    bf.init();
268
    bf.addSource(n1);
269
    for (int i = 0; i < 4; ++i) {
270
      check(bf.negativeCycle().empty(),
271
            "Negative cycle should not be found.");
272
      bf.processNextRound();
273
    }
274
    StaticPath<SmartDigraph> p = bf.negativeCycle();
275
    check(p.length() == 3, "Wrong negative cycle.");
276
    check(length[p.nth(0)] + length[p.nth(1)] + length[p.nth(2)] == -1,
277
          "Wrong negative cycle.");
278
  }
279
}
280

	
281
int main() {
282
  checkBellmanFord<ListDigraph, int>();
283
  checkBellmanFord<SmartDigraph, double>();
284
  checkBellmanFordNegativeCycle();
285
  return 0;
286
}
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2010
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#include <iostream>
20
#include <sstream>
21
#include <vector>
22
#include <queue>
23
#include <cstdlib>
24

	
25
#include <lemon/fractional_matching.h>
26
#include <lemon/smart_graph.h>
27
#include <lemon/concepts/graph.h>
28
#include <lemon/concepts/maps.h>
29
#include <lemon/lgf_reader.h>
30
#include <lemon/math.h>
31

	
32
#include "test_tools.h"
33

	
34
using namespace std;
35
using namespace lemon;
36

	
37
GRAPH_TYPEDEFS(SmartGraph);
38

	
39

	
40
const int lgfn = 4;
41
const std::string lgf[lgfn] = {
42
  "@nodes\n"
43
  "label\n"
44
  "0\n"
45
  "1\n"
46
  "2\n"
47
  "3\n"
48
  "4\n"
49
  "5\n"
50
  "6\n"
51
  "7\n"
52
  "@edges\n"
53
  "     label  weight\n"
54
  "7 4  0      984\n"
55
  "0 7  1      73\n"
56
  "7 1  2      204\n"
57
  "2 3  3      583\n"
58
  "2 7  4      565\n"
59
  "2 1  5      582\n"
60
  "0 4  6      551\n"
61
  "2 5  7      385\n"
62
  "1 5  8      561\n"
63
  "5 3  9      484\n"
64
  "7 5  10     904\n"
65
  "3 6  11     47\n"
66
  "7 6  12     888\n"
67
  "3 0  13     747\n"
68
  "6 1  14     310\n",
69

	
70
  "@nodes\n"
71
  "label\n"
72
  "0\n"
73
  "1\n"
74
  "2\n"
75
  "3\n"
76
  "4\n"
77
  "5\n"
78
  "6\n"
79
  "7\n"
80
  "@edges\n"
81
  "     label  weight\n"
82
  "2 5  0      710\n"
83
  "0 5  1      241\n"
84
  "2 4  2      856\n"
85
  "2 6  3      762\n"
86
  "4 1  4      747\n"
87
  "6 1  5      962\n"
88
  "4 7  6      723\n"
89
  "1 7  7      661\n"
90
  "2 3  8      376\n"
91
  "1 0  9      416\n"
92
  "6 7  10     391\n",
93

	
94
  "@nodes\n"
95
  "label\n"
96
  "0\n"
97
  "1\n"
98
  "2\n"
99
  "3\n"
100
  "4\n"
101
  "5\n"
102
  "6\n"
103
  "7\n"
104
  "@edges\n"
105
  "     label  weight\n"
106
  "6 2  0      553\n"
107
  "0 7  1      653\n"
108
  "6 3  2      22\n"
109
  "4 7  3      846\n"
110
  "7 2  4      981\n"
111
  "7 6  5      250\n"
112
  "5 2  6      539\n",
113

	
114
  "@nodes\n"
115
  "label\n"
116
  "0\n"
117
  "@edges\n"
118
  "     label  weight\n"
119
  "0 0  0      100\n"
120
};
121

	
122
void checkMaxFractionalMatchingCompile()
123
{
124
  typedef concepts::Graph Graph;
125
  typedef Graph::Node Node;
126
  typedef Graph::Edge Edge;
127

	
128
  Graph g;
129
  Node n;
130
  Edge e;
131

	
132
  MaxFractionalMatching<Graph> mat_test(g);
133
  const MaxFractionalMatching<Graph>&
134
    const_mat_test = mat_test;
135

	
136
  mat_test.init();
137
  mat_test.start();
138
  mat_test.start(true);
139
  mat_test.startPerfect();
140
  mat_test.startPerfect(true);
141
  mat_test.run();
142
  mat_test.run(true);
143
  mat_test.runPerfect();
144
  mat_test.runPerfect(true);
145

	
146
  const_mat_test.matchingSize();
147
  const_mat_test.matching(e);
148
  const_mat_test.matching(n);
149
  const MaxFractionalMatching<Graph>::MatchingMap& mmap =
150
    const_mat_test.matchingMap();
151
  e = mmap[n];
152

	
153
  const_mat_test.barrier(n);
154
}
155

	
156
void checkMaxWeightedFractionalMatchingCompile()
157
{
158
  typedef concepts::Graph Graph;
159
  typedef Graph::Node Node;
160
  typedef Graph::Edge Edge;
161
  typedef Graph::EdgeMap<int> WeightMap;
162

	
163
  Graph g;
164
  Node n;
165
  Edge e;
166
  WeightMap w(g);
167

	
168
  MaxWeightedFractionalMatching<Graph> mat_test(g, w);
169
  const MaxWeightedFractionalMatching<Graph>&
170
    const_mat_test = mat_test;
171

	
172
  mat_test.init();
173
  mat_test.start();
174
  mat_test.run();
175

	
176
  const_mat_test.matchingWeight();
177
  const_mat_test.matchingSize();
178
  const_mat_test.matching(e);
179
  const_mat_test.matching(n);
180
  const MaxWeightedFractionalMatching<Graph>::MatchingMap& mmap =
181
    const_mat_test.matchingMap();
182
  e = mmap[n];
183

	
184
  const_mat_test.dualValue();
185
  const_mat_test.nodeValue(n);
186
}
187

	
188
void checkMaxWeightedPerfectFractionalMatchingCompile()
189
{
190
  typedef concepts::Graph Graph;
191
  typedef Graph::Node Node;
192
  typedef Graph::Edge Edge;
193
  typedef Graph::EdgeMap<int> WeightMap;
194

	
195
  Graph g;
196
  Node n;
197
  Edge e;
198
  WeightMap w(g);
199

	
200
  MaxWeightedPerfectFractionalMatching<Graph> mat_test(g, w);
201
  const MaxWeightedPerfectFractionalMatching<Graph>&
202
    const_mat_test = mat_test;
203

	
204
  mat_test.init();
205
  mat_test.start();
206
  mat_test.run();
207

	
208
  const_mat_test.matchingWeight();
209
  const_mat_test.matching(e);
210
  const_mat_test.matching(n);
211
  const MaxWeightedPerfectFractionalMatching<Graph>::MatchingMap& mmap =
212
    const_mat_test.matchingMap();
213
  e = mmap[n];
214

	
215
  const_mat_test.dualValue();
216
  const_mat_test.nodeValue(n);
217
}
218

	
219
void checkFractionalMatching(const SmartGraph& graph,
220
                             const MaxFractionalMatching<SmartGraph>& mfm,
221
                             bool allow_loops = true) {
222
  int pv = 0;
223
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
224
    int indeg = 0;
225
    for (InArcIt a(graph, n); a != INVALID; ++a) {
226
      if (mfm.matching(graph.source(a)) == a) {
227
        ++indeg;
228
      }
229
    }
230
    if (mfm.matching(n) != INVALID) {
231
      check(indeg == 1, "Invalid matching");
232
      ++pv;
233
    } else {
234
      check(indeg == 0, "Invalid matching");
235
    }
236
  }
237
  check(pv == mfm.matchingSize(), "Wrong matching size");
238

	
239
  for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) {
240
    check((e == mfm.matching(graph.u(e)) ? 1 : 0) +
241
          (e == mfm.matching(graph.v(e)) ? 1 : 0) ==
242
          mfm.matching(e), "Invalid matching");
243
  }
244

	
245
  SmartGraph::NodeMap<bool> processed(graph, false);
246
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
247
    if (processed[n]) continue;
248
    processed[n] = true;
249
    if (mfm.matching(n) == INVALID) continue;
250
    int num = 1;
251
    Node v = graph.target(mfm.matching(n));
252
    while (v != n) {
253
      processed[v] = true;
254
      ++num;
255
      v = graph.target(mfm.matching(v));
256
    }
257
    check(num == 2 || num % 2 == 1, "Wrong cycle size");
258
    check(allow_loops || num != 1, "Wrong cycle size");
259
  }
260

	
261
  int anum = 0, bnum = 0;
262
  SmartGraph::NodeMap<bool> neighbours(graph, false);
263
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
264
    if (!mfm.barrier(n)) continue;
265
    ++anum;
266
    for (SmartGraph::InArcIt a(graph, n); a != INVALID; ++a) {
267
      Node u = graph.source(a);
268
      if (!allow_loops && u == n) continue;
269
      if (!neighbours[u]) {
270
        neighbours[u] = true;
271
        ++bnum;
272
      }
273
    }
274
  }
275
  check(anum - bnum + mfm.matchingSize() == countNodes(graph),
276
        "Wrong barrier");
277
}
278

	
279
void checkPerfectFractionalMatching(const SmartGraph& graph,
280
                             const MaxFractionalMatching<SmartGraph>& mfm,
281
                             bool perfect, bool allow_loops = true) {
282
  if (perfect) {
283
    for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
284
      int indeg = 0;
285
      for (InArcIt a(graph, n); a != INVALID; ++a) {
286
        if (mfm.matching(graph.source(a)) == a) {
287
          ++indeg;
288
        }
289
      }
290
      check(mfm.matching(n) != INVALID, "Invalid matching");
291
      check(indeg == 1, "Invalid matching");
292
    }
293
    for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) {
294
      check((e == mfm.matching(graph.u(e)) ? 1 : 0) +
295
            (e == mfm.matching(graph.v(e)) ? 1 : 0) ==
296
            mfm.matching(e), "Invalid matching");
297
    }
298
  } else {
299
    int anum = 0, bnum = 0;
300
    SmartGraph::NodeMap<bool> neighbours(graph, false);
301
    for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
302
      if (!mfm.barrier(n)) continue;
303
      ++anum;
304
      for (SmartGraph::InArcIt a(graph, n); a != INVALID; ++a) {
305
        Node u = graph.source(a);
306
        if (!allow_loops && u == n) continue;
307
        if (!neighbours[u]) {
308
          neighbours[u] = true;
309
          ++bnum;
310
        }
311
      }
312
    }
313
    check(anum - bnum > 0, "Wrong barrier");
314
  }
315
}
316

	
317
void checkWeightedFractionalMatching(const SmartGraph& graph,
318
                   const SmartGraph::EdgeMap<int>& weight,
319
                   const MaxWeightedFractionalMatching<SmartGraph>& mwfm,
320
                   bool allow_loops = true) {
321
  for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) {
322
    if (graph.u(e) == graph.v(e) && !allow_loops) continue;
323
    int rw = mwfm.nodeValue(graph.u(e)) + mwfm.nodeValue(graph.v(e))
324
      - weight[e] * mwfm.dualScale;
325

	
326
    check(rw >= 0, "Negative reduced weight");
327
    check(rw == 0 || !mwfm.matching(e),
328
          "Non-zero reduced weight on matching edge");
329
  }
330

	
331
  int pv = 0;
332
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
333
    int indeg = 0;
334
    for (InArcIt a(graph, n); a != INVALID; ++a) {
335
      if (mwfm.matching(graph.source(a)) == a) {
336
        ++indeg;
337
      }
338
    }
339
    check(indeg <= 1, "Invalid matching");
340
    if (mwfm.matching(n) != INVALID) {
341
      check(mwfm.nodeValue(n) >= 0, "Invalid node value");
342
      check(indeg == 1, "Invalid matching");
343
      pv += weight[mwfm.matching(n)];
344
      SmartGraph::Node o = graph.target(mwfm.matching(n));
345
    } else {
346
      check(mwfm.nodeValue(n) == 0, "Invalid matching");
347
      check(indeg == 0, "Invalid matching");
348
    }
349
  }
350

	
351
  for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) {
352
    check((e == mwfm.matching(graph.u(e)) ? 1 : 0) +
353
          (e == mwfm.matching(graph.v(e)) ? 1 : 0) ==
354
          mwfm.matching(e), "Invalid matching");
355
  }
356

	
357
  int dv = 0;
358
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
359
    dv += mwfm.nodeValue(n);
360
  }
361

	
362
  check(pv * mwfm.dualScale == dv * 2, "Wrong duality");
363

	
364
  SmartGraph::NodeMap<bool> processed(graph, false);
365
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
366
    if (processed[n]) continue;
367
    processed[n] = true;
368
    if (mwfm.matching(n) == INVALID) continue;
369
    int num = 1;
370
    Node v = graph.target(mwfm.matching(n));
371
    while (v != n) {
372
      processed[v] = true;
373
      ++num;
374
      v = graph.target(mwfm.matching(v));
375
    }
376
    check(num == 2 || num % 2 == 1, "Wrong cycle size");
377
    check(allow_loops || num != 1, "Wrong cycle size");
378
  }
379

	
380
  return;
381
}
382

	
383
void checkWeightedPerfectFractionalMatching(const SmartGraph& graph,
384
                const SmartGraph::EdgeMap<int>& weight,
385
                const MaxWeightedPerfectFractionalMatching<SmartGraph>& mwpfm,
386
                bool allow_loops = true) {
387
  for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) {
388
    if (graph.u(e) == graph.v(e) && !allow_loops) continue;
389
    int rw = mwpfm.nodeValue(graph.u(e)) + mwpfm.nodeValue(graph.v(e))
390
      - weight[e] * mwpfm.dualScale;
391

	
392
    check(rw >= 0, "Negative reduced weight");
393
    check(rw == 0 || !mwpfm.matching(e),
394
          "Non-zero reduced weight on matching edge");
395
  }
396

	
397
  int pv = 0;
398
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
399
    int indeg = 0;
400
    for (InArcIt a(graph, n); a != INVALID; ++a) {
401
      if (mwpfm.matching(graph.source(a)) == a) {
402
        ++indeg;
403
      }
404
    }
405
    check(mwpfm.matching(n) != INVALID, "Invalid perfect matching");
406
    check(indeg == 1, "Invalid perfect matching");
407
    pv += weight[mwpfm.matching(n)];
408
    SmartGraph::Node o = graph.target(mwpfm.matching(n));
409
  }
410

	
411
  for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) {
412
    check((e == mwpfm.matching(graph.u(e)) ? 1 : 0) +
413
          (e == mwpfm.matching(graph.v(e)) ? 1 : 0) ==
414
          mwpfm.matching(e), "Invalid matching");
415
  }
416

	
417
  int dv = 0;
418
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
419
    dv += mwpfm.nodeValue(n);
420
  }
421

	
422
  check(pv * mwpfm.dualScale == dv * 2, "Wrong duality");
423

	
424
  SmartGraph::NodeMap<bool> processed(graph, false);
425
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
426
    if (processed[n]) continue;
427
    processed[n] = true;
428
    if (mwpfm.matching(n) == INVALID) continue;
429
    int num = 1;
430
    Node v = graph.target(mwpfm.matching(n));
431
    while (v != n) {
432
      processed[v] = true;
433
      ++num;
434
      v = graph.target(mwpfm.matching(v));
435
    }
436
    check(num == 2 || num % 2 == 1, "Wrong cycle size");
437
    check(allow_loops || num != 1, "Wrong cycle size");
438
  }
439

	
440
  return;
441
}
442

	
443

	
444
int main() {
445

	
446
  for (int i = 0; i < lgfn; ++i) {
447
    SmartGraph graph;
448
    SmartGraph::EdgeMap<int> weight(graph);
449

	
450
    istringstream lgfs(lgf[i]);
451
    graphReader(graph, lgfs).
452
      edgeMap("weight", weight).run();
453

	
454
    bool perfect_with_loops;
455
    {
456
      MaxFractionalMatching<SmartGraph> mfm(graph, true);
457
      mfm.run();
458
      checkFractionalMatching(graph, mfm, true);
459
      perfect_with_loops = mfm.matchingSize() == countNodes(graph);
460
    }
461

	
462
    bool perfect_without_loops;
463
    {
464
      MaxFractionalMatching<SmartGraph> mfm(graph, false);
465
      mfm.run();
466
      checkFractionalMatching(graph, mfm, false);
467
      perfect_without_loops = mfm.matchingSize() == countNodes(graph);
468
    }
469

	
470
    {
471
      MaxFractionalMatching<SmartGraph> mfm(graph, true);
472
      bool result = mfm.runPerfect();
473
      checkPerfectFractionalMatching(graph, mfm, result, true);
474
      check(result == perfect_with_loops, "Wrong perfect matching");
475
    }
476

	
477
    {
478
      MaxFractionalMatching<SmartGraph> mfm(graph, false);
479
      bool result = mfm.runPerfect();
480
      checkPerfectFractionalMatching(graph, mfm, result, false);
481
      check(result == perfect_without_loops, "Wrong perfect matching");
482
    }
483

	
484
    {
485
      MaxWeightedFractionalMatching<SmartGraph> mwfm(graph, weight, true);
486
      mwfm.run();
487
      checkWeightedFractionalMatching(graph, weight, mwfm, true);
488
    }
489

	
490
    {
491
      MaxWeightedFractionalMatching<SmartGraph> mwfm(graph, weight, false);
492
      mwfm.run();
493
      checkWeightedFractionalMatching(graph, weight, mwfm, false);
494
    }
495

	
496
    {
497
      MaxWeightedPerfectFractionalMatching<SmartGraph> mwpfm(graph, weight,
498
                                                             true);
499
      bool perfect = mwpfm.run();
500
      check(perfect == (mwpfm.matchingSize() == countNodes(graph)),
501
            "Perfect matching found");
502
      check(perfect == perfect_with_loops, "Wrong perfect matching");
503

	
504
      if (perfect) {
505
        checkWeightedPerfectFractionalMatching(graph, weight, mwpfm, true);
506
      }
507
    }
508

	
509
    {
510
      MaxWeightedPerfectFractionalMatching<SmartGraph> mwpfm(graph, weight,
511
                                                             false);
512
      bool perfect = mwpfm.run();
513
      check(perfect == (mwpfm.matchingSize() == countNodes(graph)),
514
            "Perfect matching found");
515
      check(perfect == perfect_without_loops, "Wrong perfect matching");
516

	
517
      if (perfect) {
518
        checkWeightedPerfectFractionalMatching(graph, weight, mwpfm, false);
519
      }
520
    }
521

	
522
  }
523

	
524
  return 0;
525
}
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2010
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#include <iostream>
20
#include <sstream>
21

	
22
#include <lemon/smart_graph.h>
23
#include <lemon/lgf_reader.h>
24
#include <lemon/path.h>
25
#include <lemon/concepts/digraph.h>
26
#include <lemon/concept_check.h>
27

	
28
#include <lemon/karp_mmc.h>
29
#include <lemon/hartmann_orlin_mmc.h>
30
#include <lemon/howard_mmc.h>
31

	
32
#include "test_tools.h"
33

	
34
using namespace lemon;
35

	
36
char test_lgf[] =
37
  "@nodes\n"
38
  "label\n"
39
  "1\n"
40
  "2\n"
41
  "3\n"
42
  "4\n"
43
  "5\n"
44
  "6\n"
45
  "7\n"
46
  "@arcs\n"
47
  "    len1 len2 len3 len4  c1 c2 c3 c4\n"
48
  "1 2    1    1    1    1   0  0  0  0\n"
49
  "2 4    5    5    5    5   1  0  0  0\n"
50
  "2 3    8    8    8    8   0  0  0  0\n"
51
  "3 2   -2    0    0    0   1  0  0  0\n"
52
  "3 4    4    4    4    4   0  0  0  0\n"
53
  "3 7   -4   -4   -4   -4   0  0  0  0\n"
54
  "4 1    2    2    2    2   0  0  0  0\n"
55
  "4 3    3    3    3    3   1  0  0  0\n"
56
  "4 4    3    3    0    0   0  0  1  0\n"
57
  "5 2    4    4    4    4   0  0  0  0\n"
58
  "5 6    3    3    3    3   0  1  0  0\n"
59
  "6 5    2    2    2    2   0  1  0  0\n"
60
  "6 4   -1   -1   -1   -1   0  0  0  0\n"
61
  "6 7    1    1    1    1   0  0  0  0\n"
62
  "7 7    4    4    4   -1   0  0  0  1\n";
63

	
64

	
65
// Check the interface of an MMC algorithm
66
template <typename GR, typename Cost>
67
struct MmcClassConcept
68
{
69
  template <typename MMC>
70
  struct Constraints {
71
    void constraints() {
72
      const Constraints& me = *this;
73

	
74
      typedef typename MMC
75
        ::template SetPath<ListPath<GR> >
76
        ::template SetLargeCost<Cost>
77
        ::Create MmcAlg;
78
      MmcAlg mmc(me.g, me.cost);
79
      const MmcAlg& const_mmc = mmc;
80

	
81
      typename MmcAlg::Tolerance tol = const_mmc.tolerance();
82
      mmc.tolerance(tol);
83

	
84
      b = mmc.cycle(p).run();
85
      b = mmc.findCycleMean();
86
      b = mmc.findCycle();
87

	
88
      v = const_mmc.cycleCost();
89
      i = const_mmc.cycleSize();
90
      d = const_mmc.cycleMean();
91
      p = const_mmc.cycle();
92
    }
93

	
94
    typedef concepts::ReadMap<typename GR::Arc, Cost> CM;
95

	
96
    GR g;
97
    CM cost;
98
    ListPath<GR> p;
99
    Cost v;
100
    int i;
101
    double d;
102
    bool b;
103
  };
104
};
105

	
106
// Perform a test with the given parameters
107
template <typename MMC>
108
void checkMmcAlg(const SmartDigraph& gr,
109
                 const SmartDigraph::ArcMap<int>& lm,
110
                 const SmartDigraph::ArcMap<int>& cm,
111
                 int cost, int size) {
112
  MMC alg(gr, lm);
113
  alg.findCycleMean();
114
  check(alg.cycleMean() == static_cast<double>(cost) / size,
115
        "Wrong cycle mean");
116
  alg.findCycle();
117
  check(alg.cycleCost() == cost && alg.cycleSize() == size,
118
        "Wrong path");
119
  SmartDigraph::ArcMap<int> cycle(gr, 0);
120
  for (typename MMC::Path::ArcIt a(alg.cycle()); a != INVALID; ++a) {
121
    ++cycle[a];
122
  }
123
  for (SmartDigraph::ArcIt a(gr); a != INVALID; ++a) {
124
    check(cm[a] == cycle[a], "Wrong path");
125
  }
126
}
127

	
128
// Class for comparing types
129
template <typename T1, typename T2>
130
struct IsSameType {
131
  static const int result = 0;
132
};
133

	
134
template <typename T>
135
struct IsSameType<T,T> {
136
  static const int result = 1;
137
};
138

	
139

	
140
int main() {
141
  #ifdef LEMON_HAVE_LONG_LONG
142
    typedef long long long_int;
143
  #else
144
    typedef long long_int;
145
  #endif
146

	
147
  // Check the interface
148
  {
149
    typedef concepts::Digraph GR;
150

	
151
    // KarpMmc
152
    checkConcept< MmcClassConcept<GR, int>,
153
                  KarpMmc<GR, concepts::ReadMap<GR::Arc, int> > >();
154
    checkConcept< MmcClassConcept<GR, float>,
155
                  KarpMmc<GR, concepts::ReadMap<GR::Arc, float> > >();
156

	
157
    // HartmannOrlinMmc
158
    checkConcept< MmcClassConcept<GR, int>,
159
                  HartmannOrlinMmc<GR, concepts::ReadMap<GR::Arc, int> > >();
160
    checkConcept< MmcClassConcept<GR, float>,
161
                  HartmannOrlinMmc<GR, concepts::ReadMap<GR::Arc, float> > >();
162

	
163
    // HowardMmc
164
    checkConcept< MmcClassConcept<GR, int>,
165
                  HowardMmc<GR, concepts::ReadMap<GR::Arc, int> > >();
166
    checkConcept< MmcClassConcept<GR, float>,
167
                  HowardMmc<GR, concepts::ReadMap<GR::Arc, float> > >();
168

	
169
    check((IsSameType<HowardMmc<GR, concepts::ReadMap<GR::Arc, int> >
170
           ::LargeCost, long_int>::result == 1), "Wrong LargeCost type");
171
    check((IsSameType<HowardMmc<GR, concepts::ReadMap<GR::Arc, float> >
172
           ::LargeCost, double>::result == 1), "Wrong LargeCost type");
173
  }
174

	
175
  // Run various tests
176
  {
177
    typedef SmartDigraph GR;
178
    DIGRAPH_TYPEDEFS(GR);
179

	
180
    GR gr;
181
    IntArcMap l1(gr), l2(gr), l3(gr), l4(gr);
182
    IntArcMap c1(gr), c2(gr), c3(gr), c4(gr);
183

	
184
    std::istringstream input(test_lgf);
185
    digraphReader(gr, input).
186
      arcMap("len1", l1).
187
      arcMap("len2", l2).
188
      arcMap("len3", l3).
189
      arcMap("len4", l4).
190
      arcMap("c1", c1).
191
      arcMap("c2", c2).
192
      arcMap("c3", c3).
193
      arcMap("c4", c4).
194
      run();
195

	
196
    // Karp
197
    checkMmcAlg<KarpMmc<GR, IntArcMap> >(gr, l1, c1,  6, 3);
198
    checkMmcAlg<KarpMmc<GR, IntArcMap> >(gr, l2, c2,  5, 2);
199
    checkMmcAlg<KarpMmc<GR, IntArcMap> >(gr, l3, c3,  0, 1);
200
    checkMmcAlg<KarpMmc<GR, IntArcMap> >(gr, l4, c4, -1, 1);
201

	
202
    // HartmannOrlin
203
    checkMmcAlg<HartmannOrlinMmc<GR, IntArcMap> >(gr, l1, c1,  6, 3);
204
    checkMmcAlg<HartmannOrlinMmc<GR, IntArcMap> >(gr, l2, c2,  5, 2);
205
    checkMmcAlg<HartmannOrlinMmc<GR, IntArcMap> >(gr, l3, c3,  0, 1);
206
    checkMmcAlg<HartmannOrlinMmc<GR, IntArcMap> >(gr, l4, c4, -1, 1);
207

	
208
    // Howard
209
    checkMmcAlg<HowardMmc<GR, IntArcMap> >(gr, l1, c1,  6, 3);
210
    checkMmcAlg<HowardMmc<GR, IntArcMap> >(gr, l2, c2,  5, 2);
211
    checkMmcAlg<HowardMmc<GR, IntArcMap> >(gr, l3, c3,  0, 1);
212
    checkMmcAlg<HowardMmc<GR, IntArcMap> >(gr, l4, c4, -1, 1);
213
  }
214

	
215
  return 0;
216
}
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2009
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#include <iostream>
20

	
21
#include <lemon/planarity.h>
22

	
23
#include <lemon/smart_graph.h>
24
#include <lemon/lgf_reader.h>
25
#include <lemon/connectivity.h>
26
#include <lemon/dim2.h>
27

	
28
#include "test_tools.h"
29

	
30
using namespace lemon;
31
using namespace lemon::dim2;
32

	
33
const int lgfn = 4;
34
const std::string lgf[lgfn] = {
35
  "@nodes\n"
36
  "label\n"
37
  "0\n"
38
  "1\n"
39
  "2\n"
40
  "3\n"
41
  "4\n"
42
  "@edges\n"
43
  "     label\n"
44
  "0 1  0\n"
45
  "0 2  0\n"
46
  "0 3  0\n"
47
  "0 4  0\n"
48
  "1 2  0\n"
49
  "1 3  0\n"
50
  "1 4  0\n"
51
  "2 3  0\n"
52
  "2 4  0\n"
53
  "3 4  0\n",
54

	
55
  "@nodes\n"
56
  "label\n"
57
  "0\n"
58
  "1\n"
59
  "2\n"
60
  "3\n"
61
  "4\n"
62
  "@edges\n"
63
  "     label\n"
64
  "0 1  0\n"
65
  "0 2  0\n"
66
  "0 3  0\n"
67
  "0 4  0\n"
68
  "1 2  0\n"
69
  "1 3  0\n"
70
  "2 3  0\n"
71
  "2 4  0\n"
72
  "3 4  0\n",
73

	
74
  "@nodes\n"
75
  "label\n"
76
  "0\n"
77
  "1\n"
78
  "2\n"
79
  "3\n"
80
  "4\n"
81
  "5\n"
82
  "@edges\n"
83
  "     label\n"
84
  "0 3  0\n"
85
  "0 4  0\n"
86
  "0 5  0\n"
87
  "1 3  0\n"
88
  "1 4  0\n"
89
  "1 5  0\n"
90
  "2 3  0\n"
91
  "2 4  0\n"
92
  "2 5  0\n",
93

	
94
  "@nodes\n"
95
  "label\n"
96
  "0\n"
97
  "1\n"
98
  "2\n"
99
  "3\n"
100
  "4\n"
101
  "5\n"
102
  "@edges\n"
103
  "     label\n"
104
  "0 3  0\n"
105
  "0 4  0\n"
106
  "0 5  0\n"
107
  "1 3  0\n"
108
  "1 4  0\n"
109
  "1 5  0\n"
110
  "2 3  0\n"
111
  "2 5  0\n"
112
};
113

	
114

	
115

	
116
typedef SmartGraph Graph;
117
GRAPH_TYPEDEFS(Graph);
118

	
119
typedef PlanarEmbedding<SmartGraph> PE;
120
typedef PlanarDrawing<SmartGraph> PD;
121
typedef PlanarColoring<SmartGraph> PC;
122

	
123
void checkEmbedding(const Graph& graph, PE& pe) {
124
  int face_num = 0;
125

	
126
  Graph::ArcMap<int> face(graph, -1);
127

	
128
  for (ArcIt a(graph); a != INVALID; ++a) {
129
    if (face[a] == -1) {
130
      Arc b = a;
131
      while (face[b] == -1) {
132
        face[b] = face_num;
133
        b = pe.next(graph.oppositeArc(b));
134
      }
135
      check(face[b] == face_num, "Wrong face");
136
      ++face_num;
137
    }
138
  }
139
  check(face_num + countNodes(graph) - countConnectedComponents(graph) ==
140
        countEdges(graph) + 1, "Euler test does not passed");
141
}
142

	
143
void checkKuratowski(const Graph& graph, PE& pe) {
144
  std::map<int, int> degs;
145
  for (NodeIt n(graph); n != INVALID; ++n) {
146
    int deg = 0;
147
    for (IncEdgeIt e(graph, n); e != INVALID; ++e) {
148
      if (pe.kuratowski(e)) {
149
        ++deg;
150
      }
151
    }
152
    ++degs[deg];
153
  }
154
  for (std::map<int, int>::iterator it = degs.begin(); it != degs.end(); ++it) {
155
    check(it->first == 0 || it->first == 2 ||
156
          (it->first == 3 && it->second == 6) ||
157
          (it->first == 4 && it->second == 5),
158
          "Wrong degree in Kuratowski graph");
159
  }
160

	
161
  // Not full test
162
  check((degs[3] == 0) != (degs[4] == 0), "Wrong Kuratowski graph");
163
}
164

	
165
bool intersect(Point<int> e1, Point<int> e2, Point<int> f1, Point<int> f2) {
166
  int l, r;
167
  if (std::min(e1.x, e2.x) > std::max(f1.x, f2.x)) return false;
168
  if (std::max(e1.x, e2.x) < std::min(f1.x, f2.x)) return false;
169
  if (std::min(e1.y, e2.y) > std::max(f1.y, f2.y)) return false;
170
  if (std::max(e1.y, e2.y) < std::min(f1.y, f2.y)) return false;
171

	
172
  l = (e2.x - e1.x) * (f1.y - e1.y) - (e2.y - e1.y) * (f1.x - e1.x);
173
  r = (e2.x - e1.x) * (f2.y - e1.y) - (e2.y - e1.y) * (f2.x - e1.x);
174
  if (!((l >= 0 && r <= 0) || (l <= 0 && r >= 0))) return false;
175
  l = (f2.x - f1.x) * (e1.y - f1.y) - (f2.y - f1.y) * (e1.x - f1.x);
176
  r = (f2.x - f1.x) * (e2.y - f1.y) - (f2.y - f1.y) * (e2.x - f1.x);
177
  if (!((l >= 0 && r <= 0) || (l <= 0 && r >= 0))) return false;
178
  return true;
179
}
180

	
181
bool collinear(Point<int> p, Point<int> q, Point<int> r) {
182
  int v;
183
  v = (q.x - p.x) * (r.y - p.y) - (q.y - p.y) * (r.x - p.x);
184
  if (v != 0) return false;
185
  v = (q.x - p.x) * (r.x - p.x) + (q.y - p.y) * (r.y - p.y);
186
  if (v < 0) return false;
187
  return true;
188
}
189

	
190
void checkDrawing(const Graph& graph, PD& pd) {
191
  for (Graph::NodeIt n(graph); n != INVALID; ++n) {
192
    Graph::NodeIt m(n);
193
    for (++m; m != INVALID; ++m) {
194
      check(pd[m] != pd[n], "Two nodes with identical coordinates");
195
    }
196
  }
197

	
198
  for (Graph::EdgeIt e(graph); e != INVALID; ++e) {
199
    for (Graph::EdgeIt f(e); f != e; ++f) {
200
      Point<int> e1 = pd[graph.u(e)];
201
      Point<int> e2 = pd[graph.v(e)];
202
      Point<int> f1 = pd[graph.u(f)];
203
      Point<int> f2 = pd[graph.v(f)];
204

	
205
      if (graph.u(e) == graph.u(f)) {
206
        check(!collinear(e1, e2, f2), "Wrong drawing");
207
      } else if (graph.u(e) == graph.v(f)) {
208
        check(!collinear(e1, e2, f1), "Wrong drawing");
209
      } else if (graph.v(e) == graph.u(f)) {
210
        check(!collinear(e2, e1, f2), "Wrong drawing");
211
      } else if (graph.v(e) == graph.v(f)) {
212
        check(!collinear(e2, e1, f1), "Wrong drawing");
213
      } else {
214
        check(!intersect(e1, e2, f1, f2), "Wrong drawing");
215
      }
216
    }
217
  }
218
}
219

	
220
void checkColoring(const Graph& graph, PC& pc, int num) {
221
  for (NodeIt n(graph); n != INVALID; ++n) {
222
    check(pc.colorIndex(n) >= 0 && pc.colorIndex(n) < num,
223
          "Wrong coloring");
224
  }
225
  for (EdgeIt e(graph); e != INVALID; ++e) {
226
    check(pc.colorIndex(graph.u(e)) != pc.colorIndex(graph.v(e)),
227
          "Wrong coloring");
228
  }
229
}
230

	
231
int main() {
232

	
233
  for (int i = 0; i < lgfn; ++i) {
234
    std::istringstream lgfs(lgf[i]);
235

	
236
    SmartGraph graph;
237
    graphReader(graph, lgfs).run();
238

	
239
    check(simpleGraph(graph), "Test graphs must be simple");
240

	
241
    PE pe(graph);
242
    bool planar = pe.run();
243
    check(checkPlanarity(graph) == planar, "Planarity checking failed");
244

	
245
    if (planar) {
246
      checkEmbedding(graph, pe);
247

	
248
      PlanarDrawing<Graph> pd(graph);
249
      pd.run(pe.embeddingMap());
250
      checkDrawing(graph, pd);
251

	
252
      PlanarColoring<Graph> pc(graph);
253
      pc.runFiveColoring(pe.embeddingMap());
254
      checkColoring(graph, pc, 5);
255

	
256
    } else {
257
      checkKuratowski(graph, pe);
258
    }
259
  }
260

	
261
  return 0;
262
}
Ignore white space 6 line context
... ...
@@ -19,12 +19,13 @@
19 19
libtool
20 20
stamp-h1
21 21
lemon/lemon.pc
22 22
lemon/libemon.la
23 23
lemon/stamp-h2
24 24
doc/Doxyfile
25
doc/references.dox
25 26
cmake/version.cmake
26 27
.dirstamp
27 28
.libs/*
28 29
.deps/*
29 30
demo/*.eps
30 31
m4/libtool.m4
Ignore white space 6 line context
... ...
@@ -111,12 +111,14 @@
111 111

	
112 112

	
113 113
INCLUDE(CheckTypeSize)
114 114
CHECK_TYPE_SIZE("long long" LONG_LONG)
115 115
SET(LEMON_HAVE_LONG_LONG ${HAVE_LONG_LONG})
116 116

	
117
INCLUDE(FindPythonInterp)
118

	
117 119
ENABLE_TESTING()
118 120

	
119 121
IF(${CMAKE_BUILD_TYPE} STREQUAL "Maintainer")
120 122
  ADD_CUSTOM_TARGET(check ALL COMMAND ${CMAKE_CTEST_COMMAND})
121 123
ELSE()
122 124
  ADD_CUSTOM_TARGET(check COMMAND ${CMAKE_CTEST_COMMAND})
Ignore white space 6 line context
... ...
@@ -170,6 +170,28 @@
170 170
   useful when the COIN-OR headers and libraries are not under the
171 171
   same prefix (which is unlikely).
172 172

	
173 173
--without-coin
174 174

	
175 175
   Disable COIN-OR support.
176

	
177

	
178
Makefile Variables
179
==================
180

	
181
Some Makefile variables are reserved by the GNU Coding Standards for
182
the use of the "user" - the person building the package. For instance,
183
CXX and CXXFLAGS are such variables, and have the same meaning as
184
explained in the previous section. These variables can be set on the
185
command line when invoking `make' like this:
186
`make [VARIABLE=VALUE]...'
187

	
188
WARNINGCXXFLAGS is a non-standard Makefile variable introduced by us
189
to hold several compiler flags related to warnings. Its default value
190
can be overridden when invoking `make'. For example to disable all
191
warning flags use `make WARNINGCXXFLAGS='.
192

	
193
In order to turn off a single flag from the default set of warning
194
flags, you can use the CXXFLAGS variable, since this is passed after
195
WARNINGCXXFLAGS. For example to turn off `-Wold-style-cast' (which is
196
used by default when g++ is detected) you can use
197
`make CXXFLAGS="-g -O2 -Wno-old-style-cast"'.
Ignore white space 6 line context
... ...
@@ -41,12 +41,13 @@
41 41
XFAIL_TESTS =
42 42

	
43 43
include lemon/Makefile.am
44 44
include test/Makefile.am
45 45
include doc/Makefile.am
46 46
include tools/Makefile.am
47
include scripts/Makefile.am
47 48

	
48 49
DIST_SUBDIRS = demo
49 50

	
50 51
demo:
51 52
	$(MAKE) $(AM_MAKEFLAGS) -C demo
52 53

	
Ignore white space 6 line context
... ...
@@ -14,12 +14,16 @@
14 14
========
15 15

	
16 16
LICENSE
17 17

	
18 18
   Copying, distribution and modification conditions and terms.
19 19

	
20
NEWS
21

	
22
   News and version history.
23

	
20 24
INSTALL
21 25

	
22 26
   General building and installation instructions.
23 27

	
24 28
lemon/
25 29

	
... ...
@@ -30,12 +34,16 @@
30 34
   Documentation of LEMON. The starting page is doc/html/index.html.
31 35

	
32 36
demo/
33 37

	
34 38
   Some example programs to make you easier to get familiar with LEMON.
35 39

	
40
scripts/
41

	
42
   Scripts that make it easier to develop LEMON.
43

	
36 44
test/
37 45

	
38 46
   Programs to check the integrity and correctness of LEMON.
39 47

	
40 48
tools/
41 49

	
Ignore white space 6 line context
... ...
@@ -38,12 +38,13 @@
38 38
AC_PROG_CXXCPP
39 39
AC_PROG_INSTALL
40 40
AC_DISABLE_SHARED
41 41
AC_PROG_LIBTOOL
42 42

	
43 43
AC_CHECK_PROG([doxygen_found],[doxygen],[yes],[no])
44
AC_CHECK_PROG([python_found],[python],[yes],[no])
44 45
AC_CHECK_PROG([gs_found],[gs],[yes],[no])
45 46

	
46 47
dnl Detect Intel compiler.
47 48
AC_MSG_CHECKING([whether we are using the Intel C++ compiler])
48 49
AC_COMPILE_IFELSE([#ifndef __INTEL_COMPILER
49 50
choke me
... ...
@@ -79,12 +80,27 @@
79 80
  AC_MSG_RESULT([yes])
80 81
else
81 82
  AC_MSG_RESULT([no])
82 83
fi
83 84
AM_CONDITIONAL([WANT_TOOLS], [test x"$enable_tools" != x"no"])
84 85

	
86
dnl Support for running test cases using valgrind.
87
use_valgrind=no
88
AC_ARG_ENABLE([valgrind],
89
AS_HELP_STRING([--enable-valgrind], [use valgrind when running tests]),
90
              [use_valgrind=yes])
91

	
92
if [[ "$use_valgrind" = "yes" ]]; then
93
  AC_CHECK_PROG(HAVE_VALGRIND, valgrind, yes, no)
94

	
95
  if [[ "$HAVE_VALGRIND" = "no" ]]; then
96
    AC_MSG_ERROR([Valgrind not found in PATH.])
97
  fi
98
fi
99
AM_CONDITIONAL(USE_VALGRIND, [test "$use_valgrind" = "yes"])
100

	
85 101
dnl Checks for header files.
86 102
AC_CHECK_HEADERS(limits.h sys/time.h sys/times.h unistd.h)
87 103

	
88 104
dnl Checks for typedefs, structures, and compiler characteristics.
89 105
AC_C_CONST
90 106
AC_C_INLINE
... ...
@@ -125,12 +141,13 @@
125 141
echo CPLEX support................. : $lx_cplex_found
126 142
echo SOPLEX support................ : $lx_soplex_found
127 143
echo CLP support................... : $lx_clp_found
128 144
echo CBC support................... : $lx_cbc_found
129 145
echo
130 146
echo Build additional tools........ : $enable_tools
147
echo Use valgrind for tests........ : $use_valgrind
131 148
echo
132 149
echo The packace will be installed in
133 150
echo -n '  '
134 151
echo $prefix.
135 152
echo
136 153
echo '*********************************************************************'
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -62,15 +62,24 @@
62 62
  // Set the options of the group exclusive (only one option can be given)
63 63
  ap.onlyOneGroup("gr");
64 64
  // Add non-parsed arguments (e.g. input files)
65 65
  ap.other("infile", "The input file.")
66 66
    .other("...");
67 67

	
68
  // Throw an exception when problems occurs. The default behavior is to
69
  // exit(1) on these cases, but this makes Valgrind falsely warn
70
  // about memory leaks.
71
  ap.throwOnProblems();
72

	
68 73
  // Perform the parsing process
69 74
  // (in case of any error it terminates the program)
70
  ap.parse();
75
  // The try {} construct is necessary only if the ap.trowOnProblems()
76
  // setting is in use.
77
  try {
78
    ap.parse();
79
  } catch (ArgParserException &) { return 1; }
71 80

	
72 81
  // Check each option if it has been given and print its value
73 82
  std::cout << "Parameters of '" << ap.commandName() << "':\n";
74 83

	
75 84
  std::cout << "  Value of -n: " << i << std::endl;
76 85
  if(ap.given("val")) std::cout << "  Value of -val: " << d << std::endl;
Ignore white space 6 line context
... ...
@@ -14,31 +14,34 @@
14 14
CONFIGURE_FILE(
15 15
  ${PROJECT_SOURCE_DIR}/doc/mainpage.dox.in
16 16
  ${PROJECT_BINARY_DIR}/doc/mainpage.dox
17 17
  @ONLY
18 18
)
19 19

	
20
IF(DOXYGEN_EXECUTABLE AND GHOSTSCRIPT_EXECUTABLE)
20
IF(DOXYGEN_EXECUTABLE AND PYTHONINTERP_FOUND AND GHOSTSCRIPT_EXECUTABLE)
21 21
  FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/)
22 22
  SET(GHOSTSCRIPT_OPTIONS -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha)
23 23
  ADD_CUSTOM_TARGET(html
24 24
    COMMAND ${CMAKE_COMMAND} -E remove_directory gen-images
25 25
    COMMAND ${CMAKE_COMMAND} -E make_directory gen-images
26 26
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/bipartite_matching.png ${CMAKE_CURRENT_SOURCE_DIR}/images/bipartite_matching.eps
27 27
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/bipartite_partitions.png ${CMAKE_CURRENT_SOURCE_DIR}/images/bipartite_partitions.eps
28 28
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/connected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/connected_components.eps
29 29
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/edge_biconnected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/edge_biconnected_components.eps
30 30
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/grid_graph.png ${CMAKE_CURRENT_SOURCE_DIR}/images/grid_graph.eps
31
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/matching.png ${CMAKE_CURRENT_SOURCE_DIR}/images/matching.eps
31 32
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/node_biconnected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/node_biconnected_components.eps
32 33
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_0.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_0.eps
33 34
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_1.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_1.eps
34 35
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_2.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_2.eps
35 36
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_3.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_3.eps
36 37
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_4.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_4.eps
38
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/planar.png ${CMAKE_CURRENT_SOURCE_DIR}/images/planar.eps
37 39
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/strongly_connected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/strongly_connected_components.eps
38 40
    COMMAND ${CMAKE_COMMAND} -E remove_directory html
41
    COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/scripts/bib2dox.py ${CMAKE_CURRENT_SOURCE_DIR}/references.bib >references.dox
39 42
    COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile
40 43
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
41 44
  )
42 45

	
43 46
  SET_TARGET_PROPERTIES(html PROPERTIES PROJECT_LABEL BUILD_DOC)
44 47

	
Ignore white space 6 line context
... ...
@@ -94,13 +94,14 @@
94 94
                         "@abs_top_srcdir@/lemon" \
95 95
                         "@abs_top_srcdir@/lemon/bits" \
96 96
                         "@abs_top_srcdir@/lemon/concepts" \
97 97
                         "@abs_top_srcdir@/demo" \
98 98
                         "@abs_top_srcdir@/tools" \
99 99
                         "@abs_top_srcdir@/test/test_tools.h" \
100
                         "@abs_top_builddir@/doc/mainpage.dox"
100
                         "@abs_top_builddir@/doc/mainpage.dox" \
101
                         "@abs_top_builddir@/doc/references.dox"
101 102
INPUT_ENCODING         = UTF-8
102 103
FILE_PATTERNS          = *.h \
103 104
                         *.cc \
104 105
                         *.dox
105 106
RECURSIVE              = NO
106 107
EXCLUDE                = 
Ignore white space 6 line context
... ...
@@ -24,13 +24,15 @@
24 24

	
25 25
DOC_EPS_IMAGES27 = \
26 26
	bipartite_matching.eps \
27 27
	bipartite_partitions.eps \
28 28
	connected_components.eps \
29 29
	edge_biconnected_components.eps \
30
	matching.eps \
30 31
	node_biconnected_components.eps \
32
	planar.eps \
31 33
	strongly_connected_components.eps
32 34

	
33 35
DOC_EPS_IMAGES = \
34 36
	$(DOC_EPS_IMAGES18) \
35 37
	$(DOC_EPS_IMAGES27)
36 38

	
... ...
@@ -63,13 +65,25 @@
63 65
	  echo; \
64 66
	  echo "Ghostscript not found."; \
65 67
	  echo; \
66 68
	  exit 1; \
67 69
	fi
68 70

	
69
html-local: $(DOC_PNG_IMAGES)
71
references.dox: doc/references.bib
72
	if test ${python_found} = yes; then \
73
	  cd doc; \
74
	  python @abs_top_srcdir@/scripts/bib2dox.py @abs_top_builddir@/$< >$@; \
75
	  cd ..; \
76
	else \
77
	  echo; \
78
	  echo "Python not found."; \
79
	  echo; \
80
	  exit 1; \
81
	fi
82

	
83
html-local: $(DOC_PNG_IMAGES) references.dox
70 84
	if test ${doxygen_found} = yes; then \
71 85
	  cd doc; \
72 86
	  doxygen Doxyfile; \
73 87
	  cd ..; \
74 88
	else \
75 89
	  echo; \
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -223,45 +223,88 @@
223 223
the two maps which can be done implicitly with the \c DivMap template
224 224
class. We use the implicit minimum time map as the length map of the
225 225
\c Dijkstra algorithm.
226 226
*/
227 227

	
228 228
/**
229
@defgroup matrices Matrices
230
@ingroup datas
231
\brief Two dimensional data storages implemented in LEMON.
232

	
233
This group contains two dimensional data storages implemented in LEMON.
234
*/
235

	
236
/**
237 229
@defgroup paths Path Structures
238 230
@ingroup datas
239 231
\brief %Path structures implemented in LEMON.
240 232

	
241 233
This group contains the path structures implemented in LEMON.
242 234

	
243 235
LEMON provides flexible data structures to work with paths.
244 236
All of them have similar interfaces and they can be copied easily with
245 237
assignment operators and copy constructors. This makes it easy and
246 238
efficient to have e.g. the Dijkstra algorithm to store its result in
247 239
any kind of path structure.
248 240

	
249
\sa lemon::concepts::Path
241
\sa \ref concepts::Path "Path concept"
242
*/
243

	
244
/**
245
@defgroup heaps Heap Structures
246
@ingroup datas
247
\brief %Heap structures implemented in LEMON.
248

	
249
This group contains the heap structures implemented in LEMON.
250

	
251
LEMON provides several heap classes. They are efficient implementations
252
of the abstract data type \e priority \e queue. They store items with
253
specified values called \e priorities in such a way that finding and
254
removing the item with minimum priority are efficient.
255
The basic operations are adding and erasing items, changing the priority
256
of an item, etc.
257

	
258
Heaps are crucial in several algorithms, such as Dijkstra and Prim.
259
The heap implementations have the same interface, thus any of them can be
260
used easily in such algorithms.
261

	
262
\sa \ref concepts::Heap "Heap concept"
263
*/
264

	
265
/**
266
@defgroup matrices Matrices
267
@ingroup datas
268
\brief Two dimensional data storages implemented in LEMON.
269

	
270
This group contains two dimensional data storages implemented in LEMON.
250 271
*/
251 272

	
252 273
/**
253 274
@defgroup auxdat Auxiliary Data Structures
254 275
@ingroup datas
255 276
\brief Auxiliary data structures implemented in LEMON.
256 277

	
257 278
This group contains some data structures implemented in LEMON in
258 279
order to make it easier to implement combinatorial algorithms.
259 280
*/
260 281

	
261 282
/**
283
@defgroup geomdat Geometric Data Structures
284
@ingroup auxdat
285
\brief Geometric data structures implemented in LEMON.
286

	
287
This group contains geometric data structures implemented in LEMON.
288

	
289
 - \ref lemon::dim2::Point "dim2::Point" implements a two dimensional
290
   vector with the usual operations.
291
 - \ref lemon::dim2::Box "dim2::Box" can be used to determine the
292
   rectangular bounding box of a set of \ref lemon::dim2::Point
293
   "dim2::Point"'s.
294
*/
295

	
296
/**
297
@defgroup matrices Matrices
298
@ingroup auxdat
299
\brief Two dimensional data storages implemented in LEMON.
300

	
301
This group contains two dimensional data storages implemented in LEMON.
302
*/
303

	
304
/**
262 305
@defgroup algs Algorithms
263 306
\brief This group contains the several algorithms
264 307
implemented in LEMON.
265 308

	
266 309
This group contains the several algorithms
267 310
implemented in LEMON.
... ...
@@ -270,21 +313,23 @@
270 313
/**
271 314
@defgroup search Graph Search
272 315
@ingroup algs
273 316
\brief Common graph search algorithms.
274 317

	
275 318
This group contains the common graph search algorithms, namely
276
\e breadth-first \e search (BFS) and \e depth-first \e search (DFS).
319
\e breadth-first \e search (BFS) and \e depth-first \e search (DFS)
320
\ref clrs01algorithms.
277 321
*/
278 322

	
279 323
/**
280 324
@defgroup shortest_path Shortest Path Algorithms
281 325
@ingroup algs
282 326
\brief Algorithms for finding shortest paths.
283 327

	
284
This group contains the algorithms for finding shortest paths in digraphs.
328
This group contains the algorithms for finding shortest paths in digraphs
329
\ref clrs01algorithms.
285 330

	
286 331
 - \ref Dijkstra algorithm for finding shortest paths from a source node
287 332
   when all arc lengths are non-negative.
288 333
 - \ref BellmanFord "Bellman-Ford" algorithm for finding shortest paths
289 334
   from a source node when arc lenghts can be either positive or negative,
290 335
   but the digraph should not contain directed cycles with negative total
... ...
@@ -295,18 +340,27 @@
295 340
   not contain directed cycles with negative total length.
296 341
 - \ref Suurballe A successive shortest path algorithm for finding
297 342
   arc-disjoint paths between two nodes having minimum total length.
298 343
*/
299 344

	
300 345
/**
346
@defgroup spantree Minimum Spanning Tree Algorithms
347
@ingroup algs
348
\brief Algorithms for finding minimum cost spanning trees and arborescences.
349

	
350
This group contains the algorithms for finding minimum cost spanning
351
trees and arborescences \ref clrs01algorithms.
352
*/
353

	
354
/**
301 355
@defgroup max_flow Maximum Flow Algorithms
302 356
@ingroup algs
303 357
\brief Algorithms for finding maximum flows.
304 358

	
305 359
This group contains the algorithms for finding maximum flows and
306
feasible circulations.
360
feasible circulations \ref clrs01algorithms, \ref amo93networkflows.
307 361

	
308 362
The \e maximum \e flow \e problem is to find a flow of maximum value between
309 363
a single source and a single target. Formally, there is a \f$G=(V,A)\f$
310 364
digraph, a \f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function and
311 365
\f$s, t \in V\f$ source and target nodes.
312 366
A maximum flow is an \f$f: A\rightarrow\mathbf{R}^+_0\f$ solution of the
... ...
@@ -315,47 +369,53 @@
315 369
\f[ \max\sum_{sv\in A} f(sv) - \sum_{vs\in A} f(vs) \f]
316 370
\f[ \sum_{uv\in A} f(uv) = \sum_{vu\in A} f(vu)
317 371
    \quad \forall u\in V\setminus\{s,t\} \f]
318 372
\f[ 0 \leq f(uv) \leq cap(uv) \quad \forall uv\in A \f]
319 373

	
320 374
LEMON contains several algorithms for solving maximum flow problems:
321
- \ref EdmondsKarp Edmonds-Karp algorithm.
322
- \ref Preflow Goldberg-Tarjan's preflow push-relabel algorithm.
323
- \ref DinitzSleatorTarjan Dinitz's blocking flow algorithm with dynamic trees.
324
- \ref GoldbergTarjan Preflow push-relabel algorithm with dynamic trees.
375
- \ref EdmondsKarp Edmonds-Karp algorithm
376
  \ref edmondskarp72theoretical.
377
- \ref Preflow Goldberg-Tarjan's preflow push-relabel algorithm
378
  \ref goldberg88newapproach.
379
- \ref DinitzSleatorTarjan Dinitz's blocking flow algorithm with dynamic trees
380
  \ref dinic70algorithm, \ref sleator83dynamic.
381
- \ref GoldbergTarjan !Preflow push-relabel algorithm with dynamic trees
382
  \ref goldberg88newapproach, \ref sleator83dynamic.
325 383

	
326
In most cases the \ref Preflow "Preflow" algorithm provides the
384
In most cases the \ref Preflow algorithm provides the
327 385
fastest method for computing a maximum flow. All implementations
328 386
also provide functions to query the minimum cut, which is the dual
329 387
problem of maximum flow.
330 388

	
331
\ref Circulation is a preflow push-relabel algorithm implemented directly 
389
\ref Circulation is a preflow push-relabel algorithm implemented directly
332 390
for finding feasible circulations, which is a somewhat different problem,
333 391
but it is strongly related to maximum flow.
334 392
For more information, see \ref Circulation.
335 393
*/
336 394

	
337 395
/**
338 396
@defgroup min_cost_flow_algs Minimum Cost Flow Algorithms
339 397
@ingroup algs
340 398

	
341 399
\brief Algorithms for finding minimum cost flows and circulations.
342 400

	
343 401
This group contains the algorithms for finding minimum cost flows and
344
circulations. For more information about this problem and its dual
345
solution see \ref min_cost_flow "Minimum Cost Flow Problem".
402
circulations \ref amo93networkflows. For more information about this
403
problem and its dual solution, see \ref min_cost_flow
404
"Minimum Cost Flow Problem".
346 405

	
347 406
LEMON contains several algorithms for this problem.
348 407
 - \ref NetworkSimplex Primal Network Simplex algorithm with various
349
   pivot strategies.
350
 - \ref CostScaling Push-Relabel and Augment-Relabel algorithms based on
351
   cost scaling.
352
 - \ref CapacityScaling Successive Shortest %Path algorithm with optional
353
   capacity scaling.
354
 - \ref CancelAndTighten The Cancel and Tighten algorithm.
355
 - \ref CycleCanceling Cycle-Canceling algorithms.
408
   pivot strategies \ref dantzig63linearprog, \ref kellyoneill91netsimplex.
409
 - \ref CostScaling Cost Scaling algorithm based on push/augment and
410
   relabel operations \ref goldberg90approximation, \ref goldberg97efficient,
411
   \ref bunnagel98efficient.
412
 - \ref CapacityScaling Capacity Scaling algorithm based on the successive
413
   shortest path method \ref edmondskarp72theoretical.
414
 - \ref CycleCanceling Cycle-Canceling algorithms, two of which are
415
   strongly polynomial \ref klein67primal, \ref goldberg89cyclecanceling.
356 416

	
357 417
In general NetworkSimplex is the most efficient implementation,
358 418
but in special cases other algorithms could be faster.
359 419
For example, if the total supply and/or capacities are rather small,
360 420
CapacityScaling is usually the fastest algorithm (without effective scaling).
361 421
*/
... ...
@@ -372,13 +432,13 @@
372 432
\f$X\f$ subset of the nodes with minimum overall capacity on
373 433
outgoing arcs. Formally, there is a \f$G=(V,A)\f$ digraph, a
374 434
\f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function. The minimum
375 435
cut is the \f$X\f$ solution of the next optimization problem:
376 436

	
377 437
\f[ \min_{X \subset V, X\not\in \{\emptyset, V\}}
378
    \sum_{uv\in A, u\in X, v\not\in X}cap(uv) \f]
438
    \sum_{uv\in A: u\in X, v\not\in X}cap(uv) \f]
379 439

	
380 440
LEMON contains several algorithms related to minimum cut problems:
381 441

	
382 442
- \ref HaoOrlin "Hao-Orlin algorithm" for calculating minimum cut
383 443
  in directed graphs.
384 444
- \ref NagamochiIbaraki "Nagamochi-Ibaraki algorithm" for
... ...
@@ -388,33 +448,46 @@
388 448

	
389 449
If you want to find minimum cut just between two distinict nodes,
390 450
see the \ref max_flow "maximum flow problem".
391 451
*/
392 452

	
393 453
/**
394
@defgroup graph_properties Connectivity and Other Graph Properties
454
@defgroup min_mean_cycle Minimum Mean Cycle Algorithms
395 455
@ingroup algs
396
\brief Algorithms for discovering the graph properties
456
\brief Algorithms for finding minimum mean cycles.
397 457

	
398
This group contains the algorithms for discovering the graph properties
399
like connectivity, bipartiteness, euler property, simplicity etc.
458
This group contains the algorithms for finding minimum mean cycles
459
\ref clrs01algorithms, \ref amo93networkflows.
400 460

	
401
\image html edge_biconnected_components.png
402
\image latex edge_biconnected_components.eps "bi-edge-connected components" width=\textwidth
403
*/
461
The \e minimum \e mean \e cycle \e problem is to find a directed cycle
462
of minimum mean length (cost) in a digraph.
463
The mean length of a cycle is the average length of its arcs, i.e. the
464
ratio between the total length of the cycle and the number of arcs on it.
404 465

	
405
/**
406
@defgroup planar Planarity Embedding and Drawing
407
@ingroup algs
408
\brief Algorithms for planarity checking, embedding and drawing
466
This problem has an important connection to \e conservative \e length
467
\e functions, too. A length function on the arcs of a digraph is called
468
conservative if and only if there is no directed cycle of negative total
469
length. For an arbitrary length function, the negative of the minimum
470
cycle mean is the smallest \f$\epsilon\f$ value so that increasing the
471
arc lengths uniformly by \f$\epsilon\f$ results in a conservative length
472
function.
409 473

	
410
This group contains the algorithms for planarity checking,
411
embedding and drawing.
474
LEMON contains three algorithms for solving the minimum mean cycle problem:
475
- \ref Karp "Karp"'s original algorithm \ref amo93networkflows,
476
  \ref dasdan98minmeancycle.
477
- \ref HartmannOrlin "Hartmann-Orlin"'s algorithm, which is an improved
478
  version of Karp's algorithm \ref dasdan98minmeancycle.
479
- \ref Howard "Howard"'s policy iteration algorithm
480
  \ref dasdan98minmeancycle.
412 481

	
413
\image html planar.png
414
\image latex planar.eps "Plane graph" width=\textwidth
482
In practice, the Howard algorithm proved to be by far the most efficient
483
one, though the best known theoretical bound on its running time is
484
exponential.
485
Both Karp and HartmannOrlin algorithms run in time O(ne) and use space
486
O(n<sup>2</sup>+e), but the latter one is typically faster due to the
487
applied early termination scheme.
415 488
*/
416 489

	
417 490
/**
418 491
@defgroup matching Matching Algorithms
419 492
@ingroup algs
420 493
\brief Algorithms for finding matchings in graphs and bipartite graphs.
... ...
@@ -446,61 +519,86 @@
446 519
  maximum cardinality matching in general graphs.
447 520
- \ref MaxWeightedMatching Edmond's blossom shrinking algorithm for calculating
448 521
  maximum weighted matching in general graphs.
449 522
- \ref MaxWeightedPerfectMatching
450 523
  Edmond's blossom shrinking algorithm for calculating maximum weighted
451 524
  perfect matching in general graphs.
525
- \ref MaxFractionalMatching Push-relabel algorithm for calculating
526
  maximum cardinality fractional matching in general graphs.
527
- \ref MaxWeightedFractionalMatching Augmenting path algorithm for calculating
528
  maximum weighted fractional matching in general graphs.
529
- \ref MaxWeightedPerfectFractionalMatching
530
  Augmenting path algorithm for calculating maximum weighted
531
  perfect fractional matching in general graphs.
452 532

	
453
\image html bipartite_matching.png
454
\image latex bipartite_matching.eps "Bipartite Matching" width=\textwidth
533
\image html matching.png
534
\image latex matching.eps "Min Cost Perfect Matching" width=\textwidth
455 535
*/
456 536

	
457 537
/**
458
@defgroup spantree Minimum Spanning Tree Algorithms
538
@defgroup graph_properties Connectivity and Other Graph Properties
459 539
@ingroup algs
460
\brief Algorithms for finding minimum cost spanning trees and arborescences.
540
\brief Algorithms for discovering the graph properties
461 541

	
462
This group contains the algorithms for finding minimum cost spanning
463
trees and arborescences.
542
This group contains the algorithms for discovering the graph properties
543
like connectivity, bipartiteness, euler property, simplicity etc.
544

	
545
\image html connected_components.png
546
\image latex connected_components.eps "Connected components" width=\textwidth
547
*/
548

	
549
/**
550
@defgroup planar Planarity Embedding and Drawing
551
@ingroup algs
552
\brief Algorithms for planarity checking, embedding and drawing
553

	
554
This group contains the algorithms for planarity checking,
555
embedding and drawing.
556

	
557
\image html planar.png
558
\image latex planar.eps "Plane graph" width=\textwidth
559
*/
560

	
561
/**
562
@defgroup approx Approximation Algorithms
563
@ingroup algs
564
\brief Approximation algorithms.
565

	
566
This group contains the approximation and heuristic algorithms
567
implemented in LEMON.
464 568
*/
465 569

	
466 570
/**
467 571
@defgroup auxalg Auxiliary Algorithms
468 572
@ingroup algs
469 573
\brief Auxiliary algorithms implemented in LEMON.
470 574

	
471 575
This group contains some algorithms implemented in LEMON
472 576
in order to make it easier to implement complex algorithms.
473 577
*/
474 578

	
475 579
/**
476
@defgroup approx Approximation Algorithms
477
@ingroup algs
478
\brief Approximation algorithms.
479

	
480
This group contains the approximation and heuristic algorithms
481
implemented in LEMON.
482
*/
483

	
484
/**
485 580
@defgroup gen_opt_group General Optimization Tools
486 581
\brief This group contains some general optimization frameworks
487 582
implemented in LEMON.
488 583

	
489 584
This group contains some general optimization frameworks
490 585
implemented in LEMON.
491 586
*/
492 587

	
493 588
/**
494
@defgroup lp_group Lp and Mip Solvers
589
@defgroup lp_group LP and MIP Solvers
495 590
@ingroup gen_opt_group
496
\brief Lp and Mip solver interfaces for LEMON.
591
\brief LP and MIP solver interfaces for LEMON.
497 592

	
498
This group contains Lp and Mip solver interfaces for LEMON. The
499
various LP solvers could be used in the same manner with this
500
interface.
593
This group contains LP and MIP solver interfaces for LEMON.
594
Various LP solvers could be used in the same manner with this
595
high-level interface.
596

	
597
The currently supported solvers are \ref glpk, \ref clp, \ref cbc,
598
\ref cplex, \ref soplex.
501 599
*/
502 600

	
503 601
/**
504 602
@defgroup lp_utils Tools for Lp and Mip Solvers
505 603
@ingroup lp_group
506 604
\brief Helper tools to the Lp and Mip solvers.
... ...
@@ -584,13 +682,13 @@
584 682

	
585 683
This group contains general \c EPS drawing methods and special
586 684
graph exporting tools.
587 685
*/
588 686

	
589 687
/**
590
@defgroup dimacs_group DIMACS format
688
@defgroup dimacs_group DIMACS Format
591 689
@ingroup io_group
592 690
\brief Read and write files in DIMACS format
593 691

	
594 692
Tools to read a digraph from or write it to a file in DIMACS format data.
595 693
*/
596 694

	
... ...
@@ -633,40 +731,40 @@
633 731

	
634 732
/**
635 733
@defgroup graph_concepts Graph Structure Concepts
636 734
@ingroup concept
637 735
\brief Skeleton and concept checking classes for graph structures
638 736

	
639
This group contains the skeletons and concept checking classes of LEMON's
640
graph structures and helper classes used to implement these.
737
This group contains the skeletons and concept checking classes of
738
graph structures.
641 739
*/
642 740

	
643 741
/**
644 742
@defgroup map_concepts Map Concepts
645 743
@ingroup concept
646 744
\brief Skeleton and concept checking classes for maps
647 745

	
648 746
This group contains the skeletons and concept checking classes of maps.
649 747
*/
650 748

	
651 749
/**
750
@defgroup tools Standalone Utility Applications
751

	
752
Some utility applications are listed here.
753

	
754
The standard compilation procedure (<tt>./configure;make</tt>) will compile
755
them, as well.
756
*/
757

	
758
/**
652 759
\anchor demoprograms
653 760

	
654 761
@defgroup demos Demo Programs
655 762

	
656 763
Some demo programs are listed here. Their full source codes can be found in
657 764
the \c demo subdirectory of the source tree.
658 765

	
659 766
In order to compile them, use the <tt>make demo</tt> or the
660 767
<tt>make check</tt> commands.
661 768
*/
662 769

	
663
/**
664
@defgroup tools Standalone Utility Applications
665

	
666
Some utility applications are listed here.
667

	
668
The standard compilation procedure (<tt>./configure;make</tt>) will compile
669
them, as well.
670
*/
671

	
672 770
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -18,34 +18,44 @@
18 18

	
19 19
/**
20 20
\mainpage @PACKAGE_NAME@ @PACKAGE_VERSION@ Documentation
21 21

	
22 22
\section intro Introduction
23 23

	
24
\subsection whatis What is LEMON
25

	
26
LEMON stands for <b>L</b>ibrary for <b>E</b>fficient <b>M</b>odeling
27
and <b>O</b>ptimization in <b>N</b>etworks.
28
It is a C++ template
29
library aimed at combinatorial optimization tasks which
30
often involve in working
31
with graphs.
24
<b>LEMON</b> stands for <i><b>L</b>ibrary for <b>E</b>fficient <b>M</b>odeling
25
and <b>O</b>ptimization in <b>N</b>etworks</i>.
26
It is a C++ template library providing efficient implementations of common
27
data structures and algorithms with focus on combinatorial optimization
28
tasks connected mainly with graphs and networks.
32 29

	
33 30
<b>
34 31
LEMON is an <a class="el" href="http://opensource.org/">open&nbsp;source</a>
35 32
project.
36 33
You are free to use it in your commercial or
37 34
non-commercial applications under very permissive
38 35
\ref license "license terms".
39 36
</b>
40 37

	
41
\subsection howtoread How to read the documentation
38
The project is maintained by the
39
<a href="http://www.cs.elte.hu/egres/">Egerv&aacute;ry Research Group on
40
Combinatorial Optimization</a> \ref egres
41
at the Operations Research Department of the
42
<a href="http://www.elte.hu/en/">E&ouml;tv&ouml;s Lor&aacute;nd University</a>,
43
Budapest, Hungary.
44
LEMON is also a member of the <a href="http://www.coin-or.org/">COIN-OR</a>
45
initiative \ref coinor.
46

	
47
\section howtoread How to Read the Documentation
42 48

	
43 49
If you would like to get to know the library, see
44 50
<a class="el" href="http://lemon.cs.elte.hu/pub/tutorial/">LEMON Tutorial</a>.
45 51

	
52
If you are interested in starting to use the library, see the <a class="el"
53
href="http://lemon.cs.elte.hu/trac/lemon/wiki/InstallGuide/">Installation
54
Guide</a>.
55

	
46 56
If you know what you are looking for, then try to find it under the
47 57
<a class="el" href="modules.html">Modules</a> section.
48 58

	
49 59
If you are a user of the old (0.x) series of LEMON, please check out the
50 60
\ref migration "Migration Guide" for the backward incompatibilities.
51 61
*/
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -23,13 +23,13 @@
23 23

	
24 24
\section mcf_def Definition (GEQ form)
25 25

	
26 26
The \e minimum \e cost \e flow \e problem is to find a feasible flow of
27 27
minimum total cost from a set of supply nodes to a set of demand nodes
28 28
in a network with capacity constraints (lower and upper bounds)
29
and arc costs.
29
and arc costs \ref amo93networkflows.
30 30

	
31 31
Formally, let \f$G=(V,A)\f$ be a digraph, \f$lower: A\rightarrow\mathbf{R}\f$,
32 32
\f$upper: A\rightarrow\mathbf{R}\cup\{+\infty\}\f$ denote the lower and
33 33
upper bounds for the flow values on the arcs, for which
34 34
\f$lower(uv) \leq upper(uv)\f$ must hold for all \f$uv\in A\f$,
35 35
\f$cost: A\rightarrow\mathbf{R}\f$ denotes the cost per unit flow
... ...
@@ -75,16 +75,16 @@
75 75

	
76 76
 - For all \f$uv\in A\f$ arcs:
77 77
   - if \f$cost^\pi(uv)>0\f$, then \f$f(uv)=lower(uv)\f$;
78 78
   - if \f$lower(uv)<f(uv)<upper(uv)\f$, then \f$cost^\pi(uv)=0\f$;
79 79
   - if \f$cost^\pi(uv)<0\f$, then \f$f(uv)=upper(uv)\f$.
80 80
 - For all \f$u\in V\f$ nodes:
81
   - \f$\pi(u)<=0\f$;
81
   - \f$\pi(u)\leq 0\f$;
82 82
   - if \f$\sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \neq sup(u)\f$,
83 83
     then \f$\pi(u)=0\f$.
84
 
84

	
85 85
Here \f$cost^\pi(uv)\f$ denotes the \e reduced \e cost of the arc
86 86
\f$uv\in A\f$ with respect to the potential function \f$\pi\f$, i.e.
87 87
\f[ cost^\pi(uv) = cost(uv) + \pi(u) - \pi(v).\f]
88 88

	
89 89
All algorithms provide dual solution (node potentials), as well,
90 90
if an optimal flow is found.
... ...
@@ -116,13 +116,13 @@
116 116

	
117 117
\f[ \min\sum_{uv\in A} f(uv) \cdot cost(uv) \f]
118 118
\f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \leq
119 119
    sup(u) \quad \forall u\in V \f]
120 120
\f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A \f]
121 121

	
122
It means that the total demand must be less or equal to the 
122
It means that the total demand must be less or equal to the
123 123
total supply (i.e. \f$\sum_{u\in V} sup(u)\f$ must be zero or
124 124
positive) and all the demands have to be satisfied, but there
125 125
could be supplies that are not carried out from the supply
126 126
nodes.
127 127
The equality form is also a special case of this form, of course.
128 128

	
... ...
@@ -142,12 +142,12 @@
142 142

	
143 143
 - For all \f$uv\in A\f$ arcs:
144 144
   - if \f$cost^\pi(uv)>0\f$, then \f$f(uv)=lower(uv)\f$;
145 145
   - if \f$lower(uv)<f(uv)<upper(uv)\f$, then \f$cost^\pi(uv)=0\f$;
146 146
   - if \f$cost^\pi(uv)<0\f$, then \f$f(uv)=upper(uv)\f$.
147 147
 - For all \f$u\in V\f$ nodes:
148
   - \f$\pi(u)>=0\f$;
148
   - \f$\pi(u)\geq 0\f$;
149 149
   - if \f$\sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \neq sup(u)\f$,
150 150
     then \f$\pi(u)=0\f$.
151 151

	
152 152
*/
153 153
}
Ignore white space 6 line context
... ...
@@ -55,39 +55,49 @@
55 55
endif
56 56

	
57 57
lemon_HEADERS += \
58 58
	lemon/adaptors.h \
59 59
	lemon/arg_parser.h \
60 60
	lemon/assert.h \
61
	lemon/bellman_ford.h \
61 62
	lemon/bfs.h \
62 63
	lemon/bin_heap.h \
64
	lemon/binomial_heap.h \
63 65
	lemon/bucket_heap.h \
66
	lemon/capacity_scaling.h \
64 67
	lemon/cbc.h \
65 68
	lemon/circulation.h \
66 69
	lemon/clp.h \
67 70
	lemon/color.h \
68 71
	lemon/concept_check.h \
69 72
	lemon/connectivity.h \
73
	lemon/core.h \
74
	lemon/cost_scaling.h \
70 75
	lemon/counter.h \
71
	lemon/core.h \
72 76
	lemon/cplex.h \
77
	lemon/cycle_canceling.h \
73 78
	lemon/dfs.h \
79
	lemon/dheap.h \
74 80
	lemon/dijkstra.h \
75 81
	lemon/dim2.h \
76 82
	lemon/dimacs.h \
77 83
	lemon/edge_set.h \
78 84
	lemon/elevator.h \
79 85
	lemon/error.h \
80 86
	lemon/euler.h \
81 87
	lemon/fib_heap.h \
88
	lemon/fractional_matching.h \
82 89
	lemon/full_graph.h \
83 90
	lemon/glpk.h \
84 91
	lemon/gomory_hu.h \
85 92
	lemon/graph_to_eps.h \
86 93
	lemon/grid_graph.h \
94
	lemon/hartmann_orlin_mmc.h \
95
	lemon/howard_mmc.h \
87 96
	lemon/hypercube_graph.h \
97
	lemon/karp_mmc.h \
88 98
	lemon/kruskal.h \
89 99
	lemon/hao_orlin.h \
90 100
	lemon/lgf_reader.h \
91 101
	lemon/lgf_writer.h \
92 102
	lemon/list_graph.h \
93 103
	lemon/lp.h \
... ...
@@ -96,19 +106,23 @@
96 106
	lemon/maps.h \
97 107
	lemon/matching.h \
98 108
	lemon/math.h \
99 109
	lemon/min_cost_arborescence.h \
100 110
	lemon/nauty_reader.h \
101 111
	lemon/network_simplex.h \
112
	lemon/pairing_heap.h \
102 113
	lemon/path.h \
114
	lemon/planarity.h \
103 115
	lemon/preflow.h \
116
	lemon/quad_heap.h \
104 117
	lemon/radix_heap.h \
105 118
	lemon/radix_sort.h \
106 119
	lemon/random.h \
107 120
	lemon/smart_graph.h \
108 121
	lemon/soplex.h \
122
	lemon/static_graph.h \
109 123
	lemon/suurballe.h \
110 124
	lemon/time_measure.h \
111 125
	lemon/tolerance.h \
112 126
	lemon/unionfind.h \
113 127
	lemon/bits/windows.h
114 128

	
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -357,12 +357,15 @@
357 357
  /// It conforms to the \ref concepts::Digraph "Digraph" concept.
358 358
  ///
359 359
  /// The adapted digraph can also be modified through this adaptor
360 360
  /// by adding or removing nodes or arcs, unless the \c GR template
361 361
  /// parameter is set to be \c const.
362 362
  ///
363
  /// This class provides item counting in the same time as the adapted
364
  /// digraph structure.
365
  ///
363 366
  /// \tparam DGR The type of the adapted digraph.
364 367
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
365 368
  /// It can also be specified to be \c const.
366 369
  ///
367 370
  /// \note The \c Node and \c Arc types of this adaptor and the adapted
368 371
  /// digraph are convertible to each other.
... ...
@@ -415,13 +418,13 @@
415 418
    SubDigraphBase()
416 419
      : Parent(), _node_filter(0), _arc_filter(0) { }
417 420

	
418 421
    void initialize(DGR& digraph, NF& node_filter, AF& arc_filter) {
419 422
      Parent::initialize(digraph);
420 423
      _node_filter = &node_filter;
421
      _arc_filter = &arc_filter;      
424
      _arc_filter = &arc_filter;
422 425
    }
423 426

	
424 427
  public:
425 428

	
426 429
    typedef typename Parent::Node Node;
427 430
    typedef typename Parent::Arc Arc;
... ...
@@ -502,17 +505,17 @@
502 505
      return arc;
503 506
    }
504 507

	
505 508
  public:
506 509

	
507 510
    template <typename V>
508
    class NodeMap 
509
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>, 
510
	      LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
511
    class NodeMap
512
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
513
              LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
511 514
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
512
	LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
515
        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
513 516

	
514 517
    public:
515 518
      typedef V Value;
516 519

	
517 520
      NodeMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor)
518 521
        : Parent(adaptor) {}
... ...
@@ -529,15 +532,15 @@
529 532
        Parent::operator=(cmap);
530 533
        return *this;
531 534
      }
532 535
    };
533 536

	
534 537
    template <typename V>
535
    class ArcMap 
538
    class ArcMap
536 539
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
537
	      LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
540
              LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
538 541
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
539 542
        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> Parent;
540 543

	
541 544
    public:
542 545
      typedef V Value;
543 546

	
... ...
@@ -576,13 +579,13 @@
576 579
    SubDigraphBase()
577 580
      : Parent(), _node_filter(0), _arc_filter(0) { }
578 581

	
579 582
    void initialize(DGR& digraph, NF& node_filter, AF& arc_filter) {
580 583
      Parent::initialize(digraph);
581 584
      _node_filter = &node_filter;
582
      _arc_filter = &arc_filter;      
585
      _arc_filter = &arc_filter;
583 586
    }
584 587

	
585 588
  public:
586 589

	
587 590
    typedef typename Parent::Node Node;
588 591
    typedef typename Parent::Arc Arc;
... ...
@@ -645,16 +648,16 @@
645 648
        arc = Parent::findArc(source, target, arc);
646 649
      }
647 650
      return arc;
648 651
    }
649 652

	
650 653
    template <typename V>
651
    class NodeMap 
654
    class NodeMap
652 655
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
653 656
          LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
654
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>, 
657
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
655 658
        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
656 659

	
657 660
    public:
658 661
      typedef V Value;
659 662

	
660 663
      NodeMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor)
... ...
@@ -672,13 +675,13 @@
672 675
        Parent::operator=(cmap);
673 676
        return *this;
674 677
      }
675 678
    };
676 679

	
677 680
    template <typename V>
678
    class ArcMap 
681
    class ArcMap
679 682
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
680 683
          LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
681 684
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
682 685
        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> Parent;
683 686

	
684 687
    public:
... ...
@@ -716,12 +719,14 @@
716 719
  /// This adaptor conforms to the \ref concepts::Digraph "Digraph" concept.
717 720
  ///
718 721
  /// The adapted digraph can also be modified through this adaptor
719 722
  /// by adding or removing nodes or arcs, unless the \c GR template
720 723
  /// parameter is set to be \c const.
721 724
  ///
725
  /// This class provides only linear time counting for nodes and arcs.
726
  ///
722 727
  /// \tparam DGR The type of the adapted digraph.
723 728
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
724 729
  /// It can also be specified to be \c const.
725 730
  /// \tparam NF The type of the node filter map.
726 731
  /// It must be a \c bool (or convertible) node map of the
727 732
  /// adapted digraph. The default type is
... ...
@@ -1013,16 +1018,16 @@
1013 1018
        edge = Parent::findEdge(u, v, edge);
1014 1019
      }
1015 1020
      return edge;
1016 1021
    }
1017 1022

	
1018 1023
    template <typename V>
1019
    class NodeMap 
1024
    class NodeMap
1020 1025
      : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1021 1026
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> {
1022
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 
1027
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1023 1028
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent;
1024 1029

	
1025 1030
    public:
1026 1031
      typedef V Value;
1027 1032

	
1028 1033
      NodeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
... ...
@@ -1040,16 +1045,16 @@
1040 1045
        Parent::operator=(cmap);
1041 1046
        return *this;
1042 1047
      }
1043 1048
    };
1044 1049

	
1045 1050
    template <typename V>
1046
    class ArcMap 
1051
    class ArcMap
1047 1052
      : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1048 1053
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> {
1049
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 
1054
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1050 1055
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent;
1051 1056

	
1052 1057
    public:
1053 1058
      typedef V Value;
1054 1059

	
1055 1060
      ArcMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
... ...
@@ -1067,16 +1072,16 @@
1067 1072
        Parent::operator=(cmap);
1068 1073
        return *this;
1069 1074
      }
1070 1075
    };
1071 1076

	
1072 1077
    template <typename V>
1073
    class EdgeMap 
1078
    class EdgeMap
1074 1079
      : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1075 1080
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> {
1076
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 
1081
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1077 1082
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
1078 1083

	
1079 1084
    public:
1080 1085
      typedef V Value;
1081 1086

	
1082 1087
      EdgeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
... ...
@@ -1109,14 +1114,14 @@
1109 1114
    typedef EF EdgeFilterMap;
1110 1115

	
1111 1116
    typedef SubGraphBase Adaptor;
1112 1117
  protected:
1113 1118
    NF* _node_filter;
1114 1119
    EF* _edge_filter;
1115
    SubGraphBase() 
1116
	  : Parent(), _node_filter(0), _edge_filter(0) { }
1120
    SubGraphBase()
1121
          : Parent(), _node_filter(0), _edge_filter(0) { }
1117 1122

	
1118 1123
    void initialize(GR& graph, NF& node_filter, EF& edge_filter) {
1119 1124
      Parent::initialize(graph);
1120 1125
      _node_filter = &node_filter;
1121 1126
      _edge_filter = &edge_filter;
1122 1127
    }
... ...
@@ -1211,16 +1216,16 @@
1211 1216
        edge = Parent::findEdge(u, v, edge);
1212 1217
      }
1213 1218
      return edge;
1214 1219
    }
1215 1220

	
1216 1221
    template <typename V>
1217
    class NodeMap 
1222
    class NodeMap
1218 1223
      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1219 1224
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> {
1220
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
1225
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1221 1226
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent;
1222 1227

	
1223 1228
    public:
1224 1229
      typedef V Value;
1225 1230

	
1226 1231
      NodeMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
... ...
@@ -1238,16 +1243,16 @@
1238 1243
        Parent::operator=(cmap);
1239 1244
        return *this;
1240 1245
      }
1241 1246
    };
1242 1247

	
1243 1248
    template <typename V>
1244
    class ArcMap 
1249
    class ArcMap
1245 1250
      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1246 1251
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> {
1247
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
1252
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1248 1253
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent;
1249 1254

	
1250 1255
    public:
1251 1256
      typedef V Value;
1252 1257

	
1253 1258
      ArcMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
... ...
@@ -1265,17 +1270,17 @@
1265 1270
        Parent::operator=(cmap);
1266 1271
        return *this;
1267 1272
      }
1268 1273
    };
1269 1274

	
1270 1275
    template <typename V>
1271
    class EdgeMap 
1276
    class EdgeMap
1272 1277
      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1273 1278
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> {
1274
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
1275
	LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
1279
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1280
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
1276 1281

	
1277 1282
    public:
1278 1283
      typedef V Value;
1279 1284

	
1280 1285
      EdgeMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
1281 1286
        : Parent(adaptor) {}
... ...
@@ -1311,12 +1316,14 @@
1311 1316
  /// This adaptor conforms to the \ref concepts::Graph "Graph" concept.
1312 1317
  ///
1313 1318
  /// The adapted graph can also be modified through this adaptor
1314 1319
  /// by adding or removing nodes or edges, unless the \c GR template
1315 1320
  /// parameter is set to be \c const.
1316 1321
  ///
1322
  /// This class provides only linear time counting for nodes, edges and arcs.
1323
  ///
1317 1324
  /// \tparam GR The type of the adapted graph.
1318 1325
  /// It must conform to the \ref concepts::Graph "Graph" concept.
1319 1326
  /// It can also be specified to be \c const.
1320 1327
  /// \tparam NF The type of the node filter map.
1321 1328
  /// It must be a \c bool (or convertible) node map of the
1322 1329
  /// adapted graph. The default type is
... ...
@@ -1468,12 +1475,14 @@
1468 1475
  /// depending on the \c GR template parameter.
1469 1476
  ///
1470 1477
  /// The adapted (di)graph can also be modified through this adaptor
1471 1478
  /// by adding or removing nodes or arcs/edges, unless the \c GR template
1472 1479
  /// parameter is set to be \c const.
1473 1480
  ///
1481
  /// This class provides only linear time item counting.
1482
  ///
1474 1483
  /// \tparam GR The type of the adapted digraph or graph.
1475 1484
  /// It must conform to the \ref concepts::Digraph "Digraph" concept
1476 1485
  /// or the \ref concepts::Graph "Graph" concept.
1477 1486
  /// It can also be specified to be \c const.
1478 1487
  /// \tparam NF The type of the node filter map.
1479 1488
  /// It must be a \c bool (or convertible) node map of the
... ...
@@ -1492,13 +1501,13 @@
1492 1501
  class FilterNodes :
1493 1502
    public DigraphAdaptorExtender<
1494 1503
      SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >,
1495 1504
                     true> > {
1496 1505
#endif
1497 1506
    typedef DigraphAdaptorExtender<
1498
      SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >, 
1507
      SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >,
1499 1508
                     true> > Parent;
1500 1509

	
1501 1510
  public:
1502 1511

	
1503 1512
    typedef GR Digraph;
1504 1513
    typedef NF NodeFilterMap;
... ...
@@ -1513,13 +1522,13 @@
1513 1522
  public:
1514 1523

	
1515 1524
    /// \brief Constructor
1516 1525
    ///
1517 1526
    /// Creates a subgraph for the given digraph or graph with the
1518 1527
    /// given node filter map.
1519
    FilterNodes(GR& graph, NF& node_filter) 
1528
    FilterNodes(GR& graph, NF& node_filter)
1520 1529
      : Parent(), const_true_map()
1521 1530
    {
1522 1531
      Parent::initialize(graph, node_filter, const_true_map);
1523 1532
    }
1524 1533

	
1525 1534
    /// \brief Sets the status of the given node
... ...
@@ -1551,17 +1560,17 @@
1551 1560
  };
1552 1561

	
1553 1562
  template<typename GR, typename NF>
1554 1563
  class FilterNodes<GR, NF,
1555 1564
                    typename enable_if<UndirectedTagIndicator<GR> >::type> :
1556 1565
    public GraphAdaptorExtender<
1557
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, 
1566
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >,
1558 1567
                   true> > {
1559 1568

	
1560 1569
    typedef GraphAdaptorExtender<
1561
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, 
1570
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >,
1562 1571
                   true> > Parent;
1563 1572

	
1564 1573
  public:
1565 1574

	
1566 1575
    typedef GR Graph;
1567 1576
    typedef NF NodeFilterMap;
... ...
@@ -1616,12 +1625,14 @@
1616 1625
  /// "Digraph" concept.
1617 1626
  ///
1618 1627
  /// The adapted digraph can also be modified through this adaptor
1619 1628
  /// by adding or removing nodes or arcs, unless the \c GR template
1620 1629
  /// parameter is set to be \c const.
1621 1630
  ///
1631
  /// This class provides only linear time counting for nodes and arcs.
1632
  ///
1622 1633
  /// \tparam DGR The type of the adapted digraph.
1623 1634
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
1624 1635
  /// It can also be specified to be \c const.
1625 1636
  /// \tparam AF The type of the arc filter map.
1626 1637
  /// It must be a \c bool (or convertible) arc map of the
1627 1638
  /// adapted digraph. The default type is
... ...
@@ -1639,13 +1650,13 @@
1639 1650
  class FilterArcs :
1640 1651
    public DigraphAdaptorExtender<
1641 1652
      SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >,
1642 1653
                     AF, false> > {
1643 1654
#endif
1644 1655
    typedef DigraphAdaptorExtender<
1645
      SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >, 
1656
      SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >,
1646 1657
                     AF, false> > Parent;
1647 1658

	
1648 1659
  public:
1649 1660

	
1650 1661
    /// The type of the adapted digraph.
1651 1662
    typedef DGR Digraph;
... ...
@@ -1726,12 +1737,14 @@
1726 1737
  /// "Graph" concept.
1727 1738
  ///
1728 1739
  /// The adapted graph can also be modified through this adaptor
1729 1740
  /// by adding or removing nodes or edges, unless the \c GR template
1730 1741
  /// parameter is set to be \c const.
1731 1742
  ///
1743
  /// This class provides only linear time counting for nodes, edges and arcs.
1744
  ///
1732 1745
  /// \tparam GR The type of the adapted graph.
1733 1746
  /// It must conform to the \ref concepts::Graph "Graph" concept.
1734 1747
  /// It can also be specified to be \c const.
1735 1748
  /// \tparam EF The type of the edge filter map.
1736 1749
  /// It must be a \c bool (or convertible) edge map of the
1737 1750
  /// adapted graph. The default type is
... ...
@@ -1745,17 +1758,17 @@
1745 1758
  class FilterEdges {
1746 1759
#else
1747 1760
  template<typename GR,
1748 1761
           typename EF = typename GR::template EdgeMap<bool> >
1749 1762
  class FilterEdges :
1750 1763
    public GraphAdaptorExtender<
1751
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >, 
1764
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >,
1752 1765
                   EF, false> > {
1753 1766
#endif
1754 1767
    typedef GraphAdaptorExtender<
1755
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >, 
1768
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >,
1756 1769
                   EF, false> > Parent;
1757 1770

	
1758 1771
  public:
1759 1772

	
1760 1773
    /// The type of the adapted graph.
1761 1774
    typedef GR Graph;
... ...
@@ -1774,13 +1787,13 @@
1774 1787
  public:
1775 1788

	
1776 1789
    /// \brief Constructor
1777 1790
    ///
1778 1791
    /// Creates a subgraph for the given graph with the given edge
1779 1792
    /// filter map.
1780
    FilterEdges(GR& graph, EF& edge_filter) 
1793
    FilterEdges(GR& graph, EF& edge_filter)
1781 1794
      : Parent(), const_true_map() {
1782 1795
      Parent::initialize(graph, const_true_map, edge_filter);
1783 1796
    }
1784 1797

	
1785 1798
    /// \brief Sets the status of the given edge
1786 1799
    ///
... ...
@@ -1842,13 +1855,13 @@
1842 1855
    class Arc {
1843 1856
      friend class UndirectorBase;
1844 1857
    protected:
1845 1858
      Edge _edge;
1846 1859
      bool _forward;
1847 1860

	
1848
      Arc(const Edge& edge, bool forward) 
1861
      Arc(const Edge& edge, bool forward)
1849 1862
        : _edge(edge), _forward(forward) {}
1850 1863

	
1851 1864
    public:
1852 1865
      Arc() {}
1853 1866

	
1854 1867
      Arc(Invalid) : _edge(INVALID), _forward(true) {}
... ...
@@ -2082,13 +2095,13 @@
2082 2095
      typedef typename MapTraits<MapImpl>::ReturnValue Reference;
2083 2096

	
2084 2097
      ArcMapBase(const UndirectorBase<DGR>& adaptor) :
2085 2098
        _forward(*adaptor._digraph), _backward(*adaptor._digraph) {}
2086 2099

	
2087 2100
      ArcMapBase(const UndirectorBase<DGR>& adaptor, const V& value)
2088
        : _forward(*adaptor._digraph, value), 
2101
        : _forward(*adaptor._digraph, value),
2089 2102
          _backward(*adaptor._digraph, value) {}
2090 2103

	
2091 2104
      void set(const Arc& a, const V& value) {
2092 2105
        if (direction(a)) {
2093 2106
          _forward.set(a, value);
2094 2107
        } else {
... ...
@@ -2200,13 +2213,13 @@
2200 2213

	
2201 2214
    typedef typename ItemSetTraits<DGR, Node>::ItemNotifier NodeNotifier;
2202 2215
    NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
2203 2216

	
2204 2217
    typedef typename ItemSetTraits<DGR, Edge>::ItemNotifier EdgeNotifier;
2205 2218
    EdgeNotifier& notifier(Edge) const { return _digraph->notifier(Edge()); }
2206
    
2219

	
2207 2220
    typedef EdgeNotifier ArcNotifier;
2208 2221
    ArcNotifier& notifier(Arc) const { return _digraph->notifier(Edge()); }
2209 2222

	
2210 2223
  protected:
2211 2224

	
2212 2225
    UndirectorBase() : _digraph(0) {}
... ...
@@ -2229,12 +2242,15 @@
2229 2242
  /// This adaptor conforms to the \ref concepts::Graph "Graph" concept.
2230 2243
  ///
2231 2244
  /// The adapted digraph can also be modified through this adaptor
2232 2245
  /// by adding or removing nodes or edges, unless the \c GR template
2233 2246
  /// parameter is set to be \c const.
2234 2247
  ///
2248
  /// This class provides item counting in the same time as the adapted
2249
  /// digraph structure.
2250
  ///
2235 2251
  /// \tparam DGR The type of the adapted digraph.
2236 2252
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
2237 2253
  /// It can also be specified to be \c const.
2238 2254
  ///
2239 2255
  /// \note The \c Node type of this adaptor and the adapted digraph are
2240 2256
  /// convertible to each other, moreover the \c Edge type of the adaptor
... ...
@@ -2532,12 +2548,15 @@
2532 2548
  /// This class conforms to the \ref concepts::Digraph "Digraph" concept.
2533 2549
  ///
2534 2550
  /// The adapted graph can also be modified through this adaptor
2535 2551
  /// by adding or removing nodes or arcs, unless the \c GR template
2536 2552
  /// parameter is set to be \c const.
2537 2553
  ///
2554
  /// This class provides item counting in the same time as the adapted
2555
  /// graph structure.
2556
  ///
2538 2557
  /// \tparam GR The type of the adapted graph.
2539 2558
  /// It must conform to the \ref concepts::Graph "Graph" concept.
2540 2559
  /// It can also be specified to be \c const.
2541 2560
  /// \tparam DM The type of the direction map.
2542 2561
  /// It must be a \c bool (or convertible) edge map of the
2543 2562
  /// adapted graph. The default type is
... ...
@@ -2675,12 +2694,14 @@
2675 2694
  /// When the union \f$ A_{forward}\cup A_{backward} \f$ is taken,
2676 2695
  /// multiplicities are counted, i.e. the adaptor has exactly
2677 2696
  /// \f$ |A_{forward}| + |A_{backward}|\f$ arcs (it may have parallel
2678 2697
  /// arcs).
2679 2698
  /// This class conforms to the \ref concepts::Digraph "Digraph" concept.
2680 2699
  ///
2700
  /// This class provides only linear time counting for nodes and arcs.
2701
  ///
2681 2702
  /// \tparam DGR The type of the adapted digraph.
2682 2703
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
2683 2704
  /// It is implicitly \c const.
2684 2705
  /// \tparam CM The type of the capacity map.
2685 2706
  /// It must be an arc map of some numerical type, which defines
2686 2707
  /// the capacities in the flow problem. It is implicitly \c const.
... ...
@@ -2704,13 +2725,13 @@
2704 2725
  class ResidualDigraph
2705 2726
#else
2706 2727
  template<typename DGR,
2707 2728
           typename CM = typename DGR::template ArcMap<int>,
2708 2729
           typename FM = CM,
2709 2730
           typename TL = Tolerance<typename CM::Value> >
2710
  class ResidualDigraph 
2731
  class ResidualDigraph
2711 2732
    : public SubDigraph<
2712 2733
        Undirector<const DGR>,
2713 2734
        ConstMap<typename DGR::Node, Const<bool, true> >,
2714 2735
        typename Undirector<const DGR>::template CombinedArcMap<
2715 2736
          _adaptor_bits::ResForwardFilter<const DGR, CM, FM, TL>,
2716 2737
          _adaptor_bits::ResBackwardFilter<const DGR, CM, FM, TL> > >
... ...
@@ -2761,13 +2782,13 @@
2761 2782
    /// \brief Constructor
2762 2783
    ///
2763 2784
    /// Constructor of the residual digraph adaptor. The parameters are the
2764 2785
    /// digraph, the capacity map, the flow map, and a tolerance object.
2765 2786
    ResidualDigraph(const DGR& digraph, const CM& capacity,
2766 2787
                    FM& flow, const TL& tolerance = Tolerance())
2767
      : Parent(), _capacity(&capacity), _flow(&flow), 
2788
      : Parent(), _capacity(&capacity), _flow(&flow),
2768 2789
        _graph(digraph), _node_filter(),
2769 2790
        _forward_filter(capacity, flow, tolerance),
2770 2791
        _backward_filter(capacity, flow, tolerance),
2771 2792
        _arc_filter(_forward_filter, _backward_filter)
2772 2793
    {
2773 2794
      Parent::initialize(_graph, _node_filter, _arc_filter);
... ...
@@ -2843,13 +2864,13 @@
2843 2864
      /// The key type of the map
2844 2865
      typedef Arc Key;
2845 2866
      /// The value type of the map
2846 2867
      typedef typename CapacityMap::Value Value;
2847 2868

	
2848 2869
      /// Constructor
2849
      ResidualCapacity(const ResidualDigraph<DGR, CM, FM, TL>& adaptor) 
2870
      ResidualCapacity(const ResidualDigraph<DGR, CM, FM, TL>& adaptor)
2850 2871
        : _adaptor(&adaptor) {}
2851 2872

	
2852 2873
      /// Returns the value associated with the given residual arc
2853 2874
      Value operator[](const Arc& a) const {
2854 2875
        return _adaptor->residualCapacity(a);
2855 2876
      }
... ...
@@ -3322,12 +3343,15 @@
3322 3343
  /// costs or capacities if the algorithm considers only arc costs or
3323 3344
  /// capacities directly.
3324 3345
  /// In this case you can use \c SplitNodes adaptor, and set the node
3325 3346
  /// costs/capacities of the original digraph to the \e bind \e arcs
3326 3347
  /// in the adaptor.
3327 3348
  ///
3349
  /// This class provides item counting in the same time as the adapted
3350
  /// digraph structure.
3351
  ///
3328 3352
  /// \tparam DGR The type of the adapted digraph.
3329 3353
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
3330 3354
  /// It is implicitly \c const.
3331 3355
  ///
3332 3356
  /// \note The \c Node type of this adaptor is converible to the \c Node
3333 3357
  /// type of the adapted digraph.
... ...
@@ -3420,13 +3444,13 @@
3420 3444

	
3421 3445
    /// \brief Node map combined from two original node maps
3422 3446
    ///
3423 3447
    /// This map adaptor class adapts two node maps of the original digraph
3424 3448
    /// to get a node map of the split digraph.
3425 3449
    /// Its value type is inherited from the first node map type (\c IN).
3426
    /// \tparam IN The type of the node map for the in-nodes. 
3450
    /// \tparam IN The type of the node map for the in-nodes.
3427 3451
    /// \tparam OUT The type of the node map for the out-nodes.
3428 3452
    template <typename IN, typename OUT>
3429 3453
    class CombinedNodeMap {
3430 3454
    public:
3431 3455

	
3432 3456
      /// The key type of the map
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -17,20 +17,29 @@
17 17
 */
18 18

	
19 19
#include <lemon/arg_parser.h>
20 20

	
21 21
namespace lemon {
22 22

	
23
  void ArgParser::_terminate(ArgParserException::Reason reason) const
24
  {
25
    if(_exit_on_problems)
26
      exit(1);
27
    else throw(ArgParserException(reason));
28
  }
29

	
30

	
23 31
  void ArgParser::_showHelp(void *p)
24 32
  {
25 33
    (static_cast<ArgParser*>(p))->showHelp();
26
    exit(1);
34
    (static_cast<ArgParser*>(p))->_terminate(ArgParserException::HELP);
27 35
  }
28 36

	
29 37
  ArgParser::ArgParser(int argc, const char * const *argv)
30
    :_argc(argc), _argv(argv), _command_name(argv[0]) {
38
    :_argc(argc), _argv(argv), _command_name(argv[0]),
39
    _exit_on_problems(true) {
31 40
    funcOption("-help","Print a short help message",_showHelp,this);
32 41
    synonym("help","-help");
33 42
    synonym("h","-help");
34 43
  }
35 44

	
36 45
  ArgParser::~ArgParser()
... ...
@@ -339,22 +348,22 @@
339 348
  {
340 349
    shortHelp();
341 350
    std::cerr << "Where:\n";
342 351
    for(std::vector<OtherArg>::const_iterator i=_others_help.begin();
343 352
        i!=_others_help.end();++i) showHelp(i);
344 353
    for(Opts::const_iterator i=_opts.begin();i!=_opts.end();++i) showHelp(i);
345
    exit(1);
354
    _terminate(ArgParserException::HELP);
346 355
  }
347 356

	
348 357

	
349 358
  void ArgParser::unknownOpt(std::string arg) const
350 359
  {
351 360
    std::cerr << "\nUnknown option: " << arg << "\n";
352 361
    std::cerr << "\nType '" << _command_name <<
353 362
      " --help' to obtain a short summary on the usage.\n\n";
354
    exit(1);
363
    _terminate(ArgParserException::UNKNOWN_OPT);
355 364
  }
356 365

	
357 366
  void ArgParser::requiresValue(std::string arg, OptType t) const
358 367
  {
359 368
    std::cerr << "Argument '" << arg << "' requires a";
360 369
    switch(t) {
... ...
@@ -411,13 +420,13 @@
411 420
              showHelp(_opts.find(*o));
412 421
          }
413 422
        }
414 423
    if(!ok) {
415 424
      std::cerr << "\nType '" << _command_name <<
416 425
        " --help' to obtain a short summary on the usage.\n\n";
417
      exit(1);
426
      _terminate(ArgParserException::INVALID_OPT);
418 427
    }
419 428
  }
420 429

	
421 430
  ArgParser &ArgParser::parse()
422 431
  {
423 432
    for(int ar=1; ar<_argc; ++ar) {
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -31,12 +31,50 @@
31 31
///\ingroup misc
32 32
///\file
33 33
///\brief A tool to parse command line arguments.
34 34

	
35 35
namespace lemon {
36 36

	
37
  ///Exception used by ArgParser
38
  class ArgParserException : public Exception {
39
  public:
40
    enum Reason {
41
      HELP,         /// <tt>--help</tt> option was given
42
      UNKNOWN_OPT,  /// Unknown option was given
43
      INVALID_OPT   /// Invalid combination of options
44
    };
45

	
46
  private:
47
    Reason _reason;
48

	
49
  public:
50
    ///Constructor
51
    ArgParserException(Reason r) throw() : _reason(r) {}
52
    ///Virtual destructor
53
    virtual ~ArgParserException() throw() {}
54
    ///A short description of the exception
55
    virtual const char* what() const throw() {
56
      switch(_reason)
57
        {
58
        case HELP:
59
          return "lemon::ArgParseException: ask for help";
60
          break;
61
        case UNKNOWN_OPT:
62
          return "lemon::ArgParseException: unknown option";
63
          break;
64
        case INVALID_OPT:
65
          return "lemon::ArgParseException: invalid combination of options";
66
          break;
67
        }
68
      return "";
69
    }
70
    ///Return the reason for the failure
71
    Reason reason() const {return _reason; }
72
  };
73

	
74

	
37 75
  ///Command line arguments parser
38 76

	
39 77
  ///\ingroup misc
40 78
  ///Command line arguments parser.
41 79
  ///
42 80
  ///For a complete example see the \ref arg_parser_demo.cc demo file.
... ...
@@ -113,12 +151,16 @@
113 151
    //  must be of type "void f(void *)"
114 152
    //\param data Data to be passed to \c func
115 153
    ArgParser &funcOption(const std::string &name,
116 154
                    const std::string &help,
117 155
                    void (*func)(void *),void *data);
118 156

	
157
    bool _exit_on_problems;
158

	
159
    void _terminate(ArgParserException::Reason reason) const;
160

	
119 161
  public:
120 162

	
121 163
    ///Constructor
122 164
    ArgParser(int argc, const char * const *argv);
123 165

	
124 166
    ~ArgParser();
... ...
@@ -377,10 +419,15 @@
377 419
    ///Give back the non-option type arguments.
378 420

	
379 421
    ///Give back a reference to a vector consisting of the program arguments
380 422
    ///not starting with a '-' character.
381 423
    const std::vector<std::string> &files() const { return _file_args; }
382 424

	
425
    ///Throw instead of exit in case of problems
426
    void throwOnProblems()
427
    {
428
      _exit_on_problems=false;
429
    }
383 430
  };
384 431
}
385 432

	
386 433
#endif // LEMON_ARG_PARSER_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -44,13 +44,13 @@
44 44

	
45 45
    ///\brief The type of the map that stores the predecessor
46 46
    ///arcs of the shortest paths.
47 47
    ///
48 48
    ///The type of the map that stores the predecessor
49 49
    ///arcs of the shortest paths.
50
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
50
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
51 51
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
52 52
    ///Instantiates a \c PredMap.
53 53

	
54 54
    ///This function instantiates a \ref PredMap.
55 55
    ///\param g is the digraph, to which we would like to define the
56 56
    ///\ref PredMap.
... ...
@@ -59,13 +59,14 @@
59 59
      return new PredMap(g);
60 60
    }
61 61

	
62 62
    ///The type of the map that indicates which nodes are processed.
63 63

	
64 64
    ///The type of the map that indicates which nodes are processed.
65
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
65
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
66
    ///By default, it is a NullMap.
66 67
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
67 68
    ///Instantiates a \c ProcessedMap.
68 69

	
69 70
    ///This function instantiates a \ref ProcessedMap.
70 71
    ///\param g is the digraph, to which
71 72
    ///we would like to define the \ref ProcessedMap
... ...
@@ -78,13 +79,14 @@
78 79
      return new ProcessedMap();
79 80
    }
80 81

	
81 82
    ///The type of the map that indicates which nodes are reached.
82 83

	
83 84
    ///The type of the map that indicates which nodes are reached.
84
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85
    ///It must conform to
86
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85 87
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
86 88
    ///Instantiates a \c ReachedMap.
87 89

	
88 90
    ///This function instantiates a \ref ReachedMap.
89 91
    ///\param g is the digraph, to which
90 92
    ///we would like to define the \ref ReachedMap.
... ...
@@ -93,13 +95,13 @@
93 95
      return new ReachedMap(g);
94 96
    }
95 97

	
96 98
    ///The type of the map that stores the distances of the nodes.
97 99

	
98 100
    ///The type of the map that stores the distances of the nodes.
99
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
101
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
100 102
    typedef typename Digraph::template NodeMap<int> DistMap;
101 103
    ///Instantiates a \c DistMap.
102 104

	
103 105
    ///This function instantiates a \ref DistMap.
104 106
    ///\param g is the digraph, to which we would like to define the
105 107
    ///\ref DistMap.
... ...
@@ -117,12 +119,17 @@
117 119
  ///There is also a \ref bfs() "function-type interface" for the BFS
118 120
  ///algorithm, which is convenient in the simplier cases and it can be
119 121
  ///used easier.
120 122
  ///
121 123
  ///\tparam GR The type of the digraph the algorithm runs on.
122 124
  ///The default type is \ref ListDigraph.
125
  ///\tparam TR The traits class that defines various types used by the
126
  ///algorithm. By default, it is \ref BfsDefaultTraits
127
  ///"BfsDefaultTraits<GR>".
128
  ///In most cases, this parameter should not be set directly,
129
  ///consider to use the named template parameters instead.
123 130
#ifdef DOXYGEN
124 131
  template <typename GR,
125 132
            typename TR>
126 133
#else
127 134
  template <typename GR=ListDigraph,
128 135
            typename TR=BfsDefaultTraits<GR> >
... ...
@@ -222,13 +229,13 @@
222 229
    };
223 230
    ///\brief \ref named-templ-param "Named parameter" for setting
224 231
    ///\c PredMap type.
225 232
    ///
226 233
    ///\ref named-templ-param "Named parameter" for setting
227 234
    ///\c PredMap type.
228
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
235
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
229 236
    template <class T>
230 237
    struct SetPredMap : public Bfs< Digraph, SetPredMapTraits<T> > {
231 238
      typedef Bfs< Digraph, SetPredMapTraits<T> > Create;
232 239
    };
233 240

	
234 241
    template <class T>
... ...
@@ -242,13 +249,13 @@
242 249
    };
243 250
    ///\brief \ref named-templ-param "Named parameter" for setting
244 251
    ///\c DistMap type.
245 252
    ///
246 253
    ///\ref named-templ-param "Named parameter" for setting
247 254
    ///\c DistMap type.
248
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
255
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
249 256
    template <class T>
250 257
    struct SetDistMap : public Bfs< Digraph, SetDistMapTraits<T> > {
251 258
      typedef Bfs< Digraph, SetDistMapTraits<T> > Create;
252 259
    };
253 260

	
254 261
    template <class T>
... ...
@@ -262,13 +269,14 @@
262 269
    };
263 270
    ///\brief \ref named-templ-param "Named parameter" for setting
264 271
    ///\c ReachedMap type.
265 272
    ///
266 273
    ///\ref named-templ-param "Named parameter" for setting
267 274
    ///\c ReachedMap type.
268
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
275
    ///It must conform to
276
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
269 277
    template <class T>
270 278
    struct SetReachedMap : public Bfs< Digraph, SetReachedMapTraits<T> > {
271 279
      typedef Bfs< Digraph, SetReachedMapTraits<T> > Create;
272 280
    };
273 281

	
274 282
    template <class T>
... ...
@@ -282,13 +290,13 @@
282 290
    };
283 291
    ///\brief \ref named-templ-param "Named parameter" for setting
284 292
    ///\c ProcessedMap type.
285 293
    ///
286 294
    ///\ref named-templ-param "Named parameter" for setting
287 295
    ///\c ProcessedMap type.
288
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
296
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
289 297
    template <class T>
290 298
    struct SetProcessedMap : public Bfs< Digraph, SetProcessedMapTraits<T> > {
291 299
      typedef Bfs< Digraph, SetProcessedMapTraits<T> > Create;
292 300
    };
293 301

	
294 302
    struct SetStandardProcessedMapTraits : public Traits {
... ...
@@ -410,14 +418,14 @@
410 418

	
411 419
  public:
412 420

	
413 421
    ///\name Execution Control
414 422
    ///The simplest way to execute the BFS algorithm is to use one of the
415 423
    ///member functions called \ref run(Node) "run()".\n
416
    ///If you need more control on the execution, first you have to call
417
    ///\ref init(), then you can add several source nodes with
424
    ///If you need better control on the execution, you have to call
425
    ///\ref init() first, then you can add several source nodes with
418 426
    ///\ref addSource(). Finally the actual path computation can be
419 427
    ///performed with one of the \ref start() functions.
420 428

	
421 429
    ///@{
422 430

	
423 431
    ///\brief Initializes the internal data structures.
... ...
@@ -697,18 +705,14 @@
697 705
      start(t);
698 706
      return reached(t);
699 707
    }
700 708

	
701 709
    ///Runs the algorithm to visit all nodes in the digraph.
702 710

	
703
    ///This method runs the %BFS algorithm in order to
704
    ///compute the shortest path to each node.
705
    ///
706
    ///The algorithm computes
707
    ///- the shortest path tree (forest),
708
    ///- the distance of each node from the root(s).
711
    ///This method runs the %BFS algorithm in order to visit all nodes
712
    ///in the digraph.
709 713
    ///
710 714
    ///\note <tt>b.run(s)</tt> is just a shortcut of the following code.
711 715
    ///\code
712 716
    ///  b.init();
713 717
    ///  for (NodeIt n(gr); n != INVALID; ++n) {
714 718
    ///    if (!b.reached(n)) {
... ...
@@ -734,56 +738,58 @@
734 738
    ///functions.\n
735 739
    ///Either \ref run(Node) "run()" or \ref start() should be called
736 740
    ///before using them.
737 741

	
738 742
    ///@{
739 743

	
740
    ///The shortest path to a node.
744
    ///The shortest path to the given node.
741 745

	
742
    ///Returns the shortest path to a node.
746
    ///Returns the shortest path to the given node from the root(s).
743 747
    ///
744 748
    ///\warning \c t should be reached from the root(s).
745 749
    ///
746 750
    ///\pre Either \ref run(Node) "run()" or \ref init()
747 751
    ///must be called before using this function.
748 752
    Path path(Node t) const { return Path(*G, *_pred, t); }
749 753

	
750
    ///The distance of a node from the root(s).
754
    ///The distance of the given node from the root(s).
751 755

	
752
    ///Returns the distance of a node from the root(s).
756
    ///Returns the distance of the given node from the root(s).
753 757
    ///
754 758
    ///\warning If node \c v is not reached from the root(s), then
755 759
    ///the return value of this function is undefined.
756 760
    ///
757 761
    ///\pre Either \ref run(Node) "run()" or \ref init()
758 762
    ///must be called before using this function.
759 763
    int dist(Node v) const { return (*_dist)[v]; }
760 764

	
761
    ///Returns the 'previous arc' of the shortest path tree for a node.
762

	
765
    ///\brief Returns the 'previous arc' of the shortest path tree for
766
    ///the given node.
767
    ///
763 768
    ///This function returns the 'previous arc' of the shortest path
764 769
    ///tree for the node \c v, i.e. it returns the last arc of a
765 770
    ///shortest path from a root to \c v. It is \c INVALID if \c v
766 771
    ///is not reached from the root(s) or if \c v is a root.
767 772
    ///
768 773
    ///The shortest path tree used here is equal to the shortest path
769
    ///tree used in \ref predNode().
774
    ///tree used in \ref predNode() and \ref predMap().
770 775
    ///
771 776
    ///\pre Either \ref run(Node) "run()" or \ref init()
772 777
    ///must be called before using this function.
773 778
    Arc predArc(Node v) const { return (*_pred)[v];}
774 779

	
775
    ///Returns the 'previous node' of the shortest path tree for a node.
776

	
780
    ///\brief Returns the 'previous node' of the shortest path tree for
781
    ///the given node.
782
    ///
777 783
    ///This function returns the 'previous node' of the shortest path
778 784
    ///tree for the node \c v, i.e. it returns the last but one node
779
    ///from a shortest path from a root to \c v. It is \c INVALID
785
    ///of a shortest path from a root to \c v. It is \c INVALID
780 786
    ///if \c v is not reached from the root(s) or if \c v is a root.
781 787
    ///
782 788
    ///The shortest path tree used here is equal to the shortest path
783
    ///tree used in \ref predArc().
789
    ///tree used in \ref predArc() and \ref predMap().
784 790
    ///
785 791
    ///\pre Either \ref run(Node) "run()" or \ref init()
786 792
    ///must be called before using this function.
787 793
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
788 794
                                  G->source((*_pred)[v]); }
789 795

	
... ...
@@ -798,19 +804,19 @@
798 804
    const DistMap &distMap() const { return *_dist;}
799 805

	
800 806
    ///\brief Returns a const reference to the node map that stores the
801 807
    ///predecessor arcs.
802 808
    ///
803 809
    ///Returns a const reference to the node map that stores the predecessor
804
    ///arcs, which form the shortest path tree.
810
    ///arcs, which form the shortest path tree (forest).
805 811
    ///
806 812
    ///\pre Either \ref run(Node) "run()" or \ref init()
807 813
    ///must be called before using this function.
808 814
    const PredMap &predMap() const { return *_pred;}
809 815

	
810
    ///Checks if a node is reached from the root(s).
816
    ///Checks if the given node is reached from the root(s).
811 817

	
812 818
    ///Returns \c true if \c v is reached from the root(s).
813 819
    ///
814 820
    ///\pre Either \ref run(Node) "run()" or \ref init()
815 821
    ///must be called before using this function.
816 822
    bool reached(Node v) const { return (*_reached)[v]; }
... ...
@@ -830,13 +836,13 @@
830 836

	
831 837
    ///\brief The type of the map that stores the predecessor
832 838
    ///arcs of the shortest paths.
833 839
    ///
834 840
    ///The type of the map that stores the predecessor
835 841
    ///arcs of the shortest paths.
836
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
842
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
837 843
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
838 844
    ///Instantiates a PredMap.
839 845

	
840 846
    ///This function instantiates a PredMap.
841 847
    ///\param g is the digraph, to which we would like to define the
842 848
    ///PredMap.
... ...
@@ -845,14 +851,14 @@
845 851
      return new PredMap(g);
846 852
    }
847 853

	
848 854
    ///The type of the map that indicates which nodes are processed.
849 855

	
850 856
    ///The type of the map that indicates which nodes are processed.
851
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
852
    ///By default it is a NullMap.
857
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
858
    ///By default, it is a NullMap.
853 859
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
854 860
    ///Instantiates a ProcessedMap.
855 861

	
856 862
    ///This function instantiates a ProcessedMap.
857 863
    ///\param g is the digraph, to which
858 864
    ///we would like to define the ProcessedMap.
... ...
@@ -865,13 +871,14 @@
865 871
      return new ProcessedMap();
866 872
    }
867 873

	
868 874
    ///The type of the map that indicates which nodes are reached.
869 875

	
870 876
    ///The type of the map that indicates which nodes are reached.
871
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
877
    ///It must conform to
878
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
872 879
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
873 880
    ///Instantiates a ReachedMap.
874 881

	
875 882
    ///This function instantiates a ReachedMap.
876 883
    ///\param g is the digraph, to which
877 884
    ///we would like to define the ReachedMap.
... ...
@@ -880,13 +887,13 @@
880 887
      return new ReachedMap(g);
881 888
    }
882 889

	
883 890
    ///The type of the map that stores the distances of the nodes.
884 891

	
885 892
    ///The type of the map that stores the distances of the nodes.
886
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
893
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
887 894
    typedef typename Digraph::template NodeMap<int> DistMap;
888 895
    ///Instantiates a DistMap.
889 896

	
890 897
    ///This function instantiates a DistMap.
891 898
    ///\param g is the digraph, to which we would like to define
892 899
    ///the DistMap
... ...
@@ -895,24 +902,20 @@
895 902
      return new DistMap(g);
896 903
    }
897 904

	
898 905
    ///The type of the shortest paths.
899 906

	
900 907
    ///The type of the shortest paths.
901
    ///It must meet the \ref concepts::Path "Path" concept.
908
    ///It must conform to the \ref concepts::Path "Path" concept.
902 909
    typedef lemon::Path<Digraph> Path;
903 910
  };
904 911

	
905 912
  /// Default traits class used by BfsWizard
906 913

	
907
  /// To make it easier to use Bfs algorithm
908
  /// we have created a wizard class.
909
  /// This \ref BfsWizard class needs default traits,
910
  /// as well as the \ref Bfs class.
911
  /// The \ref BfsWizardBase is a class to be the default traits of the
912
  /// \ref BfsWizard class.
914
  /// Default traits class used by BfsWizard.
915
  /// \tparam GR The type of the digraph.
913 916
  template<class GR>
914 917
  class BfsWizardBase : public BfsWizardDefaultTraits<GR>
915 918
  {
916 919

	
917 920
    typedef BfsWizardDefaultTraits<GR> Base;
918 921
  protected:
... ...
@@ -934,13 +937,13 @@
934 937
    //Pointer to the distance of the target node.
935 938
    int *_di;
936 939

	
937 940
    public:
938 941
    /// Constructor.
939 942

	
940
    /// This constructor does not require parameters, therefore it initiates
943
    /// This constructor does not require parameters, it initiates
941 944
    /// all of the attributes to \c 0.
942 945
    BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
943 946
                      _dist(0), _path(0), _di(0) {}
944 947

	
945 948
    /// Constructor.
946 949

	
... ...
@@ -959,35 +962,31 @@
959 962
  /// \ref bfs() "function-type interface" of \ref Bfs algorithm.
960 963
  /// It does not have own \ref run(Node) "run()" method, it uses the
961 964
  /// functions and features of the plain \ref Bfs.
962 965
  ///
963 966
  /// This class should only be used through the \ref bfs() function,
964 967
  /// which makes it easier to use the algorithm.
968
  ///
969
  /// \tparam TR The traits class that defines various types used by the
970
  /// algorithm.
965 971
  template<class TR>
966 972
  class BfsWizard : public TR
967 973
  {
968 974
    typedef TR Base;
969 975

	
970
    ///The type of the digraph the algorithm runs on.
971 976
    typedef typename TR::Digraph Digraph;
972 977

	
973 978
    typedef typename Digraph::Node Node;
974 979
    typedef typename Digraph::NodeIt NodeIt;
975 980
    typedef typename Digraph::Arc Arc;
976 981
    typedef typename Digraph::OutArcIt OutArcIt;
977 982

	
978
    ///\brief The type of the map that stores the predecessor
979
    ///arcs of the shortest paths.
980 983
    typedef typename TR::PredMap PredMap;
981
    ///\brief The type of the map that stores the distances of the nodes.
982 984
    typedef typename TR::DistMap DistMap;
983
    ///\brief The type of the map that indicates which nodes are reached.
984 985
    typedef typename TR::ReachedMap ReachedMap;
985
    ///\brief The type of the map that indicates which nodes are processed.
986 986
    typedef typename TR::ProcessedMap ProcessedMap;
987
    ///The type of the shortest paths
988 987
    typedef typename TR::Path Path;
989 988

	
990 989
  public:
991 990

	
992 991
    /// Constructor.
993 992
    BfsWizard() : TR() {}
... ...
@@ -1051,30 +1050,31 @@
1051 1050
        *Base::_di = alg.dist(t);
1052 1051
      return alg.reached(t);
1053 1052
    }
1054 1053

	
1055 1054
    ///Runs BFS algorithm to visit all nodes in the digraph.
1056 1055

	
1057
    ///This method runs BFS algorithm in order to compute
1058
    ///the shortest path to each node.
1056
    ///This method runs BFS algorithm in order to visit all nodes
1057
    ///in the digraph.
1059 1058
    void run()
1060 1059
    {
1061 1060
      run(INVALID);
1062 1061
    }
1063 1062

	
1064 1063
    template<class T>
1065 1064
    struct SetPredMapBase : public Base {
1066 1065
      typedef T PredMap;
1067 1066
      static PredMap *createPredMap(const Digraph &) { return 0; };
1068 1067
      SetPredMapBase(const TR &b) : TR(b) {}
1069 1068
    };
1070
    ///\brief \ref named-func-param "Named parameter"
1071
    ///for setting PredMap object.
1069

	
1070
    ///\brief \ref named-templ-param "Named parameter" for setting
1071
    ///the predecessor map.
1072 1072
    ///
1073
    ///\ref named-func-param "Named parameter"
1074
    ///for setting PredMap object.
1073
    ///\ref named-templ-param "Named parameter" function for setting
1074
    ///the map that stores the predecessor arcs of the nodes.
1075 1075
    template<class T>
1076 1076
    BfsWizard<SetPredMapBase<T> > predMap(const T &t)
1077 1077
    {
1078 1078
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1079 1079
      return BfsWizard<SetPredMapBase<T> >(*this);
1080 1080
    }
... ...
@@ -1082,17 +1082,18 @@
1082 1082
    template<class T>
1083 1083
    struct SetReachedMapBase : public Base {
1084 1084
      typedef T ReachedMap;
1085 1085
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1086 1086
      SetReachedMapBase(const TR &b) : TR(b) {}
1087 1087
    };
1088
    ///\brief \ref named-func-param "Named parameter"
1089
    ///for setting ReachedMap object.
1088

	
1089
    ///\brief \ref named-templ-param "Named parameter" for setting
1090
    ///the reached map.
1090 1091
    ///
1091
    /// \ref named-func-param "Named parameter"
1092
    ///for setting ReachedMap object.
1092
    ///\ref named-templ-param "Named parameter" function for setting
1093
    ///the map that indicates which nodes are reached.
1093 1094
    template<class T>
1094 1095
    BfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1095 1096
    {
1096 1097
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1097 1098
      return BfsWizard<SetReachedMapBase<T> >(*this);
1098 1099
    }
... ...
@@ -1100,17 +1101,19 @@
1100 1101
    template<class T>
1101 1102
    struct SetDistMapBase : public Base {
1102 1103
      typedef T DistMap;
1103 1104
      static DistMap *createDistMap(const Digraph &) { return 0; };
1104 1105
      SetDistMapBase(const TR &b) : TR(b) {}
1105 1106
    };
1106
    ///\brief \ref named-func-param "Named parameter"
1107
    ///for setting DistMap object.
1107

	
1108
    ///\brief \ref named-templ-param "Named parameter" for setting
1109
    ///the distance map.
1108 1110
    ///
1109
    /// \ref named-func-param "Named parameter"
1110
    ///for setting DistMap object.
1111
    ///\ref named-templ-param "Named parameter" function for setting
1112
    ///the map that stores the distances of the nodes calculated
1113
    ///by the algorithm.
1111 1114
    template<class T>
1112 1115
    BfsWizard<SetDistMapBase<T> > distMap(const T &t)
1113 1116
    {
1114 1117
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1115 1118
      return BfsWizard<SetDistMapBase<T> >(*this);
1116 1119
    }
... ...
@@ -1118,17 +1121,18 @@
1118 1121
    template<class T>
1119 1122
    struct SetProcessedMapBase : public Base {
1120 1123
      typedef T ProcessedMap;
1121 1124
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1122 1125
      SetProcessedMapBase(const TR &b) : TR(b) {}
1123 1126
    };
1124
    ///\brief \ref named-func-param "Named parameter"
1125
    ///for setting ProcessedMap object.
1127

	
1128
    ///\brief \ref named-func-param "Named parameter" for setting
1129
    ///the processed map.
1126 1130
    ///
1127
    /// \ref named-func-param "Named parameter"
1128
    ///for setting ProcessedMap object.
1131
    ///\ref named-templ-param "Named parameter" function for setting
1132
    ///the map that indicates which nodes are processed.
1129 1133
    template<class T>
1130 1134
    BfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1131 1135
    {
1132 1136
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1133 1137
      return BfsWizard<SetProcessedMapBase<T> >(*this);
1134 1138
    }
... ...
@@ -1261,13 +1265,14 @@
1261 1265
    /// \brief The type of the digraph the algorithm runs on.
1262 1266
    typedef GR Digraph;
1263 1267

	
1264 1268
    /// \brief The type of the map that indicates which nodes are reached.
1265 1269
    ///
1266 1270
    /// The type of the map that indicates which nodes are reached.
1267
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1271
    /// It must conform to
1272
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1268 1273
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1269 1274

	
1270 1275
    /// \brief Instantiates a ReachedMap.
1271 1276
    ///
1272 1277
    /// This function instantiates a ReachedMap.
1273 1278
    /// \param digraph is the digraph, to which
... ...
@@ -1299,17 +1304,17 @@
1299 1304
  /// The value of GR is not used directly by \ref BfsVisit,
1300 1305
  /// it is only passed to \ref BfsVisitDefaultTraits.
1301 1306
  /// \tparam VS The Visitor type that is used by the algorithm.
1302 1307
  /// \ref BfsVisitor "BfsVisitor<GR>" is an empty visitor, which
1303 1308
  /// does not observe the BFS events. If you want to observe the BFS
1304 1309
  /// events, you should implement your own visitor class.
1305
  /// \tparam TR Traits class to set various data types used by the
1306
  /// algorithm. The default traits class is
1307
  /// \ref BfsVisitDefaultTraits "BfsVisitDefaultTraits<GR>".
1308
  /// See \ref BfsVisitDefaultTraits for the documentation of
1309
  /// a BFS visit traits class.
1310
  /// \tparam TR The traits class that defines various types used by the
1311
  /// algorithm. By default, it is \ref BfsVisitDefaultTraits
1312
  /// "BfsVisitDefaultTraits<GR>".
1313
  /// In most cases, this parameter should not be set directly,
1314
  /// consider to use the named template parameters instead.
1310 1315
#ifdef DOXYGEN
1311 1316
  template <typename GR, typename VS, typename TR>
1312 1317
#else
1313 1318
  template <typename GR = ListDigraph,
1314 1319
            typename VS = BfsVisitor<GR>,
1315 1320
            typename TR = BfsVisitDefaultTraits<GR> >
... ...
@@ -1422,14 +1427,14 @@
1422 1427

	
1423 1428
  public:
1424 1429

	
1425 1430
    /// \name Execution Control
1426 1431
    /// The simplest way to execute the BFS algorithm is to use one of the
1427 1432
    /// member functions called \ref run(Node) "run()".\n
1428
    /// If you need more control on the execution, first you have to call
1429
    /// \ref init(), then you can add several source nodes with
1433
    /// If you need better control on the execution, you have to call
1434
    /// \ref init() first, then you can add several source nodes with
1430 1435
    /// \ref addSource(). Finally the actual path computation can be
1431 1436
    /// performed with one of the \ref start() functions.
1432 1437

	
1433 1438
    /// @{
1434 1439

	
1435 1440
    /// \brief Initializes the internal data structures.
... ...
@@ -1695,18 +1700,14 @@
1695 1700
      start(t);
1696 1701
      return reached(t);
1697 1702
    }
1698 1703

	
1699 1704
    /// \brief Runs the algorithm to visit all nodes in the digraph.
1700 1705
    ///
1701
    /// This method runs the %BFS algorithm in order to
1702
    /// compute the shortest path to each node.
1703
    ///
1704
    /// The algorithm computes
1705
    /// - the shortest path tree (forest),
1706
    /// - the distance of each node from the root(s).
1706
    /// This method runs the %BFS algorithm in order to visit all nodes
1707
    /// in the digraph.
1707 1708
    ///
1708 1709
    /// \note <tt>b.run(s)</tt> is just a shortcut of the following code.
1709 1710
    ///\code
1710 1711
    ///  b.init();
1711 1712
    ///  for (NodeIt n(gr); n != INVALID; ++n) {
1712 1713
    ///    if (!b.reached(n)) {
... ...
@@ -1732,13 +1733,13 @@
1732 1733
    /// functions.\n
1733 1734
    /// Either \ref run(Node) "run()" or \ref start() should be called
1734 1735
    /// before using them.
1735 1736

	
1736 1737
    ///@{
1737 1738

	
1738
    /// \brief Checks if a node is reached from the root(s).
1739
    /// \brief Checks if the given node is reached from the root(s).
1739 1740
    ///
1740 1741
    /// Returns \c true if \c v is reached from the root(s).
1741 1742
    ///
1742 1743
    /// \pre Either \ref run(Node) "run()" or \ref init()
1743 1744
    /// must be called before using this function.
1744 1745
    bool reached(Node v) const { return (*_reached)[v]; }
Ignore white space 6 line context
... ...
@@ -16,61 +16,57 @@
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BIN_HEAP_H
20 20
#define LEMON_BIN_HEAP_H
21 21

	
22
///\ingroup auxdat
22
///\ingroup heaps
23 23
///\file
24
///\brief Binary Heap implementation.
24
///\brief Binary heap implementation.
25 25

	
26 26
#include <vector>
27 27
#include <utility>
28 28
#include <functional>
29 29

	
30 30
namespace lemon {
31 31

	
32
  ///\ingroup auxdat
32
  /// \ingroup heaps
33 33
  ///
34
  ///\brief A Binary Heap implementation.
34
  /// \brief Binary heap data structure.
35 35
  ///
36
  ///This class implements the \e binary \e heap data structure.
36
  /// This class implements the \e binary \e heap data structure.
37
  /// It fully conforms to the \ref concepts::Heap "heap concept".
37 38
  ///
38
  ///A \e heap is a data structure for storing items with specified values
39
  ///called \e priorities in such a way that finding the item with minimum
40
  ///priority is efficient. \c CMP specifies the ordering of the priorities.
41
  ///In a heap one can change the priority of an item, add or erase an
42
  ///item, etc.
43
  ///
44
  ///\tparam PR Type of the priority of the items.
45
  ///\tparam IM A read and writable item map with int values, used internally
46
  ///to handle the cross references.
47
  ///\tparam CMP A functor class for the ordering of the priorities.
48
  ///The default is \c std::less<PR>.
49
  ///
50
  ///\sa FibHeap
51
  ///\sa Dijkstra
39
  /// \tparam PR Type of the priorities of the items.
40
  /// \tparam IM A read-writable item map with \c int values, used
41
  /// internally to handle the cross references.
42
  /// \tparam CMP A functor class for comparing the priorities.
43
  /// The default is \c std::less<PR>.
44
#ifdef DOXYGEN
45
  template <typename PR, typename IM, typename CMP>
46
#else
52 47
  template <typename PR, typename IM, typename CMP = std::less<PR> >
48
#endif
53 49
  class BinHeap {
50
  public:
54 51

	
55
  public:
56
    ///\e
52
    /// Type of the item-int map.
57 53
    typedef IM ItemIntMap;
58
    ///\e
54
    /// Type of the priorities.
59 55
    typedef PR Prio;
60
    ///\e
56
    /// Type of the items stored in the heap.
61 57
    typedef typename ItemIntMap::Key Item;
62
    ///\e
58
    /// Type of the item-priority pairs.
63 59
    typedef std::pair<Item,Prio> Pair;
64
    ///\e
60
    /// Functor type for comparing the priorities.
65 61
    typedef CMP Compare;
66 62

	
67
    /// \brief Type to represent the items states.
63
    /// \brief Type to represent the states of the items.
68 64
    ///
69
    /// Each Item element have a state associated to it. It may be "in heap",
70
    /// "pre heap" or "post heap". The latter two are indifferent from the
65
    /// Each item has a state associated to it. It can be "in heap",
66
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
71 67
    /// heap's point of view, but may be useful to the user.
72 68
    ///
73 69
    /// The item-int map must be initialized in such way that it assigns
74 70
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
75 71
    enum State {
76 72
      IN_HEAP = 0,    ///< = 0.
... ...
@@ -81,82 +77,83 @@
81 77
  private:
82 78
    std::vector<Pair> _data;
83 79
    Compare _comp;
84 80
    ItemIntMap &_iim;
85 81

	
86 82
  public:
87
    /// \brief The constructor.
83

	
84
    /// \brief Constructor.
88 85
    ///
89
    /// The constructor.
90
    /// \param map should be given to the constructor, since it is used
91
    /// internally to handle the cross references. The value of the map
92
    /// must be \c PRE_HEAP (<tt>-1</tt>) for every item.
86
    /// Constructor.
87
    /// \param map A map that assigns \c int values to the items.
88
    /// It is used internally to handle the cross references.
89
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
93 90
    explicit BinHeap(ItemIntMap &map) : _iim(map) {}
94 91

	
95
    /// \brief The constructor.
92
    /// \brief Constructor.
96 93
    ///
97
    /// The constructor.
98
    /// \param map should be given to the constructor, since it is used
99
    /// internally to handle the cross references. The value of the map
100
    /// should be PRE_HEAP (-1) for each element.
101
    ///
102
    /// \param comp The comparator function object.
94
    /// Constructor.
95
    /// \param map A map that assigns \c int values to the items.
96
    /// It is used internally to handle the cross references.
97
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
98
    /// \param comp The function object used for comparing the priorities.
103 99
    BinHeap(ItemIntMap &map, const Compare &comp)
104 100
      : _iim(map), _comp(comp) {}
105 101

	
106 102

	
107
    /// The number of items stored in the heap.
103
    /// \brief The number of items stored in the heap.
108 104
    ///
109
    /// \brief Returns the number of items stored in the heap.
105
    /// This function returns the number of items stored in the heap.
110 106
    int size() const { return _data.size(); }
111 107

	
112
    /// \brief Checks if the heap stores no items.
108
    /// \brief Check if the heap is empty.
113 109
    ///
114
    /// Returns \c true if and only if the heap stores no items.
110
    /// This function returns \c true if the heap is empty.
115 111
    bool empty() const { return _data.empty(); }
116 112

	
117
    /// \brief Make empty this heap.
113
    /// \brief Make the heap empty.
118 114
    ///
119
    /// Make empty this heap. It does not change the cross reference map.
120
    /// If you want to reuse what is not surely empty you should first clear
121
    /// the heap and after that you should set the cross reference map for
122
    /// each item to \c PRE_HEAP.
115
    /// This functon makes the heap empty.
116
    /// It does not change the cross reference map. If you want to reuse
117
    /// a heap that is not surely empty, you should first clear it and
118
    /// then you should set the cross reference map to \c PRE_HEAP
119
    /// for each item.
123 120
    void clear() {
124 121
      _data.clear();
125 122
    }
126 123

	
127 124
  private:
128 125
    static int parent(int i) { return (i-1)/2; }
129 126

	
130
    static int second_child(int i) { return 2*i+2; }
127
    static int secondChild(int i) { return 2*i+2; }
131 128
    bool less(const Pair &p1, const Pair &p2) const {
132 129
      return _comp(p1.second, p2.second);
133 130
    }
134 131

	
135
    int bubble_up(int hole, Pair p) {
132
    int bubbleUp(int hole, Pair p) {
136 133
      int par = parent(hole);
137 134
      while( hole>0 && less(p,_data[par]) ) {
138 135
        move(_data[par],hole);
139 136
        hole = par;
140 137
        par = parent(hole);
141 138
      }
142 139
      move(p, hole);
143 140
      return hole;
144 141
    }
145 142

	
146
    int bubble_down(int hole, Pair p, int length) {
147
      int child = second_child(hole);
143
    int bubbleDown(int hole, Pair p, int length) {
144
      int child = secondChild(hole);
148 145
      while(child < length) {
149 146
        if( less(_data[child-1], _data[child]) ) {
150 147
          --child;
151 148
        }
152 149
        if( !less(_data[child], p) )
153 150
          goto ok;
154 151
        move(_data[child], hole);
155 152
        hole = child;
156
        child = second_child(hole);
153
        child = secondChild(hole);
157 154
      }
158 155
      child--;
159 156
      if( child<length && less(_data[child], p) ) {
160 157
        move(_data[child], hole);
161 158
        hole=child;
162 159
      }
... ...
@@ -168,152 +165,154 @@
168 165
    void move(const Pair &p, int i) {
169 166
      _data[i] = p;
170 167
      _iim.set(p.first, i);
171 168
    }
172 169

	
173 170
  public:
171

	
174 172
    /// \brief Insert a pair of item and priority into the heap.
175 173
    ///
176
    /// Adds \c p.first to the heap with priority \c p.second.
174
    /// This function inserts \c p.first to the heap with priority
175
    /// \c p.second.
177 176
    /// \param p The pair to insert.
177
    /// \pre \c p.first must not be stored in the heap.
178 178
    void push(const Pair &p) {
179 179
      int n = _data.size();
180 180
      _data.resize(n+1);
181
      bubble_up(n, p);
181
      bubbleUp(n, p);
182 182
    }
183 183

	
184
    /// \brief Insert an item into the heap with the given heap.
184
    /// \brief Insert an item into the heap with the given priority.
185 185
    ///
186
    /// Adds \c i to the heap with priority \c p.
186
    /// This function inserts the given item into the heap with the
187
    /// given priority.
187 188
    /// \param i The item to insert.
188 189
    /// \param p The priority of the item.
190
    /// \pre \e i must not be stored in the heap.
189 191
    void push(const Item &i, const Prio &p) { push(Pair(i,p)); }
190 192

	
191
    /// \brief Returns the item with minimum priority relative to \c Compare.
193
    /// \brief Return the item having minimum priority.
192 194
    ///
193
    /// This method returns the item with minimum priority relative to \c
194
    /// Compare.
195
    /// \pre The heap must be nonempty.
195
    /// This function returns the item having minimum priority.
196
    /// \pre The heap must be non-empty.
196 197
    Item top() const {
197 198
      return _data[0].first;
198 199
    }
199 200

	
200
    /// \brief Returns the minimum priority relative to \c Compare.
201
    /// \brief The minimum priority.
201 202
    ///
202
    /// It returns the minimum priority relative to \c Compare.
203
    /// \pre The heap must be nonempty.
203
    /// This function returns the minimum priority.
204
    /// \pre The heap must be non-empty.
204 205
    Prio prio() const {
205 206
      return _data[0].second;
206 207
    }
207 208

	
208
    /// \brief Deletes the item with minimum priority relative to \c Compare.
209
    /// \brief Remove the item having minimum priority.
209 210
    ///
210
    /// This method deletes the item with minimum priority relative to \c
211
    /// Compare from the heap.
211
    /// This function removes the item having minimum priority.
212 212
    /// \pre The heap must be non-empty.
213 213
    void pop() {
214 214
      int n = _data.size()-1;
215 215
      _iim.set(_data[0].first, POST_HEAP);
216 216
      if (n > 0) {
217
        bubble_down(0, _data[n], n);
217
        bubbleDown(0, _data[n], n);
218 218
      }
219 219
      _data.pop_back();
220 220
    }
221 221

	
222
    /// \brief Deletes \c i from the heap.
222
    /// \brief Remove the given item from the heap.
223 223
    ///
224
    /// This method deletes item \c i from the heap.
225
    /// \param i The item to erase.
226
    /// \pre The item should be in the heap.
224
    /// This function removes the given item from the heap if it is
225
    /// already stored.
226
    /// \param i The item to delete.
227
    /// \pre \e i must be in the heap.
227 228
    void erase(const Item &i) {
228 229
      int h = _iim[i];
229 230
      int n = _data.size()-1;
230 231
      _iim.set(_data[h].first, POST_HEAP);
231 232
      if( h < n ) {
232
        if ( bubble_up(h, _data[n]) == h) {
233
          bubble_down(h, _data[n], n);
233
        if ( bubbleUp(h, _data[n]) == h) {
234
          bubbleDown(h, _data[n], n);
234 235
        }
235 236
      }
236 237
      _data.pop_back();
237 238
    }
238 239

	
239

	
240
    /// \brief Returns the priority of \c i.
240
    /// \brief The priority of the given item.
241 241
    ///
242
    /// This function returns the priority of item \c i.
242
    /// This function returns the priority of the given item.
243 243
    /// \param i The item.
244
    /// \pre \c i must be in the heap.
244
    /// \pre \e i must be in the heap.
245 245
    Prio operator[](const Item &i) const {
246 246
      int idx = _iim[i];
247 247
      return _data[idx].second;
248 248
    }
249 249

	
250
    /// \brief \c i gets to the heap with priority \c p independently
251
    /// if \c i was already there.
250
    /// \brief Set the priority of an item or insert it, if it is
251
    /// not stored in the heap.
252 252
    ///
253
    /// This method calls \ref push(\c i, \c p) if \c i is not stored
254
    /// in the heap and sets the priority of \c i to \c p otherwise.
253
    /// This method sets the priority of the given item if it is
254
    /// already stored in the heap. Otherwise it inserts the given
255
    /// item into the heap with the given priority.
255 256
    /// \param i The item.
256 257
    /// \param p The priority.
257 258
    void set(const Item &i, const Prio &p) {
258 259
      int idx = _iim[i];
259 260
      if( idx < 0 ) {
260 261
        push(i,p);
261 262
      }
262 263
      else if( _comp(p, _data[idx].second) ) {
263
        bubble_up(idx, Pair(i,p));
264
        bubbleUp(idx, Pair(i,p));
264 265
      }
265 266
      else {
266
        bubble_down(idx, Pair(i,p), _data.size());
267
        bubbleDown(idx, Pair(i,p), _data.size());
267 268
      }
268 269
    }
269 270

	
270
    /// \brief Decreases the priority of \c i to \c p.
271
    /// \brief Decrease the priority of an item to the given value.
271 272
    ///
272
    /// This method decreases the priority of item \c i to \c p.
273
    /// This function decreases the priority of an item to the given value.
273 274
    /// \param i The item.
274 275
    /// \param p The priority.
275
    /// \pre \c i must be stored in the heap with priority at least \c
276
    /// p relative to \c Compare.
276
    /// \pre \e i must be stored in the heap with priority at least \e p.
277 277
    void decrease(const Item &i, const Prio &p) {
278 278
      int idx = _iim[i];
279
      bubble_up(idx, Pair(i,p));
279
      bubbleUp(idx, Pair(i,p));
280 280
    }
281 281

	
282
    /// \brief Increases the priority of \c i to \c p.
282
    /// \brief Increase the priority of an item to the given value.
283 283
    ///
284
    /// This method sets the priority of item \c i to \c p.
284
    /// This function increases the priority of an item to the given value.
285 285
    /// \param i The item.
286 286
    /// \param p The priority.
287
    /// \pre \c i must be stored in the heap with priority at most \c
288
    /// p relative to \c Compare.
287
    /// \pre \e i must be stored in the heap with priority at most \e p.
289 288
    void increase(const Item &i, const Prio &p) {
290 289
      int idx = _iim[i];
291
      bubble_down(idx, Pair(i,p), _data.size());
290
      bubbleDown(idx, Pair(i,p), _data.size());
292 291
    }
293 292

	
294
    /// \brief Returns if \c item is in, has already been in, or has
295
    /// never been in the heap.
293
    /// \brief Return the state of an item.
296 294
    ///
297
    /// This method returns PRE_HEAP if \c item has never been in the
298
    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
299
    /// otherwise. In the latter case it is possible that \c item will
300
    /// get back to the heap again.
295
    /// This method returns \c PRE_HEAP if the given item has never
296
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
297
    /// and \c POST_HEAP otherwise.
298
    /// In the latter case it is possible that the item will get back
299
    /// to the heap again.
301 300
    /// \param i The item.
302 301
    State state(const Item &i) const {
303 302
      int s = _iim[i];
304 303
      if( s>=0 )
305 304
        s=0;
306 305
      return State(s);
307 306
    }
308 307

	
309
    /// \brief Sets the state of the \c item in the heap.
308
    /// \brief Set the state of an item in the heap.
310 309
    ///
311
    /// Sets the state of the \c item in the heap. It can be used to
312
    /// manually clear the heap when it is important to achive the
313
    /// better time complexity.
310
    /// This function sets the state of the given item in the heap.
311
    /// It can be used to manually clear the heap when it is important
312
    /// to achive better time complexity.
314 313
    /// \param i The item.
315 314
    /// \param st The state. It should not be \c IN_HEAP.
316 315
    void state(const Item& i, State st) {
317 316
      switch (st) {
318 317
      case POST_HEAP:
319 318
      case PRE_HEAP:
... ...
@@ -324,18 +323,19 @@
324 323
        break;
325 324
      case IN_HEAP:
326 325
        break;
327 326
      }
328 327
    }
329 328

	
330
    /// \brief Replaces an item in the heap.
329
    /// \brief Replace an item in the heap.
331 330
    ///
332
    /// The \c i item is replaced with \c j item. The \c i item should
333
    /// be in the heap, while the \c j should be out of the heap. The
334
    /// \c i item will out of the heap and \c j will be in the heap
335
    /// with the same prioriority as prevoiusly the \c i item.
331
    /// This function replaces item \c i with item \c j.
332
    /// Item \c i must be in the heap, while \c j must be out of the heap.
333
    /// After calling this method, item \c i will be out of the
334
    /// heap and \c j will be in the heap with the same prioriority
335
    /// as item \c i had before.
336 336
    void replace(const Item& i, const Item& j) {
337 337
      int idx = _iim[i];
338 338
      _iim.set(i, _iim[j]);
339 339
      _iim.set(j, idx);
340 340
      _data[idx].first = j;
341 341
    }
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -67,13 +67,13 @@
67 67
    typedef ArrayMap Map;
68 68

	
69 69
    // The notifier type.
70 70
    typedef typename ItemSetTraits<_Graph, _Item>::ItemNotifier Notifier;
71 71

	
72 72
  private:
73
  
73

	
74 74
    // The MapBase of the Map which imlements the core regisitry function.
75 75
    typedef typename Notifier::ObserverBase Parent;
76 76

	
77 77
    typedef std::allocator<Value> Allocator;
78 78

	
79 79
  public:
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -154,13 +154,13 @@
154 154
  class DefaultMap
155 155
    : public DefaultMapSelector<_Graph, _Item, _Value>::Map {
156 156
    typedef typename DefaultMapSelector<_Graph, _Item, _Value>::Map Parent;
157 157

	
158 158
  public:
159 159
    typedef DefaultMap<_Graph, _Item, _Value> Map;
160
    
160

	
161 161
    typedef typename Parent::GraphType GraphType;
162 162
    typedef typename Parent::Value Value;
163 163

	
164 164
    explicit DefaultMap(const GraphType& graph) : Parent(graph) {}
165 165
    DefaultMap(const GraphType& graph, const Value& value)
166 166
      : Parent(graph, value) {}
Ignore white space 6 line context
1
/* -*- C++ -*-
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -60,17 +60,17 @@
60 60
    Arc fromId(int id, Arc) const {
61 61
      return Parent::arcFromId(id);
62 62
    }
63 63

	
64 64
    Node oppositeNode(const Node &n, const Arc &e) const {
65 65
      if (n == Parent::source(e))
66
	return Parent::target(e);
66
        return Parent::target(e);
67 67
      else if(n==Parent::target(e))
68
	return Parent::source(e);
68
        return Parent::source(e);
69 69
      else
70
	return INVALID;
70
        return INVALID;
71 71
    }
72 72

	
73 73

	
74 74
    // Alteration notifier extensions
75 75

	
76 76
    // The arc observer registry.
... ...
@@ -88,101 +88,101 @@
88 88
    ArcNotifier& notifier(Arc) const {
89 89
      return arc_notifier;
90 90
    }
91 91

	
92 92
    // Iterable extensions
93 93

	
94
    class NodeIt : public Node { 
94
    class NodeIt : public Node {
95 95
      const Digraph* digraph;
96 96
    public:
97 97

	
98 98
      NodeIt() {}
99 99

	
100 100
      NodeIt(Invalid i) : Node(i) { }
101 101

	
102 102
      explicit NodeIt(const Digraph& _graph) : digraph(&_graph) {
103
	_graph.first(static_cast<Node&>(*this));
103
        _graph.first(static_cast<Node&>(*this));
104 104
      }
105 105

	
106
      NodeIt(const Digraph& _graph, const Node& node) 
107
	: Node(node), digraph(&_graph) {}
106
      NodeIt(const Digraph& _graph, const Node& node)
107
        : Node(node), digraph(&_graph) {}
108 108

	
109
      NodeIt& operator++() { 
110
	digraph->next(*this);
111
	return *this; 
109
      NodeIt& operator++() {
110
        digraph->next(*this);
111
        return *this;
112 112
      }
113 113

	
114 114
    };
115 115

	
116 116

	
117
    class ArcIt : public Arc { 
117
    class ArcIt : public Arc {
118 118
      const Digraph* digraph;
119 119
    public:
120 120

	
121 121
      ArcIt() { }
122 122

	
123 123
      ArcIt(Invalid i) : Arc(i) { }
124 124

	
125 125
      explicit ArcIt(const Digraph& _graph) : digraph(&_graph) {
126
	_graph.first(static_cast<Arc&>(*this));
126
        _graph.first(static_cast<Arc&>(*this));
127 127
      }
128 128

	
129
      ArcIt(const Digraph& _graph, const Arc& e) : 
130
	Arc(e), digraph(&_graph) { }
129
      ArcIt(const Digraph& _graph, const Arc& e) :
130
        Arc(e), digraph(&_graph) { }
131 131

	
132
      ArcIt& operator++() { 
133
	digraph->next(*this);
134
	return *this; 
132
      ArcIt& operator++() {
133
        digraph->next(*this);
134
        return *this;
135 135
      }
136 136

	
137 137
    };
138 138

	
139 139

	
140
    class OutArcIt : public Arc { 
140
    class OutArcIt : public Arc {
141 141
      const Digraph* digraph;
142 142
    public:
143 143

	
144 144
      OutArcIt() { }
145 145

	
146 146
      OutArcIt(Invalid i) : Arc(i) { }
147 147

	
148
      OutArcIt(const Digraph& _graph, const Node& node) 
149
	: digraph(&_graph) {
150
	_graph.firstOut(*this, node);
148
      OutArcIt(const Digraph& _graph, const Node& node)
149
        : digraph(&_graph) {
150
        _graph.firstOut(*this, node);
151 151
      }
152 152

	
153
      OutArcIt(const Digraph& _graph, const Arc& arc) 
154
	: Arc(arc), digraph(&_graph) {}
153
      OutArcIt(const Digraph& _graph, const Arc& arc)
154
        : Arc(arc), digraph(&_graph) {}
155 155

	
156
      OutArcIt& operator++() { 
157
	digraph->nextOut(*this);
158
	return *this; 
156
      OutArcIt& operator++() {
157
        digraph->nextOut(*this);
158
        return *this;
159 159
      }
160 160

	
161 161
    };
162 162

	
163 163

	
164
    class InArcIt : public Arc { 
164
    class InArcIt : public Arc {
165 165
      const Digraph* digraph;
166 166
    public:
167 167

	
168 168
      InArcIt() { }
169 169

	
170 170
      InArcIt(Invalid i) : Arc(i) { }
171 171

	
172
      InArcIt(const Digraph& _graph, const Node& node) 
173
	: digraph(&_graph) {
174
	_graph.firstIn(*this, node);
172
      InArcIt(const Digraph& _graph, const Node& node)
173
        : digraph(&_graph) {
174
        _graph.firstIn(*this, node);
175 175
      }
176 176

	
177
      InArcIt(const Digraph& _graph, const Arc& arc) : 
178
	Arc(arc), digraph(&_graph) {}
177
      InArcIt(const Digraph& _graph, const Arc& arc) :
178
        Arc(arc), digraph(&_graph) {}
179 179

	
180
      InArcIt& operator++() { 
181
	digraph->nextIn(*this);
182
	return *this; 
180
      InArcIt& operator++() {
181
        digraph->nextIn(*this);
182
        return *this;
183 183
      }
184 184

	
185 185
    };
186 186

	
187 187
    // \brief Base node of the iterator
188 188
    //
... ...
@@ -212,45 +212,45 @@
212 212
      return Parent::source(static_cast<const Arc&>(e));
213 213
    }
214 214

	
215 215
    using Parent::first;
216 216

	
217 217
    // Mappable extension
218
    
218

	
219 219
    template <typename _Value>
220
    class ArcMap 
220
    class ArcMap
221 221
      : public MapExtender<DefaultMap<Digraph, Arc, _Value> > {
222 222
      typedef MapExtender<DefaultMap<Digraph, Arc, _Value> > Parent;
223 223

	
224 224
    public:
225
      explicit ArcMap(const Digraph& _g) 
226
	: Parent(_g) {}
227
      ArcMap(const Digraph& _g, const _Value& _v) 
228
	: Parent(_g, _v) {}
225
      explicit ArcMap(const Digraph& _g)
226
        : Parent(_g) {}
227
      ArcMap(const Digraph& _g, const _Value& _v)
228
        : Parent(_g, _v) {}
229 229

	
230 230
      ArcMap& operator=(const ArcMap& cmap) {
231
	return operator=<ArcMap>(cmap);
231
        return operator=<ArcMap>(cmap);
232 232
      }
233 233

	
234 234
      template <typename CMap>
235 235
      ArcMap& operator=(const CMap& cmap) {
236 236
        Parent::operator=(cmap);
237
	return *this;
237
        return *this;
238 238
      }
239 239

	
240 240
    };
241 241

	
242 242

	
243 243
    // Alteration extension
244 244

	
245 245
    Arc addArc(const Node& from, const Node& to) {
246 246
      Arc arc = Parent::addArc(from, to);
247 247
      notifier(Arc()).add(arc);
248 248
      return arc;
249 249
    }
250
    
250

	
251 251
    void clear() {
252 252
      notifier(Arc()).clear();
253 253
      Parent::clear();
254 254
    }
255 255

	
256 256
    void erase(const Arc& arc) {
... ...
@@ -309,17 +309,17 @@
309 309
    Edge fromId(int id, Edge) const {
310 310
      return Parent::edgeFromId(id);
311 311
    }
312 312

	
313 313
    Node oppositeNode(const Node &n, const Edge &e) const {
314 314
      if( n == Parent::u(e))
315
	return Parent::v(e);
315
        return Parent::v(e);
316 316
      else if( n == Parent::v(e))
317
	return Parent::u(e);
317
        return Parent::u(e);
318 318
      else
319
	return INVALID;
319
        return INVALID;
320 320
    }
321 321

	
322 322
    Arc oppositeArc(const Arc &e) const {
323 323
      return Parent::direct(e, !Parent::direction(e));
324 324
    }
325 325

	
... ...
@@ -337,134 +337,134 @@
337 337
    mutable ArcNotifier arc_notifier;
338 338
    mutable EdgeNotifier edge_notifier;
339 339

	
340 340
  public:
341 341

	
342 342
    using Parent::notifier;
343
    
343

	
344 344
    ArcNotifier& notifier(Arc) const {
345 345
      return arc_notifier;
346 346
    }
347 347

	
348 348
    EdgeNotifier& notifier(Edge) const {
349 349
      return edge_notifier;
350 350
    }
351 351

	
352 352

	
353
    class NodeIt : public Node { 
353
    class NodeIt : public Node {
354 354
      const Graph* graph;
355 355
    public:
356 356

	
357 357
      NodeIt() {}
358 358

	
359 359
      NodeIt(Invalid i) : Node(i) { }
360 360

	
361 361
      explicit NodeIt(const Graph& _graph) : graph(&_graph) {
362
	_graph.first(static_cast<Node&>(*this));
362
        _graph.first(static_cast<Node&>(*this));
363 363
      }
364 364

	
365
      NodeIt(const Graph& _graph, const Node& node) 
366
	: Node(node), graph(&_graph) {}
365
      NodeIt(const Graph& _graph, const Node& node)
366
        : Node(node), graph(&_graph) {}
367 367

	
368
      NodeIt& operator++() { 
369
	graph->next(*this);
370
	return *this; 
368
      NodeIt& operator++() {
369
        graph->next(*this);
370
        return *this;
371 371
      }
372 372

	
373 373
    };
374 374

	
375 375

	
376
    class ArcIt : public Arc { 
376
    class ArcIt : public Arc {
377 377
      const Graph* graph;
378 378
    public:
379 379

	
380 380
      ArcIt() { }
381 381

	
382 382
      ArcIt(Invalid i) : Arc(i) { }
383 383

	
384 384
      explicit ArcIt(const Graph& _graph) : graph(&_graph) {
385
	_graph.first(static_cast<Arc&>(*this));
385
        _graph.first(static_cast<Arc&>(*this));
386 386
      }
387 387

	
388
      ArcIt(const Graph& _graph, const Arc& e) : 
389
	Arc(e), graph(&_graph) { }
388
      ArcIt(const Graph& _graph, const Arc& e) :
389
        Arc(e), graph(&_graph) { }
390 390

	
391
      ArcIt& operator++() { 
392
	graph->next(*this);
393
	return *this; 
391
      ArcIt& operator++() {
392
        graph->next(*this);
393
        return *this;
394 394
      }
395 395

	
396 396
    };
397 397

	
398 398

	
399
    class OutArcIt : public Arc { 
399
    class OutArcIt : public Arc {
400 400
      const Graph* graph;
401 401
    public:
402 402

	
403 403
      OutArcIt() { }
404 404

	
405 405
      OutArcIt(Invalid i) : Arc(i) { }
406 406

	
407
      OutArcIt(const Graph& _graph, const Node& node) 
408
	: graph(&_graph) {
409
	_graph.firstOut(*this, node);
407
      OutArcIt(const Graph& _graph, const Node& node)
408
        : graph(&_graph) {
409
        _graph.firstOut(*this, node);
410 410
      }
411 411

	
412
      OutArcIt(const Graph& _graph, const Arc& arc) 
413
	: Arc(arc), graph(&_graph) {}
412
      OutArcIt(const Graph& _graph, const Arc& arc)
413
        : Arc(arc), graph(&_graph) {}
414 414

	
415
      OutArcIt& operator++() { 
416
	graph->nextOut(*this);
417
	return *this; 
415
      OutArcIt& operator++() {
416
        graph->nextOut(*this);
417
        return *this;
418 418
      }
419 419

	
420 420
    };
421 421

	
422 422

	
423
    class InArcIt : public Arc { 
423
    class InArcIt : public Arc {
424 424
      const Graph* graph;
425 425
    public:
426 426

	
427 427
      InArcIt() { }
428 428

	
429 429
      InArcIt(Invalid i) : Arc(i) { }
430 430

	
431
      InArcIt(const Graph& _graph, const Node& node) 
432
	: graph(&_graph) {
433
	_graph.firstIn(*this, node);
431
      InArcIt(const Graph& _graph, const Node& node)
432
        : graph(&_graph) {
433
        _graph.firstIn(*this, node);
434 434
      }
435 435

	
436
      InArcIt(const Graph& _graph, const Arc& arc) : 
437
	Arc(arc), graph(&_graph) {}
436
      InArcIt(const Graph& _graph, const Arc& arc) :
437
        Arc(arc), graph(&_graph) {}
438 438

	
439
      InArcIt& operator++() { 
440
	graph->nextIn(*this);
441
	return *this; 
439
      InArcIt& operator++() {
440
        graph->nextIn(*this);
441
        return *this;
442 442
      }
443 443

	
444 444
    };
445 445

	
446 446

	
447
    class EdgeIt : public Parent::Edge { 
447
    class EdgeIt : public Parent::Edge {
448 448
      const Graph* graph;
449 449
    public:
450 450

	
451 451
      EdgeIt() { }
452 452

	
453 453
      EdgeIt(Invalid i) : Edge(i) { }
454 454

	
455 455
      explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
456
	_graph.first(static_cast<Edge&>(*this));
456
        _graph.first(static_cast<Edge&>(*this));
457 457
      }
458 458

	
459
      EdgeIt(const Graph& _graph, const Edge& e) : 
460
	Edge(e), graph(&_graph) { }
459
      EdgeIt(const Graph& _graph, const Edge& e) :
460
        Edge(e), graph(&_graph) { }
461 461

	
462
      EdgeIt& operator++() { 
463
	graph->next(*this);
464
	return *this; 
462
      EdgeIt& operator++() {
463
        graph->next(*this);
464
        return *this;
465 465
      }
466 466

	
467 467
    };
468 468

	
469 469
    class IncEdgeIt : public Parent::Edge {
470 470
      friend class EdgeSetExtender;
... ...
@@ -474,23 +474,23 @@
474 474

	
475 475
      IncEdgeIt() { }
476 476

	
477 477
      IncEdgeIt(Invalid i) : Edge(i), direction(false) { }
478 478

	
479 479
      IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) {
480
	_graph.firstInc(*this, direction, n);
480
        _graph.firstInc(*this, direction, n);
481 481
      }
482 482

	
483 483
      IncEdgeIt(const Graph& _graph, const Edge &ue, const Node &n)
484
	: graph(&_graph), Edge(ue) {
485
	direction = (_graph.source(ue) == n);
484
        : graph(&_graph), Edge(ue) {
485
        direction = (_graph.source(ue) == n);
486 486
      }
487 487

	
488 488
      IncEdgeIt& operator++() {
489
	graph->nextInc(*this, direction);
490
	return *this; 
489
        graph->nextInc(*this, direction);
490
        return *this;
491 491
      }
492 492
    };
493 493

	
494 494
    // \brief Base node of the iterator
495 495
    //
496 496
    // Returns the base node (ie. the source in this case) of the iterator
... ...
@@ -531,55 +531,55 @@
531 531
    Node runningNode(const IncEdgeIt &e) const {
532 532
      return e.direction ? v(e) : u(e);
533 533
    }
534 534

	
535 535

	
536 536
    template <typename _Value>
537
    class ArcMap 
537
    class ArcMap
538 538
      : public MapExtender<DefaultMap<Graph, Arc, _Value> > {
539 539
      typedef MapExtender<DefaultMap<Graph, Arc, _Value> > Parent;
540 540

	
541 541
    public:
542
      explicit ArcMap(const Graph& _g) 
543
	: Parent(_g) {}
544
      ArcMap(const Graph& _g, const _Value& _v) 
545
	: Parent(_g, _v) {}
542
      explicit ArcMap(const Graph& _g)
543
        : Parent(_g) {}
544
      ArcMap(const Graph& _g, const _Value& _v)
545
        : Parent(_g, _v) {}
546 546

	
547 547
      ArcMap& operator=(const ArcMap& cmap) {
548
	return operator=<ArcMap>(cmap);
548
        return operator=<ArcMap>(cmap);
549 549
      }
550 550

	
551 551
      template <typename CMap>
552 552
      ArcMap& operator=(const CMap& cmap) {
553 553
        Parent::operator=(cmap);
554
	return *this;
554
        return *this;
555 555
      }
556 556

	
557 557
    };
558 558

	
559 559

	
560 560
    template <typename _Value>
561
    class EdgeMap 
561
    class EdgeMap
562 562
      : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
563 563
      typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
564 564

	
565 565
    public:
566
      explicit EdgeMap(const Graph& _g) 
567
	: Parent(_g) {}
566
      explicit EdgeMap(const Graph& _g)
567
        : Parent(_g) {}
568 568

	
569
      EdgeMap(const Graph& _g, const _Value& _v) 
570
	: Parent(_g, _v) {}
569
      EdgeMap(const Graph& _g, const _Value& _v)
570
        : Parent(_g, _v) {}
571 571

	
572 572
      EdgeMap& operator=(const EdgeMap& cmap) {
573
	return operator=<EdgeMap>(cmap);
573
        return operator=<EdgeMap>(cmap);
574 574
      }
575 575

	
576 576
      template <typename CMap>
577 577
      EdgeMap& operator=(const CMap& cmap) {
578 578
        Parent::operator=(cmap);
579
	return *this;
579
        return *this;
580 580
      }
581 581

	
582 582
    };
583 583

	
584 584

	
585 585
    // Alteration extension
... ...
@@ -590,13 +590,13 @@
590 590
      std::vector<Arc> arcs;
591 591
      arcs.push_back(Parent::direct(edge, true));
592 592
      arcs.push_back(Parent::direct(edge, false));
593 593
      notifier(Arc()).add(arcs);
594 594
      return edge;
595 595
    }
596
    
596

	
597 597
    void clear() {
598 598
      notifier(Arc()).clear();
599 599
      notifier(Edge()).clear();
600 600
      Parent::clear();
601 601
    }
602 602

	
... ...
@@ -616,12 +616,12 @@
616 616
    }
617 617

	
618 618
    ~EdgeSetExtender() {
619 619
      edge_notifier.clear();
620 620
      arc_notifier.clear();
621 621
    }
622
    
622

	
623 623
  };
624 624

	
625 625
}
626 626

	
627 627
#endif
Ignore white space 6 line context
... ...
@@ -53,17 +53,17 @@
53 53
    }
54 54

	
55 55
    int maxId(Arc) const {
56 56
      return Parent::maxArcId();
57 57
    }
58 58

	
59
    Node fromId(int id, Node) const {
59
    static Node fromId(int id, Node) {
60 60
      return Parent::nodeFromId(id);
61 61
    }
62 62

	
63
    Arc fromId(int id, Arc) const {
63
    static Arc fromId(int id, Arc) {
64 64
      return Parent::arcFromId(id);
65 65
    }
66 66

	
67 67
    Node oppositeNode(const Node &node, const Arc &arc) const {
68 68
      if (node == Parent::source(arc))
69 69
        return Parent::target(arc);
... ...
@@ -352,21 +352,21 @@
352 352
    }
353 353

	
354 354
    int maxId(Edge) const {
355 355
      return Parent::maxEdgeId();
356 356
    }
357 357

	
358
    Node fromId(int id, Node) const {
358
    static Node fromId(int id, Node) {
359 359
      return Parent::nodeFromId(id);
360 360
    }
361 361

	
362
    Arc fromId(int id, Arc) const {
362
    static Arc fromId(int id, Arc) {
363 363
      return Parent::arcFromId(id);
364 364
    }
365 365

	
366
    Edge fromId(int id, Edge) const {
366
    static Edge fromId(int id, Edge) {
367 367
      return Parent::edgeFromId(id);
368 368
    }
369 369

	
370 370
    Node oppositeNode(const Node &n, const Edge &e) const {
371 371
      if( n == Parent::u(e))
372 372
        return Parent::v(e);
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -95,13 +95,13 @@
95 95
    {
96 96
      std::ostringstream os;
97 97
#ifdef WIN32
98 98
      SYSTEMTIME time;
99 99
      GetSystemTime(&time);
100 100
      char buf1[11], buf2[9], buf3[5];
101
	  if (GetDateFormat(MY_LOCALE, 0, &time,
101
          if (GetDateFormat(MY_LOCALE, 0, &time,
102 102
                        ("ddd MMM dd"), buf1, 11) &&
103 103
          GetTimeFormat(MY_LOCALE, 0, &time,
104 104
                        ("HH':'mm':'ss"), buf2, 9) &&
105 105
          GetDateFormat(MY_LOCALE, 0, &time,
106 106
                        ("yyyy"), buf3, 5)) {
107 107
        os << buf1 << ' ' << buf2 << ' ' << buf3;
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -16,15 +16,15 @@
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BUCKET_HEAP_H
20 20
#define LEMON_BUCKET_HEAP_H
21 21

	
22
///\ingroup auxdat
22
///\ingroup heaps
23 23
///\file
24
///\brief Bucket Heap implementation.
24
///\brief Bucket heap implementation.
25 25

	
26 26
#include <vector>
27 27
#include <utility>
28 28
#include <functional>
29 29

	
30 30
namespace lemon {
... ...
@@ -50,94 +50,102 @@
50 50
        --value;
51 51
      }
52 52
    };
53 53

	
54 54
  }
55 55

	
56
  /// \ingroup auxdat
56
  /// \ingroup heaps
57 57
  ///
58
  /// \brief A Bucket Heap implementation.
58
  /// \brief Bucket heap data structure.
59 59
  ///
60
  /// This class implements the \e bucket \e heap data structure. A \e heap
61
  /// is a data structure for storing items with specified values called \e
62
  /// priorities in such a way that finding the item with minimum priority is
63
  /// efficient. The bucket heap is very simple implementation, it can store
64
  /// only integer priorities and it stores for each priority in the
65
  /// \f$ [0..C) \f$ range a list of items. So it should be used only when
66
  /// the priorities are small. It is not intended to use as dijkstra heap.
60
  /// This class implements the \e bucket \e heap data structure.
61
  /// It practically conforms to the \ref concepts::Heap "heap concept",
62
  /// but it has some limitations.
67 63
  ///
68
  /// \param IM A read and write Item int map, used internally
69
  /// to handle the cross references.
70
  /// \param MIN If the given parameter is false then instead of the
71
  /// minimum value the maximum can be retrivied with the top() and
72
  /// prio() member functions.
64
  /// The bucket heap is a very simple structure. It can store only
65
  /// \c int priorities and it maintains a list of items for each priority
66
  /// in the range <tt>[0..C)</tt>. So it should only be used when the
67
  /// priorities are small. It is not intended to use as a Dijkstra heap.
68
  ///
69
  /// \tparam IM A read-writable item map with \c int values, used
70
  /// internally to handle the cross references.
71
  /// \tparam MIN Indicate if the heap is a \e min-heap or a \e max-heap.
72
  /// The default is \e min-heap. If this parameter is set to \c false,
73
  /// then the comparison is reversed, so the top(), prio() and pop()
74
  /// functions deal with the item having maximum priority instead of the
75
  /// minimum.
76
  ///
77
  /// \sa SimpleBucketHeap
73 78
  template <typename IM, bool MIN = true>
74 79
  class BucketHeap {
75 80

	
76 81
  public:
77
    /// \e
78
    typedef typename IM::Key Item;
79
    /// \e
82

	
83
    /// Type of the item-int map.
84
    typedef IM ItemIntMap;
85
    /// Type of the priorities.
80 86
    typedef int Prio;
81
    /// \e
82
    typedef std::pair<Item, Prio> Pair;
83
    /// \e
84
    typedef IM ItemIntMap;
87
    /// Type of the items stored in the heap.
88
    typedef typename ItemIntMap::Key Item;
89
    /// Type of the item-priority pairs.
90
    typedef std::pair<Item,Prio> Pair;
85 91

	
86 92
  private:
87 93

	
88 94
    typedef _bucket_heap_bits::DirectionTraits<MIN> Direction;
89 95

	
90 96
  public:
91 97

	
92
    /// \brief Type to represent the items states.
98
    /// \brief Type to represent the states of the items.
93 99
    ///
94
    /// Each Item element have a state associated to it. It may be "in heap",
95
    /// "pre heap" or "post heap". The latter two are indifferent from the
100
    /// Each item has a state associated to it. It can be "in heap",
101
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
96 102
    /// heap's point of view, but may be useful to the user.
97 103
    ///
98 104
    /// The item-int map must be initialized in such way that it assigns
99 105
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
100 106
    enum State {
101 107
      IN_HEAP = 0,    ///< = 0.
102 108
      PRE_HEAP = -1,  ///< = -1.
103 109
      POST_HEAP = -2  ///< = -2.
104 110
    };
105 111

	
106 112
  public:
107
    /// \brief The constructor.
113

	
114
    /// \brief Constructor.
108 115
    ///
109
    /// The constructor.
110
    /// \param map should be given to the constructor, since it is used
111
    /// internally to handle the cross references. The value of the map
112
    /// should be PRE_HEAP (-1) for each element.
116
    /// Constructor.
117
    /// \param map A map that assigns \c int values to the items.
118
    /// It is used internally to handle the cross references.
119
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
113 120
    explicit BucketHeap(ItemIntMap &map) : _iim(map), _minimum(0) {}
114 121

	
115
    /// The number of items stored in the heap.
122
    /// \brief The number of items stored in the heap.
116 123
    ///
117
    /// \brief Returns the number of items stored in the heap.
124
    /// This function returns the number of items stored in the heap.
118 125
    int size() const { return _data.size(); }
119 126

	
120
    /// \brief Checks if the heap stores no items.
127
    /// \brief Check if the heap is empty.
121 128
    ///
122
    /// Returns \c true if and only if the heap stores no items.
129
    /// This function returns \c true if the heap is empty.
123 130
    bool empty() const { return _data.empty(); }
124 131

	
125
    /// \brief Make empty this heap.
132
    /// \brief Make the heap empty.
126 133
    ///
127
    /// Make empty this heap. It does not change the cross reference
128
    /// map.  If you want to reuse a heap what is not surely empty you
129
    /// should first clear the heap and after that you should set the
130
    /// cross reference map for each item to \c PRE_HEAP.
134
    /// This functon makes the heap empty.
135
    /// It does not change the cross reference map. If you want to reuse
136
    /// a heap that is not surely empty, you should first clear it and
137
    /// then you should set the cross reference map to \c PRE_HEAP
138
    /// for each item.
131 139
    void clear() {
132 140
      _data.clear(); _first.clear(); _minimum = 0;
133 141
    }
134 142

	
135 143
  private:
136 144

	
137
    void relocate_last(int idx) {
145
    void relocateLast(int idx) {
138 146
      if (idx + 1 < int(_data.size())) {
139 147
        _data[idx] = _data.back();
140 148
        if (_data[idx].prev != -1) {
141 149
          _data[_data[idx].prev].next = idx;
142 150
        } else {
143 151
          _first[_data[idx].value] = idx;
... ...
@@ -171,99 +179,105 @@
171 179
      }
172 180
      _first[_data[idx].value] = idx;
173 181
      _data[idx].prev = -1;
174 182
    }
175 183

	
176 184
  public:
185

	
177 186
    /// \brief Insert a pair of item and priority into the heap.
178 187
    ///
179
    /// Adds \c p.first to the heap with priority \c p.second.
188
    /// This function inserts \c p.first to the heap with priority
189
    /// \c p.second.
180 190
    /// \param p The pair to insert.
191
    /// \pre \c p.first must not be stored in the heap.
181 192
    void push(const Pair& p) {
182 193
      push(p.first, p.second);
183 194
    }
184 195

	
185 196
    /// \brief Insert an item into the heap with the given priority.
186 197
    ///
187
    /// Adds \c i to the heap with priority \c p.
198
    /// This function inserts the given item into the heap with the
199
    /// given priority.
188 200
    /// \param i The item to insert.
189 201
    /// \param p The priority of the item.
202
    /// \pre \e i must not be stored in the heap.
190 203
    void push(const Item &i, const Prio &p) {
191 204
      int idx = _data.size();
192 205
      _iim[i] = idx;
193 206
      _data.push_back(BucketItem(i, p));
194 207
      lace(idx);
195 208
      if (Direction::less(p, _minimum)) {
196 209
        _minimum = p;
197 210
      }
198 211
    }
199 212

	
200
    /// \brief Returns the item with minimum priority.
213
    /// \brief Return the item having minimum priority.
201 214
    ///
202
    /// This method returns the item with minimum priority.
203
    /// \pre The heap must be nonempty.
215
    /// This function returns the item having minimum priority.
216
    /// \pre The heap must be non-empty.
204 217
    Item top() const {
205 218
      while (_first[_minimum] == -1) {
206 219
        Direction::increase(_minimum);
207 220
      }
208 221
      return _data[_first[_minimum]].item;
209 222
    }
210 223

	
211
    /// \brief Returns the minimum priority.
224
    /// \brief The minimum priority.
212 225
    ///
213
    /// It returns the minimum priority.
214
    /// \pre The heap must be nonempty.
226
    /// This function returns the minimum priority.
227
    /// \pre The heap must be non-empty.
215 228
    Prio prio() const {
216 229
      while (_first[_minimum] == -1) {
217 230
        Direction::increase(_minimum);
218 231
      }
219 232
      return _minimum;
220 233
    }
221 234

	
222
    /// \brief Deletes the item with minimum priority.
235
    /// \brief Remove the item having minimum priority.
223 236
    ///
224
    /// This method deletes the item with minimum priority from the heap.
237
    /// This function removes the item having minimum priority.
225 238
    /// \pre The heap must be non-empty.
226 239
    void pop() {
227 240
      while (_first[_minimum] == -1) {
228 241
        Direction::increase(_minimum);
229 242
      }
230 243
      int idx = _first[_minimum];
231 244
      _iim[_data[idx].item] = -2;
232 245
      unlace(idx);
233
      relocate_last(idx);
246
      relocateLast(idx);
234 247
    }
235 248

	
236
    /// \brief Deletes \c i from the heap.
249
    /// \brief Remove the given item from the heap.
237 250
    ///
238
    /// This method deletes item \c i from the heap, if \c i was
239
    /// already stored in the heap.
240
    /// \param i The item to erase.
251
    /// This function removes the given item from the heap if it is
252
    /// already stored.
253
    /// \param i The item to delete.
254
    /// \pre \e i must be in the heap.
241 255
    void erase(const Item &i) {
242 256
      int idx = _iim[i];
243 257
      _iim[_data[idx].item] = -2;
244 258
      unlace(idx);
245
      relocate_last(idx);
259
      relocateLast(idx);
246 260
    }
247 261

	
248

	
249
    /// \brief Returns the priority of \c i.
262
    /// \brief The priority of the given item.
250 263
    ///
251
    /// This function returns the priority of item \c i.
252
    /// \pre \c i must be in the heap.
264
    /// This function returns the priority of the given item.
253 265
    /// \param i The item.
266
    /// \pre \e i must be in the heap.
254 267
    Prio operator[](const Item &i) const {
255 268
      int idx = _iim[i];
256 269
      return _data[idx].value;
257 270
    }
258 271

	
259
    /// \brief \c i gets to the heap with priority \c p independently
260
    /// if \c i was already there.
272
    /// \brief Set the priority of an item or insert it, if it is
273
    /// not stored in the heap.
261 274
    ///
262
    /// This method calls \ref push(\c i, \c p) if \c i is not stored
263
    /// in the heap and sets the priority of \c i to \c p otherwise.
275
    /// This method sets the priority of the given item if it is
276
    /// already stored in the heap. Otherwise it inserts the given
277
    /// item into the heap with the given priority.
264 278
    /// \param i The item.
265 279
    /// \param p The priority.
266 280
    void set(const Item &i, const Prio &p) {
267 281
      int idx = _iim[i];
268 282
      if (idx < 0) {
269 283
        push(i, p);
... ...
@@ -271,62 +285,60 @@
271 285
        decrease(i, p);
272 286
      } else {
273 287
        increase(i, p);
274 288
      }
275 289
    }
276 290

	
277
    /// \brief Decreases the priority of \c i to \c p.
291
    /// \brief Decrease the priority of an item to the given value.
278 292
    ///
279
    /// This method decreases the priority of item \c i to \c p.
280
    /// \pre \c i must be stored in the heap with priority at least \c
281
    /// p relative to \c Compare.
293
    /// This function decreases the priority of an item to the given value.
282 294
    /// \param i The item.
283 295
    /// \param p The priority.
296
    /// \pre \e i must be stored in the heap with priority at least \e p.
284 297
    void decrease(const Item &i, const Prio &p) {
285 298
      int idx = _iim[i];
286 299
      unlace(idx);
287 300
      _data[idx].value = p;
288 301
      if (Direction::less(p, _minimum)) {
289 302
        _minimum = p;
290 303
      }
291 304
      lace(idx);
292 305
    }
293 306

	
294
    /// \brief Increases the priority of \c i to \c p.
307
    /// \brief Increase the priority of an item to the given value.
295 308
    ///
296
    /// This method sets the priority of item \c i to \c p.
297
    /// \pre \c i must be stored in the heap with priority at most \c
298
    /// p relative to \c Compare.
309
    /// This function increases the priority of an item to the given value.
299 310
    /// \param i The item.
300 311
    /// \param p The priority.
312
    /// \pre \e i must be stored in the heap with priority at most \e p.
301 313
    void increase(const Item &i, const Prio &p) {
302 314
      int idx = _iim[i];
303 315
      unlace(idx);
304 316
      _data[idx].value = p;
305 317
      lace(idx);
306 318
    }
307 319

	
308
    /// \brief Returns if \c item is in, has already been in, or has
309
    /// never been in the heap.
320
    /// \brief Return the state of an item.
310 321
    ///
311
    /// This method returns PRE_HEAP if \c item has never been in the
312
    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
313
    /// otherwise. In the latter case it is possible that \c item will
314
    /// get back to the heap again.
322
    /// This method returns \c PRE_HEAP if the given item has never
323
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
324
    /// and \c POST_HEAP otherwise.
325
    /// In the latter case it is possible that the item will get back
326
    /// to the heap again.
315 327
    /// \param i The item.
316 328
    State state(const Item &i) const {
317 329
      int idx = _iim[i];
318 330
      if (idx >= 0) idx = 0;
319 331
      return State(idx);
320 332
    }
321 333

	
322
    /// \brief Sets the state of the \c item in the heap.
334
    /// \brief Set the state of an item in the heap.
323 335
    ///
324
    /// Sets the state of the \c item in the heap. It can be used to
325
    /// manually clear the heap when it is important to achive the
326
    /// better time complexity.
336
    /// This function sets the state of the given item in the heap.
337
    /// It can be used to manually clear the heap when it is important
338
    /// to achive better time complexity.
327 339
    /// \param i The item.
328 340
    /// \param st The state. It should not be \c IN_HEAP.
329 341
    void state(const Item& i, State st) {
330 342
      switch (st) {
331 343
      case POST_HEAP:
332 344
      case PRE_HEAP:
... ...
@@ -356,104 +368,120 @@
356 368
    std::vector<int> _first;
357 369
    std::vector<BucketItem> _data;
358 370
    mutable int _minimum;
359 371

	
360 372
  }; // class BucketHeap
361 373

	
362
  /// \ingroup auxdat
374
  /// \ingroup heaps
363 375
  ///
364
  /// \brief A Simplified Bucket Heap implementation.
376
  /// \brief Simplified bucket heap data structure.
365 377
  ///
366 378
  /// This class implements a simplified \e bucket \e heap data
367
  /// structure.  It does not provide some functionality but it faster
368
  /// and simplier data structure than the BucketHeap. The main
369
  /// difference is that the BucketHeap stores for every key a double
370
  /// linked list while this class stores just simple lists. In the
371
  /// other way it does not support erasing each elements just the
372
  /// minimal and it does not supports key increasing, decreasing.
379
  /// structure. It does not provide some functionality, but it is
380
  /// faster and simpler than BucketHeap. The main difference is
381
  /// that BucketHeap stores a doubly-linked list for each key while
382
  /// this class stores only simply-linked lists. It supports erasing
383
  /// only for the item having minimum priority and it does not support
384
  /// key increasing and decreasing.
373 385
  ///
374
  /// \param IM A read and write Item int map, used internally
375
  /// to handle the cross references.
376
  /// \param MIN If the given parameter is false then instead of the
377
  /// minimum value the maximum can be retrivied with the top() and
378
  /// prio() member functions.
386
  /// Note that this implementation does not conform to the
387
  /// \ref concepts::Heap "heap concept" due to the lack of some
388
  /// functionality.
389
  ///
390
  /// \tparam IM A read-writable item map with \c int values, used
391
  /// internally to handle the cross references.
392
  /// \tparam MIN Indicate if the heap is a \e min-heap or a \e max-heap.
393
  /// The default is \e min-heap. If this parameter is set to \c false,
394
  /// then the comparison is reversed, so the top(), prio() and pop()
395
  /// functions deal with the item having maximum priority instead of the
396
  /// minimum.
379 397
  ///
380 398
  /// \sa BucketHeap
381 399
  template <typename IM, bool MIN = true >
382 400
  class SimpleBucketHeap {
383 401

	
384 402
  public:
385
    typedef typename IM::Key Item;
403

	
404
    /// Type of the item-int map.
405
    typedef IM ItemIntMap;
406
    /// Type of the priorities.
386 407
    typedef int Prio;
387
    typedef std::pair<Item, Prio> Pair;
388
    typedef IM ItemIntMap;
408
    /// Type of the items stored in the heap.
409
    typedef typename ItemIntMap::Key Item;
410
    /// Type of the item-priority pairs.
411
    typedef std::pair<Item,Prio> Pair;
389 412

	
390 413
  private:
391 414

	
392 415
    typedef _bucket_heap_bits::DirectionTraits<MIN> Direction;
393 416

	
394 417
  public:
395 418

	
396
    /// \brief Type to represent the items states.
419
    /// \brief Type to represent the states of the items.
397 420
    ///
398
    /// Each Item element have a state associated to it. It may be "in heap",
399
    /// "pre heap" or "post heap". The latter two are indifferent from the
421
    /// Each item has a state associated to it. It can be "in heap",
422
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
400 423
    /// heap's point of view, but may be useful to the user.
401 424
    ///
402 425
    /// The item-int map must be initialized in such way that it assigns
403 426
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
404 427
    enum State {
405 428
      IN_HEAP = 0,    ///< = 0.
406 429
      PRE_HEAP = -1,  ///< = -1.
407 430
      POST_HEAP = -2  ///< = -2.
408 431
    };
409 432

	
410 433
  public:
411 434

	
412
    /// \brief The constructor.
435
    /// \brief Constructor.
413 436
    ///
414
    /// The constructor.
415
    /// \param map should be given to the constructor, since it is used
416
    /// internally to handle the cross references. The value of the map
417
    /// should be PRE_HEAP (-1) for each element.
437
    /// Constructor.
438
    /// \param map A map that assigns \c int values to the items.
439
    /// It is used internally to handle the cross references.
440
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
418 441
    explicit SimpleBucketHeap(ItemIntMap &map)
419 442
      : _iim(map), _free(-1), _num(0), _minimum(0) {}
420 443

	
421
    /// \brief Returns the number of items stored in the heap.
444
    /// \brief The number of items stored in the heap.
422 445
    ///
423
    /// The number of items stored in the heap.
446
    /// This function returns the number of items stored in the heap.
424 447
    int size() const { return _num; }
425 448

	
426
    /// \brief Checks if the heap stores no items.
449
    /// \brief Check if the heap is empty.
427 450
    ///
428
    /// Returns \c true if and only if the heap stores no items.
451
    /// This function returns \c true if the heap is empty.
429 452
    bool empty() const { return _num == 0; }
430 453

	
431
    /// \brief Make empty this heap.
454
    /// \brief Make the heap empty.
432 455
    ///
433
    /// Make empty this heap. It does not change the cross reference
434
    /// map.  If you want to reuse a heap what is not surely empty you
435
    /// should first clear the heap and after that you should set the
436
    /// cross reference map for each item to \c PRE_HEAP.
456
    /// This functon makes the heap empty.
457
    /// It does not change the cross reference map. If you want to reuse
458
    /// a heap that is not surely empty, you should first clear it and
459
    /// then you should set the cross reference map to \c PRE_HEAP
460
    /// for each item.
437 461
    void clear() {
438 462
      _data.clear(); _first.clear(); _free = -1; _num = 0; _minimum = 0;
439 463
    }
440 464

	
441 465
    /// \brief Insert a pair of item and priority into the heap.
442 466
    ///
443
    /// Adds \c p.first to the heap with priority \c p.second.
467
    /// This function inserts \c p.first to the heap with priority
468
    /// \c p.second.
444 469
    /// \param p The pair to insert.
470
    /// \pre \c p.first must not be stored in the heap.
445 471
    void push(const Pair& p) {
446 472
      push(p.first, p.second);
447 473
    }
448 474

	
449 475
    /// \brief Insert an item into the heap with the given priority.
450 476
    ///
451
    /// Adds \c i to the heap with priority \c p.
477
    /// This function inserts the given item into the heap with the
478
    /// given priority.
452 479
    /// \param i The item to insert.
453 480
    /// \param p The priority of the item.
481
    /// \pre \e i must not be stored in the heap.
454 482
    void push(const Item &i, const Prio &p) {
455 483
      int idx;
456 484
      if (_free == -1) {
457 485
        idx = _data.size();
458 486
        _data.push_back(BucketItem(i));
459 487
      } else {
... ...
@@ -468,37 +496,37 @@
468 496
      if (Direction::less(p, _minimum)) {
469 497
        _minimum = p;
470 498
      }
471 499
      ++_num;
472 500
    }
473 501

	
474
    /// \brief Returns the item with minimum priority.
502
    /// \brief Return the item having minimum priority.
475 503
    ///
476
    /// This method returns the item with minimum priority.
477
    /// \pre The heap must be nonempty.
504
    /// This function returns the item having minimum priority.
505
    /// \pre The heap must be non-empty.
478 506
    Item top() const {
479 507
      while (_first[_minimum] == -1) {
480 508
        Direction::increase(_minimum);
481 509
      }
482 510
      return _data[_first[_minimum]].item;
483 511
    }
484 512

	
485
    /// \brief Returns the minimum priority.
513
    /// \brief The minimum priority.
486 514
    ///
487
    /// It returns the minimum priority.
488
    /// \pre The heap must be nonempty.
515
    /// This function returns the minimum priority.
516
    /// \pre The heap must be non-empty.
489 517
    Prio prio() const {
490 518
      while (_first[_minimum] == -1) {
491 519
        Direction::increase(_minimum);
492 520
      }
493 521
      return _minimum;
494 522
    }
495 523

	
496
    /// \brief Deletes the item with minimum priority.
524
    /// \brief Remove the item having minimum priority.
497 525
    ///
498
    /// This method deletes the item with minimum priority from the heap.
526
    /// This function removes the item having minimum priority.
499 527
    /// \pre The heap must be non-empty.
500 528
    void pop() {
501 529
      while (_first[_minimum] == -1) {
502 530
        Direction::increase(_minimum);
503 531
      }
504 532
      int idx = _first[_minimum];
... ...
@@ -506,40 +534,39 @@
506 534
      _first[_minimum] = _data[idx].next;
507 535
      _data[idx].next = _free;
508 536
      _free = idx;
509 537
      --_num;
510 538
    }
511 539

	
512
    /// \brief Returns the priority of \c i.
540
    /// \brief The priority of the given item.
513 541
    ///
514
    /// This function returns the priority of item \c i.
515
    /// \warning This operator is not a constant time function
516
    /// because it scans the whole data structure to find the proper
517
    /// value.
518
    /// \pre \c i must be in the heap.
542
    /// This function returns the priority of the given item.
519 543
    /// \param i The item.
544
    /// \pre \e i must be in the heap.
545
    /// \warning This operator is not a constant time function because
546
    /// it scans the whole data structure to find the proper value.
520 547
    Prio operator[](const Item &i) const {
521
      for (int k = 0; k < _first.size(); ++k) {
548
      for (int k = 0; k < int(_first.size()); ++k) {
522 549
        int idx = _first[k];
523 550
        while (idx != -1) {
524 551
          if (_data[idx].item == i) {
525 552
            return k;
526 553
          }
527 554
          idx = _data[idx].next;
528 555
        }
529 556
      }
530 557
      return -1;
531 558
    }
532 559

	
533
    /// \brief Returns if \c item is in, has already been in, or has
534
    /// never been in the heap.
560
    /// \brief Return the state of an item.
535 561
    ///
536
    /// This method returns PRE_HEAP if \c item has never been in the
537
    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
538
    /// otherwise. In the latter case it is possible that \c item will
539
    /// get back to the heap again.
562
    /// This method returns \c PRE_HEAP if the given item has never
563
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
564
    /// and \c POST_HEAP otherwise.
565
    /// In the latter case it is possible that the item will get back
566
    /// to the heap again.
540 567
    /// \param i The item.
541 568
    State state(const Item &i) const {
542 569
      int idx = _iim[i];
543 570
      if (idx >= 0) idx = 0;
544 571
      return State(idx);
545 572
    }
Ignore white space 6 line context
... ...
@@ -91,12 +91,24 @@
91 91

	
92 92
  int CbcMip::_addRow() {
93 93
    _prob->addRow(0, 0, 0, -COIN_DBL_MAX, COIN_DBL_MAX);
94 94
    return _prob->numberRows() - 1;
95 95
  }
96 96

	
97
  int CbcMip::_addRow(Value l, ExprIterator b, ExprIterator e, Value u) {
98
    std::vector<int> indexes;
99
    std::vector<Value> values;
100

	
101
    for(ExprIterator it = b; it != e; ++it) {
102
      indexes.push_back(it->first);
103
      values.push_back(it->second);
104
    }
105

	
106
    _prob->addRow(values.size(), &indexes.front(), &values.front(), l, u);
107
    return _prob->numberRows() - 1;
108
  }
97 109

	
98 110
  void CbcMip::_eraseCol(int i) {
99 111
    _prob->deleteColumn(i);
100 112
  }
101 113

	
102 114
  void CbcMip::_eraseRow(int i) {
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -59,12 +59,13 @@
59 59
  protected:
60 60

	
61 61
    virtual const char* _solverName() const;
62 62

	
63 63
    virtual int _addCol();
64 64
    virtual int _addRow();
65
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
65 66

	
66 67
    virtual void _eraseCol(int i);
67 68
    virtual void _eraseRow(int i);
68 69

	
69 70
    virtual void _eraseColId(int i);
70 71
    virtual void _eraseRowId(int i);
... ...
@@ -117,13 +118,13 @@
117 118

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

	
121 122
    int _message_level;
122 123

	
123
    
124

	
124 125

	
125 126
  };
126 127

	
127 128
}
128 129

	
129 130
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -56,26 +56,30 @@
56 56
    /// on the arcs.
57 57
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
58 58
    typedef UM UpperMap;
59 59

	
60 60
    /// \brief The type of supply map.
61 61
    ///
62
    /// The type of the map that stores the signed supply values of the 
63
    /// nodes. 
62
    /// The type of the map that stores the signed supply values of the
63
    /// nodes.
64 64
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
65 65
    typedef SM SupplyMap;
66 66

	
67 67
    /// \brief The type of the flow and supply values.
68 68
    typedef typename SupplyMap::Value Value;
69 69

	
70 70
    /// \brief The type of the map that stores the flow values.
71 71
    ///
72 72
    /// The type of the map that stores the flow values.
73 73
    /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap"
74 74
    /// concept.
75
#ifdef DOXYGEN
76
    typedef GR::ArcMap<Value> FlowMap;
77
#else
75 78
    typedef typename Digraph::template ArcMap<Value> FlowMap;
79
#endif
76 80

	
77 81
    /// \brief Instantiates a FlowMap.
78 82
    ///
79 83
    /// This function instantiates a \ref FlowMap.
80 84
    /// \param digraph The digraph for which we would like to define
81 85
    /// the flow map.
... ...
@@ -84,15 +88,18 @@
84 88
    }
85 89

	
86 90
    /// \brief The elevator type used by the algorithm.
87 91
    ///
88 92
    /// The elevator type used by the algorithm.
89 93
    ///
90
    /// \sa Elevator
91
    /// \sa LinkedElevator
94
    /// \sa Elevator, LinkedElevator
95
#ifdef DOXYGEN
96
    typedef lemon::Elevator<GR, GR::Node> Elevator;
97
#else
92 98
    typedef lemon::Elevator<Digraph, typename Digraph::Node> Elevator;
99
#endif
93 100

	
94 101
    /// \brief Instantiates an Elevator.
95 102
    ///
96 103
    /// This function instantiates an \ref Elevator.
97 104
    /// \param digraph The digraph for which we would like to define
98 105
    /// the elevator.
... ...
@@ -131,23 +138,23 @@
131 138
     A feasible circulation is an \f$f: A\rightarrow\mathbf{R}\f$
132 139
     solution of the following problem.
133 140

	
134 141
     \f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu)
135 142
     \geq sup(u) \quad \forall u\in V, \f]
136 143
     \f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A. \f]
137
     
144

	
138 145
     The sum of the supply values, i.e. \f$\sum_{u\in V} sup(u)\f$ must be
139 146
     zero or negative in order to have a feasible solution (since the sum
140 147
     of the expressions on the left-hand side of the inequalities is zero).
141 148
     It means that the total demand must be greater or equal to the total
142 149
     supply and all the supplies have to be carried out from the supply nodes,
143 150
     but there could be demands that are not satisfied.
144 151
     If \f$\sum_{u\in V} sup(u)\f$ is zero, then all the supply/demand
145 152
     constraints have to be satisfied with equality, i.e. all demands
146 153
     have to be satisfied and all supplies have to be used.
147
     
154

	
148 155
     If you need the opposite inequalities in the supply/demand constraints
149 156
     (i.e. the total demand is less than the total supply and all the demands
150 157
     have to be satisfied while there could be supplies that are not used),
151 158
     then you could easily transform the problem to the above form by reversing
152 159
     the direction of the arcs and taking the negative of the supply values
153 160
     (e.g. using \ref ReverseDigraph and \ref NegMap adaptors).
... ...
@@ -163,12 +170,17 @@
163 170
     \tparam LM The type of the lower bound map. The default
164 171
     map type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
165 172
     \tparam UM The type of the upper bound (capacity) map.
166 173
     The default map type is \c LM.
167 174
     \tparam SM The type of the supply map. The default map type is
168 175
     \ref concepts::Digraph::NodeMap "GR::NodeMap<UM::Value>".
176
     \tparam TR The traits class that defines various types used by the
177
     algorithm. By default, it is \ref CirculationDefaultTraits
178
     "CirculationDefaultTraits<GR, LM, UM, SM>".
179
     In most cases, this parameter should not be set directly,
180
     consider to use the named template parameters instead.
169 181
  */
170 182
#ifdef DOXYGEN
171 183
template< typename GR,
172 184
          typename LM,
173 185
          typename UM,
174 186
          typename SM,
... ...
@@ -296,13 +308,13 @@
296 308
    ///
297 309
    /// \ref named-templ-param "Named parameter" for setting Elevator
298 310
    /// type with automatic allocation.
299 311
    /// The Elevator should have standard constructor interface to be
300 312
    /// able to automatically created by the algorithm (i.e. the
301 313
    /// digraph and the maximum level should be passed to it).
302
    /// However an external elevator object could also be passed to the
314
    /// However, an external elevator object could also be passed to the
303 315
    /// algorithm with the \ref elevator(Elevator&) "elevator()" function
304 316
    /// before calling \ref run() or \ref init().
305 317
    /// \sa SetElevator
306 318
    template <typename T>
307 319
    struct SetStandardElevator
308 320
      : public Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
... ...
@@ -322,13 +334,13 @@
322 334
    /// Constructor.
323 335

	
324 336
    /// The constructor of the class.
325 337
    ///
326 338
    /// \param graph The digraph the algorithm runs on.
327 339
    /// \param lower The lower bounds for the flow values on the arcs.
328
    /// \param upper The upper bounds (capacities) for the flow values 
340
    /// \param upper The upper bounds (capacities) for the flow values
329 341
    /// on the arcs.
330 342
    /// \param supply The signed supply values of the nodes.
331 343
    Circulation(const Digraph &graph, const LowerMap &lower,
332 344
                const UpperMap &upper, const SupplyMap &supply)
333 345
      : _g(graph), _lo(&lower), _up(&upper), _supply(&supply),
334 346
        _flow(NULL), _local_flow(false), _level(NULL), _local_level(false),
... ...
@@ -447,31 +459,33 @@
447 459
    /// \pre Either \ref run() or \ref init() must be called before
448 460
    /// using this function.
449 461
    const Elevator& elevator() const {
450 462
      return *_level;
451 463
    }
452 464

	
453
    /// \brief Sets the tolerance used by algorithm.
465
    /// \brief Sets the tolerance used by the algorithm.
454 466
    ///
455
    /// Sets the tolerance used by algorithm.
467
    /// Sets the tolerance object used by the algorithm.
468
    /// \return <tt>(*this)</tt>
456 469
    Circulation& tolerance(const Tolerance& tolerance) {
457 470
      _tol = tolerance;
458 471
      return *this;
459 472
    }
460 473

	
461 474
    /// \brief Returns a const reference to the tolerance.
462 475
    ///
463
    /// Returns a const reference to the tolerance.
476
    /// Returns a const reference to the tolerance object used by
477
    /// the algorithm.
464 478
    const Tolerance& tolerance() const {
465 479
      return _tol;
466 480
    }
467 481

	
468 482
    /// \name Execution Control
469 483
    /// The simplest way to execute the algorithm is to call \ref run().\n
470
    /// If you need more control on the initial solution or the execution,
471
    /// first you have to call one of the \ref init() functions, then
484
    /// If you need better control on the initial solution or the execution,
485
    /// you have to call one of the \ref init() functions first, then
472 486
    /// the \ref start() function.
473 487

	
474 488
    ///@{
475 489

	
476 490
    /// Initializes the internal data structures.
477 491

	
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -75,12 +75,25 @@
75 75

	
76 76
  int ClpLp::_addRow() {
77 77
    _prob->addRow(0, 0, 0, -COIN_DBL_MAX, COIN_DBL_MAX);
78 78
    return _prob->numberRows() - 1;
79 79
  }
80 80

	
81
  int ClpLp::_addRow(Value l, ExprIterator b, ExprIterator e, Value u) {
82
    std::vector<int> indexes;
83
    std::vector<Value> values;
84

	
85
    for(ExprIterator it = b; it != e; ++it) {
86
      indexes.push_back(it->first);
87
      values.push_back(it->second);
88
    }
89

	
90
    _prob->addRow(values.size(), &indexes.front(), &values.front(), l, u);
91
    return _prob->numberRows() - 1;
92
  }
93

	
81 94

	
82 95
  void ClpLp::_eraseCol(int c) {
83 96
    _col_names_ref.erase(_prob->getColumnName(c));
84 97
    _prob->deleteColumns(1, &c);
85 98
  }
86 99

	
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -72,12 +72,13 @@
72 72
  protected:
73 73

	
74 74
    virtual const char* _solverName() const;
75 75

	
76 76
    virtual int _addCol();
77 77
    virtual int _addRow();
78
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
78 79

	
79 80
    virtual void _eraseCol(int i);
80 81
    virtual void _eraseRow(int i);
81 82

	
82 83
    virtual void _eraseColId(int i);
83 84
    virtual void _eraseRowId(int i);
... ...
@@ -134,13 +135,13 @@
134 135
    virtual ProblemType _getPrimalType() const;
135 136
    virtual ProblemType _getDualType() const;
136 137

	
137 138
    virtual void _clear();
138 139

	
139 140
    virtual void _messageLevel(MessageLevel);
140
    
141

	
141 142
  public:
142 143

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

	
146 147
    ///Solves LP with dual simplex method.
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -32,344 +32,342 @@
32 32
  namespace concepts {
33 33

	
34 34
    /// \ingroup graph_concepts
35 35
    ///
36 36
    /// \brief Class describing the concept of directed graphs.
37 37
    ///
38
    /// This class describes the \ref concept "concept" of the
39
    /// immutable directed digraphs.
38
    /// This class describes the common interface of all directed
39
    /// graphs (digraphs).
40 40
    ///
41
    /// Note that actual digraph implementation like @ref ListDigraph or
42
    /// @ref SmartDigraph may have several additional functionality.
41
    /// Like all concept classes, it only provides an interface
42
    /// without any sensible implementation. So any general algorithm for
43
    /// directed graphs should compile with this class, but it will not
44
    /// run properly, of course.
45
    /// An actual digraph implementation like \ref ListDigraph or
46
    /// \ref SmartDigraph may have additional functionality.
43 47
    ///
44
    /// \sa concept
48
    /// \sa Graph
45 49
    class Digraph {
46 50
    private:
47
      ///Digraphs are \e not copy constructible. Use DigraphCopy() instead.
51
      /// Diraphs are \e not copy constructible. Use DigraphCopy instead.
52
      Digraph(const Digraph &) {}
53
      /// \brief Assignment of a digraph to another one is \e not allowed.
54
      /// Use DigraphCopy instead.
55
      void operator=(const Digraph &) {}
48 56

	
49
      ///Digraphs are \e not copy constructible. Use DigraphCopy() instead.
50
      ///
51
      Digraph(const Digraph &) {};
52
      ///\brief Assignment of \ref Digraph "Digraph"s to another ones are
53
      ///\e not allowed. Use DigraphCopy() instead.
57
    public:
58
      /// Default constructor.
59
      Digraph() { }
54 60

	
55
      ///Assignment of \ref Digraph "Digraph"s to another ones are
56
      ///\e not allowed.  Use DigraphCopy() instead.
57

	
58
      void operator=(const Digraph &) {}
59
    public:
60
      ///\e
61

	
62
      /// Defalult constructor.
63

	
64
      /// Defalult constructor.
65
      ///
66
      Digraph() { }
67
      /// Class for identifying a node of the digraph
61
      /// The node type of the digraph
68 62

	
69 63
      /// This class identifies a node of the digraph. It also serves
70 64
      /// as a base class of the node iterators,
71
      /// thus they will convert to this type.
65
      /// thus they convert to this type.
72 66
      class Node {
73 67
      public:
74 68
        /// Default constructor
75 69

	
76
        /// @warning The default constructor sets the iterator
77
        /// to an undefined value.
70
        /// Default constructor.
71
        /// \warning It sets the object to an undefined value.
78 72
        Node() { }
79 73
        /// Copy constructor.
80 74

	
81 75
        /// Copy constructor.
82 76
        ///
83 77
        Node(const Node&) { }
84 78

	
85
        /// Invalid constructor \& conversion.
79
        /// %Invalid constructor \& conversion.
86 80

	
87
        /// This constructor initializes the iterator to be invalid.
81
        /// Initializes the object to be invalid.
88 82
        /// \sa Invalid for more details.
89 83
        Node(Invalid) { }
90 84
        /// Equality operator
91 85

	
86
        /// Equality operator.
87
        ///
92 88
        /// Two iterators are equal if and only if they point to the
93
        /// same object or both are invalid.
89
        /// same object or both are \c INVALID.
94 90
        bool operator==(Node) const { return true; }
95 91

	
96 92
        /// Inequality operator
97 93

	
98
        /// \sa operator==(Node n)
99
        ///
94
        /// Inequality operator.
100 95
        bool operator!=(Node) const { return true; }
101 96

	
102 97
        /// Artificial ordering operator.
103 98

	
104
        /// To allow the use of digraph descriptors as key type in std::map or
105
        /// similar associative container we require this.
99
        /// Artificial ordering operator.
106 100
        ///
107
        /// \note This operator only have to define some strict ordering of
108
        /// the items; this order has nothing to do with the iteration
109
        /// ordering of the items.
101
        /// \note This operator only has to define some strict ordering of
102
        /// the nodes; this order has nothing to do with the iteration
103
        /// ordering of the nodes.
110 104
        bool operator<(Node) const { return false; }
111

	
112 105
      };
113 106

	
114
      /// This iterator goes through each node.
107
      /// Iterator class for the nodes.
115 108

	
116
      /// This iterator goes through each node.
117
      /// Its usage is quite simple, for example you can count the number
118
      /// of nodes in digraph \c g of type \c Digraph like this:
109
      /// This iterator goes through each node of the digraph.
110
      /// Its usage is quite simple, for example, you can count the number
111
      /// of nodes in a digraph \c g of type \c %Digraph like this:
119 112
      ///\code
120 113
      /// int count=0;
121 114
      /// for (Digraph::NodeIt n(g); n!=INVALID; ++n) ++count;
122 115
      ///\endcode
123 116
      class NodeIt : public Node {
124 117
      public:
125 118
        /// Default constructor
126 119

	
127
        /// @warning The default constructor sets the iterator
128
        /// to an undefined value.
120
        /// Default constructor.
121
        /// \warning It sets the iterator to an undefined value.
129 122
        NodeIt() { }
130 123
        /// Copy constructor.
131 124

	
132 125
        /// Copy constructor.
133 126
        ///
134 127
        NodeIt(const NodeIt& n) : Node(n) { }
135
        /// Invalid constructor \& conversion.
128
        /// %Invalid constructor \& conversion.
136 129

	
137
        /// Initialize the iterator to be invalid.
130
        /// Initializes the iterator to be invalid.
138 131
        /// \sa Invalid for more details.
139 132
        NodeIt(Invalid) { }
140 133
        /// Sets the iterator to the first node.
141 134

	
142
        /// Sets the iterator to the first node of \c g.
135
        /// Sets the iterator to the first node of the given digraph.
143 136
        ///
144
        NodeIt(const Digraph&) { }
145
        /// Node -> NodeIt conversion.
137
        explicit NodeIt(const Digraph&) { }
138
        /// Sets the iterator to the given node.
146 139

	
147
        /// Sets the iterator to the node of \c the digraph pointed by
148
        /// the trivial iterator.
149
        /// This feature necessitates that each time we
150
        /// iterate the arc-set, the iteration order is the same.
140
        /// Sets the iterator to the given node of the given digraph.
141
        ///
151 142
        NodeIt(const Digraph&, const Node&) { }
152 143
        /// Next node.
153 144

	
154 145
        /// Assign the iterator to the next node.
155 146
        ///
156 147
        NodeIt& operator++() { return *this; }
157 148
      };
158 149

	
159 150

	
160
      /// Class for identifying an arc of the digraph
151
      /// The arc type of the digraph
161 152

	
162 153
      /// This class identifies an arc of the digraph. It also serves
163 154
      /// as a base class of the arc iterators,
164 155
      /// thus they will convert to this type.
165 156
      class Arc {
166 157
      public:
167 158
        /// Default constructor
168 159

	
169
        /// @warning The default constructor sets the iterator
170
        /// to an undefined value.
160
        /// Default constructor.
161
        /// \warning It sets the object to an undefined value.
171 162
        Arc() { }
172 163
        /// Copy constructor.
173 164

	
174 165
        /// Copy constructor.
175 166
        ///
176 167
        Arc(const Arc&) { }
177
        /// Initialize the iterator to be invalid.
168
        /// %Invalid constructor \& conversion.
178 169

	
179
        /// Initialize the iterator to be invalid.
180
        ///
170
        /// Initializes the object to be invalid.
171
        /// \sa Invalid for more details.
181 172
        Arc(Invalid) { }
182 173
        /// Equality operator
183 174

	
175
        /// Equality operator.
176
        ///
184 177
        /// Two iterators are equal if and only if they point to the
185
        /// same object or both are invalid.
178
        /// same object or both are \c INVALID.
186 179
        bool operator==(Arc) const { return true; }
187 180
        /// Inequality operator
188 181

	
189
        /// \sa operator==(Arc n)
190
        ///
182
        /// Inequality operator.
191 183
        bool operator!=(Arc) const { return true; }
192 184

	
193 185
        /// Artificial ordering operator.
194 186

	
195
        /// To allow the use of digraph descriptors as key type in std::map or
196
        /// similar associative container we require this.
187
        /// Artificial ordering operator.
197 188
        ///
198
        /// \note This operator only have to define some strict ordering of
199
        /// the items; this order has nothing to do with the iteration
200
        /// ordering of the items.
189
        /// \note This operator only has to define some strict ordering of
190
        /// the arcs; this order has nothing to do with the iteration
191
        /// ordering of the arcs.
201 192
        bool operator<(Arc) const { return false; }
202 193
      };
203 194

	
204
      /// This iterator goes trough the outgoing arcs of a node.
195
      /// Iterator class for the outgoing arcs of a node.
205 196

	
206 197
      /// This iterator goes trough the \e outgoing arcs of a certain node
207 198
      /// of a digraph.
208
      /// Its usage is quite simple, for example you can count the number
199
      /// Its usage is quite simple, for example, you can count the number
209 200
      /// of outgoing arcs of a node \c n
210
      /// in digraph \c g of type \c Digraph as follows.
201
      /// in a digraph \c g of type \c %Digraph as follows.
211 202
      ///\code
212 203
      /// int count=0;
213
      /// for (Digraph::OutArcIt e(g, n); e!=INVALID; ++e) ++count;
204
      /// for (Digraph::OutArcIt a(g, n); a!=INVALID; ++a) ++count;
214 205
      ///\endcode
215

	
216 206
      class OutArcIt : public Arc {
217 207
      public:
218 208
        /// Default constructor
219 209

	
220
        /// @warning The default constructor sets the iterator
221
        /// to an undefined value.
210
        /// Default constructor.
211
        /// \warning It sets the iterator to an undefined value.
222 212
        OutArcIt() { }
223 213
        /// Copy constructor.
224 214

	
225 215
        /// Copy constructor.
226 216
        ///
227 217
        OutArcIt(const OutArcIt& e) : Arc(e) { }
228
        /// Initialize the iterator to be invalid.
218
        /// %Invalid constructor \& conversion.
229 219

	
230
        /// Initialize the iterator to be invalid.
220
        /// Initializes the iterator to be invalid.
221
        /// \sa Invalid for more details.
222
        OutArcIt(Invalid) { }
223
        /// Sets the iterator to the first outgoing arc.
224

	
225
        /// Sets the iterator to the first outgoing arc of the given node.
231 226
        ///
232
        OutArcIt(Invalid) { }
233
        /// This constructor sets the iterator to the first outgoing arc.
227
        OutArcIt(const Digraph&, const Node&) { }
228
        /// Sets the iterator to the given arc.
234 229

	
235
        /// This constructor sets the iterator to the first outgoing arc of
236
        /// the node.
237
        OutArcIt(const Digraph&, const Node&) { }
238
        /// Arc -> OutArcIt conversion
239

	
240
        /// Sets the iterator to the value of the trivial iterator.
241
        /// This feature necessitates that each time we
242
        /// iterate the arc-set, the iteration order is the same.
230
        /// Sets the iterator to the given arc of the given digraph.
231
        ///
243 232
        OutArcIt(const Digraph&, const Arc&) { }
244
        ///Next outgoing arc
233
        /// Next outgoing arc
245 234

	
246 235
        /// Assign the iterator to the next
247 236
        /// outgoing arc of the corresponding node.
248 237
        OutArcIt& operator++() { return *this; }
249 238
      };
250 239

	
251
      /// This iterator goes trough the incoming arcs of a node.
240
      /// Iterator class for the incoming arcs of a node.
252 241

	
253 242
      /// This iterator goes trough the \e incoming arcs of a certain node
254 243
      /// of a digraph.
255
      /// Its usage is quite simple, for example you can count the number
256
      /// of outgoing arcs of a node \c n
257
      /// in digraph \c g of type \c Digraph as follows.
244
      /// Its usage is quite simple, for example, you can count the number
245
      /// of incoming arcs of a node \c n
246
      /// in a digraph \c g of type \c %Digraph as follows.
258 247
      ///\code
259 248
      /// int count=0;
260
      /// for(Digraph::InArcIt e(g, n); e!=INVALID; ++e) ++count;
249
      /// for(Digraph::InArcIt a(g, n); a!=INVALID; ++a) ++count;
261 250
      ///\endcode
262

	
263 251
      class InArcIt : public Arc {
264 252
      public:
265 253
        /// Default constructor
266 254

	
267
        /// @warning The default constructor sets the iterator
268
        /// to an undefined value.
255
        /// Default constructor.
256
        /// \warning It sets the iterator to an undefined value.
269 257
        InArcIt() { }
270 258
        /// Copy constructor.
271 259

	
272 260
        /// Copy constructor.
273 261
        ///
274 262
        InArcIt(const InArcIt& e) : Arc(e) { }
275
        /// Initialize the iterator to be invalid.
263
        /// %Invalid constructor \& conversion.
276 264

	
277
        /// Initialize the iterator to be invalid.
265
        /// Initializes the iterator to be invalid.
266
        /// \sa Invalid for more details.
267
        InArcIt(Invalid) { }
268
        /// Sets the iterator to the first incoming arc.
269

	
270
        /// Sets the iterator to the first incoming arc of the given node.
278 271
        ///
279
        InArcIt(Invalid) { }
280
        /// This constructor sets the iterator to first incoming arc.
272
        InArcIt(const Digraph&, const Node&) { }
273
        /// Sets the iterator to the given arc.
281 274

	
282
        /// This constructor set the iterator to the first incoming arc of
283
        /// the node.
284
        InArcIt(const Digraph&, const Node&) { }
285
        /// Arc -> InArcIt conversion
286

	
287
        /// Sets the iterator to the value of the trivial iterator \c e.
288
        /// This feature necessitates that each time we
289
        /// iterate the arc-set, the iteration order is the same.
275
        /// Sets the iterator to the given arc of the given digraph.
276
        ///
290 277
        InArcIt(const Digraph&, const Arc&) { }
291 278
        /// Next incoming arc
292 279

	
293
        /// Assign the iterator to the next inarc of the corresponding node.
294
        ///
280
        /// Assign the iterator to the next
281
        /// incoming arc of the corresponding node.
295 282
        InArcIt& operator++() { return *this; }
296 283
      };
297
      /// This iterator goes through each arc.
298 284

	
299
      /// This iterator goes through each arc of a digraph.
300
      /// Its usage is quite simple, for example you can count the number
301
      /// of arcs in a digraph \c g of type \c Digraph as follows:
285
      /// Iterator class for the arcs.
286

	
287
      /// This iterator goes through each arc of the digraph.
288
      /// Its usage is quite simple, for example, you can count the number
289
      /// of arcs in a digraph \c g of type \c %Digraph as follows:
302 290
      ///\code
303 291
      /// int count=0;
304
      /// for(Digraph::ArcIt e(g); e!=INVALID; ++e) ++count;
292
      /// for(Digraph::ArcIt a(g); a!=INVALID; ++a) ++count;
305 293
      ///\endcode
306 294
      class ArcIt : public Arc {
307 295
      public:
308 296
        /// Default constructor
309 297

	
310
        /// @warning The default constructor sets the iterator
311
        /// to an undefined value.
298
        /// Default constructor.
299
        /// \warning It sets the iterator to an undefined value.
312 300
        ArcIt() { }
313 301
        /// Copy constructor.
314 302

	
315 303
        /// Copy constructor.
316 304
        ///
317 305
        ArcIt(const ArcIt& e) : Arc(e) { }
318
        /// Initialize the iterator to be invalid.
306
        /// %Invalid constructor \& conversion.
319 307

	
320
        /// Initialize the iterator to be invalid.
308
        /// Initializes the iterator to be invalid.
309
        /// \sa Invalid for more details.
310
        ArcIt(Invalid) { }
311
        /// Sets the iterator to the first arc.
312

	
313
        /// Sets the iterator to the first arc of the given digraph.
321 314
        ///
322
        ArcIt(Invalid) { }
323
        /// This constructor sets the iterator to the first arc.
315
        explicit ArcIt(const Digraph& g) { ignore_unused_variable_warning(g); }
316
        /// Sets the iterator to the given arc.
324 317

	
325
        /// This constructor sets the iterator to the first arc of \c g.
326
        ///@param g the digraph
327
        ArcIt(const Digraph& g) { ignore_unused_variable_warning(g); }
328
        /// Arc -> ArcIt conversion
329

	
330
        /// Sets the iterator to the value of the trivial iterator \c e.
331
        /// This feature necessitates that each time we
332
        /// iterate the arc-set, the iteration order is the same.
318
        /// Sets the iterator to the given arc of the given digraph.
319
        ///
333 320
        ArcIt(const Digraph&, const Arc&) { }
334
        ///Next arc
321
        /// Next arc
335 322

	
336 323
        /// Assign the iterator to the next arc.
324
        ///
337 325
        ArcIt& operator++() { return *this; }
338 326
      };
339
      ///Gives back the target node of an arc.
340 327

	
341
      ///Gives back the target node of an arc.
328
      /// \brief The source node of the arc.
342 329
      ///
343
      Node target(Arc) const { return INVALID; }
344
      ///Gives back the source node of an arc.
345

	
346
      ///Gives back the source node of an arc.
347
      ///
330
      /// Returns the source node of the given arc.
348 331
      Node source(Arc) const { return INVALID; }
349 332

	
350
      /// \brief Returns the ID of the node.
333
      /// \brief The target node of the arc.
334
      ///
335
      /// Returns the target node of the given arc.
336
      Node target(Arc) const { return INVALID; }
337

	
338
      /// \brief The ID of the node.
339
      ///
340
      /// Returns the ID of the given node.
351 341
      int id(Node) const { return -1; }
352 342

	
353
      /// \brief Returns the ID of the arc.
343
      /// \brief The ID of the arc.
344
      ///
345
      /// Returns the ID of the given arc.
354 346
      int id(Arc) const { return -1; }
355 347

	
356
      /// \brief Returns the node with the given ID.
348
      /// \brief The node with the given ID.
357 349
      ///
358
      /// \pre The argument should be a valid node ID in the graph.
350
      /// Returns the node with the given ID.
351
      /// \pre The argument should be a valid node ID in the digraph.
359 352
      Node nodeFromId(int) const { return INVALID; }
360 353

	
361
      /// \brief Returns the arc with the given ID.
354
      /// \brief The arc with the given ID.
362 355
      ///
363
      /// \pre The argument should be a valid arc ID in the graph.
356
      /// Returns the arc with the given ID.
357
      /// \pre The argument should be a valid arc ID in the digraph.
364 358
      Arc arcFromId(int) const { return INVALID; }
365 359

	
366
      /// \brief Returns an upper bound on the node IDs.
360
      /// \brief An upper bound on the node IDs.
361
      ///
362
      /// Returns an upper bound on the node IDs.
367 363
      int maxNodeId() const { return -1; }
368 364

	
369
      /// \brief Returns an upper bound on the arc IDs.
365
      /// \brief An upper bound on the arc IDs.
366
      ///
367
      /// Returns an upper bound on the arc IDs.
370 368
      int maxArcId() const { return -1; }
371 369

	
372 370
      void first(Node&) const {}
373 371
      void next(Node&) const {}
374 372

	
375 373
      void first(Arc&) const {}
... ...
@@ -389,76 +387,79 @@
389 387

	
390 388
      // Dummy parameter.
391 389
      int maxId(Node) const { return -1; }
392 390
      // Dummy parameter.
393 391
      int maxId(Arc) const { return -1; }
394 392

	
393
      /// \brief The opposite node on the arc.
394
      ///
395
      /// Returns the opposite node on the given arc.
396
      Node oppositeNode(Node, Arc) const { return INVALID; }
397

	
395 398
      /// \brief The base node of the iterator.
396 399
      ///
397
      /// Gives back the base node of the iterator.
398
      /// It is always the target of the pointed arc.
399
      Node baseNode(const InArcIt&) const { return INVALID; }
400
      /// Returns the base node of the given outgoing arc iterator
401
      /// (i.e. the source node of the corresponding arc).
402
      Node baseNode(OutArcIt) const { return INVALID; }
400 403

	
401 404
      /// \brief The running node of the iterator.
402 405
      ///
403
      /// Gives back the running node of the iterator.
404
      /// It is always the source of the pointed arc.
405
      Node runningNode(const InArcIt&) const { return INVALID; }
406
      /// Returns the running node of the given outgoing arc iterator
407
      /// (i.e. the target node of the corresponding arc).
408
      Node runningNode(OutArcIt) const { return INVALID; }
406 409

	
407 410
      /// \brief The base node of the iterator.
408 411
      ///
409
      /// Gives back the base node of the iterator.
410
      /// It is always the source of the pointed arc.
411
      Node baseNode(const OutArcIt&) const { return INVALID; }
412
      /// Returns the base node of the given incomming arc iterator
413
      /// (i.e. the target node of the corresponding arc).
414
      Node baseNode(InArcIt) const { return INVALID; }
412 415

	
413 416
      /// \brief The running node of the iterator.
414 417
      ///
415
      /// Gives back the running node of the iterator.
416
      /// It is always the target of the pointed arc.
417
      Node runningNode(const OutArcIt&) const { return INVALID; }
418
      /// Returns the running node of the given incomming arc iterator
419
      /// (i.e. the source node of the corresponding arc).
420
      Node runningNode(InArcIt) const { return INVALID; }
418 421

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

	
424
      /// \brief Reference map of the nodes to type \c T.
425
      ///
426
      /// Reference map of the nodes to type \c T.
424
      /// Standard graph map type for the nodes.
425
      /// It conforms to the ReferenceMap concept.
427 426
      template<class T>
428 427
      class NodeMap : public ReferenceMap<Node, T, T&, const T&> {
429 428
      public:
430 429

	
431
        ///\e
432
        NodeMap(const Digraph&) { }
433
        ///\e
430
        /// Constructor
431
        explicit NodeMap(const Digraph&) { }
432
        /// Constructor with given initial value
434 433
        NodeMap(const Digraph&, T) { }
435 434

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

	
448
      /// \brief Reference map of the arcs to type \c T.
447
      /// \brief Standard graph map type for the arcs.
449 448
      ///
450
      /// Reference map of the arcs to type \c T.
449
      /// Standard graph map type for the arcs.
450
      /// It conforms to the ReferenceMap concept.
451 451
      template<class T>
452 452
      class ArcMap : public ReferenceMap<Arc, T, T&, const T&> {
453 453
      public:
454 454

	
455
        ///\e
456
        ArcMap(const Digraph&) { }
457
        ///\e
455
        /// Constructor
456
        explicit ArcMap(const Digraph&) { }
457
        /// Constructor with given initial value
458 458
        ArcMap(const Digraph&, T) { }
459

	
459 460
      private:
460 461
        ///Copy constructor
461 462
        ArcMap(const ArcMap& em) :
462 463
          ReferenceMap<Arc, T, T&, const T&>(em) { }
463 464
        ///Assignment operator
464 465
        template <typename CMap>
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -15,504 +15,511 @@
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\ingroup graph_concepts
20 20
///\file
21
///\brief The concept of Undirected Graphs.
21
///\brief The concept of undirected graphs.
22 22

	
23 23
#ifndef LEMON_CONCEPTS_GRAPH_H
24 24
#define LEMON_CONCEPTS_GRAPH_H
25 25

	
26 26
#include <lemon/concepts/graph_components.h>
27
#include <lemon/concepts/maps.h>
28
#include <lemon/concept_check.h>
27 29
#include <lemon/core.h>
28 30

	
29 31
namespace lemon {
30 32
  namespace concepts {
31 33

	
32 34
    /// \ingroup graph_concepts
33 35
    ///
34
    /// \brief Class describing the concept of Undirected Graphs.
36
    /// \brief Class describing the concept of undirected graphs.
35 37
    ///
36
    /// This class describes the common interface of all Undirected
37
    /// Graphs.
38
    /// This class describes the common interface of all undirected
39
    /// graphs.
38 40
    ///
39
    /// As all concept describing classes it provides only interface
40
    /// without any sensible implementation. So any algorithm for
41
    /// undirected graph should compile with this class, but it will not
41
    /// Like all concept classes, it only provides an interface
42
    /// without any sensible implementation. So any general algorithm for
43
    /// undirected graphs should compile with this class, but it will not
42 44
    /// run properly, of course.
45
    /// An actual graph implementation like \ref ListGraph or
46
    /// \ref SmartGraph may have additional functionality.
43 47
    ///
44
    /// The LEMON undirected graphs also fulfill the concept of
45
    /// directed graphs (\ref lemon::concepts::Digraph "Digraph
46
    /// Concept"). Each edges can be seen as two opposite
47
    /// directed arc and consequently the undirected graph can be
48
    /// seen as the direceted graph of these directed arcs. The
49
    /// Graph has the Edge inner class for the edges and
50
    /// the Arc type for the directed arcs. The Arc type is
51
    /// convertible to Edge or inherited from it so from a directed
52
    /// arc we can get the represented edge.
48
    /// The undirected graphs also fulfill the concept of \ref Digraph
49
    /// "directed graphs", since each edge can also be regarded as two
50
    /// oppositely directed arcs.
51
    /// Undirected graphs provide an Edge type for the undirected edges and
52
    /// an Arc type for the directed arcs. The Arc type is convertible to
53
    /// Edge or inherited from it, i.e. the corresponding edge can be
54
    /// obtained from an arc.
55
    /// EdgeIt and EdgeMap classes can be used for the edges, while ArcIt
56
    /// and ArcMap classes can be used for the arcs (just like in digraphs).
57
    /// Both InArcIt and OutArcIt iterates on the same edges but with
58
    /// opposite direction. IncEdgeIt also iterates on the same edges
59
    /// as OutArcIt and InArcIt, but it is not convertible to Arc,
60
    /// only to Edge.
53 61
    ///
54
    /// In the sense of the LEMON each edge has a default
55
    /// direction (it should be in every computer implementation,
56
    /// because the order of edge's nodes defines an
57
    /// orientation). With the default orientation we can define that
58
    /// the directed arc is forward or backward directed. With the \c
59
    /// direction() and \c direct() function we can get the direction
60
    /// of the directed arc and we can direct an edge.
62
    /// In LEMON, each undirected edge has an inherent orientation.
63
    /// Thus it can defined if an arc is forward or backward oriented in
64
    /// an undirected graph with respect to this default oriantation of
65
    /// the represented edge.
66
    /// With the direction() and direct() functions the direction
67
    /// of an arc can be obtained and set, respectively.
61 68
    ///
62
    /// The EdgeIt is an iterator for the edges. We can use
63
    /// the EdgeMap to map values for the edges. The InArcIt and
64
    /// OutArcIt iterates on the same edges but with opposite
65
    /// direction. The IncEdgeIt iterates also on the same edges
66
    /// as the OutArcIt and InArcIt but it is not convertible to Arc just
67
    /// to Edge.
69
    /// Only nodes and edges can be added to or removed from an undirected
70
    /// graph and the corresponding arcs are added or removed automatically.
71
    ///
72
    /// \sa Digraph
68 73
    class Graph {
74
    private:
75
      /// Graphs are \e not copy constructible. Use DigraphCopy instead.
76
      Graph(const Graph&) {}
77
      /// \brief Assignment of a graph to another one is \e not allowed.
78
      /// Use DigraphCopy instead.
79
      void operator=(const Graph&) {}
80

	
69 81
    public:
70
      /// \brief The undirected graph should be tagged by the
71
      /// UndirectedTag.
82
      /// Default constructor.
83
      Graph() {}
84

	
85
      /// \brief Undirected graphs should be tagged with \c UndirectedTag.
72 86
      ///
73
      /// The undirected graph should be tagged by the UndirectedTag. This
74
      /// tag helps the enable_if technics to make compile time
87
      /// Undirected graphs should be tagged with \c UndirectedTag.
88
      ///
89
      /// This tag helps the \c enable_if technics to make compile time
75 90
      /// specializations for undirected graphs.
76 91
      typedef True UndirectedTag;
77 92

	
78
      /// \brief The base type of node iterators,
79
      /// or in other words, the trivial node iterator.
80
      ///
81
      /// This is the base type of each node iterator,
82
      /// thus each kind of node iterator converts to this.
83
      /// More precisely each kind of node iterator should be inherited
84
      /// from the trivial node iterator.
93
      /// The node type of the graph
94

	
95
      /// This class identifies a node of the graph. It also serves
96
      /// as a base class of the node iterators,
97
      /// thus they convert to this type.
85 98
      class Node {
86 99
      public:
87 100
        /// Default constructor
88 101

	
89
        /// @warning The default constructor sets the iterator
90
        /// to an undefined value.
102
        /// Default constructor.
103
        /// \warning It sets the object to an undefined value.
91 104
        Node() { }
92 105
        /// Copy constructor.
93 106

	
94 107
        /// Copy constructor.
95 108
        ///
96 109
        Node(const Node&) { }
97 110

	
98
        /// Invalid constructor \& conversion.
111
        /// %Invalid constructor \& conversion.
99 112

	
100
        /// This constructor initializes the iterator to be invalid.
113
        /// Initializes the object to be invalid.
101 114
        /// \sa Invalid for more details.
102 115
        Node(Invalid) { }
103 116
        /// Equality operator
104 117

	
118
        /// Equality operator.
119
        ///
105 120
        /// Two iterators are equal if and only if they point to the
106
        /// same object or both are invalid.
121
        /// same object or both are \c INVALID.
107 122
        bool operator==(Node) const { return true; }
108 123

	
109 124
        /// Inequality operator
110 125

	
111
        /// \sa operator==(Node n)
112
        ///
126
        /// Inequality operator.
113 127
        bool operator!=(Node) const { return true; }
114 128

	
115 129
        /// Artificial ordering operator.
116 130

	
117
        /// To allow the use of graph descriptors as key type in std::map or
118
        /// similar associative container we require this.
131
        /// Artificial ordering operator.
119 132
        ///
120
        /// \note This operator only have to define some strict ordering of
133
        /// \note This operator only has to define some strict ordering of
121 134
        /// the items; this order has nothing to do with the iteration
122 135
        /// ordering of the items.
123 136
        bool operator<(Node) const { return false; }
124 137

	
125 138
      };
126 139

	
127
      /// This iterator goes through each node.
140
      /// Iterator class for the nodes.
128 141

	
129
      /// This iterator goes through each node.
130
      /// Its usage is quite simple, for example you can count the number
131
      /// of nodes in graph \c g of type \c Graph like this:
142
      /// This iterator goes through each node of the graph.
143
      /// Its usage is quite simple, for example, you can count the number
144
      /// of nodes in a graph \c g of type \c %Graph like this:
132 145
      ///\code
133 146
      /// int count=0;
134 147
      /// for (Graph::NodeIt n(g); n!=INVALID; ++n) ++count;
135 148
      ///\endcode
136 149
      class NodeIt : public Node {
137 150
      public:
138 151
        /// Default constructor
139 152

	
140
        /// @warning The default constructor sets the iterator
141
        /// to an undefined value.
153
        /// Default constructor.
154
        /// \warning It sets the iterator to an undefined value.
142 155
        NodeIt() { }
143 156
        /// Copy constructor.
144 157

	
145 158
        /// Copy constructor.
146 159
        ///
147 160
        NodeIt(const NodeIt& n) : Node(n) { }
148
        /// Invalid constructor \& conversion.
161
        /// %Invalid constructor \& conversion.
149 162

	
150
        /// Initialize the iterator to be invalid.
163
        /// Initializes the iterator to be invalid.
151 164
        /// \sa Invalid for more details.
152 165
        NodeIt(Invalid) { }
153 166
        /// Sets the iterator to the first node.
154 167

	
155
        /// Sets the iterator to the first node of \c g.
168
        /// Sets the iterator to the first node of the given digraph.
156 169
        ///
157
        NodeIt(const Graph&) { }
158
        /// Node -> NodeIt conversion.
170
        explicit NodeIt(const Graph&) { }
171
        /// Sets the iterator to the given node.
159 172

	
160
        /// Sets the iterator to the node of \c the graph pointed by
161
        /// the trivial iterator.
162
        /// This feature necessitates that each time we
163
        /// iterate the arc-set, the iteration order is the same.
173
        /// Sets the iterator to the given node of the given digraph.
174
        ///
164 175
        NodeIt(const Graph&, const Node&) { }
165 176
        /// Next node.
166 177

	
167 178
        /// Assign the iterator to the next node.
168 179
        ///
169 180
        NodeIt& operator++() { return *this; }
170 181
      };
171 182

	
172 183

	
173
      /// The base type of the edge iterators.
184
      /// The edge type of the graph
174 185

	
175
      /// The base type of the edge iterators.
176
      ///
186
      /// This class identifies an edge of the graph. It also serves
187
      /// as a base class of the edge iterators,
188
      /// thus they will convert to this type.
177 189
      class Edge {
178 190
      public:
179 191
        /// Default constructor
180 192

	
181
        /// @warning The default constructor sets the iterator
182
        /// to an undefined value.
193
        /// Default constructor.
194
        /// \warning It sets the object to an undefined value.
183 195
        Edge() { }
184 196
        /// Copy constructor.
185 197

	
186 198
        /// Copy constructor.
187 199
        ///
188 200
        Edge(const Edge&) { }
189
        /// Initialize the iterator to be invalid.
201
        /// %Invalid constructor \& conversion.
190 202

	
191
        /// Initialize the iterator to be invalid.
192
        ///
203
        /// Initializes the object to be invalid.
204
        /// \sa Invalid for more details.
193 205
        Edge(Invalid) { }
194 206
        /// Equality operator
195 207

	
208
        /// Equality operator.
209
        ///
196 210
        /// Two iterators are equal if and only if they point to the
197
        /// same object or both are invalid.
211
        /// same object or both are \c INVALID.
198 212
        bool operator==(Edge) const { return true; }
199 213
        /// Inequality operator
200 214

	
201
        /// \sa operator==(Edge n)
202
        ///
215
        /// Inequality operator.
203 216
        bool operator!=(Edge) const { return true; }
204 217

	
205 218
        /// Artificial ordering operator.
206 219

	
207
        /// To allow the use of graph descriptors as key type in std::map or
208
        /// similar associative container we require this.
220
        /// Artificial ordering operator.
209 221
        ///
210
        /// \note This operator only have to define some strict ordering of
211
        /// the items; this order has nothing to do with the iteration
212
        /// ordering of the items.
222
        /// \note This operator only has to define some strict ordering of
223
        /// the edges; this order has nothing to do with the iteration
224
        /// ordering of the edges.
213 225
        bool operator<(Edge) const { return false; }
214 226
      };
215 227

	
216
      /// This iterator goes through each edge.
228
      /// Iterator class for the edges.
217 229

	
218
      /// This iterator goes through each edge of a graph.
219
      /// Its usage is quite simple, for example you can count the number
220
      /// of edges in a graph \c g of type \c Graph as follows:
230
      /// This iterator goes through each edge of the graph.
231
      /// Its usage is quite simple, for example, you can count the number
232
      /// of edges in a graph \c g of type \c %Graph as follows:
221 233
      ///\code
222 234
      /// int count=0;
223 235
      /// for(Graph::EdgeIt e(g); e!=INVALID; ++e) ++count;
224 236
      ///\endcode
225 237
      class EdgeIt : public Edge {
226 238
      public:
227 239
        /// Default constructor
228 240

	
229
        /// @warning The default constructor sets the iterator
230
        /// to an undefined value.
241
        /// Default constructor.
242
        /// \warning It sets the iterator to an undefined value.
231 243
        EdgeIt() { }
232 244
        /// Copy constructor.
233 245

	
234 246
        /// Copy constructor.
235 247
        ///
236 248
        EdgeIt(const EdgeIt& e) : Edge(e) { }
237
        /// Initialize the iterator to be invalid.
249
        /// %Invalid constructor \& conversion.
238 250

	
239
        /// Initialize the iterator to be invalid.
251
        /// Initializes the iterator to be invalid.
252
        /// \sa Invalid for more details.
253
        EdgeIt(Invalid) { }
254
        /// Sets the iterator to the first edge.
255

	
256
        /// Sets the iterator to the first edge of the given graph.
240 257
        ///
241
        EdgeIt(Invalid) { }
242
        /// This constructor sets the iterator to the first edge.
258
        explicit EdgeIt(const Graph&) { }
259
        /// Sets the iterator to the given edge.
243 260

	
244
        /// This constructor sets the iterator to the first edge.
245
        EdgeIt(const Graph&) { }
246
        /// Edge -> EdgeIt conversion
247

	
248
        /// Sets the iterator to the value of the trivial iterator.
249
        /// This feature necessitates that each time we
250
        /// iterate the edge-set, the iteration order is the
251
        /// same.
261
        /// Sets the iterator to the given edge of the given graph.
262
        ///
252 263
        EdgeIt(const Graph&, const Edge&) { }
253 264
        /// Next edge
254 265

	
255 266
        /// Assign the iterator to the next edge.
267
        ///
256 268
        EdgeIt& operator++() { return *this; }
257 269
      };
258 270

	
259
      /// \brief This iterator goes trough the incident undirected
260
      /// arcs of a node.
261
      ///
262
      /// This iterator goes trough the incident edges
263
      /// of a certain node of a graph. You should assume that the
264
      /// loop arcs will be iterated twice.
265
      ///
266
      /// Its usage is quite simple, for example you can compute the
267
      /// degree (i.e. count the number of incident arcs of a node \c n
268
      /// in graph \c g of type \c Graph as follows.
271
      /// Iterator class for the incident edges of a node.
272

	
273
      /// This iterator goes trough the incident undirected edges
274
      /// of a certain node of a graph.
275
      /// Its usage is quite simple, for example, you can compute the
276
      /// degree (i.e. the number of incident edges) of a node \c n
277
      /// in a graph \c g of type \c %Graph as follows.
269 278
      ///
270 279
      ///\code
271 280
      /// int count=0;
272 281
      /// for(Graph::IncEdgeIt e(g, n); e!=INVALID; ++e) ++count;
273 282
      ///\endcode
283
      ///
284
      /// \warning Loop edges will be iterated twice.
274 285
      class IncEdgeIt : public Edge {
275 286
      public:
276 287
        /// Default constructor
277 288

	
278
        /// @warning The default constructor sets the iterator
279
        /// to an undefined value.
289
        /// Default constructor.
290
        /// \warning It sets the iterator to an undefined value.
280 291
        IncEdgeIt() { }
281 292
        /// Copy constructor.
282 293

	
283 294
        /// Copy constructor.
284 295
        ///
285 296
        IncEdgeIt(const IncEdgeIt& e) : Edge(e) { }
286
        /// Initialize the iterator to be invalid.
297
        /// %Invalid constructor \& conversion.
287 298

	
288
        /// Initialize the iterator to be invalid.
299
        /// Initializes the iterator to be invalid.
300
        /// \sa Invalid for more details.
301
        IncEdgeIt(Invalid) { }
302
        /// Sets the iterator to the first incident edge.
303

	
304
        /// Sets the iterator to the first incident edge of the given node.
289 305
        ///
290
        IncEdgeIt(Invalid) { }
291
        /// This constructor sets the iterator to first incident arc.
306
        IncEdgeIt(const Graph&, const Node&) { }
307
        /// Sets the iterator to the given edge.
292 308

	
293
        /// This constructor set the iterator to the first incident arc of
294
        /// the node.
295
        IncEdgeIt(const Graph&, const Node&) { }
296
        /// Edge -> IncEdgeIt conversion
309
        /// Sets the iterator to the given edge of the given graph.
310
        ///
311
        IncEdgeIt(const Graph&, const Edge&) { }
312
        /// Next incident edge
297 313

	
298
        /// Sets the iterator to the value of the trivial iterator \c e.
299
        /// This feature necessitates that each time we
300
        /// iterate the arc-set, the iteration order is the same.
301
        IncEdgeIt(const Graph&, const Edge&) { }
302
        /// Next incident arc
303

	
304
        /// Assign the iterator to the next incident arc
314
        /// Assign the iterator to the next incident edge
305 315
        /// of the corresponding node.
306 316
        IncEdgeIt& operator++() { return *this; }
307 317
      };
308 318

	
309
      /// The directed arc type.
319
      /// The arc type of the graph
310 320

	
311
      /// The directed arc type. It can be converted to the
312
      /// edge or it should be inherited from the undirected
313
      /// edge.
321
      /// This class identifies a directed arc of the graph. It also serves
322
      /// as a base class of the arc iterators,
323
      /// thus they will convert to this type.
314 324
      class Arc {
315 325
      public:
316 326
        /// Default constructor
317 327

	
318
        /// @warning The default constructor sets the iterator
319
        /// to an undefined value.
328
        /// Default constructor.
329
        /// \warning It sets the object to an undefined value.
320 330
        Arc() { }
321 331
        /// Copy constructor.
322 332

	
323 333
        /// Copy constructor.
324 334
        ///
325 335
        Arc(const Arc&) { }
326
        /// Initialize the iterator to be invalid.
336
        /// %Invalid constructor \& conversion.
327 337

	
328
        /// Initialize the iterator to be invalid.
329
        ///
338
        /// Initializes the object to be invalid.
339
        /// \sa Invalid for more details.
330 340
        Arc(Invalid) { }
331 341
        /// Equality operator
332 342

	
343
        /// Equality operator.
344
        ///
333 345
        /// Two iterators are equal if and only if they point to the
334
        /// same object or both are invalid.
346
        /// same object or both are \c INVALID.
335 347
        bool operator==(Arc) const { return true; }
336 348
        /// Inequality operator
337 349

	
338
        /// \sa operator==(Arc n)
339
        ///
350
        /// Inequality operator.
340 351
        bool operator!=(Arc) const { return true; }
341 352

	
342 353
        /// Artificial ordering operator.
343 354

	
344
        /// To allow the use of graph descriptors as key type in std::map or
345
        /// similar associative container we require this.
355
        /// Artificial ordering operator.
346 356
        ///
347
        /// \note This operator only have to define some strict ordering of
348
        /// the items; this order has nothing to do with the iteration
349
        /// ordering of the items.
357
        /// \note This operator only has to define some strict ordering of
358
        /// the arcs; this order has nothing to do with the iteration
359
        /// ordering of the arcs.
350 360
        bool operator<(Arc) const { return false; }
351 361

	
352
        /// Converison to Edge
362
        /// Converison to \c Edge
363

	
364
        /// Converison to \c Edge.
365
        ///
353 366
        operator Edge() const { return Edge(); }
354 367
      };
355
      /// This iterator goes through each directed arc.
356 368

	
357
      /// This iterator goes through each arc of a graph.
358
      /// Its usage is quite simple, for example you can count the number
359
      /// of arcs in a graph \c g of type \c Graph as follows:
369
      /// Iterator class for the arcs.
370

	
371
      /// This iterator goes through each directed arc of the graph.
372
      /// Its usage is quite simple, for example, you can count the number
373
      /// of arcs in a graph \c g of type \c %Graph as follows:
360 374
      ///\code
361 375
      /// int count=0;
362
      /// for(Graph::ArcIt e(g); e!=INVALID; ++e) ++count;
376
      /// for(Graph::ArcIt a(g); a!=INVALID; ++a) ++count;
363 377
      ///\endcode
364 378
      class ArcIt : public Arc {
365 379
      public:
366 380
        /// Default constructor
367 381

	
368
        /// @warning The default constructor sets the iterator
369
        /// to an undefined value.
382
        /// Default constructor.
383
        /// \warning It sets the iterator to an undefined value.
370 384
        ArcIt() { }
371 385
        /// Copy constructor.
372 386

	
373 387
        /// Copy constructor.
374 388
        ///
375 389
        ArcIt(const ArcIt& e) : Arc(e) { }
376
        /// Initialize the iterator to be invalid.
390
        /// %Invalid constructor \& conversion.
377 391

	
378
        /// Initialize the iterator to be invalid.
392
        /// Initializes the iterator to be invalid.
393
        /// \sa Invalid for more details.
394
        ArcIt(Invalid) { }
395
        /// Sets the iterator to the first arc.
396

	
397
        /// Sets the iterator to the first arc of the given graph.
379 398
        ///
380
        ArcIt(Invalid) { }
381
        /// This constructor sets the iterator to the first arc.
399
        explicit ArcIt(const Graph &g) { ignore_unused_variable_warning(g); }
400
        /// Sets the iterator to the given arc.
382 401

	
383
        /// This constructor sets the iterator to the first arc of \c g.
384
        ///@param g the graph
385
        ArcIt(const Graph &g) { ignore_unused_variable_warning(g); }
386
        /// Arc -> ArcIt conversion
387

	
388
        /// Sets the iterator to the value of the trivial iterator \c e.
389
        /// This feature necessitates that each time we
390
        /// iterate the arc-set, the iteration order is the same.
402
        /// Sets the iterator to the given arc of the given graph.
403
        ///
391 404
        ArcIt(const Graph&, const Arc&) { }
392
        ///Next arc
405
        /// Next arc
393 406

	
394 407
        /// Assign the iterator to the next arc.
408
        ///
395 409
        ArcIt& operator++() { return *this; }
396 410
      };
397 411

	
398
      /// This iterator goes trough the outgoing directed arcs of a node.
412
      /// Iterator class for the outgoing arcs of a node.
399 413

	
400
      /// This iterator goes trough the \e outgoing arcs of a certain node
401
      /// of a graph.
402
      /// Its usage is quite simple, for example you can count the number
414
      /// This iterator goes trough the \e outgoing directed arcs of a
415
      /// certain node of a graph.
416
      /// Its usage is quite simple, for example, you can count the number
403 417
      /// of outgoing arcs of a node \c n
404
      /// in graph \c g of type \c Graph as follows.
418
      /// in a graph \c g of type \c %Graph as follows.
405 419
      ///\code
406 420
      /// int count=0;
407
      /// for (Graph::OutArcIt e(g, n); e!=INVALID; ++e) ++count;
421
      /// for (Digraph::OutArcIt a(g, n); a!=INVALID; ++a) ++count;
408 422
      ///\endcode
409

	
410 423
      class OutArcIt : public Arc {
411 424
      public:
412 425
        /// Default constructor
413 426

	
414
        /// @warning The default constructor sets the iterator
415
        /// to an undefined value.
427
        /// Default constructor.
428
        /// \warning It sets the iterator to an undefined value.
416 429
        OutArcIt() { }
417 430
        /// Copy constructor.
418 431

	
419 432
        /// Copy constructor.
420 433
        ///
421 434
        OutArcIt(const OutArcIt& e) : Arc(e) { }
422
        /// Initialize the iterator to be invalid.
435
        /// %Invalid constructor \& conversion.
423 436

	
424
        /// Initialize the iterator to be invalid.
437
        /// Initializes the iterator to be invalid.
438
        /// \sa Invalid for more details.
439
        OutArcIt(Invalid) { }
440
        /// Sets the iterator to the first outgoing arc.
441

	
442
        /// Sets the iterator to the first outgoing arc of the given node.
425 443
        ///
426
        OutArcIt(Invalid) { }
427
        /// This constructor sets the iterator to the first outgoing arc.
428

	
429
        /// This constructor sets the iterator to the first outgoing arc of
430
        /// the node.
431
        ///@param n the node
432
        ///@param g the graph
433 444
        OutArcIt(const Graph& n, const Node& g) {
434 445
          ignore_unused_variable_warning(n);
435 446
          ignore_unused_variable_warning(g);
436 447
        }
437
        /// Arc -> OutArcIt conversion
448
        /// Sets the iterator to the given arc.
438 449

	
439
        /// Sets the iterator to the value of the trivial iterator.
440
        /// This feature necessitates that each time we
441
        /// iterate the arc-set, the iteration order is the same.
450
        /// Sets the iterator to the given arc of the given graph.
451
        ///
442 452
        OutArcIt(const Graph&, const Arc&) { }
443
        ///Next outgoing arc
453
        /// Next outgoing arc
444 454

	
445 455
        /// Assign the iterator to the next
446 456
        /// outgoing arc of the corresponding node.
447 457
        OutArcIt& operator++() { return *this; }
448 458
      };
449 459

	
450
      /// This iterator goes trough the incoming directed arcs of a node.
460
      /// Iterator class for the incoming arcs of a node.
451 461

	
452
      /// This iterator goes trough the \e incoming arcs of a certain node
453
      /// of a graph.
454
      /// Its usage is quite simple, for example you can count the number
455
      /// of outgoing arcs of a node \c n
456
      /// in graph \c g of type \c Graph as follows.
462
      /// This iterator goes trough the \e incoming directed arcs of a
463
      /// certain node of a graph.
464
      /// Its usage is quite simple, for example, you can count the number
465
      /// of incoming arcs of a node \c n
466
      /// in a graph \c g of type \c %Graph as follows.
457 467
      ///\code
458 468
      /// int count=0;
459
      /// for(Graph::InArcIt e(g, n); e!=INVALID; ++e) ++count;
469
      /// for (Digraph::InArcIt a(g, n); a!=INVALID; ++a) ++count;
460 470
      ///\endcode
461

	
462 471
      class InArcIt : public Arc {
463 472
      public:
464 473
        /// Default constructor
465 474

	
466
        /// @warning The default constructor sets the iterator
467
        /// to an undefined value.
475
        /// Default constructor.
476
        /// \warning It sets the iterator to an undefined value.
468 477
        InArcIt() { }
469 478
        /// Copy constructor.
470 479

	
471 480
        /// Copy constructor.
472 481
        ///
473 482
        InArcIt(const InArcIt& e) : Arc(e) { }
474
        /// Initialize the iterator to be invalid.
483
        /// %Invalid constructor \& conversion.
475 484

	
476
        /// Initialize the iterator to be invalid.
485
        /// Initializes the iterator to be invalid.
486
        /// \sa Invalid for more details.
487
        InArcIt(Invalid) { }
488
        /// Sets the iterator to the first incoming arc.
489

	
490
        /// Sets the iterator to the first incoming arc of the given node.
477 491
        ///
478
        InArcIt(Invalid) { }
479
        /// This constructor sets the iterator to first incoming arc.
480

	
481
        /// This constructor set the iterator to the first incoming arc of
482
        /// the node.
483
        ///@param n the node
484
        ///@param g the graph
485 492
        InArcIt(const Graph& g, const Node& n) {
486 493
          ignore_unused_variable_warning(n);
487 494
          ignore_unused_variable_warning(g);
488 495
        }
489
        /// Arc -> InArcIt conversion
496
        /// Sets the iterator to the given arc.
490 497

	
491
        /// Sets the iterator to the value of the trivial iterator \c e.
492
        /// This feature necessitates that each time we
493
        /// iterate the arc-set, the iteration order is the same.
498
        /// Sets the iterator to the given arc of the given graph.
499
        ///
494 500
        InArcIt(const Graph&, const Arc&) { }
495 501
        /// Next incoming arc
496 502

	
497
        /// Assign the iterator to the next inarc of the corresponding node.
498
        ///
503
        /// Assign the iterator to the next
504
        /// incoming arc of the corresponding node.
499 505
        InArcIt& operator++() { return *this; }
500 506
      };
501 507

	
502
      /// \brief Reference map of the nodes to type \c T.
508
      /// \brief Standard graph map type for the nodes.
503 509
      ///
504
      /// Reference map of the nodes to type \c T.
510
      /// Standard graph map type for the nodes.
511
      /// It conforms to the ReferenceMap concept.
505 512
      template<class T>
506 513
      class NodeMap : public ReferenceMap<Node, T, T&, const T&>
507 514
      {
508 515
      public:
509 516

	
510
        ///\e
511
        NodeMap(const Graph&) { }
512
        ///\e
517
        /// Constructor
518
        explicit NodeMap(const Graph&) { }
519
        /// Constructor with given initial value
513 520
        NodeMap(const Graph&, T) { }
514 521

	
515 522
      private:
516 523
        ///Copy constructor
517 524
        NodeMap(const NodeMap& nm) :
518 525
          ReferenceMap<Node, T, T&, const T&>(nm) { }
... ...
@@ -521,161 +528,182 @@
521 528
        NodeMap& operator=(const CMap&) {
522 529
          checkConcept<ReadMap<Node, T>, CMap>();
523 530
          return *this;
524 531
        }
525 532
      };
526 533

	
527
      /// \brief Reference map of the arcs to type \c T.
534
      /// \brief Standard graph map type for the arcs.
528 535
      ///
529
      /// Reference map of the arcs to type \c T.
536
      /// Standard graph map type for the arcs.
537
      /// It conforms to the ReferenceMap concept.
530 538
      template<class T>
531 539
      class ArcMap : public ReferenceMap<Arc, T, T&, const T&>
532 540
      {
533 541
      public:
534 542

	
535
        ///\e
536
        ArcMap(const Graph&) { }
537
        ///\e
543
        /// Constructor
544
        explicit ArcMap(const Graph&) { }
545
        /// Constructor with given initial value
538 546
        ArcMap(const Graph&, T) { }
547

	
539 548
      private:
540 549
        ///Copy constructor
541 550
        ArcMap(const ArcMap& em) :
542 551
          ReferenceMap<Arc, T, T&, const T&>(em) { }
543 552
        ///Assignment operator
544 553
        template <typename CMap>
545 554
        ArcMap& operator=(const CMap&) {
546 555
          checkConcept<ReadMap<Arc, T>, CMap>();
547 556
          return *this;
548 557
        }
549 558
      };
550 559

	
551
      /// Reference map of the edges to type \c T.
552

	
553
      /// Reference map of the edges to type \c T.
560
      /// \brief Standard graph map type for the edges.
561
      ///
562
      /// Standard graph map type for the edges.
563
      /// It conforms to the ReferenceMap concept.
554 564
      template<class T>
555 565
      class EdgeMap : public ReferenceMap<Edge, T, T&, const T&>
556 566
      {
557 567
      public:
558 568

	
559
        ///\e
560
        EdgeMap(const Graph&) { }
561
        ///\e
569
        /// Constructor
570
        explicit EdgeMap(const Graph&) { }
571
        /// Constructor with given initial value
562 572
        EdgeMap(const Graph&, T) { }
573

	
563 574
      private:
564 575
        ///Copy constructor
565 576
        EdgeMap(const EdgeMap& em) :
566 577
          ReferenceMap<Edge, T, T&, const T&>(em) {}
567 578
        ///Assignment operator
568 579
        template <typename CMap>
569 580
        EdgeMap& operator=(const CMap&) {
570 581
          checkConcept<ReadMap<Edge, T>, CMap>();
571 582
          return *this;
572 583
        }
573 584
      };
574 585

	
575
      /// \brief Direct the given edge.
586
      /// \brief The first node of the edge.
576 587
      ///
577
      /// Direct the given edge. The returned arc source
578
      /// will be the given node.
579
      Arc direct(const Edge&, const Node&) const {
580
        return INVALID;
581
      }
582

	
583
      /// \brief Direct the given edge.
588
      /// Returns the first node of the given edge.
584 589
      ///
585
      /// Direct the given edge. The returned arc
586
      /// represents the given edge and the direction comes
587
      /// from the bool parameter. The source of the edge and
588
      /// the directed arc is the same when the given bool is true.
589
      Arc direct(const Edge&, bool) const {
590
        return INVALID;
591
      }
592

	
593
      /// \brief Returns true if the arc has default orientation.
594
      ///
595
      /// Returns whether the given directed arc is same orientation as
596
      /// the corresponding edge's default orientation.
597
      bool direction(Arc) const { return true; }
598

	
599
      /// \brief Returns the opposite directed arc.
600
      ///
601
      /// Returns the opposite directed arc.
602
      Arc oppositeArc(Arc) const { return INVALID; }
603

	
604
      /// \brief Opposite node on an arc
605
      ///
606
      /// \return The opposite of the given node on the given edge.
607
      Node oppositeNode(Node, Edge) const { return INVALID; }
608

	
609
      /// \brief First node of the edge.
610
      ///
611
      /// \return The first node of the given edge.
612
      ///
613
      /// Naturally edges don't have direction and thus
614
      /// don't have source and target node. However we use \c u() and \c v()
615
      /// methods to query the two nodes of the arc. The direction of the
616
      /// arc which arises this way is called the inherent direction of the
617
      /// edge, and is used to define the "default" direction
618
      /// of the directed versions of the arcs.
590
      /// Edges don't have source and target nodes, however, methods
591
      /// u() and v() are used to query the two end-nodes of an edge.
592
      /// The orientation of an edge that arises this way is called
593
      /// the inherent direction, it is used to define the default
594
      /// direction for the corresponding arcs.
619 595
      /// \sa v()
620 596
      /// \sa direction()
621 597
      Node u(Edge) const { return INVALID; }
622 598

	
623
      /// \brief Second node of the edge.
599
      /// \brief The second node of the edge.
624 600
      ///
625
      /// \return The second node of the given edge.
601
      /// Returns the second node of the given edge.
626 602
      ///
627
      /// Naturally edges don't have direction and thus
628
      /// don't have source and target node. However we use \c u() and \c v()
629
      /// methods to query the two nodes of the arc. The direction of the
630
      /// arc which arises this way is called the inherent direction of the
631
      /// edge, and is used to define the "default" direction
632
      /// of the directed versions of the arcs.
603
      /// Edges don't have source and target nodes, however, methods
604
      /// u() and v() are used to query the two end-nodes of an edge.
605
      /// The orientation of an edge that arises this way is called
606
      /// the inherent direction, it is used to define the default
607
      /// direction for the corresponding arcs.
633 608
      /// \sa u()
634 609
      /// \sa direction()
635 610
      Node v(Edge) const { return INVALID; }
636 611

	
637
      /// \brief Source node of the directed arc.
612
      /// \brief The source node of the arc.
613
      ///
614
      /// Returns the source node of the given arc.
638 615
      Node source(Arc) const { return INVALID; }
639 616

	
640
      /// \brief Target node of the directed arc.
617
      /// \brief The target node of the arc.
618
      ///
619
      /// Returns the target node of the given arc.
641 620
      Node target(Arc) const { return INVALID; }
642 621

	
643
      /// \brief Returns the id of the node.
622
      /// \brief The ID of the node.
623
      ///
624
      /// Returns the ID of the given node.
644 625
      int id(Node) const { return -1; }
645 626

	
646
      /// \brief Returns the id of the edge.
627
      /// \brief The ID of the edge.
628
      ///
629
      /// Returns the ID of the given edge.
647 630
      int id(Edge) const { return -1; }
648 631

	
649
      /// \brief Returns the id of the arc.
632
      /// \brief The ID of the arc.
633
      ///
634
      /// Returns the ID of the given arc.
650 635
      int id(Arc) const { return -1; }
651 636

	
652
      /// \brief Returns the node with the given id.
637
      /// \brief The node with the given ID.
653 638
      ///
654
      /// \pre The argument should be a valid node id in the graph.
639
      /// Returns the node with the given ID.
640
      /// \pre The argument should be a valid node ID in the graph.
655 641
      Node nodeFromId(int) const { return INVALID; }
656 642

	
657
      /// \brief Returns the edge with the given id.
643
      /// \brief The edge with the given ID.
658 644
      ///
659
      /// \pre The argument should be a valid edge id in the graph.
645
      /// Returns the edge with the given ID.
646
      /// \pre The argument should be a valid edge ID in the graph.
660 647
      Edge edgeFromId(int) const { return INVALID; }
661 648

	
662
      /// \brief Returns the arc with the given id.
649
      /// \brief The arc with the given ID.
663 650
      ///
664
      /// \pre The argument should be a valid arc id in the graph.
651
      /// Returns the arc with the given ID.
652
      /// \pre The argument should be a valid arc ID in the graph.
665 653
      Arc arcFromId(int) const { return INVALID; }
666 654

	
667
      /// \brief Returns an upper bound on the node IDs.
655
      /// \brief An upper bound on the node IDs.
656
      ///
657
      /// Returns an upper bound on the node IDs.
668 658
      int maxNodeId() const { return -1; }
669 659

	
670
      /// \brief Returns an upper bound on the edge IDs.
660
      /// \brief An upper bound on the edge IDs.
661
      ///
662
      /// Returns an upper bound on the edge IDs.
671 663
      int maxEdgeId() const { return -1; }
672 664

	
673
      /// \brief Returns an upper bound on the arc IDs.
665
      /// \brief An upper bound on the arc IDs.
666
      ///
667
      /// Returns an upper bound on the arc IDs.
674 668
      int maxArcId() const { return -1; }
675 669

	
670
      /// \brief The direction of the arc.
671
      ///
672
      /// Returns \c true if the direction of the given arc is the same as
673
      /// the inherent orientation of the represented edge.
674
      bool direction(Arc) const { return true; }
675

	
676
      /// \brief Direct the edge.
677
      ///
678
      /// Direct the given edge. The returned arc
679
      /// represents the given edge and its direction comes
680
      /// from the bool parameter. If it is \c true, then the direction
681
      /// of the arc is the same as the inherent orientation of the edge.
682
      Arc direct(Edge, bool) const {
683
        return INVALID;
684
      }
685

	
686
      /// \brief Direct the edge.
687
      ///
688
      /// Direct the given edge. The returned arc represents the given
689
      /// edge and its source node is the given node.
690
      Arc direct(Edge, Node) const {
691
        return INVALID;
692
      }
693

	
694
      /// \brief The oppositely directed arc.
695
      ///
696
      /// Returns the oppositely directed arc representing the same edge.
697
      Arc oppositeArc(Arc) const { return INVALID; }
698

	
699
      /// \brief The opposite node on the edge.
700
      ///
701
      /// Returns the opposite node on the given edge.
702
      Node oppositeNode(Node, Edge) const { return INVALID; }
703

	
676 704
      void first(Node&) const {}
677 705
      void next(Node&) const {}
678 706

	
679 707
      void first(Edge&) const {}
680 708
      void next(Edge&) const {}
681 709

	
... ...
@@ -702,53 +730,45 @@
702 730
      int maxId(Node) const { return -1; }
703 731
      // Dummy parameter.
704 732
      int maxId(Edge) const { return -1; }
705 733
      // Dummy parameter.
706 734
      int maxId(Arc) const { return -1; }
707 735

	
708
      /// \brief Base node of the iterator
736
      /// \brief The base node of the iterator.
709 737
      ///
710
      /// Returns the base node (the source in this case) of the iterator
711
      Node baseNode(OutArcIt e) const {
712
        return source(e);
713
      }
714
      /// \brief Running node of the iterator
738
      /// Returns the base node of the given incident edge iterator.
739
      Node baseNode(IncEdgeIt) const { return INVALID; }
740

	
741
      /// \brief The running node of the iterator.
715 742
      ///
716
      /// Returns the running node (the target in this case) of the
717
      /// iterator
718
      Node runningNode(OutArcIt e) const {
719
        return target(e);
720
      }
743
      /// Returns the running node of the given incident edge iterator.
744
      Node runningNode(IncEdgeIt) const { return INVALID; }
721 745

	
722
      /// \brief Base node of the iterator
746
      /// \brief The base node of the iterator.
723 747
      ///
724
      /// Returns the base node (the target in this case) of the iterator
725
      Node baseNode(InArcIt e) const {
726
        return target(e);
727
      }
728
      /// \brief Running node of the iterator
748
      /// Returns the base node of the given outgoing arc iterator
749
      /// (i.e. the source node of the corresponding arc).
750
      Node baseNode(OutArcIt) const { return INVALID; }
751

	
752
      /// \brief The running node of the iterator.
729 753
      ///
730
      /// Returns the running node (the source in this case) of the
731
      /// iterator
732
      Node runningNode(InArcIt e) const {
733
        return source(e);
734
      }
754
      /// Returns the running node of the given outgoing arc iterator
755
      /// (i.e. the target node of the corresponding arc).
756
      Node runningNode(OutArcIt) const { return INVALID; }
735 757

	
736
      /// \brief Base node of the iterator
758
      /// \brief The base node of the iterator.
737 759
      ///
738
      /// Returns the base node of the iterator
739
      Node baseNode(IncEdgeIt) const {
740
        return INVALID;
741
      }
760
      /// Returns the base node of the given incomming arc iterator
761
      /// (i.e. the target node of the corresponding arc).
762
      Node baseNode(InArcIt) const { return INVALID; }
742 763

	
743
      /// \brief Running node of the iterator
764
      /// \brief The running node of the iterator.
744 765
      ///
745
      /// Returns the running node of the iterator
746
      Node runningNode(IncEdgeIt) const {
747
        return INVALID;
748
      }
766
      /// Returns the running node of the given incomming arc iterator
767
      /// (i.e. the source node of the corresponding arc).
768
      Node runningNode(InArcIt) const { return INVALID; }
749 769

	
750 770
      template <typename _Graph>
751 771
      struct Constraints {
752 772
        void constraints() {
753 773
          checkConcept<BaseGraphComponent, _Graph>();
754 774
          checkConcept<IterableGraphComponent<>, _Graph>();
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -15,13 +15,13 @@
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\ingroup graph_concepts
20 20
///\file
21
///\brief The concept of graph components.
21
///\brief The concepts of graph components.
22 22

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

	
26 26
#include <lemon/core.h>
27 27
#include <lemon/concepts/maps.h>
... ...
@@ -35,13 +35,13 @@
35 35
    ///
36 36
    /// This class describes the concept of \c Node, \c Arc and \c Edge
37 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 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 
41
    /// and \c Arc (or \c Edge) types should \e not derive from the same
42 42
    /// base class. For \c Node you should instantiate it with character
43 43
    /// \c 'n', for \c Arc with \c 'a' and for \c Edge with \c 'e'.
44 44
#ifndef DOXYGEN
45 45
    template <char sel = '0'>
46 46
#endif
47 47
    class GraphItem {
... ...
@@ -86,16 +86,16 @@
86 86
      /// Inequality operator.
87 87
      bool operator!=(const GraphItem&) const { return false; }
88 88

	
89 89
      /// \brief Ordering operator.
90 90
      ///
91 91
      /// This operator defines an ordering of the items.
92
      /// It makes possible to use graph item types as key types in 
92
      /// It makes possible to use graph item types as key types in
93 93
      /// associative containers (e.g. \c std::map).
94 94
      ///
95
      /// \note This operator only have to define some strict ordering of
95
      /// \note This operator only has to define some strict ordering of
96 96
      /// the items; this order has nothing to do with the iteration
97 97
      /// ordering of the items.
98 98
      bool operator<(const GraphItem&) const { return false; }
99 99

	
100 100
      template<typename _GraphItem>
101 101
      struct Constraints {
... ...
@@ -119,13 +119,13 @@
119 119
    };
120 120

	
121 121
    /// \brief Base skeleton class for directed graphs.
122 122
    ///
123 123
    /// This class describes the base interface of directed graph types.
124 124
    /// All digraph %concepts have to conform to this class.
125
    /// It just provides types for nodes and arcs and functions 
125
    /// It just provides types for nodes and arcs and functions
126 126
    /// to get the source and the target nodes of arcs.
127 127
    class BaseDigraphComponent {
128 128
    public:
129 129

	
130 130
      typedef BaseDigraphComponent Digraph;
131 131

	
... ...
@@ -423,13 +423,13 @@
423 423
        const _Graph& graph;
424 424
      };
425 425
    };
426 426

	
427 427
    /// \brief Concept class for \c NodeIt, \c ArcIt and \c EdgeIt types.
428 428
    ///
429
    /// This class describes the concept of \c NodeIt, \c ArcIt and 
429
    /// This class describes the concept of \c NodeIt, \c ArcIt and
430 430
    /// \c EdgeIt subtypes of digraph and graph types.
431 431
    template <typename GR, typename Item>
432 432
    class GraphItemIt : public Item {
433 433
    public:
434 434
      /// \brief Default constructor.
435 435
      ///
... ...
@@ -463,13 +463,13 @@
463 463

	
464 464
      /// \brief Increment the iterator.
465 465
      ///
466 466
      /// This operator increments the iterator, i.e. assigns it to the
467 467
      /// next item.
468 468
      GraphItemIt& operator++() { return *this; }
469
 
469

	
470 470
      /// \brief Equality operator
471 471
      ///
472 472
      /// Equality operator.
473 473
      /// Two iterators are equal if and only if they point to the
474 474
      /// same object or both are invalid.
475 475
      bool operator==(const GraphItemIt&) const { return true;}
... ...
@@ -498,21 +498,21 @@
498 498
          bi = it2;
499 499
        }
500 500
        const GR& g;
501 501
      };
502 502
    };
503 503

	
504
    /// \brief Concept class for \c InArcIt, \c OutArcIt and 
504
    /// \brief Concept class for \c InArcIt, \c OutArcIt and
505 505
    /// \c IncEdgeIt types.
506 506
    ///
507
    /// This class describes the concept of \c InArcIt, \c OutArcIt 
507
    /// This class describes the concept of \c InArcIt, \c OutArcIt
508 508
    /// and \c IncEdgeIt subtypes of digraph and graph types.
509 509
    ///
510 510
    /// \note Since these iterator classes do not inherit from the same
511 511
    /// base class, there is an additional template parameter (selector)
512
    /// \c sel. For \c InArcIt you should instantiate it with character 
512
    /// \c sel. For \c InArcIt you should instantiate it with character
513 513
    /// \c 'i', for \c OutArcIt with \c 'o' and for \c IncEdgeIt with \c 'e'.
514 514
    template <typename GR,
515 515
              typename Item = typename GR::Arc,
516 516
              typename Base = typename GR::Node,
517 517
              char sel = '0'>
518 518
    class GraphIncIt : public Item {
... ...
@@ -527,16 +527,16 @@
527 527

	
528 528
      /// \brief Copy constructor.
529 529
      ///
530 530
      /// Copy constructor.
531 531
      GraphIncIt(const GraphIncIt& it) : Item(it) {}
532 532

	
533
      /// \brief Constructor that sets the iterator to the first 
533
      /// \brief Constructor that sets the iterator to the first
534 534
      /// incoming or outgoing arc.
535 535
      ///
536
      /// Constructor that sets the iterator to the first arc 
536
      /// Constructor that sets the iterator to the first arc
537 537
      /// incoming to or outgoing from the given node.
538 538
      explicit GraphIncIt(const GR&, const Base&) {}
539 539

	
540 540
      /// \brief Constructor for conversion from \c INVALID.
541 541
      ///
542 542
      /// Constructor for conversion from \c INVALID.
... ...
@@ -801,22 +801,22 @@
801 801
      ///
802 802
      /// This function gives back the next edge in the iteration order.
803 803
      void next(Edge&) const {}
804 804

	
805 805
      /// \brief Return the first edge incident to the given node.
806 806
      ///
807
      /// This function gives back the first edge incident to the given 
807
      /// This function gives back the first edge incident to the given
808 808
      /// node. The bool parameter gives back the direction for which the
809
      /// source node of the directed arc representing the edge is the 
809
      /// source node of the directed arc representing the edge is the
810 810
      /// given node.
811 811
      void firstInc(Edge&, bool&, const Node&) const {}
812 812

	
813 813
      /// \brief Gives back the next of the edges from the
814 814
      /// given node.
815 815
      ///
816
      /// This function gives back the next edge incident to the given 
816
      /// This function gives back the next edge incident to the given
817 817
      /// node. The bool parameter should be used as \c firstInc() use it.
818 818
      void nextInc(Edge&, bool&) const {}
819 819

	
820 820
      using IterableDigraphComponent<Base>::baseNode;
821 821
      using IterableDigraphComponent<Base>::runningNode;
822 822

	
... ...
@@ -987,13 +987,13 @@
987 987
      };
988 988
    };
989 989

	
990 990
    /// \brief Concept class for standard graph maps.
991 991
    ///
992 992
    /// This class describes the concept of standard graph maps, i.e.
993
    /// the \c NodeMap, \c ArcMap and \c EdgeMap subtypes of digraph and 
993
    /// the \c NodeMap, \c ArcMap and \c EdgeMap subtypes of digraph and
994 994
    /// graph types, which can be used for associating data to graph items.
995 995
    /// The standard graph maps must conform to the ReferenceMap concept.
996 996
    template <typename GR, typename K, typename V>
997 997
    class GraphMap : public ReferenceMap<K, V, V&, const V&> {
998 998
      typedef ReferenceMap<K, V, V&, const V&> Parent;
999 999

	
... ...
@@ -1042,13 +1042,13 @@
1042 1042
      struct Constraints {
1043 1043
        void constraints() {
1044 1044
          checkConcept
1045 1045
            <ReferenceMap<Key, Value, Value&, const Value&>, _Map>();
1046 1046
          _Map m1(g);
1047 1047
          _Map m2(g,t);
1048
          
1048

	
1049 1049
          // Copy constructor
1050 1050
          // _Map m3(m);
1051 1051

	
1052 1052
          // Assignment operator
1053 1053
          // ReadMap<Key, Value> cmap;
1054 1054
          // m3 = cmap;
... ...
@@ -1065,13 +1065,13 @@
1065 1065

	
1066 1066
    };
1067 1067

	
1068 1068
    /// \brief Skeleton class for mappable directed graphs.
1069 1069
    ///
1070 1070
    /// This class describes the interface of mappable directed graphs.
1071
    /// It extends \ref BaseDigraphComponent with the standard digraph 
1071
    /// It extends \ref BaseDigraphComponent with the standard digraph
1072 1072
    /// map classes, namely \c NodeMap and \c ArcMap.
1073 1073
    /// This concept is part of the Digraph concept.
1074 1074
    template <typename BAS = BaseDigraphComponent>
1075 1075
    class MappableDigraphComponent : public BAS  {
1076 1076
    public:
1077 1077

	
... ...
@@ -1202,13 +1202,13 @@
1202 1202
      };
1203 1203
    };
1204 1204

	
1205 1205
    /// \brief Skeleton class for mappable undirected graphs.
1206 1206
    ///
1207 1207
    /// This class describes the interface of mappable undirected graphs.
1208
    /// It extends \ref MappableDigraphComponent with the standard graph 
1208
    /// It extends \ref MappableDigraphComponent with the standard graph
1209 1209
    /// map class for edges (\c EdgeMap).
1210 1210
    /// This concept is part of the Graph concept.
1211 1211
    template <typename BAS = BaseGraphComponent>
1212 1212
    class MappableGraphComponent : public MappableDigraphComponent<BAS>  {
1213 1213
    public:
1214 1214

	
... ...
@@ -1287,13 +1287,13 @@
1287 1287
      };
1288 1288
    };
1289 1289

	
1290 1290
    /// \brief Skeleton class for extendable directed graphs.
1291 1291
    ///
1292 1292
    /// This class describes the interface of extendable directed graphs.
1293
    /// It extends \ref BaseDigraphComponent with functions for adding 
1293
    /// It extends \ref BaseDigraphComponent with functions for adding
1294 1294
    /// nodes and arcs to the digraph.
1295 1295
    /// This concept requires \ref AlterableDigraphComponent.
1296 1296
    template <typename BAS = BaseDigraphComponent>
1297 1297
    class ExtendableDigraphComponent : public BAS {
1298 1298
    public:
1299 1299
      typedef BAS Base;
... ...
@@ -1331,13 +1331,13 @@
1331 1331
      };
1332 1332
    };
1333 1333

	
1334 1334
    /// \brief Skeleton class for extendable undirected graphs.
1335 1335
    ///
1336 1336
    /// This class describes the interface of extendable undirected graphs.
1337
    /// It extends \ref BaseGraphComponent with functions for adding 
1337
    /// It extends \ref BaseGraphComponent with functions for adding
1338 1338
    /// nodes and edges to the graph.
1339 1339
    /// This concept requires \ref AlterableGraphComponent.
1340 1340
    template <typename BAS = BaseGraphComponent>
1341 1341
    class ExtendableGraphComponent : public BAS {
1342 1342
    public:
1343 1343

	
... ...
@@ -1375,26 +1375,26 @@
1375 1375
      };
1376 1376
    };
1377 1377

	
1378 1378
    /// \brief Skeleton class for erasable directed graphs.
1379 1379
    ///
1380 1380
    /// This class describes the interface of erasable directed graphs.
1381
    /// It extends \ref BaseDigraphComponent with functions for removing 
1381
    /// It extends \ref BaseDigraphComponent with functions for removing
1382 1382
    /// nodes and arcs from the digraph.
1383 1383
    /// This concept requires \ref AlterableDigraphComponent.
1384 1384
    template <typename BAS = BaseDigraphComponent>
1385 1385
    class ErasableDigraphComponent : public BAS {
1386 1386
    public:
1387 1387

	
1388 1388
      typedef BAS Base;
1389 1389
      typedef typename Base::Node Node;
1390 1390
      typedef typename Base::Arc Arc;
1391 1391

	
1392 1392
      /// \brief Erase a node from the digraph.
1393 1393
      ///
1394
      /// This function erases the given node from the digraph and all arcs 
1394
      /// This function erases the given node from the digraph and all arcs
1395 1395
      /// connected to the node.
1396 1396
      void erase(const Node&) {}
1397 1397

	
1398 1398
      /// \brief Erase an arc from the digraph.
1399 1399
      ///
1400 1400
      /// This function erases the given arc from the digraph.
... ...
@@ -1414,13 +1414,13 @@
1414 1414
      };
1415 1415
    };
1416 1416

	
1417 1417
    /// \brief Skeleton class for erasable undirected graphs.
1418 1418
    ///
1419 1419
    /// This class describes the interface of erasable undirected graphs.
1420
    /// It extends \ref BaseGraphComponent with functions for removing 
1420
    /// It extends \ref BaseGraphComponent with functions for removing
1421 1421
    /// nodes and edges from the graph.
1422 1422
    /// This concept requires \ref AlterableGraphComponent.
1423 1423
    template <typename BAS = BaseGraphComponent>
1424 1424
    class ErasableGraphComponent : public BAS {
1425 1425
    public:
1426 1426

	
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -13,46 +13,52 @@
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19
#ifndef LEMON_CONCEPTS_HEAP_H
20
#define LEMON_CONCEPTS_HEAP_H
21

	
19 22
///\ingroup concept
20 23
///\file
21 24
///\brief The concept of heaps.
22 25

	
23
#ifndef LEMON_CONCEPTS_HEAP_H
24
#define LEMON_CONCEPTS_HEAP_H
25

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

	
29 29
namespace lemon {
30 30

	
31 31
  namespace concepts {
32 32

	
33 33
    /// \addtogroup concept
34 34
    /// @{
35 35

	
36 36
    /// \brief The heap concept.
37 37
    ///
38
    /// Concept class describing the main interface of heaps. A \e heap
39
    /// is a data structure for storing items with specified values called
40
    /// \e priorities in such a way that finding the item with minimum
41
    /// priority is efficient. In a heap one can change the priority of an
42
    /// item, add or erase an item, etc.
38
    /// This concept class describes the main interface of heaps.
39
    /// The various \ref heaps "heap structures" are efficient
40
    /// implementations of the abstract data type \e priority \e queue.
41
    /// They store items with specified values called \e priorities
42
    /// in such a way that finding and removing the item with minimum
43
    /// priority are efficient. The basic operations are adding and
44
    /// erasing items, changing the priority of an item, etc.
43 45
    ///
44
    /// \tparam PR Type of the priority of the items.
45
    /// \tparam IM A read and writable item map with int values, used
46
    /// Heaps are crucial in several algorithms, such as Dijkstra and Prim.
47
    /// Any class that conforms to this concept can be used easily in such
48
    /// algorithms.
49
    ///
50
    /// \tparam PR Type of the priorities of the items.
51
    /// \tparam IM A read-writable item map with \c int values, used
46 52
    /// internally to handle the cross references.
47
    /// \tparam Comp A functor class for the ordering of the priorities.
53
    /// \tparam CMP A functor class for comparing the priorities.
48 54
    /// The default is \c std::less<PR>.
49 55
#ifdef DOXYGEN
50
    template <typename PR, typename IM, typename Comp = std::less<PR> >
56
    template <typename PR, typename IM, typename CMP>
51 57
#else
52
    template <typename PR, typename IM>
58
    template <typename PR, typename IM, typename CMP = std::less<PR> >
53 59
#endif
54 60
    class Heap {
55 61
    public:
56 62

	
57 63
      /// Type of the item-int map.
58 64
      typedef IM ItemIntMap;
... ...
@@ -61,132 +67,188 @@
61 67
      /// Type of the items stored in the heap.
62 68
      typedef typename ItemIntMap::Key Item;
63 69

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

	
79
      /// \brief The constructor.
84
      /// \brief Constructor.
80 85
      ///
81
      /// The constructor.
86
      /// Constructor.
82 87
      /// \param map A map that assigns \c int values to keys of type
83 88
      /// \c Item. It is used internally by the heap implementations to
84 89
      /// handle the cross references. The assigned value must be
85
      /// \c PRE_HEAP (<tt>-1</tt>) for every item.
90
      /// \c PRE_HEAP (<tt>-1</tt>) for each item.
91
#ifdef DOXYGEN
86 92
      explicit Heap(ItemIntMap &map) {}
93
#else
94
      explicit Heap(ItemIntMap&) {}
95
#endif
96

	
97
      /// \brief Constructor.
98
      ///
99
      /// Constructor.
100
      /// \param map A map that assigns \c int values to keys of type
101
      /// \c Item. It is used internally by the heap implementations to
102
      /// handle the cross references. The assigned value must be
103
      /// \c PRE_HEAP (<tt>-1</tt>) for each item.
104
      /// \param comp The function object used for comparing the priorities.
105
#ifdef DOXYGEN
106
      explicit Heap(ItemIntMap &map, const CMP &comp) {}
107
#else
108
      explicit Heap(ItemIntMap&, const CMP&) {}
109
#endif
87 110

	
88 111
      /// \brief The number of items stored in the heap.
89 112
      ///
90
      /// Returns the number of items stored in the heap.
113
      /// This function returns the number of items stored in the heap.
91 114
      int size() const { return 0; }
92 115

	
93
      /// \brief Checks if the heap is empty.
116
      /// \brief Check if the heap is empty.
94 117
      ///
95
      /// Returns \c true if the heap is empty.
118
      /// This function returns \c true if the heap is empty.
96 119
      bool empty() const { return false; }
97 120

	
98
      /// \brief Makes the heap empty.
121
      /// \brief Make the heap empty.
99 122
      ///
100
      /// Makes the heap empty.
101
      void clear();
123
      /// This functon makes the heap empty.
124
      /// It does not change the cross reference map. If you want to reuse
125
      /// a heap that is not surely empty, you should first clear it and
126
      /// then you should set the cross reference map to \c PRE_HEAP
127
      /// for each item.
128
      void clear() {}
102 129

	
103
      /// \brief Inserts an item into the heap with the given priority.
130
      /// \brief Insert an item into the heap with the given priority.
104 131
      ///
105
      /// Inserts the given item into the heap with the given priority.
132
      /// This function inserts the given item into the heap with the
133
      /// given priority.
106 134
      /// \param i The item to insert.
107 135
      /// \param p The priority of the item.
136
      /// \pre \e i must not be stored in the heap.
137
#ifdef DOXYGEN
108 138
      void push(const Item &i, const Prio &p) {}
139
#else
140
      void push(const Item&, const Prio&) {}
141
#endif
109 142

	
110
      /// \brief Returns the item having minimum priority.
143
      /// \brief Return the item having minimum priority.
111 144
      ///
112
      /// Returns the item having minimum priority.
145
      /// This function returns the item having minimum priority.
113 146
      /// \pre The heap must be non-empty.
114
      Item top() const {}
147
      Item top() const { return Item(); }
115 148

	
116 149
      /// \brief The minimum priority.
117 150
      ///
118
      /// Returns the minimum priority.
151
      /// This function returns the minimum priority.
119 152
      /// \pre The heap must be non-empty.
120
      Prio prio() const {}
153
      Prio prio() const { return Prio(); }
121 154

	
122
      /// \brief Removes the item having minimum priority.
155
      /// \brief Remove the item having minimum priority.
123 156
      ///
124
      /// Removes the item having minimum priority.
157
      /// This function removes the item having minimum priority.
125 158
      /// \pre The heap must be non-empty.
126 159
      void pop() {}
127 160

	
128
      /// \brief Removes an item from the heap.
161
      /// \brief Remove the given item from the heap.
129 162
      ///
130
      /// Removes the given item from the heap if it is already stored.
163
      /// This function removes the given item from the heap if it is
164
      /// already stored.
131 165
      /// \param i The item to delete.
166
      /// \pre \e i must be in the heap.
167
#ifdef DOXYGEN
132 168
      void erase(const Item &i) {}
169
#else
170
      void erase(const Item&) {}
171
#endif
133 172

	
134
      /// \brief The priority of an item.
173
      /// \brief The priority of the given item.
135 174
      ///
136
      /// Returns the priority of the given item.
175
      /// This function returns the priority of the given item.
137 176
      /// \param i The item.
138
      /// \pre \c i must be in the heap.
177
      /// \pre \e i must be in the heap.
178
#ifdef DOXYGEN
139 179
      Prio operator[](const Item &i) const {}
180
#else
181
      Prio operator[](const Item&) const { return Prio(); }
182
#endif
140 183

	
141
      /// \brief Sets the priority of an item or inserts it, if it is
184
      /// \brief Set the priority of an item or insert it, if it is
142 185
      /// not stored in the heap.
143 186
      ///
144 187
      /// This method sets the priority of the given item if it is
145
      /// already stored in the heap.
146
      /// Otherwise it inserts the given item with the given priority.
188
      /// already stored in the heap. Otherwise it inserts the given
189
      /// item into the heap with the given priority.
147 190
      ///
148 191
      /// \param i The item.
149 192
      /// \param p The priority.
193
#ifdef DOXYGEN
150 194
      void set(const Item &i, const Prio &p) {}
195
#else
196
      void set(const Item&, const Prio&) {}
197
#endif
151 198

	
152
      /// \brief Decreases the priority of an item to the given value.
199
      /// \brief Decrease the priority of an item to the given value.
153 200
      ///
154
      /// Decreases the priority of an item to the given value.
201
      /// This function decreases the priority of an item to the given value.
155 202
      /// \param i The item.
156 203
      /// \param p The priority.
157
      /// \pre \c i must be stored in the heap with priority at least \c p.
204
      /// \pre \e i must be stored in the heap with priority at least \e p.
205
#ifdef DOXYGEN
158 206
      void decrease(const Item &i, const Prio &p) {}
207
#else
208
      void decrease(const Item&, const Prio&) {}
209
#endif
159 210

	
160
      /// \brief Increases the priority of an item to the given value.
211
      /// \brief Increase the priority of an item to the given value.
161 212
      ///
162
      /// Increases the priority of an item to the given value.
213
      /// This function increases the priority of an item to the given value.
163 214
      /// \param i The item.
164 215
      /// \param p The priority.
165
      /// \pre \c i must be stored in the heap with priority at most \c p.
216
      /// \pre \e i must be stored in the heap with priority at most \e p.
217
#ifdef DOXYGEN
166 218
      void increase(const Item &i, const Prio &p) {}
219
#else
220
      void increase(const Item&, const Prio&) {}
221
#endif
167 222

	
168
      /// \brief Returns if an item is in, has already been in, or has
169
      /// never been in the heap.
223
      /// \brief Return the state of an item.
170 224
      ///
171 225
      /// This method returns \c PRE_HEAP if the given item has never
172 226
      /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
173 227
      /// and \c POST_HEAP otherwise.
174 228
      /// In the latter case it is possible that the item will get back
175 229
      /// to the heap again.
176 230
      /// \param i The item.
231
#ifdef DOXYGEN
177 232
      State state(const Item &i) const {}
233
#else
234
      State state(const Item&) const { return PRE_HEAP; }
235
#endif
178 236

	
179
      /// \brief Sets the state of an item in the heap.
237
      /// \brief Set the state of an item in the heap.
180 238
      ///
181
      /// Sets the state of the given item in the heap. It can be used
182
      /// to manually clear the heap when it is important to achive the
183
      /// better time complexity.
239
      /// This function sets the state of the given item in the heap.
240
      /// It can be used to manually clear the heap when it is important
241
      /// to achive better time complexity.
184 242
      /// \param i The item.
185 243
      /// \param st The state. It should not be \c IN_HEAP.
244
#ifdef DOXYGEN
186 245
      void state(const Item& i, State st) {}
246
#else
247
      void state(const Item&, State) {}
248
#endif
187 249

	
188 250

	
189 251
      template <typename _Heap>
190 252
      struct Constraints {
191 253
      public:
192 254
        void constraints() {
Ignore white space 6 line context
... ...
@@ -15,13 +15,13 @@
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\ingroup concept
20 20
///\file
21
///\brief Classes for representing paths in digraphs.
21
///\brief The concept of paths
22 22
///
23 23

	
24 24
#ifndef LEMON_CONCEPTS_PATH_H
25 25
#define LEMON_CONCEPTS_PATH_H
26 26

	
27 27
#include <lemon/core.h>
... ...
@@ -35,19 +35,28 @@
35 35

	
36 36
    /// \brief A skeleton structure for representing directed paths in
37 37
    /// a digraph.
38 38
    ///
39 39
    /// A skeleton structure for representing directed paths in a
40 40
    /// digraph.
41
    /// In a sense, a path can be treated as a list of arcs.
42
    /// LEMON path types just store this list. As a consequence, they cannot
43
    /// enumerate the nodes on the path directly and a zero length path
44
    /// cannot store its source node.
45
    ///
46
    /// The arcs of a path should be stored in the order of their directions,
47
    /// i.e. the target node of each arc should be the same as the source
48
    /// node of the next arc. This consistency could be checked using
49
    /// \ref checkPath().
50
    /// The source and target nodes of a (consistent) path can be obtained
51
    /// using \ref pathSource() and \ref pathTarget().
52
    ///
53
    /// A path can be constructed from another path of any type using the
54
    /// copy constructor or the assignment operator.
55
    ///
41 56
    /// \tparam GR The digraph type in which the path is.
42
    ///
43
    /// In a sense, the path can be treated as a list of arcs. The
44
    /// lemon path type stores just this list. As a consequence it
45
    /// cannot enumerate the nodes in the path and the zero length
46
    /// paths cannot store the source.
47
    ///
48 57
    template <typename GR>
49 58
    class Path {
50 59
    public:
51 60

	
52 61
      /// Type of the underlying digraph.
53 62
      typedef GR Digraph;
... ...
@@ -56,45 +65,45 @@
56 65

	
57 66
      class ArcIt;
58 67

	
59 68
      /// \brief Default constructor
60 69
      Path() {}
61 70

	
62
      /// \brief Template constructor
71
      /// \brief Template copy constructor
63 72
      template <typename CPath>
64 73
      Path(const CPath& cpath) {}
65 74

	
66
      /// \brief Template assigment
75
      /// \brief Template assigment operator
67 76
      template <typename CPath>
68 77
      Path& operator=(const CPath& cpath) {
69 78
        ignore_unused_variable_warning(cpath);
70 79
        return *this;
71 80
      }
72 81

	
73
      /// Length of the path ie. the number of arcs in the path.
82
      /// Length of the path, i.e. the number of arcs on the path.
74 83
      int length() const { return 0;}
75 84

	
76 85
      /// Returns whether the path is empty.
77 86
      bool empty() const { return true;}
78 87

	
79 88
      /// Resets the path to an empty path.
80 89
      void clear() {}
81 90

	
82
      /// \brief LEMON style iterator for path arcs
91
      /// \brief LEMON style iterator for enumerating the arcs of a path.
83 92
      ///
84
      /// This class is used to iterate on the arcs of the paths.
93
      /// LEMON style iterator class for enumerating the arcs of a path.
85 94
      class ArcIt {
86 95
      public:
87 96
        /// Default constructor
88 97
        ArcIt() {}
89 98
        /// Invalid constructor
90 99
        ArcIt(Invalid) {}
91
        /// Constructor for first arc
100
        /// Sets the iterator to the first arc of the given path
92 101
        ArcIt(const Path &) {}
93 102

	
94
        /// Conversion to Arc
103
        /// Conversion to \c Arc
95 104
        operator Arc() const { return INVALID; }
96 105

	
97 106
        /// Next arc
98 107
        ArcIt& operator++() {return *this;}
99 108

	
100 109
        /// Comparison operator
... ...
@@ -189,66 +198,59 @@
189 198
    }
190 199

	
191 200

	
192 201
    /// \brief A skeleton structure for path dumpers.
193 202
    ///
194 203
    /// A skeleton structure for path dumpers. The path dumpers are
195
    /// the generalization of the paths. The path dumpers can
196
    /// enumerate the arcs of the path wheter in forward or in
197
    /// backward order.  In most time these classes are not used
198
    /// directly rather it used to assign a dumped class to a real
199
    /// path type.
204
    /// the generalization of the paths, they can enumerate the arcs
205
    /// of the path either in forward or in backward order.
206
    /// These classes are typically not used directly, they are rather
207
    /// used to be assigned to a real path type.
200 208
    ///
201 209
    /// The main purpose of this concept is that the shortest path
202
    /// algorithms can enumerate easily the arcs in reverse order.
203
    /// If we would like to give back a real path from these
204
    /// algorithms then we should create a temporarly path object. In
205
    /// LEMON such algorithms gives back a path dumper what can
206
    /// assigned to a real path and the dumpers can be implemented as
210
    /// algorithms can enumerate the arcs easily in reverse order.
211
    /// In LEMON, such algorithms give back a (reverse) path dumper that
212
    /// can be assigned to a real path. The dumpers can be implemented as
207 213
    /// an adaptor class to the predecessor map.
208 214
    ///
209 215
    /// \tparam GR The digraph type in which the path is.
210
    ///
211
    /// The paths can be constructed from any path type by a
212
    /// template constructor or a template assignment operator.
213 216
    template <typename GR>
214 217
    class PathDumper {
215 218
    public:
216 219

	
217 220
      /// Type of the underlying digraph.
218 221
      typedef GR Digraph;
219 222
      /// Arc type of the underlying digraph.
220 223
      typedef typename Digraph::Arc Arc;
221 224

	
222
      /// Length of the path ie. the number of arcs in the path.
225
      /// Length of the path, i.e. the number of arcs on the path.
223 226
      int length() const { return 0;}
224 227

	
225 228
      /// Returns whether the path is empty.
226 229
      bool empty() const { return true;}
227 230

	
228 231
      /// \brief Forward or reverse dumping
229 232
      ///
230
      /// If the RevPathTag is defined and true then reverse dumping
231
      /// is provided in the path dumper. In this case instead of the
232
      /// ArcIt the RevArcIt iterator should be implemented in the
233
      /// dumper.
233
      /// If this tag is defined to be \c True, then reverse dumping
234
      /// is provided in the path dumper. In this case, \c RevArcIt
235
      /// iterator should be implemented instead of \c ArcIt iterator.
234 236
      typedef False RevPathTag;
235 237

	
236
      /// \brief LEMON style iterator for path arcs
238
      /// \brief LEMON style iterator for enumerating the arcs of a path.
237 239
      ///
238
      /// This class is used to iterate on the arcs of the paths.
240
      /// LEMON style iterator class for enumerating the arcs of a path.
239 241
      class ArcIt {
240 242
      public:
241 243
        /// Default constructor
242 244
        ArcIt() {}
243 245
        /// Invalid constructor
244 246
        ArcIt(Invalid) {}
245
        /// Constructor for first arc
247
        /// Sets the iterator to the first arc of the given path
246 248
        ArcIt(const PathDumper&) {}
247 249

	
248
        /// Conversion to Arc
250
        /// Conversion to \c Arc
249 251
        operator Arc() const { return INVALID; }
250 252

	
251 253
        /// Next arc
252 254
        ArcIt& operator++() {return *this;}
253 255

	
254 256
        /// Comparison operator
... ...
@@ -257,26 +259,27 @@
257 259
        bool operator!=(const ArcIt&) const {return true;}
258 260
        /// Comparison operator
259 261
        bool operator<(const ArcIt&) const {return false;}
260 262

	
261 263
      };
262 264

	
263
      /// \brief LEMON style iterator for path arcs
265
      /// \brief LEMON style iterator for enumerating the arcs of a path
266
      /// in reverse direction.
264 267
      ///
265
      /// This class is used to iterate on the arcs of the paths in
266
      /// reverse direction.
268
      /// LEMON style iterator class for enumerating the arcs of a path
269
      /// in reverse direction.
267 270
      class RevArcIt {
268 271
      public:
269 272
        /// Default constructor
270 273
        RevArcIt() {}
271 274
        /// Invalid constructor
272 275
        RevArcIt(Invalid) {}
273
        /// Constructor for first arc
276
        /// Sets the iterator to the last arc of the given path
274 277
        RevArcIt(const PathDumper &) {}
275 278

	
276
        /// Conversion to Arc
279
        /// Conversion to \c Arc
277 280
        operator Arc() const { return INVALID; }
278 281

	
279 282
        /// Next arc
280 283
        RevArcIt& operator++() {return *this;}
281 284

	
282 285
        /// Comparison operator
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -255,13 +255,13 @@
255 255
  /// This function checks whether the given directed graph is strongly
256 256
  /// connected, i.e. any two nodes of the digraph are
257 257
  /// connected with directed paths in both direction.
258 258
  ///
259 259
  /// \return \c true if the digraph is strongly connected.
260 260
  /// \note By definition, the empty digraph is strongly connected.
261
  /// 
261
  ///
262 262
  /// \see countStronglyConnectedComponents(), stronglyConnectedComponents()
263 263
  /// \see connected()
264 264
  template <typename Digraph>
265 265
  bool stronglyConnected(const Digraph& digraph) {
266 266
    checkConcept<concepts::Digraph, Digraph>();
267 267

	
... ...
@@ -307,13 +307,13 @@
307 307

	
308 308
    return true;
309 309
  }
310 310

	
311 311
  /// \ingroup graph_properties
312 312
  ///
313
  /// \brief Count the number of strongly connected components of a 
313
  /// \brief Count the number of strongly connected components of a
314 314
  /// directed graph
315 315
  ///
316 316
  /// This function counts the number of strongly connected components of
317 317
  /// the given directed graph.
318 318
  ///
319 319
  /// The strongly connected components are the classes of an
... ...
@@ -741,13 +741,13 @@
741 741
  int countBiNodeConnectedComponents(const Graph& graph);
742 742

	
743 743
  /// \ingroup graph_properties
744 744
  ///
745 745
  /// \brief Check whether an undirected graph is bi-node-connected.
746 746
  ///
747
  /// This function checks whether the given undirected graph is 
747
  /// This function checks whether the given undirected graph is
748 748
  /// bi-node-connected, i.e. any two edges are on same circle.
749 749
  ///
750 750
  /// \return \c true if the graph bi-node-connected.
751 751
  /// \note By definition, the empty graph is bi-node-connected.
752 752
  ///
753 753
  /// \see countBiNodeConnectedComponents(), biNodeConnectedComponents()
... ...
@@ -755,13 +755,13 @@
755 755
  bool biNodeConnected(const Graph& graph) {
756 756
    return countBiNodeConnectedComponents(graph) <= 1;
757 757
  }
758 758

	
759 759
  /// \ingroup graph_properties
760 760
  ///
761
  /// \brief Count the number of bi-node-connected components of an 
761
  /// \brief Count the number of bi-node-connected components of an
762 762
  /// undirected graph.
763 763
  ///
764 764
  /// This function counts the number of bi-node-connected components of
765 765
  /// the given undirected graph.
766 766
  ///
767 767
  /// The bi-node-connected components are the classes of an equivalence
... ...
@@ -809,13 +809,13 @@
809 809
  /// \image html node_biconnected_components.png
810 810
  /// \image latex node_biconnected_components.eps "bi-node-connected components" width=\textwidth
811 811
  ///
812 812
  /// \param graph The undirected graph.
813 813
  /// \retval compMap A writable edge map. The values will be set from 0
814 814
  /// to the number of the bi-node-connected components minus one. Each
815
  /// value of the map will be set exactly once, and the values of a 
815
  /// value of the map will be set exactly once, and the values of a
816 816
  /// certain component will be set continuously.
817 817
  /// \return The number of bi-node-connected components.
818 818
  ///
819 819
  /// \see biNodeConnected(), countBiNodeConnectedComponents()
820 820
  template <typename Graph, typename EdgeMap>
821 821
  int biNodeConnectedComponents(const Graph& graph,
... ...
@@ -855,13 +855,13 @@
855 855
  /// relation on the edges of a undirected graph. Two edges are in the
856 856
  /// same class if they are on same circle.
857 857
  /// The bi-node-connected components are separted by the cut nodes of
858 858
  /// the components.
859 859
  ///
860 860
  /// \param graph The undirected graph.
861
  /// \retval cutMap A writable node map. The values will be set to 
861
  /// \retval cutMap A writable node map. The values will be set to
862 862
  /// \c true for the nodes that separate two or more components
863 863
  /// (exactly once for each cut node), and will not be changed for
864 864
  /// other nodes.
865 865
  /// \return The number of the cut nodes.
866 866
  ///
867 867
  /// \see biNodeConnected(), biNodeConnectedComponents()
... ...
@@ -1082,13 +1082,13 @@
1082 1082
  int countBiEdgeConnectedComponents(const Graph& graph);
1083 1083

	
1084 1084
  /// \ingroup graph_properties
1085 1085
  ///
1086 1086
  /// \brief Check whether an undirected graph is bi-edge-connected.
1087 1087
  ///
1088
  /// This function checks whether the given undirected graph is 
1088
  /// This function checks whether the given undirected graph is
1089 1089
  /// bi-edge-connected, i.e. any two nodes are connected with at least
1090 1090
  /// two edge-disjoint paths.
1091 1091
  ///
1092 1092
  /// \return \c true if the graph is bi-edge-connected.
1093 1093
  /// \note By definition, the empty graph is bi-edge-connected.
1094 1094
  ///
... ...
@@ -1189,13 +1189,13 @@
1189 1189

	
1190 1190
  /// \ingroup graph_properties
1191 1191
  ///
1192 1192
  /// \brief Find the bi-edge-connected cut edges in an undirected graph.
1193 1193
  ///
1194 1194
  /// This function finds the bi-edge-connected cut edges in the given
1195
  /// undirected graph. 
1195
  /// undirected graph.
1196 1196
  ///
1197 1197
  /// The bi-edge-connected components are the classes of an equivalence
1198 1198
  /// relation on the nodes of an undirected graph. Two nodes are in the
1199 1199
  /// same class if they are connected with at least two edge-disjoint
1200 1200
  /// paths.
1201 1201
  /// The bi-edge-connected components are separted by the cut edges of
... ...
@@ -1346,13 +1346,13 @@
1346 1346
  /// This function sorts the nodes of the given acyclic digraph (DAG)
1347 1347
  /// into topolgical order and also checks whether the given digraph
1348 1348
  /// is DAG.
1349 1349
  ///
1350 1350
  /// \param digraph The digraph.
1351 1351
  /// \retval order A readable and writable node map. The values will be
1352
  /// set from 0 to the number of the nodes in the digraph minus one. 
1352
  /// set from 0 to the number of the nodes in the digraph minus one.
1353 1353
  /// Each value of the map will be set exactly once, and the values will
1354 1354
  /// be set descending order.
1355 1355
  /// \return \c false if the digraph is not DAG.
1356 1356
  ///
1357 1357
  /// \see dag(), topologicalSort()
1358 1358
  template <typename Digraph, typename NodeMap>
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -1238,13 +1238,14 @@
1238 1238

	
1239 1239
    /// The Digraph type
1240 1240
    typedef GR Digraph;
1241 1241

	
1242 1242
  protected:
1243 1243

	
1244
    class AutoNodeMap : public ItemSetTraits<GR, Node>::template Map<Arc>::Type {
1244
    class AutoNodeMap : public ItemSetTraits<GR, Node>::template Map<Arc>::Type
1245
    {
1245 1246
      typedef typename ItemSetTraits<GR, Node>::template Map<Arc>::Type Parent;
1246 1247

	
1247 1248
    public:
1248 1249

	
1249 1250
      AutoNodeMap(const GR& digraph) : Parent(digraph, INVALID) {}
1250 1251

	
... ...
@@ -1277,13 +1278,13 @@
1277 1278
      bool operator()(Arc a,Arc b) const
1278 1279
      {
1279 1280
        return g.target(a)<g.target(b);
1280 1281
      }
1281 1282
    };
1282 1283

	
1283
  protected: 
1284
  protected:
1284 1285

	
1285 1286
    const Digraph &_g;
1286 1287
    AutoNodeMap _head;
1287 1288
    typename Digraph::template ArcMap<Arc> _parent;
1288 1289
    typename Digraph::template ArcMap<Arc> _left;
1289 1290
    typename Digraph::template ArcMap<Arc> _right;
Ignore white space 6 line context
... ...
@@ -209,13 +209,13 @@
209 209
    /// Returns the value of the counter.
210 210
    operator int() {return count;}
211 211
  };
212 212

	
213 213
  /// 'Do nothing' version of Counter.
214 214

	
215
  /// This class can be used in the same way as \ref Counter however it
215
  /// This class can be used in the same way as \ref Counter, but it
216 216
  /// does not count at all and does not print report on destruction.
217 217
  ///
218 218
  /// Replacing a \ref Counter with a \ref NoCounter makes it possible
219 219
  /// to turn off all counting and reporting (SubCounters should also
220 220
  /// be replaced with NoSubCounters), so it does not affect the
221 221
  /// efficiency of the program at all.
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -108,12 +108,45 @@
108 108
    const double ub = INF;
109 109
    const char s = 'L';
110 110
    CPXnewrows(cplexEnv(), _prob, 1, &ub, &s, 0, 0);
111 111
    return i;
112 112
  }
113 113

	
114
  int CplexBase::_addRow(Value lb, ExprIterator b,
115
                         ExprIterator e, Value ub) {
116
    int i = CPXgetnumrows(cplexEnv(), _prob);
117
    if (lb == -INF) {
118
      const char s = 'L';
119
      CPXnewrows(cplexEnv(), _prob, 1, &ub, &s, 0, 0);
120
    } else if (ub == INF) {
121
      const char s = 'G';
122
      CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, 0, 0);
123
    } else if (lb == ub){
124
      const char s = 'E';
125
      CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, 0, 0);
126
    } else {
127
      const char s = 'R';
128
      double len = ub - lb;
129
      CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, &len, 0);
130
    }
131

	
132
    std::vector<int> indices;
133
    std::vector<int> rowlist;
134
    std::vector<Value> values;
135

	
136
    for(ExprIterator it=b; it!=e; ++it) {
137
      indices.push_back(it->first);
138
      values.push_back(it->second);
139
      rowlist.push_back(i);
140
    }
141

	
142
    CPXchgcoeflist(cplexEnv(), _prob, values.size(),
143
                   &rowlist.front(), &indices.front(), &values.front());
144

	
145
    return i;
146
  }
114 147

	
115 148
  void CplexBase::_eraseCol(int i) {
116 149
    CPXdelcols(cplexEnv(), _prob, i, i);
117 150
  }
118 151

	
119 152
  void CplexBase::_eraseRow(int i) {
... ...
@@ -453,13 +486,13 @@
453 486
      _message_enabled = true;
454 487
      break;
455 488
    }
456 489
  }
457 490

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

	
463 496
  // CplexLp members
464 497

	
465 498
  CplexLp::CplexLp()
Ignore white space 6 line context
... ...
@@ -90,12 +90,13 @@
90 90
    CplexBase(const CplexEnv&);
91 91
    CplexBase(const CplexBase &);
92 92
    virtual ~CplexBase();
93 93

	
94 94
    virtual int _addCol();
95 95
    virtual int _addRow();
96
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
96 97

	
97 98
    virtual void _eraseCol(int i);
98 99
    virtual void _eraseRow(int i);
99 100

	
100 101
    virtual void _eraseColId(int i);
101 102
    virtual void _eraseRowId(int i);
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -44,13 +44,13 @@
44 44

	
45 45
    ///\brief The type of the map that stores the predecessor
46 46
    ///arcs of the %DFS paths.
47 47
    ///
48 48
    ///The type of the map that stores the predecessor
49 49
    ///arcs of the %DFS paths.
50
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
50
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
51 51
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
52 52
    ///Instantiates a \c PredMap.
53 53

	
54 54
    ///This function instantiates a \ref PredMap.
55 55
    ///\param g is the digraph, to which we would like to define the
56 56
    ///\ref PredMap.
... ...
@@ -59,13 +59,14 @@
59 59
      return new PredMap(g);
60 60
    }
61 61

	
62 62
    ///The type of the map that indicates which nodes are processed.
63 63

	
64 64
    ///The type of the map that indicates which nodes are processed.
65
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
65
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
66
    ///By default, it is a NullMap.
66 67
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
67 68
    ///Instantiates a \c ProcessedMap.
68 69

	
69 70
    ///This function instantiates a \ref ProcessedMap.
70 71
    ///\param g is the digraph, to which
71 72
    ///we would like to define the \ref ProcessedMap.
... ...
@@ -78,13 +79,14 @@
78 79
      return new ProcessedMap();
79 80
    }
80 81

	
81 82
    ///The type of the map that indicates which nodes are reached.
82 83

	
83 84
    ///The type of the map that indicates which nodes are reached.
84
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85
    ///It must conform to
86
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85 87
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
86 88
    ///Instantiates a \c ReachedMap.
87 89

	
88 90
    ///This function instantiates a \ref ReachedMap.
89 91
    ///\param g is the digraph, to which
90 92
    ///we would like to define the \ref ReachedMap.
... ...
@@ -93,13 +95,13 @@
93 95
      return new ReachedMap(g);
94 96
    }
95 97

	
96 98
    ///The type of the map that stores the distances of the nodes.
97 99

	
98 100
    ///The type of the map that stores the distances of the nodes.
99
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
101
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
100 102
    typedef typename Digraph::template NodeMap<int> DistMap;
101 103
    ///Instantiates a \c DistMap.
102 104

	
103 105
    ///This function instantiates a \ref DistMap.
104 106
    ///\param g is the digraph, to which we would like to define the
105 107
    ///\ref DistMap.
... ...
@@ -117,12 +119,17 @@
117 119
  ///There is also a \ref dfs() "function-type interface" for the DFS
118 120
  ///algorithm, which is convenient in the simplier cases and it can be
119 121
  ///used easier.
120 122
  ///
121 123
  ///\tparam GR The type of the digraph the algorithm runs on.
122 124
  ///The default type is \ref ListDigraph.
125
  ///\tparam TR The traits class that defines various types used by the
126
  ///algorithm. By default, it is \ref DfsDefaultTraits
127
  ///"DfsDefaultTraits<GR>".
128
  ///In most cases, this parameter should not be set directly,
129
  ///consider to use the named template parameters instead.
123 130
#ifdef DOXYGEN
124 131
  template <typename GR,
125 132
            typename TR>
126 133
#else
127 134
  template <typename GR=ListDigraph,
128 135
            typename TR=DfsDefaultTraits<GR> >
... ...
@@ -221,13 +228,13 @@
221 228
    };
222 229
    ///\brief \ref named-templ-param "Named parameter" for setting
223 230
    ///\c PredMap type.
224 231
    ///
225 232
    ///\ref named-templ-param "Named parameter" for setting
226 233
    ///\c PredMap type.
227
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
234
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
228 235
    template <class T>
229 236
    struct SetPredMap : public Dfs<Digraph, SetPredMapTraits<T> > {
230 237
      typedef Dfs<Digraph, SetPredMapTraits<T> > Create;
231 238
    };
232 239

	
233 240
    template <class T>
... ...
@@ -241,13 +248,13 @@
241 248
    };
242 249
    ///\brief \ref named-templ-param "Named parameter" for setting
243 250
    ///\c DistMap type.
244 251
    ///
245 252
    ///\ref named-templ-param "Named parameter" for setting
246 253
    ///\c DistMap type.
247
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
254
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
248 255
    template <class T>
249 256
    struct SetDistMap : public Dfs< Digraph, SetDistMapTraits<T> > {
250 257
      typedef Dfs<Digraph, SetDistMapTraits<T> > Create;
251 258
    };
252 259

	
253 260
    template <class T>
... ...
@@ -261,13 +268,14 @@
261 268
    };
262 269
    ///\brief \ref named-templ-param "Named parameter" for setting
263 270
    ///\c ReachedMap type.
264 271
    ///
265 272
    ///\ref named-templ-param "Named parameter" for setting
266 273
    ///\c ReachedMap type.
267
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
274
    ///It must conform to
275
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
268 276
    template <class T>
269 277
    struct SetReachedMap : public Dfs< Digraph, SetReachedMapTraits<T> > {
270 278
      typedef Dfs< Digraph, SetReachedMapTraits<T> > Create;
271 279
    };
272 280

	
273 281
    template <class T>
... ...
@@ -281,13 +289,13 @@
281 289
    };
282 290
    ///\brief \ref named-templ-param "Named parameter" for setting
283 291
    ///\c ProcessedMap type.
284 292
    ///
285 293
    ///\ref named-templ-param "Named parameter" for setting
286 294
    ///\c ProcessedMap type.
287
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
295
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
288 296
    template <class T>
289 297
    struct SetProcessedMap : public Dfs< Digraph, SetProcessedMapTraits<T> > {
290 298
      typedef Dfs< Digraph, SetProcessedMapTraits<T> > Create;
291 299
    };
292 300

	
293 301
    struct SetStandardProcessedMapTraits : public Traits {
... ...
@@ -408,14 +416,14 @@
408 416

	
409 417
  public:
410 418

	
411 419
    ///\name Execution Control
412 420
    ///The simplest way to execute the DFS algorithm is to use one of the
413 421
    ///member functions called \ref run(Node) "run()".\n
414
    ///If you need more control on the execution, first you have to call
415
    ///\ref init(), then you can add a source node with \ref addSource()
422
    ///If you need better control on the execution, you have to call
423
    ///\ref init() first, then you can add a source node with \ref addSource()
416 424
    ///and perform the actual computation with \ref start().
417 425
    ///This procedure can be repeated if there are nodes that have not
418 426
    ///been reached.
419 427

	
420 428
    ///@{
421 429

	
... ...
@@ -629,18 +637,14 @@
629 637
      start(t);
630 638
      return reached(t);
631 639
    }
632 640

	
633 641
    ///Runs the algorithm to visit all nodes in the digraph.
634 642

	
635
    ///This method runs the %DFS algorithm in order to compute the
636
    ///%DFS path to each node.
637
    ///
638
    ///The algorithm computes
639
    ///- the %DFS tree (forest),
640
    ///- the distance of each node from the root(s) in the %DFS tree.
643
    ///This method runs the %DFS algorithm in order to visit all nodes
644
    ///in the digraph.
641 645
    ///
642 646
    ///\note <tt>d.run()</tt> is just a shortcut of the following code.
643 647
    ///\code
644 648
    ///  d.init();
645 649
    ///  for (NodeIt n(digraph); n != INVALID; ++n) {
646 650
    ///    if (!d.reached(n)) {
... ...
@@ -666,56 +670,56 @@
666 670
    ///functions.\n
667 671
    ///Either \ref run(Node) "run()" or \ref start() should be called
668 672
    ///before using them.
669 673

	
670 674
    ///@{
671 675

	
672
    ///The DFS path to a node.
676
    ///The DFS path to the given node.
673 677

	
674
    ///Returns the DFS path to a node.
678
    ///Returns the DFS path to the given node from the root(s).
675 679
    ///
676 680
    ///\warning \c t should be reached from the root(s).
677 681
    ///
678 682
    ///\pre Either \ref run(Node) "run()" or \ref init()
679 683
    ///must be called before using this function.
680 684
    Path path(Node t) const { return Path(*G, *_pred, t); }
681 685

	
682
    ///The distance of a node from the root(s).
686
    ///The distance of the given node from the root(s).
683 687

	
684
    ///Returns the distance of a node from the root(s).
688
    ///Returns the distance of the given node from the root(s).
685 689
    ///
686 690
    ///\warning If node \c v is not reached from the root(s), then
687 691
    ///the return value of this function is undefined.
688 692
    ///
689 693
    ///\pre Either \ref run(Node) "run()" or \ref init()
690 694
    ///must be called before using this function.
691 695
    int dist(Node v) const { return (*_dist)[v]; }
692 696

	
693
    ///Returns the 'previous arc' of the %DFS tree for a node.
697
    ///Returns the 'previous arc' of the %DFS tree for the given node.
694 698

	
695 699
    ///This function returns the 'previous arc' of the %DFS tree for the
696 700
    ///node \c v, i.e. it returns the last arc of a %DFS path from a
697 701
    ///root to \c v. It is \c INVALID if \c v is not reached from the
698 702
    ///root(s) or if \c v is a root.
699 703
    ///
700 704
    ///The %DFS tree used here is equal to the %DFS tree used in
701
    ///\ref predNode().
705
    ///\ref predNode() and \ref predMap().
702 706
    ///
703 707
    ///\pre Either \ref run(Node) "run()" or \ref init()
704 708
    ///must be called before using this function.
705 709
    Arc predArc(Node v) const { return (*_pred)[v];}
706 710

	
707
    ///Returns the 'previous node' of the %DFS tree.
711
    ///Returns the 'previous node' of the %DFS tree for the given node.
708 712

	
709 713
    ///This function returns the 'previous node' of the %DFS
710 714
    ///tree for the node \c v, i.e. it returns the last but one node
711
    ///from a %DFS path from a root to \c v. It is \c INVALID
715
    ///of a %DFS path from a root to \c v. It is \c INVALID
712 716
    ///if \c v is not reached from the root(s) or if \c v is a root.
713 717
    ///
714 718
    ///The %DFS tree used here is equal to the %DFS tree used in
715
    ///\ref predArc().
719
    ///\ref predArc() and \ref predMap().
716 720
    ///
717 721
    ///\pre Either \ref run(Node) "run()" or \ref init()
718 722
    ///must be called before using this function.
719 723
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
720 724
                                  G->source((*_pred)[v]); }
721 725

	
... ...
@@ -730,19 +734,19 @@
730 734
    const DistMap &distMap() const { return *_dist;}
731 735

	
732 736
    ///\brief Returns a const reference to the node map that stores the
733 737
    ///predecessor arcs.
734 738
    ///
735 739
    ///Returns a const reference to the node map that stores the predecessor
736
    ///arcs, which form the DFS tree.
740
    ///arcs, which form the DFS tree (forest).
737 741
    ///
738 742
    ///\pre Either \ref run(Node) "run()" or \ref init()
739 743
    ///must be called before using this function.
740 744
    const PredMap &predMap() const { return *_pred;}
741 745

	
742
    ///Checks if a node is reached from the root(s).
746
    ///Checks if the given node. node is reached from the root(s).
743 747

	
744 748
    ///Returns \c true if \c v is reached from the root(s).
745 749
    ///
746 750
    ///\pre Either \ref run(Node) "run()" or \ref init()
747 751
    ///must be called before using this function.
748 752
    bool reached(Node v) const { return (*_reached)[v]; }
... ...
@@ -762,13 +766,13 @@
762 766

	
763 767
    ///\brief The type of the map that stores the predecessor
764 768
    ///arcs of the %DFS paths.
765 769
    ///
766 770
    ///The type of the map that stores the predecessor
767 771
    ///arcs of the %DFS paths.
768
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
772
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
769 773
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
770 774
    ///Instantiates a PredMap.
771 775

	
772 776
    ///This function instantiates a PredMap.
773 777
    ///\param g is the digraph, to which we would like to define the
774 778
    ///PredMap.
... ...
@@ -777,14 +781,14 @@
777 781
      return new PredMap(g);
778 782
    }
779 783

	
780 784
    ///The type of the map that indicates which nodes are processed.
781 785

	
782 786
    ///The type of the map that indicates which nodes are processed.
783
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
784
    ///By default it is a NullMap.
787
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
788
    ///By default, it is a NullMap.
785 789
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
786 790
    ///Instantiates a ProcessedMap.
787 791

	
788 792
    ///This function instantiates a ProcessedMap.
789 793
    ///\param g is the digraph, to which
790 794
    ///we would like to define the ProcessedMap.
... ...
@@ -797,13 +801,14 @@
797 801
      return new ProcessedMap();
798 802
    }
799 803

	
800 804
    ///The type of the map that indicates which nodes are reached.
801 805

	
802 806
    ///The type of the map that indicates which nodes are reached.
803
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
807
    ///It must conform to
808
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
804 809
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
805 810
    ///Instantiates a ReachedMap.
806 811

	
807 812
    ///This function instantiates a ReachedMap.
808 813
    ///\param g is the digraph, to which
809 814
    ///we would like to define the ReachedMap.
... ...
@@ -812,13 +817,13 @@
812 817
      return new ReachedMap(g);
813 818
    }
814 819

	
815 820
    ///The type of the map that stores the distances of the nodes.
816 821

	
817 822
    ///The type of the map that stores the distances of the nodes.
818
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
823
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
819 824
    typedef typename Digraph::template NodeMap<int> DistMap;
820 825
    ///Instantiates a DistMap.
821 826

	
822 827
    ///This function instantiates a DistMap.
823 828
    ///\param g is the digraph, to which we would like to define
824 829
    ///the DistMap
... ...
@@ -827,24 +832,20 @@
827 832
      return new DistMap(g);
828 833
    }
829 834

	
830 835
    ///The type of the DFS paths.
831 836

	
832 837
    ///The type of the DFS paths.
833
    ///It must meet the \ref concepts::Path "Path" concept.
838
    ///It must conform to the \ref concepts::Path "Path" concept.
834 839
    typedef lemon::Path<Digraph> Path;
835 840
  };
836 841

	
837 842
  /// Default traits class used by DfsWizard
838 843

	
839
  /// To make it easier to use Dfs algorithm
840
  /// we have created a wizard class.
841
  /// This \ref DfsWizard class needs default traits,
842
  /// as well as the \ref Dfs class.
843
  /// The \ref DfsWizardBase is a class to be the default traits of the
844
  /// \ref DfsWizard class.
844
  /// Default traits class used by DfsWizard.
845
  /// \tparam GR The type of the digraph.
845 846
  template<class GR>
846 847
  class DfsWizardBase : public DfsWizardDefaultTraits<GR>
847 848
  {
848 849

	
849 850
    typedef DfsWizardDefaultTraits<GR> Base;
850 851
  protected:
... ...
@@ -866,13 +867,13 @@
866 867
    //Pointer to the distance of the target node.
867 868
    int *_di;
868 869

	
869 870
    public:
870 871
    /// Constructor.
871 872

	
872
    /// This constructor does not require parameters, therefore it initiates
873
    /// This constructor does not require parameters, it initiates
873 874
    /// all of the attributes to \c 0.
874 875
    DfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
875 876
                      _dist(0), _path(0), _di(0) {}
876 877

	
877 878
    /// Constructor.
878 879

	
... ...
@@ -891,35 +892,31 @@
891 892
  /// \ref dfs() "function-type interface" of \ref Dfs algorithm.
892 893
  /// It does not have own \ref run(Node) "run()" method, it uses the
893 894
  /// functions and features of the plain \ref Dfs.
894 895
  ///
895 896
  /// This class should only be used through the \ref dfs() function,
896 897
  /// which makes it easier to use the algorithm.
898
  ///
899
  /// \tparam TR The traits class that defines various types used by the
900
  /// algorithm.
897 901
  template<class TR>
898 902
  class DfsWizard : public TR
899 903
  {
900 904
    typedef TR Base;
901 905

	
902
    ///The type of the digraph the algorithm runs on.
903 906
    typedef typename TR::Digraph Digraph;
904 907

	
905 908
    typedef typename Digraph::Node Node;
906 909
    typedef typename Digraph::NodeIt NodeIt;
907 910
    typedef typename Digraph::Arc Arc;
908 911
    typedef typename Digraph::OutArcIt OutArcIt;
909 912

	
910
    ///\brief The type of the map that stores the predecessor
911
    ///arcs of the DFS paths.
912 913
    typedef typename TR::PredMap PredMap;
913
    ///\brief The type of the map that stores the distances of the nodes.
914 914
    typedef typename TR::DistMap DistMap;
915
    ///\brief The type of the map that indicates which nodes are reached.
916 915
    typedef typename TR::ReachedMap ReachedMap;
917
    ///\brief The type of the map that indicates which nodes are processed.
918 916
    typedef typename TR::ProcessedMap ProcessedMap;
919
    ///The type of the DFS paths
920 917
    typedef typename TR::Path Path;
921 918

	
922 919
  public:
923 920

	
924 921
    /// Constructor.
925 922
    DfsWizard() : TR() {}
... ...
@@ -983,30 +980,31 @@
983 980
        *Base::_di = alg.dist(t);
984 981
      return alg.reached(t);
985 982
      }
986 983

	
987 984
    ///Runs DFS algorithm to visit all nodes in the digraph.
988 985

	
989
    ///This method runs DFS algorithm in order to compute
990
    ///the DFS path to each node.
986
    ///This method runs DFS algorithm in order to visit all nodes
987
    ///in the digraph.
991 988
    void run()
992 989
    {
993 990
      run(INVALID);
994 991
    }
995 992

	
996 993
    template<class T>
997 994
    struct SetPredMapBase : public Base {
998 995
      typedef T PredMap;
999 996
      static PredMap *createPredMap(const Digraph &) { return 0; };
1000 997
      SetPredMapBase(const TR &b) : TR(b) {}
1001 998
    };
1002
    ///\brief \ref named-func-param "Named parameter"
1003
    ///for setting PredMap object.
999

	
1000
    ///\brief \ref named-templ-param "Named parameter" for setting
1001
    ///the predecessor map.
1004 1002
    ///
1005
    ///\ref named-func-param "Named parameter"
1006
    ///for setting PredMap object.
1003
    ///\ref named-templ-param "Named parameter" function for setting
1004
    ///the map that stores the predecessor arcs of the nodes.
1007 1005
    template<class T>
1008 1006
    DfsWizard<SetPredMapBase<T> > predMap(const T &t)
1009 1007
    {
1010 1008
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1011 1009
      return DfsWizard<SetPredMapBase<T> >(*this);
1012 1010
    }
... ...
@@ -1014,17 +1012,18 @@
1014 1012
    template<class T>
1015 1013
    struct SetReachedMapBase : public Base {
1016 1014
      typedef T ReachedMap;
1017 1015
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1018 1016
      SetReachedMapBase(const TR &b) : TR(b) {}
1019 1017
    };
1020
    ///\brief \ref named-func-param "Named parameter"
1021
    ///for setting ReachedMap object.
1018

	
1019
    ///\brief \ref named-templ-param "Named parameter" for setting
1020
    ///the reached map.
1022 1021
    ///
1023
    /// \ref named-func-param "Named parameter"
1024
    ///for setting ReachedMap object.
1022
    ///\ref named-templ-param "Named parameter" function for setting
1023
    ///the map that indicates which nodes are reached.
1025 1024
    template<class T>
1026 1025
    DfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1027 1026
    {
1028 1027
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1029 1028
      return DfsWizard<SetReachedMapBase<T> >(*this);
1030 1029
    }
... ...
@@ -1032,17 +1031,19 @@
1032 1031
    template<class T>
1033 1032
    struct SetDistMapBase : public Base {
1034 1033
      typedef T DistMap;
1035 1034
      static DistMap *createDistMap(const Digraph &) { return 0; };
1036 1035
      SetDistMapBase(const TR &b) : TR(b) {}
1037 1036
    };
1038
    ///\brief \ref named-func-param "Named parameter"
1039
    ///for setting DistMap object.
1037

	
1038
    ///\brief \ref named-templ-param "Named parameter" for setting
1039
    ///the distance map.
1040 1040
    ///
1041
    /// \ref named-func-param "Named parameter"
1042
    ///for setting DistMap object.
1041
    ///\ref named-templ-param "Named parameter" function for setting
1042
    ///the map that stores the distances of the nodes calculated
1043
    ///by the algorithm.
1043 1044
    template<class T>
1044 1045
    DfsWizard<SetDistMapBase<T> > distMap(const T &t)
1045 1046
    {
1046 1047
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1047 1048
      return DfsWizard<SetDistMapBase<T> >(*this);
1048 1049
    }
... ...
@@ -1050,17 +1051,18 @@
1050 1051
    template<class T>
1051 1052
    struct SetProcessedMapBase : public Base {
1052 1053
      typedef T ProcessedMap;
1053 1054
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1054 1055
      SetProcessedMapBase(const TR &b) : TR(b) {}
1055 1056
    };
1056
    ///\brief \ref named-func-param "Named parameter"
1057
    ///for setting ProcessedMap object.
1057

	
1058
    ///\brief \ref named-func-param "Named parameter" for setting
1059
    ///the processed map.
1058 1060
    ///
1059
    /// \ref named-func-param "Named parameter"
1060
    ///for setting ProcessedMap object.
1061
    ///\ref named-templ-param "Named parameter" function for setting
1062
    ///the map that indicates which nodes are processed.
1061 1063
    template<class T>
1062 1064
    DfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1063 1065
    {
1064 1066
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1065 1067
      return DfsWizard<SetProcessedMapBase<T> >(*this);
1066 1068
    }
... ...
@@ -1205,13 +1207,14 @@
1205 1207
    /// \brief The type of the digraph the algorithm runs on.
1206 1208
    typedef GR Digraph;
1207 1209

	
1208 1210
    /// \brief The type of the map that indicates which nodes are reached.
1209 1211
    ///
1210 1212
    /// The type of the map that indicates which nodes are reached.
1211
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1213
    /// It must conform to the
1214
    /// \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1212 1215
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1213 1216

	
1214 1217
    /// \brief Instantiates a ReachedMap.
1215 1218
    ///
1216 1219
    /// This function instantiates a ReachedMap.
1217 1220
    /// \param digraph is the digraph, to which
... ...
@@ -1243,17 +1246,17 @@
1243 1246
  /// The value of GR is not used directly by \ref DfsVisit,
1244 1247
  /// it is only passed to \ref DfsVisitDefaultTraits.
1245 1248
  /// \tparam VS The Visitor type that is used by the algorithm.
1246 1249
  /// \ref DfsVisitor "DfsVisitor<GR>" is an empty visitor, which
1247 1250
  /// does not observe the DFS events. If you want to observe the DFS
1248 1251
  /// events, you should implement your own visitor class.
1249
  /// \tparam TR Traits class to set various data types used by the
1250
  /// algorithm. The default traits class is
1251
  /// \ref DfsVisitDefaultTraits "DfsVisitDefaultTraits<GR>".
1252
  /// See \ref DfsVisitDefaultTraits for the documentation of
1253
  /// a DFS visit traits class.
1252
  /// \tparam TR The traits class that defines various types used by the
1253
  /// algorithm. By default, it is \ref DfsVisitDefaultTraits
1254
  /// "DfsVisitDefaultTraits<GR>".
1255
  /// In most cases, this parameter should not be set directly,
1256
  /// consider to use the named template parameters instead.
1254 1257
#ifdef DOXYGEN
1255 1258
  template <typename GR, typename VS, typename TR>
1256 1259
#else
1257 1260
  template <typename GR = ListDigraph,
1258 1261
            typename VS = DfsVisitor<GR>,
1259 1262
            typename TR = DfsVisitDefaultTraits<GR> >
... ...
@@ -1366,14 +1369,14 @@
1366 1369

	
1367 1370
  public:
1368 1371

	
1369 1372
    /// \name Execution Control
1370 1373
    /// The simplest way to execute the DFS algorithm is to use one of the
1371 1374
    /// member functions called \ref run(Node) "run()".\n
1372
    /// If you need more control on the execution, first you have to call
1373
    /// \ref init(), then you can add a source node with \ref addSource()
1375
    /// If you need better control on the execution, you have to call
1376
    /// \ref init() first, then you can add a source node with \ref addSource()
1374 1377
    /// and perform the actual computation with \ref start().
1375 1378
    /// This procedure can be repeated if there are nodes that have not
1376 1379
    /// been reached.
1377 1380

	
1378 1381
    /// @{
1379 1382

	
... ...
@@ -1580,18 +1583,14 @@
1580 1583
      start(t);
1581 1584
      return reached(t);
1582 1585
    }
1583 1586

	
1584 1587
    /// \brief Runs the algorithm to visit all nodes in the digraph.
1585 1588

	
1586
    /// This method runs the %DFS algorithm in order to
1587
    /// compute the %DFS path to each node.
1588
    ///
1589
    /// The algorithm computes
1590
    /// - the %DFS tree (forest),
1591
    /// - the distance of each node from the root(s) in the %DFS tree.
1589
    /// This method runs the %DFS algorithm in order to visit all nodes
1590
    /// in the digraph.
1592 1591
    ///
1593 1592
    /// \note <tt>d.run()</tt> is just a shortcut of the following code.
1594 1593
    ///\code
1595 1594
    ///   d.init();
1596 1595
    ///   for (NodeIt n(digraph); n != INVALID; ++n) {
1597 1596
    ///     if (!d.reached(n)) {
... ...
@@ -1617,13 +1616,13 @@
1617 1616
    /// functions.\n
1618 1617
    /// Either \ref run(Node) "run()" or \ref start() should be called
1619 1618
    /// before using them.
1620 1619

	
1621 1620
    ///@{
1622 1621

	
1623
    /// \brief Checks if a node is reached from the root(s).
1622
    /// \brief Checks if the given node is reached from the root(s).
1624 1623
    ///
1625 1624
    /// Returns \c true if \c v is reached from the root(s).
1626 1625
    ///
1627 1626
    /// \pre Either \ref run(Node) "run()" or \ref init()
1628 1627
    /// must be called before using this function.
1629 1628
    bool reached(Node v) const { return (*_reached)[v]; }
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -67,15 +67,15 @@
67 67
    ///The type of the digraph the algorithm runs on.
68 68
    typedef GR Digraph;
69 69

	
70 70
    ///The type of the map that stores the arc lengths.
71 71

	
72 72
    ///The type of the map that stores the arc lengths.
73
    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
73
    ///It must conform to the \ref concepts::ReadMap "ReadMap" concept.
74 74
    typedef LEN LengthMap;
75
    ///The type of the length of the arcs.
75
    ///The type of the arc lengths.
76 76
    typedef typename LEN::Value Value;
77 77

	
78 78
    /// Operation traits for %Dijkstra algorithm.
79 79

	
80 80
    /// This class defines the operations that are used in the algorithm.
81 81
    /// \see DijkstraDefaultOperationTraits
... ...
@@ -113,13 +113,13 @@
113 113

	
114 114
    ///\brief The type of the map that stores the predecessor
115 115
    ///arcs of the shortest paths.
116 116
    ///
117 117
    ///The type of the map that stores the predecessor
118 118
    ///arcs of the shortest paths.
119
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
119
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
120 120
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
121 121
    ///Instantiates a \c PredMap.
122 122

	
123 123
    ///This function instantiates a \ref PredMap.
124 124
    ///\param g is the digraph, to which we would like to define the
125 125
    ///\ref PredMap.
... ...
@@ -128,14 +128,14 @@
128 128
      return new PredMap(g);
129 129
    }
130 130

	
131 131
    ///The type of the map that indicates which nodes are processed.
132 132

	
133 133
    ///The type of the map that indicates which nodes are processed.
134
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
135
    ///By default it is a NullMap.
134
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
135
    ///By default, it is a NullMap.
136 136
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
137 137
    ///Instantiates a \c ProcessedMap.
138 138

	
139 139
    ///This function instantiates a \ref ProcessedMap.
140 140
    ///\param g is the digraph, to which
141 141
    ///we would like to define the \ref ProcessedMap.
... ...
@@ -148,13 +148,13 @@
148 148
      return new ProcessedMap();
149 149
    }
150 150

	
151 151
    ///The type of the map that stores the distances of the nodes.
152 152

	
153 153
    ///The type of the map that stores the distances of the nodes.
154
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
154
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
155 155
    typedef typename Digraph::template NodeMap<typename LEN::Value> DistMap;
156 156
    ///Instantiates a \c DistMap.
157 157

	
158 158
    ///This function instantiates a \ref DistMap.
159 159
    ///\param g is the digraph, to which we would like to define
160 160
    ///the \ref DistMap.
... ...
@@ -166,12 +166,16 @@
166 166

	
167 167
  ///%Dijkstra algorithm class.
168 168

	
169 169
  /// \ingroup shortest_path
170 170
  ///This class provides an efficient implementation of the %Dijkstra algorithm.
171 171
  ///
172
  ///The %Dijkstra algorithm solves the single-source shortest path problem
173
  ///when all arc lengths are non-negative. If there are negative lengths,
174
  ///the BellmanFord algorithm should be used instead.
175
  ///
172 176
  ///The arc lengths are passed to the algorithm using a
173 177
  ///\ref concepts::ReadMap "ReadMap",
174 178
  ///so it is easy to change it to any kind of length.
175 179
  ///The type of the length is determined by the
176 180
  ///\ref concepts::ReadMap::Value "Value" of the length map.
177 181
  ///It is also possible to change the underlying priority heap.
... ...
@@ -185,12 +189,17 @@
185 189
  ///\tparam LEN A \ref concepts::ReadMap "readable" arc map that specifies
186 190
  ///the lengths of the arcs.
187 191
  ///It is read once for each arc, so the map may involve in
188 192
  ///relatively time consuming process to compute the arc lengths if
189 193
  ///it is necessary. The default map type is \ref
190 194
  ///concepts::Digraph::ArcMap "GR::ArcMap<int>".
195
  ///\tparam TR The traits class that defines various types used by the
196
  ///algorithm. By default, it is \ref DijkstraDefaultTraits
197
  ///"DijkstraDefaultTraits<GR, LEN>".
198
  ///In most cases, this parameter should not be set directly,
199
  ///consider to use the named template parameters instead.
191 200
#ifdef DOXYGEN
192 201
  template <typename GR, typename LEN, typename TR>
193 202
#else
194 203
  template <typename GR=ListDigraph,
195 204
            typename LEN=typename GR::template ArcMap<int>,
196 205
            typename TR=DijkstraDefaultTraits<GR,LEN> >
... ...
@@ -198,14 +207,14 @@
198 207
  class Dijkstra {
199 208
  public:
200 209

	
201 210
    ///The type of the digraph the algorithm runs on.
202 211
    typedef typename TR::Digraph Digraph;
203 212

	
204
    ///The type of the length of the arcs.
205
    typedef typename TR::LengthMap::Value Value;
213
    ///The type of the arc lengths.
214
    typedef typename TR::Value Value;
206 215
    ///The type of the map that stores the arc lengths.
207 216
    typedef typename TR::LengthMap LengthMap;
208 217
    ///\brief The type of the map that stores the predecessor arcs of the
209 218
    ///shortest paths.
210 219
    typedef typename TR::PredMap PredMap;
211 220
    ///The type of the map that stores the distances of the nodes.
... ...
@@ -301,13 +310,13 @@
301 310
    };
302 311
    ///\brief \ref named-templ-param "Named parameter" for setting
303 312
    ///\c PredMap type.
304 313
    ///
305 314
    ///\ref named-templ-param "Named parameter" for setting
306 315
    ///\c PredMap type.
307
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
316
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
308 317
    template <class T>
309 318
    struct SetPredMap
310 319
      : public Dijkstra< Digraph, LengthMap, SetPredMapTraits<T> > {
311 320
      typedef Dijkstra< Digraph, LengthMap, SetPredMapTraits<T> > Create;
312 321
    };
313 322

	
... ...
@@ -322,13 +331,13 @@
322 331
    };
323 332
    ///\brief \ref named-templ-param "Named parameter" for setting
324 333
    ///\c DistMap type.
325 334
    ///
326 335
    ///\ref named-templ-param "Named parameter" for setting
327 336
    ///\c DistMap type.
328
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
337
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
329 338
    template <class T>
330 339
    struct SetDistMap
331 340
      : public Dijkstra< Digraph, LengthMap, SetDistMapTraits<T> > {
332 341
      typedef Dijkstra< Digraph, LengthMap, SetDistMapTraits<T> > Create;
333 342
    };
334 343

	
... ...
@@ -343,13 +352,13 @@
343 352
    };
344 353
    ///\brief \ref named-templ-param "Named parameter" for setting
345 354
    ///\c ProcessedMap type.
346 355
    ///
347 356
    ///\ref named-templ-param "Named parameter" for setting
348 357
    ///\c ProcessedMap type.
349
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
358
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
350 359
    template <class T>
351 360
    struct SetProcessedMap
352 361
      : public Dijkstra< Digraph, LengthMap, SetProcessedMapTraits<T> > {
353 362
      typedef Dijkstra< Digraph, LengthMap, SetProcessedMapTraits<T> > Create;
354 363
    };
355 364

	
... ...
@@ -419,13 +428,13 @@
419 428
    ///\ref named-templ-param "Named parameter" for setting heap and cross
420 429
    ///reference types with automatic allocation.
421 430
    ///They should have standard constructor interfaces to be able to
422 431
    ///automatically created by the algorithm (i.e. the digraph should be
423 432
    ///passed to the constructor of the cross reference and the cross
424 433
    ///reference should be passed to the constructor of the heap).
425
    ///However external heap and cross reference objects could also be
434
    ///However, external heap and cross reference objects could also be
426 435
    ///passed to the algorithm using the \ref heap() function before
427 436
    ///calling \ref run(Node) "run()" or \ref init().
428 437
    ///\sa SetHeap
429 438
    template <class H, class CR = typename Digraph::template NodeMap<int> >
430 439
    struct SetStandardHeap
431 440
      : public Dijkstra< Digraph, LengthMap, SetStandardHeapTraits<H, CR> > {
... ...
@@ -440,12 +449,13 @@
440 449

	
441 450
    /// \brief \ref named-templ-param "Named parameter" for setting
442 451
    ///\c OperationTraits type
443 452
    ///
444 453
    ///\ref named-templ-param "Named parameter" for setting
445 454
    ///\c OperationTraits type.
455
    /// For more information, see \ref DijkstraDefaultOperationTraits.
446 456
    template <class T>
447 457
    struct SetOperationTraits
448 458
      : public Dijkstra<Digraph, LengthMap, SetOperationTraitsTraits<T> > {
449 459
      typedef Dijkstra<Digraph, LengthMap, SetOperationTraitsTraits<T> >
450 460
      Create;
451 461
    };
... ...
@@ -581,14 +591,14 @@
581 591

	
582 592
  public:
583 593

	
584 594
    ///\name Execution Control
585 595
    ///The simplest way to execute the %Dijkstra algorithm is to use
586 596
    ///one of the member functions called \ref run(Node) "run()".\n
587
    ///If you need more control on the execution, first you have to call
588
    ///\ref init(), then you can add several source nodes with
597
    ///If you need better control on the execution, you have to call
598
    ///\ref init() first, then you can add several source nodes with
589 599
    ///\ref addSource(). Finally the actual path computation can be
590 600
    ///performed with one of the \ref start() functions.
591 601

	
592 602
    ///@{
593 603

	
594 604
    ///\brief Initializes the internal data structures.
... ...
@@ -798,61 +808,63 @@
798 808

	
799 809
    ///@}
800 810

	
801 811
    ///\name Query Functions
802 812
    ///The results of the %Dijkstra algorithm can be obtained using these
803 813
    ///functions.\n
804
    ///Either \ref run(Node) "run()" or \ref start() should be called
814
    ///Either \ref run(Node) "run()" or \ref init() should be called
805 815
    ///before using them.
806 816

	
807 817
    ///@{
808 818

	
809
    ///The shortest path to a node.
819
    ///The shortest path to the given node.
810 820

	
811
    ///Returns the shortest path to a node.
821
    ///Returns the shortest path to the given node from the root(s).
812 822
    ///
813 823
    ///\warning \c t should be reached from the root(s).
814 824
    ///
815 825
    ///\pre Either \ref run(Node) "run()" or \ref init()
816 826
    ///must be called before using this function.
817 827
    Path path(Node t) const { return Path(*G, *_pred, t); }
818 828

	
819
    ///The distance of a node from the root(s).
829
    ///The distance of the given node from the root(s).
820 830

	
821
    ///Returns the distance of a node from the root(s).
831
    ///Returns the distance of the given node from the root(s).
822 832
    ///
823 833
    ///\warning If node \c v is not reached from the root(s), then
824 834
    ///the return value of this function is undefined.
825 835
    ///
826 836
    ///\pre Either \ref run(Node) "run()" or \ref init()
827 837
    ///must be called before using this function.
828 838
    Value dist(Node v) const { return (*_dist)[v]; }
829 839

	
830
    ///Returns the 'previous arc' of the shortest path tree for a node.
831

	
840
    ///\brief Returns the 'previous arc' of the shortest path tree for
841
    ///the given node.
842
    ///
832 843
    ///This function returns the 'previous arc' of the shortest path
833 844
    ///tree for the node \c v, i.e. it returns the last arc of a
834 845
    ///shortest path from a root to \c v. It is \c INVALID if \c v
835 846
    ///is not reached from the root(s) or if \c v is a root.
836 847
    ///
837 848
    ///The shortest path tree used here is equal to the shortest path
838
    ///tree used in \ref predNode().
849
    ///tree used in \ref predNode() and \ref predMap().
839 850
    ///
840 851
    ///\pre Either \ref run(Node) "run()" or \ref init()
841 852
    ///must be called before using this function.
842 853
    Arc predArc(Node v) const { return (*_pred)[v]; }
843 854

	
844
    ///Returns the 'previous node' of the shortest path tree for a node.
845

	
855
    ///\brief Returns the 'previous node' of the shortest path tree for
856
    ///the given node.
857
    ///
846 858
    ///This function returns the 'previous node' of the shortest path
847 859
    ///tree for the node \c v, i.e. it returns the last but one node
848
    ///from a shortest path from a root to \c v. It is \c INVALID
860
    ///of a shortest path from a root to \c v. It is \c INVALID
849 861
    ///if \c v is not reached from the root(s) or if \c v is a root.
850 862
    ///
851 863
    ///The shortest path tree used here is equal to the shortest path
852
    ///tree used in \ref predArc().
864
    ///tree used in \ref predArc() and \ref predMap().
853 865
    ///
854 866
    ///\pre Either \ref run(Node) "run()" or \ref init()
855 867
    ///must be called before using this function.
856 868
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
857 869
                                  G->source((*_pred)[v]); }
858 870

	
... ...
@@ -867,19 +879,19 @@
867 879
    const DistMap &distMap() const { return *_dist;}
868 880

	
869 881
    ///\brief Returns a const reference to the node map that stores the
870 882
    ///predecessor arcs.
871 883
    ///
872 884
    ///Returns a const reference to the node map that stores the predecessor
873
    ///arcs, which form the shortest path tree.
885
    ///arcs, which form the shortest path tree (forest).
874 886
    ///
875 887
    ///\pre Either \ref run(Node) "run()" or \ref init()
876 888
    ///must be called before using this function.
877 889
    const PredMap &predMap() const { return *_pred;}
878 890

	
879
    ///Checks if a node is reached from the root(s).
891
    ///Checks if the given node is reached from the root(s).
880 892

	
881 893
    ///Returns \c true if \c v is reached from the root(s).
882 894
    ///
883 895
    ///\pre Either \ref run(Node) "run()" or \ref init()
884 896
    ///must be called before using this function.
885 897
    bool reached(Node v) const { return (*_heap_cross_ref)[v] !=
... ...
@@ -892,15 +904,15 @@
892 904
    ///
893 905
    ///\pre Either \ref run(Node) "run()" or \ref init()
894 906
    ///must be called before using this function.
895 907
    bool processed(Node v) const { return (*_heap_cross_ref)[v] ==
896 908
                                          Heap::POST_HEAP; }
897 909

	
898
    ///The current distance of a node from the root(s).
910
    ///The current distance of the given node from the root(s).
899 911

	
900
    ///Returns the current distance of a node from the root(s).
912
    ///Returns the current distance of the given node from the root(s).
901 913
    ///It may be decreased in the following processes.
902 914
    ///
903 915
    ///\pre Either \ref run(Node) "run()" or \ref init()
904 916
    ///must be called before using this function and
905 917
    ///node \c v must be reached but not necessarily processed.
906 918
    Value currentDist(Node v) const {
... ...
@@ -921,15 +933,15 @@
921 933
  {
922 934
    ///The type of the digraph the algorithm runs on.
923 935
    typedef GR Digraph;
924 936
    ///The type of the map that stores the arc lengths.
925 937

	
926 938
    ///The type of the map that stores the arc lengths.
927
    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
939
    ///It must conform to the \ref concepts::ReadMap "ReadMap" concept.
928 940
    typedef LEN LengthMap;
929
    ///The type of the length of the arcs.
941
    ///The type of the arc lengths.
930 942
    typedef typename LEN::Value Value;
931 943

	
932 944
    /// Operation traits for Dijkstra algorithm.
933 945

	
934 946
    /// This class defines the operations that are used in the algorithm.
935 947
    /// \see DijkstraDefaultOperationTraits
... ...
@@ -970,13 +982,13 @@
970 982

	
971 983
    ///\brief The type of the map that stores the predecessor
972 984
    ///arcs of the shortest paths.
973 985
    ///
974 986
    ///The type of the map that stores the predecessor
975 987
    ///arcs of the shortest paths.
976
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
988
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
977 989
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
978 990
    ///Instantiates a PredMap.
979 991

	
980 992
    ///This function instantiates a PredMap.
981 993
    ///\param g is the digraph, to which we would like to define the
982 994
    ///PredMap.
... ...
@@ -985,14 +997,14 @@
985 997
      return new PredMap(g);
986 998
    }
987 999

	
988 1000
    ///The type of the map that indicates which nodes are processed.
989 1001

	
990 1002
    ///The type of the map that indicates which nodes are processed.
991
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
992
    ///By default it is a NullMap.
1003
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
1004
    ///By default, it is a NullMap.
993 1005
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
994 1006
    ///Instantiates a ProcessedMap.
995 1007

	
996 1008
    ///This function instantiates a ProcessedMap.
997 1009
    ///\param g is the digraph, to which
998 1010
    ///we would like to define the ProcessedMap.
... ...
@@ -1005,13 +1017,13 @@
1005 1017
      return new ProcessedMap();
1006 1018
    }
1007 1019

	
1008 1020
    ///The type of the map that stores the distances of the nodes.
1009 1021

	
1010 1022
    ///The type of the map that stores the distances of the nodes.
1011
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
1023
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
1012 1024
    typedef typename Digraph::template NodeMap<typename LEN::Value> DistMap;
1013 1025
    ///Instantiates a DistMap.
1014 1026

	
1015 1027
    ///This function instantiates a DistMap.
1016 1028
    ///\param g is the digraph, to which we would like to define
1017 1029
    ///the DistMap
... ...
@@ -1020,24 +1032,21 @@
1020 1032
      return new DistMap(g);
1021 1033
    }
1022 1034

	
1023 1035
    ///The type of the shortest paths.
1024 1036

	
1025 1037
    ///The type of the shortest paths.
1026
    ///It must meet the \ref concepts::Path "Path" concept.
1038
    ///It must conform to the \ref concepts::Path "Path" concept.
1027 1039
    typedef lemon::Path<Digraph> Path;
1028 1040
  };
1029 1041

	
1030 1042
  /// Default traits class used by DijkstraWizard
1031 1043

	
1032
  /// To make it easier to use Dijkstra algorithm
1033
  /// we have created a wizard class.
1034
  /// This \ref DijkstraWizard class needs default traits,
1035
  /// as well as the \ref Dijkstra class.
1036
  /// The \ref DijkstraWizardBase is a class to be the default traits of the
1037
  /// \ref DijkstraWizard class.
1044
  /// Default traits class used by DijkstraWizard.
1045
  /// \tparam GR The type of the digraph.
1046
  /// \tparam LEN The type of the length map.
1038 1047
  template<typename GR, typename LEN>
1039 1048
  class DijkstraWizardBase : public DijkstraWizardDefaultTraits<GR,LEN>
1040 1049
  {
1041 1050
    typedef DijkstraWizardDefaultTraits<GR,LEN> Base;
1042 1051
  protected:
1043 1052
    //The type of the nodes in the digraph.
... ...
@@ -1085,39 +1094,33 @@
1085 1094
  /// \ref dijkstra() "function-type interface" of \ref Dijkstra algorithm.
1086 1095
  /// It does not have own \ref run(Node) "run()" method, it uses the
1087 1096
  /// functions and features of the plain \ref Dijkstra.
1088 1097
  ///
1089 1098
  /// This class should only be used through the \ref dijkstra() function,
1090 1099
  /// which makes it easier to use the algorithm.
1100
  ///
1101
  /// \tparam TR The traits class that defines various types used by the
1102
  /// algorithm.
1091 1103
  template<class TR>
1092 1104
  class DijkstraWizard : public TR
1093 1105
  {
1094 1106
    typedef TR Base;
1095 1107

	
1096
    ///The type of the digraph the algorithm runs on.
1097 1108
    typedef typename TR::Digraph Digraph;
1098 1109

	
1099 1110
    typedef typename Digraph::Node Node;
1100 1111
    typedef typename Digraph::NodeIt NodeIt;
1101 1112
    typedef typename Digraph::Arc Arc;
1102 1113
    typedef typename Digraph::OutArcIt OutArcIt;
1103 1114

	
1104
    ///The type of the map that stores the arc lengths.
1105 1115
    typedef typename TR::LengthMap LengthMap;
1106
    ///The type of the length of the arcs.
1107 1116
    typedef typename LengthMap::Value Value;
1108
    ///\brief The type of the map that stores the predecessor
1109
    ///arcs of the shortest paths.
1110 1117
    typedef typename TR::PredMap PredMap;
1111
    ///The type of the map that stores the distances of the nodes.
1112 1118
    typedef typename TR::DistMap DistMap;
1113
    ///The type of the map that indicates which nodes are processed.
1114 1119
    typedef typename TR::ProcessedMap ProcessedMap;
1115
    ///The type of the shortest paths
1116 1120
    typedef typename TR::Path Path;
1117
    ///The heap type used by the dijkstra algorithm.
1118 1121
    typedef typename TR::Heap Heap;
1119 1122

	
1120 1123
  public:
1121 1124

	
1122 1125
    /// Constructor.
1123 1126
    DijkstraWizard() : TR() {}
... ...
@@ -1183,17 +1186,18 @@
1183 1186
    template<class T>
1184 1187
    struct SetPredMapBase : public Base {
1185 1188
      typedef T PredMap;
1186 1189
      static PredMap *createPredMap(const Digraph &) { return 0; };
1187 1190
      SetPredMapBase(const TR &b) : TR(b) {}
1188 1191
    };
1189
    ///\brief \ref named-func-param "Named parameter"
1190
    ///for setting PredMap object.
1192

	
1193
    ///\brief \ref named-templ-param "Named parameter" for setting
1194
    ///the predecessor map.
1191 1195
    ///
1192
    ///\ref named-func-param "Named parameter"
1193
    ///for setting PredMap object.
1196
    ///\ref named-templ-param "Named parameter" function for setting
1197
    ///the map that stores the predecessor arcs of the nodes.
1194 1198
    template<class T>
1195 1199
    DijkstraWizard<SetPredMapBase<T> > predMap(const T &t)
1196 1200
    {
1197 1201
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1198 1202
      return DijkstraWizard<SetPredMapBase<T> >(*this);
1199 1203
    }
... ...
@@ -1201,17 +1205,19 @@
1201 1205
    template<class T>
1202 1206
    struct SetDistMapBase : public Base {
1203 1207
      typedef T DistMap;
1204 1208
      static DistMap *createDistMap(const Digraph &) { return 0; };
1205 1209
      SetDistMapBase(const TR &b) : TR(b) {}
1206 1210
    };
1207
    ///\brief \ref named-func-param "Named parameter"
1208
    ///for setting DistMap object.
1211

	
1212
    ///\brief \ref named-templ-param "Named parameter" for setting
1213
    ///the distance map.
1209 1214
    ///
1210
    ///\ref named-func-param "Named parameter"
1211
    ///for setting DistMap object.
1215
    ///\ref named-templ-param "Named parameter" function for setting
1216
    ///the map that stores the distances of the nodes calculated
1217
    ///by the algorithm.
1212 1218
    template<class T>
1213 1219
    DijkstraWizard<SetDistMapBase<T> > distMap(const T &t)
1214 1220
    {
1215 1221
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1216 1222
      return DijkstraWizard<SetDistMapBase<T> >(*this);
1217 1223
    }
... ...
@@ -1219,29 +1225,31 @@
1219 1225
    template<class T>
1220 1226
    struct SetProcessedMapBase : public Base {
1221 1227
      typedef T ProcessedMap;
1222 1228
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1223 1229
      SetProcessedMapBase(const TR &b) : TR(b) {}
1224 1230
    };
1225
    ///\brief \ref named-func-param "Named parameter"
1226
    ///for setting ProcessedMap object.
1231

	
1232
    ///\brief \ref named-func-param "Named parameter" for setting
1233
    ///the processed map.
1227 1234
    ///
1228
    /// \ref named-func-param "Named parameter"
1229
    ///for setting ProcessedMap object.
1235
    ///\ref named-templ-param "Named parameter" function for setting
1236
    ///the map that indicates which nodes are processed.
1230 1237
    template<class T>
1231 1238
    DijkstraWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1232 1239
    {
1233 1240
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1234 1241
      return DijkstraWizard<SetProcessedMapBase<T> >(*this);
1235 1242
    }
1236 1243

	
1237 1244
    template<class T>
1238 1245
    struct SetPathBase : public Base {
1239 1246
      typedef T Path;
1240 1247
      SetPathBase(const TR &b) : TR(b) {}
1241 1248
    };
1249

	
1242 1250
    ///\brief \ref named-func-param "Named parameter"
1243 1251
    ///for getting the shortest path to the target node.
1244 1252
    ///
1245 1253
    ///\ref named-func-param "Named parameter"
1246 1254
    ///for getting the shortest path to the target node.
1247 1255
    template<class T>
Ignore white space 6 line context
... ...
@@ -18,32 +18,25 @@
18 18

	
19 19
#ifndef LEMON_DIM2_H
20 20
#define LEMON_DIM2_H
21 21

	
22 22
#include <iostream>
23 23

	
24
///\ingroup misc
24
///\ingroup geomdat
25 25
///\file
26 26
///\brief A simple two dimensional vector and a bounding box implementation
27
///
28
/// The class \ref lemon::dim2::Point "dim2::Point" implements
29
/// a two dimensional vector with the usual operations.
30
///
31
/// The class \ref lemon::dim2::Box "dim2::Box" can be used to determine
32
/// the rectangular bounding box of a set of
33
/// \ref lemon::dim2::Point "dim2::Point"'s.
34 27

	
35 28
namespace lemon {
36 29

	
37 30
  ///Tools for handling two dimensional coordinates
38 31

	
39 32
  ///This namespace is a storage of several
40 33
  ///tools for handling two dimensional coordinates
41 34
  namespace dim2 {
42 35

	
43
  /// \addtogroup misc
36
  /// \addtogroup geomdat
44 37
  /// @{
45 38

	
46 39
  /// Two dimensional vector (plain vector)
47 40

	
48 41
  /// A simple two dimensional vector (plain vector) implementation
49 42
  /// with the usual vector operations.
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -58,13 +58,13 @@
58 58
    DimacsDescriptor() : type(NONE) {}
59 59
  };
60 60

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

	
63 63
  ///This function starts seeking the beginning of the given file for the
64
  ///problem type and size info. 
64
  ///problem type and size info.
65 65
  ///The found data is returned in a special struct that can be evaluated
66 66
  ///and passed to the appropriate reader function.
67 67
  DimacsDescriptor dimacsType(std::istream& is)
68 68
  {
69 69
    DimacsDescriptor r;
70 70
    std::string problem,str;
... ...
@@ -209,13 +209,13 @@
209 209
    typedef typename CapacityMap::Value Capacity;
210 210

	
211 211
    if(infty==0)
212 212
      infty = std::numeric_limits<Capacity>::has_infinity ?
213 213
        std::numeric_limits<Capacity>::infinity() :
214 214
        std::numeric_limits<Capacity>::max();
215
 
215

	
216 216
    while (is >> c) {
217 217
      switch (c) {
218 218
      case 'c': // comment line
219 219
        getline(is, str);
220 220
        break;
221 221
      case 'n': // node definition line
... ...
@@ -234,13 +234,13 @@
234 234
      case 'a': // arc definition line
235 235
        if (desc.type==DimacsDescriptor::SP) {
236 236
          is >> i >> j >> _cap;
237 237
          getline(is, str);
238 238
          e = g.addArc(nodes[i], nodes[j]);
239 239
          capacity.set(e, _cap);
240
        } 
240
        }
241 241
        else if (desc.type==DimacsDescriptor::MAX) {
242 242
          is >> i >> j >> _cap;
243 243
          getline(is, str);
244 244
          e = g.addArc(nodes[i], nodes[j]);
245 245
          if (_cap >= 0)
246 246
            capacity.set(e, _cap);
... ...
@@ -359,17 +359,17 @@
359 359
  typename disable_if<lemon::UndirectedTagIndicator<Graph>,void>::type
360 360
  _addArcEdge(Graph &g, typename Graph::Node s, typename Graph::Node t,
361 361
              dummy<1> = 1)
362 362
  {
363 363
    g.addArc(s,t);
364 364
  }
365
  
365

	
366 366
  /// \brief DIMACS plain (di)graph reader function.
367 367
  ///
368 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 
369
  /// and maps (e.g. a matching instance) from DIMACS format, i.e. from
370 370
  /// DIMACS files having a line starting with
371 371
  /// \code
372 372
  ///   p mat
373 373
  /// \endcode
374 374
  /// At the beginning, \c g is cleared by \c g.clear().
375 375
  ///
... ...
@@ -389,13 +389,13 @@
389 389
    int i, j;
390 390
    std::string str;
391 391
    nodes.resize(desc.nodeNum + 1);
392 392
    for (int k = 1; k <= desc.nodeNum; ++k) {
393 393
      nodes[k] = g.addNode();
394 394
    }
395
    
395

	
396 396
    while (is >> c) {
397 397
      switch (c) {
398 398
      case 'c': // comment line
399 399
        getline(is, str);
400 400
        break;
401 401
      case 'n': // node definition line
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -252,19 +252,20 @@
252 252
  /// This implementation is based on doubly-linked lists, from each
253 253
  /// node the outgoing and the incoming arcs make up lists, therefore
254 254
  /// one arc can be erased in constant time. It also makes possible,
255 255
  /// that node can be removed from the underlying graph, in this case
256 256
  /// all arcs incident to the given node is erased from the arc set.
257 257
  ///
258
  /// This class fully conforms to the \ref concepts::Digraph
259
  /// "Digraph" concept.
260
  /// It provides only linear time counting for nodes and arcs.
261
  ///
258 262
  /// \param GR The type of the graph which shares its node set with
259 263
  /// this class. Its interface must conform to the
260 264
  /// \ref concepts::Digraph "Digraph" or \ref concepts::Graph "Graph"
261 265
  /// concept.
262
  ///
263
  /// This class fully conforms to the \ref concepts::Digraph
264
  /// "Digraph" concept.
265 266
  template <typename GR>
266 267
  class ListArcSet : public ArcSetExtender<ListArcSetBase<GR> > {
267 268
    typedef ArcSetExtender<ListArcSetBase<GR> > Parent;
268 269

	
269 270
  public:
270 271

	
... ...
@@ -682,19 +683,20 @@
682 683
  /// This implementation is based on doubly-linked lists, from each
683 684
  /// node the incident edges make up lists, therefore one edge can be
684 685
  /// erased in constant time. It also makes possible, that node can
685 686
  /// be removed from the underlying graph, in this case all edges
686 687
  /// incident to the given node is erased from the arc set.
687 688
  ///
689
  /// This class fully conforms to the \ref concepts::Graph "Graph"
690
  /// concept.
691
  /// It provides only linear time counting for nodes, edges and arcs.
692
  ///
688 693
  /// \param GR The type of the graph which shares its node set
689 694
  /// with this class. Its interface must conform to the
690 695
  /// \ref concepts::Digraph "Digraph" or \ref concepts::Graph "Graph"
691 696
  /// concept.
692
  ///
693
  /// This class fully conforms to the \ref concepts::Graph "Graph"
694
  /// concept.
695 697
  template <typename GR>
696 698
  class ListEdgeSet : public EdgeSetExtender<ListEdgeSetBase<GR> > {
697 699
    typedef EdgeSetExtender<ListEdgeSetBase<GR> > Parent;
698 700

	
699 701
  public:
700 702

	
... ...
@@ -864,13 +866,13 @@
864 866
    }
865 867

	
866 868
    void first(Arc& arc) const {
867 869
      arc.id = arcs.size() - 1;
868 870
    }
869 871

	
870
    void next(Arc& arc) const {
872
    static void next(Arc& arc) {
871 873
      --arc.id;
872 874
    }
873 875

	
874 876
    void firstOut(Arc& arc, const Node& node) const {
875 877
      arc.id = (*_nodes)[node].first_out;
876 878
    }
... ...
@@ -951,19 +953,20 @@
951 953
  ///
952 954
  /// This implementation is slightly faster than the \c ListArcSet,
953 955
  /// because it uses continuous storage for arcs and it uses just
954 956
  /// single-linked lists for enumerate outgoing and incoming
955 957
  /// arcs. Therefore the arcs cannot be erased from the arc sets.
956 958
  ///
959
  /// This class fully conforms to the \ref concepts::Digraph "Digraph"
960
  /// concept.
961
  /// It provides only linear time counting for nodes and arcs.
962
  ///
957 963
  /// \warning If a node is erased from the underlying graph and this
958 964
  /// node is the source or target of one arc in the arc set, then
959 965
  /// the arc set is invalidated, and it cannot be used anymore. The
960 966
  /// validity can be checked with the \c valid() member function.
961
  ///
962
  /// This class fully conforms to the \ref concepts::Digraph
963
  /// "Digraph" concept.
964 967
  template <typename GR>
965 968
  class SmartArcSet : public ArcSetExtender<SmartArcSetBase<GR> > {
966 969
    typedef ArcSetExtender<SmartArcSetBase<GR> > Parent;
967 970

	
968 971
  public:
969 972

	
... ...
@@ -1170,21 +1173,21 @@
1170 1173
    }
1171 1174

	
1172 1175
    void first(Arc& arc) const {
1173 1176
      arc.id = arcs.size() - 1;
1174 1177
    }
1175 1178

	
1176
    void next(Arc& arc) const {
1179
    static void next(Arc& arc) {
1177 1180
      --arc.id;
1178 1181
    }
1179 1182

	
1180 1183
    void first(Edge& arc) const {
1181 1184
      arc.id = arcs.size() / 2 - 1;
1182 1185
    }
1183 1186

	
1184
    void next(Edge& arc) const {
1187
    static void next(Edge& arc) {
1185 1188
      --arc.id;
1186 1189
    }
1187 1190

	
1188 1191
    void firstOut(Arc& arc, const Node& node) const {
1189 1192
      arc.id = (*_nodes)[node].first_out;
1190 1193
    }
... ...
@@ -1301,19 +1304,20 @@
1301 1304
  ///
1302 1305
  /// This implementation is slightly faster than the \c ListEdgeSet,
1303 1306
  /// because it uses continuous storage for edges and it uses just
1304 1307
  /// single-linked lists for enumerate incident edges. Therefore the
1305 1308
  /// edges cannot be erased from the edge sets.
1306 1309
  ///
1310
  /// This class fully conforms to the \ref concepts::Graph "Graph"
1311
  /// concept.
1312
  /// It provides only linear time counting for nodes, edges and arcs.
1313
  ///
1307 1314
  /// \warning If a node is erased from the underlying graph and this
1308 1315
  /// node is incident to one edge in the edge set, then the edge set
1309 1316
  /// is invalidated, and it cannot be used anymore. The validity can
1310 1317
  /// be checked with the \c valid() member function.
1311
  ///
1312
  /// This class fully conforms to the \ref concepts::Graph
1313
  /// "Graph" concept.
1314 1318
  template <typename GR>
1315 1319
  class SmartEdgeSet : public EdgeSetExtender<SmartEdgeSetBase<GR> > {
1316 1320
    typedef EdgeSetExtender<SmartEdgeSetBase<GR> > Parent;
1317 1321

	
1318 1322
  public:
1319 1323

	
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -23,13 +23,13 @@
23 23
#include<lemon/adaptors.h>
24 24
#include<lemon/connectivity.h>
25 25
#include <list>
26 26

	
27 27
/// \ingroup graph_properties
28 28
/// \file
29
/// \brief Euler tour iterators and a function for checking the \e Eulerian 
29
/// \brief Euler tour iterators and a function for checking the \e Eulerian
30 30
/// property.
31 31
///
32 32
///This file provides Euler tour iterators and a function to check
33 33
///if a (di)graph is \e Eulerian.
34 34

	
35 35
namespace lemon {
... ...
@@ -38,13 +38,13 @@
38 38

	
39 39
  /// \ingroup graph_prop
40 40
  ///This iterator provides an Euler tour (Eulerian circuit) of a \e directed
41 41
  ///graph (if there exists) and it converts to the \c Arc type of the digraph.
42 42
  ///
43 43
  ///For example, if the given digraph has an Euler tour (i.e it has only one
44
  ///non-trivial component and the in-degree is equal to the out-degree 
44
  ///non-trivial component and the in-degree is equal to the out-degree
45 45
  ///for all nodes), then the following code will put the arcs of \c g
46 46
  ///to the vector \c et according to an Euler tour of \c g.
47 47
  ///\code
48 48
  ///  std::vector<ListDigraph::Arc> et;
49 49
  ///  for(DiEulerIt<ListDigraph> e(g); e!=INVALID; ++e)
50 50
  ///    et.push_back(e);
... ...
@@ -135,22 +135,22 @@
135 135

	
136 136
  /// \ingroup graph_properties
137 137
  ///This iterator provides an Euler tour (Eulerian circuit) of an
138 138
  ///\e undirected graph (if there exists) and it converts to the \c Arc
139 139
  ///and \c Edge types of the graph.
140 140
  ///
141
  ///For example, if the given graph has an Euler tour (i.e it has only one 
141
  ///For example, if the given graph has an Euler tour (i.e it has only one
142 142
  ///non-trivial component and the degree of each node is even),
143 143
  ///the following code will print the arc IDs according to an
144 144
  ///Euler tour of \c g.
145 145
  ///\code
146 146
  ///  for(EulerIt<ListGraph> e(g); e!=INVALID; ++e) {
147 147
  ///    std::cout << g.id(Edge(e)) << std::eol;
148 148
  ///  }
149 149
  ///\endcode
150
  ///Although this iterator is for undirected graphs, it still returns 
150
  ///Although this iterator is for undirected graphs, it still returns
151 151
  ///arcs in order to indicate the direction of the tour.
152 152
  ///(But arcs convert to edges, of course.)
153 153
  ///
154 154
  ///If \c g has no Euler tour, then the resulted walk will not be closed
155 155
  ///or not contain all edges.
156 156
  template<typename GR>
... ...
@@ -230,13 +230,13 @@
230 230
    }
231 231

	
232 232
    ///Postfix incrementation
233 233

	
234 234
    /// Postfix incrementation.
235 235
    ///
236
    ///\warning This incrementation returns an \c Arc (which converts to 
236
    ///\warning This incrementation returns an \c Arc (which converts to
237 237
    ///an \c Edge), not an \ref EulerIt, as one may expect.
238 238
    Arc operator++(int)
239 239
    {
240 240
      Arc e=*this;
241 241
      ++(*this);
242 242
      return e;
Ignore white space 6 line context
... ...
@@ -17,59 +17,55 @@
17 17
 */
18 18

	
19 19
#ifndef LEMON_FIB_HEAP_H
20 20
#define LEMON_FIB_HEAP_H
21 21

	
22 22
///\file
23
///\ingroup auxdat
24
///\brief Fibonacci Heap implementation.
23
///\ingroup heaps
24
///\brief Fibonacci heap implementation.
25 25

	
26 26
#include <vector>
27
#include <utility>
27 28
#include <functional>
28 29
#include <lemon/math.h>
29 30

	
30 31
namespace lemon {
31 32

	
32
  /// \ingroup auxdat
33
  /// \ingroup heaps
33 34
  ///
34
  ///\brief Fibonacci Heap.
35
  /// \brief Fibonacci heap data structure.
35 36
  ///
36
  ///This class implements the \e Fibonacci \e heap data structure. A \e heap
37
  ///is a data structure for storing items with specified values called \e
38
  ///priorities in such a way that finding the item with minimum priority is
39
  ///efficient. \c CMP specifies the ordering of the priorities. In a heap
40
  ///one can change the priority of an item, add or erase an item, etc.
37
  /// This class implements the \e Fibonacci \e heap data structure.
38
  /// It fully conforms to the \ref concepts::Heap "heap concept".
41 39
  ///
42
  ///The methods \ref increase and \ref erase are not efficient in a Fibonacci
43
  ///heap. In case of many calls to these operations, it is better to use a
44
  ///\ref BinHeap "binary heap".
40
  /// The methods \ref increase() and \ref erase() are not efficient in a
41
  /// Fibonacci heap. In case of many calls of these operations, it is
42
  /// better to use other heap structure, e.g. \ref BinHeap "binary heap".
45 43
  ///
46
  ///\param PRIO Type of the priority of the items.
47
  ///\param IM A read and writable Item int map, used internally
48
  ///to handle the cross references.
49
  ///\param CMP A class for the ordering of the priorities. The
50
  ///default is \c std::less<PRIO>.
51
  ///
52
  ///\sa BinHeap
53
  ///\sa Dijkstra
44
  /// \tparam PR Type of the priorities of the items.
45
  /// \tparam IM A read-writable item map with \c int values, used
46
  /// internally to handle the cross references.
47
  /// \tparam CMP A functor class for comparing the priorities.
48
  /// The default is \c std::less<PR>.
54 49
#ifdef DOXYGEN
55
  template <typename PRIO, typename IM, typename CMP>
50
  template <typename PR, typename IM, typename CMP>
56 51
#else
57
  template <typename PRIO, typename IM, typename CMP = std::less<PRIO> >
52
  template <typename PR, typename IM, typename CMP = std::less<PR> >
58 53
#endif
59 54
  class FibHeap {
60 55
  public:
61
    ///\e
56

	
57
    /// Type of the item-int map.
62 58
    typedef IM ItemIntMap;
63
    ///\e
64
    typedef PRIO Prio;
65
    ///\e
59
    /// Type of the priorities.
60
    typedef PR Prio;
61
    /// Type of the items stored in the heap.
66 62
    typedef typename ItemIntMap::Key Item;
67
    ///\e
63
    /// Type of the item-priority pairs.
68 64
    typedef std::pair<Item,Prio> Pair;
69
    ///\e
65
    /// Functor type for comparing the priorities.
70 66
    typedef CMP Compare;
71 67

	
72 68
  private:
73 69
    class Store;
74 70

	
75 71
    std::vector<Store> _data;
... ...
@@ -77,80 +73,74 @@
77 73
    ItemIntMap &_iim;
78 74
    Compare _comp;
79 75
    int _num;
80 76

	
81 77
  public:
82 78

	
83
    /// \brief Type to represent the items states.
79
    /// \brief Type to represent the states of the items.
84 80
    ///
85
    /// Each Item element have a state associated to it. It may be "in heap",
86
    /// "pre heap" or "post heap". The latter two are indifferent from the
81
    /// Each item has a state associated to it. It can be "in heap",
82
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
87 83
    /// heap's point of view, but may be useful to the user.
88 84
    ///
89 85
    /// The item-int map must be initialized in such way that it assigns
90 86
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
91 87
    enum State {
92 88
      IN_HEAP = 0,    ///< = 0.
93 89
      PRE_HEAP = -1,  ///< = -1.
94 90
      POST_HEAP = -2  ///< = -2.
95 91
    };
96 92

	
97
    /// \brief The constructor
93
    /// \brief Constructor.
98 94
    ///
99
    /// \c map should be given to the constructor, since it is
100
    ///   used internally to handle the cross references.
95
    /// Constructor.
96
    /// \param map A map that assigns \c int values to the items.
97
    /// It is used internally to handle the cross references.
98
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
101 99
    explicit FibHeap(ItemIntMap &map)
102 100
      : _minimum(0), _iim(map), _num() {}
103 101

	
104
    /// \brief The constructor
102
    /// \brief Constructor.
105 103
    ///
106
    /// \c map should be given to the constructor, since it is used
107
    /// internally to handle the cross references. \c comp is an
108
    /// object for ordering of the priorities.
104
    /// Constructor.
105
    /// \param map A map that assigns \c int values to the items.
106
    /// It is used internally to handle the cross references.
107
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
108
    /// \param comp The function object used for comparing the priorities.
109 109
    FibHeap(ItemIntMap &map, const Compare &comp)
110 110
      : _minimum(0), _iim(map), _comp(comp), _num() {}
111 111

	
112 112
    /// \brief The number of items stored in the heap.
113 113
    ///
114
    /// Returns the number of items stored in the heap.
114
    /// This function returns the number of items stored in the heap.
115 115
    int size() const { return _num; }
116 116

	
117
    /// \brief Checks if the heap stores no items.
117
    /// \brief Check if the heap is empty.
118 118
    ///
119
    ///   Returns \c true if and only if the heap stores no items.
119
    /// This function returns \c true if the heap is empty.
120 120
    bool empty() const { return _num==0; }
121 121

	
122
    /// \brief Make empty this heap.
122
    /// \brief Make the heap empty.
123 123
    ///
124
    /// Make empty this heap. It does not change the cross reference
125
    /// map.  If you want to reuse a heap what is not surely empty you
126
    /// should first clear the heap and after that you should set the
127
    /// cross reference map for each item to \c PRE_HEAP.
124
    /// This functon makes the heap empty.
125
    /// It does not change the cross reference map. If you want to reuse
126
    /// a heap that is not surely empty, you should first clear it and
127
    /// then you should set the cross reference map to \c PRE_HEAP
128
    /// for each item.
128 129
    void clear() {
129 130
      _data.clear(); _minimum = 0; _num = 0;
130 131
    }
131 132

	
132
    /// \brief \c item gets to the heap with priority \c value independently
133
    /// if \c item was already there.
133
    /// \brief Insert an item into the heap with the given priority.
134 134
    ///
135
    /// This method calls \ref push(\c item, \c value) if \c item is not
136
    /// stored in the heap and it calls \ref decrease(\c item, \c value) or
137
    /// \ref increase(\c item, \c value) otherwise.
138
    void set (const Item& item, const Prio& value) {
139
      int i=_iim[item];
140
      if ( i >= 0 && _data[i].in ) {
141
        if ( _comp(value, _data[i].prio) ) decrease(item, value);
142
        if ( _comp(_data[i].prio, value) ) increase(item, value);
143
      } else push(item, value);
144
    }
145

	
146
    /// \brief Adds \c item to the heap with priority \c value.
147
    ///
148
    /// Adds \c item to the heap with priority \c value.
149
    /// \pre \c item must not be stored in the heap.
150
    void push (const Item& item, const Prio& value) {
135
    /// This function inserts the given item into the heap with the
136
    /// given priority.
137
    /// \param item The item to insert.
138
    /// \param prio The priority of the item.
139
    /// \pre \e item must not be stored in the heap.
140
    void push (const Item& item, const Prio& prio) {
151 141
      int i=_iim[item];
152 142
      if ( i < 0 ) {
153 143
        int s=_data.size();
154 144
        _iim.set( item, s );
155 145
        Store st;
156 146
        st.name=item;
... ...
@@ -165,82 +155,74 @@
165 155

	
166 156
      if ( _num ) {
167 157
        _data[_data[_minimum].right_neighbor].left_neighbor=i;
168 158
        _data[i].right_neighbor=_data[_minimum].right_neighbor;
169 159
        _data[_minimum].right_neighbor=i;
170 160
        _data[i].left_neighbor=_minimum;
171
        if ( _comp( value, _data[_minimum].prio) ) _minimum=i;
161
        if ( _comp( prio, _data[_minimum].prio) ) _minimum=i;
172 162
      } else {
173 163
        _data[i].right_neighbor=_data[i].left_neighbor=i;
174 164
        _minimum=i;
175 165
      }
176
      _data[i].prio=value;
166
      _data[i].prio=prio;
177 167
      ++_num;
178 168
    }
179 169

	
180
    /// \brief Returns the item with minimum priority relative to \c Compare.
170
    /// \brief Return the item having minimum priority.
181 171
    ///
182
    /// This method returns the item with minimum priority relative to \c
183
    /// Compare.
184
    /// \pre The heap must be nonempty.
172
    /// This function returns the item having minimum priority.
173
    /// \pre The heap must be non-empty.
185 174
    Item top() const { return _data[_minimum].name; }
186 175

	
187
    /// \brief Returns the minimum priority relative to \c Compare.
176
    /// \brief The minimum priority.
188 177
    ///
189
    /// It returns the minimum priority relative to \c Compare.
190
    /// \pre The heap must be nonempty.
191
    const Prio& prio() const { return _data[_minimum].prio; }
178
    /// This function returns the minimum priority.
179
    /// \pre The heap must be non-empty.
180
    Prio prio() const { return _data[_minimum].prio; }
192 181

	
193
    /// \brief Returns the priority of \c item.
182
    /// \brief Remove the item having minimum priority.
194 183
    ///
195
    /// It returns the priority of \c item.
196
    /// \pre \c item must be in the heap.
197
    const Prio& operator[](const Item& item) const {
198
      return _data[_iim[item]].prio;
199
    }
200

	
201
    /// \brief Deletes the item with minimum priority relative to \c Compare.
202
    ///
203
    /// This method deletes the item with minimum priority relative to \c
204
    /// Compare from the heap.
184
    /// This function removes the item having minimum priority.
205 185
    /// \pre The heap must be non-empty.
206 186
    void pop() {
207 187
      /*The first case is that there are only one root.*/
208 188
      if ( _data[_minimum].left_neighbor==_minimum ) {
209 189
        _data[_minimum].in=false;
210 190
        if ( _data[_minimum].degree!=0 ) {
211
          makeroot(_data[_minimum].child);
191
          makeRoot(_data[_minimum].child);
212 192
          _minimum=_data[_minimum].child;
213 193
          balance();
214 194
        }
215 195
      } else {
216 196
        int right=_data[_minimum].right_neighbor;
217 197
        unlace(_minimum);
218 198
        _data[_minimum].in=false;
219 199
        if ( _data[_minimum].degree > 0 ) {
220 200
          int left=_data[_minimum].left_neighbor;
221 201
          int child=_data[_minimum].child;
222 202
          int last_child=_data[child].left_neighbor;
223 203

	
224
          makeroot(child);
204
          makeRoot(child);
225 205

	
226 206
          _data[left].right_neighbor=child;
227 207
          _data[child].left_neighbor=left;
228 208
          _data[right].left_neighbor=last_child;
229 209
          _data[last_child].right_neighbor=right;
230 210
        }
231 211
        _minimum=right;
232 212
        balance();
233 213
      } // the case where there are more roots
234 214
      --_num;
235 215
    }
236 216

	
237
    /// \brief Deletes \c item from the heap.
217
    /// \brief Remove the given item from the heap.
238 218
    ///
239
    /// This method deletes \c item from the heap, if \c item was already
240
    /// stored in the heap. It is quite inefficient in Fibonacci heaps.
219
    /// This function removes the given item from the heap if it is
220
    /// already stored.
221
    /// \param item The item to delete.
222
    /// \pre \e item must be in the heap.
241 223
    void erase (const Item& item) {
242 224
      int i=_iim[item];
243 225

	
244 226
      if ( i >= 0 && _data[i].in ) {
245 227
        if ( _data[i].parent!=-1 ) {
246 228
          int p=_data[i].parent;
... ...
@@ -249,63 +231,88 @@
249 231
        }
250 232
        _minimum=i;     //As if its prio would be -infinity
251 233
        pop();
252 234
      }
253 235
    }
254 236

	
255
    /// \brief Decreases the priority of \c item to \c value.
237
    /// \brief The priority of the given item.
256 238
    ///
257
    /// This method decreases the priority of \c item to \c value.
258
    /// \pre \c item must be stored in the heap with priority at least \c
259
    ///   value relative to \c Compare.
260
    void decrease (Item item, const Prio& value) {
239
    /// This function returns the priority of the given item.
240
    /// \param item The item.
241
    /// \pre \e item must be in the heap.
242
    Prio operator[](const Item& item) const {
243
      return _data[_iim[item]].prio;
244
    }
245

	
246
    /// \brief Set the priority of an item or insert it, if it is
247
    /// not stored in the heap.
248
    ///
249
    /// This method sets the priority of the given item if it is
250
    /// already stored in the heap. Otherwise it inserts the given
251
    /// item into the heap with the given priority.
252
    /// \param item The item.
253
    /// \param prio The priority.
254
    void set (const Item& item, const Prio& prio) {
261 255
      int i=_iim[item];
262
      _data[i].prio=value;
256
      if ( i >= 0 && _data[i].in ) {
257
        if ( _comp(prio, _data[i].prio) ) decrease(item, prio);
258
        if ( _comp(_data[i].prio, prio) ) increase(item, prio);
259
      } else push(item, prio);
260
    }
261

	
262
    /// \brief Decrease the priority of an item to the given value.
263
    ///
264
    /// This function decreases the priority of an item to the given value.
265
    /// \param item The item.
266
    /// \param prio The priority.
267
    /// \pre \e item must be stored in the heap with priority at least \e prio.
268
    void decrease (const Item& item, const Prio& prio) {
269
      int i=_iim[item];
270
      _data[i].prio=prio;
263 271
      int p=_data[i].parent;
264 272

	
265
      if ( p!=-1 && _comp(value, _data[p].prio) ) {
273
      if ( p!=-1 && _comp(prio, _data[p].prio) ) {
266 274
        cut(i,p);
267 275
        cascade(p);
268 276
      }
269
      if ( _comp(value, _data[_minimum].prio) ) _minimum=i;
277
      if ( _comp(prio, _data[_minimum].prio) ) _minimum=i;
270 278
    }
271 279

	
272
    /// \brief Increases the priority of \c item to \c value.
280
    /// \brief Increase the priority of an item to the given value.
273 281
    ///
274
    /// This method sets the priority of \c item to \c value. Though
275
    /// there is no precondition on the priority of \c item, this
276
    /// method should be used only if it is indeed necessary to increase
277
    /// (relative to \c Compare) the priority of \c item, because this
278
    /// method is inefficient.
279
    void increase (Item item, const Prio& value) {
282
    /// This function increases the priority of an item to the given value.
283
    /// \param item The item.
284
    /// \param prio The priority.
285
    /// \pre \e item must be stored in the heap with priority at most \e prio.
286
    void increase (const Item& item, const Prio& prio) {
280 287
      erase(item);
281
      push(item, value);
288
      push(item, prio);
282 289
    }
283 290

	
284

	
285
    /// \brief Returns if \c item is in, has already been in, or has never
286
    /// been in the heap.
291
    /// \brief Return the state of an item.
287 292
    ///
288
    /// This method returns PRE_HEAP if \c item has never been in the
289
    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
290
    /// otherwise. In the latter case it is possible that \c item will
291
    /// get back to the heap again.
293
    /// This method returns \c PRE_HEAP if the given item has never
294
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
295
    /// and \c POST_HEAP otherwise.
296
    /// In the latter case it is possible that the item will get back
297
    /// to the heap again.
298
    /// \param item The item.
292 299
    State state(const Item &item) const {
293 300
      int i=_iim[item];
294 301
      if( i>=0 ) {
295 302
        if ( _data[i].in ) i=0;
296 303
        else i=-2;
297 304
      }
298 305
      return State(i);
299 306
    }
300 307

	
301
    /// \brief Sets the state of the \c item in the heap.
308
    /// \brief Set the state of an item in the heap.
302 309
    ///
303
    /// Sets the state of the \c item in the heap. It can be used to
304
    /// manually clear the heap when it is important to achive the
305
    /// better time _complexity.
310
    /// This function sets the state of the given item in the heap.
311
    /// It can be used to manually clear the heap when it is important
312
    /// to achive better time complexity.
306 313
    /// \param i The item.
307 314
    /// \param st The state. It should not be \c IN_HEAP.
308 315
    void state(const Item& i, State st) {
309 316
      switch (st) {
310 317
      case POST_HEAP:
311 318
      case PRE_HEAP:
... ...
@@ -362,13 +369,13 @@
362 369
      do {
363 370
        if ( _comp(_data[s].prio, _data[_minimum].prio) ) _minimum=s;
364 371
        s=_data[s].right_neighbor;
365 372
      } while ( s != m );
366 373
    }
367 374

	
368
    void makeroot(int c) {
375
    void makeRoot(int c) {
369 376
      int s=c;
370 377
      do {
371 378
        _data[s].parent=-1;
372 379
        s=_data[s].right_neighbor;
373 380
      } while ( s != c );
374 381
    }
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -21,13 +21,13 @@
21 21

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

	
25 25
///\ingroup graphs
26 26
///\file
27
///\brief FullGraph and FullDigraph classes.
27
///\brief FullDigraph and FullGraph classes.
28 28

	
29 29
namespace lemon {
30 30

	
31 31
  class FullDigraphBase {
32 32
  public:
33 33

	
... ...
@@ -48,13 +48,13 @@
48 48
  public:
49 49

	
50 50
    typedef True NodeNumTag;
51 51
    typedef True ArcNumTag;
52 52

	
53 53
    Node operator()(int ix) const { return Node(ix); }
54
    int index(const Node& node) const { return node._id; }
54
    static int index(const Node& node) { return node._id; }
55 55

	
56 56
    Arc arc(const Node& s, const Node& t) const {
57 57
      return Arc(s._id * _node_num + t._id);
58 58
    }
59 59

	
60 60
    int nodeNum() const { return _node_num; }
... ...
@@ -145,79 +145,87 @@
145 145
  };
146 146

	
147 147
  typedef DigraphExtender<FullDigraphBase> ExtendedFullDigraphBase;
148 148

	
149 149
  /// \ingroup graphs
150 150
  ///
151
  /// \brief A full digraph class.
151
  /// \brief A directed full graph class.
152 152
  ///
153
  /// This is a simple and fast directed full graph implementation.
154
  /// From each node go arcs to each node (including the source node),
155
  /// therefore the number of the arcs in the digraph is the square of
156
  /// the node number. This digraph type is completely static, so you
157
  /// can neither add nor delete either arcs or nodes, and it needs
158
  /// constant space in memory.
153
  /// FullDigraph is a simple and fast implmenetation of directed full
154
  /// (complete) graphs. It contains an arc from each node to each node
155
  /// (including a loop for each node), therefore the number of arcs
156
  /// is the square of the number of nodes.
157
  /// This class is completely static and it needs constant memory space.
158
  /// Thus you can neither add nor delete nodes or arcs, however
159
  /// the structure can be resized using resize().
159 160
  ///
160
  /// This class fully conforms to the \ref concepts::Digraph
161
  /// "Digraph concept".
161
  /// This type fully conforms to the \ref concepts::Digraph "Digraph concept".
162
  /// Most of its member functions and nested classes are documented
163
  /// only in the concept class.
162 164
  ///
163
  /// The \c FullDigraph and \c FullGraph classes are very similar,
165
  /// This class provides constant time counting for nodes and arcs.
166
  ///
167
  /// \note FullDigraph and FullGraph classes are very similar,
164 168
  /// but there are two differences. While this class conforms only
165
  /// to the \ref concepts::Digraph "Digraph" concept, the \c FullGraph
166
  /// class conforms to the \ref concepts::Graph "Graph" concept,
167
  /// moreover \c FullGraph does not contain a loop arc for each
168
  /// node as \c FullDigraph does.
169
  /// to the \ref concepts::Digraph "Digraph" concept, FullGraph
170
  /// conforms to the \ref concepts::Graph "Graph" concept,
171
  /// moreover FullGraph does not contain a loop for each
172
  /// node as this class does.
169 173
  ///
170 174
  /// \sa FullGraph
171 175
  class FullDigraph : public ExtendedFullDigraphBase {
172 176
    typedef ExtendedFullDigraphBase Parent;
173 177

	
174 178
  public:
175 179

	
176
    /// \brief Constructor
180
    /// \brief Default constructor.
181
    ///
182
    /// Default constructor. The number of nodes and arcs will be zero.
177 183
    FullDigraph() { construct(0); }
178 184

	
179 185
    /// \brief Constructor
180 186
    ///
181 187
    /// Constructor.
182 188
    /// \param n The number of the nodes.
183 189
    FullDigraph(int n) { construct(n); }
184 190

	
185 191
    /// \brief Resizes the digraph
186 192
    ///
187
    /// Resizes the digraph. The function will fully destroy and
188
    /// rebuild the digraph. This cause that the maps of the digraph will
193
    /// This function resizes the digraph. It fully destroys and
194
    /// rebuilds the structure, therefore the maps of the digraph will be
189 195
    /// reallocated automatically and the previous values will be lost.
190 196
    void resize(int n) {
191 197
      Parent::notifier(Arc()).clear();
192 198
      Parent::notifier(Node()).clear();
193 199
      construct(n);
194 200
      Parent::notifier(Node()).build();
195 201
      Parent::notifier(Arc()).build();
196 202
    }
197 203

	
198 204
    /// \brief Returns the node with the given index.
199 205
    ///
200
    /// Returns the node with the given index. Since it is a static
201
    /// digraph its nodes can be indexed with integers from the range
202
    /// <tt>[0..nodeNum()-1]</tt>.
206
    /// Returns the node with the given index. Since this structure is
207
    /// completely static, the nodes can be indexed with integers from
208
    /// the range <tt>[0..nodeNum()-1]</tt>.
209
    /// The index of a node is the same as its ID.
203 210
    /// \sa index()
204 211
    Node operator()(int ix) const { return Parent::operator()(ix); }
205 212

	
206 213
    /// \brief Returns the index of the given node.
207 214
    ///
208
    /// Returns the index of the given node. Since it is a static
209
    /// digraph its nodes can be indexed with integers from the range
210
    /// <tt>[0..nodeNum()-1]</tt>.
211
    /// \sa operator()
212
    int index(const Node& node) const { return Parent::index(node); }
215
    /// Returns the index of the given node. Since this structure is
216
    /// completely static, the nodes can be indexed with integers from
217
    /// the range <tt>[0..nodeNum()-1]</tt>.
218
    /// The index of a node is the same as its ID.
219
    /// \sa operator()()
220
    static int index(const Node& node) { return Parent::index(node); }
213 221

	
214 222
    /// \brief Returns the arc connecting the given nodes.
215 223
    ///
216 224
    /// Returns the arc connecting the given nodes.
217
    Arc arc(const Node& u, const Node& v) const {
225
    Arc arc(Node u, Node v) const {
218 226
      return Parent::arc(u, v);
219 227
    }
220 228

	
221 229
    /// \brief Number of nodes.
222 230
    int nodeNum() const { return Parent::nodeNum(); }
223 231
    /// \brief Number of arcs.
... ...
@@ -280,13 +288,13 @@
280 288
      }
281 289
    }
282 290

	
283 291
  public:
284 292

	
285 293
    Node operator()(int ix) const { return Node(ix); }
286
    int index(const Node& node) const { return node._id; }
294
    static int index(const Node& node) { return node._id; }
287 295

	
288 296
    Edge edge(const Node& u, const Node& v) const {
289 297
      if (u._id < v._id) {
290 298
        return Edge(_eid(u._id, v._id));
291 299
      } else if (u._id != v._id) {
292 300
        return Edge(_eid(v._id, u._id));
... ...
@@ -517,47 +525,53 @@
517 525
  typedef GraphExtender<FullGraphBase> ExtendedFullGraphBase;
518 526

	
519 527
  /// \ingroup graphs
520 528
  ///
521 529
  /// \brief An undirected full graph class.
522 530
  ///
523
  /// This is a simple and fast undirected full graph
524
  /// implementation. From each node go edge to each other node,
525
  /// therefore the number of edges in the graph is \f$n(n-1)/2\f$.
526
  /// This graph type is completely static, so you can neither
527
  /// add nor delete either edges or nodes, and it needs constant
528
  /// space in memory.
531
  /// FullGraph is a simple and fast implmenetation of undirected full
532
  /// (complete) graphs. It contains an edge between every distinct pair
533
  /// of nodes, therefore the number of edges is <tt>n(n-1)/2</tt>.
534
  /// This class is completely static and it needs constant memory space.
535
  /// Thus you can neither add nor delete nodes or edges, however
536
  /// the structure can be resized using resize().
529 537
  ///
530
  /// This class fully conforms to the \ref concepts::Graph "Graph concept".
538
  /// This type fully conforms to the \ref concepts::Graph "Graph concept".
539
  /// Most of its member functions and nested classes are documented
540
  /// only in the concept class.
531 541
  ///
532
  /// The \c FullGraph and \c FullDigraph classes are very similar,
533
  /// but there are two differences. While the \c FullDigraph class
542
  /// This class provides constant time counting for nodes, edges and arcs.
543
  ///
544
  /// \note FullDigraph and FullGraph classes are very similar,
545
  /// but there are two differences. While FullDigraph
534 546
  /// conforms only to the \ref concepts::Digraph "Digraph" concept,
535 547
  /// this class conforms to the \ref concepts::Graph "Graph" concept,
536
  /// moreover \c FullGraph does not contain a loop arc for each
537
  /// node as \c FullDigraph does.
548
  /// moreover this class does not contain a loop for each
549
  /// node as FullDigraph does.
538 550
  ///
539 551
  /// \sa FullDigraph
540 552
  class FullGraph : public ExtendedFullGraphBase {
541 553
    typedef ExtendedFullGraphBase Parent;
542 554

	
543 555
  public:
544 556

	
545
    /// \brief Constructor
557
    /// \brief Default constructor.
558
    ///
559
    /// Default constructor. The number of nodes and edges will be zero.
546 560
    FullGraph() { construct(0); }
547 561

	
548 562
    /// \brief Constructor
549 563
    ///
550 564
    /// Constructor.
551 565
    /// \param n The number of the nodes.
552 566
    FullGraph(int n) { construct(n); }
553 567

	
554 568
    /// \brief Resizes the graph
555 569
    ///
556
    /// Resizes the graph. The function will fully destroy and
557
    /// rebuild the graph. This cause that the maps of the graph will
570
    /// This function resizes the graph. It fully destroys and
571
    /// rebuilds the structure, therefore the maps of the graph will be
558 572
    /// reallocated automatically and the previous values will be lost.
559 573
    void resize(int n) {
560 574
      Parent::notifier(Arc()).clear();
561 575
      Parent::notifier(Edge()).clear();
562 576
      Parent::notifier(Node()).clear();
563 577
      construct(n);
... ...
@@ -565,37 +579,39 @@
565 579
      Parent::notifier(Edge()).build();
566 580
      Parent::notifier(Arc()).build();
567 581
    }
568 582

	
569 583
    /// \brief Returns the node with the given index.
570 584
    ///
571
    /// Returns the node with the given index. Since it is a static
572
    /// graph its nodes can be indexed with integers from the range
573
    /// <tt>[0..nodeNum()-1]</tt>.
585
    /// Returns the node with the given index. Since this structure is
586
    /// completely static, the nodes can be indexed with integers from
587
    /// the range <tt>[0..nodeNum()-1]</tt>.
588
    /// The index of a node is the same as its ID.
574 589
    /// \sa index()
575 590
    Node operator()(int ix) const { return Parent::operator()(ix); }
576 591

	
577 592
    /// \brief Returns the index of the given node.
578 593
    ///
579
    /// Returns the index of the given node. Since it is a static
580
    /// graph its nodes can be indexed with integers from the range
581
    /// <tt>[0..nodeNum()-1]</tt>.
582
    /// \sa operator()
583
    int index(const Node& node) const { return Parent::index(node); }
594
    /// Returns the index of the given node. Since this structure is
595
    /// completely static, the nodes can be indexed with integers from
596
    /// the range <tt>[0..nodeNum()-1]</tt>.
597
    /// The index of a node is the same as its ID.
598
    /// \sa operator()()
599
    static int index(const Node& node) { return Parent::index(node); }
584 600

	
585 601
    /// \brief Returns the arc connecting the given nodes.
586 602
    ///
587 603
    /// Returns the arc connecting the given nodes.
588
    Arc arc(const Node& s, const Node& t) const {
604
    Arc arc(Node s, Node t) const {
589 605
      return Parent::arc(s, t);
590 606
    }
591 607

	
592
    /// \brief Returns the edge connects the given nodes.
608
    /// \brief Returns the edge connecting the given nodes.
593 609
    ///
594
    /// Returns the edge connects the given nodes.
595
    Edge edge(const Node& u, const Node& v) const {
610
    /// Returns the edge connecting the given nodes.
611
    Edge edge(Node u, Node v) const {
596 612
      return Parent::edge(u, v);
597 613
    }
598 614

	
599 615
    /// \brief Number of nodes.
600 616
    int nodeNum() const { return Parent::nodeNum(); }
601 617
    /// \brief Number of arcs.
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -56,12 +56,48 @@
56 56
  int GlpkBase::_addRow() {
57 57
    int i = glp_add_rows(lp, 1);
58 58
    glp_set_row_bnds(lp, i, GLP_FR, 0.0, 0.0);
59 59
    return i;
60 60
  }
61 61

	
62
  int GlpkBase::_addRow(Value lo, ExprIterator b,
63
                        ExprIterator e, Value up) {
64
    int i = glp_add_rows(lp, 1);
65

	
66
    if (lo == -INF) {
67
      if (up == INF) {
68
        glp_set_row_bnds(lp, i, GLP_FR, lo, up);
69
      } else {
70
        glp_set_row_bnds(lp, i, GLP_UP, lo, up);
71
      }
72
    } else {
73
      if (up == INF) {
74
        glp_set_row_bnds(lp, i, GLP_LO, lo, up);
75
      } else if (lo != up) {
76
        glp_set_row_bnds(lp, i, GLP_DB, lo, up);
77
      } else {
78
        glp_set_row_bnds(lp, i, GLP_FX, lo, up);
79
      }
80
    }
81

	
82
    std::vector<int> indexes;
83
    std::vector<Value> values;
84

	
85
    indexes.push_back(0);
86
    values.push_back(0);
87

	
88
    for(ExprIterator it = b; it != e; ++it) {
89
      indexes.push_back(it->first);
90
      values.push_back(it->second);
91
    }
92

	
93
    glp_set_mat_row(lp, i, values.size() - 1,
94
                    &indexes.front(), &values.front());
95
    return i;
96
  }
97

	
62 98
  void GlpkBase::_eraseCol(int i) {
63 99
    int ca[2];
64 100
    ca[1] = i;
65 101
    glp_del_cols(lp, 1, ca);
66 102
  }
67 103

	
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -27,22 +27,22 @@
27 27

	
28 28
namespace lemon {
29 29

	
30 30
  namespace _solver_bits {
31 31
    class VoidPtr {
32 32
    private:
33
      void *_ptr;      
33
      void *_ptr;
34 34
    public:
35 35
      VoidPtr() : _ptr(0) {}
36 36

	
37 37
      template <typename T>
38 38
      VoidPtr(T* ptr) : _ptr(reinterpret_cast<void*>(ptr)) {}
39 39

	
40 40
      template <typename T>
41
      VoidPtr& operator=(T* ptr) { 
42
        _ptr = reinterpret_cast<void*>(ptr); 
41
      VoidPtr& operator=(T* ptr) {
42
        _ptr = reinterpret_cast<void*>(ptr);
43 43
        return *this;
44 44
      }
45 45

	
46 46
      template <typename T>
47 47
      operator T*() const { return reinterpret_cast<T*>(_ptr); }
48 48
    };
... ...
@@ -62,12 +62,13 @@
62 62
    virtual ~GlpkBase();
63 63

	
64 64
  protected:
65 65

	
66 66
    virtual int _addCol();
67 67
    virtual int _addRow();
68
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
68 69

	
69 70
    virtual void _eraseCol(int i);
70 71
    virtual void _eraseRow(int i);
71 72

	
72 73
    virtual void _eraseColId(int i);
73 74
    virtual void _eraseRowId(int i);
... ...
@@ -120,19 +121,19 @@
120 121

	
121 122
    struct FreeEnvHelper {
122 123
      ~FreeEnvHelper() {
123 124
        freeEnv();
124 125
      }
125 126
    };
126
    
127

	
127 128
    static FreeEnvHelper freeEnvHelper;
128 129

	
129 130
  protected:
130
    
131

	
131 132
    int _message_level;
132
    
133

	
133 134
  public:
134 135

	
135 136
    ///Pointer to the underlying GLPK data structure.
136 137
    _solver_bits::VoidPtr lpx() {return lp;}
137 138
    ///Const pointer to the underlying GLPK data structure.
138 139
    _solver_bits::VoidPtr lpx() const {return lp;}
Ignore white space 6 line context
1
/* -*- C++ -*-
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -24,30 +24,30 @@
24 24
#include <lemon/core.h>
25 25
#include <lemon/preflow.h>
26 26
#include <lemon/concept_check.h>
27 27
#include <lemon/concepts/maps.h>
28 28

	
29 29
/// \ingroup min_cut
30
/// \file 
30
/// \file
31 31
/// \brief Gomory-Hu cut tree in graphs.
32 32

	
33 33
namespace lemon {
34 34

	
35 35
  /// \ingroup min_cut
36 36
  ///
37 37
  /// \brief Gomory-Hu cut tree algorithm
38 38
  ///
39 39
  /// The Gomory-Hu tree is a tree on the node set of a given graph, but it
40 40
  /// may contain edges which are not in the original graph. It has the
41
  /// property that the minimum capacity edge of the path between two nodes 
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 45
  /// Therefore once this tree is computed, the minimum cut between any pair
46 46
  /// of nodes can easily be obtained.
47
  /// 
47
  ///
48 48
  /// The algorithm calculates \e n-1 distinct minimum cuts (currently with
49 49
  /// the \ref Preflow algorithm), thus it has \f$O(n^3\sqrt{e})\f$ overall
50 50
  /// time complexity. It calculates a rooted Gomory-Hu tree.
51 51
  /// The structure of the tree and the edge weights can be
52 52
  /// obtained using \c predNode(), \c predValue() and \c rootDist().
53 53
  /// The functions \c minCutMap() and \c minCutValue() calculate
... ...
@@ -57,27 +57,27 @@
57 57
  ///
58 58
  /// \tparam GR The type of the undirected graph the algorithm runs on.
59 59
  /// \tparam CAP The type of the edge map containing the capacities.
60 60
  /// The default map type is \ref concepts::Graph::EdgeMap "GR::EdgeMap<int>".
61 61
#ifdef DOXYGEN
62 62
  template <typename GR,
63
	    typename CAP>
63
            typename CAP>
64 64
#else
65 65
  template <typename GR,
66
	    typename CAP = typename GR::template EdgeMap<int> >
66
            typename CAP = typename GR::template EdgeMap<int> >
67 67
#endif
68 68
  class GomoryHu {
69 69
  public:
70 70

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

	
78 78
  private:
79 79

	
80 80
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
81 81

	
82 82
    const Graph& _graph;
83 83
    const Capacity& _capacity;
... ...
@@ -86,44 +86,44 @@
86 86
    typename Graph::template NodeMap<Node>* _pred;
87 87
    typename Graph::template NodeMap<Value>* _weight;
88 88
    typename Graph::template NodeMap<int>* _order;
89 89

	
90 90
    void createStructures() {
91 91
      if (!_pred) {
92
	_pred = new typename Graph::template NodeMap<Node>(_graph);
92
        _pred = new typename Graph::template NodeMap<Node>(_graph);
93 93
      }
94 94
      if (!_weight) {
95
	_weight = new typename Graph::template NodeMap<Value>(_graph);
95
        _weight = new typename Graph::template NodeMap<Value>(_graph);
96 96
      }
97 97
      if (!_order) {
98
	_order = new typename Graph::template NodeMap<int>(_graph);
98
        _order = new typename Graph::template NodeMap<int>(_graph);
99 99
      }
100 100
    }
101 101

	
102 102
    void destroyStructures() {
103 103
      if (_pred) {
104
	delete _pred;
104
        delete _pred;
105 105
      }
106 106
      if (_weight) {
107
	delete _weight;
107
        delete _weight;
108 108
      }
109 109
      if (_order) {
110
	delete _order;
110
        delete _order;
111 111
      }
112 112
    }
113
  
113

	
114 114
  public:
115 115

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

	
128 128

	
129 129
    /// \brief Destructor
... ...
@@ -131,86 +131,86 @@
131 131
    /// Destructor.
132 132
    ~GomoryHu() {
133 133
      destroyStructures();
134 134
    }
135 135

	
136 136
  private:
137
  
137

	
138 138
    // Initialize the internal data structures
139 139
    void init() {
140 140
      createStructures();
141 141

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

	
151 151

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

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

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

	
163
	fa.runMinCut();
163
        fa.runMinCut();
164 164

	
165
	(*_weight)[n] = fa.flowValue();
165
        (*_weight)[n] = fa.flowValue();
166 166

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

	
180 180
      (*_order)[_root] = 0;
181 181
      int index = 1;
182 182

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

	
197 197
  public:
198 198

	
199 199
    ///\name Execution Control
200
 
200

	
201 201
    ///@{
202 202

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

	
211 211
    /// @}
212 212

	
213 213
    ///\name Query Functions
214 214
    ///The results of the algorithm can be obtained using these
215 215
    ///functions.\n
216 216
    ///\ref run() should be called before using them.\n
... ...
@@ -229,13 +229,13 @@
229 229
      return (*_pred)[node];
230 230
    }
231 231

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

	
254 254
    /// \brief Return the minimum cut value between two nodes
255 255
    ///
256 256
    /// This function returns the minimum cut value between the nodes
257
    /// \c s and \c t. 
257
    /// \c s and \c t.
258 258
    /// It finds the nearest common ancestor of the given nodes in the
259 259
    /// Gomory-Hu tree and calculates the minimum weight edge on the
260 260
    /// paths to the ancestor.
261 261
    ///
262 262
    /// \pre \ref run() must be called before using this function.
263 263
    Value minCutValue(const Node& s, const Node& t) const {
264 264
      Node sn = s, tn = t;
265 265
      Value value = std::numeric_limits<Value>::max();
266
      
266

	
267 267
      while (sn != tn) {
268
	if ((*_order)[sn] < (*_order)[tn]) {
269
	  if ((*_weight)[tn] <= value) value = (*_weight)[tn];
270
	  tn = (*_pred)[tn];
271
	} else {
272
	  if ((*_weight)[sn] <= value) value = (*_weight)[sn];
273
	  sn = (*_pred)[sn];
274
	}
268
        if ((*_order)[sn] < (*_order)[tn]) {
269
          if ((*_weight)[tn] <= value) value = (*_weight)[tn];
270
          tn = (*_pred)[tn];
271
        } else {
272
          if ((*_weight)[sn] <= value) value = (*_weight)[sn];
273
          sn = (*_pred)[sn];
274
        }
275 275
      }
276 276
      return value;
277 277
    }
278 278

	
279 279
    /// \brief Return the minimum cut between two nodes
280 280
    ///
... ...
@@ -291,81 +291,79 @@
291 291
    /// "ReadWriteMap" on the graph nodes.
292 292
    ///
293 293
    /// \return The value of the minimum cut between \c s and \c t.
294 294
    ///
295 295
    /// \pre \ref run() must be called before using this function.
296 296
    template <typename CutMap>
297
    Value minCutMap(const Node& s, ///< 
297
    Value minCutMap(const Node& s,
298 298
                    const Node& t,
299
                    ///< 
300 299
                    CutMap& cutMap
301
                    ///< 
302 300
                    ) const {
303 301
      Node sn = s, tn = t;
304 302
      bool s_root=false;
305 303
      Node rn = INVALID;
306 304
      Value value = std::numeric_limits<Value>::max();
307
      
305

	
308 306
      while (sn != tn) {
309
	if ((*_order)[sn] < (*_order)[tn]) {
310
	  if ((*_weight)[tn] <= value) {
311
	    rn = tn;
307
        if ((*_order)[sn] < (*_order)[tn]) {
308
          if ((*_weight)[tn] <= value) {
309
            rn = tn;
312 310
            s_root = false;
313
	    value = (*_weight)[tn];
314
	  }
315
	  tn = (*_pred)[tn];
316
	} else {
317
	  if ((*_weight)[sn] <= value) {
318
	    rn = sn;
311
            value = (*_weight)[tn];
312
          }
313
          tn = (*_pred)[tn];
314
        } else {
315
          if ((*_weight)[sn] <= value) {
316
            rn = sn;
319 317
            s_root = true;
320
	    value = (*_weight)[sn];
321
	  }
322
	  sn = (*_pred)[sn];
323
	}
318
            value = (*_weight)[sn];
319
          }
320
          sn = (*_pred)[sn];
321
        }
324 322
      }
325 323

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

	
332 330
      std::vector<Node> st;
333 331
      for (NodeIt n(_graph); n != INVALID; ++n) {
334
	st.clear();
332
        st.clear();
335 333
        Node nn = n;
336
	while (!reached[nn]) {
337
	  st.push_back(nn);
338
	  nn = (*_pred)[nn];
339
	}
340
	while (!st.empty()) {
341
	  cutMap.set(st.back(), cutMap[nn]);
342
	  st.pop_back();
343
	}
334
        while (!reached[nn]) {
335
          st.push_back(nn);
336
          nn = (*_pred)[nn];
337
        }
338
        while (!st.empty()) {
339
          cutMap.set(st.back(), cutMap[nn]);
340
          st.pop_back();
341
        }
344 342
      }
345
      
343

	
346 344
      return value;
347 345
    }
348 346

	
349 347
    ///@}
350 348

	
351 349
    friend class MinCutNodeIt;
352 350

	
353 351
    /// Iterate on the nodes of a minimum cut
354
    
352

	
355 353
    /// This iterator class lists the nodes of a minimum cut found by
356 354
    /// GomoryHu. Before using it, you must allocate a GomoryHu class
357 355
    /// and call its \ref GomoryHu::run() "run()" method.
358 356
    ///
359 357
    /// This example counts the nodes in the minimum cut separating \c s from
360 358
    /// \c t.
361 359
    /// \code
362
    /// GomoruHu<Graph> gom(g, capacities);
360
    /// GomoryHu<Graph> gom(g, capacities);
363 361
    /// gom.run();
364 362
    /// int cnt=0;
365
    /// for(GomoruHu<Graph>::MinCutNodeIt n(gom,s,t); n!=INVALID; ++n) ++cnt;
363
    /// for(GomoryHu<Graph>::MinCutNodeIt n(gom,s,t); n!=INVALID; ++n) ++cnt;
366 364
    /// \endcode
367 365
    class MinCutNodeIt
368 366
    {
369 367
      bool _side;
370 368
      typename Graph::NodeIt _node_it;
371 369
      typename Graph::template NodeMap<bool> _cut;
... ...
@@ -391,13 +389,13 @@
391 389
                   /// \endcode
392 390
                   /// and
393 391
                   /// \code
394 392
                   /// MinCutNodeIt(gomory, t, s, false);
395 393
                   /// \endcode
396 394
                   /// does not necessarily give the same set of nodes.
397
                   /// However it is ensured that
395
                   /// However, it is ensured that
398 396
                   /// \code
399 397
                   /// MinCutNodeIt(gomory, s, t, true);
400 398
                   /// \endcode
401 399
                   /// and
402 400
                   /// \code
403 401
                   /// MinCutNodeIt(gomory, s, t, false);
... ...
@@ -441,28 +439,28 @@
441 439
      {
442 440
        typename Graph::Node n=*this;
443 441
        ++(*this);
444 442
        return n;
445 443
      }
446 444
    };
447
    
445

	
448 446
    friend class MinCutEdgeIt;
449
    
447

	
450 448
    /// Iterate on the edges of a minimum cut
451
    
449

	
452 450
    /// This iterator class lists the edges of a minimum cut found by
453 451
    /// GomoryHu. Before using it, you must allocate a GomoryHu class
454 452
    /// and call its \ref GomoryHu::run() "run()" method.
455 453
    ///
456 454
    /// This example computes the value of the minimum cut separating \c s from
457 455
    /// \c t.
458 456
    /// \code
459
    /// GomoruHu<Graph> gom(g, capacities);
457
    /// GomoryHu<Graph> gom(g, capacities);
460 458
    /// gom.run();
461 459
    /// int value=0;
462
    /// for(GomoruHu<Graph>::MinCutEdgeIt e(gom,s,t); e!=INVALID; ++e)
460
    /// for(GomoryHu<Graph>::MinCutEdgeIt e(gom,s,t); e!=INVALID; ++e)
463 461
    ///   value+=capacities[e];
464 462
    /// \endcode
465 463
    /// The result will be the same as the value returned by
466 464
    /// \ref GomoryHu::minCutValue() "gom.minCutValue(s,t)".
467 465
    class MinCutEdgeIt
468 466
    {
... ...
@@ -478,13 +476,13 @@
478 476
          {
479 477
            for(++_node_it;_node_it!=INVALID&&!_cut[_node_it];++_node_it) {}
480 478
            if(_node_it!=INVALID)
481 479
              _arc_it=typename Graph::OutArcIt(_graph,_node_it);
482 480
          }
483 481
      }
484
      
482

	
485 483
    public:
486 484
      /// Constructor
487 485

	
488 486
      /// Constructor.
489 487
      ///
490 488
      MinCutEdgeIt(GomoryHu const &gomory,
... ...
@@ -547,13 +545,13 @@
547 545
      {
548 546
        step();
549 547
        while(_arc_it!=INVALID && _cut[_graph.target(_arc_it)]) step();
550 548
        return *this;
551 549
      }
552 550
      /// Postfix incrementation
553
      
551

	
554 552
      /// Postfix incrementation.
555 553
      ///
556 554
      /// \warning This incrementation
557 555
      /// returns an \c Arc, not a \c MinCutEdgeIt, as one may expect.
558 556
      typename Graph::Arc operator++(int)
559 557
      {
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -139,13 +139,13 @@
139 139
  bool _preScale;
140 140
  ///Constructor
141 141

	
142 142
  ///Constructor
143 143
  ///\param gr  Reference to the graph to be printed.
144 144
  ///\param ost Reference to the output stream.
145
  ///By default it is <tt>std::cout</tt>.
145
  ///By default, it is <tt>std::cout</tt>.
146 146
  ///\param pros If it is \c true, then the \c ostream referenced by \c os
147 147
  ///will be explicitly deallocated by the destructor.
148 148
  DefaultGraphToEpsTraits(const GR &gr, std::ostream& ost = std::cout,
149 149
                          bool pros = false) :
150 150
    g(gr), os(ost),
151 151
    _coords(dim2::Point<double>(1,1)), _nodeSizes(1), _nodeShapes(0),
... ...
@@ -509,13 +509,13 @@
509 509
  GraphToEps<T> &negateY(bool b=true) {
510 510
    _negY=b;return *this;
511 511
  }
512 512

	
513 513
  ///Turn on/off pre-scaling
514 514

	
515
  ///By default graphToEps() rescales the whole image in order to avoid
515
  ///By default, graphToEps() rescales the whole image in order to avoid
516 516
  ///very big or very small bounding boxes.
517 517
  ///
518 518
  ///This (p)rescaling can be turned off with this function.
519 519
  ///
520 520
  GraphToEps<T> &preScale(bool b=true) {
521 521
    _preScale=b;return *this;
... ...
@@ -1111,25 +1111,25 @@
1111 1111
///Generates an EPS file from a graph
1112 1112

	
1113 1113
///\ingroup eps_io
1114 1114
///Generates an EPS file from a graph.
1115 1115
///\param g Reference to the graph to be printed.
1116 1116
///\param os Reference to the output stream.
1117
///By default it is <tt>std::cout</tt>.
1117
///By default, it is <tt>std::cout</tt>.
1118 1118
///
1119 1119
///This function also has a lot of
1120 1120
///\ref named-templ-func-param "named parameters",
1121 1121
///they are declared as the members of class \ref GraphToEps. The following
1122 1122
///example shows how to use these parameters.
1123 1123
///\code
1124 1124
/// graphToEps(g,os).scale(10).coords(coords)
1125 1125
///              .nodeScale(2).nodeSizes(sizes)
1126 1126
///              .arcWidthScale(.4).run();
1127 1127
///\endcode
1128 1128
///
1129
///For more detailed examples see the \ref graph_to_eps_demo.cc demo file.
1129
///For more detailed examples, see the \ref graph_to_eps_demo.cc demo file.
1130 1130
///
1131 1131
///\warning Don't forget to put the \ref GraphToEps::run() "run()"
1132 1132
///to the end of the parameter list.
1133 1133
///\sa GraphToEps
1134 1134
///\sa graphToEps(GR &g, const char *file_name)
1135 1135
template<class GR>
Ignore white space 6 line context
... ...
@@ -467,24 +467,28 @@
467 467
  typedef GraphExtender<GridGraphBase> ExtendedGridGraphBase;
468 468

	
469 469
  /// \ingroup graphs
470 470
  ///
471 471
  /// \brief Grid graph class
472 472
  ///
473
  /// This class implements a special graph type. The nodes of the
474
  /// graph can be indexed by two integer \c (i,j) value where \c i is
475
  /// in the \c [0..width()-1] range and j is in the \c
476
  /// [0..height()-1] range.  Two nodes are connected in the graph if
477
  /// the indexes differ exactly on one position and exactly one is
478
  /// the difference. The nodes of the graph can be indexed by position
479
  /// with the \c operator()() function. The positions of the nodes can be
480
  /// get with \c pos(), \c col() and \c row() members. The outgoing
473
  /// GridGraph implements a special graph type. The nodes of the
474
  /// graph can be indexed by two integer values \c (i,j) where \c i is
475
  /// in the range <tt>[0..width()-1]</tt> and j is in the range
476
  /// <tt>[0..height()-1]</tt>. Two nodes are connected in the graph if
477
  /// the indices differ exactly on one position and the difference is
478
  /// also exactly one. The nodes of the graph can be obtained by position
479
  /// using the \c operator()() function and the indices of the nodes can
480
  /// be obtained using \c pos(), \c col() and \c row() members. The outgoing
481 481
  /// arcs can be retrieved with the \c right(), \c up(), \c left()
482 482
  /// and \c down() functions, where the bottom-left corner is the
483 483
  /// origin.
484 484
  ///
485
  /// This class is completely static and it needs constant memory space.
486
  /// Thus you can neither add nor delete nodes or edges, however
487
  /// the structure can be resized using resize().
488
  ///
485 489
  /// \image html grid_graph.png
486 490
  /// \image latex grid_graph.eps "Grid graph" width=\textwidth
487 491
  ///
488 492
  /// A short example about the basic usage:
489 493
  ///\code
490 494
  /// GridGraph graph(rows, cols);
... ...
@@ -493,37 +497,38 @@
493 497
  ///   for (int j = 0; j < graph.height(); ++j) {
494 498
  ///     val[graph(i, j)] = i + j;
495 499
  ///   }
496 500
  /// }
497 501
  ///\endcode
498 502
  ///
499
  /// This graph type fully conforms to the \ref concepts::Graph
500
  /// "Graph concept".
503
  /// This type fully conforms to the \ref concepts::Graph "Graph concept".
504
  /// Most of its member functions and nested classes are documented
505
  /// only in the concept class.
506
  ///
507
  /// This class provides constant time counting for nodes, edges and arcs.
501 508
  class GridGraph : public ExtendedGridGraphBase {
502 509
    typedef ExtendedGridGraphBase Parent;
503 510

	
504 511
  public:
505 512

	
506
    /// \brief Map to get the indices of the nodes as dim2::Point<int>.
513
    /// \brief Map to get the indices of the nodes as \ref dim2::Point
514
    /// "dim2::Point<int>".
507 515
    ///
508
    /// Map to get the indices of the nodes as dim2::Point<int>.
516
    /// Map to get the indices of the nodes as \ref dim2::Point
517
    /// "dim2::Point<int>".
509 518
    class IndexMap {
510 519
    public:
511 520
      /// \brief The key type of the map
512 521
      typedef GridGraph::Node Key;
513 522
      /// \brief The value type of the map
514 523
      typedef dim2::Point<int> Value;
515 524

	
516 525
      /// \brief Constructor
517
      ///
518
      /// Constructor
519 526
      IndexMap(const GridGraph& graph) : _graph(graph) {}
520 527

	
521 528
      /// \brief The subscript operator
522
      ///
523
      /// The subscript operator.
524 529
      Value operator[](Key key) const {
525 530
        return _graph.pos(key);
526 531
      }
527 532

	
528 533
    private:
529 534
      const GridGraph& _graph;
... ...
@@ -537,19 +542,15 @@
537 542
      /// \brief The key type of the map
538 543
      typedef GridGraph::Node Key;
539 544
      /// \brief The value type of the map
540 545
      typedef int Value;
541 546

	
542 547
      /// \brief Constructor
543
      ///
544
      /// Constructor
545 548
      ColMap(const GridGraph& graph) : _graph(graph) {}
546 549

	
547 550
      /// \brief The subscript operator
548
      ///
549
      /// The subscript operator.
550 551
      Value operator[](Key key) const {
551 552
        return _graph.col(key);
552 553
      }
553 554

	
554 555
    private:
555 556
      const GridGraph& _graph;
... ...
@@ -563,38 +564,33 @@
563 564
      /// \brief The key type of the map
564 565
      typedef GridGraph::Node Key;
565 566
      /// \brief The value type of the map
566 567
      typedef int Value;
567 568

	
568 569
      /// \brief Constructor
569
      ///
570
      /// Constructor
571 570
      RowMap(const GridGraph& graph) : _graph(graph) {}
572 571

	
573 572
      /// \brief The subscript operator
574
      ///
575
      /// The subscript operator.
576 573
      Value operator[](Key key) const {
577 574
        return _graph.row(key);
578 575
      }
579 576

	
580 577
    private:
581 578
      const GridGraph& _graph;
582 579
    };
583 580

	
584 581
    /// \brief Constructor
585 582
    ///
586
    /// Construct a grid graph with given size.
583
    /// Construct a grid graph with the given size.
587 584
    GridGraph(int width, int height) { construct(width, height); }
588 585

	
589
    /// \brief Resize the graph
586
    /// \brief Resizes the graph
590 587
    ///
591
    /// Resize the graph. The function will fully destroy and rebuild
592
    /// the graph.  This cause that the maps of the graph will
593
    /// reallocated automatically and the previous values will be
594
    /// lost.
588
    /// This function resizes the graph. It fully destroys and
589
    /// rebuilds the structure, therefore the maps of the graph will be
590
    /// reallocated automatically and the previous values will be lost.
595 591
    void resize(int width, int height) {
596 592
      Parent::notifier(Arc()).clear();
597 593
      Parent::notifier(Edge()).clear();
598 594
      Parent::notifier(Node()).clear();
599 595
      construct(width, height);
600 596
      Parent::notifier(Node()).build();
... ...
@@ -606,72 +602,72 @@
606 602
    ///
607 603
    /// Gives back the node on the given position.
608 604
    Node operator()(int i, int j) const {
609 605
      return Parent::operator()(i, j);
610 606
    }
611 607

	
612
    /// \brief Gives back the column index of the node.
608
    /// \brief The column index of the node.
613 609
    ///
614 610
    /// Gives back the column index of the node.
615 611
    int col(Node n) const {
616 612
      return Parent::col(n);
617 613
    }
618 614

	
619
    /// \brief Gives back the row index of the node.
615
    /// \brief The row index of the node.
620 616
    ///
621 617
    /// Gives back the row index of the node.
622 618
    int row(Node n) const {
623 619
      return Parent::row(n);
624 620
    }
625 621

	
626
    /// \brief Gives back the position of the node.
622
    /// \brief The position of the node.
627 623
    ///
628 624
    /// Gives back the position of the node, ie. the <tt>(col,row)</tt> pair.
629 625
    dim2::Point<int> pos(Node n) const {
630 626
      return Parent::pos(n);
631 627
    }
632 628

	
633
    /// \brief Gives back the number of the columns.
629
    /// \brief The number of the columns.
634 630
    ///
635 631
    /// Gives back the number of the columns.
636 632
    int width() const {
637 633
      return Parent::width();
638 634
    }
639 635

	
640
    /// \brief Gives back the number of the rows.
636
    /// \brief The number of the rows.
641 637
    ///
642 638
    /// Gives back the number of the rows.
643 639
    int height() const {
644 640
      return Parent::height();
645 641
    }
646 642

	
647
    /// \brief Gives back the arc goes right from the node.
643
    /// \brief The arc goes right from the node.
648 644
    ///
649 645
    /// Gives back the arc goes right from the node. If there is not
650 646
    /// outgoing arc then it gives back INVALID.
651 647
    Arc right(Node n) const {
652 648
      return Parent::right(n);
653 649
    }
654 650

	
655
    /// \brief Gives back the arc goes left from the node.
651
    /// \brief The arc goes left from the node.
656 652
    ///
657 653
    /// Gives back the arc goes left from the node. If there is not
658 654
    /// outgoing arc then it gives back INVALID.
659 655
    Arc left(Node n) const {
660 656
      return Parent::left(n);
661 657
    }
662 658

	
663
    /// \brief Gives back the arc goes up from the node.
659
    /// \brief The arc goes up from the node.
664 660
    ///
665 661
    /// Gives back the arc goes up from the node. If there is not
666 662
    /// outgoing arc then it gives back INVALID.
667 663
    Arc up(Node n) const {
668 664
      return Parent::up(n);
669 665
    }
670 666

	
671
    /// \brief Gives back the arc goes down from the node.
667
    /// \brief The arc goes down from the node.
672 668
    ///
673 669
    /// Gives back the arc goes down from the node. If there is not
674 670
    /// outgoing arc then it gives back INVALID.
675 671
    Arc down(Node n) const {
676 672
      return Parent::down(n);
677 673
    }
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -28,23 +28,23 @@
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 for finding a minimum cut 
34
/// Implementation of the Hao-Orlin algorithm for finding a minimum cut
35 35
/// in a digraph.
36 36

	
37 37
namespace lemon {
38 38

	
39 39
  /// \ingroup min_cut
40 40
  ///
41 41
  /// \brief Hao-Orlin algorithm for finding a minimum cut in a digraph.
42 42
  ///
43 43
  /// This class implements the Hao-Orlin algorithm for finding a minimum
44
  /// value cut in a directed graph \f$D=(V,A)\f$. 
44
  /// value cut in a directed graph \f$D=(V,A)\f$.
45 45
  /// It takes a fixed node \f$ source \in V \f$ and
46 46
  /// consists of two phases: in the first phase it determines a
47 47
  /// minimum cut with \f$ source \f$ on the source-side (i.e. a set
48 48
  /// \f$ X\subsetneq V \f$ with \f$ source \in X \f$ and minimal outgoing
49 49
  /// capacity) and in the second phase it determines a minimum cut
50 50
  /// with \f$ source \f$ on the sink-side (i.e. a set
... ...
@@ -55,13 +55,13 @@
55 55
  /// the minimum cut in \f$ O(n^2\sqrt{m}) \f$ time (we use the
56 56
  /// highest-label rule), or in \f$O(nm)\f$ for unit capacities. The
57 57
  /// purpose of such algorithm is e.g. testing network reliability.
58 58
  ///
59 59
  /// For an undirected graph you can run just the first phase of the
60 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$ 
61
  /// which solves the undirected problem in \f$ O(nm + n^2 \log n) \f$
62 62
  /// time. It is implemented in the NagamochiIbaraki algorithm class.
63 63
  ///
64 64
  /// \tparam GR The type of the digraph the algorithm runs on.
65 65
  /// \tparam CAP The type of the arc map containing the capacities,
66 66
  /// which can be any numreric type. The default map type is
67 67
  /// \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
... ...
@@ -73,13 +73,13 @@
73 73
  template <typename GR,
74 74
            typename CAP = typename GR::template ArcMap<int>,
75 75
            typename TOL = Tolerance<typename CAP::Value> >
76 76
#endif
77 77
  class HaoOrlin {
78 78
  public:
79
   
79

	
80 80
    /// The digraph type of the algorithm
81 81
    typedef GR Digraph;
82 82
    /// The capacity map type of the algorithm
83 83
    typedef CAP CapacityMap;
84 84
    /// The tolerance type of the algorithm
85 85
    typedef TOL Tolerance;
... ...
@@ -162,12 +162,29 @@
162 162
      }
163 163
      if (_flow) {
164 164
        delete _flow;
165 165
      }
166 166
    }
167 167

	
168
    /// \brief Set the tolerance used by the algorithm.
169
    ///
170
    /// This function sets the tolerance object used by the algorithm.
171
    /// \return <tt>(*this)</tt>
172
    HaoOrlin& tolerance(const Tolerance& tolerance) {
173
      _tolerance = tolerance;
174
      return *this;
175
    }
176

	
177
    /// \brief Returns a const reference to the tolerance.
178
    ///
179
    /// This function returns a const reference to the tolerance object
180
    /// used by the algorithm.
181
    const Tolerance& tolerance() const {
182
      return _tolerance;
183
    }
184

	
168 185
  private:
169 186

	
170 187
    void activate(const Node& i) {
171 188
      (*_active)[i] = true;
172 189

	
173 190
      int bucket = (*_bucket)[i];
... ...
@@ -844,13 +861,13 @@
844 861
      init(NodeIt(_graph));
845 862
    }
846 863

	
847 864
    /// \brief Initialize the internal data structures.
848 865
    ///
849 866
    /// This function initializes the internal data structures. It creates
850
    /// the maps and some bucket structures for the algorithm. 
867
    /// the maps and some bucket structures for the algorithm.
851 868
    /// The given node is used as the source node for the push-relabel
852 869
    /// algorithm.
853 870
    void init(const Node& source) {
854 871
      _source = source;
855 872

	
856 873
      _node_num = countNodes(_graph);
... ...
@@ -924,13 +941,13 @@
924 941
      calculateOut();
925 942
      calculateIn();
926 943
    }
927 944

	
928 945
    /// \brief Run the algorithm.
929 946
    ///
930
    /// This function runs the algorithm. It uses the given \c source node, 
947
    /// This function runs the algorithm. It uses the given \c source node,
931 948
    /// finds a proper \c target node and then calls the \ref init(),
932 949
    /// \ref calculateOut() and \ref calculateIn().
933 950
    void run(const Node& s) {
934 951
      init(s);
935 952
      calculateOut();
936 953
      calculateIn();
... ...
@@ -938,22 +955,22 @@
938 955

	
939 956
    /// @}
940 957

	
941 958
    /// \name Query Functions
942 959
    /// The result of the %HaoOrlin algorithm
943 960
    /// can be obtained using these functions.\n
944
    /// \ref run(), \ref calculateOut() or \ref calculateIn() 
961
    /// \ref run(), \ref calculateOut() or \ref calculateIn()
945 962
    /// should be called before using them.
946 963

	
947 964
    /// @{
948 965

	
949 966
    /// \brief Return the value of the minimum cut.
950 967
    ///
951 968
    /// This function returns the value of the minimum cut.
952 969
    ///
953
    /// \pre \ref run(), \ref calculateOut() or \ref calculateIn() 
970
    /// \pre \ref run(), \ref calculateOut() or \ref calculateIn()
954 971
    /// must be called before using this function.
955 972
    Value minCutValue() const {
956 973
      return _min_cut;
957 974
    }
958 975

	
959 976

	
... ...
@@ -966,13 +983,13 @@
966 983
    ///
967 984
    /// \param cutMap A \ref concepts::WriteMap "writable" node map with
968 985
    /// \c bool (or convertible) value type.
969 986
    ///
970 987
    /// \return The value of the minimum cut.
971 988
    ///
972
    /// \pre \ref run(), \ref calculateOut() or \ref calculateIn() 
989
    /// \pre \ref run(), \ref calculateOut() or \ref calculateIn()
973 990
    /// must be called before using this function.
974 991
    template <typename CutMap>
975 992
    Value minCutMap(CutMap& cutMap) const {
976 993
      for (NodeIt it(_graph); it != INVALID; ++it) {
977 994
        cutMap.set(it, (*_min_cut_map)[it]);
978 995
      }
Ignore white space 6 line context
... ...
@@ -259,13 +259,13 @@
259 259
    }
260 260

	
261 261
    int dimension(Arc arc) const {
262 262
      return arc._id >> _dim;
263 263
    }
264 264

	
265
    int index(Node node) const {
265
    static int index(Node node) {
266 266
      return node._id;
267 267
    }
268 268

	
269 269
    Node operator()(int ix) const {
270 270
      return Node(ix);
271 271
    }
... ...
@@ -279,33 +279,54 @@
279 279
  typedef GraphExtender<HypercubeGraphBase> ExtendedHypercubeGraphBase;
280 280

	
281 281
  /// \ingroup graphs
282 282
  ///
283 283
  /// \brief Hypercube graph class
284 284
  ///
285
  /// This class implements a special graph type. The nodes of the graph
286
  /// are indiced with integers with at most \c dim binary digits.
285
  /// HypercubeGraph implements a special graph type. The nodes of the
286
  /// graph are indexed with integers having at most \c dim binary digits.
287 287
  /// Two nodes are connected in the graph if and only if their indices
288 288
  /// differ only on one position in the binary form.
289
  /// This class is completely static and it needs constant memory space.
290
  /// Thus you can neither add nor delete nodes or edges, however,
291
  /// the structure can be resized using resize().
292
  ///
293
  /// This type fully conforms to the \ref concepts::Graph "Graph concept".
294
  /// Most of its member functions and nested classes are documented
295
  /// only in the concept class.
296
  ///
297
  /// This class provides constant time counting for nodes, edges and arcs.
289 298
  ///
290 299
  /// \note The type of the indices is chosen to \c int for efficiency
291 300
  /// reasons. Thus the maximum dimension of this implementation is 26
292 301
  /// (assuming that the size of \c int is 32 bit).
293
  ///
294
  /// This graph type fully conforms to the \ref concepts::Graph
295
  /// "Graph concept".
296 302
  class HypercubeGraph : public ExtendedHypercubeGraphBase {
297 303
    typedef ExtendedHypercubeGraphBase Parent;
298 304

	
299 305
  public:
300 306

	
301 307
    /// \brief Constructs a hypercube graph with \c dim dimensions.
302 308
    ///
303 309
    /// Constructs a hypercube graph with \c dim dimensions.
304 310
    HypercubeGraph(int dim) { construct(dim); }
305 311

	
312
    /// \brief Resizes the graph
313
    ///
314
    /// This function resizes the graph. It fully destroys and
315
    /// rebuilds the structure, therefore the maps of the graph will be
316
    /// reallocated automatically and the previous values will be lost.
317
    void resize(int dim) {
318
      Parent::notifier(Arc()).clear();
319
      Parent::notifier(Edge()).clear();
320
      Parent::notifier(Node()).clear();
321
      construct(dim);
322
      Parent::notifier(Node()).build();
323
      Parent::notifier(Edge()).build();
324
      Parent::notifier(Arc()).build();
325
    }
326

	
306 327
    /// \brief The number of dimensions.
307 328
    ///
308 329
    /// Gives back the number of dimensions.
309 330
    int dimension() const {
310 331
      return Parent::dimension();
311 332
    }
... ...
@@ -317,30 +338,30 @@
317 338
      return Parent::projection(node, n);
318 339
    }
319 340

	
320 341
    /// \brief The dimension id of an edge.
321 342
    ///
322 343
    /// Gives back the dimension id of the given edge.
323
    /// It is in the [0..dim-1] range.
344
    /// It is in the range <tt>[0..dim-1]</tt>.
324 345
    int dimension(Edge edge) const {
325 346
      return Parent::dimension(edge);
326 347
    }
327 348

	
328 349
    /// \brief The dimension id of an arc.
329 350
    ///
330 351
    /// Gives back the dimension id of the given arc.
331
    /// It is in the [0..dim-1] range.
352
    /// It is in the range <tt>[0..dim-1]</tt>.
332 353
    int dimension(Arc arc) const {
333 354
      return Parent::dimension(arc);
334 355
    }
335 356

	
336 357
    /// \brief The index of a node.
337 358
    ///
338 359
    /// Gives back the index of the given node.
339 360
    /// The lower bits of the integer describes the node.
340
    int index(Node node) const {
361
    static int index(Node node) {
341 362
      return Parent::index(node);
342 363
    }
343 364

	
344 365
    /// \brief Gives back a node by its index.
345 366
    ///
346 367
    /// Gives back a node by its index.
Ignore white space 6 line context
... ...
@@ -424,13 +424,13 @@
424 424
  ///   node("source", src).
425 425
  ///   node("target", trg).
426 426
  ///   attribute("caption", caption).
427 427
  ///   run();
428 428
  ///\endcode
429 429
  ///
430
  /// By default the reader uses the first section in the file of the
430
  /// By default, the reader uses the first section in the file of the
431 431
  /// proper type. If a section has an optional name, then it can be
432 432
  /// selected for reading by giving an optional name parameter to the
433 433
  /// \c nodes(), \c arcs() or \c attributes() functions.
434 434
  ///
435 435
  /// The \c useNodes() and \c useArcs() functions are used to tell the reader
436 436
  /// that the nodes or arcs should not be constructed (added to the
... ...
@@ -559,13 +559,13 @@
559 559

	
560 560
  private:
561 561

	
562 562
    template <typename TDGR>
563 563
    friend DigraphReader<TDGR> digraphReader(TDGR& digraph, std::istream& is);
564 564
    template <typename TDGR>
565
    friend DigraphReader<TDGR> digraphReader(TDGR& digraph, 
565
    friend DigraphReader<TDGR> digraphReader(TDGR& digraph,
566 566
                                             const std::string& fn);
567 567
    template <typename TDGR>
568 568
    friend DigraphReader<TDGR> digraphReader(TDGR& digraph, const char *fn);
569 569

	
570 570
    DigraphReader(DigraphReader& other)
571 571
      : _is(other._is), local_is(other.local_is), _digraph(other._digraph),
... ...
@@ -1191,20 +1191,20 @@
1191 1191

	
1192 1192
    }
1193 1193

	
1194 1194
    /// @}
1195 1195

	
1196 1196
  };
1197
  
1197

	
1198 1198
  /// \ingroup lemon_io
1199 1199
  ///
1200 1200
  /// \brief Return a \ref DigraphReader class
1201 1201
  ///
1202 1202
  /// This function just returns a \ref DigraphReader class.
1203 1203
  ///
1204
  /// With this function a digraph can be read from an 
1204
  /// With this function a digraph can be read from an
1205 1205
  /// \ref lgf-format "LGF" file or input stream with several maps and
1206 1206
  /// attributes. For example, there is network flow problem on a
1207 1207
  /// digraph, i.e. a digraph with a \e capacity map on the arcs and
1208 1208
  /// \e source and \e target nodes. This digraph can be read with the
1209 1209
  /// following code:
1210 1210
  ///
... ...
@@ -1253,13 +1253,13 @@
1253 1253
    DigraphReader<TDGR> tmp(digraph, fn);
1254 1254
    return tmp;
1255 1255
  }
1256 1256

	
1257 1257
  template <typename GR>
1258 1258
  class GraphReader;
1259
 
1259

	
1260 1260
  template <typename TGR>
1261 1261
  GraphReader<TGR> graphReader(TGR& graph, std::istream& is = std::cin);
1262 1262
  template <typename TGR>
1263 1263
  GraphReader<TGR> graphReader(TGR& graph, const std::string& fn);
1264 1264
  template <typename TGR>
1265 1265
  GraphReader<TGR> graphReader(TGR& graph, const char *fn);
... ...
@@ -1390,13 +1390,13 @@
1390 1390
    }
1391 1391

	
1392 1392
  private:
1393 1393
    template <typename TGR>
1394 1394
    friend GraphReader<TGR> graphReader(TGR& graph, std::istream& is);
1395 1395
    template <typename TGR>
1396
    friend GraphReader<TGR> graphReader(TGR& graph, const std::string& fn); 
1396
    friend GraphReader<TGR> graphReader(TGR& graph, const std::string& fn);
1397 1397
    template <typename TGR>
1398 1398
    friend GraphReader<TGR> graphReader(TGR& graph, const char *fn);
1399 1399

	
1400 1400
    GraphReader(GraphReader& other)
1401 1401
      : _is(other._is), local_is(other.local_is), _graph(other._graph),
1402 1402
        _use_nodes(other._use_nodes), _use_edges(other._use_edges),
... ...
@@ -2074,15 +2074,15 @@
2074 2074
  };
2075 2075

	
2076 2076
  /// \ingroup lemon_io
2077 2077
  ///
2078 2078
  /// \brief Return a \ref GraphReader class
2079 2079
  ///
2080
  /// This function just returns a \ref GraphReader class. 
2080
  /// This function just returns a \ref GraphReader class.
2081 2081
  ///
2082
  /// With this function a graph can be read from an 
2082
  /// With this function a graph can be read from an
2083 2083
  /// \ref lgf-format "LGF" file or input stream with several maps and
2084 2084
  /// attributes. For example, there is weighted matching problem on a
2085 2085
  /// graph, i.e. a graph with a \e weight map on the edges. This
2086 2086
  /// graph can be read with the following code:
2087 2087
  ///
2088 2088
  ///\code
... ...
@@ -2232,13 +2232,13 @@
2232 2232
    /// second is a functor, which takes just one \c std::string
2233 2233
    /// parameter. At the reading process, each line of the section
2234 2234
    /// will be given to the functor object. However, the empty lines
2235 2235
    /// and the comment lines are filtered out, and the leading
2236 2236
    /// whitespaces are trimmed from each processed string.
2237 2237
    ///
2238
    /// For example let's see a section, which contain several
2238
    /// For example, let's see a section, which contain several
2239 2239
    /// integers, which should be inserted into a vector.
2240 2240
    ///\code
2241 2241
    ///  @numbers
2242 2242
    ///  12 45 23
2243 2243
    ///  4
2244 2244
    ///  23 6
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -348,13 +348,13 @@
348 348
  }
349 349

	
350 350
  template <typename DGR>
351 351
  class DigraphWriter;
352 352

	
353 353
  template <typename TDGR>
354
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, 
354
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph,
355 355
                                   std::ostream& os = std::cout);
356 356
  template <typename TDGR>
357 357
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, const std::string& fn);
358 358

	
359 359
  template <typename TDGR>
360 360
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, const char* fn);
... ...
@@ -501,13 +501,13 @@
501 501
      }
502 502
    }
503 503

	
504 504
  private:
505 505

	
506 506
    template <typename TDGR>
507
    friend DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, 
507
    friend DigraphWriter<TDGR> digraphWriter(const TDGR& digraph,
508 508
                                             std::ostream& os);
509 509
    template <typename TDGR>
510 510
    friend DigraphWriter<TDGR> digraphWriter(const TDGR& digraph,
511 511
                                             const std::string& fn);
512 512
    template <typename TDGR>
513 513
    friend DigraphWriter<TDGR> digraphWriter(const TDGR& digraph,
... ...
@@ -914,13 +914,13 @@
914 914
  };
915 915

	
916 916
  /// \ingroup lemon_io
917 917
  ///
918 918
  /// \brief Return a \ref DigraphWriter class
919 919
  ///
920
  /// This function just returns a \ref DigraphWriter class. 
920
  /// This function just returns a \ref DigraphWriter class.
921 921
  ///
922 922
  /// With this function a digraph can be write to a file or output
923 923
  /// stream in \ref lgf-format "LGF" format with several maps and
924 924
  /// attributes. For example, with the following code a network flow
925 925
  /// problem can be written to the standard output, i.e. a digraph
926 926
  /// with a \e capacity map on the arcs and \e source and \e target
... ...
@@ -954,13 +954,13 @@
954 954
  /// \brief Return a \ref DigraphWriter class
955 955
  ///
956 956
  /// This function just returns a \ref DigraphWriter class.
957 957
  /// \relates DigraphWriter
958 958
  /// \sa digraphWriter(const TDGR& digraph, std::ostream& os)
959 959
  template <typename TDGR>
960
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, 
960
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph,
961 961
                                    const std::string& fn) {
962 962
    DigraphWriter<TDGR> tmp(digraph, fn);
963 963
    return tmp;
964 964
  }
965 965

	
966 966
  /// \brief Return a \ref DigraphWriter class
... ...
@@ -1098,17 +1098,17 @@
1098 1098

	
1099 1099
  private:
1100 1100

	
1101 1101
    template <typename TGR>
1102 1102
    friend GraphWriter<TGR> graphWriter(const TGR& graph, std::ostream& os);
1103 1103
    template <typename TGR>
1104
    friend GraphWriter<TGR> graphWriter(const TGR& graph, 
1104
    friend GraphWriter<TGR> graphWriter(const TGR& graph,
1105 1105
                                        const std::string& fn);
1106 1106
    template <typename TGR>
1107 1107
    friend GraphWriter<TGR> graphWriter(const TGR& graph, const char *fn);
1108
    
1108

	
1109 1109
    GraphWriter(GraphWriter& other)
1110 1110
      : _os(other._os), local_os(other.local_os), _graph(other._graph),
1111 1111
        _skip_nodes(other._skip_nodes), _skip_edges(other._skip_edges) {
1112 1112

	
1113 1113
      other._os = 0;
1114 1114
      other.local_os = false;
... ...
@@ -1553,13 +1553,13 @@
1553 1553
  };
1554 1554

	
1555 1555
  /// \ingroup lemon_io
1556 1556
  ///
1557 1557
  /// \brief Return a \ref GraphWriter class
1558 1558
  ///
1559
  /// This function just returns a \ref GraphWriter class. 
1559
  /// This function just returns a \ref GraphWriter class.
1560 1560
  ///
1561 1561
  /// With this function a graph can be write to a file or output
1562 1562
  /// stream in \ref lgf-format "LGF" format with several maps and
1563 1563
  /// attributes. For example, with the following code a weighted
1564 1564
  /// matching problem can be written to the standard output, i.e. a
1565 1565
  /// graph with a \e weight map on the edges:
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -18,23 +18,25 @@
18 18

	
19 19
#ifndef LEMON_LIST_GRAPH_H
20 20
#define LEMON_LIST_GRAPH_H
21 21

	
22 22
///\ingroup graphs
23 23
///\file
24
///\brief ListDigraph, ListGraph classes.
24
///\brief ListDigraph and ListGraph classes.
25 25

	
26 26
#include <lemon/core.h>
27 27
#include <lemon/error.h>
28 28
#include <lemon/bits/graph_extender.h>
29 29

	
30 30
#include <vector>
31 31
#include <list>
32 32

	
33 33
namespace lemon {
34 34

	
35
  class ListDigraph;
36

	
35 37
  class ListDigraphBase {
36 38

	
37 39
  protected:
38 40
    struct NodeT {
39 41
      int first_in, first_out;
40 42
      int prev, next;
... ...
@@ -59,12 +61,13 @@
59 61
  public:
60 62

	
61 63
    typedef ListDigraphBase Digraph;
62 64

	
63 65
    class Node {
64 66
      friend class ListDigraphBase;
67
      friend class ListDigraph;
65 68
    protected:
66 69

	
67 70
      int id;
68 71
      explicit Node(int pid) { id = pid;}
69 72

	
70 73
    public:
... ...
@@ -74,12 +77,13 @@
74 77
      bool operator!=(const Node& node) const {return id != node.id;}
75 78
      bool operator<(const Node& node) const {return id < node.id;}
76 79
    };
77 80

	
78 81
    class Arc {
79 82
      friend class ListDigraphBase;
83
      friend class ListDigraph;
80 84
    protected:
81 85

	
82 86
      int id;
83 87
      explicit Arc(int pid) { id = pid;}
84 88

	
85 89
    public:
... ...
@@ -113,26 +117,26 @@
113 117
    }
114 118

	
115 119

	
116 120
    void first(Arc& arc) const {
117 121
      int n;
118 122
      for(n = first_node;
119
          n!=-1 && nodes[n].first_in == -1;
123
          n != -1 && nodes[n].first_out == -1;
120 124
          n = nodes[n].next) {}
121
      arc.id = (n == -1) ? -1 : nodes[n].first_in;
125
      arc.id = (n == -1) ? -1 : nodes[n].first_out;
122 126
    }
123 127

	
124 128
    void next(Arc& arc) const {
125
      if (arcs[arc.id].next_in != -1) {
126
        arc.id = arcs[arc.id].next_in;
129
      if (arcs[arc.id].next_out != -1) {
130
        arc.id = arcs[arc.id].next_out;
127 131
      } else {
128 132
        int n;
129
        for(n = nodes[arcs[arc.id].target].next;
130
            n!=-1 && nodes[n].first_in == -1;
133
        for(n = nodes[arcs[arc.id].source].next;
134
            n != -1 && nodes[n].first_out == -1;
131 135
            n = nodes[n].next) {}
132
        arc.id = (n == -1) ? -1 : nodes[n].first_in;
136
        arc.id = (n == -1) ? -1 : nodes[n].first_out;
133 137
      }
134 138
    }
135 139

	
136 140
    void firstOut(Arc &e, const Node& v) const {
137 141
      e.id = nodes[v.id].first_out;
138 142
    }
... ...
@@ -308,241 +312,258 @@
308 312

	
309 313
  /// \addtogroup graphs
310 314
  /// @{
311 315

	
312 316
  ///A general directed graph structure.
313 317

	
314
  ///\ref ListDigraph is a simple and fast <em>directed graph</em>
315
  ///implementation based on static linked lists that are stored in
318
  ///\ref ListDigraph is a versatile and fast directed graph
319
  ///implementation based on linked lists that are stored in
316 320
  ///\c std::vector structures.
317 321
  ///
318
  ///It conforms to the \ref concepts::Digraph "Digraph concept" and it
319
  ///also provides several useful additional functionalities.
320
  ///Most of the member functions and nested classes are documented
322
  ///This type fully conforms to the \ref concepts::Digraph "Digraph concept"
323
  ///and it also provides several useful additional functionalities.
324
  ///Most of its member functions and nested classes are documented
321 325
  ///only in the concept class.
322 326
  ///
327
  ///This class provides only linear time counting for nodes and arcs.
328
  ///
323 329
  ///\sa concepts::Digraph
324

	
330
  ///\sa ListGraph
325 331
  class ListDigraph : public ExtendedListDigraphBase {
326 332
    typedef ExtendedListDigraphBase Parent;
327 333

	
328 334
  private:
329
    ///ListDigraph is \e not copy constructible. Use copyDigraph() instead.
330

	
331
    ///ListDigraph is \e not copy constructible. Use copyDigraph() instead.
332
    ///
335
    /// Digraphs are \e not copy constructible. Use DigraphCopy instead.
333 336
    ListDigraph(const ListDigraph &) :ExtendedListDigraphBase() {};
334
    ///\brief Assignment of ListDigraph to another one is \e not allowed.
335
    ///Use copyDigraph() instead.
336

	
337
    ///Assignment of ListDigraph to another one is \e not allowed.
338
    ///Use copyDigraph() instead.
337
    /// \brief Assignment of a digraph to another one is \e not allowed.
338
    /// Use DigraphCopy instead.
339 339
    void operator=(const ListDigraph &) {}
340 340
  public:
341 341

	
342 342
    /// Constructor
343 343

	
344 344
    /// Constructor.
345 345
    ///
346 346
    ListDigraph() {}
347 347

	
348 348
    ///Add a new node to the digraph.
349 349

	
350
    ///Add a new node to the digraph.
350
    ///This function adds a new node to the digraph.
351 351
    ///\return The new node.
352 352
    Node addNode() { return Parent::addNode(); }
353 353

	
354 354
    ///Add a new arc to the digraph.
355 355

	
356
    ///Add a new arc to the digraph with source node \c s
356
    ///This function adds a new arc to the digraph with source node \c s
357 357
    ///and target node \c t.
358 358
    ///\return The new arc.
359
    Arc addArc(const Node& s, const Node& t) {
359
    Arc addArc(Node s, Node t) {
360 360
      return Parent::addArc(s, t);
361 361
    }
362 362

	
363 363
    ///\brief Erase a node from the digraph.
364 364
    ///
365
    ///Erase a node from the digraph.
365
    ///This function erases the given node along with its outgoing and
366
    ///incoming arcs from the digraph.
366 367
    ///
367
    void erase(const Node& n) { Parent::erase(n); }
368
    ///\note All iterators referencing the removed node or the connected
369
    ///arcs are invalidated, of course.
370
    void erase(Node n) { Parent::erase(n); }
368 371

	
369 372
    ///\brief Erase an arc from the digraph.
370 373
    ///
371
    ///Erase an arc from the digraph.
374
    ///This function erases the given arc from the digraph.
372 375
    ///
373
    void erase(const Arc& a) { Parent::erase(a); }
376
    ///\note All iterators referencing the removed arc are invalidated,
377
    ///of course.
378
    void erase(Arc a) { Parent::erase(a); }
374 379

	
375 380
    /// Node validity check
376 381

	
377
    /// This function gives back true if the given node is valid,
378
    /// ie. it is a real node of the graph.
382
    /// This function gives back \c true if the given node is valid,
383
    /// i.e. it is a real node of the digraph.
379 384
    ///
380
    /// \warning A Node pointing to a removed item
381
    /// could become valid again later if new nodes are
382
    /// added to the graph.
385
    /// \warning A removed node could become valid again if new nodes are
386
    /// added to the digraph.
383 387
    bool valid(Node n) const { return Parent::valid(n); }
384 388

	
385 389
    /// Arc validity check
386 390

	
387
    /// This function gives back true if the given arc is valid,
388
    /// ie. it is a real arc of the graph.
391
    /// This function gives back \c true if the given arc is valid,
392
    /// i.e. it is a real arc of the digraph.
389 393
    ///
390
    /// \warning An Arc pointing to a removed item
391
    /// could become valid again later if new nodes are
392
    /// added to the graph.
394
    /// \warning A removed arc could become valid again if new arcs are
395
    /// added to the digraph.
393 396
    bool valid(Arc a) const { return Parent::valid(a); }
394 397

	
395
    /// Change the target of \c a to \c n
398
    /// Change the target node of an arc
396 399

	
397
    /// Change the target of \c a to \c n
400
    /// This function changes the target node of the given arc \c a to \c n.
398 401
    ///
399
    ///\note The <tt>ArcIt</tt>s and <tt>OutArcIt</tt>s referencing
400
    ///the changed arc remain valid. However <tt>InArcIt</tt>s are
401
    ///invalidated.
402
    ///\note \c ArcIt and \c OutArcIt iterators referencing the changed
403
    ///arc remain valid, but \c InArcIt iterators are invalidated.
402 404
    ///
403 405
    ///\warning This functionality cannot be used together with the Snapshot
404 406
    ///feature.
405 407
    void changeTarget(Arc a, Node n) {
406 408
      Parent::changeTarget(a,n);
407 409
    }
408
    /// Change the source of \c a to \c n
410
    /// Change the source node of an arc
409 411

	
410
    /// Change the source of \c a to \c n
412
    /// This function changes the source node of the given arc \c a to \c n.
411 413
    ///
412
    ///\note The <tt>InArcIt</tt>s referencing the changed arc remain
413
    ///valid. However the <tt>ArcIt</tt>s and <tt>OutArcIt</tt>s are
414
    ///invalidated.
414
    ///\note \c InArcIt iterators referencing the changed arc remain
415
    ///valid, but \c ArcIt and \c OutArcIt iterators are invalidated.
415 416
    ///
416 417
    ///\warning This functionality cannot be used together with the Snapshot
417 418
    ///feature.
418 419
    void changeSource(Arc a, Node n) {
419 420
      Parent::changeSource(a,n);
420 421
    }
421 422

	
422
    /// Invert the direction of an arc.
423
    /// Reverse the direction of an arc.
423 424

	
424
    ///\note The <tt>ArcIt</tt>s referencing the changed arc remain
425
    ///valid. However <tt>OutArcIt</tt>s and <tt>InArcIt</tt>s are
426
    ///invalidated.
425
    /// This function reverses the direction of the given arc.
426
    ///\note \c ArcIt, \c OutArcIt and \c InArcIt iterators referencing
427
    ///the changed arc are invalidated.
427 428
    ///
428 429
    ///\warning This functionality cannot be used together with the Snapshot
429 430
    ///feature.
430
    void reverseArc(Arc e) {
431
      Node t=target(e);
432
      changeTarget(e,source(e));
433
      changeSource(e,t);
431
    void reverseArc(Arc a) {
432
      Node t=target(a);
433
      changeTarget(a,source(a));
434
      changeSource(a,t);
434 435
    }
435 436

	
436
    /// Reserve memory for nodes.
437

	
438
    /// Using this function it is possible to avoid the superfluous memory
439
    /// allocation: if you know that the digraph you want to build will
440
    /// be very large (e.g. it will contain millions of nodes and/or arcs)
441
    /// then it is worth reserving space for this amount before starting
442
    /// to build the digraph.
443
    /// \sa reserveArc
444
    void reserveNode(int n) { nodes.reserve(n); };
445

	
446
    /// Reserve memory for arcs.
447

	
448
    /// Using this function it is possible to avoid the superfluous memory
449
    /// allocation: if you know that the digraph you want to build will
450
    /// be very large (e.g. it will contain millions of nodes and/or arcs)
451
    /// then it is worth reserving space for this amount before starting
452
    /// to build the digraph.
453
    /// \sa reserveNode
454
    void reserveArc(int m) { arcs.reserve(m); };
455

	
456 437
    ///Contract two nodes.
457 438

	
458
    ///This function contracts two nodes.
459
    ///Node \p b will be removed but instead of deleting
460
    ///incident arcs, they will be joined to \p a.
461
    ///The last parameter \p r controls whether to remove loops. \c true
462
    ///means that loops will be removed.
439
    ///This function contracts the given two nodes.
440
    ///Node \c v is removed, but instead of deleting its
441
    ///incident arcs, they are joined to node \c u.
442
    ///If the last parameter \c r is \c true (this is the default value),
443
    ///then the newly created loops are removed.
463 444
    ///
464
    ///\note The <tt>ArcIt</tt>s referencing a moved arc remain
465
    ///valid. However <tt>InArcIt</tt>s and <tt>OutArcIt</tt>s
466
    ///may be invalidated.
445
    ///\note The moved arcs are joined to node \c u using changeSource()
446
    ///or changeTarget(), thus \c ArcIt and \c OutArcIt iterators are
447
    ///invalidated for the outgoing arcs of node \c v and \c InArcIt
448
    ///iterators are invalidated for the incomming arcs of \c v.
449
    ///Moreover all iterators referencing node \c v or the removed
450
    ///loops are also invalidated. Other iterators remain valid.
467 451
    ///
468 452
    ///\warning This functionality cannot be used together with the Snapshot
469 453
    ///feature.
470
    void contract(Node a, Node b, bool r = true)
454
    void contract(Node u, Node v, bool r = true)
471 455
    {
472
      for(OutArcIt e(*this,b);e!=INVALID;) {
456
      for(OutArcIt e(*this,v);e!=INVALID;) {
473 457
        OutArcIt f=e;
474 458
        ++f;
475
        if(r && target(e)==a) erase(e);
476
        else changeSource(e,a);
459
        if(r && target(e)==u) erase(e);
460
        else changeSource(e,u);
477 461
        e=f;
478 462
      }
479
      for(InArcIt e(*this,b);e!=INVALID;) {
463
      for(InArcIt e(*this,v);e!=INVALID;) {
480 464
        InArcIt f=e;
481 465
        ++f;
482
        if(r && source(e)==a) erase(e);
483
        else changeTarget(e,a);
466
        if(r && source(e)==u) erase(e);
467
        else changeTarget(e,u);
484 468
        e=f;
485 469
      }
486
      erase(b);
470
      erase(v);
487 471
    }
488 472

	
489 473
    ///Split a node.
490 474

	
491
    ///This function splits a node. First a new node is added to the digraph,
492
    ///then the source of each outgoing arc of \c n is moved to this new node.
493
    ///If \c connect is \c true (this is the default value), then a new arc
494
    ///from \c n to the newly created node is also added.
475
    ///This function splits the given node. First, a new node is added
476
    ///to the digraph, then the source of each outgoing arc of node \c n
477
    ///is moved to this new node.
478
    ///If the second parameter \c connect is \c true (this is the default
479
    ///value), then a new arc from node \c n to the newly created node
480
    ///is also added.
495 481
    ///\return The newly created node.
496 482
    ///
497
    ///\note The <tt>ArcIt</tt>s referencing a moved arc remain
498
    ///valid. However <tt>InArcIt</tt>s and <tt>OutArcIt</tt>s may
499
    ///be invalidated.
483
    ///\note All iterators remain valid.
500 484
    ///
501
    ///\warning This functionality cannot be used in conjunction with the
485
    ///\warning This functionality cannot be used together with the
502 486
    ///Snapshot feature.
503 487
    Node split(Node n, bool connect = true) {
504 488
      Node b = addNode();
505
      for(OutArcIt e(*this,n);e!=INVALID;) {
506
        OutArcIt f=e;
507
        ++f;
508
        changeSource(e,b);
509
        e=f;
489
      nodes[b.id].first_out=nodes[n.id].first_out;
490
      nodes[n.id].first_out=-1;
491
      for(int i=nodes[b.id].first_out; i!=-1; i=arcs[i].next_out) {
492
        arcs[i].source=b.id;
510 493
      }
511 494
      if (connect) addArc(n,b);
512 495
      return b;
513 496
    }
514 497

	
515 498
    ///Split an arc.
516 499

	
517
    ///This function splits an arc. First a new node \c b is added to
518
    ///the digraph, then the original arc is re-targeted to \c
519
    ///b. Finally an arc from \c b to the original target is added.
500
    ///This function splits the given arc. First, a new node \c v is
501
    ///added to the digraph, then the target node of the original arc
502
    ///is set to \c v. Finally, an arc from \c v to the original target
503
    ///is added.
504
    ///\return The newly created node.
520 505
    ///
521
    ///\return The newly created node.
506
    ///\note \c InArcIt iterators referencing the original arc are
507
    ///invalidated. Other iterators remain valid.
522 508
    ///
523 509
    ///\warning This functionality cannot be used together with the
524 510
    ///Snapshot feature.
525
    Node split(Arc e) {
526
      Node b = addNode();
527
      addArc(b,target(e));
528
      changeTarget(e,b);
529
      return b;
511
    Node split(Arc a) {
512
      Node v = addNode();
513
      addArc(v,target(a));
514
      changeTarget(a,v);
515
      return v;
530 516
    }
531 517

	
518
    ///Clear the digraph.
519

	
520
    ///This function erases all nodes and arcs from the digraph.
521
    ///
522
    ///\note All iterators of the digraph are invalidated, of course.
523
    void clear() {
524
      Parent::clear();
525
    }
526

	
527
    /// Reserve memory for nodes.
528

	
529
    /// Using this function, it is possible to avoid superfluous memory
530
    /// allocation: if you know that the digraph you want to build will
531
    /// be large (e.g. it will contain millions of nodes and/or arcs),
532
    /// then it is worth reserving space for this amount before starting
533
    /// to build the digraph.
534
    /// \sa reserveArc()
535
    void reserveNode(int n) { nodes.reserve(n); };
536

	
537
    /// Reserve memory for arcs.
538

	
539
    /// Using this function, it is possible to avoid superfluous memory
540
    /// allocation: if you know that the digraph you want to build will
541
    /// be large (e.g. it will contain millions of nodes and/or arcs),
542
    /// then it is worth reserving space for this amount before starting
543
    /// to build the digraph.
544
    /// \sa reserveNode()
545
    void reserveArc(int m) { arcs.reserve(m); };
546

	
532 547
    /// \brief Class to make a snapshot of the digraph and restore
533 548
    /// it later.
534 549
    ///
535 550
    /// Class to make a snapshot of the digraph and restore it later.
536 551
    ///
537 552
    /// The newly added nodes and arcs can be removed using the
538 553
    /// restore() function.
539 554
    ///
540
    /// \warning Arc and node deletions and other modifications (e.g.
541
    /// contracting, splitting, reversing arcs or nodes) cannot be
555
    /// \note After a state is restored, you cannot restore a later state,
556
    /// i.e. you cannot add the removed nodes and arcs again using
557
    /// another Snapshot instance.
558
    ///
559
    /// \warning Node and arc deletions and other modifications (e.g.
560
    /// reversing, contracting, splitting arcs or nodes) cannot be
542 561
    /// restored. These events invalidate the snapshot.
562
    /// However, the arcs and nodes that were added to the digraph after
563
    /// making the current snapshot can be removed without invalidating it.
543 564
    class Snapshot {
544 565
    protected:
545 566

	
546 567
      typedef Parent::NodeNotifier NodeNotifier;
547 568

	
548 569
      class NodeObserverProxy : public NodeNotifier::ObserverBase {
... ...
@@ -706,45 +727,46 @@
706 727

	
707 728
    public:
708 729

	
709 730
      /// \brief Default constructor.
710 731
      ///
711 732
      /// Default constructor.
712
      /// To actually make a snapshot you must call save().
733
      /// You have to call save() to actually make a snapshot.
713 734
      Snapshot()
714 735
        : digraph(0), node_observer_proxy(*this),
715 736
          arc_observer_proxy(*this) {}
716 737

	
717 738
      /// \brief Constructor that immediately makes a snapshot.
718 739
      ///
719
      /// This constructor immediately makes a snapshot of the digraph.
720
      /// \param _digraph The digraph we make a snapshot of.
721
      Snapshot(ListDigraph &_digraph)
740
      /// This constructor immediately makes a snapshot of the given digraph.
741
      Snapshot(ListDigraph &gr)
722 742
        : node_observer_proxy(*this),
723 743
          arc_observer_proxy(*this) {
724
        attach(_digraph);
744
        attach(gr);
725 745
      }
726 746

	
727 747
      /// \brief Make a snapshot.
728 748
      ///
729
      /// Make a snapshot of the digraph.
730
      ///
731
      /// This function can be called more than once. In case of a repeated
749
      /// This function makes a snapshot of the given digraph.
750
      /// It can be called more than once. In case of a repeated
732 751
      /// call, the previous snapshot gets lost.
733
      /// \param _digraph The digraph we make the snapshot of.
734
      void save(ListDigraph &_digraph) {
752
      void save(ListDigraph &gr) {
735 753
        if (attached()) {
736 754
          detach();
737 755
          clear();
738 756
        }
739
        attach(_digraph);
757
        attach(gr);
740 758
      }
741 759

	
742 760
      /// \brief Undo the changes until the last snapshot.
743
      //
744
      /// Undo the changes until the last snapshot created by save().
761
      ///
762
      /// This function undos the changes until the last snapshot
763
      /// created by save() or Snapshot(ListDigraph&).
764
      ///
765
      /// \warning This method invalidates the snapshot, i.e. repeated
766
      /// restoring is not supported unless you call save() again.
745 767
      void restore() {
746 768
        detach();
747 769
        for(std::list<Arc>::iterator it = added_arcs.begin();
748 770
            it != added_arcs.end(); ++it) {
749 771
          digraph->erase(*it);
750 772
        }
... ...
@@ -752,15 +774,15 @@
752 774
            it != added_nodes.end(); ++it) {
753 775
          digraph->erase(*it);
754 776
        }
755 777
        clear();
756 778
      }
757 779

	
758
      /// \brief Gives back true when the snapshot is valid.
780
      /// \brief Returns \c true if the snapshot is valid.
759 781
      ///
760
      /// Gives back true when the snapshot is valid.
782
      /// This function returns \c true if the snapshot is valid.
761 783
      bool valid() const {
762 784
        return attached();
763 785
      }
764 786
    };
765 787

	
766 788
  };
... ...
@@ -792,16 +814,12 @@
792 814
    int first_free_arc;
793 815

	
794 816
  public:
795 817

	
796 818
    typedef ListGraphBase Graph;
797 819

	
798
    class Node;
799
    class Arc;
800
    class Edge;
801

	
802 820
    class Node {
803 821
      friend class ListGraphBase;
804 822
    protected:
805 823

	
806 824
      int id;
807 825
      explicit Node(int pid) { id = pid;}
... ...
@@ -845,14 +863,12 @@
845 863
      Arc (Invalid) { id = -1; }
846 864
      bool operator==(const Arc& arc) const {return id == arc.id;}
847 865
      bool operator!=(const Arc& arc) const {return id != arc.id;}
848 866
      bool operator<(const Arc& arc) const {return id < arc.id;}
849 867
    };
850 868

	
851

	
852

	
853 869
    ListGraphBase()
854 870
      : nodes(), first_node(-1),
855 871
        first_free_node(-1), arcs(), first_free_arc(-1) {}
856 872

	
857 873

	
858 874
    int maxNodeId() const { return nodes.size()-1; }
... ...
@@ -1161,137 +1177,141 @@
1161 1177

	
1162 1178
  /// \addtogroup graphs
1163 1179
  /// @{
1164 1180

	
1165 1181
  ///A general undirected graph structure.
1166 1182

	
1167
  ///\ref ListGraph is a simple and fast <em>undirected graph</em>
1168
  ///implementation based on static linked lists that are stored in
1183
  ///\ref ListGraph is a versatile and fast undirected graph
1184
  ///implementation based on linked lists that are stored in
1169 1185
  ///\c std::vector structures.
1170 1186
  ///
1171
  ///It conforms to the \ref concepts::Graph "Graph concept" and it
1172
  ///also provides several useful additional functionalities.
1173
  ///Most of the member functions and nested classes are documented
1187
  ///This type fully conforms to the \ref concepts::Graph "Graph concept"
1188
  ///and it also provides several useful additional functionalities.
1189
  ///Most of its member functions and nested classes are documented
1174 1190
  ///only in the concept class.
1175 1191
  ///
1192
  ///This class provides only linear time counting for nodes, edges and arcs.
1193
  ///
1176 1194
  ///\sa concepts::Graph
1177

	
1195
  ///\sa ListDigraph
1178 1196
  class ListGraph : public ExtendedListGraphBase {
1179 1197
    typedef ExtendedListGraphBase Parent;
1180 1198

	
1181 1199
  private:
1182
    ///ListGraph is \e not copy constructible. Use copyGraph() instead.
1183

	
1184
    ///ListGraph is \e not copy constructible. Use copyGraph() instead.
1185
    ///
1200
    /// Graphs are \e not copy constructible. Use GraphCopy instead.
1186 1201
    ListGraph(const ListGraph &) :ExtendedListGraphBase()  {};
1187
    ///\brief Assignment of ListGraph to another one is \e not allowed.
1188
    ///Use copyGraph() instead.
1189

	
1190
    ///Assignment of ListGraph to another one is \e not allowed.
1191
    ///Use copyGraph() instead.
1202
    /// \brief Assignment of a graph to another one is \e not allowed.
1203
    /// Use GraphCopy instead.
1192 1204
    void operator=(const ListGraph &) {}
1193 1205
  public:
1194 1206
    /// Constructor
1195 1207

	
1196 1208
    /// Constructor.
1197 1209
    ///
1198 1210
    ListGraph() {}
1199 1211

	
1200 1212
    typedef Parent::OutArcIt IncEdgeIt;
1201 1213

	
1202 1214
    /// \brief Add a new node to the graph.
1203 1215
    ///
1204
    /// Add a new node to the graph.
1216
    /// This function adds a new node to the graph.
1205 1217
    /// \return The new node.
1206 1218
    Node addNode() { return Parent::addNode(); }
1207 1219

	
1208 1220
    /// \brief Add a new edge to the graph.
1209 1221
    ///
1210
    /// Add a new edge to the graph with source node \c s
1211
    /// and target node \c t.
1222
    /// This function adds a new edge to the graph between nodes
1223
    /// \c u and \c v with inherent orientation from node \c u to
1224
    /// node \c v.
1212 1225
    /// \return The new edge.
1213
    Edge addEdge(const Node& s, const Node& t) {
1214
      return Parent::addEdge(s, t);
1226
    Edge addEdge(Node u, Node v) {
1227
      return Parent::addEdge(u, v);
1215 1228
    }
1216 1229

	
1217
    /// \brief Erase a node from the graph.
1230
    ///\brief Erase a node from the graph.
1218 1231
    ///
1219
    /// Erase a node from the graph.
1232
    /// This function erases the given node along with its incident arcs
1233
    /// from the graph.
1220 1234
    ///
1221
    void erase(const Node& n) { Parent::erase(n); }
1235
    /// \note All iterators referencing the removed node or the incident
1236
    /// edges are invalidated, of course.
1237
    void erase(Node n) { Parent::erase(n); }
1222 1238

	
1223
    /// \brief Erase an edge from the graph.
1239
    ///\brief Erase an edge from the graph.
1224 1240
    ///
1225
    /// Erase an edge from the graph.
1241
    /// This function erases the given edge from the graph.
1226 1242
    ///
1227
    void erase(const Edge& e) { Parent::erase(e); }
1243
    /// \note All iterators referencing the removed edge are invalidated,
1244
    /// of course.
1245
    void erase(Edge e) { Parent::erase(e); }
1228 1246
    /// Node validity check
1229 1247

	
1230
    /// This function gives back true if the given node is valid,
1231
    /// ie. it is a real node of the graph.
1248
    /// This function gives back \c true if the given node is valid,
1249
    /// i.e. it is a real node of the graph.
1232 1250
    ///
1233
    /// \warning A Node pointing to a removed item
1234
    /// could become valid again later if new nodes are
1251
    /// \warning A removed node could become valid again if new nodes are
1235 1252
    /// added to the graph.
1236 1253
    bool valid(Node n) const { return Parent::valid(n); }
1254
    /// Edge validity check
1255

	
1256
    /// This function gives back \c true if the given edge is valid,
1257
    /// i.e. it is a real edge of the graph.
1258
    ///
1259
    /// \warning A removed edge could become valid again if new edges are
1260
    /// added to the graph.
1261
    bool valid(Edge e) const { return Parent::valid(e); }
1237 1262
    /// Arc validity check
1238 1263

	
1239
    /// This function gives back true if the given arc is valid,
1240
    /// ie. it is a real arc of the graph.
1264
    /// This function gives back \c true if the given arc is valid,
1265
    /// i.e. it is a real arc of the graph.
1241 1266
    ///
1242
    /// \warning An Arc pointing to a removed item
1243
    /// could become valid again later if new edges are
1267
    /// \warning A removed arc could become valid again if new edges are
1244 1268
    /// added to the graph.
1245 1269
    bool valid(Arc a) const { return Parent::valid(a); }
1246
    /// Edge validity check
1247 1270

	
1248
    /// This function gives back true if the given edge is valid,
1249
    /// ie. it is a real arc of the graph.
1271
    /// \brief Change the first node of an edge.
1250 1272
    ///
1251
    /// \warning A Edge pointing to a removed item
1252
    /// could become valid again later if new edges are
1253
    /// added to the graph.
1254
    bool valid(Edge e) const { return Parent::valid(e); }
1255
    /// \brief Change the end \c u of \c e to \c n
1273
    /// This function changes the first node of the given edge \c e to \c n.
1256 1274
    ///
1257
    /// This function changes the end \c u of \c e to node \c n.
1258
    ///
1259
    ///\note The <tt>EdgeIt</tt>s and <tt>ArcIt</tt>s referencing the
1260
    ///changed edge are invalidated and if the changed node is the
1261
    ///base node of an iterator then this iterator is also
1262
    ///invalidated.
1275
    ///\note \c EdgeIt and \c ArcIt iterators referencing the
1276
    ///changed edge are invalidated and all other iterators whose
1277
    ///base node is the changed node are also invalidated.
1263 1278
    ///
1264 1279
    ///\warning This functionality cannot be used together with the
1265 1280
    ///Snapshot feature.
1266 1281
    void changeU(Edge e, Node n) {
1267 1282
      Parent::changeU(e,n);
1268 1283
    }
1269
    /// \brief Change the end \c v of \c e to \c n
1284
    /// \brief Change the second node of an edge.
1270 1285
    ///
1271
    /// This function changes the end \c v of \c e to \c n.
1286
    /// This function changes the second node of the given edge \c e to \c n.
1272 1287
    ///
1273
    ///\note The <tt>EdgeIt</tt>s referencing the changed edge remain
1274
    ///valid, however <tt>ArcIt</tt>s and if the changed node is the
1275
    ///base node of an iterator then this iterator is invalidated.
1288
    ///\note \c EdgeIt iterators referencing the changed edge remain
1289
    ///valid, but \c ArcIt iterators referencing the changed edge and
1290
    ///all other iterators whose base node is the changed node are also
1291
    ///invalidated.
1276 1292
    ///
1277 1293
    ///\warning This functionality cannot be used together with the
1278 1294
    ///Snapshot feature.
1279 1295
    void changeV(Edge e, Node n) {
1280 1296
      Parent::changeV(e,n);
1281 1297
    }
1298

	
1282 1299
    /// \brief Contract two nodes.
1283 1300
    ///
1284
    /// This function contracts two nodes.
1285
    /// Node \p b will be removed but instead of deleting
1286
    /// its neighboring arcs, they will be joined to \p a.
1287
    /// The last parameter \p r controls whether to remove loops. \c true
1288
    /// means that loops will be removed.
1301
    /// This function contracts the given two nodes.
1302
    /// Node \c b is removed, but instead of deleting
1303
    /// its incident edges, they are joined to node \c a.
1304
    /// If the last parameter \c r is \c true (this is the default value),
1305
    /// then the newly created loops are removed.
1289 1306
    ///
1290
    /// \note The <tt>ArcIt</tt>s referencing a moved arc remain
1291
    /// valid.
1307
    /// \note The moved edges are joined to node \c a using changeU()
1308
    /// or changeV(), thus all edge and arc iterators whose base node is
1309
    /// \c b are invalidated.
1310
    /// Moreover all iterators referencing node \c b or the removed
1311
    /// loops are also invalidated. Other iterators remain valid.
1292 1312
    ///
1293 1313
    ///\warning This functionality cannot be used together with the
1294 1314
    ///Snapshot feature.
1295 1315
    void contract(Node a, Node b, bool r = true) {
1296 1316
      for(IncEdgeIt e(*this, b); e!=INVALID;) {
1297 1317
        IncEdgeIt f = e; ++f;
... ...
@@ -1304,24 +1324,58 @@
1304 1324
        }
1305 1325
        e = f;
1306 1326
      }
1307 1327
      erase(b);
1308 1328
    }
1309 1329

	
1330
    ///Clear the graph.
1331

	
1332
    ///This function erases all nodes and arcs from the graph.
1333
    ///
1334
    ///\note All iterators of the graph are invalidated, of course.
1335
    void clear() {
1336
      Parent::clear();
1337
    }
1338

	
1339
    /// Reserve memory for nodes.
1340

	
1341
    /// Using this function, it is possible to avoid superfluous memory
1342
    /// allocation: if you know that the graph you want to build will
1343
    /// be large (e.g. it will contain millions of nodes and/or edges),
1344
    /// then it is worth reserving space for this amount before starting
1345
    /// to build the graph.
1346
    /// \sa reserveEdge()
1347
    void reserveNode(int n) { nodes.reserve(n); };
1348

	
1349
    /// Reserve memory for edges.
1350

	
1351
    /// Using this function, it is possible to avoid superfluous memory
1352
    /// allocation: if you know that the graph you want to build will
1353
    /// be large (e.g. it will contain millions of nodes and/or edges),
1354
    /// then it is worth reserving space for this amount before starting
1355
    /// to build the graph.
1356
    /// \sa reserveNode()
1357
    void reserveEdge(int m) { arcs.reserve(2 * m); };
1310 1358

	
1311 1359
    /// \brief Class to make a snapshot of the graph and restore
1312 1360
    /// it later.
1313 1361
    ///
1314 1362
    /// Class to make a snapshot of the graph and restore it later.
1315 1363
    ///
1316 1364
    /// The newly added nodes and edges can be removed
1317 1365
    /// using the restore() function.
1318 1366
    ///
1319
    /// \warning Edge and node deletions and other modifications
1320
    /// (e.g. changing nodes of edges, contracting nodes) cannot be
1321
    /// restored. These events invalidate the snapshot.
1367
    /// \note After a state is restored, you cannot restore a later state,
1368
    /// i.e. you cannot add the removed nodes and edges again using
1369
    /// another Snapshot instance.
1370
    ///
1371
    /// \warning Node and edge deletions and other modifications
1372
    /// (e.g. changing the end-nodes of edges or contracting nodes)
1373
    /// cannot be restored. These events invalidate the snapshot.
1374
    /// However, the edges and nodes that were added to the graph after
1375
    /// making the current snapshot can be removed without invalidating it.
1322 1376
    class Snapshot {
1323 1377
    protected:
1324 1378

	
1325 1379
      typedef Parent::NodeNotifier NodeNotifier;
1326 1380

	
1327 1381
      class NodeObserverProxy : public NodeNotifier::ObserverBase {
... ...
@@ -1485,45 +1539,46 @@
1485 1539

	
1486 1540
    public:
1487 1541

	
1488 1542
      /// \brief Default constructor.
1489 1543
      ///
1490 1544
      /// Default constructor.
1491
      /// To actually make a snapshot you must call save().
1545
      /// You have to call save() to actually make a snapshot.
1492 1546
      Snapshot()
1493 1547
        : graph(0), node_observer_proxy(*this),
1494 1548
          edge_observer_proxy(*this) {}
1495 1549

	
1496 1550
      /// \brief Constructor that immediately makes a snapshot.
1497 1551
      ///
1498
      /// This constructor immediately makes a snapshot of the graph.
1499
      /// \param _graph The graph we make a snapshot of.
1500
      Snapshot(ListGraph &_graph)
1552
      /// This constructor immediately makes a snapshot of the given graph.
1553
      Snapshot(ListGraph &gr)
1501 1554
        : node_observer_proxy(*this),
1502 1555
          edge_observer_proxy(*this) {
1503
        attach(_graph);
1556
        attach(gr);
1504 1557
      }
1505 1558

	
1506 1559
      /// \brief Make a snapshot.
1507 1560
      ///
1508
      /// Make a snapshot of the graph.
1509
      ///
1510
      /// This function can be called more than once. In case of a repeated
1561
      /// This function makes a snapshot of the given graph.
1562
      /// It can be called more than once. In case of a repeated
1511 1563
      /// call, the previous snapshot gets lost.
1512
      /// \param _graph The graph we make the snapshot of.
1513
      void save(ListGraph &_graph) {
1564
      void save(ListGraph &gr) {
1514 1565
        if (attached()) {
1515 1566
          detach();
1516 1567
          clear();
1517 1568
        }
1518
        attach(_graph);
1569
        attach(gr);
1519 1570
      }
1520 1571

	
1521 1572
      /// \brief Undo the changes until the last snapshot.
1522
      //
1523
      /// Undo the changes until the last snapshot created by save().
1573
      ///
1574
      /// This function undos the changes until the last snapshot
1575
      /// created by save() or Snapshot(ListGraph&).
1576
      ///
1577
      /// \warning This method invalidates the snapshot, i.e. repeated
1578
      /// restoring is not supported unless you call save() again.
1524 1579
      void restore() {
1525 1580
        detach();
1526 1581
        for(std::list<Edge>::iterator it = added_edges.begin();
1527 1582
            it != added_edges.end(); ++it) {
1528 1583
          graph->erase(*it);
1529 1584
        }
... ...
@@ -1531,15 +1586,15 @@
1531 1586
            it != added_nodes.end(); ++it) {
1532 1587
          graph->erase(*it);
1533 1588
        }
1534 1589
        clear();
1535 1590
      }
1536 1591

	
1537
      /// \brief Gives back true when the snapshot is valid.
1592
      /// \brief Returns \c true if the snapshot is valid.
1538 1593
      ///
1539
      /// Gives back true when the snapshot is valid.
1594
      /// This function returns \c true if the snapshot is valid.
1540 1595
      bool valid() const {
1541 1596
        return attached();
1542 1597
      }
1543 1598
    };
1544 1599
  };
1545 1600

	
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -81,13 +81,13 @@
81 81
  typedef CplexMip Mip;
82 82
#elif LEMON_HAVE_SOPLEX
83 83
# define DEFAULT_LP SOPLEX
84 84
  typedef SoplexLp Lp;
85 85
#elif LEMON_HAVE_CLP
86 86
# define DEFAULT_LP CLP
87
  typedef ClpLp Lp;  
87
  typedef ClpLp Lp;
88 88
#endif
89 89
#endif
90 90

	
91 91
} //namespace lemon
92 92

	
93 93
#endif //LEMON_LP_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -79,13 +79,13 @@
79 79
      MESSAGE_WARNING,
80 80
      /// Normal output.
81 81
      MESSAGE_NORMAL,
82 82
      /// Verbose output.
83 83
      MESSAGE_VERBOSE
84 84
    };
85
    
85

	
86 86

	
87 87
    ///The floating point type used by the solver
88 88
    typedef double Value;
89 89
    ///The infinity constant
90 90
    static const Value INF;
91 91
    ///The not a number constant
... ...
@@ -111,20 +111,20 @@
111 111
      int _id;
112 112
      explicit Col(int id) : _id(id) {}
113 113
    public:
114 114
      typedef Value ExprValue;
115 115
      typedef True LpCol;
116 116
      /// Default constructor
117
      
117

	
118 118
      /// \warning The default constructor sets the Col to an
119 119
      /// undefined value.
120 120
      Col() {}
121 121
      /// Invalid constructor \& conversion.
122
      
122

	
123 123
      /// This constructor initializes the Col to be invalid.
124
      /// \sa Invalid for more details.      
124
      /// \sa Invalid for more details.
125 125
      Col(const Invalid&) : _id(-1) {}
126 126
      /// Equality operator
127 127

	
128 128
      /// Two \ref Col "Col"s are equal if and only if they point to
129 129
      /// the same LP column or both are invalid.
130 130
      bool operator==(Col c) const  {return _id == c._id;}
... ...
@@ -143,41 +143,41 @@
143 143
      /// ordering of the items.
144 144
      bool operator<(Col c) const  {return _id < c._id;}
145 145
    };
146 146

	
147 147
    ///Iterator for iterate over the columns of an LP problem
148 148

	
149
    /// Its usage is quite simple, for example you can count the number
149
    /// Its usage is quite simple, for example, you can count the number
150 150
    /// of columns in an LP \c lp:
151 151
    ///\code
152 152
    /// int count=0;
153 153
    /// for (LpBase::ColIt c(lp); c!=INVALID; ++c) ++count;
154 154
    ///\endcode
155 155
    class ColIt : public Col {
156 156
      const LpBase *_solver;
157 157
    public:
158 158
      /// Default constructor
159
      
159

	
160 160
      /// \warning The default constructor sets the iterator
161 161
      /// to an undefined value.
162 162
      ColIt() {}
163 163
      /// Sets the iterator to the first Col
164
      
164

	
165 165
      /// Sets the iterator to the first Col.
166 166
      ///
167 167
      ColIt(const LpBase &solver) : _solver(&solver)
168 168
      {
169 169
        _solver->cols.firstItem(_id);
170 170
      }
171 171
      /// Invalid constructor \& conversion
172
      
172

	
173 173
      /// Initialize the iterator to be invalid.
174 174
      /// \sa Invalid for more details.
175 175
      ColIt(const Invalid&) : Col(INVALID) {}
176 176
      /// Next column
177
      
177

	
178 178
      /// Assign the iterator to the next column.
179 179
      ///
180 180
      ColIt &operator++()
181 181
      {
182 182
        _solver->cols.nextItem(_id);
183 183
        return *this;
... ...
@@ -206,28 +206,28 @@
206 206
      int _id;
207 207
      explicit Row(int id) : _id(id) {}
208 208
    public:
209 209
      typedef Value ExprValue;
210 210
      typedef True LpRow;
211 211
      /// Default constructor
212
      
212

	
213 213
      /// \warning The default constructor sets the Row to an
214 214
      /// undefined value.
215 215
      Row() {}
216 216
      /// Invalid constructor \& conversion.
217
      
217

	
218 218
      /// This constructor initializes the Row to be invalid.
219
      /// \sa Invalid for more details.      
219
      /// \sa Invalid for more details.
220 220
      Row(const Invalid&) : _id(-1) {}
221 221
      /// Equality operator
222 222

	
223 223
      /// Two \ref Row "Row"s are equal if and only if they point to
224 224
      /// the same LP row or both are invalid.
225 225
      bool operator==(Row r) const  {return _id == r._id;}
226 226
      /// Inequality operator
227
      
227

	
228 228
      /// \sa operator==(Row r)
229 229
      ///
230 230
      bool operator!=(Row r) const  {return _id != r._id;}
231 231
      /// Artificial ordering operator.
232 232

	
233 233
      /// To allow the use of this object in std::map or similar
... ...
@@ -238,41 +238,41 @@
238 238
      /// ordering of the items.
239 239
      bool operator<(Row r) const  {return _id < r._id;}
240 240
    };
241 241

	
242 242
    ///Iterator for iterate over the rows of an LP problem
243 243

	
244
    /// Its usage is quite simple, for example you can count the number
244
    /// Its usage is quite simple, for example, you can count the number
245 245
    /// of rows in an LP \c lp:
246 246
    ///\code
247 247
    /// int count=0;
248 248
    /// for (LpBase::RowIt c(lp); c!=INVALID; ++c) ++count;
249 249
    ///\endcode
250 250
    class RowIt : public Row {
251 251
      const LpBase *_solver;
252 252
    public:
253 253
      /// Default constructor
254
      
254

	
255 255
      /// \warning The default constructor sets the iterator
256 256
      /// to an undefined value.
257 257
      RowIt() {}
258 258
      /// Sets the iterator to the first Row
259
      
259

	
260 260
      /// Sets the iterator to the first Row.
261 261
      ///
262 262
      RowIt(const LpBase &solver) : _solver(&solver)
263 263
      {
264 264
        _solver->rows.firstItem(_id);
265 265
      }
266 266
      /// Invalid constructor \& conversion
267
      
267

	
268 268
      /// Initialize the iterator to be invalid.
269 269
      /// \sa Invalid for more details.
270 270
      RowIt(const Invalid&) : Row(INVALID) {}
271 271
      /// Next row
272
      
272

	
273 273
      /// Assign the iterator to the next row.
274 274
      ///
275 275
      RowIt &operator++()
276 276
      {
277 277
        _solver->rows.nextItem(_id);
278 278
        return *this;
... ...
@@ -344,13 +344,13 @@
344 344
      Value const_comp;
345 345
      std::map<int, Value> comps;
346 346

	
347 347
    public:
348 348
      typedef True SolverExpr;
349 349
      /// Default constructor
350
      
350

	
351 351
      /// Construct an empty expression, the coefficients and
352 352
      /// the constant component are initialized to zero.
353 353
      Expr() : const_comp(0) {}
354 354
      /// Construct an expression from a column
355 355

	
356 356
      /// Construct an expression, which has a term with \c c variable
... ...
@@ -445,15 +445,15 @@
445 445
          it->second/=c;
446 446
        const_comp/=c;
447 447
        return *this;
448 448
      }
449 449

	
450 450
      ///Iterator over the expression
451
      
452
      ///The iterator iterates over the terms of the expression. 
453
      /// 
451

	
452
      ///The iterator iterates over the terms of the expression.
453
      ///
454 454
      ///\code
455 455
      ///double s=0;
456 456
      ///for(LpBase::Expr::CoeffIt i(e);i!=INVALID;++i)
457 457
      ///  s+= *i * primal(i);
458 458
      ///\endcode
459 459
      class CoeffIt {
... ...
@@ -461,13 +461,13 @@
461 461

	
462 462
        std::map<int, Value>::iterator _it, _end;
463 463

	
464 464
      public:
465 465

	
466 466
        /// Sets the iterator to the first term
467
        
467

	
468 468
        /// Sets the iterator to the first term of the expression.
469 469
        ///
470 470
        CoeffIt(Expr& e)
471 471
          : _it(e.comps.begin()), _end(e.comps.end()){}
472 472

	
473 473
        /// Convert the iterator to the column of the term
... ...
@@ -478,27 +478,27 @@
478 478
        /// Returns the coefficient of the term
479 479
        Value& operator*() { return _it->second; }
480 480

	
481 481
        /// Returns the coefficient of the term
482 482
        const Value& operator*() const { return _it->second; }
483 483
        /// Next term
484
        
484

	
485 485
        /// Assign the iterator to the next term.
486 486
        ///
487 487
        CoeffIt& operator++() { ++_it; return *this; }
488 488

	
489 489
        /// Equality operator
490 490
        bool operator==(Invalid) const { return _it == _end; }
491 491
        /// Inequality operator
492 492
        bool operator!=(Invalid) const { return _it != _end; }
493 493
      };
494 494

	
495 495
      /// Const iterator over the expression
496
      
497
      ///The iterator iterates over the terms of the expression. 
498
      /// 
496

	
497
      ///The iterator iterates over the terms of the expression.
498
      ///
499 499
      ///\code
500 500
      ///double s=0;
501 501
      ///for(LpBase::Expr::ConstCoeffIt i(e);i!=INVALID;++i)
502 502
      ///  s+=*i * primal(i);
503 503
      ///\endcode
504 504
      class ConstCoeffIt {
... ...
@@ -506,13 +506,13 @@
506 506

	
507 507
        std::map<int, Value>::const_iterator _it, _end;
508 508

	
509 509
      public:
510 510

	
511 511
        /// Sets the iterator to the first term
512
        
512

	
513 513
        /// Sets the iterator to the first term of the expression.
514 514
        ///
515 515
        ConstCoeffIt(const Expr& e)
516 516
          : _it(e.comps.begin()), _end(e.comps.end()){}
517 517

	
518 518
        /// Convert the iterator to the column of the term
... ...
@@ -521,13 +521,13 @@
521 521
        }
522 522

	
523 523
        /// Returns the coefficient of the term
524 524
        const Value& operator*() const { return _it->second; }
525 525

	
526 526
        /// Next term
527
        
527

	
528 528
        /// Assign the iterator to the next term.
529 529
        ///
530 530
        ConstCoeffIt& operator++() { ++_it; return *this; }
531 531

	
532 532
        /// Equality operator
533 533
        bool operator==(Invalid) const { return _it == _end; }
... ...
@@ -670,13 +670,13 @@
670 670
    protected:
671 671
      std::map<int, Value> comps;
672 672

	
673 673
    public:
674 674
      typedef True SolverExpr;
675 675
      /// Default constructor
676
      
676

	
677 677
      /// Construct an empty expression, the coefficients are
678 678
      /// initialized to zero.
679 679
      DualExpr() {}
680 680
      /// Construct an expression from a row
681 681

	
682 682
      /// Construct an expression, which has a term with \c r dual
... ...
@@ -705,13 +705,13 @@
705 705
          comps.insert(pair_type(id(r), v));
706 706
        } else {
707 707
          comps.erase(id(r));
708 708
        }
709 709
      }
710 710
      /// \brief Removes the coefficients which's absolute value does
711
      /// not exceed \c epsilon. 
711
      /// not exceed \c epsilon.
712 712
      void simplify(Value epsilon = 0.0) {
713 713
        std::map<int, Value>::iterator it=comps.begin();
714 714
        while (it != comps.end()) {
715 715
          std::map<int, Value>::iterator jt=it;
716 716
          ++jt;
717 717
          if (std::fabs((*it).second) <= epsilon) comps.erase(it);
... ...
@@ -754,15 +754,15 @@
754 754
             it!=comps.end(); ++it)
755 755
          it->second/=v;
756 756
        return *this;
757 757
      }
758 758

	
759 759
      ///Iterator over the expression
760
      
761
      ///The iterator iterates over the terms of the expression. 
762
      /// 
760

	
761
      ///The iterator iterates over the terms of the expression.
762
      ///
763 763
      ///\code
764 764
      ///double s=0;
765 765
      ///for(LpBase::DualExpr::CoeffIt i(e);i!=INVALID;++i)
766 766
      ///  s+= *i * dual(i);
767 767
      ///\endcode
768 768
      class CoeffIt {
... ...
@@ -770,13 +770,13 @@
770 770

	
771 771
        std::map<int, Value>::iterator _it, _end;
772 772

	
773 773
      public:
774 774

	
775 775
        /// Sets the iterator to the first term
776
        
776

	
777 777
        /// Sets the iterator to the first term of the expression.
778 778
        ///
779 779
        CoeffIt(DualExpr& e)
780 780
          : _it(e.comps.begin()), _end(e.comps.end()){}
781 781

	
782 782
        /// Convert the iterator to the row of the term
... ...
@@ -788,27 +788,27 @@
788 788
        Value& operator*() { return _it->second; }
789 789

	
790 790
        /// Returns the coefficient of the term
791 791
        const Value& operator*() const { return _it->second; }
792 792

	
793 793
        /// Next term
794
        
794

	
795 795
        /// Assign the iterator to the next term.
796 796
        ///
797 797
        CoeffIt& operator++() { ++_it; return *this; }
798 798

	
799 799
        /// Equality operator
800 800
        bool operator==(Invalid) const { return _it == _end; }
801 801
        /// Inequality operator
802 802
        bool operator!=(Invalid) const { return _it != _end; }
803 803
      };
804 804

	
805 805
      ///Iterator over the expression
806
      
807
      ///The iterator iterates over the terms of the expression. 
808
      /// 
806

	
807
      ///The iterator iterates over the terms of the expression.
808
      ///
809 809
      ///\code
810 810
      ///double s=0;
811 811
      ///for(LpBase::DualExpr::ConstCoeffIt i(e);i!=INVALID;++i)
812 812
      ///  s+= *i * dual(i);
813 813
      ///\endcode
814 814
      class ConstCoeffIt {
... ...
@@ -816,13 +816,13 @@
816 816

	
817 817
        std::map<int, Value>::const_iterator _it, _end;
818 818

	
819 819
      public:
820 820

	
821 821
        /// Sets the iterator to the first term
822
        
822

	
823 823
        /// Sets the iterator to the first term of the expression.
824 824
        ///
825 825
        ConstCoeffIt(const DualExpr& e)
826 826
          : _it(e.comps.begin()), _end(e.comps.end()){}
827 827

	
828 828
        /// Convert the iterator to the row of the term
... ...
@@ -831,13 +831,13 @@
831 831
        }
832 832

	
833 833
        /// Returns the coefficient of the term
834 834
        const Value& operator*() const { return _it->second; }
835 835

	
836 836
        /// Next term
837
        
837

	
838 838
        /// Assign the iterator to the next term.
839 839
        ///
840 840
        ConstCoeffIt& operator++() { ++_it; return *this; }
841 841

	
842 842
        /// Equality operator
843 843
        bool operator==(Invalid) const { return _it == _end; }
... ...
@@ -940,12 +940,20 @@
940 940
    virtual void _eraseColId(int col) { cols.eraseIndex(col); }
941 941
    virtual void _eraseRowId(int row) { rows.eraseIndex(row); }
942 942

	
943 943
    virtual int _addCol() = 0;
944 944
    virtual int _addRow() = 0;
945 945

	
946
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u) {
947
      int row = _addRow();
948
      _setRowCoeffs(row, b, e);
949
      _setRowLowerBound(row, l);
950
      _setRowUpperBound(row, u);
951
      return row;
952
    }
953

	
946 954
    virtual void _eraseCol(int col) = 0;
947 955
    virtual void _eraseRow(int row) = 0;
948 956

	
949 957
    virtual void _getColName(int col, std::string& name) const = 0;
950 958
    virtual void _setColName(int col, const std::string& name) = 0;
951 959
    virtual int _colByName(const std::string& name) const = 0;
... ...
@@ -1204,24 +1212,30 @@
1204 1212

	
1205 1213
    ///\param l is the lower bound (-\ref INF means no bound)
1206 1214
    ///\param e is a linear expression (see \ref Expr)
1207 1215
    ///\param u is the upper bound (\ref INF means no bound)
1208 1216
    ///\return The created row.
1209 1217
    Row addRow(Value l,const Expr &e, Value u) {
1210
      Row r=addRow();
1211
      row(r,l,e,u);
1218
      Row r;
1219
      e.simplify();
1220
      r._id = _addRowId(_addRow(l - *e, ExprIterator(e.comps.begin(), cols),
1221
                                ExprIterator(e.comps.end(), cols), u - *e));
1212 1222
      return r;
1213 1223
    }
1214 1224

	
1215 1225
    ///Add a new row (i.e a new constraint) to the LP
1216 1226

	
1217 1227
    ///\param c is a linear expression (see \ref Constr)
1218 1228
    ///\return The created row.
1219 1229
    Row addRow(const Constr &c) {
1220
      Row r=addRow();
1221
      row(r,c);
1230
      Row r;
1231
      c.expr().simplify();
1232
      r._id = _addRowId(_addRow(c.lowerBounded()?c.lowerBound()-*c.expr():-INF,
1233
                                ExprIterator(c.expr().comps.begin(), cols),
1234
                                ExprIterator(c.expr().comps.end(), cols),
1235
                                c.upperBounded()?c.upperBound()-*c.expr():INF));
1222 1236
      return r;
1223 1237
    }
1224 1238
    ///Erase a column (i.e a variable) from the LP
1225 1239

	
1226 1240
    ///\param c is the column to be deleted
1227 1241
    void erase(Col c) {
... ...
@@ -1800,16 +1814,16 @@
1800 1814
      UNBOUNDED = 4
1801 1815
    };
1802 1816

	
1803 1817
    ///The basis status of variables
1804 1818
    enum VarStatus {
1805 1819
      /// The variable is in the basis
1806
      BASIC, 
1820
      BASIC,
1807 1821
      /// The variable is free, but not basic
1808 1822
      FREE,
1809
      /// The variable has active lower bound 
1823
      /// The variable has active lower bound
1810 1824
      LOWER,
1811 1825
      /// The variable has active upper bound
1812 1826
      UPPER,
1813 1827
      /// The variable is non-basic and fixed
1814 1828
      FIXED
1815 1829
    };
... ...
@@ -1882,13 +1896,13 @@
1882 1896
      for (Expr::ConstCoeffIt c(e); c != INVALID; ++c) {
1883 1897
        res += *c * primal(c);
1884 1898
      }
1885 1899
      return res;
1886 1900
    }
1887 1901
    /// Returns a component of the primal ray
1888
    
1902

	
1889 1903
    /// The primal ray is solution of the modified primal problem,
1890 1904
    /// where we change each finite bound to 0, and we looking for a
1891 1905
    /// negative objective value in case of minimization, and positive
1892 1906
    /// objective value for maximization. If there is such solution,
1893 1907
    /// that proofs the unsolvability of the dual problem, and if a
1894 1908
    /// feasible primal solution exists, then the unboundness of
... ...
@@ -1916,13 +1930,13 @@
1916 1930
        res += *r * dual(r);
1917 1931
      }
1918 1932
      return res;
1919 1933
    }
1920 1934

	
1921 1935
    /// Returns a component of the dual ray
1922
    
1936

	
1923 1937
    /// The dual ray is solution of the modified primal problem, where
1924 1938
    /// we change each finite bound to 0 (i.e. the objective function
1925 1939
    /// coefficients in the primal problem), and we looking for a
1926 1940
    /// ositive objective value. If there is such solution, that
1927 1941
    /// proofs the unsolvability of the primal problem, and if a
1928 1942
    /// feasible dual solution exists, then the unboundness of
... ...
@@ -2058,13 +2072,13 @@
2058 2072
      for (Expr::ConstCoeffIt c(e); c != INVALID; ++c) {
2059 2073
        res += *c * sol(c);
2060 2074
      }
2061 2075
      return res;
2062 2076
    }
2063 2077
    ///The value of the objective function
2064
    
2078

	
2065 2079
    ///\return
2066 2080
    ///- \ref INF or -\ref INF means either infeasibility or unboundedness
2067 2081
    /// of the problem, depending on whether we minimize or maximize.
2068 2082
    ///- \ref NaN if no primal solution is found.
2069 2083
    ///- The (finite) objective value if an optimal solution is found.
2070 2084
    Value solValue() const { return _getSolValue()+obj_const_comp;}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -29,12 +29,17 @@
29 29

	
30 30
  int SkeletonSolverBase::_addRow()
31 31
  {
32 32
    return ++row_num;
33 33
  }
34 34

	
35
  int SkeletonSolverBase::_addRow(Value, ExprIterator, ExprIterator, Value)
36
  {
37
    return ++row_num;
38
  }
39

	
35 40
  void SkeletonSolverBase::_eraseCol(int) {}
36 41
  void SkeletonSolverBase::_eraseRow(int) {}
37 42

	
38 43
  void SkeletonSolverBase::_getColName(int, std::string &) const {}
39 44
  void SkeletonSolverBase::_setColName(int, const std::string &) {}
40 45
  int SkeletonSolverBase::_colByName(const std::string&) const { return -1; }
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -20,19 +20,19 @@
20 20
#define LEMON_LP_SKELETON_H
21 21

	
22 22
#include <lemon/lp_base.h>
23 23

	
24 24
///\file
25 25
///\brief Skeleton file to implement LP/MIP solver interfaces
26
///  
26
///
27 27
///The classes in this file do nothing, but they can serve as skeletons when
28 28
///implementing an interface to new solvers.
29 29
namespace lemon {
30 30

	
31 31
  ///A skeleton class to implement LP/MIP solver base interface
32
  
32

	
33 33
  ///This class does nothing, but it can serve as a skeleton when
34 34
  ///implementing an interface to new solvers.
35 35
  class SkeletonSolverBase : public virtual LpBase {
36 36
    int col_num,row_num;
37 37

	
38 38
  protected:
... ...
@@ -42,12 +42,14 @@
42 42

	
43 43
    /// \e
44 44
    virtual int _addCol();
45 45
    /// \e
46 46
    virtual int _addRow();
47 47
    /// \e
48
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
49
    /// \e
48 50
    virtual void _eraseCol(int i);
49 51
    /// \e
50 52
    virtual void _eraseRow(int i);
51 53

	
52 54
    /// \e
53 55
    virtual void _getColName(int col, std::string& name) const;
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -19,21 +19,20 @@
19 19
#ifndef LEMON_MAPS_H
20 20
#define LEMON_MAPS_H
21 21

	
22 22
#include <iterator>
23 23
#include <functional>
24 24
#include <vector>
25
#include <map>
25 26

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

	
28 29
///\file
29 30
///\ingroup maps
30 31
///\brief Miscellaneous property maps
31 32

	
32
#include <map>
33

	
34 33
namespace lemon {
35 34

	
36 35
  /// \addtogroup maps
37 36
  /// @{
38 37

	
39 38
  /// Base class of maps.
... ...
@@ -54,13 +53,13 @@
54 53
  /// Null map. (a.k.a. DoNothingMap)
55 54

	
56 55
  /// This map can be used if you have to provide a map only for
57 56
  /// its type definitions, or if you have to provide a writable map,
58 57
  /// but data written to it is not required (i.e. it will be sent to
59 58
  /// <tt>/dev/null</tt>).
60
  /// It conforms the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
59
  /// It conforms to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
61 60
  ///
62 61
  /// \sa ConstMap
63 62
  template<typename K, typename V>
64 63
  class NullMap : public MapBase<K, V> {
65 64
  public:
66 65
    ///\e
... ...
@@ -87,13 +86,13 @@
87 86
  /// Constant map.
88 87

	
89 88
  /// This \ref concepts::ReadMap "readable map" assigns a specified
90 89
  /// value to each key.
91 90
  ///
92 91
  /// In other aspects it is equivalent to \c NullMap.
93
  /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
92
  /// So it conforms to the \ref concepts::ReadWriteMap "ReadWriteMap"
94 93
  /// concept, but it absorbs the data written to it.
95 94
  ///
96 95
  /// The simplest way of using this map is through the constMap()
97 96
  /// function.
98 97
  ///
99 98
  /// \sa NullMap
... ...
@@ -156,13 +155,13 @@
156 155
  /// Constant map with inlined constant value.
157 156

	
158 157
  /// This \ref concepts::ReadMap "readable map" assigns a specified
159 158
  /// value to each key.
160 159
  ///
161 160
  /// In other aspects it is equivalent to \c NullMap.
162
  /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
161
  /// So it conforms to the \ref concepts::ReadWriteMap "ReadWriteMap"
163 162
  /// concept, but it absorbs the data written to it.
164 163
  ///
165 164
  /// The simplest way of using this map is through the constMap()
166 165
  /// function.
167 166
  ///
168 167
  /// \sa NullMap
... ...
@@ -228,15 +227,15 @@
228 227

	
229 228
  /// \brief Map for storing values for integer keys from the range
230 229
  /// <tt>[0..size-1]</tt>.
231 230
  ///
232 231
  /// This map is essentially a wrapper for \c std::vector. It assigns
233 232
  /// values to integer keys from the range <tt>[0..size-1]</tt>.
234
  /// It can be used with some data structures, for example
235
  /// \c UnionFind, \c BinHeap, when the used items are small
236
  /// integers. This map conforms the \ref concepts::ReferenceMap
233
  /// It can be used together with some data structures, e.g.
234
  /// heap types and \c UnionFind, when the used items are small
235
  /// integers. This map conforms to the \ref concepts::ReferenceMap
237 236
  /// "ReferenceMap" concept.
238 237
  ///
239 238
  /// The simplest way of using this map is through the rangeMap()
240 239
  /// function.
241 240
  template <typename V>
242 241
  class RangeMap : public MapBase<int, V> {
... ...
@@ -338,23 +337,23 @@
338 337
  /// Map type based on \c std::map
339 338

	
340 339
  /// This map is essentially a wrapper for \c std::map with addition
341 340
  /// that you can specify a default value for the keys that are not
342 341
  /// stored actually. This value can be different from the default
343 342
  /// contructed value (i.e. \c %Value()).
344
  /// This type conforms the \ref concepts::ReferenceMap "ReferenceMap"
343
  /// This type conforms to the \ref concepts::ReferenceMap "ReferenceMap"
345 344
  /// concept.
346 345
  ///
347 346
  /// This map is useful if a default value should be assigned to most of
348 347
  /// the keys and different values should be assigned only to a few
349 348
  /// keys (i.e. the map is "sparse").
350 349
  /// The name of this type also refers to this important usage.
351 350
  ///
352
  /// Apart form that this map can be used in many other cases since it
351
  /// Apart form that, this map can be used in many other cases since it
353 352
  /// is based on \c std::map, which is a general associative container.
354
  /// However keep in mind that it is usually not as efficient as other
353
  /// However, keep in mind that it is usually not as efficient as other
355 354
  /// maps.
356 355
  ///
357 356
  /// The simplest way of using this map is through the sparseMap()
358 357
  /// function.
359 358
  template <typename K, typename V, typename Comp = std::less<K> >
360 359
  class SparseMap : public MapBase<K, V> {
... ...
@@ -704,13 +703,13 @@
704 703
  /// another type using the default conversion.
705 704

	
706 705
  /// Map adaptor to convert the \c Value type of a \ref concepts::ReadMap
707 706
  /// "readable map" to another type using the default conversion.
708 707
  /// The \c Key type of it is inherited from \c M and the \c Value
709 708
  /// type is \c V.
710
  /// This type conforms the \ref concepts::ReadMap "ReadMap" concept.
709
  /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
711 710
  ///
712 711
  /// The simplest way of using this map is through the convertMap()
713 712
  /// function.
714 713
  template <typename M, typename V>
715 714
  class ConvertMap : public MapBase<typename M::Key, V> {
716 715
    const M &_m;
... ...
@@ -1783,28 +1782,28 @@
1783 1782
  /// Returns a \c LoggerBoolMap class
1784 1783

	
1785 1784
  /// This function just returns a \c LoggerBoolMap class.
1786 1785
  ///
1787 1786
  /// The most important usage of it is storing certain nodes or arcs
1788 1787
  /// that were marked \c true by an algorithm.
1789
  /// For example it makes easier to store the nodes in the processing
1788
  /// For example, it makes easier to store the nodes in the processing
1790 1789
  /// order of Dfs algorithm, as the following examples show.
1791 1790
  /// \code
1792 1791
  ///   std::vector<Node> v;
1793
  ///   dfs(g,s).processedMap(loggerBoolMap(std::back_inserter(v))).run();
1792
  ///   dfs(g).processedMap(loggerBoolMap(std::back_inserter(v))).run(s);
1794 1793
  /// \endcode
1795 1794
  /// \code
1796 1795
  ///   std::vector<Node> v(countNodes(g));
1797
  ///   dfs(g,s).processedMap(loggerBoolMap(v.begin())).run();
1796
  ///   dfs(g).processedMap(loggerBoolMap(v.begin())).run(s);
1798 1797
  /// \endcode
1799 1798
  ///
1800 1799
  /// \note The container of the iterator must contain enough space
1801 1800
  /// for the elements or the iterator should be an inserter iterator.
1802 1801
  ///
1803 1802
  /// \note LoggerBoolMap is just \ref concepts::WriteMap "writable", so
1804
  /// it cannot be used when a readable map is needed, for example as
1803
  /// it cannot be used when a readable map is needed, for example, as
1805 1804
  /// \c ReachedMap for \c Bfs, \c Dfs and \c Dijkstra algorithms.
1806 1805
  ///
1807 1806
  /// \relates LoggerBoolMap
1808 1807
  template<typename Iterator>
1809 1808
  inline LoggerBoolMap<Iterator> loggerBoolMap(Iterator it) {
1810 1809
    return LoggerBoolMap<Iterator>(it);
... ...
@@ -1815,21 +1814,21 @@
1815 1814
  /// \addtogroup graph_maps
1816 1815
  /// @{
1817 1816

	
1818 1817
  /// \brief Provides an immutable and unique id for each item in a graph.
1819 1818
  ///
1820 1819
  /// IdMap provides a unique and immutable id for each item of the
1821
  /// same type (\c Node, \c Arc or \c Edge) in a graph. This id is 
1820
  /// same type (\c Node, \c Arc or \c Edge) in a graph. This id is
1822 1821
  ///  - \b unique: different items get different ids,
1823 1822
  ///  - \b immutable: the id of an item does not change (even if you
1824 1823
  ///    delete other nodes).
1825 1824
  ///
1826 1825
  /// Using this map you get access (i.e. can read) the inner id values of
1827 1826
  /// the items stored in the graph, which is returned by the \c id()
1828 1827
  /// function of the graph. This map can be inverted with its member
1829
  /// class \c InverseMap or with the \c operator() member.
1828
  /// class \c InverseMap or with the \c operator()() member.
1830 1829
  ///
1831 1830
  /// \tparam GR The graph type.
1832 1831
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
1833 1832
  /// \c GR::Edge).
1834 1833
  ///
1835 1834
  /// \see RangeIdMap
... ...
@@ -1863,15 +1862,17 @@
1863 1862

	
1864 1863
  private:
1865 1864
    const Graph* _graph;
1866 1865

	
1867 1866
  public:
1868 1867

	
1869
    /// \brief This class represents the inverse of its owner (IdMap).
1868
    /// \brief The inverse map type of IdMap.
1870 1869
    ///
1871
    /// This class represents the inverse of its owner (IdMap).
1870
    /// The inverse map type of IdMap. The subscript operator gives back
1871
    /// an item by its id.
1872
    /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
1872 1873
    /// \see inverse()
1873 1874
    class InverseMap {
1874 1875
    public:
1875 1876

	
1876 1877
      /// \brief Constructor.
1877 1878
      ///
... ...
@@ -1880,35 +1881,52 @@
1880 1881

	
1881 1882
      /// \brief Constructor.
1882 1883
      ///
1883 1884
      /// Constructor for creating an id-to-item map.
1884 1885
      explicit InverseMap(const IdMap& map) : _graph(map._graph) {}
1885 1886

	
1886
      /// \brief Gives back the given item from its id.
1887
      /// \brief Gives back an item by its id.
1887 1888
      ///
1888
      /// Gives back the given item from its id.
1889
      /// Gives back an item by its id.
1889 1890
      Item operator[](int id) const { return _graph->fromId(id, Item());}
1890 1891

	
1891 1892
    private:
1892 1893
      const Graph* _graph;
1893 1894
    };
1894 1895

	
1895 1896
    /// \brief Gives back the inverse of the map.
1896 1897
    ///
1897 1898
    /// Gives back the inverse of the IdMap.
1898 1899
    InverseMap inverse() const { return InverseMap(*_graph);}
1899 1900
  };
1900 1901

	
1902
  /// \brief Returns an \c IdMap class.
1903
  ///
1904
  /// This function just returns an \c IdMap class.
1905
  /// \relates IdMap
1906
  template <typename K, typename GR>
1907
  inline IdMap<GR, K> idMap(const GR& graph) {
1908
    return IdMap<GR, K>(graph);
1909
  }
1901 1910

	
1902 1911
  /// \brief General cross reference graph map type.
1903 1912

	
1904 1913
  /// This class provides simple invertable graph maps.
1905 1914
  /// It wraps a standard graph map (\c NodeMap, \c ArcMap or \c EdgeMap)
1906 1915
  /// and if a key is set to a new value, then stores it in the inverse map.
1907
  /// The values of the map can be accessed
1908
  /// with stl compatible forward iterator.
1916
  /// The graph items can be accessed by their values either using
1917
  /// \c InverseMap or \c operator()(), and the values of the map can be
1918
  /// accessed with an STL compatible forward iterator (\c ValueIt).
1919
  ///
1920
  /// This map is intended to be used when all associated values are
1921
  /// different (the map is actually invertable) or there are only a few
1922
  /// items with the same value.
1923
  /// Otherwise consider to use \c IterableValueMap, which is more
1924
  /// suitable and more efficient for such cases. It provides iterators
1925
  /// to traverse the items with the same associated value, but
1926
  /// it does not have \c InverseMap.
1909 1927
  ///
1910 1928
  /// This type is not reference map, so it cannot be modified with
1911 1929
  /// the subscript operator.
1912 1930
  ///
1913 1931
  /// \tparam GR The graph type.
1914 1932
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
... ...
@@ -1943,62 +1961,72 @@
1943 1961
    ///
1944 1962
    /// Construct a new CrossRefMap for the given graph.
1945 1963
    explicit CrossRefMap(const Graph& graph) : Map(graph) {}
1946 1964

	
1947 1965
    /// \brief Forward iterator for values.
1948 1966
    ///
1949
    /// This iterator is an stl compatible forward
1967
    /// This iterator is an STL compatible forward
1950 1968
    /// iterator on the values of the map. The values can
1951 1969
    /// be accessed in the <tt>[beginValue, endValue)</tt> range.
1952 1970
    /// They are considered with multiplicity, so each value is
1953 1971
    /// traversed for each item it is assigned to.
1954
    class ValueIterator
1972
    class ValueIt
1955 1973
      : public std::iterator<std::forward_iterator_tag, Value> {
1956 1974
      friend class CrossRefMap;
1957 1975
    private:
1958
      ValueIterator(typename Container::const_iterator _it)
1976
      ValueIt(typename Container::const_iterator _it)
1959 1977
        : it(_it) {}
1960 1978
    public:
1961 1979

	
1962
      ValueIterator() {}
1963

	
1964
      ValueIterator& operator++() { ++it; return *this; }
1965
      ValueIterator operator++(int) {
1966
        ValueIterator tmp(*this);
1980
      /// Constructor
1981
      ValueIt() {}
1982

	
1983
      /// \e
1984
      ValueIt& operator++() { ++it; return *this; }
1985
      /// \e
1986
      ValueIt operator++(int) {
1987
        ValueIt tmp(*this);
1967 1988
        operator++();
1968 1989
        return tmp;
1969 1990
      }
1970 1991

	
1992
      /// \e
1971 1993
      const Value& operator*() const { return it->first; }
1994
      /// \e
1972 1995
      const Value* operator->() const { return &(it->first); }
1973 1996

	
1974
      bool operator==(ValueIterator jt) const { return it == jt.it; }
1975
      bool operator!=(ValueIterator jt) const { return it != jt.it; }
1997
      /// \e
1998
      bool operator==(ValueIt jt) const { return it == jt.it; }
1999
      /// \e
2000
      bool operator!=(ValueIt jt) const { return it != jt.it; }
1976 2001

	
1977 2002
    private:
1978 2003
      typename Container::const_iterator it;
1979 2004
    };
1980 2005

	
2006
    /// Alias for \c ValueIt
2007
    typedef ValueIt ValueIterator;
2008

	
1981 2009
    /// \brief Returns an iterator to the first value.
1982 2010
    ///
1983
    /// Returns an stl compatible iterator to the
2011
    /// Returns an STL compatible iterator to the
1984 2012
    /// first value of the map. The values of the
1985 2013
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
1986 2014
    /// range.
1987
    ValueIterator beginValue() const {
1988
      return ValueIterator(_inv_map.begin());
2015
    ValueIt beginValue() const {
2016
      return ValueIt(_inv_map.begin());
1989 2017
    }
1990 2018

	
1991 2019
    /// \brief Returns an iterator after the last value.
1992 2020
    ///
1993
    /// Returns an stl compatible iterator after the
2021
    /// Returns an STL compatible iterator after the
1994 2022
    /// last value of the map. The values of the
1995 2023
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
1996 2024
    /// range.
1997
    ValueIterator endValue() const {
1998
      return ValueIterator(_inv_map.end());
2025
    ValueIt endValue() const {
2026
      return ValueIt(_inv_map.end());
1999 2027
    }
2000 2028

	
2001 2029
    /// \brief Sets the value associated with the given key.
2002 2030
    ///
2003 2031
    /// Sets the value associated with the given key.
2004 2032
    void set(const Key& key, const Value& val) {
... ...
@@ -2031,12 +2059,20 @@
2031 2059
    /// only one of them is returned.
2032 2060
    Key operator()(const Value& val) const {
2033 2061
      typename Container::const_iterator it = _inv_map.find(val);
2034 2062
      return it != _inv_map.end() ? it->second : INVALID;
2035 2063
    }
2036 2064

	
2065
    /// \brief Returns the number of items with the given value.
2066
    ///
2067
    /// This function returns the number of items with the given value
2068
    /// associated with it.
2069
    int count(const Value &val) const {
2070
      return _inv_map.count(val);
2071
    }
2072

	
2037 2073
  protected:
2038 2074

	
2039 2075
    /// \brief Erase the key from the map and the inverse map.
2040 2076
    ///
2041 2077
    /// Erase the key from the map and the inverse map. It is called by the
2042 2078
    /// \c AlterationNotifier.
... ...
@@ -2080,16 +2116,18 @@
2080 2116
      _inv_map.clear();
2081 2117
      Map::clear();
2082 2118
    }
2083 2119

	
2084 2120
  public:
2085 2121

	
2086
    /// \brief The inverse map type.
2122
    /// \brief The inverse map type of CrossRefMap.
2087 2123
    ///
2088
    /// The inverse of this map. The subscript operator of the map
2089
    /// gives back the item that was last assigned to the value.
2124
    /// The inverse map type of CrossRefMap. The subscript operator gives
2125
    /// back an item by its value.
2126
    /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
2127
    /// \see inverse()
2090 2128
    class InverseMap {
2091 2129
    public:
2092 2130
      /// \brief Constructor
2093 2131
      ///
2094 2132
      /// Constructor of the InverseMap.
2095 2133
      explicit InverseMap(const CrossRefMap& inverted)
... ...
@@ -2110,37 +2148,37 @@
2110 2148
      }
2111 2149

	
2112 2150
    private:
2113 2151
      const CrossRefMap& _inverted;
2114 2152
    };
2115 2153

	
2116
    /// \brief It gives back the read-only inverse map.
2154
    /// \brief Gives back the inverse of the map.
2117 2155
    ///
2118
    /// It gives back the read-only inverse map.
2156
    /// Gives back the inverse of the CrossRefMap.
2119 2157
    InverseMap inverse() const {
2120 2158
      return InverseMap(*this);
2121 2159
    }
2122 2160

	
2123 2161
  };
2124 2162

	
2125
  /// \brief Provides continuous and unique ID for the
2163
  /// \brief Provides continuous and unique id for the
2126 2164
  /// items of a graph.
2127 2165
  ///
2128 2166
  /// RangeIdMap provides a unique and continuous
2129
  /// ID for each item of a given type (\c Node, \c Arc or
2167
  /// id for each item of a given type (\c Node, \c Arc or
2130 2168
  /// \c Edge) in a graph. This id is
2131 2169
  ///  - \b unique: different items get different ids,
2132 2170
  ///  - \b continuous: the range of the ids is the set of integers
2133 2171
  ///    between 0 and \c n-1, where \c n is the number of the items of
2134 2172
  ///    this type (\c Node, \c Arc or \c Edge).
2135 2173
  ///  - So, the ids can change when deleting an item of the same type.
2136 2174
  ///
2137 2175
  /// Thus this id is not (necessarily) the same as what can get using
2138 2176
  /// the \c id() function of the graph or \ref IdMap.
2139 2177
  /// This map can be inverted with its member class \c InverseMap,
2140
  /// or with the \c operator() member.
2178
  /// or with the \c operator()() member.
2141 2179
  ///
2142 2180
  /// \tparam GR The graph type.
2143 2181
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2144 2182
  /// \c GR::Edge).
2145 2183
  ///
2146 2184
  /// \see IdMap
... ...
@@ -2262,22 +2300,22 @@
2262 2300
      Map::set(p, qi);
2263 2301
      _inv_map[qi] = p;
2264 2302
      Map::set(q, pi);
2265 2303
      _inv_map[pi] = q;
2266 2304
    }
2267 2305

	
2268
    /// \brief Gives back the \e RangeId of the item
2306
    /// \brief Gives back the \e range \e id of the item
2269 2307
    ///
2270
    /// Gives back the \e RangeId of the item.
2308
    /// Gives back the \e range \e id of the item.
2271 2309
    int operator[](const Item& item) const {
2272 2310
      return Map::operator[](item);
2273 2311
    }
2274 2312

	
2275
    /// \brief Gives back the item belonging to a \e RangeId
2276
    /// 
2277
    /// Gives back the item belonging to a \e RangeId.
2313
    /// \brief Gives back the item belonging to a \e range \e id
2314
    ///
2315
    /// Gives back the item belonging to the given \e range \e id.
2278 2316
    Item operator()(int id) const {
2279 2317
      return _inv_map[id];
2280 2318
    }
2281 2319

	
2282 2320
  private:
2283 2321

	
... ...
@@ -2285,13 +2323,15 @@
2285 2323
    Container _inv_map;
2286 2324

	
2287 2325
  public:
2288 2326

	
2289 2327
    /// \brief The inverse map type of RangeIdMap.
2290 2328
    ///
2291
    /// The inverse map type of RangeIdMap.
2329
    /// The inverse map type of RangeIdMap. The subscript operator gives
2330
    /// back an item by its \e range \e id.
2331
    /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
2292 2332
    class InverseMap {
2293 2333
    public:
2294 2334
      /// \brief Constructor
2295 2335
      ///
2296 2336
      /// Constructor of the InverseMap.
2297 2337
      explicit InverseMap(const RangeIdMap& inverted)
... ...
@@ -2303,13 +2343,13 @@
2303 2343
      /// The key type of the InverseMap.
2304 2344
      typedef typename RangeIdMap::Value Key;
2305 2345

	
2306 2346
      /// \brief Subscript operator.
2307 2347
      ///
2308 2348
      /// Subscript operator. It gives back the item
2309
      /// that the descriptor currently belongs to.
2349
      /// that the given \e range \e id currently belongs to.
2310 2350
      Value operator[](const Key& key) const {
2311 2351
        return _inverted(key);
2312 2352
      }
2313 2353

	
2314 2354
      /// \brief Size of the map.
2315 2355
      ///
... ...
@@ -2321,31 +2361,951 @@
2321 2361
    private:
2322 2362
      const RangeIdMap& _inverted;
2323 2363
    };
2324 2364

	
2325 2365
    /// \brief Gives back the inverse of the map.
2326 2366
    ///
2327
    /// Gives back the inverse of the map.
2367
    /// Gives back the inverse of the RangeIdMap.
2328 2368
    const InverseMap inverse() const {
2329 2369
      return InverseMap(*this);
2330 2370
    }
2331 2371
  };
2332 2372

	
2373
  /// \brief Returns a \c RangeIdMap class.
2374
  ///
2375
  /// This function just returns an \c RangeIdMap class.
2376
  /// \relates RangeIdMap
2377
  template <typename K, typename GR>
2378
  inline RangeIdMap<GR, K> rangeIdMap(const GR& graph) {
2379
    return RangeIdMap<GR, K>(graph);
2380
  }
2381

	
2382
  /// \brief Dynamic iterable \c bool map.
2383
  ///
2384
  /// This class provides a special graph map type which can store a
2385
  /// \c bool value for graph items (\c Node, \c Arc or \c Edge).
2386
  /// For both \c true and \c false values it is possible to iterate on
2387
  /// the keys mapped to the value.
2388
  ///
2389
  /// This type is a reference map, so it can be modified with the
2390
  /// subscript operator.
2391
  ///
2392
  /// \tparam GR The graph type.
2393
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2394
  /// \c GR::Edge).
2395
  ///
2396
  /// \see IterableIntMap, IterableValueMap
2397
  /// \see CrossRefMap
2398
  template <typename GR, typename K>
2399
  class IterableBoolMap
2400
    : protected ItemSetTraits<GR, K>::template Map<int>::Type {
2401
  private:
2402
    typedef GR Graph;
2403

	
2404
    typedef typename ItemSetTraits<GR, K>::ItemIt KeyIt;
2405
    typedef typename ItemSetTraits<GR, K>::template Map<int>::Type Parent;
2406

	
2407
    std::vector<K> _array;
2408
    int _sep;
2409

	
2410
  public:
2411

	
2412
    /// Indicates that the map is reference map.
2413
    typedef True ReferenceMapTag;
2414

	
2415
    /// The key type
2416
    typedef K Key;
2417
    /// The value type
2418
    typedef bool Value;
2419
    /// The const reference type.
2420
    typedef const Value& ConstReference;
2421

	
2422
  private:
2423

	
2424
    int position(const Key& key) const {
2425
      return Parent::operator[](key);
2426
    }
2427

	
2428
  public:
2429

	
2430
    /// \brief Reference to the value of the map.
2431
    ///
2432
    /// This class is similar to the \c bool type. It can be converted to
2433
    /// \c bool and it provides the same operators.
2434
    class Reference {
2435
      friend class IterableBoolMap;
2436
    private:
2437
      Reference(IterableBoolMap& map, const Key& key)
2438
        : _key(key), _map(map) {}
2439
    public:
2440

	
2441
      Reference& operator=(const Reference& value) {
2442
        _map.set(_key, static_cast<bool>(value));
2443
         return *this;
2444
      }
2445

	
2446
      operator bool() const {
2447
        return static_cast<const IterableBoolMap&>(_map)[_key];
2448
      }
2449

	
2450
      Reference& operator=(bool value) {
2451
        _map.set(_key, value);
2452
        return *this;
2453
      }
2454
      Reference& operator&=(bool value) {
2455
        _map.set(_key, _map[_key] & value);
2456
        return *this;
2457
      }
2458
      Reference& operator|=(bool value) {
2459
        _map.set(_key, _map[_key] | value);
2460
        return *this;
2461
      }
2462
      Reference& operator^=(bool value) {
2463
        _map.set(_key, _map[_key] ^ value);
2464
        return *this;
2465
      }
2466
    private:
2467
      Key _key;
2468
      IterableBoolMap& _map;
2469
    };
2470

	
2471
    /// \brief Constructor of the map with a default value.
2472
    ///
2473
    /// Constructor of the map with a default value.
2474
    explicit IterableBoolMap(const Graph& graph, bool def = false)
2475
      : Parent(graph) {
2476
      typename Parent::Notifier* nf = Parent::notifier();
2477
      Key it;
2478
      for (nf->first(it); it != INVALID; nf->next(it)) {
2479
        Parent::set(it, _array.size());
2480
        _array.push_back(it);
2481
      }
2482
      _sep = (def ? _array.size() : 0);
2483
    }
2484

	
2485
    /// \brief Const subscript operator of the map.
2486
    ///
2487
    /// Const subscript operator of the map.
2488
    bool operator[](const Key& key) const {
2489
      return position(key) < _sep;
2490
    }
2491

	
2492
    /// \brief Subscript operator of the map.
2493
    ///
2494
    /// Subscript operator of the map.
2495
    Reference operator[](const Key& key) {
2496
      return Reference(*this, key);
2497
    }
2498

	
2499
    /// \brief Set operation of the map.
2500
    ///
2501
    /// Set operation of the map.
2502
    void set(const Key& key, bool value) {
2503
      int pos = position(key);
2504
      if (value) {
2505
        if (pos < _sep) return;
2506
        Key tmp = _array[_sep];
2507
        _array[_sep] = key;
2508
        Parent::set(key, _sep);
2509
        _array[pos] = tmp;
2510
        Parent::set(tmp, pos);
2511
        ++_sep;
2512
      } else {
2513
        if (pos >= _sep) return;
2514
        --_sep;
2515
        Key tmp = _array[_sep];
2516
        _array[_sep] = key;
2517
        Parent::set(key, _sep);
2518
        _array[pos] = tmp;
2519
        Parent::set(tmp, pos);
2520
      }
2521
    }
2522

	
2523
    /// \brief Set all items.
2524
    ///
2525
    /// Set all items in the map.
2526
    /// \note Constant time operation.
2527
    void setAll(bool value) {
2528
      _sep = (value ? _array.size() : 0);
2529
    }
2530

	
2531
    /// \brief Returns the number of the keys mapped to \c true.
2532
    ///
2533
    /// Returns the number of the keys mapped to \c true.
2534
    int trueNum() const {
2535
      return _sep;
2536
    }
2537

	
2538
    /// \brief Returns the number of the keys mapped to \c false.
2539
    ///
2540
    /// Returns the number of the keys mapped to \c false.
2541
    int falseNum() const {
2542
      return _array.size() - _sep;
2543
    }
2544

	
2545
    /// \brief Iterator for the keys mapped to \c true.
2546
    ///
2547
    /// Iterator for the keys mapped to \c true. It works
2548
    /// like a graph item iterator, it can be converted to
2549
    /// the key type of the map, incremented with \c ++ operator, and
2550
    /// if the iterator leaves the last valid key, it will be equal to
2551
    /// \c INVALID.
2552
    class TrueIt : public Key {
2553
    public:
2554
      typedef Key Parent;
2555

	
2556
      /// \brief Creates an iterator.
2557
      ///
2558
      /// Creates an iterator. It iterates on the
2559
      /// keys mapped to \c true.
2560
      /// \param map The IterableBoolMap.
2561
      explicit TrueIt(const IterableBoolMap& map)
2562
        : Parent(map._sep > 0 ? map._array[map._sep - 1] : INVALID),
2563
          _map(&map) {}
2564

	
2565
      /// \brief Invalid constructor \& conversion.
2566
      ///
2567
      /// This constructor initializes the iterator to be invalid.
2568
      /// \sa Invalid for more details.
2569
      TrueIt(Invalid) : Parent(INVALID), _map(0) {}
2570

	
2571
      /// \brief Increment operator.
2572
      ///
2573
      /// Increment operator.
2574
      TrueIt& operator++() {
2575
        int pos = _map->position(*this);
2576
        Parent::operator=(pos > 0 ? _map->_array[pos - 1] : INVALID);
2577
        return *this;
2578
      }
2579

	
2580
    private:
2581
      const IterableBoolMap* _map;
2582
    };
2583

	
2584
    /// \brief Iterator for the keys mapped to \c false.
2585
    ///
2586
    /// Iterator for the keys mapped to \c false. It works
2587
    /// like a graph item iterator, it can be converted to
2588
    /// the key type of the map, incremented with \c ++ operator, and
2589
    /// if the iterator leaves the last valid key, it will be equal to
2590
    /// \c INVALID.
2591
    class FalseIt : public Key {
2592
    public:
2593
      typedef Key Parent;
2594

	
2595
      /// \brief Creates an iterator.
2596
      ///
2597
      /// Creates an iterator. It iterates on the
2598
      /// keys mapped to \c false.
2599
      /// \param map The IterableBoolMap.
2600
      explicit FalseIt(const IterableBoolMap& map)
2601
        : Parent(map._sep < int(map._array.size()) ?
2602
                 map._array.back() : INVALID), _map(&map) {}
2603

	
2604
      /// \brief Invalid constructor \& conversion.
2605
      ///
2606
      /// This constructor initializes the iterator to be invalid.
2607
      /// \sa Invalid for more details.
2608
      FalseIt(Invalid) : Parent(INVALID), _map(0) {}
2609

	
2610
      /// \brief Increment operator.
2611
      ///
2612
      /// Increment operator.
2613
      FalseIt& operator++() {
2614
        int pos = _map->position(*this);
2615
        Parent::operator=(pos > _map->_sep ? _map->_array[pos - 1] : INVALID);
2616
        return *this;
2617
      }
2618

	
2619
    private:
2620
      const IterableBoolMap* _map;
2621
    };
2622

	
2623
    /// \brief Iterator for the keys mapped to a given value.
2624
    ///
2625
    /// Iterator for the keys mapped to a given value. It works
2626
    /// like a graph item iterator, it can be converted to
2627
    /// the key type of the map, incremented with \c ++ operator, and
2628
    /// if the iterator leaves the last valid key, it will be equal to
2629
    /// \c INVALID.
2630
    class ItemIt : public Key {
2631
    public:
2632
      typedef Key Parent;
2633

	
2634
      /// \brief Creates an iterator with a value.
2635
      ///
2636
      /// Creates an iterator with a value. It iterates on the
2637
      /// keys mapped to the given value.
2638
      /// \param map The IterableBoolMap.
2639
      /// \param value The value.
2640
      ItemIt(const IterableBoolMap& map, bool value)
2641
        : Parent(value ?
2642
                 (map._sep > 0 ?
2643
                  map._array[map._sep - 1] : INVALID) :
2644
                 (map._sep < int(map._array.size()) ?
2645
                  map._array.back() : INVALID)), _map(&map) {}
2646

	
2647
      /// \brief Invalid constructor \& conversion.
2648
      ///
2649
      /// This constructor initializes the iterator to be invalid.
2650
      /// \sa Invalid for more details.
2651
      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
2652

	
2653
      /// \brief Increment operator.
2654
      ///
2655
      /// Increment operator.
2656
      ItemIt& operator++() {
2657
        int pos = _map->position(*this);
2658
        int _sep = pos >= _map->_sep ? _map->_sep : 0;
2659
        Parent::operator=(pos > _sep ? _map->_array[pos - 1] : INVALID);
2660
        return *this;
2661
      }
2662

	
2663
    private:
2664
      const IterableBoolMap* _map;
2665
    };
2666

	
2667
  protected:
2668

	
2669
    virtual void add(const Key& key) {
2670
      Parent::add(key);
2671
      Parent::set(key, _array.size());
2672
      _array.push_back(key);
2673
    }
2674

	
2675
    virtual void add(const std::vector<Key>& keys) {
2676
      Parent::add(keys);
2677
      for (int i = 0; i < int(keys.size()); ++i) {
2678
        Parent::set(keys[i], _array.size());
2679
        _array.push_back(keys[i]);
2680
      }
2681
    }
2682

	
2683
    virtual void erase(const Key& key) {
2684
      int pos = position(key);
2685
      if (pos < _sep) {
2686
        --_sep;
2687
        Parent::set(_array[_sep], pos);
2688
        _array[pos] = _array[_sep];
2689
        Parent::set(_array.back(), _sep);
2690
        _array[_sep] = _array.back();
2691
        _array.pop_back();
2692
      } else {
2693
        Parent::set(_array.back(), pos);
2694
        _array[pos] = _array.back();
2695
        _array.pop_back();
2696
      }
2697
      Parent::erase(key);
2698
    }
2699

	
2700
    virtual void erase(const std::vector<Key>& keys) {
2701
      for (int i = 0; i < int(keys.size()); ++i) {
2702
        int pos = position(keys[i]);
2703
        if (pos < _sep) {
2704
          --_sep;
2705
          Parent::set(_array[_sep], pos);
2706
          _array[pos] = _array[_sep];
2707
          Parent::set(_array.back(), _sep);
2708
          _array[_sep] = _array.back();
2709
          _array.pop_back();
2710
        } else {
2711
          Parent::set(_array.back(), pos);
2712
          _array[pos] = _array.back();
2713
          _array.pop_back();
2714
        }
2715
      }
2716
      Parent::erase(keys);
2717
    }
2718

	
2719
    virtual void build() {
2720
      Parent::build();
2721
      typename Parent::Notifier* nf = Parent::notifier();
2722
      Key it;
2723
      for (nf->first(it); it != INVALID; nf->next(it)) {
2724
        Parent::set(it, _array.size());
2725
        _array.push_back(it);
2726
      }
2727
      _sep = 0;
2728
    }
2729

	
2730
    virtual void clear() {
2731
      _array.clear();
2732
      _sep = 0;
2733
      Parent::clear();
2734
    }
2735

	
2736
  };
2737

	
2738

	
2739
  namespace _maps_bits {
2740
    template <typename Item>
2741
    struct IterableIntMapNode {
2742
      IterableIntMapNode() : value(-1) {}
2743
      IterableIntMapNode(int _value) : value(_value) {}
2744
      Item prev, next;
2745
      int value;
2746
    };
2747
  }
2748

	
2749
  /// \brief Dynamic iterable integer map.
2750
  ///
2751
  /// This class provides a special graph map type which can store an
2752
  /// integer value for graph items (\c Node, \c Arc or \c Edge).
2753
  /// For each non-negative value it is possible to iterate on the keys
2754
  /// mapped to the value.
2755
  ///
2756
  /// This map is intended to be used with small integer values, for which
2757
  /// it is efficient, and supports iteration only for non-negative values.
2758
  /// If you need large values and/or iteration for negative integers,
2759
  /// consider to use \ref IterableValueMap instead.
2760
  ///
2761
  /// This type is a reference map, so it can be modified with the
2762
  /// subscript operator.
2763
  ///
2764
  /// \note The size of the data structure depends on the largest
2765
  /// value in the map.
2766
  ///
2767
  /// \tparam GR The graph type.
2768
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2769
  /// \c GR::Edge).
2770
  ///
2771
  /// \see IterableBoolMap, IterableValueMap
2772
  /// \see CrossRefMap
2773
  template <typename GR, typename K>
2774
  class IterableIntMap
2775
    : protected ItemSetTraits<GR, K>::
2776
        template Map<_maps_bits::IterableIntMapNode<K> >::Type {
2777
  public:
2778
    typedef typename ItemSetTraits<GR, K>::
2779
      template Map<_maps_bits::IterableIntMapNode<K> >::Type Parent;
2780

	
2781
    /// The key type
2782
    typedef K Key;
2783
    /// The value type
2784
    typedef int Value;
2785
    /// The graph type
2786
    typedef GR Graph;
2787

	
2788
    /// \brief Constructor of the map.
2789
    ///
2790
    /// Constructor of the map. It sets all values to -1.
2791
    explicit IterableIntMap(const Graph& graph)
2792
      : Parent(graph) {}
2793

	
2794
    /// \brief Constructor of the map with a given value.
2795
    ///
2796
    /// Constructor of the map with a given value.
2797
    explicit IterableIntMap(const Graph& graph, int value)
2798
      : Parent(graph, _maps_bits::IterableIntMapNode<K>(value)) {
2799
      if (value >= 0) {
2800
        for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
2801
          lace(it);
2802
        }
2803
      }
2804
    }
2805

	
2806
  private:
2807

	
2808
    void unlace(const Key& key) {
2809
      typename Parent::Value& node = Parent::operator[](key);
2810
      if (node.value < 0) return;
2811
      if (node.prev != INVALID) {
2812
        Parent::operator[](node.prev).next = node.next;
2813
      } else {
2814
        _first[node.value] = node.next;
2815
      }
2816
      if (node.next != INVALID) {
2817
        Parent::operator[](node.next).prev = node.prev;
2818
      }
2819
      while (!_first.empty() && _first.back() == INVALID) {
2820
        _first.pop_back();
2821
      }
2822
    }
2823

	
2824
    void lace(const Key& key) {
2825
      typename Parent::Value& node = Parent::operator[](key);
2826
      if (node.value < 0) return;
2827
      if (node.value >= int(_first.size())) {
2828
        _first.resize(node.value + 1, INVALID);
2829
      }
2830
      node.prev = INVALID;
2831
      node.next = _first[node.value];
2832
      if (node.next != INVALID) {
2833
        Parent::operator[](node.next).prev = key;
2834
      }
2835
      _first[node.value] = key;
2836
    }
2837

	
2838
  public:
2839

	
2840
    /// Indicates that the map is reference map.
2841
    typedef True ReferenceMapTag;
2842

	
2843
    /// \brief Reference to the value of the map.
2844
    ///
2845
    /// This class is similar to the \c int type. It can
2846
    /// be converted to \c int and it has the same operators.
2847
    class Reference {
2848
      friend class IterableIntMap;
2849
    private:
2850
      Reference(IterableIntMap& map, const Key& key)
2851
        : _key(key), _map(map) {}
2852
    public:
2853

	
2854
      Reference& operator=(const Reference& value) {
2855
        _map.set(_key, static_cast<const int&>(value));
2856
         return *this;
2857
      }
2858

	
2859
      operator const int&() const {
2860
        return static_cast<const IterableIntMap&>(_map)[_key];
2861
      }
2862

	
2863
      Reference& operator=(int value) {
2864
        _map.set(_key, value);
2865
        return *this;
2866
      }
2867
      Reference& operator++() {
2868
        _map.set(_key, _map[_key] + 1);
2869
        return *this;
2870
      }
2871
      int operator++(int) {
2872
        int value = _map[_key];
2873
        _map.set(_key, value + 1);
2874
        return value;
2875
      }
2876
      Reference& operator--() {
2877
        _map.set(_key, _map[_key] - 1);
2878
        return *this;
2879
      }
2880
      int operator--(int) {
2881
        int value = _map[_key];
2882
        _map.set(_key, value - 1);
2883
        return value;
2884
      }
2885
      Reference& operator+=(int value) {
2886
        _map.set(_key, _map[_key] + value);
2887
        return *this;
2888
      }
2889
      Reference& operator-=(int value) {
2890
        _map.set(_key, _map[_key] - value);
2891
        return *this;
2892
      }
2893
      Reference& operator*=(int value) {
2894
        _map.set(_key, _map[_key] * value);
2895
        return *this;
2896
      }
2897
      Reference& operator/=(int value) {
2898
        _map.set(_key, _map[_key] / value);
2899
        return *this;
2900
      }
2901
      Reference& operator%=(int value) {
2902
        _map.set(_key, _map[_key] % value);
2903
        return *this;
2904
      }
2905
      Reference& operator&=(int value) {
2906
        _map.set(_key, _map[_key] & value);
2907
        return *this;
2908
      }
2909
      Reference& operator|=(int value) {
2910
        _map.set(_key, _map[_key] | value);
2911
        return *this;
2912
      }
2913
      Reference& operator^=(int value) {
2914
        _map.set(_key, _map[_key] ^ value);
2915
        return *this;
2916
      }
2917
      Reference& operator<<=(int value) {
2918
        _map.set(_key, _map[_key] << value);
2919
        return *this;
2920
      }
2921
      Reference& operator>>=(int value) {
2922
        _map.set(_key, _map[_key] >> value);
2923
        return *this;
2924
      }
2925

	
2926
    private:
2927
      Key _key;
2928
      IterableIntMap& _map;
2929
    };
2930

	
2931
    /// The const reference type.
2932
    typedef const Value& ConstReference;
2933

	
2934
    /// \brief Gives back the maximal value plus one.
2935
    ///
2936
    /// Gives back the maximal value plus one.
2937
    int size() const {
2938
      return _first.size();
2939
    }
2940

	
2941
    /// \brief Set operation of the map.
2942
    ///
2943
    /// Set operation of the map.
2944
    void set(const Key& key, const Value& value) {
2945
      unlace(key);
2946
      Parent::operator[](key).value = value;
2947
      lace(key);
2948
    }
2949

	
2950
    /// \brief Const subscript operator of the map.
2951
    ///
2952
    /// Const subscript operator of the map.
2953
    const Value& operator[](const Key& key) const {
2954
      return Parent::operator[](key).value;
2955
    }
2956

	
2957
    /// \brief Subscript operator of the map.
2958
    ///
2959
    /// Subscript operator of the map.
2960
    Reference operator[](const Key& key) {
2961
      return Reference(*this, key);
2962
    }
2963

	
2964
    /// \brief Iterator for the keys with the same value.
2965
    ///
2966
    /// Iterator for the keys with the same value. It works
2967
    /// like a graph item iterator, it can be converted to
2968
    /// the item type of the map, incremented with \c ++ operator, and
2969
    /// if the iterator leaves the last valid item, it will be equal to
2970
    /// \c INVALID.
2971
    class ItemIt : public Key {
2972
    public:
2973
      typedef Key Parent;
2974

	
2975
      /// \brief Invalid constructor \& conversion.
2976
      ///
2977
      /// This constructor initializes the iterator to be invalid.
2978
      /// \sa Invalid for more details.
2979
      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
2980

	
2981
      /// \brief Creates an iterator with a value.
2982
      ///
2983
      /// Creates an iterator with a value. It iterates on the
2984
      /// keys mapped to the given value.
2985
      /// \param map The IterableIntMap.
2986
      /// \param value The value.
2987
      ItemIt(const IterableIntMap& map, int value) : _map(&map) {
2988
        if (value < 0 || value >= int(_map->_first.size())) {
2989
          Parent::operator=(INVALID);
2990
        } else {
2991
          Parent::operator=(_map->_first[value]);
2992
        }
2993
      }
2994

	
2995
      /// \brief Increment operator.
2996
      ///
2997
      /// Increment operator.
2998
      ItemIt& operator++() {
2999
        Parent::operator=(_map->IterableIntMap::Parent::
3000
                          operator[](static_cast<Parent&>(*this)).next);
3001
        return *this;
3002
      }
3003

	
3004
    private:
3005
      const IterableIntMap* _map;
3006
    };
3007

	
3008
  protected:
3009

	
3010
    virtual void erase(const Key& key) {
3011
      unlace(key);
3012
      Parent::erase(key);
3013
    }
3014

	
3015
    virtual void erase(const std::vector<Key>& keys) {
3016
      for (int i = 0; i < int(keys.size()); ++i) {
3017
        unlace(keys[i]);
3018
      }
3019
      Parent::erase(keys);
3020
    }
3021

	
3022
    virtual void clear() {
3023
      _first.clear();
3024
      Parent::clear();
3025
    }
3026

	
3027
  private:
3028
    std::vector<Key> _first;
3029
  };
3030

	
3031
  namespace _maps_bits {
3032
    template <typename Item, typename Value>
3033
    struct IterableValueMapNode {
3034
      IterableValueMapNode(Value _value = Value()) : value(_value) {}
3035
      Item prev, next;
3036
      Value value;
3037
    };
3038
  }
3039

	
3040
  /// \brief Dynamic iterable map for comparable values.
3041
  ///
3042
  /// This class provides a special graph map type which can store a
3043
  /// comparable value for graph items (\c Node, \c Arc or \c Edge).
3044
  /// For each value it is possible to iterate on the keys mapped to
3045
  /// the value (\c ItemIt), and the values of the map can be accessed
3046
  /// with an STL compatible forward iterator (\c ValueIt).
3047
  /// The map stores a linked list for each value, which contains
3048
  /// the items mapped to the value, and the used values are stored
3049
  /// in balanced binary tree (\c std::map).
3050
  ///
3051
  /// \ref IterableBoolMap and \ref IterableIntMap are similar classes
3052
  /// specialized for \c bool and \c int values, respectively.
3053
  ///
3054
  /// This type is not reference map, so it cannot be modified with
3055
  /// the subscript operator.
3056
  ///
3057
  /// \tparam GR The graph type.
3058
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
3059
  /// \c GR::Edge).
3060
  /// \tparam V The value type of the map. It can be any comparable
3061
  /// value type.
3062
  ///
3063
  /// \see IterableBoolMap, IterableIntMap
3064
  /// \see CrossRefMap
3065
  template <typename GR, typename K, typename V>
3066
  class IterableValueMap
3067
    : protected ItemSetTraits<GR, K>::
3068
        template Map<_maps_bits::IterableValueMapNode<K, V> >::Type {
3069
  public:
3070
    typedef typename ItemSetTraits<GR, K>::
3071
      template Map<_maps_bits::IterableValueMapNode<K, V> >::Type Parent;
3072

	
3073
    /// The key type
3074
    typedef K Key;
3075
    /// The value type
3076
    typedef V Value;
3077
    /// The graph type
3078
    typedef GR Graph;
3079

	
3080
  public:
3081

	
3082
    /// \brief Constructor of the map with a given value.
3083
    ///
3084
    /// Constructor of the map with a given value.
3085
    explicit IterableValueMap(const Graph& graph,
3086
                              const Value& value = Value())
3087
      : Parent(graph, _maps_bits::IterableValueMapNode<K, V>(value)) {
3088
      for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
3089
        lace(it);
3090
      }
3091
    }
3092

	
3093
  protected:
3094

	
3095
    void unlace(const Key& key) {
3096
      typename Parent::Value& node = Parent::operator[](key);
3097
      if (node.prev != INVALID) {
3098
        Parent::operator[](node.prev).next = node.next;
3099
      } else {
3100
        if (node.next != INVALID) {
3101
          _first[node.value] = node.next;
3102
        } else {
3103
          _first.erase(node.value);
3104
        }
3105
      }
3106
      if (node.next != INVALID) {
3107
        Parent::operator[](node.next).prev = node.prev;
3108
      }
3109
    }
3110

	
3111
    void lace(const Key& key) {
3112
      typename Parent::Value& node = Parent::operator[](key);
3113
      typename std::map<Value, Key>::iterator it = _first.find(node.value);
3114
      if (it == _first.end()) {
3115
        node.prev = node.next = INVALID;
3116
        _first.insert(std::make_pair(node.value, key));
3117
      } else {
3118
        node.prev = INVALID;
3119
        node.next = it->second;
3120
        if (node.next != INVALID) {
3121
          Parent::operator[](node.next).prev = key;
3122
        }
3123
        it->second = key;
3124
      }
3125
    }
3126

	
3127
  public:
3128

	
3129
    /// \brief Forward iterator for values.
3130
    ///
3131
    /// This iterator is an STL compatible forward
3132
    /// iterator on the values of the map. The values can
3133
    /// be accessed in the <tt>[beginValue, endValue)</tt> range.
3134
    class ValueIt
3135
      : public std::iterator<std::forward_iterator_tag, Value> {
3136
      friend class IterableValueMap;
3137
    private:
3138
      ValueIt(typename std::map<Value, Key>::const_iterator _it)
3139
        : it(_it) {}
3140
    public:
3141

	
3142
      /// Constructor
3143
      ValueIt() {}
3144

	
3145
      /// \e
3146
      ValueIt& operator++() { ++it; return *this; }
3147
      /// \e
3148
      ValueIt operator++(int) {
3149
        ValueIt tmp(*this);
3150
        operator++();
3151
        return tmp;
3152
      }
3153

	
3154
      /// \e
3155
      const Value& operator*() const { return it->first; }
3156
      /// \e
3157
      const Value* operator->() const { return &(it->first); }
3158

	
3159
      /// \e
3160
      bool operator==(ValueIt jt) const { return it == jt.it; }
3161
      /// \e
3162
      bool operator!=(ValueIt jt) const { return it != jt.it; }
3163

	
3164
    private:
3165
      typename std::map<Value, Key>::const_iterator it;
3166
    };
3167

	
3168
    /// \brief Returns an iterator to the first value.
3169
    ///
3170
    /// Returns an STL compatible iterator to the
3171
    /// first value of the map. The values of the
3172
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
3173
    /// range.
3174
    ValueIt beginValue() const {
3175
      return ValueIt(_first.begin());
3176
    }
3177

	
3178
    /// \brief Returns an iterator after the last value.
3179
    ///
3180
    /// Returns an STL compatible iterator after the
3181
    /// last value of the map. The values of the
3182
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
3183
    /// range.
3184
    ValueIt endValue() const {
3185
      return ValueIt(_first.end());
3186
    }
3187

	
3188
    /// \brief Set operation of the map.
3189
    ///
3190
    /// Set operation of the map.
3191
    void set(const Key& key, const Value& value) {
3192
      unlace(key);
3193
      Parent::operator[](key).value = value;
3194
      lace(key);
3195
    }
3196

	
3197
    /// \brief Const subscript operator of the map.
3198
    ///
3199
    /// Const subscript operator of the map.
3200
    const Value& operator[](const Key& key) const {
3201
      return Parent::operator[](key).value;
3202
    }
3203

	
3204
    /// \brief Iterator for the keys with the same value.
3205
    ///
3206
    /// Iterator for the keys with the same value. It works
3207
    /// like a graph item iterator, it can be converted to
3208
    /// the item type of the map, incremented with \c ++ operator, and
3209
    /// if the iterator leaves the last valid item, it will be equal to
3210
    /// \c INVALID.
3211
    class ItemIt : public Key {
3212
    public:
3213
      typedef Key Parent;
3214

	
3215
      /// \brief Invalid constructor \& conversion.
3216
      ///
3217
      /// This constructor initializes the iterator to be invalid.
3218
      /// \sa Invalid for more details.
3219
      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
3220

	
3221
      /// \brief Creates an iterator with a value.
3222
      ///
3223
      /// Creates an iterator with a value. It iterates on the
3224
      /// keys which have the given value.
3225
      /// \param map The IterableValueMap
3226
      /// \param value The value
3227
      ItemIt(const IterableValueMap& map, const Value& value) : _map(&map) {
3228
        typename std::map<Value, Key>::const_iterator it =
3229
          map._first.find(value);
3230
        if (it == map._first.end()) {
3231
          Parent::operator=(INVALID);
3232
        } else {
3233
          Parent::operator=(it->second);
3234
        }
3235
      }
3236

	
3237
      /// \brief Increment operator.
3238
      ///
3239
      /// Increment Operator.
3240
      ItemIt& operator++() {
3241
        Parent::operator=(_map->IterableValueMap::Parent::
3242
                          operator[](static_cast<Parent&>(*this)).next);
3243
        return *this;
3244
      }
3245

	
3246

	
3247
    private:
3248
      const IterableValueMap* _map;
3249
    };
3250

	
3251
  protected:
3252

	
3253
    virtual void add(const Key& key) {
3254
      Parent::add(key);
3255
      lace(key);
3256
    }
3257

	
3258
    virtual void add(const std::vector<Key>& keys) {
3259
      Parent::add(keys);
3260
      for (int i = 0; i < int(keys.size()); ++i) {
3261
        lace(keys[i]);
3262
      }
3263
    }
3264

	
3265
    virtual void erase(const Key& key) {
3266
      unlace(key);
3267
      Parent::erase(key);
3268
    }
3269

	
3270
    virtual void erase(const std::vector<Key>& keys) {
3271
      for (int i = 0; i < int(keys.size()); ++i) {
3272
        unlace(keys[i]);
3273
      }
3274
      Parent::erase(keys);
3275
    }
3276

	
3277
    virtual void build() {
3278
      Parent::build();
3279
      for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
3280
        lace(it);
3281
      }
3282
    }
3283

	
3284
    virtual void clear() {
3285
      _first.clear();
3286
      Parent::clear();
3287
    }
3288

	
3289
  private:
3290
    std::map<Value, Key> _first;
3291
  };
3292

	
2333 3293
  /// \brief Map of the source nodes of arcs in a digraph.
2334 3294
  ///
2335 3295
  /// SourceMap provides access for the source node of each arc in a digraph,
2336 3296
  /// which is returned by the \c source() function of the digraph.
2337 3297
  /// \tparam GR The digraph type.
2338 3298
  /// \see TargetMap
2339 3299
  template <typename GR>
2340 3300
  class SourceMap {
2341 3301
  public:
2342 3302

	
2343
    ///\e
3303
    /// The key type (the \c Arc type of the digraph).
2344 3304
    typedef typename GR::Arc Key;
2345
    ///\e
3305
    /// The value type (the \c Node type of the digraph).
2346 3306
    typedef typename GR::Node Value;
2347 3307

	
2348 3308
    /// \brief Constructor
2349 3309
    ///
2350 3310
    /// Constructor.
2351 3311
    /// \param digraph The digraph that the map belongs to.
... ...
@@ -2378,15 +3338,15 @@
2378 3338
  /// \tparam GR The digraph type.
2379 3339
  /// \see SourceMap
2380 3340
  template <typename GR>
2381 3341
  class TargetMap {
2382 3342
  public:
2383 3343

	
2384
    ///\e
3344
    /// The key type (the \c Arc type of the digraph).
2385 3345
    typedef typename GR::Arc Key;
2386
    ///\e
3346
    /// The value type (the \c Node type of the digraph).
2387 3347
    typedef typename GR::Node Value;
2388 3348

	
2389 3349
    /// \brief Constructor
2390 3350
    ///
2391 3351
    /// Constructor.
2392 3352
    /// \param digraph The digraph that the map belongs to.
... ...
@@ -2420,14 +3380,16 @@
2420 3380
  /// \tparam GR The graph type.
2421 3381
  /// \see BackwardMap
2422 3382
  template <typename GR>
2423 3383
  class ForwardMap {
2424 3384
  public:
2425 3385

	
3386
    /// The key type (the \c Edge type of the digraph).
3387
    typedef typename GR::Edge Key;
3388
    /// The value type (the \c Arc type of the digraph).
2426 3389
    typedef typename GR::Arc Value;
2427
    typedef typename GR::Edge Key;
2428 3390

	
2429 3391
    /// \brief Constructor
2430 3392
    ///
2431 3393
    /// Constructor.
2432 3394
    /// \param graph The graph that the map belongs to.
2433 3395
    explicit ForwardMap(const GR& graph) : _graph(graph) {}
... ...
@@ -2460,14 +3422,16 @@
2460 3422
  /// \tparam GR The graph type.
2461 3423
  /// \see ForwardMap
2462 3424
  template <typename GR>
2463 3425
  class BackwardMap {
2464 3426
  public:
2465 3427

	
3428
    /// The key type (the \c Edge type of the digraph).
3429
    typedef typename GR::Edge Key;
3430
    /// The value type (the \c Arc type of the digraph).
2466 3431
    typedef typename GR::Arc Value;
2467
    typedef typename GR::Edge Key;
2468 3432

	
2469 3433
    /// \brief Constructor
2470 3434
    ///
2471 3435
    /// Constructor.
2472 3436
    /// \param graph The graph that the map belongs to.
2473 3437
    explicit BackwardMap(const GR& graph) : _graph(graph) {}
... ...
@@ -2496,29 +3460,29 @@
2496 3460
  ///
2497 3461
  /// This map returns the in-degree of a node. Once it is constructed,
2498 3462
  /// the degrees are stored in a standard \c NodeMap, so each query is done
2499 3463
  /// in constant time. On the other hand, the values are updated automatically
2500 3464
  /// whenever the digraph changes.
2501 3465
  ///
2502
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
3466
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure
2503 3467
  /// may provide alternative ways to modify the digraph.
2504 3468
  /// The correct behavior of InDegMap is not guarantied if these additional
2505
  /// features are used. For example the functions
3469
  /// features are used. For example, the functions
2506 3470
  /// \ref ListDigraph::changeSource() "changeSource()",
2507 3471
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
2508 3472
  /// \ref ListDigraph::reverseArc() "reverseArc()"
2509 3473
  /// of \ref ListDigraph will \e not update the degree values correctly.
2510 3474
  ///
2511 3475
  /// \sa OutDegMap
2512 3476
  template <typename GR>
2513 3477
  class InDegMap
2514 3478
    : protected ItemSetTraits<GR, typename GR::Arc>
2515 3479
      ::ItemNotifier::ObserverBase {
2516 3480

	
2517 3481
  public:
2518
    
3482

	
2519 3483
    /// The graph type of InDegMap
2520 3484
    typedef GR Graph;
2521 3485
    typedef GR Digraph;
2522 3486
    /// The key type
2523 3487
    typedef typename Digraph::Node Key;
2524 3488
    /// The value type
... ...
@@ -2626,16 +3590,16 @@
2626 3590
  ///
2627 3591
  /// This map returns the out-degree of a node. Once it is constructed,
2628 3592
  /// the degrees are stored in a standard \c NodeMap, so each query is done
2629 3593
  /// in constant time. On the other hand, the values are updated automatically
2630 3594
  /// whenever the digraph changes.
2631 3595
  ///
2632
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
3596
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure
2633 3597
  /// may provide alternative ways to modify the digraph.
2634 3598
  /// The correct behavior of OutDegMap is not guarantied if these additional
2635
  /// features are used. For example the functions
3599
  /// features are used. For example, the functions
2636 3600
  /// \ref ListDigraph::changeSource() "changeSource()",
2637 3601
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
2638 3602
  /// \ref ListDigraph::reverseArc() "reverseArc()"
2639 3603
  /// of \ref ListDigraph will \e not update the degree values correctly.
2640 3604
  ///
2641 3605
  /// \sa InDegMap
... ...
@@ -2797,10 +3761,297 @@
2797 3761
  template <typename GR, typename POT>
2798 3762
  PotentialDifferenceMap<GR, POT>
2799 3763
  potentialDifferenceMap(const GR& gr, const POT& potential) {
2800 3764
    return PotentialDifferenceMap<GR, POT>(gr, potential);
2801 3765
  }
2802 3766

	
3767

	
3768
  /// \brief Copy the values of a graph map to another map.
3769
  ///
3770
  /// This function copies the values of a graph map to another graph map.
3771
  /// \c To::Key must be equal or convertible to \c From::Key and
3772
  /// \c From::Value must be equal or convertible to \c To::Value.
3773
  ///
3774
  /// For example, an edge map of \c int value type can be copied to
3775
  /// an arc map of \c double value type in an undirected graph, but
3776
  /// an arc map cannot be copied to an edge map.
3777
  /// Note that even a \ref ConstMap can be copied to a standard graph map,
3778
  /// but \ref mapFill() can also be used for this purpose.
3779
  ///
3780
  /// \param gr The graph for which the maps are defined.
3781
  /// \param from The map from which the values have to be copied.
3782
  /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
3783
  /// \param to The map to which the values have to be copied.
3784
  /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
3785
  template <typename GR, typename From, typename To>
3786
  void mapCopy(const GR& gr, const From& from, To& to) {
3787
    typedef typename To::Key Item;
3788
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3789

	
3790
    for (ItemIt it(gr); it != INVALID; ++it) {
3791
      to.set(it, from[it]);
3792
    }
3793
  }
3794

	
3795
  /// \brief Compare two graph maps.
3796
  ///
3797
  /// This function compares the values of two graph maps. It returns
3798
  /// \c true if the maps assign the same value for all items in the graph.
3799
  /// The \c Key type of the maps (\c Node, \c Arc or \c Edge) must be equal
3800
  /// and their \c Value types must be comparable using \c %operator==().
3801
  ///
3802
  /// \param gr The graph for which the maps are defined.
3803
  /// \param map1 The first map.
3804
  /// \param map2 The second map.
3805
  template <typename GR, typename Map1, typename Map2>
3806
  bool mapCompare(const GR& gr, const Map1& map1, const Map2& map2) {
3807
    typedef typename Map2::Key Item;
3808
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3809

	
3810
    for (ItemIt it(gr); it != INVALID; ++it) {
3811
      if (!(map1[it] == map2[it])) return false;
3812
    }
3813
    return true;
3814
  }
3815

	
3816
  /// \brief Return an item having minimum value of a graph map.
3817
  ///
3818
  /// This function returns an item (\c Node, \c Arc or \c Edge) having
3819
  /// minimum value of the given graph map.
3820
  /// If the item set is empty, it returns \c INVALID.
3821
  ///
3822
  /// \param gr The graph for which the map is defined.
3823
  /// \param map The graph map.
3824
  template <typename GR, typename Map>
3825
  typename Map::Key mapMin(const GR& gr, const Map& map) {
3826
    return mapMin(gr, map, std::less<typename Map::Value>());
3827
  }
3828

	
3829
  /// \brief Return an item having minimum value of a graph map.
3830
  ///
3831
  /// This function returns an item (\c Node, \c Arc or \c Edge) having
3832
  /// minimum value of the given graph map.
3833
  /// If the item set is empty, it returns \c INVALID.
3834
  ///
3835
  /// \param gr The graph for which the map is defined.
3836
  /// \param map The graph map.
3837
  /// \param comp Comparison function object.
3838
  template <typename GR, typename Map, typename Comp>
3839
  typename Map::Key mapMin(const GR& gr, const Map& map, const Comp& comp) {
3840
    typedef typename Map::Key Item;
3841
    typedef typename Map::Value Value;
3842
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3843

	
3844
    ItemIt min_item(gr);
3845
    if (min_item == INVALID) return INVALID;
3846
    Value min = map[min_item];
3847
    for (ItemIt it(gr); it != INVALID; ++it) {
3848
      if (comp(map[it], min)) {
3849
        min = map[it];
3850
        min_item = it;
3851
      }
3852
    }
3853
    return min_item;
3854
  }
3855

	
3856
  /// \brief Return an item having maximum value of a graph map.
3857
  ///
3858
  /// This function returns an item (\c Node, \c Arc or \c Edge) having
3859
  /// maximum value of the given graph map.
3860
  /// If the item set is empty, it returns \c INVALID.
3861
  ///
3862
  /// \param gr The graph for which the map is defined.
3863
  /// \param map The graph map.
3864
  template <typename GR, typename Map>
3865
  typename Map::Key mapMax(const GR& gr, const Map& map) {
3866
    return mapMax(gr, map, std::less<typename Map::Value>());
3867
  }
3868

	
3869
  /// \brief Return an item having maximum value of a graph map.
3870
  ///
3871
  /// This function returns an item (\c Node, \c Arc or \c Edge) having
3872
  /// maximum value of the given graph map.
3873
  /// If the item set is empty, it returns \c INVALID.
3874
  ///
3875
  /// \param gr The graph for which the map is defined.
3876
  /// \param map The graph map.
3877
  /// \param comp Comparison function object.
3878
  template <typename GR, typename Map, typename Comp>
3879
  typename Map::Key mapMax(const GR& gr, const Map& map, const Comp& comp) {
3880
    typedef typename Map::Key Item;
3881
    typedef typename Map::Value Value;
3882
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3883

	
3884
    ItemIt max_item(gr);
3885
    if (max_item == INVALID) return INVALID;
3886
    Value max = map[max_item];
3887
    for (ItemIt it(gr); it != INVALID; ++it) {
3888
      if (comp(max, map[it])) {
3889
        max = map[it];
3890
        max_item = it;
3891
      }
3892
    }
3893
    return max_item;
3894
  }
3895

	
3896
  /// \brief Return the minimum value of a graph map.
3897
  ///
3898
  /// This function returns the minimum value of the given graph map.
3899
  /// The corresponding item set of the graph must not be empty.
3900
  ///
3901
  /// \param gr The graph for which the map is defined.
3902
  /// \param map The graph map.
3903
  template <typename GR, typename Map>
3904
  typename Map::Value mapMinValue(const GR& gr, const Map& map) {
3905
    return map[mapMin(gr, map, std::less<typename Map::Value>())];
3906
  }
3907

	
3908
  /// \brief Return the minimum value of a graph map.
3909
  ///
3910
  /// This function returns the minimum value of the given graph map.
3911
  /// The corresponding item set of the graph must not be empty.
3912
  ///
3913
  /// \param gr The graph for which the map is defined.
3914
  /// \param map The graph map.
3915
  /// \param comp Comparison function object.
3916
  template <typename GR, typename Map, typename Comp>
3917
  typename Map::Value
3918
  mapMinValue(const GR& gr, const Map& map, const Comp& comp) {
3919
    return map[mapMin(gr, map, comp)];
3920
  }
3921

	
3922
  /// \brief Return the maximum value of a graph map.
3923
  ///
3924
  /// This function returns the maximum value of the given graph map.
3925
  /// The corresponding item set of the graph must not be empty.
3926
  ///
3927
  /// \param gr The graph for which the map is defined.
3928
  /// \param map The graph map.
3929
  template <typename GR, typename Map>
3930
  typename Map::Value mapMaxValue(const GR& gr, const Map& map) {
3931
    return map[mapMax(gr, map, std::less<typename Map::Value>())];
3932
  }
3933

	
3934
  /// \brief Return the maximum value of a graph map.
3935
  ///
3936
  /// This function returns the maximum value of the given graph map.
3937
  /// The corresponding item set of the graph must not be empty.
3938
  ///
3939
  /// \param gr The graph for which the map is defined.
3940
  /// \param map The graph map.
3941
  /// \param comp Comparison function object.
3942
  template <typename GR, typename Map, typename Comp>
3943
  typename Map::Value
3944
  mapMaxValue(const GR& gr, const Map& map, const Comp& comp) {
3945
    return map[mapMax(gr, map, comp)];
3946
  }
3947

	
3948
  /// \brief Return an item having a specified value in a graph map.
3949
  ///
3950
  /// This function returns an item (\c Node, \c Arc or \c Edge) having
3951
  /// the specified assigned value in the given graph map.
3952
  /// If no such item exists, it returns \c INVALID.
3953
  ///
3954
  /// \param gr The graph for which the map is defined.
3955
  /// \param map The graph map.
3956
  /// \param val The value that have to be found.
3957
  template <typename GR, typename Map>
3958
  typename Map::Key
3959
  mapFind(const GR& gr, const Map& map, const typename Map::Value& val) {
3960
    typedef typename Map::Key Item;
3961
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3962

	
3963
    for (ItemIt it(gr); it != INVALID; ++it) {
3964
      if (map[it] == val) return it;
3965
    }
3966
    return INVALID;
3967
  }
3968

	
3969
  /// \brief Return an item having value for which a certain predicate is
3970
  /// true in a graph map.
3971
  ///
3972
  /// This function returns an item (\c Node, \c Arc or \c Edge) having
3973
  /// such assigned value for which the specified predicate is true
3974
  /// in the given graph map.
3975
  /// If no such item exists, it returns \c INVALID.
3976
  ///
3977
  /// \param gr The graph for which the map is defined.
3978
  /// \param map The graph map.
3979
  /// \param pred The predicate function object.
3980
  template <typename GR, typename Map, typename Pred>
3981
  typename Map::Key
3982
  mapFindIf(const GR& gr, const Map& map, const Pred& pred) {
3983
    typedef typename Map::Key Item;
3984
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3985

	
3986
    for (ItemIt it(gr); it != INVALID; ++it) {
3987
      if (pred(map[it])) return it;
3988
    }
3989
    return INVALID;
3990
  }
3991

	
3992
  /// \brief Return the number of items having a specified value in a
3993
  /// graph map.
3994
  ///
3995
  /// This function returns the number of items (\c Node, \c Arc or \c Edge)
3996
  /// having the specified assigned value in the given graph map.
3997
  ///
3998
  /// \param gr The graph for which the map is defined.
3999
  /// \param map The graph map.
4000
  /// \param val The value that have to be counted.
4001
  template <typename GR, typename Map>
4002
  int mapCount(const GR& gr, const Map& map, const typename Map::Value& val) {
4003
    typedef typename Map::Key Item;
4004
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
4005

	
4006
    int cnt = 0;
4007
    for (ItemIt it(gr); it != INVALID; ++it) {
4008
      if (map[it] == val) ++cnt;
4009
    }
4010
    return cnt;
4011
  }
4012

	
4013
  /// \brief Return the number of items having values for which a certain
4014
  /// predicate is true in a graph map.
4015
  ///
4016
  /// This function returns the number of items (\c Node, \c Arc or \c Edge)
4017
  /// having such assigned values for which the specified predicate is true
4018
  /// in the given graph map.
4019
  ///
4020
  /// \param gr The graph for which the map is defined.
4021
  /// \param map The graph map.
4022
  /// \param pred The predicate function object.
4023
  template <typename GR, typename Map, typename Pred>
4024
  int mapCountIf(const GR& gr, const Map& map, const Pred& pred) {
4025
    typedef typename Map::Key Item;
4026
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
4027

	
4028
    int cnt = 0;
4029
    for (ItemIt it(gr); it != INVALID; ++it) {
4030
      if (pred(map[it])) ++cnt;
4031
    }
4032
    return cnt;
4033
  }
4034

	
4035
  /// \brief Fill a graph map with a certain value.
4036
  ///
4037
  /// This function sets the specified value for all items (\c Node,
4038
  /// \c Arc or \c Edge) in the given graph map.
4039
  ///
4040
  /// \param gr The graph for which the map is defined.
4041
  /// \param map The graph map. It must conform to the
4042
  /// \ref concepts::WriteMap "WriteMap" concept.
4043
  /// \param val The value.
4044
  template <typename GR, typename Map>
4045
  void mapFill(const GR& gr, Map& map, const typename Map::Value& val) {
4046
    typedef typename Map::Key Item;
4047
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
4048

	
4049
    for (ItemIt it(gr); it != INVALID; ++it) {
4050
      map.set(it, val);
4051
    }
4052
  }
4053

	
2803 4054
  /// @}
2804 4055
}
2805 4056

	
2806 4057
#endif // LEMON_MAPS_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -13,24 +13,25 @@
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19
#ifndef LEMON_MAX_MATCHING_H
20
#define LEMON_MAX_MATCHING_H
19
#ifndef LEMON_MATCHING_H
20
#define LEMON_MATCHING_H
21 21

	
22 22
#include <vector>
23 23
#include <queue>
24 24
#include <set>
25 25
#include <limits>
26 26

	
27 27
#include <lemon/core.h>
28 28
#include <lemon/unionfind.h>
29 29
#include <lemon/bin_heap.h>
30 30
#include <lemon/maps.h>
31
#include <lemon/fractional_matching.h>
31 32

	
32 33
///\ingroup matching
33 34
///\file
34 35
///\brief Maximum matching algorithms in general graphs.
35 36

	
36 37
namespace lemon {
... ...
@@ -38,13 +39,13 @@
38 39
  /// \ingroup matching
39 40
  ///
40 41
  /// \brief Maximum cardinality matching in general graphs
41 42
  ///
42 43
  /// This class implements Edmonds' alternating forest matching algorithm
43 44
  /// for finding a maximum cardinality matching in a general undirected graph.
44
  /// It can be started from an arbitrary initial matching 
45
  /// It can be started from an arbitrary initial matching
45 46
  /// (the default is the empty one).
46 47
  ///
47 48
  /// The dual solution of the problem is a map of the nodes to
48 49
  /// \ref MaxMatching::Status "Status", having values \c EVEN (or \c D),
49 50
  /// \c ODD (or \c A) and \c MATCHED (or \c C) defining the Gallai-Edmonds
50 51
  /// decomposition of the graph. The nodes in \c EVEN/D induce a subgraph
... ...
@@ -66,17 +67,17 @@
66 67
    /// The type of the matching map
67 68
    typedef typename Graph::template NodeMap<typename Graph::Arc>
68 69
    MatchingMap;
69 70

	
70 71
    ///\brief Status constants for Gallai-Edmonds decomposition.
71 72
    ///
72
    ///These constants are used for indicating the Gallai-Edmonds 
73
    ///These constants are used for indicating the Gallai-Edmonds
73 74
    ///decomposition of a graph. The nodes with status \c EVEN (or \c D)
74 75
    ///induce a subgraph with factor-critical components, the nodes with
75 76
    ///status \c ODD (or \c A) form the canonical barrier, and the nodes
76
    ///with status \c MATCHED (or \c C) induce a subgraph having a 
77
    ///with status \c MATCHED (or \c C) induce a subgraph having a
77 78
    ///perfect matching.
78 79
    enum Status {
79 80
      EVEN = 1,       ///< = 1. (\c D is an alias for \c EVEN.)
80 81
      D = 1,
81 82
      MATCHED = 0,    ///< = 0. (\c C is an alias for \c MATCHED.)
82 83
      C = 0,
... ...
@@ -509,13 +510,13 @@
509 510
          (*_status)[n] = EVEN;
510 511
          processSparse(n);
511 512
        }
512 513
      }
513 514
    }
514 515

	
515
    /// \brief Start Edmonds' algorithm with a heuristic improvement 
516
    /// \brief Start Edmonds' algorithm with a heuristic improvement
516 517
    /// for dense graphs
517 518
    ///
518 519
    /// This function runs Edmonds' algorithm with a heuristic of postponing
519 520
    /// shrinks, therefore resulting in a faster algorithm for dense graphs.
520 521
    ///
521 522
    /// \pre \ref init(), \ref greedyInit() or \ref matchingInit() must be
... ...
@@ -531,14 +532,14 @@
531 532
      }
532 533
    }
533 534

	
534 535

	
535 536
    /// \brief Run Edmonds' algorithm
536 537
    ///
537
    /// This function runs Edmonds' algorithm. An additional heuristic of 
538
    /// postponing shrinks is used for relatively dense graphs 
538
    /// This function runs Edmonds' algorithm. An additional heuristic of
539
    /// postponing shrinks is used for relatively dense graphs
539 540
    /// (for which <tt>m>=2*n</tt> holds).
540 541
    void run() {
541 542
      if (countEdges(_graph) < 2 * countNodes(_graph)) {
542 543
        greedyInit();
543 544
        startSparse();
544 545
      } else {
... ...
@@ -553,13 +554,13 @@
553 554
    /// Functions to get the primal solution, i.e. the maximum matching.
554 555

	
555 556
    /// @{
556 557

	
557 558
    /// \brief Return the size (cardinality) of the matching.
558 559
    ///
559
    /// This function returns the size (cardinality) of the current matching. 
560
    /// This function returns the size (cardinality) of the current matching.
560 561
    /// After run() it returns the size of the maximum matching in the graph.
561 562
    int matchingSize() const {
562 563
      int size = 0;
563 564
      for (NodeIt n(_graph); n != INVALID; ++n) {
564 565
        if ((*_matching)[n] != INVALID) {
565 566
          ++size;
... ...
@@ -567,22 +568,22 @@
567 568
      }
568 569
      return size / 2;
569 570
    }
570 571

	
571 572
    /// \brief Return \c true if the given edge is in the matching.
572 573
    ///
573
    /// This function returns \c true if the given edge is in the current 
574
    /// This function returns \c true if the given edge is in the current
574 575
    /// matching.
575 576
    bool matching(const Edge& edge) const {
576 577
      return edge == (*_matching)[_graph.u(edge)];
577 578
    }
578 579

	
579 580
    /// \brief Return the matching arc (or edge) incident to the given node.
580 581
    ///
581 582
    /// This function returns the matching arc (or edge) incident to the
582
    /// given node in the current matching or \c INVALID if the node is 
583
    /// given node in the current matching or \c INVALID if the node is
583 584
    /// not covered by the matching.
584 585
    Arc matching(const Node& n) const {
585 586
      return (*_matching)[n];
586 587
    }
587 588

	
588 589
    /// \brief Return a const reference to the matching map.
... ...
@@ -592,23 +593,23 @@
592 593
    const MatchingMap& matchingMap() const {
593 594
      return *_matching;
594 595
    }
595 596

	
596 597
    /// \brief Return the mate of the given node.
597 598
    ///
598
    /// This function returns the mate of the given node in the current 
599
    /// This function returns the mate of the given node in the current
599 600
    /// matching or \c INVALID if the node is not covered by the matching.
600 601
    Node mate(const Node& n) const {
601 602
      return (*_matching)[n] != INVALID ?
602 603
        _graph.target((*_matching)[n]) : INVALID;
603 604
    }
604 605

	
605 606
    /// @}
606 607

	
607 608
    /// \name Dual Solution
608
    /// Functions to get the dual solution, i.e. the Gallai-Edmonds 
609
    /// Functions to get the dual solution, i.e. the Gallai-Edmonds
609 610
    /// decomposition.
610 611

	
611 612
    /// @{
612 613

	
613 614
    /// \brief Return the status of the given node in the Edmonds-Gallai
614 615
    /// decomposition.
... ...
@@ -645,14 +646,14 @@
645 646
  ///
646 647
  /// This class provides an efficient implementation of Edmond's
647 648
  /// maximum weighted matching algorithm. The implementation is based
648 649
  /// on extensive use of priority queues and provides
649 650
  /// \f$O(nm\log n)\f$ time complexity.
650 651
  ///
651
  /// The maximum weighted matching problem is to find a subset of the 
652
  /// edges in an undirected graph with maximum overall weight for which 
652
  /// The maximum weighted matching problem is to find a subset of the
653
  /// edges in an undirected graph with maximum overall weight for which
653 654
  /// each node has at most one incident edge.
654 655
  /// It can be formulated with the following linear program.
655 656
  /// \f[ \sum_{e \in \delta(u)}x_e \le 1 \quad \forall u\in V\f]
656 657
  /** \f[ \sum_{e \in \gamma(B)}x_e \le \frac{\vert B \vert - 1}{2}
657 658
      \quad \forall B\in\mathcal{O}\f] */
658 659
  /// \f[x_e \ge 0\quad \forall e\in E\f]
... ...
@@ -670,22 +671,22 @@
670 671
      z_B \ge w_{uv} \quad \forall uv\in E\f] */
671 672
  /// \f[y_u \ge 0 \quad \forall u \in V\f]
672 673
  /// \f[z_B \ge 0 \quad \forall B \in \mathcal{O}\f]
673 674
  /** \f[\min \sum_{u \in V}y_u + \sum_{B \in \mathcal{O}}
674 675
      \frac{\vert B \vert - 1}{2}z_B\f] */
675 676
  ///
676
  /// The algorithm can be executed with the run() function. 
677
  /// The algorithm can be executed with the run() function.
677 678
  /// After it the matching (the primal solution) and the dual solution
678
  /// can be obtained using the query functions and the 
679
  /// \ref MaxWeightedMatching::BlossomIt "BlossomIt" nested class, 
680
  /// which is able to iterate on the nodes of a blossom. 
679
  /// can be obtained using the query functions and the
680
  /// \ref MaxWeightedMatching::BlossomIt "BlossomIt" nested class,
681
  /// which is able to iterate on the nodes of a blossom.
681 682
  /// If the value type is integer, then the dual solution is multiplied
682 683
  /// by \ref MaxWeightedMatching::dualScale "4".
683 684
  ///
684 685
  /// \tparam GR The undirected graph type the algorithm runs on.
685
  /// \tparam WM The type edge weight map. The default type is 
686
  /// \tparam WM The type edge weight map. The default type is
686 687
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<int>".
687 688
#ifdef DOXYGEN
688 689
  template <typename GR, typename WM>
689 690
#else
690 691
  template <typename GR,
691 692
            typename WM = typename GR::template EdgeMap<int> >
... ...
@@ -742,13 +743,13 @@
742 743
    int _node_num;
743 744
    int _blossom_num;
744 745

	
745 746
    typedef RangeMap<int> IntIntMap;
746 747

	
747 748
    enum Status {
748
      EVEN = -1, MATCHED = 0, ODD = 1, UNMATCHED = -2
749
      EVEN = -1, MATCHED = 0, ODD = 1
749 750
    };
750 751

	
751 752
    typedef HeapUnionFind<Value, IntNodeMap> BlossomSet;
752 753
    struct BlossomData {
753 754
      int tree;
754 755
      Status status;
... ...
@@ -794,12 +795,16 @@
794 795
    BinHeap<Value, IntEdgeMap> *_delta3;
795 796

	
796 797
    IntIntMap *_delta4_index;
797 798
    BinHeap<Value, IntIntMap> *_delta4;
798 799

	
799 800
    Value _delta_sum;
801
    int _unmatched;
802

	
803
    typedef MaxWeightedFractionalMatching<Graph, WeightMap> FractionalMatching;
804
    FractionalMatching *_fractional;
800 805

	
801 806
    void createStructures() {
802 807
      _node_num = countNodes(_graph);
803 808
      _blossom_num = _node_num * 3 / 2;
804 809

	
805 810
      if (!_matching) {
... ...
@@ -860,15 +865,12 @@
860 865
      } else {
861 866
        _delta4_index->resize(_blossom_num);
862 867
      }
863 868
    }
864 869

	
865 870
    void destroyStructures() {
866
      _node_num = countNodes(_graph);
867
      _blossom_num = _node_num * 3 / 2;
868

	
869 871
      if (_matching) {
870 872
        delete _matching;
871 873
      }
872 874
      if (_node_potential) {
873 875
        delete _node_potential;
874 876
      }
... ...
@@ -938,16 +940,12 @@
938 940
            dualScale * _weight[e];
939 941

	
940 942
          if ((*_blossom_data)[vb].status == EVEN) {
941 943
            if (_delta3->state(e) != _delta3->IN_HEAP && blossom != vb) {
942 944
              _delta3->push(e, rw / 2);
943 945
            }
944
          } else if ((*_blossom_data)[vb].status == UNMATCHED) {
945
            if (_delta3->state(e) != _delta3->IN_HEAP) {
946
              _delta3->push(e, rw);
947
            }
948 946
          } else {
949 947
            typename std::map<int, Arc>::iterator it =
950 948
              (*_node_data)[vi].heap_index.find(tree);
951 949

	
952 950
            if (it != (*_node_data)[vi].heap_index.end()) {
953 951
              if ((*_node_data)[vi].heap[it->second] > rw) {
... ...
@@ -965,313 +963,209 @@
965 963

	
966 964
              if ((*_blossom_data)[vb].status == MATCHED) {
967 965
                if (_delta2->state(vb) != _delta2->IN_HEAP) {
968 966
                  _delta2->push(vb, _blossom_set->classPrio(vb) -
969 967
                               (*_blossom_data)[vb].offset);
970 968
                } else if ((*_delta2)[vb] > _blossom_set->classPrio(vb) -
971
                           (*_blossom_data)[vb].offset){
972
                  _delta2->decrease(vb, _blossom_set->classPrio(vb) -
973
                                   (*_blossom_data)[vb].offset);
974
                }
975
              }
976
            }
977
          }
978
        }
979
      }
980
      (*_blossom_data)[blossom].offset = 0;
981
    }
982

	
983
    void matchedToOdd(int blossom) {
984
      if (_delta2->state(blossom) == _delta2->IN_HEAP) {
985
        _delta2->erase(blossom);
986
      }
987
      (*_blossom_data)[blossom].offset += _delta_sum;
988
      if (!_blossom_set->trivial(blossom)) {
989
        _delta4->push(blossom, (*_blossom_data)[blossom].pot / 2 +
990
                     (*_blossom_data)[blossom].offset);
991
      }
992
    }
993

	
994
    void evenToMatched(int blossom, int tree) {
995
      if (!_blossom_set->trivial(blossom)) {
996
        (*_blossom_data)[blossom].pot += 2 * _delta_sum;
997
      }
998

	
999
      for (typename BlossomSet::ItemIt n(*_blossom_set, blossom);
1000
           n != INVALID; ++n) {
1001
        int ni = (*_node_index)[n];
1002
        (*_node_data)[ni].pot -= _delta_sum;
1003

	
1004
        _delta1->erase(n);
1005

	
1006
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
1007
          Node v = _graph.source(e);
1008
          int vb = _blossom_set->find(v);
1009
          int vi = (*_node_index)[v];
1010

	
1011
          Value rw = (*_node_data)[ni].pot + (*_node_data)[vi].pot -
1012
            dualScale * _weight[e];
1013

	
1014
          if (vb == blossom) {
1015
            if (_delta3->state(e) == _delta3->IN_HEAP) {
1016
              _delta3->erase(e);
1017
            }
1018
          } else if ((*_blossom_data)[vb].status == EVEN) {
1019

	
1020
            if (_delta3->state(e) == _delta3->IN_HEAP) {
1021
              _delta3->erase(e);
1022
            }
1023

	
1024
            int vt = _tree_set->find(vb);
1025

	
1026
            if (vt != tree) {
1027

	
1028
              Arc r = _graph.oppositeArc(e);
1029

	
1030
              typename std::map<int, Arc>::iterator it =
1031
                (*_node_data)[ni].heap_index.find(vt);
1032

	
1033
              if (it != (*_node_data)[ni].heap_index.end()) {
1034
                if ((*_node_data)[ni].heap[it->second] > rw) {
1035
                  (*_node_data)[ni].heap.replace(it->second, r);
1036
                  (*_node_data)[ni].heap.decrease(r, rw);
1037
                  it->second = r;
1038
                }
1039
              } else {
1040
                (*_node_data)[ni].heap.push(r, rw);
1041
                (*_node_data)[ni].heap_index.insert(std::make_pair(vt, r));
1042
              }
1043

	
1044
              if ((*_blossom_set)[n] > (*_node_data)[ni].heap.prio()) {
1045
                _blossom_set->decrease(n, (*_node_data)[ni].heap.prio());
1046

	
1047
                if (_delta2->state(blossom) != _delta2->IN_HEAP) {
1048
                  _delta2->push(blossom, _blossom_set->classPrio(blossom) -
1049
                               (*_blossom_data)[blossom].offset);
1050
                } else if ((*_delta2)[blossom] >
1051
                           _blossom_set->classPrio(blossom) -
1052
                           (*_blossom_data)[blossom].offset){
1053
                  _delta2->decrease(blossom, _blossom_set->classPrio(blossom) -
1054
                                   (*_blossom_data)[blossom].offset);
1055
                }
1056
              }
1057
            }
1058

	
1059
          } else if ((*_blossom_data)[vb].status == UNMATCHED) {
1060
            if (_delta3->state(e) == _delta3->IN_HEAP) {
1061
              _delta3->erase(e);
1062
            }
1063
          } else {
1064

	
1065
            typename std::map<int, Arc>::iterator it =
1066
              (*_node_data)[vi].heap_index.find(tree);
1067

	
1068
            if (it != (*_node_data)[vi].heap_index.end()) {
1069
              (*_node_data)[vi].heap.erase(it->second);
1070
              (*_node_data)[vi].heap_index.erase(it);
1071
              if ((*_node_data)[vi].heap.empty()) {
1072
                _blossom_set->increase(v, std::numeric_limits<Value>::max());
1073
              } else if ((*_blossom_set)[v] < (*_node_data)[vi].heap.prio()) {
1074
                _blossom_set->increase(v, (*_node_data)[vi].heap.prio());
1075
              }
1076

	
1077
              if ((*_blossom_data)[vb].status == MATCHED) {
1078
                if (_blossom_set->classPrio(vb) ==
1079
                    std::numeric_limits<Value>::max()) {
1080
                  _delta2->erase(vb);
1081
                } else if ((*_delta2)[vb] < _blossom_set->classPrio(vb) -
1082
                           (*_blossom_data)[vb].offset) {
1083
                  _delta2->increase(vb, _blossom_set->classPrio(vb) -
1084
                                   (*_blossom_data)[vb].offset);
1085
                }
1086
              }
1087
            }
1088
          }
1089
        }
1090
      }
1091
    }
1092

	
1093
    void oddToMatched(int blossom) {
1094
      (*_blossom_data)[blossom].offset -= _delta_sum;
1095

	
1096
      if (_blossom_set->classPrio(blossom) !=
1097
          std::numeric_limits<Value>::max()) {
1098
        _delta2->push(blossom, _blossom_set->classPrio(blossom) -
1099
                       (*_blossom_data)[blossom].offset);
1100
      }
1101

	
1102
      if (!_blossom_set->trivial(blossom)) {
1103
        _delta4->erase(blossom);
1104
      }
1105
    }
1106

	
1107
    void oddToEven(int blossom, int tree) {
1108
      if (!_blossom_set->trivial(blossom)) {
1109
        _delta4->erase(blossom);
1110
        (*_blossom_data)[blossom].pot -=
1111
          2 * (2 * _delta_sum - (*_blossom_data)[blossom].offset);
1112
      }
1113

	
1114
      for (typename BlossomSet::ItemIt n(*_blossom_set, blossom);
1115
           n != INVALID; ++n) {
1116
        int ni = (*_node_index)[n];
1117

	
1118
        _blossom_set->increase(n, std::numeric_limits<Value>::max());
1119

	
1120
        (*_node_data)[ni].heap.clear();
1121
        (*_node_data)[ni].heap_index.clear();
1122
        (*_node_data)[ni].pot +=
1123
          2 * _delta_sum - (*_blossom_data)[blossom].offset;
1124

	
1125
        _delta1->push(n, (*_node_data)[ni].pot);
1126

	
1127
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
1128
          Node v = _graph.source(e);
1129
          int vb = _blossom_set->find(v);
1130
          int vi = (*_node_index)[v];
1131

	
1132
          Value rw = (*_node_data)[ni].pot + (*_node_data)[vi].pot -
1133
            dualScale * _weight[e];
1134

	
1135
          if ((*_blossom_data)[vb].status == EVEN) {
1136
            if (_delta3->state(e) != _delta3->IN_HEAP && blossom != vb) {
1137
              _delta3->push(e, rw / 2);
1138
            }
1139
          } else if ((*_blossom_data)[vb].status == UNMATCHED) {
1140
            if (_delta3->state(e) != _delta3->IN_HEAP) {
1141
              _delta3->push(e, rw);
1142
            }
1143
          } else {
1144

	
1145
            typename std::map<int, Arc>::iterator it =
1146
              (*_node_data)[vi].heap_index.find(tree);
1147

	
1148
            if (it != (*_node_data)[vi].heap_index.end()) {
1149
              if ((*_node_data)[vi].heap[it->second] > rw) {
1150
                (*_node_data)[vi].heap.replace(it->second, e);
1151
                (*_node_data)[vi].heap.decrease(e, rw);
1152
                it->second = e;
1153
              }
1154
            } else {
1155
              (*_node_data)[vi].heap.push(e, rw);
1156
              (*_node_data)[vi].heap_index.insert(std::make_pair(tree, e));
1157
            }
1158

	
1159
            if ((*_blossom_set)[v] > (*_node_data)[vi].heap.prio()) {
1160
              _blossom_set->decrease(v, (*_node_data)[vi].heap.prio());
1161

	
1162
              if ((*_blossom_data)[vb].status == MATCHED) {
1163
                if (_delta2->state(vb) != _delta2->IN_HEAP) {
1164
                  _delta2->push(vb, _blossom_set->classPrio(vb) -
1165
                               (*_blossom_data)[vb].offset);
1166
                } else if ((*_delta2)[vb] > _blossom_set->classPrio(vb) -
1167 969
                           (*_blossom_data)[vb].offset) {
1168 970
                  _delta2->decrease(vb, _blossom_set->classPrio(vb) -
1169 971
                                   (*_blossom_data)[vb].offset);
1170 972
                }
1171 973
              }
1172 974
            }
1173 975
          }
1174 976
        }
1175 977
      }
1176 978
      (*_blossom_data)[blossom].offset = 0;
1177 979
    }
1178 980

	
1179

	
1180
    void matchedToUnmatched(int blossom) {
981
    void matchedToOdd(int blossom) {
1181 982
      if (_delta2->state(blossom) == _delta2->IN_HEAP) {
1182 983
        _delta2->erase(blossom);
1183 984
      }
985
      (*_blossom_data)[blossom].offset += _delta_sum;
986
      if (!_blossom_set->trivial(blossom)) {
987
        _delta4->push(blossom, (*_blossom_data)[blossom].pot / 2 +
988
                      (*_blossom_data)[blossom].offset);
989
      }
990
    }
991

	
992
    void evenToMatched(int blossom, int tree) {
993
      if (!_blossom_set->trivial(blossom)) {
994
        (*_blossom_data)[blossom].pot += 2 * _delta_sum;
995
      }
1184 996

	
1185 997
      for (typename BlossomSet::ItemIt n(*_blossom_set, blossom);
1186 998
           n != INVALID; ++n) {
1187 999
        int ni = (*_node_index)[n];
1188

	
1189
        _blossom_set->increase(n, std::numeric_limits<Value>::max());
1190

	
1191
        (*_node_data)[ni].heap.clear();
1192
        (*_node_data)[ni].heap_index.clear();
1193

	
1194
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
1195
          Node v = _graph.target(e);
1000
        (*_node_data)[ni].pot -= _delta_sum;
1001

	
1002
        _delta1->erase(n);
1003

	
1004
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
1005
          Node v = _graph.source(e);
1196 1006
          int vb = _blossom_set->find(v);
1197 1007
          int vi = (*_node_index)[v];
1198 1008

	
1199 1009
          Value rw = (*_node_data)[ni].pot + (*_node_data)[vi].pot -
1200 1010
            dualScale * _weight[e];
1201 1011

	
1202
          if ((*_blossom_data)[vb].status == EVEN) {
1203
            if (_delta3->state(e) != _delta3->IN_HEAP) {
1204
              _delta3->push(e, rw);
1012
          if (vb == blossom) {
1013
            if (_delta3->state(e) == _delta3->IN_HEAP) {
1014
              _delta3->erase(e);
1015
            }
1016
          } else if ((*_blossom_data)[vb].status == EVEN) {
1017

	
1018
            if (_delta3->state(e) == _delta3->IN_HEAP) {
1019
              _delta3->erase(e);
1020
            }
1021

	
1022
            int vt = _tree_set->find(vb);
1023

	
1024
            if (vt != tree) {
1025

	
1026
              Arc r = _graph.oppositeArc(e);
1027

	
1028
              typename std::map<int, Arc>::iterator it =
1029
                (*_node_data)[ni].heap_index.find(vt);
1030

	
1031
              if (it != (*_node_data)[ni].heap_index.end()) {
1032
                if ((*_node_data)[ni].heap[it->second] > rw) {
1033
                  (*_node_data)[ni].heap.replace(it->second, r);
1034
                  (*_node_data)[ni].heap.decrease(r, rw);
1035
                  it->second = r;
1036
                }
1037
              } else {
1038
                (*_node_data)[ni].heap.push(r, rw);
1039
                (*_node_data)[ni].heap_index.insert(std::make_pair(vt, r));
1040
              }
1041

	
1042
              if ((*_blossom_set)[n] > (*_node_data)[ni].heap.prio()) {
1043
                _blossom_set->decrease(n, (*_node_data)[ni].heap.prio());
1044

	
1045
                if (_delta2->state(blossom) != _delta2->IN_HEAP) {
1046
                  _delta2->push(blossom, _blossom_set->classPrio(blossom) -
1047
                               (*_blossom_data)[blossom].offset);
1048
                } else if ((*_delta2)[blossom] >
1049
                           _blossom_set->classPrio(blossom) -
1050
                           (*_blossom_data)[blossom].offset){
1051
                  _delta2->decrease(blossom, _blossom_set->classPrio(blossom) -
1052
                                   (*_blossom_data)[blossom].offset);
1053
                }
1054
              }
1055
            }
1056
          } else {
1057

	
1058
            typename std::map<int, Arc>::iterator it =
1059
              (*_node_data)[vi].heap_index.find(tree);
1060

	
1061
            if (it != (*_node_data)[vi].heap_index.end()) {
1062
              (*_node_data)[vi].heap.erase(it->second);
1063
              (*_node_data)[vi].heap_index.erase(it);
1064
              if ((*_node_data)[vi].heap.empty()) {
1065
                _blossom_set->increase(v, std::numeric_limits<Value>::max());
1066
              } else if ((*_blossom_set)[v] < (*_node_data)[vi].heap.prio()) {
1067
                _blossom_set->increase(v, (*_node_data)[vi].heap.prio());
1068
              }
1069

	
1070
              if ((*_blossom_data)[vb].status == MATCHED) {
1071
                if (_blossom_set->classPrio(vb) ==
1072
                    std::numeric_limits<Value>::max()) {
1073
                  _delta2->erase(vb);
1074
                } else if ((*_delta2)[vb] < _blossom_set->classPrio(vb) -
1075
                           (*_blossom_data)[vb].offset) {
1076
                  _delta2->increase(vb, _blossom_set->classPrio(vb) -
1077
                                   (*_blossom_data)[vb].offset);
1078
                }
1079
              }
1205 1080
            }
1206 1081
          }
1207 1082
        }
1208 1083
      }
1209 1084
    }
1210 1085

	
1211
    void unmatchedToMatched(int blossom) {
1086
    void oddToMatched(int blossom) {
1087
      (*_blossom_data)[blossom].offset -= _delta_sum;
1088

	
1089
      if (_blossom_set->classPrio(blossom) !=
1090
          std::numeric_limits<Value>::max()) {
1091
        _delta2->push(blossom, _blossom_set->classPrio(blossom) -
1092
                      (*_blossom_data)[blossom].offset);
1093
      }
1094

	
1095
      if (!_blossom_set->trivial(blossom)) {
1096
        _delta4->erase(blossom);
1097
      }
1098
    }
1099

	
1100
    void oddToEven(int blossom, int tree) {
1101
      if (!_blossom_set->trivial(blossom)) {
1102
        _delta4->erase(blossom);
1103
        (*_blossom_data)[blossom].pot -=
1104
          2 * (2 * _delta_sum - (*_blossom_data)[blossom].offset);
1105
      }
1106

	
1212 1107
      for (typename BlossomSet::ItemIt n(*_blossom_set, blossom);
1213 1108
           n != INVALID; ++n) {
1214 1109
        int ni = (*_node_index)[n];
1215 1110

	
1111
        _blossom_set->increase(n, std::numeric_limits<Value>::max());
1112

	
1113
        (*_node_data)[ni].heap.clear();
1114
        (*_node_data)[ni].heap_index.clear();
1115
        (*_node_data)[ni].pot +=
1116
          2 * _delta_sum - (*_blossom_data)[blossom].offset;
1117

	
1118
        _delta1->push(n, (*_node_data)[ni].pot);
1119

	
1216 1120
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
1217 1121
          Node v = _graph.source(e);
1218 1122
          int vb = _blossom_set->find(v);
1219 1123
          int vi = (*_node_index)[v];
1220 1124

	
1221 1125
          Value rw = (*_node_data)[ni].pot + (*_node_data)[vi].pot -
1222 1126
            dualScale * _weight[e];
1223 1127

	
1224
          if (vb == blossom) {
1225
            if (_delta3->state(e) == _delta3->IN_HEAP) {
1226
              _delta3->erase(e);
1128
          if ((*_blossom_data)[vb].status == EVEN) {
1129
            if (_delta3->state(e) != _delta3->IN_HEAP && blossom != vb) {
1130
              _delta3->push(e, rw / 2);
1227 1131
            }
1228
          } else if ((*_blossom_data)[vb].status == EVEN) {
1229

	
1230
            if (_delta3->state(e) == _delta3->IN_HEAP) {
1231
              _delta3->erase(e);
1232
            }
1233

	
1234
            int vt = _tree_set->find(vb);
1235

	
1236
            Arc r = _graph.oppositeArc(e);
1132
          } else {
1237 1133

	
1238 1134
            typename std::map<int, Arc>::iterator it =
1239
              (*_node_data)[ni].heap_index.find(vt);
1240

	
1241
            if (it != (*_node_data)[ni].heap_index.end()) {
1242
              if ((*_node_data)[ni].heap[it->second] > rw) {
1243
                (*_node_data)[ni].heap.replace(it->second, r);
1244
                (*_node_data)[ni].heap.decrease(r, rw);
1245
                it->second = r;
1135
              (*_node_data)[vi].heap_index.find(tree);
1136

	
1137
            if (it != (*_node_data)[vi].heap_index.end()) {
1138
              if ((*_node_data)[vi].heap[it->second] > rw) {
1139
                (*_node_data)[vi].heap.replace(it->second, e);
1140
                (*_node_data)[vi].heap.decrease(e, rw);
1141
                it->second = e;
1246 1142
              }
1247 1143
            } else {
1248
              (*_node_data)[ni].heap.push(r, rw);
1249
              (*_node_data)[ni].heap_index.insert(std::make_pair(vt, r));
1144
              (*_node_data)[vi].heap.push(e, rw);
1145
              (*_node_data)[vi].heap_index.insert(std::make_pair(tree, e));
1250 1146
            }
1251 1147

	
1252
            if ((*_blossom_set)[n] > (*_node_data)[ni].heap.prio()) {
1253
              _blossom_set->decrease(n, (*_node_data)[ni].heap.prio());
1254

	
1255
              if (_delta2->state(blossom) != _delta2->IN_HEAP) {
1256
                _delta2->push(blossom, _blossom_set->classPrio(blossom) -
1257
                             (*_blossom_data)[blossom].offset);
1258
              } else if ((*_delta2)[blossom] > _blossom_set->classPrio(blossom)-
1259
                         (*_blossom_data)[blossom].offset){
1260
                _delta2->decrease(blossom, _blossom_set->classPrio(blossom) -
1261
                                 (*_blossom_data)[blossom].offset);
1148
            if ((*_blossom_set)[v] > (*_node_data)[vi].heap.prio()) {
1149
              _blossom_set->decrease(v, (*_node_data)[vi].heap.prio());
1150

	
1151
              if ((*_blossom_data)[vb].status == MATCHED) {
1152
                if (_delta2->state(vb) != _delta2->IN_HEAP) {
1153
                  _delta2->push(vb, _blossom_set->classPrio(vb) -
1154
                               (*_blossom_data)[vb].offset);
1155
                } else if ((*_delta2)[vb] > _blossom_set->classPrio(vb) -
1156
                           (*_blossom_data)[vb].offset) {
1157
                  _delta2->decrease(vb, _blossom_set->classPrio(vb) -
1158
                                   (*_blossom_data)[vb].offset);
1159
                }
1262 1160
              }
1263 1161
            }
1264

	
1265
          } else if ((*_blossom_data)[vb].status == UNMATCHED) {
1266
            if (_delta3->state(e) == _delta3->IN_HEAP) {
1267
              _delta3->erase(e);
1268
            }
1269 1162
          }
1270 1163
        }
1271 1164
      }
1165
      (*_blossom_data)[blossom].offset = 0;
1272 1166
    }
1273 1167

	
1274 1168
    void alternatePath(int even, int tree) {
1275 1169
      int odd;
1276 1170

	
1277 1171
      evenToMatched(even, tree);
... ...
@@ -1310,45 +1204,48 @@
1310 1204
      int blossom = _blossom_set->find(node);
1311 1205
      int tree = _tree_set->find(blossom);
1312 1206

	
1313 1207
      alternatePath(blossom, tree);
1314 1208
      destroyTree(tree);
1315 1209

	
1316
      (*_blossom_data)[blossom].status = UNMATCHED;
1317 1210
      (*_blossom_data)[blossom].base = node;
1318
      matchedToUnmatched(blossom);
1211
      (*_blossom_data)[blossom].next = INVALID;
1319 1212
    }
1320 1213

	
1321

	
1322 1214
    void augmentOnEdge(const Edge& edge) {
1323 1215

	
1324 1216
      int left = _blossom_set->find(_graph.u(edge));
1325 1217
      int right = _blossom_set->find(_graph.v(edge));
1326 1218

	
1327
      if ((*_blossom_data)[left].status == EVEN) {
1328
        int left_tree = _tree_set->find(left);
1329
        alternatePath(left, left_tree);
1330
        destroyTree(left_tree);
1331
      } else {
1332
        (*_blossom_data)[left].status = MATCHED;
1333
        unmatchedToMatched(left);
1334
      }
1335

	
1336
      if ((*_blossom_data)[right].status == EVEN) {
1337
        int right_tree = _tree_set->find(right);
1338
        alternatePath(right, right_tree);
1339
        destroyTree(right_tree);
1340
      } else {
1341
        (*_blossom_data)[right].status = MATCHED;
1342
        unmatchedToMatched(right);
1343
      }
1219
      int left_tree = _tree_set->find(left);
1220
      alternatePath(left, left_tree);
1221
      destroyTree(left_tree);
1222

	
1223
      int right_tree = _tree_set->find(right);
1224
      alternatePath(right, right_tree);
1225
      destroyTree(right_tree);
1344 1226

	
1345 1227
      (*_blossom_data)[left].next = _graph.direct(edge, true);
1346 1228
      (*_blossom_data)[right].next = _graph.direct(edge, false);
1347 1229
    }
1348 1230

	
1231
    void augmentOnArc(const Arc& arc) {
1232

	
1233
      int left = _blossom_set->find(_graph.source(arc));
1234
      int right = _blossom_set->find(_graph.target(arc));
1235

	
1236
      (*_blossom_data)[left].status = MATCHED;
1237

	
1238
      int right_tree = _tree_set->find(right);
1239
      alternatePath(right, right_tree);
1240
      destroyTree(right_tree);
1241

	
1242
      (*_blossom_data)[left].next = arc;
1243
      (*_blossom_data)[right].next = _graph.oppositeArc(arc);
1244
    }
1245

	
1349 1246
    void extendOnArc(const Arc& arc) {
1350 1247
      int base = _blossom_set->find(_graph.target(arc));
1351 1248
      int tree = _tree_set->find(base);
1352 1249

	
1353 1250
      int odd = _blossom_set->find(_graph.source(arc));
1354 1251
      _tree_set->insert(odd, tree);
... ...
@@ -1545,13 +1442,13 @@
1545 1442

	
1546 1443
          (*_blossom_data)[sb].status = ODD;
1547 1444
          matchedToOdd(sb);
1548 1445
          _tree_set->insert(sb, tree);
1549 1446
          (*_blossom_data)[sb].pred = pred;
1550 1447
          (*_blossom_data)[sb].next =
1551
                           _graph.oppositeArc((*_blossom_data)[tb].next);
1448
            _graph.oppositeArc((*_blossom_data)[tb].next);
1552 1449

	
1553 1450
          pred = (*_blossom_data)[ub].next;
1554 1451

	
1555 1452
          (*_blossom_data)[tb].status = EVEN;
1556 1453
          matchedToEven(tb, tree);
1557 1454
          _tree_set->insert(tb, tree);
... ...
@@ -1645,13 +1542,13 @@
1645 1542
      std::vector<int> blossoms;
1646 1543
      for (typename BlossomSet::ClassIt c(*_blossom_set); c != INVALID; ++c) {
1647 1544
        blossoms.push_back(c);
1648 1545
      }
1649 1546

	
1650 1547
      for (int i = 0; i < int(blossoms.size()); ++i) {
1651
        if ((*_blossom_data)[blossoms[i]].status == MATCHED) {
1548
        if ((*_blossom_data)[blossoms[i]].next != INVALID) {
1652 1549

	
1653 1550
          Value offset = (*_blossom_data)[blossoms[i]].offset;
1654 1551
          (*_blossom_data)[blossoms[i]].pot += 2 * offset;
1655 1552
          for (typename BlossomSet::ItemIt n(*_blossom_set, blossoms[i]);
1656 1553
               n != INVALID; ++n) {
1657 1554
            (*_node_data)[(*_node_index)[n]].pot -= offset;
... ...
@@ -1683,16 +1580,22 @@
1683 1580

	
1684 1581
        _delta1_index(0), _delta1(0),
1685 1582
        _delta2_index(0), _delta2(0),
1686 1583
        _delta3_index(0), _delta3(0),
1687 1584
        _delta4_index(0), _delta4(0),
1688 1585

	
1689
        _delta_sum() {}
1586
        _delta_sum(), _unmatched(0),
1587

	
1588
        _fractional(0)
1589
    {}
1690 1590

	
1691 1591
    ~MaxWeightedMatching() {
1692 1592
      destroyStructures();
1593
      if (_fractional) {
1594
        delete _fractional;
1595
      }
1693 1596
    }
1694 1597

	
1695 1598
    /// \name Execution Control
1696 1599
    /// The simplest way to execute the algorithm is to use the
1697 1600
    /// \ref run() member function.
1698 1601

	
... ...
@@ -1717,13 +1620,15 @@
1717 1620
        (*_delta3_index)[e] = _delta3->PRE_HEAP;
1718 1621
      }
1719 1622
      for (int i = 0; i < _blossom_num; ++i) {
1720 1623
        (*_delta2_index)[i] = _delta2->PRE_HEAP;
1721 1624
        (*_delta4_index)[i] = _delta4->PRE_HEAP;
1722 1625
      }
1723
      
1626

	
1627
      _unmatched = _node_num;
1628

	
1724 1629
      _delta1->clear();
1725 1630
      _delta2->clear();
1726 1631
      _delta3->clear();
1727 1632
      _delta4->clear();
1728 1633
      _blossom_set->clear();
1729 1634
      _tree_set->clear();
... ...
@@ -1761,88 +1666,229 @@
1761 1666
          _delta3->push(e, ((*_node_data)[si].pot + (*_node_data)[ti].pot -
1762 1667
                            dualScale * _weight[e]) / 2);
1763 1668
        }
1764 1669
      }
1765 1670
    }
1766 1671

	
1672
    /// \brief Initialize the algorithm with fractional matching
1673
    ///
1674
    /// This function initializes the algorithm with a fractional
1675
    /// matching. This initialization is also called jumpstart heuristic.
1676
    void fractionalInit() {
1677
      createStructures();
1678

	
1679
      _blossom_node_list.clear();
1680
      _blossom_potential.clear();
1681

	
1682
      if (_fractional == 0) {
1683
        _fractional = new FractionalMatching(_graph, _weight, false);
1684
      }
1685
      _fractional->run();
1686

	
1687
      for (ArcIt e(_graph); e != INVALID; ++e) {
1688
        (*_node_heap_index)[e] = BinHeap<Value, IntArcMap>::PRE_HEAP;
1689
      }
1690
      for (NodeIt n(_graph); n != INVALID; ++n) {
1691
        (*_delta1_index)[n] = _delta1->PRE_HEAP;
1692
      }
1693
      for (EdgeIt e(_graph); e != INVALID; ++e) {
1694
        (*_delta3_index)[e] = _delta3->PRE_HEAP;
1695
      }
1696
      for (int i = 0; i < _blossom_num; ++i) {
1697
        (*_delta2_index)[i] = _delta2->PRE_HEAP;
1698
        (*_delta4_index)[i] = _delta4->PRE_HEAP;
1699
      }
1700

	
1701
      _unmatched = 0;
1702

	
1703
      _delta1->clear();
1704
      _delta2->clear();
1705
      _delta3->clear();
1706
      _delta4->clear();
1707
      _blossom_set->clear();
1708
      _tree_set->clear();
1709

	
1710
      int index = 0;
1711
      for (NodeIt n(_graph); n != INVALID; ++n) {
1712
        Value pot = _fractional->nodeValue(n);
1713
        (*_node_index)[n] = index;
1714
        (*_node_data)[index].pot = pot;
1715
        (*_node_data)[index].heap_index.clear();
1716
        (*_node_data)[index].heap.clear();
1717
        int blossom =
1718
          _blossom_set->insert(n, std::numeric_limits<Value>::max());
1719

	
1720
        (*_blossom_data)[blossom].status = MATCHED;
1721
        (*_blossom_data)[blossom].pred = INVALID;
1722
        (*_blossom_data)[blossom].next = _fractional->matching(n);
1723
        if (_fractional->matching(n) == INVALID) {
1724
          (*_blossom_data)[blossom].base = n;
1725
        }
1726
        (*_blossom_data)[blossom].pot = 0;
1727
        (*_blossom_data)[blossom].offset = 0;
1728
        ++index;
1729
      }
1730

	
1731
      typename Graph::template NodeMap<bool> processed(_graph, false);
1732
      for (NodeIt n(_graph); n != INVALID; ++n) {
1733
        if (processed[n]) continue;
1734
        processed[n] = true;
1735
        if (_fractional->matching(n) == INVALID) continue;
1736
        int num = 1;
1737
        Node v = _graph.target(_fractional->matching(n));
1738
        while (n != v) {
1739
          processed[v] = true;
1740
          v = _graph.target(_fractional->matching(v));
1741
          ++num;
1742
        }
1743

	
1744
        if (num % 2 == 1) {
1745
          std::vector<int> subblossoms(num);
1746

	
1747
          subblossoms[--num] = _blossom_set->find(n);
1748
          _delta1->push(n, _fractional->nodeValue(n));
1749
          v = _graph.target(_fractional->matching(n));
1750
          while (n != v) {
1751
            subblossoms[--num] = _blossom_set->find(v);
1752
            _delta1->push(v, _fractional->nodeValue(v));
1753
            v = _graph.target(_fractional->matching(v));
1754
          }
1755

	
1756
          int surface =
1757
            _blossom_set->join(subblossoms.begin(), subblossoms.end());
1758
          (*_blossom_data)[surface].status = EVEN;
1759
          (*_blossom_data)[surface].pred = INVALID;
1760
          (*_blossom_data)[surface].next = INVALID;
1761
          (*_blossom_data)[surface].pot = 0;
1762
          (*_blossom_data)[surface].offset = 0;
1763

	
1764
          _tree_set->insert(surface);
1765
          ++_unmatched;
1766
        }
1767
      }
1768

	
1769
      for (EdgeIt e(_graph); e != INVALID; ++e) {
1770
        int si = (*_node_index)[_graph.u(e)];
1771
        int sb = _blossom_set->find(_graph.u(e));
1772
        int ti = (*_node_index)[_graph.v(e)];
1773
        int tb = _blossom_set->find(_graph.v(e));
1774
        if ((*_blossom_data)[sb].status == EVEN &&
1775
            (*_blossom_data)[tb].status == EVEN && sb != tb) {
1776
          _delta3->push(e, ((*_node_data)[si].pot + (*_node_data)[ti].pot -
1777
                            dualScale * _weight[e]) / 2);
1778
        }
1779
      }
1780

	
1781
      for (NodeIt n(_graph); n != INVALID; ++n) {
1782
        int nb = _blossom_set->find(n);
1783
        if ((*_blossom_data)[nb].status != MATCHED) continue;
1784
        int ni = (*_node_index)[n];
1785

	
1786
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
1787
          Node v = _graph.target(e);
1788
          int vb = _blossom_set->find(v);
1789
          int vi = (*_node_index)[v];
1790

	
1791
          Value rw = (*_node_data)[ni].pot + (*_node_data)[vi].pot -
1792
            dualScale * _weight[e];
1793

	
1794
          if ((*_blossom_data)[vb].status == EVEN) {
1795

	
1796
            int vt = _tree_set->find(vb);
1797

	
1798
            typename std::map<int, Arc>::iterator it =
1799
              (*_node_data)[ni].heap_index.find(vt);
1800

	
1801
            if (it != (*_node_data)[ni].heap_index.end()) {
1802
              if ((*_node_data)[ni].heap[it->second] > rw) {
1803
                (*_node_data)[ni].heap.replace(it->second, e);
1804
                (*_node_data)[ni].heap.decrease(e, rw);
1805
                it->second = e;
1806
              }
1807
            } else {
1808
              (*_node_data)[ni].heap.push(e, rw);
1809
              (*_node_data)[ni].heap_index.insert(std::make_pair(vt, e));
1810
            }
1811
          }
1812
        }
1813

	
1814
        if (!(*_node_data)[ni].heap.empty()) {
1815
          _blossom_set->decrease(n, (*_node_data)[ni].heap.prio());
1816
          _delta2->push(nb, _blossom_set->classPrio(nb));
1817
        }
1818
      }
1819
    }
1820

	
1767 1821
    /// \brief Start the algorithm
1768 1822
    ///
1769 1823
    /// This function starts the algorithm.
1770 1824
    ///
1771
    /// \pre \ref init() must be called before using this function.
1825
    /// \pre \ref init() or \ref fractionalInit() must be called
1826
    /// before using this function.
1772 1827
    void start() {
1773 1828
      enum OpType {
1774 1829
        D1, D2, D3, D4
1775 1830
      };
1776 1831

	
1777
      int unmatched = _node_num;
1778
      while (unmatched > 0) {
1832
      while (_unmatched > 0) {
1779 1833
        Value d1 = !_delta1->empty() ?
1780 1834
          _delta1->prio() : std::numeric_limits<Value>::max();
1781 1835

	
1782 1836
        Value d2 = !_delta2->empty() ?
1783 1837
          _delta2->prio() : std::numeric_limits<Value>::max();
1784 1838

	
1785 1839
        Value d3 = !_delta3->empty() ?
1786 1840
          _delta3->prio() : std::numeric_limits<Value>::max();
1787 1841

	
1788 1842
        Value d4 = !_delta4->empty() ?
1789 1843
          _delta4->prio() : std::numeric_limits<Value>::max();
1790 1844

	
1791
        _delta_sum = d1; OpType ot = D1;
1845
        _delta_sum = d3; OpType ot = D3;
1846
        if (d1 < _delta_sum) { _delta_sum = d1; ot = D1; }
1792 1847
        if (d2 < _delta_sum) { _delta_sum = d2; ot = D2; }
1793
        if (d3 < _delta_sum) { _delta_sum = d3; ot = D3; }
1794 1848
        if (d4 < _delta_sum) { _delta_sum = d4; ot = D4; }
1795 1849

	
1796

	
1797 1850
        switch (ot) {
1798 1851
        case D1:
1799 1852
          {
1800 1853
            Node n = _delta1->top();
1801 1854
            unmatchNode(n);
1802
            --unmatched;
1855
            --_unmatched;
1803 1856
          }
1804 1857
          break;
1805 1858
        case D2:
1806 1859
          {
1807 1860
            int blossom = _delta2->top();
1808 1861
            Node n = _blossom_set->classTop(blossom);
1809
            Arc e = (*_node_data)[(*_node_index)[n]].heap.top();
1810
            extendOnArc(e);
1862
            Arc a = (*_node_data)[(*_node_index)[n]].heap.top();
1863
            if ((*_blossom_data)[blossom].next == INVALID) {
1864
              augmentOnArc(a);
1865
              --_unmatched;
1866
            } else {
1867
              extendOnArc(a);
1868
            }
1811 1869
          }
1812 1870
          break;
1813 1871
        case D3:
1814 1872
          {
1815 1873
            Edge e = _delta3->top();
1816 1874

	
1817 1875
            int left_blossom = _blossom_set->find(_graph.u(e));
1818 1876
            int right_blossom = _blossom_set->find(_graph.v(e));
1819 1877

	
1820 1878
            if (left_blossom == right_blossom) {
1821 1879
              _delta3->pop();
1822 1880
            } else {
1823
              int left_tree;
1824
              if ((*_blossom_data)[left_blossom].status == EVEN) {
1825
                left_tree = _tree_set->find(left_blossom);
1826
              } else {
1827
                left_tree = -1;
1828
                ++unmatched;
1829
              }
1830
              int right_tree;
1831
              if ((*_blossom_data)[right_blossom].status == EVEN) {
1832
                right_tree = _tree_set->find(right_blossom);
1833
              } else {
1834
                right_tree = -1;
1835
                ++unmatched;
1836
              }
1881
              int left_tree = _tree_set->find(left_blossom);
1882
              int right_tree = _tree_set->find(right_blossom);
1837 1883

	
1838 1884
              if (left_tree == right_tree) {
1839 1885
                shrinkOnEdge(e, left_tree);
1840 1886
              } else {
1841 1887
                augmentOnEdge(e);
1842
                unmatched -= 2;
1888
                _unmatched -= 2;
1843 1889
              }
1844 1890
            }
1845 1891
          } break;
1846 1892
        case D4:
1847 1893
          splitBlossom(_delta4->top());
1848 1894
          break;
... ...
@@ -1854,24 +1900,24 @@
1854 1900
    /// \brief Run the algorithm.
1855 1901
    ///
1856 1902
    /// This method runs the \c %MaxWeightedMatching algorithm.
1857 1903
    ///
1858 1904
    /// \note mwm.run() is just a shortcut of the following code.
1859 1905
    /// \code
1860
    ///   mwm.init();
1906
    ///   mwm.fractionalInit();
1861 1907
    ///   mwm.start();
1862 1908
    /// \endcode
1863 1909
    void run() {
1864
      init();
1910
      fractionalInit();
1865 1911
      start();
1866 1912
    }
1867 1913

	
1868 1914
    /// @}
1869 1915

	
1870 1916
    /// \name Primal Solution
1871
    /// Functions to get the primal solution, i.e. the maximum weighted 
1917
    /// Functions to get the primal solution, i.e. the maximum weighted
1872 1918
    /// matching.\n
1873 1919
    /// Either \ref run() or \ref start() function should be called before
1874 1920
    /// using them.
1875 1921

	
1876 1922
    /// @{
1877 1923

	
... ...
@@ -1884,13 +1930,13 @@
1884 1930
      Value sum = 0;
1885 1931
      for (NodeIt n(_graph); n != INVALID; ++n) {
1886 1932
        if ((*_matching)[n] != INVALID) {
1887 1933
          sum += _weight[(*_matching)[n]];
1888 1934
        }
1889 1935
      }
1890
      return sum /= 2;
1936
      return sum / 2;
1891 1937
    }
1892 1938

	
1893 1939
    /// \brief Return the size (cardinality) of the matching.
1894 1940
    ///
1895 1941
    /// This function returns the size (cardinality) of the found matching.
1896 1942
    ///
... ...
@@ -1904,24 +1950,24 @@
1904 1950
      }
1905 1951
      return num /= 2;
1906 1952
    }
1907 1953

	
1908 1954
    /// \brief Return \c true if the given edge is in the matching.
1909 1955
    ///
1910
    /// This function returns \c true if the given edge is in the found 
1956
    /// This function returns \c true if the given edge is in the found
1911 1957
    /// matching.
1912 1958
    ///
1913 1959
    /// \pre Either run() or start() must be called before using this function.
1914 1960
    bool matching(const Edge& edge) const {
1915 1961
      return edge == (*_matching)[_graph.u(edge)];
1916 1962
    }
1917 1963

	
1918 1964
    /// \brief Return the matching arc (or edge) incident to the given node.
1919 1965
    ///
1920 1966
    /// This function returns the matching arc (or edge) incident to the
1921
    /// given node in the found matching or \c INVALID if the node is 
1967
    /// given node in the found matching or \c INVALID if the node is
1922 1968
    /// not covered by the matching.
1923 1969
    ///
1924 1970
    /// \pre Either run() or start() must be called before using this function.
1925 1971
    Arc matching(const Node& node) const {
1926 1972
      return (*_matching)[node];
1927 1973
    }
... ...
@@ -1933,13 +1979,13 @@
1933 1979
    const MatchingMap& matchingMap() const {
1934 1980
      return *_matching;
1935 1981
    }
1936 1982

	
1937 1983
    /// \brief Return the mate of the given node.
1938 1984
    ///
1939
    /// This function returns the mate of the given node in the found 
1985
    /// This function returns the mate of the given node in the found
1940 1986
    /// matching or \c INVALID if the node is not covered by the matching.
1941 1987
    ///
1942 1988
    /// \pre Either run() or start() must be called before using this function.
1943 1989
    Node mate(const Node& node) const {
1944 1990
      return (*_matching)[node] != INVALID ?
1945 1991
        _graph.target((*_matching)[node]) : INVALID;
... ...
@@ -1953,14 +1999,14 @@
1953 1999
    /// using them.
1954 2000

	
1955 2001
    /// @{
1956 2002

	
1957 2003
    /// \brief Return the value of the dual solution.
1958 2004
    ///
1959
    /// This function returns the value of the dual solution. 
1960
    /// It should be equal to the primal value scaled by \ref dualScale 
2005
    /// This function returns the value of the dual solution.
2006
    /// It should be equal to the primal value scaled by \ref dualScale
1961 2007
    /// "dual scale".
1962 2008
    ///
1963 2009
    /// \pre Either run() or start() must be called before using this function.
1964 2010
    Value dualValue() const {
1965 2011
      Value sum = 0;
1966 2012
      for (NodeIt n(_graph); n != INVALID; ++n) {
... ...
@@ -2009,25 +2055,25 @@
2009 2055
    Value blossomValue(int k) const {
2010 2056
      return _blossom_potential[k].value;
2011 2057
    }
2012 2058

	
2013 2059
    /// \brief Iterator for obtaining the nodes of a blossom.
2014 2060
    ///
2015
    /// This class provides an iterator for obtaining the nodes of the 
2061
    /// This class provides an iterator for obtaining the nodes of the
2016 2062
    /// given blossom. It lists a subset of the nodes.
2017
    /// Before using this iterator, you must allocate a 
2063
    /// Before using this iterator, you must allocate a
2018 2064
    /// MaxWeightedMatching class and execute it.
2019 2065
    class BlossomIt {
2020 2066
    public:
2021 2067

	
2022 2068
      /// \brief Constructor.
2023 2069
      ///
2024 2070
      /// Constructor to get the nodes of the given variable.
2025 2071
      ///
2026
      /// \pre Either \ref MaxWeightedMatching::run() "algorithm.run()" or 
2027
      /// \ref MaxWeightedMatching::start() "algorithm.start()" must be 
2072
      /// \pre Either \ref MaxWeightedMatching::run() "algorithm.run()" or
2073
      /// \ref MaxWeightedMatching::start() "algorithm.start()" must be
2028 2074
      /// called before initializing this iterator.
2029 2075
      BlossomIt(const MaxWeightedMatching& algorithm, int variable)
2030 2076
        : _algorithm(&algorithm)
2031 2077
      {
2032 2078
        _index = _algorithm->_blossom_potential[variable].begin;
2033 2079
        _last = _algorithm->_blossom_potential[variable].end;
... ...
@@ -2074,14 +2120,14 @@
2074 2120
  ///
2075 2121
  /// This class provides an efficient implementation of Edmond's
2076 2122
  /// maximum weighted perfect matching algorithm. The implementation
2077 2123
  /// is based on extensive use of priority queues and provides
2078 2124
  /// \f$O(nm\log n)\f$ time complexity.
2079 2125
  ///
2080
  /// The maximum weighted perfect matching problem is to find a subset of 
2081
  /// the edges in an undirected graph with maximum overall weight for which 
2126
  /// The maximum weighted perfect matching problem is to find a subset of
2127
  /// the edges in an undirected graph with maximum overall weight for which
2082 2128
  /// each node has exactly one incident edge.
2083 2129
  /// It can be formulated with the following linear program.
2084 2130
  /// \f[ \sum_{e \in \delta(u)}x_e = 1 \quad \forall u\in V\f]
2085 2131
  /** \f[ \sum_{e \in \gamma(B)}x_e \le \frac{\vert B \vert - 1}{2}
2086 2132
      \quad \forall B\in\mathcal{O}\f] */
2087 2133
  /// \f[x_e \ge 0\quad \forall e\in E\f]
... ...
@@ -2098,22 +2144,22 @@
2098 2144
  /** \f[ y_u + y_v + \sum_{B \in \mathcal{O}, uv \in \gamma(B)}z_B \ge
2099 2145
      w_{uv} \quad \forall uv\in E\f] */
2100 2146
  /// \f[z_B \ge 0 \quad \forall B \in \mathcal{O}\f]
2101 2147
  /** \f[\min \sum_{u \in V}y_u + \sum_{B \in \mathcal{O}}
2102 2148
      \frac{\vert B \vert - 1}{2}z_B\f] */
2103 2149
  ///
2104
  /// The algorithm can be executed with the run() function. 
2150
  /// The algorithm can be executed with the run() function.
2105 2151
  /// After it the matching (the primal solution) and the dual solution
2106
  /// can be obtained using the query functions and the 
2107
  /// \ref MaxWeightedPerfectMatching::BlossomIt "BlossomIt" nested class, 
2108
  /// which is able to iterate on the nodes of a blossom. 
2152
  /// can be obtained using the query functions and the
2153
  /// \ref MaxWeightedPerfectMatching::BlossomIt "BlossomIt" nested class,
2154
  /// which is able to iterate on the nodes of a blossom.
2109 2155
  /// If the value type is integer, then the dual solution is multiplied
2110 2156
  /// by \ref MaxWeightedMatching::dualScale "4".
2111 2157
  ///
2112 2158
  /// \tparam GR The undirected graph type the algorithm runs on.
2113
  /// \tparam WM The type edge weight map. The default type is 
2159
  /// \tparam WM The type edge weight map. The default type is
2114 2160
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<int>".
2115 2161
#ifdef DOXYGEN
2116 2162
  template <typename GR, typename WM>
2117 2163
#else
2118 2164
  template <typename GR,
2119 2165
            typename WM = typename GR::template EdgeMap<int> >
... ...
@@ -2218,12 +2264,17 @@
2218 2264
    BinHeap<Value, IntEdgeMap> *_delta3;
2219 2265

	
2220 2266
    IntIntMap *_delta4_index;
2221 2267
    BinHeap<Value, IntIntMap> *_delta4;
2222 2268

	
2223 2269
    Value _delta_sum;
2270
    int _unmatched;
2271

	
2272
    typedef MaxWeightedPerfectFractionalMatching<Graph, WeightMap>
2273
    FractionalMatching;
2274
    FractionalMatching *_fractional;
2224 2275

	
2225 2276
    void createStructures() {
2226 2277
      _node_num = countNodes(_graph);
2227 2278
      _blossom_num = _node_num * 3 / 2;
2228 2279

	
2229 2280
      if (!_matching) {
... ...
@@ -2279,15 +2330,12 @@
2279 2330
      } else {
2280 2331
        _delta4_index->resize(_blossom_num);
2281 2332
      }
2282 2333
    }
2283 2334

	
2284 2335
    void destroyStructures() {
2285
      _node_num = countNodes(_graph);
2286
      _blossom_num = _node_num * 3 / 2;
2287

	
2288 2336
      if (_matching) {
2289 2337
        delete _matching;
2290 2338
      }
2291 2339
      if (_node_potential) {
2292 2340
        delete _node_potential;
2293 2341
      }
... ...
@@ -2954,16 +3002,22 @@
2954 3002
        _tree_set_index(0), _tree_set(0),
2955 3003

	
2956 3004
        _delta2_index(0), _delta2(0),
2957 3005
        _delta3_index(0), _delta3(0),
2958 3006
        _delta4_index(0), _delta4(0),
2959 3007

	
2960
        _delta_sum() {}
3008
        _delta_sum(), _unmatched(0),
3009

	
3010
        _fractional(0)
3011
    {}
2961 3012

	
2962 3013
    ~MaxWeightedPerfectMatching() {
2963 3014
      destroyStructures();
3015
      if (_fractional) {
3016
        delete _fractional;
3017
      }
2964 3018
    }
2965 3019

	
2966 3020
    /// \name Execution Control
2967 3021
    /// The simplest way to execute the algorithm is to use the
2968 3022
    /// \ref run() member function.
2969 3023

	
... ...
@@ -2986,12 +3040,14 @@
2986 3040
      }
2987 3041
      for (int i = 0; i < _blossom_num; ++i) {
2988 3042
        (*_delta2_index)[i] = _delta2->PRE_HEAP;
2989 3043
        (*_delta4_index)[i] = _delta4->PRE_HEAP;
2990 3044
      }
2991 3045

	
3046
      _unmatched = _node_num;
3047

	
2992 3048
      _delta2->clear();
2993 3049
      _delta3->clear();
2994 3050
      _delta4->clear();
2995 3051
      _blossom_set->clear();
2996 3052
      _tree_set->clear();
2997 3053

	
... ...
@@ -3027,35 +3083,180 @@
3027 3083
          _delta3->push(e, ((*_node_data)[si].pot + (*_node_data)[ti].pot -
3028 3084
                            dualScale * _weight[e]) / 2);
3029 3085
        }
3030 3086
      }
3031 3087
    }
3032 3088

	
3089
    /// \brief Initialize the algorithm with fractional matching
3090
    ///
3091
    /// This function initializes the algorithm with a fractional
3092
    /// matching. This initialization is also called jumpstart heuristic.
3093
    void fractionalInit() {
3094
      createStructures();
3095

	
3096
      _blossom_node_list.clear();
3097
      _blossom_potential.clear();
3098

	
3099
      if (_fractional == 0) {
3100
        _fractional = new FractionalMatching(_graph, _weight, false);
3101
      }
3102
      if (!_fractional->run()) {
3103
        _unmatched = -1;
3104
        return;
3105
      }
3106

	
3107
      for (ArcIt e(_graph); e != INVALID; ++e) {
3108
        (*_node_heap_index)[e] = BinHeap<Value, IntArcMap>::PRE_HEAP;
3109
      }
3110
      for (EdgeIt e(_graph); e != INVALID; ++e) {
3111
        (*_delta3_index)[e] = _delta3->PRE_HEAP;
3112
      }
3113
      for (int i = 0; i < _blossom_num; ++i) {
3114
        (*_delta2_index)[i] = _delta2->PRE_HEAP;
3115
        (*_delta4_index)[i] = _delta4->PRE_HEAP;
3116
      }
3117

	
3118
      _unmatched = 0;
3119

	
3120
      _delta2->clear();
3121
      _delta3->clear();
3122
      _delta4->clear();
3123
      _blossom_set->clear();
3124
      _tree_set->clear();
3125

	
3126
      int index = 0;
3127
      for (NodeIt n(_graph); n != INVALID; ++n) {
3128
        Value pot = _fractional->nodeValue(n);
3129
        (*_node_index)[n] = index;
3130
        (*_node_data)[index].pot = pot;
3131
        (*_node_data)[index].heap_index.clear();
3132
        (*_node_data)[index].heap.clear();
3133
        int blossom =
3134
          _blossom_set->insert(n, std::numeric_limits<Value>::max());
3135

	
3136
        (*_blossom_data)[blossom].status = MATCHED;
3137
        (*_blossom_data)[blossom].pred = INVALID;
3138
        (*_blossom_data)[blossom].next = _fractional->matching(n);
3139
        (*_blossom_data)[blossom].pot = 0;
3140
        (*_blossom_data)[blossom].offset = 0;
3141
        ++index;
3142
      }
3143

	
3144
      typename Graph::template NodeMap<bool> processed(_graph, false);
3145
      for (NodeIt n(_graph); n != INVALID; ++n) {
3146
        if (processed[n]) continue;
3147
        processed[n] = true;
3148
        if (_fractional->matching(n) == INVALID) continue;
3149
        int num = 1;
3150
        Node v = _graph.target(_fractional->matching(n));
3151
        while (n != v) {
3152
          processed[v] = true;
3153
          v = _graph.target(_fractional->matching(v));
3154
          ++num;
3155
        }
3156

	
3157
        if (num % 2 == 1) {
3158
          std::vector<int> subblossoms(num);
3159

	
3160
          subblossoms[--num] = _blossom_set->find(n);
3161
          v = _graph.target(_fractional->matching(n));
3162
          while (n != v) {
3163
            subblossoms[--num] = _blossom_set->find(v);
3164
            v = _graph.target(_fractional->matching(v));
3165
          }
3166

	
3167
          int surface =
3168
            _blossom_set->join(subblossoms.begin(), subblossoms.end());
3169
          (*_blossom_data)[surface].status = EVEN;
3170
          (*_blossom_data)[surface].pred = INVALID;
3171
          (*_blossom_data)[surface].next = INVALID;
3172
          (*_blossom_data)[surface].pot = 0;
3173
          (*_blossom_data)[surface].offset = 0;
3174

	
3175
          _tree_set->insert(surface);
3176
          ++_unmatched;
3177
        }
3178
      }
3179

	
3180
      for (EdgeIt e(_graph); e != INVALID; ++e) {
3181
        int si = (*_node_index)[_graph.u(e)];
3182
        int sb = _blossom_set->find(_graph.u(e));
3183
        int ti = (*_node_index)[_graph.v(e)];
3184
        int tb = _blossom_set->find(_graph.v(e));
3185
        if ((*_blossom_data)[sb].status == EVEN &&
3186
            (*_blossom_data)[tb].status == EVEN && sb != tb) {
3187
          _delta3->push(e, ((*_node_data)[si].pot + (*_node_data)[ti].pot -
3188
                            dualScale * _weight[e]) / 2);
3189
        }
3190
      }
3191

	
3192
      for (NodeIt n(_graph); n != INVALID; ++n) {
3193
        int nb = _blossom_set->find(n);
3194
        if ((*_blossom_data)[nb].status != MATCHED) continue;
3195
        int ni = (*_node_index)[n];
3196

	
3197
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
3198
          Node v = _graph.target(e);
3199
          int vb = _blossom_set->find(v);
3200
          int vi = (*_node_index)[v];
3201

	
3202
          Value rw = (*_node_data)[ni].pot + (*_node_data)[vi].pot -
3203
            dualScale * _weight[e];
3204

	
3205
          if ((*_blossom_data)[vb].status == EVEN) {
3206

	
3207
            int vt = _tree_set->find(vb);
3208

	
3209
            typename std::map<int, Arc>::iterator it =
3210
              (*_node_data)[ni].heap_index.find(vt);
3211

	
3212
            if (it != (*_node_data)[ni].heap_index.end()) {
3213
              if ((*_node_data)[ni].heap[it->second] > rw) {
3214
                (*_node_data)[ni].heap.replace(it->second, e);
3215
                (*_node_data)[ni].heap.decrease(e, rw);
3216
                it->second = e;
3217
              }
3218
            } else {
3219
              (*_node_data)[ni].heap.push(e, rw);
3220
              (*_node_data)[ni].heap_index.insert(std::make_pair(vt, e));
3221
            }
3222
          }
3223
        }
3224

	
3225
        if (!(*_node_data)[ni].heap.empty()) {
3226
          _blossom_set->decrease(n, (*_node_data)[ni].heap.prio());
3227
          _delta2->push(nb, _blossom_set->classPrio(nb));
3228
        }
3229
      }
3230
    }
3231

	
3033 3232
    /// \brief Start the algorithm
3034 3233
    ///
3035 3234
    /// This function starts the algorithm.
3036 3235
    ///
3037
    /// \pre \ref init() must be called before using this function.
3236
    /// \pre \ref init() or \ref fractionalInit() must be called before
3237
    /// using this function.
3038 3238
    bool start() {
3039 3239
      enum OpType {
3040 3240
        D2, D3, D4
3041 3241
      };
3042 3242

	
3043
      int unmatched = _node_num;
3044
      while (unmatched > 0) {
3243
      if (_unmatched == -1) return false;
3244

	
3245
      while (_unmatched > 0) {
3045 3246
        Value d2 = !_delta2->empty() ?
3046 3247
          _delta2->prio() : std::numeric_limits<Value>::max();
3047 3248

	
3048 3249
        Value d3 = !_delta3->empty() ?
3049 3250
          _delta3->prio() : std::numeric_limits<Value>::max();
3050 3251

	
3051 3252
        Value d4 = !_delta4->empty() ?
3052 3253
          _delta4->prio() : std::numeric_limits<Value>::max();
3053 3254

	
3054
        _delta_sum = d2; OpType ot = D2;
3055
        if (d3 < _delta_sum) { _delta_sum = d3; ot = D3; }
3255
        _delta_sum = d3; OpType ot = D3;
3256
        if (d2 < _delta_sum) { _delta_sum = d2; ot = D2; }
3056 3257
        if (d4 < _delta_sum) { _delta_sum = d4; ot = D4; }
3057 3258

	
3058 3259
        if (_delta_sum == std::numeric_limits<Value>::max()) {
3059 3260
          return false;
3060 3261
        }
3061 3262

	
... ...
@@ -3082,13 +3283,13 @@
3082 3283
              int right_tree = _tree_set->find(right_blossom);
3083 3284

	
3084 3285
              if (left_tree == right_tree) {
3085 3286
                shrinkOnEdge(e, left_tree);
3086 3287
              } else {
3087 3288
                augmentOnEdge(e);
3088
                unmatched -= 2;
3289
                _unmatched -= 2;
3089 3290
              }
3090 3291
            }
3091 3292
          } break;
3092 3293
        case D4:
3093 3294
          splitBlossom(_delta4->top());
3094 3295
          break;
... ...
@@ -3101,24 +3302,24 @@
3101 3302
    /// \brief Run the algorithm.
3102 3303
    ///
3103 3304
    /// This method runs the \c %MaxWeightedPerfectMatching algorithm.
3104 3305
    ///
3105 3306
    /// \note mwpm.run() is just a shortcut of the following code.
3106 3307
    /// \code
3107
    ///   mwpm.init();
3308
    ///   mwpm.fractionalInit();
3108 3309
    ///   mwpm.start();
3109 3310
    /// \endcode
3110 3311
    bool run() {
3111
      init();
3312
      fractionalInit();
3112 3313
      return start();
3113 3314
    }
3114 3315

	
3115 3316
    /// @}
3116 3317

	
3117 3318
    /// \name Primal Solution
3118
    /// Functions to get the primal solution, i.e. the maximum weighted 
3319
    /// Functions to get the primal solution, i.e. the maximum weighted
3119 3320
    /// perfect matching.\n
3120 3321
    /// Either \ref run() or \ref start() function should be called before
3121 3322
    /// using them.
3122 3323

	
3123 3324
    /// @{
3124 3325

	
... ...
@@ -3131,29 +3332,29 @@
3131 3332
      Value sum = 0;
3132 3333
      for (NodeIt n(_graph); n != INVALID; ++n) {
3133 3334
        if ((*_matching)[n] != INVALID) {
3134 3335
          sum += _weight[(*_matching)[n]];
3135 3336
        }
3136 3337
      }
3137
      return sum /= 2;
3338
      return sum / 2;
3138 3339
    }
3139 3340

	
3140 3341
    /// \brief Return \c true if the given edge is in the matching.
3141 3342
    ///
3142
    /// This function returns \c true if the given edge is in the found 
3343
    /// This function returns \c true if the given edge is in the found
3143 3344
    /// matching.
3144 3345
    ///
3145 3346
    /// \pre Either run() or start() must be called before using this function.
3146 3347
    bool matching(const Edge& edge) const {
3147 3348
      return static_cast<const Edge&>((*_matching)[_graph.u(edge)]) == edge;
3148 3349
    }
3149 3350

	
3150 3351
    /// \brief Return the matching arc (or edge) incident to the given node.
3151 3352
    ///
3152 3353
    /// This function returns the matching arc (or edge) incident to the
3153
    /// given node in the found matching or \c INVALID if the node is 
3354
    /// given node in the found matching or \c INVALID if the node is
3154 3355
    /// not covered by the matching.
3155 3356
    ///
3156 3357
    /// \pre Either run() or start() must be called before using this function.
3157 3358
    Arc matching(const Node& node) const {
3158 3359
      return (*_matching)[node];
3159 3360
    }
... ...
@@ -3165,13 +3366,13 @@
3165 3366
    const MatchingMap& matchingMap() const {
3166 3367
      return *_matching;
3167 3368
    }
3168 3369

	
3169 3370
    /// \brief Return the mate of the given node.
3170 3371
    ///
3171
    /// This function returns the mate of the given node in the found 
3372
    /// This function returns the mate of the given node in the found
3172 3373
    /// matching or \c INVALID if the node is not covered by the matching.
3173 3374
    ///
3174 3375
    /// \pre Either run() or start() must be called before using this function.
3175 3376
    Node mate(const Node& node) const {
3176 3377
      return _graph.target((*_matching)[node]);
3177 3378
    }
... ...
@@ -3184,14 +3385,14 @@
3184 3385
    /// using them.
3185 3386

	
3186 3387
    /// @{
3187 3388

	
3188 3389
    /// \brief Return the value of the dual solution.
3189 3390
    ///
3190
    /// This function returns the value of the dual solution. 
3191
    /// It should be equal to the primal value scaled by \ref dualScale 
3391
    /// This function returns the value of the dual solution.
3392
    /// It should be equal to the primal value scaled by \ref dualScale
3192 3393
    /// "dual scale".
3193 3394
    ///
3194 3395
    /// \pre Either run() or start() must be called before using this function.
3195 3396
    Value dualValue() const {
3196 3397
      Value sum = 0;
3197 3398
      for (NodeIt n(_graph); n != INVALID; ++n) {
... ...
@@ -3240,25 +3441,25 @@
3240 3441
    Value blossomValue(int k) const {
3241 3442
      return _blossom_potential[k].value;
3242 3443
    }
3243 3444

	
3244 3445
    /// \brief Iterator for obtaining the nodes of a blossom.
3245 3446
    ///
3246
    /// This class provides an iterator for obtaining the nodes of the 
3447
    /// This class provides an iterator for obtaining the nodes of the
3247 3448
    /// given blossom. It lists a subset of the nodes.
3248
    /// Before using this iterator, you must allocate a 
3449
    /// Before using this iterator, you must allocate a
3249 3450
    /// MaxWeightedPerfectMatching class and execute it.
3250 3451
    class BlossomIt {
3251 3452
    public:
3252 3453

	
3253 3454
      /// \brief Constructor.
3254 3455
      ///
3255 3456
      /// Constructor to get the nodes of the given variable.
3256 3457
      ///
3257
      /// \pre Either \ref MaxWeightedPerfectMatching::run() "algorithm.run()" 
3258
      /// or \ref MaxWeightedPerfectMatching::start() "algorithm.start()" 
3458
      /// \pre Either \ref MaxWeightedPerfectMatching::run() "algorithm.run()"
3459
      /// or \ref MaxWeightedPerfectMatching::start() "algorithm.start()"
3259 3460
      /// must be called before initializing this iterator.
3260 3461
      BlossomIt(const MaxWeightedPerfectMatching& algorithm, int variable)
3261 3462
        : _algorithm(&algorithm)
3262 3463
      {
3263 3464
        _index = _algorithm->_blossom_potential[variable].begin;
3264 3465
        _last = _algorithm->_blossom_potential[variable].end;
... ...
@@ -3298,7 +3499,7 @@
3298 3499
    /// @}
3299 3500

	
3300 3501
  };
3301 3502

	
3302 3503
} //END OF NAMESPACE LEMON
3303 3504

	
3304
#endif //LEMON_MAX_MATCHING_H
3505
#endif //LEMON_MATCHING_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -53,13 +53,13 @@
53 53
  /// sqrt(2)
54 54
  const long double SQRT2   = 1.4142135623730950488016887242096981L;
55 55
  /// 1/sqrt(2)
56 56
  const long double SQRT1_2 = 0.7071067811865475244008443621048490L;
57 57

	
58 58
  ///Check whether the parameter is NaN or not
59
  
59

	
60 60
  ///This function checks whether the parameter is NaN or not.
61 61
  ///Is should be equivalent with std::isnan(), but it is not
62 62
  ///provided by all compilers.
63 63
  inline bool isNaN(double v)
64 64
    {
65 65
      return v!=v;
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -109,29 +109,30 @@
109 109
  /// \param GR The digraph type the algorithm runs on.
110 110
  /// \param CM A read-only arc map storing the costs of the
111 111
  /// arcs. It is read once for each arc, so the map may involve in
112 112
  /// relatively time consuming process to compute the arc costs if
113 113
  /// it is necessary. The default map type is \ref
114 114
  /// concepts::Digraph::ArcMap "Digraph::ArcMap<int>".
115
  /// \param TR Traits class to set various data types used
116
  /// by the algorithm. The default traits class is
117
  /// \ref MinCostArborescenceDefaultTraits
115
  /// \tparam TR The traits class that defines various types used by the
116
  /// algorithm. By default, it is \ref MinCostArborescenceDefaultTraits
118 117
  /// "MinCostArborescenceDefaultTraits<GR, CM>".
118
  /// In most cases, this parameter should not be set directly,
119
  /// consider to use the named template parameters instead.
119 120
#ifndef DOXYGEN
120 121
  template <typename GR,
121 122
            typename CM = typename GR::template ArcMap<int>,
122 123
            typename TR =
123 124
              MinCostArborescenceDefaultTraits<GR, CM> >
124 125
#else
125
  template <typename GR, typename CM, typedef TR>
126
  template <typename GR, typename CM, typename TR>
126 127
#endif
127 128
  class MinCostArborescence {
128 129
  public:
129 130

	
130
    /// \brief The \ref MinCostArborescenceDefaultTraits "traits class" 
131
    /// of the algorithm. 
131
    /// \brief The \ref MinCostArborescenceDefaultTraits "traits class"
132
    /// of the algorithm.
132 133
    typedef TR Traits;
133 134
    /// The type of the underlying digraph.
134 135
    typedef typename Traits::Digraph Digraph;
135 136
    /// The type of the map that stores the arc costs.
136 137
    typedef typename Traits::CostMap CostMap;
137 138
    ///The type of the costs of the arcs.
... ...
@@ -432,13 +433,13 @@
432 433

	
433 434
    /// \brief \ref named-templ-param "Named parameter" for
434 435
    /// setting \c PredMap type
435 436
    ///
436 437
    /// \ref named-templ-param "Named parameter" for setting
437 438
    /// \c PredMap type.
438
    /// It must meet the \ref concepts::WriteMap "WriteMap" concept, 
439
    /// It must meet the \ref concepts::WriteMap "WriteMap" concept,
439 440
    /// and its value type must be the \c Arc type of the digraph.
440 441
    template <class T>
441 442
    struct SetPredMap
442 443
      : public MinCostArborescence<Digraph, CostMap, SetPredMapTraits<T> > {
443 444
    };
444 445

	
... ...
@@ -485,14 +486,14 @@
485 486
      return *this;
486 487
    }
487 488

	
488 489
    /// \name Execution Control
489 490
    /// The simplest way to execute the algorithm is to use
490 491
    /// one of the member functions called \c run(...). \n
491
    /// If you need more control on the execution,
492
    /// first you must call \ref init(), then you can add several
492
    /// If you need better control on the execution,
493
    /// you have to call \ref init() first, then you can add several
493 494
    /// source nodes with \ref addSource().
494 495
    /// Finally \ref start() will perform the arborescence
495 496
    /// computation.
496 497

	
497 498
    ///@{
498 499

	
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -37,39 +37,41 @@
37 37
  /// @{
38 38

	
39 39
  /// \brief Implementation of the primal Network Simplex algorithm
40 40
  /// for finding a \ref min_cost_flow "minimum cost flow".
41 41
  ///
42 42
  /// \ref NetworkSimplex implements the primal Network Simplex algorithm
43
  /// for finding a \ref min_cost_flow "minimum cost flow".
44
  /// This algorithm is a specialized version of the linear programming
45
  /// simplex method directly for the minimum cost flow problem.
46
  /// It is one of the most efficient solution methods.
43
  /// for finding a \ref min_cost_flow "minimum cost flow"
44
  /// \ref amo93networkflows, \ref dantzig63linearprog,
45
  /// \ref kellyoneill91netsimplex.
46
  /// This algorithm is a highly efficient specialized version of the
47
  /// linear programming simplex method directly for the minimum cost
48
  /// flow problem.
47 49
  ///
48
  /// In general this class is the fastest implementation available
49
  /// in LEMON for the minimum cost flow problem.
50
  /// Moreover it supports both directions of the supply/demand inequality
51
  /// constraints. For more information see \ref SupplyType.
50
  /// In general, %NetworkSimplex is the fastest implementation available
51
  /// in LEMON for this problem.
52
  /// Moreover, it supports both directions of the supply/demand inequality
53
  /// constraints. For more information, see \ref SupplyType.
52 54
  ///
53 55
  /// Most of the parameters of the problem (except for the digraph)
54 56
  /// can be given using separate functions, and the algorithm can be
55 57
  /// executed using the \ref run() function. If some parameters are not
56 58
  /// specified, then default values will be used.
57 59
  ///
58 60
  /// \tparam GR The digraph type the algorithm runs on.
59
  /// \tparam V The value type used for flow amounts, capacity bounds
60
  /// and supply values in the algorithm. By default it is \c int.
61
  /// \tparam C The value type used for costs and potentials in the
62
  /// algorithm. By default it is the same as \c V.
61
  /// \tparam V The number type used for flow amounts, capacity bounds
62
  /// and supply values in the algorithm. By default, it is \c int.
63
  /// \tparam C The number type used for costs and potentials in the
64
  /// algorithm. By default, it is the same as \c V.
63 65
  ///
64
  /// \warning Both value types must be signed and all input data must
66
  /// \warning Both number types must be signed and all input data must
65 67
  /// be integer.
66 68
  ///
67 69
  /// \note %NetworkSimplex provides five different pivot rule
68 70
  /// implementations, from which the most efficient one is used
69
  /// by default. For more information see \ref PivotRule.
71
  /// by default. For more information, see \ref PivotRule.
70 72
  template <typename GR, typename V = int, typename C = V>
71 73
  class NetworkSimplex
72 74
  {
73 75
  public:
74 76

	
75 77
    /// The type of the flow amounts, capacity bounds and supply values
... ...
@@ -92,13 +94,13 @@
92 94
      OPTIMAL,
93 95
      /// The objective function of the problem is unbounded, i.e.
94 96
      /// there is a directed cycle having negative total cost and
95 97
      /// infinite upper bound.
96 98
      UNBOUNDED
97 99
    };
98
    
100

	
99 101
    /// \brief Constants for selecting the type of the supply constraints.
100 102
    ///
101 103
    /// Enum type containing constants for selecting the supply type,
102 104
    /// i.e. the direction of the inequalities in the supply/demand
103 105
    /// constraints of the \ref min_cost_flow "minimum cost flow problem".
104 106
    ///
... ...
@@ -110,74 +112,77 @@
110 112
      /// supply/demand constraints in the definition of the problem.
111 113
      GEQ,
112 114
      /// This option means that there are <em>"less or equal"</em>
113 115
      /// supply/demand constraints in the definition of the problem.
114 116
      LEQ
115 117
    };
116
    
118

	
117 119
    /// \brief Constants for selecting the pivot rule.
118 120
    ///
119 121
    /// Enum type containing constants for selecting the pivot rule for
120 122
    /// the \ref run() function.
121 123
    ///
122 124
    /// \ref NetworkSimplex provides five different pivot rule
123 125
    /// implementations that significantly affect the running time
124 126
    /// of the algorithm.
125
    /// By default \ref BLOCK_SEARCH "Block Search" is used, which
127
    /// By default, \ref BLOCK_SEARCH "Block Search" is used, which
126 128
    /// proved to be the most efficient and the most robust on various
127
    /// test inputs according to our benchmark tests.
128
    /// However another pivot rule can be selected using the \ref run()
129
    /// test inputs.
130
    /// However, another pivot rule can be selected using the \ref run()
129 131
    /// function with the proper parameter.
130 132
    enum PivotRule {
131 133

	
132
      /// The First Eligible pivot rule.
134
      /// The \e First \e Eligible pivot rule.
133 135
      /// The next eligible arc is selected in a wraparound fashion
134 136
      /// in every iteration.
135 137
      FIRST_ELIGIBLE,
136 138

	
137
      /// The Best Eligible pivot rule.
139
      /// The \e Best \e Eligible pivot rule.
138 140
      /// The best eligible arc is selected in every iteration.
139 141
      BEST_ELIGIBLE,
140 142

	
141
      /// The Block Search pivot rule.
143
      /// The \e Block \e Search pivot rule.
142 144
      /// A specified number of arcs are examined in every iteration
143 145
      /// in a wraparound fashion and the best eligible arc is selected
144 146
      /// from this block.
145 147
      BLOCK_SEARCH,
146 148

	
147
      /// The Candidate List pivot rule.
149
      /// The \e Candidate \e List pivot rule.
148 150
      /// In a major iteration a candidate list is built from eligible arcs
149 151
      /// in a wraparound fashion and in the following minor iterations
150 152
      /// the best eligible arc is selected from this list.
151 153
      CANDIDATE_LIST,
152 154

	
153
      /// The Altering Candidate List pivot rule.
155
      /// The \e Altering \e Candidate \e List pivot rule.
154 156
      /// It is a modified version of the Candidate List method.
155 157
      /// It keeps only the several best eligible arcs from the former
156 158
      /// candidate list and extends this list in every iteration.
157 159
      ALTERING_LIST
158 160
    };
159
    
161

	
160 162
  private:
161 163

	
162 164
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
163 165

	
164
    typedef std::vector<Arc> ArcVector;
165
    typedef std::vector<Node> NodeVector;
166 166
    typedef std::vector<int> IntVector;
167
    typedef std::vector<bool> BoolVector;
168 167
    typedef std::vector<Value> ValueVector;
169 168
    typedef std::vector<Cost> CostVector;
169
    typedef std::vector<char> BoolVector;
170
    // Note: vector<char> is used instead of vector<bool> for efficiency reasons
170 171

	
171 172
    // State constants for arcs
172
    enum ArcStateEnum {
173
    enum ArcState {
173 174
      STATE_UPPER = -1,
174 175
      STATE_TREE  =  0,
175 176
      STATE_LOWER =  1
176 177
    };
177 178

	
179
    typedef std::vector<signed char> StateVector;
180
    // Note: vector<signed char> is used instead of vector<ArcState> for
181
    // efficiency reasons
182

	
178 183
  private:
179 184

	
180 185
    // Data related to the underlying digraph
181 186
    const GR &_graph;
182 187
    int _node_num;
183 188
    int _arc_num;
... ...
@@ -191,12 +196,13 @@
191 196

	
192 197
    // Data structures for storing the digraph
193 198
    IntNodeMap _node_id;
194 199
    IntArcMap _arc_id;
195 200
    IntVector _source;
196 201
    IntVector _target;
202
    bool _arc_mixing;
197 203

	
198 204
    // Node and arc data
199 205
    ValueVector _lower;
200 206
    ValueVector _upper;
201 207
    ValueVector _cap;
202 208
    CostVector _cost;
... ...
@@ -210,23 +216,25 @@
210 216
    IntVector _thread;
211 217
    IntVector _rev_thread;
212 218
    IntVector _succ_num;
213 219
    IntVector _last_succ;
214 220
    IntVector _dirty_revs;
215 221
    BoolVector _forward;
216
    IntVector _state;
222
    StateVector _state;
217 223
    int _root;
218 224

	
219 225
    // Temporary data used in the current pivot iteration
220 226
    int in_arc, join, u_in, v_in, u_out, v_out;
221 227
    int first, second, right, last;
222 228
    int stem, par_stem, new_stem;
223 229
    Value delta;
224 230

	
231
    const Value MAX;
232

	
225 233
  public:
226
  
234

	
227 235
    /// \brief Constant for infinite upper bounds (capacities).
228 236
    ///
229 237
    /// Constant for infinite upper bounds (capacities).
230 238
    /// It is \c std::numeric_limits<Value>::infinity() if available,
231 239
    /// \c std::numeric_limits<Value>::max() otherwise.
232 240
    const Value INF;
... ...
@@ -239,13 +247,13 @@
239 247
    private:
240 248

	
241 249
      // References to the NetworkSimplex class
242 250
      const IntVector  &_source;
243 251
      const IntVector  &_target;
244 252
      const CostVector &_cost;
245
      const IntVector  &_state;
253
      const StateVector &_state;
246 254
      const CostVector &_pi;
247 255
      int &_in_arc;
248 256
      int _search_arc_num;
249 257

	
250 258
      // Pivot rule data
251 259
      int _next_arc;
... ...
@@ -260,21 +268,21 @@
260 268
        _next_arc(0)
261 269
      {}
262 270

	
263 271
      // Find next entering arc
264 272
      bool findEnteringArc() {
265 273
        Cost c;
266
        for (int e = _next_arc; e < _search_arc_num; ++e) {
274
        for (int e = _next_arc; e != _search_arc_num; ++e) {
267 275
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
268 276
          if (c < 0) {
269 277
            _in_arc = e;
270 278
            _next_arc = e + 1;
271 279
            return true;
272 280
          }
273 281
        }
274
        for (int e = 0; e < _next_arc; ++e) {
282
        for (int e = 0; e != _next_arc; ++e) {
275 283
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
276 284
          if (c < 0) {
277 285
            _in_arc = e;
278 286
            _next_arc = e + 1;
279 287
            return true;
280 288
          }
... ...
@@ -291,13 +299,13 @@
291 299
    private:
292 300

	
293 301
      // References to the NetworkSimplex class
294 302
      const IntVector  &_source;
295 303
      const IntVector  &_target;
296 304
      const CostVector &_cost;
297
      const IntVector  &_state;
305
      const StateVector &_state;
298 306
      const CostVector &_pi;
299 307
      int &_in_arc;
300 308
      int _search_arc_num;
301 309

	
302 310
    public:
303 311

	
... ...
@@ -308,13 +316,13 @@
308 316
        _in_arc(ns.in_arc), _search_arc_num(ns._search_arc_num)
309 317
      {}
310 318

	
311 319
      // Find next entering arc
312 320
      bool findEnteringArc() {
313 321
        Cost c, min = 0;
314
        for (int e = 0; e < _search_arc_num; ++e) {
322
        for (int e = 0; e != _search_arc_num; ++e) {
315 323
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
316 324
          if (c < min) {
317 325
            min = c;
318 326
            _in_arc = e;
319 327
          }
320 328
        }
... ...
@@ -330,13 +338,13 @@
330 338
    private:
331 339

	
332 340
      // References to the NetworkSimplex class
333 341
      const IntVector  &_source;
334 342
      const IntVector  &_target;
335 343
      const CostVector &_cost;
336
      const IntVector  &_state;
344
      const StateVector &_state;
337 345
      const CostVector &_pi;
338 346
      int &_in_arc;
339 347
      int _search_arc_num;
340 348

	
341 349
      // Pivot rule data
342 350
      int _block_size;
... ...
@@ -349,51 +357,50 @@
349 357
        _source(ns._source), _target(ns._target),
350 358
        _cost(ns._cost), _state(ns._state), _pi(ns._pi),
351 359
        _in_arc(ns.in_arc), _search_arc_num(ns._search_arc_num),
352 360
        _next_arc(0)
353 361
      {
354 362
        // The main parameters of the pivot rule
355
        const double BLOCK_SIZE_FACTOR = 0.5;
363
        const double BLOCK_SIZE_FACTOR = 1.0;
356 364
        const int MIN_BLOCK_SIZE = 10;
357 365

	
358 366
        _block_size = std::max( int(BLOCK_SIZE_FACTOR *
359 367
                                    std::sqrt(double(_search_arc_num))),
360 368
                                MIN_BLOCK_SIZE );
361 369
      }
362 370

	
363 371
      // Find next entering arc
364 372
      bool findEnteringArc() {
365 373
        Cost c, min = 0;
366 374
        int cnt = _block_size;
367
        int e, min_arc = _next_arc;
368
        for (e = _next_arc; e < _search_arc_num; ++e) {
375
        int e;
376
        for (e = _next_arc; e != _search_arc_num; ++e) {
369 377
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
370 378
          if (c < min) {
371 379
            min = c;
372
            min_arc = e;
380
            _in_arc = e;
373 381
          }
374 382
          if (--cnt == 0) {
375
            if (min < 0) break;
383
            if (min < 0) goto search_end;
376 384
            cnt = _block_size;
377 385
          }
378 386
        }
379
        if (min == 0 || cnt > 0) {
380
          for (e = 0; e < _next_arc; ++e) {
381
            c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
382
            if (c < min) {
383
              min = c;
384
              min_arc = e;
385
            }
386
            if (--cnt == 0) {
387
              if (min < 0) break;
388
              cnt = _block_size;
389
            }
387
        for (e = 0; e != _next_arc; ++e) {
388
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
389
          if (c < min) {
390
            min = c;
391
            _in_arc = e;
392
          }
393
          if (--cnt == 0) {
394
            if (min < 0) goto search_end;
395
            cnt = _block_size;
390 396
          }
391 397
        }
392 398
        if (min >= 0) return false;
393
        _in_arc = min_arc;
399

	
400
      search_end:
394 401
        _next_arc = e;
395 402
        return true;
396 403
      }
397 404

	
398 405
    }; //class BlockSearchPivotRule
399 406

	
... ...
@@ -404,13 +411,13 @@
404 411
    private:
405 412

	
406 413
      // References to the NetworkSimplex class
407 414
      const IntVector  &_source;
408 415
      const IntVector  &_target;
409 416
      const CostVector &_cost;
410
      const IntVector  &_state;
417
      const StateVector &_state;
411 418
      const CostVector &_pi;
412 419
      int &_in_arc;
413 420
      int _search_arc_num;
414 421

	
415 422
      // Pivot rule data
416 423
      IntVector _candidates;
... ...
@@ -425,13 +432,13 @@
425 432
        _source(ns._source), _target(ns._target),
426 433
        _cost(ns._cost), _state(ns._state), _pi(ns._pi),
427 434
        _in_arc(ns.in_arc), _search_arc_num(ns._search_arc_num),
428 435
        _next_arc(0)
429 436
      {
430 437
        // The main parameters of the pivot rule
431
        const double LIST_LENGTH_FACTOR = 1.0;
438
        const double LIST_LENGTH_FACTOR = 0.25;
432 439
        const int MIN_LIST_LENGTH = 10;
433 440
        const double MINOR_LIMIT_FACTOR = 0.1;
434 441
        const int MIN_MINOR_LIMIT = 3;
435 442

	
436 443
        _list_length = std::max( int(LIST_LENGTH_FACTOR *
437 444
                                     std::sqrt(double(_search_arc_num))),
... ...
@@ -442,65 +449,61 @@
442 449
        _candidates.resize(_list_length);
443 450
      }
444 451

	
445 452
      /// Find next entering arc
446 453
      bool findEnteringArc() {
447 454
        Cost min, c;
448
        int e, min_arc = _next_arc;
455
        int e;
449 456
        if (_curr_length > 0 && _minor_count < _minor_limit) {
450 457
          // Minor iteration: select the best eligible arc from the
451 458
          // current candidate list
452 459
          ++_minor_count;
453 460
          min = 0;
454 461
          for (int i = 0; i < _curr_length; ++i) {
455 462
            e = _candidates[i];
456 463
            c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
457 464
            if (c < min) {
458 465
              min = c;
459
              min_arc = e;
466
              _in_arc = e;
460 467
            }
461
            if (c >= 0) {
468
            else if (c >= 0) {
462 469
              _candidates[i--] = _candidates[--_curr_length];
463 470
            }
464 471
          }
465
          if (min < 0) {
466
            _in_arc = min_arc;
467
            return true;
468
          }
472
          if (min < 0) return true;
469 473
        }
470 474

	
471 475
        // Major iteration: build a new candidate list
472 476
        min = 0;
473 477
        _curr_length = 0;
474
        for (e = _next_arc; e < _search_arc_num; ++e) {
478
        for (e = _next_arc; e != _search_arc_num; ++e) {
475 479
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
476 480
          if (c < 0) {
477 481
            _candidates[_curr_length++] = e;
478 482
            if (c < min) {
479 483
              min = c;
480
              min_arc = e;
484
              _in_arc = e;
481 485
            }
482
            if (_curr_length == _list_length) break;
486
            if (_curr_length == _list_length) goto search_end;
483 487
          }
484 488
        }
485
        if (_curr_length < _list_length) {
486
          for (e = 0; e < _next_arc; ++e) {
487
            c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
488
            if (c < 0) {
489
              _candidates[_curr_length++] = e;
490
              if (c < min) {
491
                min = c;
492
                min_arc = e;
493
              }
494
              if (_curr_length == _list_length) break;
489
        for (e = 0; e != _next_arc; ++e) {
490
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
491
          if (c < 0) {
492
            _candidates[_curr_length++] = e;
493
            if (c < min) {
494
              min = c;
495
              _in_arc = e;
495 496
            }
497
            if (_curr_length == _list_length) goto search_end;
496 498
          }
497 499
        }
498 500
        if (_curr_length == 0) return false;
501

	
502
      search_end:
499 503
        _minor_count = 1;
500
        _in_arc = min_arc;
501 504
        _next_arc = e;
502 505
        return true;
503 506
      }
504 507

	
505 508
    }; //class CandidateListPivotRule
506 509

	
... ...
@@ -511,13 +514,13 @@
511 514
    private:
512 515

	
513 516
      // References to the NetworkSimplex class
514 517
      const IntVector  &_source;
515 518
      const IntVector  &_target;
516 519
      const CostVector &_cost;
517
      const IntVector  &_state;
520
      const StateVector &_state;
518 521
      const CostVector &_pi;
519 522
      int &_in_arc;
520 523
      int _search_arc_num;
521 524

	
522 525
      // Pivot rule data
523 526
      int _block_size, _head_length, _curr_length;
... ...
@@ -546,13 +549,13 @@
546 549
        _source(ns._source), _target(ns._target),
547 550
        _cost(ns._cost), _state(ns._state), _pi(ns._pi),
548 551
        _in_arc(ns.in_arc), _search_arc_num(ns._search_arc_num),
549 552
        _next_arc(0), _cand_cost(ns._search_arc_num), _sort_func(_cand_cost)
550 553
      {
551 554
        // The main parameters of the pivot rule
552
        const double BLOCK_SIZE_FACTOR = 1.5;
555
        const double BLOCK_SIZE_FACTOR = 1.0;
553 556
        const int MIN_BLOCK_SIZE = 10;
554 557
        const double HEAD_LENGTH_FACTOR = 0.1;
555 558
        const int MIN_HEAD_LENGTH = 3;
556 559

	
557 560
        _block_size = std::max( int(BLOCK_SIZE_FACTOR *
558 561
                                    std::sqrt(double(_search_arc_num))),
... ...
@@ -564,63 +567,60 @@
564 567
      }
565 568

	
566 569
      // Find next entering arc
567 570
      bool findEnteringArc() {
568 571
        // Check the current candidate list
569 572
        int e;
570
        for (int i = 0; i < _curr_length; ++i) {
573
        for (int i = 0; i != _curr_length; ++i) {
571 574
          e = _candidates[i];
572 575
          _cand_cost[e] = _state[e] *
573 576
            (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
574 577
          if (_cand_cost[e] >= 0) {
575 578
            _candidates[i--] = _candidates[--_curr_length];
576 579
          }
577 580
        }
578 581

	
579 582
        // Extend the list
580 583
        int cnt = _block_size;
581
        int last_arc = 0;
582 584
        int limit = _head_length;
583 585

	
584
        for (int e = _next_arc; e < _search_arc_num; ++e) {
586
        for (e = _next_arc; e != _search_arc_num; ++e) {
585 587
          _cand_cost[e] = _state[e] *
586 588
            (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
587 589
          if (_cand_cost[e] < 0) {
588 590
            _candidates[_curr_length++] = e;
589
            last_arc = e;
590 591
          }
591 592
          if (--cnt == 0) {
592
            if (_curr_length > limit) break;
593
            if (_curr_length > limit) goto search_end;
593 594
            limit = 0;
594 595
            cnt = _block_size;
595 596
          }
596 597
        }
597
        if (_curr_length <= limit) {
598
          for (int e = 0; e < _next_arc; ++e) {
599
            _cand_cost[e] = _state[e] *
600
              (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
601
            if (_cand_cost[e] < 0) {
602
              _candidates[_curr_length++] = e;
603
              last_arc = e;
604
            }
605
            if (--cnt == 0) {
606
              if (_curr_length > limit) break;
607
              limit = 0;
608
              cnt = _block_size;
609
            }
598
        for (e = 0; e != _next_arc; ++e) {
599
          _cand_cost[e] = _state[e] *
600
            (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
601
          if (_cand_cost[e] < 0) {
602
            _candidates[_curr_length++] = e;
603
          }
604
          if (--cnt == 0) {
605
            if (_curr_length > limit) goto search_end;
606
            limit = 0;
607
            cnt = _block_size;
610 608
          }
611 609
        }
612 610
        if (_curr_length == 0) return false;
613
        _next_arc = last_arc + 1;
611

	
612
      search_end:
614 613

	
615 614
        // Make heap of the candidate list (approximating a partial sort)
616 615
        make_heap( _candidates.begin(), _candidates.begin() + _curr_length,
617 616
                   _sort_func );
618 617

	
619 618
        // Pop the first element of the heap
620 619
        _in_arc = _candidates[0];
620
        _next_arc = e;
621 621
        pop_heap( _candidates.begin(), _candidates.begin() + _curr_length,
622 622
                  _sort_func );
623 623
        _curr_length = std::min(_head_length, _curr_length - 1);
624 624
        return true;
625 625
      }
626 626

	
... ...
@@ -630,75 +630,31 @@
630 630

	
631 631
    /// \brief Constructor.
632 632
    ///
633 633
    /// The constructor of the class.
634 634
    ///
635 635
    /// \param graph The digraph the algorithm runs on.
636
    NetworkSimplex(const GR& graph) :
636
    /// \param arc_mixing Indicate if the arcs have to be stored in a
637
    /// mixed order in the internal data structure.
638
    /// In special cases, it could lead to better overall performance,
639
    /// but it is usually slower. Therefore it is disabled by default.
640
    NetworkSimplex(const GR& graph, bool arc_mixing = false) :
637 641
      _graph(graph), _node_id(graph), _arc_id(graph),
642
      _arc_mixing(arc_mixing),
643
      MAX(std::numeric_limits<Value>::max()),
638 644
      INF(std::numeric_limits<Value>::has_infinity ?
639
          std::numeric_limits<Value>::infinity() :
640
          std::numeric_limits<Value>::max())
645
          std::numeric_limits<Value>::infinity() : MAX)
641 646
    {
642
      // Check the value types
647
      // Check the number types
643 648
      LEMON_ASSERT(std::numeric_limits<Value>::is_signed,
644 649
        "The flow type of NetworkSimplex must be signed");
645 650
      LEMON_ASSERT(std::numeric_limits<Cost>::is_signed,
646 651
        "The cost type of NetworkSimplex must be signed");
647
        
648
      // Resize vectors
649
      _node_num = countNodes(_graph);
650
      _arc_num = countArcs(_graph);
651
      int all_node_num = _node_num + 1;
652
      int max_arc_num = _arc_num + 2 * _node_num;
653 652

	
654
      _source.resize(max_arc_num);
655
      _target.resize(max_arc_num);
656

	
657
      _lower.resize(_arc_num);
658
      _upper.resize(_arc_num);
659
      _cap.resize(max_arc_num);
660
      _cost.resize(max_arc_num);
661
      _supply.resize(all_node_num);
662
      _flow.resize(max_arc_num);
663
      _pi.resize(all_node_num);
664

	
665
      _parent.resize(all_node_num);
666
      _pred.resize(all_node_num);
667
      _forward.resize(all_node_num);
668
      _thread.resize(all_node_num);
669
      _rev_thread.resize(all_node_num);
670
      _succ_num.resize(all_node_num);
671
      _last_succ.resize(all_node_num);
672
      _state.resize(max_arc_num);
673

	
674
      // Copy the graph (store the arcs in a mixed order)
675
      int i = 0;
676
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
677
        _node_id[n] = i;
678
      }
679
      int k = std::max(int(std::sqrt(double(_arc_num))), 10);
680
      i = 0;
681
      for (ArcIt a(_graph); a != INVALID; ++a) {
682
        _arc_id[a] = i;
683
        _source[i] = _node_id[_graph.source(a)];
684
        _target[i] = _node_id[_graph.target(a)];
685
        if ((i += k) >= _arc_num) i = (i % k) + 1;
686
      }
687
      
688
      // Initialize maps
689
      for (int i = 0; i != _node_num; ++i) {
690
        _supply[i] = 0;
691
      }
692
      for (int i = 0; i != _arc_num; ++i) {
693
        _lower[i] = 0;
694
        _upper[i] = INF;
695
        _cost[i] = 1;
696
      }
697
      _have_lower = false;
698
      _stype = GEQ;
653
      // Reset data structures
654
      reset();
699 655
    }
700 656

	
701 657
    /// \name Parameters
702 658
    /// The parameters of the algorithm can be specified using these
703 659
    /// functions.
704 660

	
... ...
@@ -726,13 +682,13 @@
726 682

	
727 683
    /// \brief Set the upper bounds (capacities) on the arcs.
728 684
    ///
729 685
    /// This function sets the upper bounds (capacities) on the arcs.
730 686
    /// If it is not used before calling \ref run(), the upper bounds
731 687
    /// will be set to \ref INF on all arcs (i.e. the flow value will be
732
    /// unbounded from above on each arc).
688
    /// unbounded from above).
733 689
    ///
734 690
    /// \param map An arc map storing the upper bounds.
735 691
    /// Its \c Value type must be convertible to the \c Value type
736 692
    /// of the algorithm.
737 693
    ///
738 694
    /// \return <tt>(*this)</tt>
... ...
@@ -765,13 +721,12 @@
765 721

	
766 722
    /// \brief Set the supply values of the nodes.
767 723
    ///
768 724
    /// This function sets the supply values of the nodes.
769 725
    /// If neither this function nor \ref stSupply() is used before
770 726
    /// calling \ref run(), the supply of each node will be set to zero.
771
    /// (It makes sense only if non-zero lower bounds are given.)
772 727
    ///
773 728
    /// \param map A node map storing the supply values.
774 729
    /// Its \c Value type must be convertible to the \c Value type
775 730
    /// of the algorithm.
776 731
    ///
777 732
    /// \return <tt>(*this)</tt>
... ...
@@ -786,13 +741,12 @@
786 741
    /// \brief Set single source and target nodes and a supply value.
787 742
    ///
788 743
    /// This function sets a single source node and a single target node
789 744
    /// and the required flow value.
790 745
    /// If neither this function nor \ref supplyMap() is used before
791 746
    /// calling \ref run(), the supply of each node will be set to zero.
792
    /// (It makes sense only if non-zero lower bounds are given.)
793 747
    ///
794 748
    /// Using this function has the same effect as using \ref supplyMap()
795 749
    /// with such a map in which \c k is assigned to \c s, \c -k is
796 750
    /// assigned to \c t and all other nodes have zero supply value.
797 751
    ///
798 752
    /// \param s The source node.
... ...
@@ -806,20 +760,20 @@
806 760
        _supply[i] = 0;
807 761
      }
808 762
      _supply[_node_id[s]] =  k;
809 763
      _supply[_node_id[t]] = -k;
810 764
      return *this;
811 765
    }
812
    
766

	
813 767
    /// \brief Set the type of the supply constraints.
814 768
    ///
815 769
    /// This function sets the type of the supply/demand constraints.
816 770
    /// If it is not used before calling \ref run(), the \ref GEQ supply
817 771
    /// type will be used.
818 772
    ///
819
    /// For more information see \ref SupplyType.
773
    /// For more information, see \ref SupplyType.
820 774
    ///
821 775
    /// \return <tt>(*this)</tt>
822 776
    NetworkSimplex& supplyType(SupplyType supply_type) {
823 777
      _stype = supply_type;
824 778
      return *this;
825 779
    }
... ...
@@ -832,79 +786,83 @@
832 786
    /// @{
833 787

	
834 788
    /// \brief Run the algorithm.
835 789
    ///
836 790
    /// This function runs the algorithm.
837 791
    /// The paramters can be specified using functions \ref lowerMap(),
838
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply(), 
792
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply(),
839 793
    /// \ref supplyType().
840 794
    /// For example,
841 795
    /// \code
842 796
    ///   NetworkSimplex<ListDigraph> ns(graph);
843 797
    ///   ns.lowerMap(lower).upperMap(upper).costMap(cost)
844 798
    ///     .supplyMap(sup).run();
845 799
    /// \endcode
846 800
    ///
847
    /// This function can be called more than once. All the parameters
848
    /// that have been given are kept for the next call, unless
849
    /// \ref reset() is called, thus only the modified parameters
850
    /// have to be set again. See \ref reset() for examples.
851
    /// However the underlying digraph must not be modified after this
852
    /// class have been constructed, since it copies and extends the graph.
801
    /// This function can be called more than once. All the given parameters
802
    /// are kept for the next call, unless \ref resetParams() or \ref reset()
803
    /// is used, thus only the modified parameters have to be set again.
804
    /// If the underlying digraph was also modified after the construction
805
    /// of the class (or the last \ref reset() call), then the \ref reset()
806
    /// function must be called.
853 807
    ///
854 808
    /// \param pivot_rule The pivot rule that will be used during the
855
    /// algorithm. For more information see \ref PivotRule.
809
    /// algorithm. For more information, see \ref PivotRule.
856 810
    ///
857 811
    /// \return \c INFEASIBLE if no feasible flow exists,
858 812
    /// \n \c OPTIMAL if the problem has optimal solution
859 813
    /// (i.e. it is feasible and bounded), and the algorithm has found
860 814
    /// optimal flow and node potentials (primal and dual solutions),
861 815
    /// \n \c UNBOUNDED if the objective function of the problem is
862 816
    /// unbounded, i.e. there is a directed cycle having negative total
863 817
    /// cost and infinite upper bound.
864 818
    ///
865 819
    /// \see ProblemType, PivotRule
820
    /// \see resetParams(), reset()
866 821
    ProblemType run(PivotRule pivot_rule = BLOCK_SEARCH) {
867 822
      if (!init()) return INFEASIBLE;
868 823
      return start(pivot_rule);
869 824
    }
870 825

	
871 826
    /// \brief Reset all the parameters that have been given before.
872 827
    ///
873 828
    /// This function resets all the paramaters that have been given
874 829
    /// before using functions \ref lowerMap(), \ref upperMap(),
875 830
    /// \ref costMap(), \ref supplyMap(), \ref stSupply(), \ref supplyType().
876 831
    ///
877
    /// It is useful for multiple run() calls. If this function is not
878
    /// used, all the parameters given before are kept for the next
879
    /// \ref run() call.
880
    /// However the underlying digraph must not be modified after this
881
    /// class have been constructed, since it copies and extends the graph.
832
    /// It is useful for multiple \ref run() calls. Basically, all the given
833
    /// parameters are kept for the next \ref run() call, unless
834
    /// \ref resetParams() or \ref reset() is used.
835
    /// If the underlying digraph was also modified after the construction
836
    /// of the class or the last \ref reset() call, then the \ref reset()
837
    /// function must be used, otherwise \ref resetParams() is sufficient.
882 838
    ///
883 839
    /// For example,
884 840
    /// \code
885 841
    ///   NetworkSimplex<ListDigraph> ns(graph);
886 842
    ///
887 843
    ///   // First run
888 844
    ///   ns.lowerMap(lower).upperMap(upper).costMap(cost)
889 845
    ///     .supplyMap(sup).run();
890 846
    ///
891
    ///   // Run again with modified cost map (reset() is not called,
847
    ///   // Run again with modified cost map (resetParams() is not called,
892 848
    ///   // so only the cost map have to be set again)
893 849
    ///   cost[e] += 100;
894 850
    ///   ns.costMap(cost).run();
895 851
    ///
896
    ///   // Run again from scratch using reset()
852
    ///   // Run again from scratch using resetParams()
897 853
    ///   // (the lower bounds will be set to zero on all arcs)
898
    ///   ns.reset();
854
    ///   ns.resetParams();
899 855
    ///   ns.upperMap(capacity).costMap(cost)
900 856
    ///     .supplyMap(sup).run();
901 857
    /// \endcode
902 858
    ///
903 859
    /// \return <tt>(*this)</tt>
904
    NetworkSimplex& reset() {
860
    ///
861
    /// \see reset(), run()
862
    NetworkSimplex& resetParams() {
905 863
      for (int i = 0; i != _node_num; ++i) {
906 864
        _supply[i] = 0;
907 865
      }
908 866
      for (int i = 0; i != _arc_num; ++i) {
909 867
        _lower[i] = 0;
910 868
        _upper[i] = INF;
... ...
@@ -912,12 +870,89 @@
912 870
      }
913 871
      _have_lower = false;
914 872
      _stype = GEQ;
915 873
      return *this;
916 874
    }
917 875

	
876
    /// \brief Reset the internal data structures and all the parameters
877
    /// that have been given before.
878
    ///
879
    /// This function resets the internal data structures and all the
880
    /// paramaters that have been given before using functions \ref lowerMap(),
881
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply(),
882
    /// \ref supplyType().
883
    ///
884
    /// It is useful for multiple \ref run() calls. Basically, all the given
885
    /// parameters are kept for the next \ref run() call, unless
886
    /// \ref resetParams() or \ref reset() is used.
887
    /// If the underlying digraph was also modified after the construction
888
    /// of the class or the last \ref reset() call, then the \ref reset()
889
    /// function must be used, otherwise \ref resetParams() is sufficient.
890
    ///
891
    /// See \ref resetParams() for examples.
892
    ///
893
    /// \return <tt>(*this)</tt>
894
    ///
895
    /// \see resetParams(), run()
896
    NetworkSimplex& reset() {
897
      // Resize vectors
898
      _node_num = countNodes(_graph);
899
      _arc_num = countArcs(_graph);
900
      int all_node_num = _node_num + 1;
901
      int max_arc_num = _arc_num + 2 * _node_num;
902

	
903
      _source.resize(max_arc_num);
904
      _target.resize(max_arc_num);
905

	
906
      _lower.resize(_arc_num);
907
      _upper.resize(_arc_num);
908
      _cap.resize(max_arc_num);
909
      _cost.resize(max_arc_num);
910
      _supply.resize(all_node_num);
911
      _flow.resize(max_arc_num);
912
      _pi.resize(all_node_num);
913

	
914
      _parent.resize(all_node_num);
915
      _pred.resize(all_node_num);
916
      _forward.resize(all_node_num);
917
      _thread.resize(all_node_num);
918
      _rev_thread.resize(all_node_num);
919
      _succ_num.resize(all_node_num);
920
      _last_succ.resize(all_node_num);
921
      _state.resize(max_arc_num);
922

	
923
      // Copy the graph
924
      int i = 0;
925
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
926
        _node_id[n] = i;
927
      }
928
      if (_arc_mixing) {
929
        // Store the arcs in a mixed order
930
        int k = std::max(int(std::sqrt(double(_arc_num))), 10);
931
        int i = 0, j = 0;
932
        for (ArcIt a(_graph); a != INVALID; ++a) {
933
          _arc_id[a] = i;
934
          _source[i] = _node_id[_graph.source(a)];
935
          _target[i] = _node_id[_graph.target(a)];
936
          if ((i += k) >= _arc_num) i = ++j;
937
        }
938
      } else {
939
        // Store the arcs in the original order
940
        int i = 0;
941
        for (ArcIt a(_graph); a != INVALID; ++a, ++i) {
942
          _arc_id[a] = i;
943
          _source[i] = _node_id[_graph.source(a)];
944
          _target[i] = _node_id[_graph.target(a)];
945
        }
946
      }
947

	
948
      // Reset parameters
949
      resetParams();
950
      return *this;
951
    }
952

	
918 953
    /// @}
919 954

	
920 955
    /// \name Query Functions
921 956
    /// The results of the algorithm can be obtained using these
922 957
    /// functions.\n
923 958
    /// The \ref run() function must be called before using them.
... ...
@@ -1021,15 +1056,15 @@
1021 1056

	
1022 1057
      // Remove non-zero lower bounds
1023 1058
      if (_have_lower) {
1024 1059
        for (int i = 0; i != _arc_num; ++i) {
1025 1060
          Value c = _lower[i];
1026 1061
          if (c >= 0) {
1027
            _cap[i] = _upper[i] < INF ? _upper[i] - c : INF;
1062
            _cap[i] = _upper[i] < MAX ? _upper[i] - c : INF;
1028 1063
          } else {
1029
            _cap[i] = _upper[i] < INF + c ? _upper[i] - c : INF;
1064
            _cap[i] = _upper[i] < MAX + c ? _upper[i] - c : INF;
1030 1065
          }
1031 1066
          _supply[_source[i]] -= c;
1032 1067
          _supply[_target[i]] += c;
1033 1068
        }
1034 1069
      } else {
1035 1070
        for (int i = 0; i != _arc_num; ++i) {
... ...
@@ -1051,13 +1086,13 @@
1051 1086

	
1052 1087
      // Initialize arc maps
1053 1088
      for (int i = 0; i != _arc_num; ++i) {
1054 1089
        _flow[i] = 0;
1055 1090
        _state[i] = STATE_LOWER;
1056 1091
      }
1057
      
1092

	
1058 1093
      // Set data for the artificial root node
1059 1094
      _root = _node_num;
1060 1095
      _parent[_root] = -1;
1061 1096
      _pred[_root] = -1;
1062 1097
      _thread[_root] = 0;
1063 1098
      _rev_thread[0] = _root;
... ...
@@ -1215,24 +1250,24 @@
1215 1250
      int e;
1216 1251

	
1217 1252
      // Search the cycle along the path form the first node to the root
1218 1253
      for (int u = first; u != join; u = _parent[u]) {
1219 1254
        e = _pred[u];
1220 1255
        d = _forward[u] ?
1221
          _flow[e] : (_cap[e] == INF ? INF : _cap[e] - _flow[e]);
1256
          _flow[e] : (_cap[e] >= MAX ? INF : _cap[e] - _flow[e]);
1222 1257
        if (d < delta) {
1223 1258
          delta = d;
1224 1259
          u_out = u;
1225 1260
          result = 1;
1226 1261
        }
1227 1262
      }
1228 1263
      // Search the cycle along the path form the second node to the root
1229 1264
      for (int u = second; u != join; u = _parent[u]) {
1230 1265
        e = _pred[u];
1231
        d = _forward[u] ? 
1232
          (_cap[e] == INF ? INF : _cap[e] - _flow[e]) : _flow[e];
1266
        d = _forward[u] ?
1267
          (_cap[e] >= MAX ? INF : _cap[e] - _flow[e]) : _flow[e];
1233 1268
        if (d <= delta) {
1234 1269
          delta = d;
1235 1270
          u_out = u;
1236 1271
          result = 2;
1237 1272
        }
1238 1273
      }
... ...
@@ -1327,13 +1362,13 @@
1327 1362
      if (old_rev_thread != v_in) {
1328 1363
        _thread[old_rev_thread] = right;
1329 1364
        _rev_thread[right] = old_rev_thread;
1330 1365
      }
1331 1366

	
1332 1367
      // Update _rev_thread using the new _thread values
1333
      for (int i = 0; i < int(_dirty_revs.size()); ++i) {
1368
      for (int i = 0; i != int(_dirty_revs.size()); ++i) {
1334 1369
        u = _dirty_revs[i];
1335 1370
        _rev_thread[_thread[u]] = u;
1336 1371
      }
1337 1372

	
1338 1373
      // Update _pred, _forward, _last_succ and _succ_num for the
1339 1374
      // stem nodes from u_out to u_in
... ...
@@ -1399,12 +1434,106 @@
1399 1434
      int end = _thread[_last_succ[u_in]];
1400 1435
      for (int u = u_in; u != end; u = _thread[u]) {
1401 1436
        _pi[u] += sigma;
1402 1437
      }
1403 1438
    }
1404 1439

	
1440
    // Heuristic initial pivots
1441
    bool initialPivots() {
1442
      Value curr, total = 0;
1443
      std::vector<Node> supply_nodes, demand_nodes;
1444
      for (NodeIt u(_graph); u != INVALID; ++u) {
1445
        curr = _supply[_node_id[u]];
1446
        if (curr > 0) {
1447
          total += curr;
1448
          supply_nodes.push_back(u);
1449
        }
1450
        else if (curr < 0) {
1451
          demand_nodes.push_back(u);
1452
        }
1453
      }
1454
      if (_sum_supply > 0) total -= _sum_supply;
1455
      if (total <= 0) return true;
1456

	
1457
      IntVector arc_vector;
1458
      if (_sum_supply >= 0) {
1459
        if (supply_nodes.size() == 1 && demand_nodes.size() == 1) {
1460
          // Perform a reverse graph search from the sink to the source
1461
          typename GR::template NodeMap<bool> reached(_graph, false);
1462
          Node s = supply_nodes[0], t = demand_nodes[0];
1463
          std::vector<Node> stack;
1464
          reached[t] = true;
1465
          stack.push_back(t);
1466
          while (!stack.empty()) {
1467
            Node u, v = stack.back();
1468
            stack.pop_back();
1469
            if (v == s) break;
1470
            for (InArcIt a(_graph, v); a != INVALID; ++a) {
1471
              if (reached[u = _graph.source(a)]) continue;
1472
              int j = _arc_id[a];
1473
              if (_cap[j] >= total) {
1474
                arc_vector.push_back(j);
1475
                reached[u] = true;
1476
                stack.push_back(u);
1477
              }
1478
            }
1479
          }
1480
        } else {
1481
          // Find the min. cost incomming arc for each demand node
1482
          for (int i = 0; i != int(demand_nodes.size()); ++i) {
1483
            Node v = demand_nodes[i];
1484
            Cost c, min_cost = std::numeric_limits<Cost>::max();
1485
            Arc min_arc = INVALID;
1486
            for (InArcIt a(_graph, v); a != INVALID; ++a) {
1487
              c = _cost[_arc_id[a]];
1488
              if (c < min_cost) {
1489
                min_cost = c;
1490
                min_arc = a;
1491
              }
1492
            }
1493
            if (min_arc != INVALID) {
1494
              arc_vector.push_back(_arc_id[min_arc]);
1495
            }
1496
          }
1497
        }
1498
      } else {
1499
        // Find the min. cost outgoing arc for each supply node
1500
        for (int i = 0; i != int(supply_nodes.size()); ++i) {
1501
          Node u = supply_nodes[i];
1502
          Cost c, min_cost = std::numeric_limits<Cost>::max();
1503
          Arc min_arc = INVALID;
1504
          for (OutArcIt a(_graph, u); a != INVALID; ++a) {
1505
            c = _cost[_arc_id[a]];
1506
            if (c < min_cost) {
1507
              min_cost = c;
1508
              min_arc = a;
1509
            }
1510
          }
1511
          if (min_arc != INVALID) {
1512
            arc_vector.push_back(_arc_id[min_arc]);
1513
          }
1514
        }
1515
      }
1516

	
1517
      // Perform heuristic initial pivots
1518
      for (int i = 0; i != int(arc_vector.size()); ++i) {
1519
        in_arc = arc_vector[i];
1520
        if (_state[in_arc] * (_cost[in_arc] + _pi[_source[in_arc]] -
1521
            _pi[_target[in_arc]]) >= 0) continue;
1522
        findJoinNode();
1523
        bool change = findLeavingArc();
1524
        if (delta >= MAX) return false;
1525
        changeFlow(change);
1526
        if (change) {
1527
          updateTreeStructure();
1528
          updatePotential();
1529
        }
1530
      }
1531
      return true;
1532
    }
1533

	
1405 1534
    // Execute the algorithm
1406 1535
    ProblemType start(PivotRule pivot_rule) {
1407 1536
      // Select the pivot rule implementation
1408 1537
      switch (pivot_rule) {
1409 1538
        case FIRST_ELIGIBLE:
1410 1539
          return start<FirstEligiblePivotRule>();
... ...
@@ -1421,24 +1550,27 @@
1421 1550
    }
1422 1551

	
1423 1552
    template <typename PivotRuleImpl>
1424 1553
    ProblemType start() {
1425 1554
      PivotRuleImpl pivot(*this);
1426 1555

	
1556
      // Perform heuristic initial pivots
1557
      if (!initialPivots()) return UNBOUNDED;
1558

	
1427 1559
      // Execute the Network Simplex algorithm
1428 1560
      while (pivot.findEnteringArc()) {
1429 1561
        findJoinNode();
1430 1562
        bool change = findLeavingArc();
1431
        if (delta >= INF) return UNBOUNDED;
1563
        if (delta >= MAX) return UNBOUNDED;
1432 1564
        changeFlow(change);
1433 1565
        if (change) {
1434 1566
          updateTreeStructure();
1435 1567
          updatePotential();
1436 1568
        }
1437 1569
      }
1438
      
1570

	
1439 1571
      // Check feasibility
1440 1572
      for (int e = _search_arc_num; e != _all_arc_num; ++e) {
1441 1573
        if (_flow[e] != 0) return INFEASIBLE;
1442 1574
      }
1443 1575

	
1444 1576
      // Transform the solution and the supply map to the original form
... ...
@@ -1449,13 +1581,13 @@
1449 1581
            _flow[i] += c;
1450 1582
            _supply[_source[i]] += c;
1451 1583
            _supply[_target[i]] -= c;
1452 1584
          }
1453 1585
        }
1454 1586
      }
1455
      
1587

	
1456 1588
      // Shift potentials to meet the requirements of the GEQ/LEQ type
1457 1589
      // optimality conditions
1458 1590
      if (_sum_supply == 0) {
1459 1591
        if (_stype == GEQ) {
1460 1592
          Cost max_pot = -std::numeric_limits<Cost>::max();
1461 1593
          for (int i = 0; i != _node_num; ++i) {
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -963,26 +963,26 @@
963 963
      static void copy(const From& from, To& to) {
964 964
        to.clear();
965 965
        to.buildRev(from);
966 966
      }
967 967
    };
968 968

	
969
    
969

	
970 970
    template <typename From, typename To,
971 971
              bool revEnable = RevPathTagIndicator<From>::value>
972 972
    struct PathCopySelector {
973 973
      static void copy(const From& from, To& to) {
974 974
        PathCopySelectorForward<From, To>::copy(from, to);
975
      }      
975
      }
976 976
    };
977 977

	
978 978
    template <typename From, typename To>
979 979
    struct PathCopySelector<From, To, true> {
980 980
      static void copy(const From& from, To& to) {
981 981
        PathCopySelectorBackward<From, To>::copy(from, to);
982
      }      
982
      }
983 983
    };
984 984

	
985 985
  }
986 986

	
987 987

	
988 988
  /// \brief Make a copy of a path.
Ignore white space 12 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -49,13 +49,17 @@
49 49
    typedef typename CapacityMap::Value Value;
50 50

	
51 51
    /// \brief The type of the map that stores the flow values.
52 52
    ///
53 53
    /// The type of the map that stores the flow values.
54 54
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
55
#ifdef DOXYGEN
56
    typedef GR::ArcMap<Value> FlowMap;
57
#else
55 58
    typedef typename Digraph::template ArcMap<Value> FlowMap;
59
#endif
56 60

	
57 61
    /// \brief Instantiates a FlowMap.
58 62
    ///
59 63
    /// This function instantiates a \ref FlowMap.
60 64
    /// \param digraph The digraph for which we would like to define
61 65
    /// the flow map.
... ...
@@ -64,15 +68,18 @@
64 68
    }
65 69

	
66 70
    /// \brief The elevator type used by Preflow algorithm.
67 71
    ///
68 72
    /// The elevator type used by Preflow algorithm.
69 73
    ///
70
    /// \sa Elevator
71
    /// \sa LinkedElevator
72
    typedef LinkedElevator<Digraph, typename Digraph::Node> Elevator;
74
    /// \sa Elevator, LinkedElevator
75
#ifdef DOXYGEN
76
    typedef lemon::Elevator<GR, GR::Node> Elevator;
77
#else
78
    typedef lemon::Elevator<Digraph, typename Digraph::Node> Elevator;
79
#endif
73 80

	
74 81
    /// \brief Instantiates an Elevator.
75 82
    ///
76 83
    /// This function instantiates an \ref Elevator.
77 84
    /// \param digraph The digraph for which we would like to define
78 85
    /// the elevator.
... ...
@@ -92,25 +99,34 @@
92 99
  /// \ingroup max_flow
93 100
  ///
94 101
  /// \brief %Preflow algorithm class.
95 102
  ///
96 103
  /// This class provides an implementation of Goldberg-Tarjan's \e preflow
97 104
  /// \e push-relabel algorithm producing a \ref max_flow
98
  /// "flow of maximum value" in a digraph.
105
  /// "flow of maximum value" in a digraph \ref clrs01algorithms,
106
  /// \ref amo93networkflows, \ref goldberg88newapproach.
99 107
  /// The preflow algorithms are the fastest known maximum
100
  /// flow algorithms. The current implementation use a mixture of the
108
  /// flow algorithms. The current implementation uses a mixture of the
101 109
  /// \e "highest label" and the \e "bound decrease" heuristics.
102 110
  /// The worst case time complexity of the algorithm is \f$O(n^2\sqrt{e})\f$.
103 111
  ///
104 112
  /// The algorithm consists of two phases. After the first phase
105 113
  /// the maximum flow value and the minimum cut is obtained. The
106 114
  /// second phase constructs a feasible maximum flow on each arc.
107 115
  ///
116
  /// \warning This implementation cannot handle infinite or very large
117
  /// capacities (e.g. the maximum value of \c CAP::Value).
118
  ///
108 119
  /// \tparam GR The type of the digraph the algorithm runs on.
109 120
  /// \tparam CAP The type of the capacity map. The default map
110 121
  /// type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
122
  /// \tparam TR The traits class that defines various types used by the
123
  /// algorithm. By default, it is \ref PreflowDefaultTraits
124
  /// "PreflowDefaultTraits<GR, CAP>".
125
  /// In most cases, this parameter should not be set directly,
126
  /// consider to use the named template parameters instead.
111 127
#ifdef DOXYGEN
112 128
  template <typename GR, typename CAP, typename TR>
113 129
#else
114 130
  template <typename GR,
115 131
            typename CAP = typename GR::template ArcMap<int>,
116 132
            typename TR = PreflowDefaultTraits<GR, CAP> >
... ...
@@ -254,13 +270,13 @@
254 270
    ///
255 271
    /// \ref named-templ-param "Named parameter" for setting Elevator
256 272
    /// type with automatic allocation.
257 273
    /// The Elevator should have standard constructor interface to be
258 274
    /// able to automatically created by the algorithm (i.e. the
259 275
    /// digraph and the maximum level should be passed to it).
260
    /// However an external elevator object could also be passed to the
276
    /// However, an external elevator object could also be passed to the
261 277
    /// algorithm with the \ref elevator(Elevator&) "elevator()" function
262 278
    /// before calling \ref run() or \ref init().
263 279
    /// \sa SetElevator
264 280
    template <typename T>
265 281
    struct SetStandardElevator
266 282
      : public Preflow<Digraph, CapacityMap,
... ...
@@ -368,32 +384,34 @@
368 384
    /// \pre Either \ref run() or \ref init() must be called before
369 385
    /// using this function.
370 386
    const Elevator& elevator() const {
371 387
      return *_level;
372 388
    }
373 389

	
374
    /// \brief Sets the tolerance used by algorithm.
390
    /// \brief Sets the tolerance used by the algorithm.
375 391
    ///
376
    /// Sets the tolerance used by algorithm.
392
    /// Sets the tolerance object used by the algorithm.
393
    /// \return <tt>(*this)</tt>
377 394
    Preflow& tolerance(const Tolerance& tolerance) {
378 395
      _tolerance = tolerance;
379 396
      return *this;
380 397
    }
381 398

	
382 399
    /// \brief Returns a const reference to the tolerance.
383 400
    ///
384
    /// Returns a const reference to the tolerance.
401
    /// Returns a const reference to the tolerance object used by
402
    /// the algorithm.
385 403
    const Tolerance& tolerance() const {
386 404
      return _tolerance;
387 405
    }
388 406

	
389 407
    /// \name Execution Control
390 408
    /// The simplest way to execute the preflow algorithm is to use
391 409
    /// \ref run() or \ref runMinCut().\n
392
    /// If you need more control on the initial solution or the execution,
393
    /// first you have to call one of the \ref init() functions, then
410
    /// If you need better control on the initial solution or the execution,
411
    /// you have to call one of the \ref init() functions first, then
394 412
    /// \ref startFirstPhase() and if you need it \ref startSecondPhase().
395 413

	
396 414
    ///@{
397 415

	
398 416
    /// \brief Initializes the internal data structures.
399 417
    ///
Ignore white space 6 line context
... ...
@@ -16,72 +16,70 @@
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_RADIX_HEAP_H
20 20
#define LEMON_RADIX_HEAP_H
21 21

	
22
///\ingroup auxdat
22
///\ingroup heaps
23 23
///\file
24
///\brief Radix Heap implementation.
24
///\brief Radix heap implementation.
25 25

	
26 26
#include <vector>
27 27
#include <lemon/error.h>
28 28

	
29 29
namespace lemon {
30 30

	
31 31

	
32
  /// \ingroup auxdata
32
  /// \ingroup heaps
33 33
  ///
34
  /// \brief A Radix Heap implementation.
34
  /// \brief Radix heap data structure.
35 35
  ///
36
  /// This class implements the \e radix \e heap data structure. A \e heap
37
  /// is a data structure for storing items with specified values called \e
38
  /// priorities in such a way that finding the item with minimum priority is
39
  /// efficient. This heap type can store only items with \e int priority.
40
  /// In a heap one can change the priority of an item, add or erase an
41
  /// item, but the priority cannot be decreased under the last removed
42
  /// item's priority.
36
  /// This class implements the \e radix \e heap data structure.
37
  /// It practically conforms to the \ref concepts::Heap "heap concept",
38
  /// but it has some limitations due its special implementation.
39
  /// The type of the priorities must be \c int and the priority of an
40
  /// item cannot be decreased under the priority of the last removed item.
43 41
  ///
44
  /// \param IM A read and writable Item int map, used internally
45
  /// to handle the cross references.
46
  ///
47
  /// \see BinHeap
48
  /// \see Dijkstra
42
  /// \tparam IM A read-writable item map with \c int values, used
43
  /// internally to handle the cross references.
49 44
  template <typename IM>
50 45
  class RadixHeap {
51 46

	
52 47
  public:
53
    typedef typename IM::Key Item;
48

	
49
    /// Type of the item-int map.
50
    typedef IM ItemIntMap;
51
    /// Type of the priorities.
54 52
    typedef int Prio;
55
    typedef IM ItemIntMap;
53
    /// Type of the items stored in the heap.
54
    typedef typename ItemIntMap::Key Item;
56 55

	
57 56
    /// \brief Exception thrown by RadixHeap.
58 57
    ///
59
    /// This Exception is thrown when a smaller priority
60
    /// is inserted into the \e RadixHeap then the last time erased.
58
    /// This exception is thrown when an item is inserted into a
59
    /// RadixHeap with a priority smaller than the last erased one.
61 60
    /// \see RadixHeap
62

	
63
    class UnderFlowPriorityError : public Exception {
61
    class PriorityUnderflowError : public Exception {
64 62
    public:
65 63
      virtual const char* what() const throw() {
66
        return "lemon::RadixHeap::UnderFlowPriorityError";
64
        return "lemon::RadixHeap::PriorityUnderflowError";
67 65
      }
68 66
    };
69 67

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

	
84 82
  private:
85 83

	
86 84
    struct RadixItem {
87 85
      int prev, next, box;
... ...
@@ -93,326 +91,333 @@
93 91
    struct RadixBox {
94 92
      int first;
95 93
      int min, size;
96 94
      RadixBox(int _min, int _size) : first(-1), min(_min), size(_size) {}
97 95
    };
98 96

	
99
    std::vector<RadixItem> data;
100
    std::vector<RadixBox> boxes;
97
    std::vector<RadixItem> _data;
98
    std::vector<RadixBox> _boxes;
101 99

	
102 100
    ItemIntMap &_iim;
103 101

	
102
  public:
104 103

	
105
  public:
106
    /// \brief The constructor.
104
    /// \brief Constructor.
107 105
    ///
108
    /// The constructor.
109
    ///
110
    /// \param map It should be given to the constructor, since it is used
111
    /// internally to handle the cross references. The value of the map
112
    /// should be PRE_HEAP (-1) for each element.
113
    ///
114
    /// \param minimal The initial minimal value of the heap.
115
    /// \param capacity It determines the initial capacity of the heap.
116
    RadixHeap(ItemIntMap &map, int minimal = 0, int capacity = 0)
117
      : _iim(map) {
118
      boxes.push_back(RadixBox(minimal, 1));
119
      boxes.push_back(RadixBox(minimal + 1, 1));
120
      while (lower(boxes.size() - 1, capacity + minimal - 1)) {
106
    /// Constructor.
107
    /// \param map A map that assigns \c int values to the items.
108
    /// It is used internally to handle the cross references.
109
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
110
    /// \param minimum The initial minimum value of the heap.
111
    /// \param capacity The initial capacity of the heap.
112
    RadixHeap(ItemIntMap &map, int minimum = 0, int capacity = 0)
113
      : _iim(map)
114
    {
115
      _boxes.push_back(RadixBox(minimum, 1));
116
      _boxes.push_back(RadixBox(minimum + 1, 1));
117
      while (lower(_boxes.size() - 1, capacity + minimum - 1)) {
121 118
        extend();
122 119
      }
123 120
    }
124 121

	
125
    /// The number of items stored in the heap.
122
    /// \brief The number of items stored in the heap.
126 123
    ///
127
    /// \brief Returns the number of items stored in the heap.
128
    int size() const { return data.size(); }
129
    /// \brief Checks if the heap stores no items.
124
    /// This function returns the number of items stored in the heap.
125
    int size() const { return _data.size(); }
126

	
127
    /// \brief Check if the heap is empty.
130 128
    ///
131
    /// Returns \c true if and only if the heap stores no items.
132
    bool empty() const { return data.empty(); }
129
    /// This function returns \c true if the heap is empty.
130
    bool empty() const { return _data.empty(); }
133 131

	
134
    /// \brief Make empty this heap.
132
    /// \brief Make the heap empty.
135 133
    ///
136
    /// Make empty this heap. It does not change the cross reference
137
    /// map.  If you want to reuse a heap what is not surely empty you
138
    /// should first clear the heap and after that you should set the
139
    /// cross reference map for each item to \c PRE_HEAP.
140
    void clear(int minimal = 0, int capacity = 0) {
141
      data.clear(); boxes.clear();
142
      boxes.push_back(RadixBox(minimal, 1));
143
      boxes.push_back(RadixBox(minimal + 1, 1));
144
      while (lower(boxes.size() - 1, capacity + minimal - 1)) {
134
    /// This functon makes the heap empty.
135
    /// It does not change the cross reference map. If you want to reuse
136
    /// a heap that is not surely empty, you should first clear it and
137
    /// then you should set the cross reference map to \c PRE_HEAP
138
    /// for each item.
139
    /// \param minimum The minimum value of the heap.
140
    /// \param capacity The capacity of the heap.
141
    void clear(int minimum = 0, int capacity = 0) {
142
      _data.clear(); _boxes.clear();
143
      _boxes.push_back(RadixBox(minimum, 1));
144
      _boxes.push_back(RadixBox(minimum + 1, 1));
145
      while (lower(_boxes.size() - 1, capacity + minimum - 1)) {
145 146
        extend();
146 147
      }
147 148
    }
148 149

	
149 150
  private:
150 151

	
151 152
    bool upper(int box, Prio pr) {
152
      return pr < boxes[box].min;
153
      return pr < _boxes[box].min;
153 154
    }
154 155

	
155 156
    bool lower(int box, Prio pr) {
156
      return pr >= boxes[box].min + boxes[box].size;
157
      return pr >= _boxes[box].min + _boxes[box].size;
157 158
    }
158 159

	
159
    /// \brief Remove item from the box list.
160
    // Remove item from the box list
160 161
    void remove(int index) {
161
      if (data[index].prev >= 0) {
162
        data[data[index].prev].next = data[index].next;
162
      if (_data[index].prev >= 0) {
163
        _data[_data[index].prev].next = _data[index].next;
163 164
      } else {
164
        boxes[data[index].box].first = data[index].next;
165
        _boxes[_data[index].box].first = _data[index].next;
165 166
      }
166
      if (data[index].next >= 0) {
167
        data[data[index].next].prev = data[index].prev;
167
      if (_data[index].next >= 0) {
168
        _data[_data[index].next].prev = _data[index].prev;
168 169
      }
169 170
    }
170 171

	
171
    /// \brief Insert item into the box list.
172
    // Insert item into the box list
172 173
    void insert(int box, int index) {
173
      if (boxes[box].first == -1) {
174
        boxes[box].first = index;
175
        data[index].next = data[index].prev = -1;
174
      if (_boxes[box].first == -1) {
175
        _boxes[box].first = index;
176
        _data[index].next = _data[index].prev = -1;
176 177
      } else {
177
        data[index].next = boxes[box].first;
178
        data[boxes[box].first].prev = index;
179
        data[index].prev = -1;
180
        boxes[box].first = index;
178
        _data[index].next = _boxes[box].first;
179
        _data[_boxes[box].first].prev = index;
180
        _data[index].prev = -1;
181
        _boxes[box].first = index;
181 182
      }
182
      data[index].box = box;
183
      _data[index].box = box;
183 184
    }
184 185

	
185
    /// \brief Add a new box to the box list.
186
    // Add a new box to the box list
186 187
    void extend() {
187
      int min = boxes.back().min + boxes.back().size;
188
      int bs = 2 * boxes.back().size;
189
      boxes.push_back(RadixBox(min, bs));
188
      int min = _boxes.back().min + _boxes.back().size;
189
      int bs = 2 * _boxes.back().size;
190
      _boxes.push_back(RadixBox(min, bs));
190 191
    }
191 192

	
192
    /// \brief Move an item up into the proper box.
193
    void bubble_up(int index) {
194
      if (!lower(data[index].box, data[index].prio)) return;
193
    // Move an item up into the proper box.
194
    void bubbleUp(int index) {
195
      if (!lower(_data[index].box, _data[index].prio)) return;
195 196
      remove(index);
196
      int box = findUp(data[index].box, data[index].prio);
197
      int box = findUp(_data[index].box, _data[index].prio);
197 198
      insert(box, index);
198 199
    }
199 200

	
200
    /// \brief Find up the proper box for the item with the given prio.
201
    // Find up the proper box for the item with the given priority
201 202
    int findUp(int start, int pr) {
202 203
      while (lower(start, pr)) {
203
        if (++start == int(boxes.size())) {
204
        if (++start == int(_boxes.size())) {
204 205
          extend();
205 206
        }
206 207
      }
207 208
      return start;
208 209
    }
209 210

	
210
    /// \brief Move an item down into the proper box.
211
    void bubble_down(int index) {
212
      if (!upper(data[index].box, data[index].prio)) return;
211
    // Move an item down into the proper box
212
    void bubbleDown(int index) {
213
      if (!upper(_data[index].box, _data[index].prio)) return;
213 214
      remove(index);
214
      int box = findDown(data[index].box, data[index].prio);
215
      int box = findDown(_data[index].box, _data[index].prio);
215 216
      insert(box, index);
216 217
    }
217 218

	
218
    /// \brief Find up the proper box for the item with the given prio.
219
    // Find down the proper box for the item with the given priority
219 220
    int findDown(int start, int pr) {
220 221
      while (upper(start, pr)) {
221
        if (--start < 0) throw UnderFlowPriorityError();
222
        if (--start < 0) throw PriorityUnderflowError();
222 223
      }
223 224
      return start;
224 225
    }
225 226

	
226
    /// \brief Find the first not empty box.
227
    // Find the first non-empty box
227 228
    int findFirst() {
228 229
      int first = 0;
229
      while (boxes[first].first == -1) ++first;
230
      while (_boxes[first].first == -1) ++first;
230 231
      return first;
231 232
    }
232 233

	
233
    /// \brief Gives back the minimal prio of the box.
234
    // Gives back the minimum priority of the given box
234 235
    int minValue(int box) {
235
      int min = data[boxes[box].first].prio;
236
      for (int k = boxes[box].first; k != -1; k = data[k].next) {
237
        if (data[k].prio < min) min = data[k].prio;
236
      int min = _data[_boxes[box].first].prio;
237
      for (int k = _boxes[box].first; k != -1; k = _data[k].next) {
238
        if (_data[k].prio < min) min = _data[k].prio;
238 239
      }
239 240
      return min;
240 241
    }
241 242

	
242
    /// \brief Rearrange the items of the heap and makes the
243
    /// first box not empty.
243
    // Rearrange the items of the heap and make the first box non-empty
244 244
    void moveDown() {
245 245
      int box = findFirst();
246 246
      if (box == 0) return;
247 247
      int min = minValue(box);
248 248
      for (int i = 0; i <= box; ++i) {
249
        boxes[i].min = min;
250
        min += boxes[i].size;
249
        _boxes[i].min = min;
250
        min += _boxes[i].size;
251 251
      }
252
      int curr = boxes[box].first, next;
252
      int curr = _boxes[box].first, next;
253 253
      while (curr != -1) {
254
        next = data[curr].next;
255
        bubble_down(curr);
254
        next = _data[curr].next;
255
        bubbleDown(curr);
256 256
        curr = next;
257 257
      }
258 258
    }
259 259

	
260
    void relocate_last(int index) {
261
      if (index != int(data.size()) - 1) {
262
        data[index] = data.back();
263
        if (data[index].prev != -1) {
264
          data[data[index].prev].next = index;
260
    void relocateLast(int index) {
261
      if (index != int(_data.size()) - 1) {
262
        _data[index] = _data.back();
263
        if (_data[index].prev != -1) {
264
          _data[_data[index].prev].next = index;
265 265
        } else {
266
          boxes[data[index].box].first = index;
266
          _boxes[_data[index].box].first = index;
267 267
        }
268
        if (data[index].next != -1) {
269
          data[data[index].next].prev = index;
268
        if (_data[index].next != -1) {
269
          _data[_data[index].next].prev = index;
270 270
        }
271
        _iim[data[index].item] = index;
271
        _iim[_data[index].item] = index;
272 272
      }
273
      data.pop_back();
273
      _data.pop_back();
274 274
    }
275 275

	
276 276
  public:
277 277

	
278 278
    /// \brief Insert an item into the heap with the given priority.
279 279
    ///
280
    /// Adds \c i to the heap with priority \c p.
280
    /// This function inserts the given item into the heap with the
281
    /// given priority.
281 282
    /// \param i The item to insert.
282 283
    /// \param p The priority of the item.
284
    /// \pre \e i must not be stored in the heap.
285
    /// \warning This method may throw an \c UnderFlowPriorityException.
283 286
    void push(const Item &i, const Prio &p) {
284
      int n = data.size();
287
      int n = _data.size();
285 288
      _iim.set(i, n);
286
      data.push_back(RadixItem(i, p));
287
      while (lower(boxes.size() - 1, p)) {
289
      _data.push_back(RadixItem(i, p));
290
      while (lower(_boxes.size() - 1, p)) {
288 291
        extend();
289 292
      }
290
      int box = findDown(boxes.size() - 1, p);
293
      int box = findDown(_boxes.size() - 1, p);
291 294
      insert(box, n);
292 295
    }
293 296

	
294
    /// \brief Returns the item with minimum priority.
297
    /// \brief Return the item having minimum priority.
295 298
    ///
296
    /// This method returns the item with minimum priority.
297
    /// \pre The heap must be nonempty.
299
    /// This function returns the item having minimum priority.
300
    /// \pre The heap must be non-empty.
298 301
    Item top() const {
299 302
      const_cast<RadixHeap<ItemIntMap>&>(*this).moveDown();
300
      return data[boxes[0].first].item;
303
      return _data[_boxes[0].first].item;
301 304
    }
302 305

	
303
    /// \brief Returns the minimum priority.
306
    /// \brief The minimum priority.
304 307
    ///
305
    /// It returns the minimum priority.
306
    /// \pre The heap must be nonempty.
308
    /// This function returns the minimum priority.
309
    /// \pre The heap must be non-empty.
307 310
    Prio prio() const {
308 311
      const_cast<RadixHeap<ItemIntMap>&>(*this).moveDown();
309
      return data[boxes[0].first].prio;
312
      return _data[_boxes[0].first].prio;
310 313
     }
311 314

	
312
    /// \brief Deletes the item with minimum priority.
315
    /// \brief Remove the item having minimum priority.
313 316
    ///
314
    /// This method deletes the item with minimum priority.
317
    /// This function removes the item having minimum priority.
315 318
    /// \pre The heap must be non-empty.
316 319
    void pop() {
317 320
      moveDown();
318
      int index = boxes[0].first;
319
      _iim[data[index].item] = POST_HEAP;
321
      int index = _boxes[0].first;
322
      _iim[_data[index].item] = POST_HEAP;
320 323
      remove(index);
321
      relocate_last(index);
324
      relocateLast(index);
322 325
    }
323 326

	
324
    /// \brief Deletes \c i from the heap.
327
    /// \brief Remove the given item from the heap.
325 328
    ///
326
    /// This method deletes item \c i from the heap, if \c i was
327
    /// already stored in the heap.
328
    /// \param i The item to erase.
329
    /// This function removes the given item from the heap if it is
330
    /// already stored.
331
    /// \param i The item to delete.
332
    /// \pre \e i must be in the heap.
329 333
    void erase(const Item &i) {
330 334
      int index = _iim[i];
331 335
      _iim[i] = POST_HEAP;
332 336
      remove(index);
333
      relocate_last(index);
337
      relocateLast(index);
334 338
   }
335 339

	
336
    /// \brief Returns the priority of \c i.
340
    /// \brief The priority of the given item.
337 341
    ///
338
    /// This function returns the priority of item \c i.
339
    /// \pre \c i must be in the heap.
342
    /// This function returns the priority of the given item.
340 343
    /// \param i The item.
344
    /// \pre \e i must be in the heap.
341 345
    Prio operator[](const Item &i) const {
342 346
      int idx = _iim[i];
343
      return data[idx].prio;
347
      return _data[idx].prio;
344 348
    }
345 349

	
346
    /// \brief \c i gets to the heap with priority \c p independently
347
    /// if \c i was already there.
350
    /// \brief Set the priority of an item or insert it, if it is
351
    /// not stored in the heap.
348 352
    ///
349
    /// This method calls \ref push(\c i, \c p) if \c i is not stored
350
    /// in the heap and sets the priority of \c i to \c p otherwise.
351
    /// It may throw an \e UnderFlowPriorityException.
353
    /// This method sets the priority of the given item if it is
354
    /// already stored in the heap. Otherwise it inserts the given
355
    /// item into the heap with the given priority.
352 356
    /// \param i The item.
353 357
    /// \param p The priority.
358
    /// \pre \e i must be in the heap.
359
    /// \warning This method may throw an \c UnderFlowPriorityException.
354 360
    void set(const Item &i, const Prio &p) {
355 361
      int idx = _iim[i];
356 362
      if( idx < 0 ) {
357 363
        push(i, p);
358 364
      }
359
      else if( p >= data[idx].prio ) {
360
        data[idx].prio = p;
361
        bubble_up(idx);
365
      else if( p >= _data[idx].prio ) {
366
        _data[idx].prio = p;
367
        bubbleUp(idx);
362 368
      } else {
363
        data[idx].prio = p;
364
        bubble_down(idx);
369
        _data[idx].prio = p;
370
        bubbleDown(idx);
365 371
      }
366 372
    }
367 373

	
368

	
369
    /// \brief Decreases the priority of \c i to \c p.
374
    /// \brief Decrease the priority of an item to the given value.
370 375
    ///
371
    /// This method decreases the priority of item \c i to \c p.
372
    /// \pre \c i must be stored in the heap with priority at least \c p, and
373
    /// \c should be greater or equal to the last removed item's priority.
376
    /// This function decreases the priority of an item to the given value.
374 377
    /// \param i The item.
375 378
    /// \param p The priority.
379
    /// \pre \e i must be stored in the heap with priority at least \e p.
380
    /// \warning This method may throw an \c UnderFlowPriorityException.
376 381
    void decrease(const Item &i, const Prio &p) {
377 382
      int idx = _iim[i];
378
      data[idx].prio = p;
379
      bubble_down(idx);
383
      _data[idx].prio = p;
384
      bubbleDown(idx);
380 385
    }
381 386

	
382
    /// \brief Increases the priority of \c i to \c p.
387
    /// \brief Increase the priority of an item to the given value.
383 388
    ///
384
    /// This method sets the priority of item \c i to \c p.
385
    /// \pre \c i must be stored in the heap with priority at most \c p
389
    /// This function increases the priority of an item to the given value.
386 390
    /// \param i The item.
387 391
    /// \param p The priority.
392
    /// \pre \e i must be stored in the heap with priority at most \e p.
388 393
    void increase(const Item &i, const Prio &p) {
389 394
      int idx = _iim[i];
390
      data[idx].prio = p;
391
      bubble_up(idx);
395
      _data[idx].prio = p;
396
      bubbleUp(idx);
392 397
    }
393 398

	
394
    /// \brief Returns if \c item is in, has already been in, or has
395
    /// never been in the heap.
399
    /// \brief Return the state of an item.
396 400
    ///
397
    /// This method returns PRE_HEAP if \c item has never been in the
398
    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
399
    /// otherwise. In the latter case it is possible that \c item will
400
    /// get back to the heap again.
401
    /// This method returns \c PRE_HEAP if the given item has never
402
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
403
    /// and \c POST_HEAP otherwise.
404
    /// In the latter case it is possible that the item will get back
405
    /// to the heap again.
401 406
    /// \param i The item.
402 407
    State state(const Item &i) const {
403 408
      int s = _iim[i];
404 409
      if( s >= 0 ) s = 0;
405 410
      return State(s);
406 411
    }
407 412

	
408
    /// \brief Sets the state of the \c item in the heap.
413
    /// \brief Set the state of an item in the heap.
409 414
    ///
410
    /// Sets the state of the \c item in the heap. It can be used to
411
    /// manually clear the heap when it is important to achive the
412
    /// better time complexity.
415
    /// This function sets the state of the given item in the heap.
416
    /// It can be used to manually clear the heap when it is important
417
    /// to achive better time complexity.
413 418
    /// \param i The item.
414 419
    /// \param st The state. It should not be \c IN_HEAP.
415 420
    void state(const Item& i, State st) {
416 421
      switch (st) {
417 422
      case POST_HEAP:
418 423
      case PRE_HEAP:
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -29,16 +29,13 @@
29 29
#include <lemon/error.h>
30 30
#include <lemon/bits/graph_extender.h>
31 31

	
32 32
namespace lemon {
33 33

	
34 34
  class SmartDigraph;
35
  ///Base of SmartDigraph
36 35

	
37
  ///Base of SmartDigraph
38
  ///
39 36
  class SmartDigraphBase {
40 37
  protected:
41 38

	
42 39
    struct NodeT
43 40
    {
44 41
      int first_in, first_out;
... ...
@@ -184,119 +181,89 @@
184 181
  typedef DigraphExtender<SmartDigraphBase> ExtendedSmartDigraphBase;
185 182

	
186 183
  ///\ingroup graphs
187 184
  ///
188 185
  ///\brief A smart directed graph class.
189 186
  ///
190
  ///This is a simple and fast digraph implementation.
191
  ///It is also quite memory efficient, but at the price
192
  ///that <b> it does support only limited (only stack-like)
193
  ///node and arc deletions</b>.
194
  ///It fully conforms to the \ref concepts::Digraph "Digraph concept".
187
  ///\ref SmartDigraph is a simple and fast digraph implementation.
188
  ///It is also quite memory efficient but at the price
189
  ///that it does not support node and arc deletion
190
  ///(except for the Snapshot feature).
195 191
  ///
196
  ///\sa concepts::Digraph.
192
  ///This type fully conforms to the \ref concepts::Digraph "Digraph concept"
193
  ///and it also provides some additional functionalities.
194
  ///Most of its member functions and nested classes are documented
195
  ///only in the concept class.
196
  ///
197
  ///This class provides constant time counting for nodes and arcs.
198
  ///
199
  ///\sa concepts::Digraph
200
  ///\sa SmartGraph
197 201
  class SmartDigraph : public ExtendedSmartDigraphBase {
198 202
    typedef ExtendedSmartDigraphBase Parent;
199 203

	
200 204
  private:
201

	
202
    ///SmartDigraph is \e not copy constructible. Use DigraphCopy() instead.
203

	
204
    ///SmartDigraph is \e not copy constructible. Use DigraphCopy() instead.
205
    ///
205
    /// Digraphs are \e not copy constructible. Use DigraphCopy instead.
206 206
    SmartDigraph(const SmartDigraph &) : ExtendedSmartDigraphBase() {};
207
    ///\brief Assignment of SmartDigraph to another one is \e not allowed.
208
    ///Use DigraphCopy() instead.
209

	
210
    ///Assignment of SmartDigraph to another one is \e not allowed.
211
    ///Use DigraphCopy() instead.
207
    /// \brief Assignment of a digraph to another one is \e not allowed.
208
    /// Use DigraphCopy instead.
212 209
    void operator=(const SmartDigraph &) {}
213 210

	
214 211
  public:
215 212

	
216 213
    /// Constructor
217 214

	
218 215
    /// Constructor.
219 216
    ///
220 217
    SmartDigraph() {};
221 218

	
222 219
    ///Add a new node to the digraph.
223 220

	
224
    /// Add a new node to the digraph.
225
    /// \return The new node.
221
    ///This function adds a new node to the digraph.
222
    ///\return The new node.
226 223
    Node addNode() { return Parent::addNode(); }
227 224

	
228 225
    ///Add a new arc to the digraph.
229 226

	
230
    ///Add a new arc to the digraph with source node \c s
227
    ///This function adds a new arc to the digraph with source node \c s
231 228
    ///and target node \c t.
232 229
    ///\return The new arc.
233
    Arc addArc(const Node& s, const Node& t) {
230
    Arc addArc(Node s, Node t) {
234 231
      return Parent::addArc(s, t);
235 232
    }
236 233

	
237
    /// \brief Using this it is possible to avoid the superfluous memory
238
    /// allocation.
239

	
240
    /// Using this it is possible to avoid the superfluous memory
241
    /// allocation: if you know that the digraph you want to build will
242
    /// be very large (e.g. it will contain millions of nodes and/or arcs)
243
    /// then it is worth reserving space for this amount before starting
244
    /// to build the digraph.
245
    /// \sa reserveArc
246
    void reserveNode(int n) { nodes.reserve(n); };
247

	
248
    /// \brief Using this it is possible to avoid the superfluous memory
249
    /// allocation.
250

	
251
    /// Using this it is possible to avoid the superfluous memory
252
    /// allocation: if you know that the digraph you want to build will
253
    /// be very large (e.g. it will contain millions of nodes and/or arcs)
254
    /// then it is worth reserving space for this amount before starting
255
    /// to build the digraph.
256
    /// \sa reserveNode
257
    void reserveArc(int m) { arcs.reserve(m); };
258

	
259 234
    /// \brief Node validity check
260 235
    ///
261
    /// This function gives back true if the given node is valid,
262
    /// ie. it is a real node of the graph.
236
    /// This function gives back \c true if the given node is valid,
237
    /// i.e. it is a real node of the digraph.
263 238
    ///
264 239
    /// \warning A removed node (using Snapshot) could become valid again
265
    /// when new nodes are added to the graph.
240
    /// if new nodes are added to the digraph.
266 241
    bool valid(Node n) const { return Parent::valid(n); }
267 242

	
268 243
    /// \brief Arc validity check
269 244
    ///
270
    /// This function gives back true if the given arc is valid,
271
    /// ie. it is a real arc of the graph.
245
    /// This function gives back \c true if the given arc is valid,
246
    /// i.e. it is a real arc of the digraph.
272 247
    ///
273 248
    /// \warning A removed arc (using Snapshot) could become valid again
274
    /// when new arcs are added to the graph.
249
    /// if new arcs are added to the graph.
275 250
    bool valid(Arc a) const { return Parent::valid(a); }
276 251

	
277
    ///Clear the digraph.
278

	
279
    ///Erase all the nodes and arcs from the digraph.
280
    ///
281
    void clear() {
282
      Parent::clear();
283
    }
284

	
285 252
    ///Split a node.
286 253

	
287
    ///This function splits a node. First a new node is added to the digraph,
288
    ///then the source of each outgoing arc of \c n is moved to this new node.
289
    ///If \c connect is \c true (this is the default value), then a new arc
290
    ///from \c n to the newly created node is also added.
254
    ///This function splits the given node. First, a new node is added
255
    ///to the digraph, then the source of each outgoing arc of node \c n
256
    ///is moved to this new node.
257
    ///If the second parameter \c connect is \c true (this is the default
258
    ///value), then a new arc from node \c n to the newly created node
259
    ///is also added.
291 260
    ///\return The newly created node.
292 261
    ///
293
    ///\note The <tt>Arc</tt>s
294
    ///referencing a moved arc remain
295
    ///valid. However <tt>InArc</tt>'s and <tt>OutArc</tt>'s
296
    ///may be invalidated.
262
    ///\note All iterators remain valid.
263
    ///
297 264
    ///\warning This functionality cannot be used together with the Snapshot
298 265
    ///feature.
299 266
    Node split(Node n, bool connect = true)
300 267
    {
301 268
      Node b = addNode();
302 269
      nodes[b._id].first_out=nodes[n._id].first_out;
... ...
@@ -305,12 +272,40 @@
305 272
        arcs[i].source=b._id;
306 273
      }
307 274
      if(connect) addArc(n,b);
308 275
      return b;
309 276
    }
310 277

	
278
    ///Clear the digraph.
279

	
280
    ///This function erases all nodes and arcs from the digraph.
281
    ///
282
    void clear() {
283
      Parent::clear();
284
    }
285

	
286
    /// Reserve memory for nodes.
287

	
288
    /// Using this function, it is possible to avoid superfluous memory
289
    /// allocation: if you know that the digraph you want to build will
290
    /// be large (e.g. it will contain millions of nodes and/or arcs),
291
    /// then it is worth reserving space for this amount before starting
292
    /// to build the digraph.
293
    /// \sa reserveArc()
294
    void reserveNode(int n) { nodes.reserve(n); };
295

	
296
    /// Reserve memory for arcs.
297

	
298
    /// Using this function, it is possible to avoid superfluous memory
299
    /// allocation: if you know that the digraph you want to build will
300
    /// be large (e.g. it will contain millions of nodes and/or arcs),
301
    /// then it is worth reserving space for this amount before starting
302
    /// to build the digraph.
303
    /// \sa reserveNode()
304
    void reserveArc(int m) { arcs.reserve(m); };
305

	
311 306
  public:
312 307

	
313 308
    class Snapshot;
314 309

	
315 310
  protected:
316 311

	
... ...
@@ -329,70 +324,66 @@
329 324
        nodes.pop_back();
330 325
      }
331 326
    }
332 327

	
333 328
  public:
334 329

	
335
    ///Class to make a snapshot of the digraph and to restrore to it later.
330
    ///Class to make a snapshot of the digraph and to restore it later.
336 331

	
337
    ///Class to make a snapshot of the digraph and to restrore to it later.
332
    ///Class to make a snapshot of the digraph and to restore it later.
338 333
    ///
339 334
    ///The newly added nodes and arcs can be removed using the
340
    ///restore() function.
341
    ///\note After you restore a state, you cannot restore
342
    ///a later state, in other word you cannot add again the arcs deleted
343
    ///by restore() using another one Snapshot instance.
335
    ///restore() function. This is the only way for deleting nodes and/or
336
    ///arcs from a SmartDigraph structure.
344 337
    ///
345
    ///\warning If you do not use correctly the snapshot that can cause
346
    ///either broken program, invalid state of the digraph, valid but
347
    ///not the restored digraph or no change. Because the runtime performance
348
    ///the validity of the snapshot is not stored.
338
    ///\note After a state is restored, you cannot restore a later state,
339
    ///i.e. you cannot add the removed nodes and arcs again using
340
    ///another Snapshot instance.
341
    ///
342
    ///\warning Node splitting cannot be restored.
343
    ///\warning The validity of the snapshot is not stored due to
344
    ///performance reasons. If you do not use the snapshot correctly,
345
    ///it can cause broken program, invalid or not restored state of
346
    ///the digraph or no change.
349 347
    class Snapshot
350 348
    {
351 349
      SmartDigraph *_graph;
352 350
    protected:
353 351
      friend class SmartDigraph;
354 352
      unsigned int node_num;
355 353
      unsigned int arc_num;
356 354
    public:
357 355
      ///Default constructor.
358 356

	
359 357
      ///Default constructor.
360
      ///To actually make a snapshot you must call save().
361
      ///
358
      ///You have to call save() to actually make a snapshot.
362 359
      Snapshot() : _graph(0) {}
363 360
      ///Constructor that immediately makes a snapshot
364 361

	
365
      ///This constructor immediately makes a snapshot of the digraph.
366
      ///\param graph The digraph we make a snapshot of.
367
      Snapshot(SmartDigraph &graph) : _graph(&graph) {
362
      ///This constructor immediately makes a snapshot of the given digraph.
363
      ///
364
      Snapshot(SmartDigraph &gr) : _graph(&gr) {
368 365
        node_num=_graph->nodes.size();
369 366
        arc_num=_graph->arcs.size();
370 367
      }
371 368

	
372 369
      ///Make a snapshot.
373 370

	
374
      ///Make a snapshot of the digraph.
375
      ///
376
      ///This function can be called more than once. In case of a repeated
371
      ///This function makes a snapshot of the given digraph.
372
      ///It can be called more than once. In case of a repeated
377 373
      ///call, the previous snapshot gets lost.
378
      ///\param graph The digraph we make the snapshot of.
379
      void save(SmartDigraph &graph)
380
      {
381
        _graph=&graph;
374
      void save(SmartDigraph &gr) {
375
        _graph=&gr;
382 376
        node_num=_graph->nodes.size();
383 377
        arc_num=_graph->arcs.size();
384 378
      }
385 379

	
386 380
      ///Undo the changes until a snapshot.
387 381

	
388
      ///Undo the changes until a snapshot created by save().
389
      ///
390
      ///\note After you restored a state, you cannot restore
391
      ///a later state, in other word you cannot add again the arcs deleted
392
      ///by restore().
382
      ///This function undos the changes until the last snapshot
383
      ///created by save() or Snapshot(SmartDigraph&).
393 384
      void restore()
394 385
      {
395 386
        _graph->restoreSnapshot(*this);
396 387
      }
397 388
    };
398 389
  };
... ...
@@ -505,29 +496,29 @@
505 496
    }
506 497

	
507 498
    void first(Node& node) const {
508 499
      node._id = nodes.size() - 1;
509 500
    }
510 501

	
511
    void next(Node& node) const {
502
    static void next(Node& node) {
512 503
      --node._id;
513 504
    }
514 505

	
515 506
    void first(Arc& arc) const {
516 507
      arc._id = arcs.size() - 1;
517 508
    }
518 509

	
519
    void next(Arc& arc) const {
510
    static void next(Arc& arc) {
520 511
      --arc._id;
521 512
    }
522 513

	
523 514
    void first(Edge& arc) const {
524 515
      arc._id = arcs.size() / 2 - 1;
525 516
    }
526 517

	
527
    void next(Edge& arc) const {
518
    static void next(Edge& arc) {
528 519
      --arc._id;
529 520
    }
530 521

	
531 522
    void firstOut(Arc &arc, const Node& v) const {
532 523
      arc._id = nodes[v._id].first_out;
533 524
    }
... ...
@@ -618,95 +609,115 @@
618 609
  typedef GraphExtender<SmartGraphBase> ExtendedSmartGraphBase;
619 610

	
620 611
  /// \ingroup graphs
621 612
  ///
622 613
  /// \brief A smart undirected graph class.
623 614
  ///
624
  /// This is a simple and fast graph implementation.
625
  /// It is also quite memory efficient, but at the price
626
  /// that <b> it does support only limited (only stack-like)
627
  /// node and arc deletions</b>.
628
  /// It fully conforms to the \ref concepts::Graph "Graph concept".
615
  /// \ref SmartGraph is a simple and fast graph implementation.
616
  /// It is also quite memory efficient but at the price
617
  /// that it does not support node and edge deletion
618
  /// (except for the Snapshot feature).
629 619
  ///
630
  /// \sa concepts::Graph.
620
  /// This type fully conforms to the \ref concepts::Graph "Graph concept"
621
  /// and it also provides some additional functionalities.
622
  /// Most of its member functions and nested classes are documented
623
  /// only in the concept class.
624
  ///
625
  /// This class provides constant time counting for nodes, edges and arcs.
626
  ///
627
  /// \sa concepts::Graph
628
  /// \sa SmartDigraph
631 629
  class SmartGraph : public ExtendedSmartGraphBase {
632 630
    typedef ExtendedSmartGraphBase Parent;
633 631

	
634 632
  private:
635

	
636
    ///SmartGraph is \e not copy constructible. Use GraphCopy() instead.
637

	
638
    ///SmartGraph is \e not copy constructible. Use GraphCopy() instead.
639
    ///
633
    /// Graphs are \e not copy constructible. Use GraphCopy instead.
640 634
    SmartGraph(const SmartGraph &) : ExtendedSmartGraphBase() {};
641

	
642
    ///\brief Assignment of SmartGraph to another one is \e not allowed.
643
    ///Use GraphCopy() instead.
644

	
645
    ///Assignment of SmartGraph to another one is \e not allowed.
646
    ///Use GraphCopy() instead.
635
    /// \brief Assignment of a graph to another one is \e not allowed.
636
    /// Use GraphCopy instead.
647 637
    void operator=(const SmartGraph &) {}
648 638

	
649 639
  public:
650 640

	
651 641
    /// Constructor
652 642

	
653 643
    /// Constructor.
654 644
    ///
655 645
    SmartGraph() {}
656 646

	
657
    ///Add a new node to the graph.
658

	
659
    /// Add a new node to the graph.
647
    /// \brief Add a new node to the graph.
648
    ///
649
    /// This function adds a new node to the graph.
660 650
    /// \return The new node.
661 651
    Node addNode() { return Parent::addNode(); }
662 652

	
663
    ///Add a new edge to the graph.
664

	
665
    ///Add a new edge to the graph with node \c s
666
    ///and \c t.
667
    ///\return The new edge.
668
    Edge addEdge(const Node& s, const Node& t) {
669
      return Parent::addEdge(s, t);
653
    /// \brief Add a new edge to the graph.
654
    ///
655
    /// This function adds a new edge to the graph between nodes
656
    /// \c u and \c v with inherent orientation from node \c u to
657
    /// node \c v.
658
    /// \return The new edge.
659
    Edge addEdge(Node u, Node v) {
660
      return Parent::addEdge(u, v);
670 661
    }
671 662

	
672 663
    /// \brief Node validity check
673 664
    ///
674
    /// This function gives back true if the given node is valid,
675
    /// ie. it is a real node of the graph.
665
    /// This function gives back \c true if the given node is valid,
666
    /// i.e. it is a real node of the graph.
676 667
    ///
677 668
    /// \warning A removed node (using Snapshot) could become valid again
678
    /// when new nodes are added to the graph.
669
    /// if new nodes are added to the graph.
679 670
    bool valid(Node n) const { return Parent::valid(n); }
680 671

	
672
    /// \brief Edge validity check
673
    ///
674
    /// This function gives back \c true if the given edge is valid,
675
    /// i.e. it is a real edge of the graph.
676
    ///
677
    /// \warning A removed edge (using Snapshot) could become valid again
678
    /// if new edges are added to the graph.
679
    bool valid(Edge e) const { return Parent::valid(e); }
680

	
681 681
    /// \brief Arc validity check
682 682
    ///
683
    /// This function gives back true if the given arc is valid,
684
    /// ie. it is a real arc of the graph.
683
    /// This function gives back \c true if the given arc is valid,
684
    /// i.e. it is a real arc of the graph.
685 685
    ///
686 686
    /// \warning A removed arc (using Snapshot) could become valid again
687
    /// when new edges are added to the graph.
687
    /// if new edges are added to the graph.
688 688
    bool valid(Arc a) const { return Parent::valid(a); }
689 689

	
690
    /// \brief Edge validity check
691
    ///
692
    /// This function gives back true if the given edge is valid,
693
    /// ie. it is a real edge of the graph.
694
    ///
695
    /// \warning A removed edge (using Snapshot) could become valid again
696
    /// when new edges are added to the graph.
697
    bool valid(Edge e) const { return Parent::valid(e); }
698

	
699 690
    ///Clear the graph.
700 691

	
701
    ///Erase all the nodes and edges from the graph.
692
    ///This function erases all nodes and arcs from the graph.
702 693
    ///
703 694
    void clear() {
704 695
      Parent::clear();
705 696
    }
706 697

	
698
    /// Reserve memory for nodes.
699

	
700
    /// Using this function, it is possible to avoid superfluous memory
701
    /// allocation: if you know that the graph you want to build will
702
    /// be large (e.g. it will contain millions of nodes and/or edges),
703
    /// then it is worth reserving space for this amount before starting
704
    /// to build the graph.
705
    /// \sa reserveEdge()
706
    void reserveNode(int n) { nodes.reserve(n); };
707

	
708
    /// Reserve memory for edges.
709

	
710
    /// Using this function, it is possible to avoid superfluous memory
711
    /// allocation: if you know that the graph you want to build will
712
    /// be large (e.g. it will contain millions of nodes and/or edges),
713
    /// then it is worth reserving space for this amount before starting
714
    /// to build the graph.
715
    /// \sa reserveNode()
716
    void reserveEdge(int m) { arcs.reserve(2 * m); };
717

	
707 718
  public:
708 719

	
709 720
    class Snapshot;
710 721

	
711 722
  protected:
712 723

	
... ...
@@ -739,68 +750,63 @@
739 750
        nodes.pop_back();
740 751
      }
741 752
    }
742 753

	
743 754
  public:
744 755

	
745
    ///Class to make a snapshot of the digraph and to restrore to it later.
756
    ///Class to make a snapshot of the graph and to restore it later.
746 757

	
747
    ///Class to make a snapshot of the digraph and to restrore to it later.
758
    ///Class to make a snapshot of the graph and to restore it later.
748 759
    ///
749
    ///The newly added nodes and arcs can be removed using the
750
    ///restore() function.
760
    ///The newly added nodes and edges can be removed using the
761
    ///restore() function. This is the only way for deleting nodes and/or
762
    ///edges from a SmartGraph structure.
751 763
    ///
752
    ///\note After you restore a state, you cannot restore
753
    ///a later state, in other word you cannot add again the arcs deleted
754
    ///by restore() using another one Snapshot instance.
764
    ///\note After a state is restored, you cannot restore a later state,
765
    ///i.e. you cannot add the removed nodes and edges again using
766
    ///another Snapshot instance.
755 767
    ///
756
    ///\warning If you do not use correctly the snapshot that can cause
757
    ///either broken program, invalid state of the digraph, valid but
758
    ///not the restored digraph or no change. Because the runtime performance
759
    ///the validity of the snapshot is not stored.
768
    ///\warning The validity of the snapshot is not stored due to
769
    ///performance reasons. If you do not use the snapshot correctly,
770
    ///it can cause broken program, invalid or not restored state of
771
    ///the graph or no change.
760 772
    class Snapshot
761 773
    {
762 774
      SmartGraph *_graph;
763 775
    protected:
764 776
      friend class SmartGraph;
765 777
      unsigned int node_num;
766 778
      unsigned int arc_num;
767 779
    public:
768 780
      ///Default constructor.
769 781

	
770 782
      ///Default constructor.
771
      ///To actually make a snapshot you must call save().
772
      ///
783
      ///You have to call save() to actually make a snapshot.
773 784
      Snapshot() : _graph(0) {}
774 785
      ///Constructor that immediately makes a snapshot
775 786

	
776
      ///This constructor immediately makes a snapshot of the digraph.
777
      ///\param graph The digraph we make a snapshot of.
778
      Snapshot(SmartGraph &graph) {
779
        graph.saveSnapshot(*this);
787
      /// This constructor immediately makes a snapshot of the given graph.
788
      ///
789
      Snapshot(SmartGraph &gr) {
790
        gr.saveSnapshot(*this);
780 791
      }
781 792

	
782 793
      ///Make a snapshot.
783 794

	
784
      ///Make a snapshot of the graph.
785
      ///
786
      ///This function can be called more than once. In case of a repeated
795
      ///This function makes a snapshot of the given graph.
796
      ///It can be called more than once. In case of a repeated
787 797
      ///call, the previous snapshot gets lost.
788
      ///\param graph The digraph we make the snapshot of.
789
      void save(SmartGraph &graph)
798
      void save(SmartGraph &gr)
790 799
      {
791
        graph.saveSnapshot(*this);
800
        gr.saveSnapshot(*this);
792 801
      }
793 802

	
794
      ///Undo the changes until a snapshot.
803
      ///Undo the changes until the last snapshot.
795 804

	
796
      ///Undo the changes until a snapshot created by save().
797
      ///
798
      ///\note After you restored a state, you cannot restore
799
      ///a later state, in other word you cannot add again the arcs deleted
800
      ///by restore().
805
      ///This function undos the changes until the last snapshot
806
      ///created by save() or Snapshot(SmartGraph&).
801 807
      void restore()
802 808
      {
803 809
        _graph->restoreSnapshot(*this);
804 810
      }
805 811
    };
806 812
  };
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -88,12 +88,25 @@
88 88

	
89 89
    _row_names.push_back(std::string());
90 90

	
91 91
    return soplex->nRows() - 1;
92 92
  }
93 93

	
94
  int SoplexLp::_addRow(Value l, ExprIterator b, ExprIterator e, Value u) {
95
    soplex::DSVector v;
96
    for (ExprIterator it = b; it != e; ++it) {
97
      v.add(it->first, it->second);
98
    }
99
    soplex::LPRow r(l, v, u);
100
    soplex->addRow(r);
101

	
102
    _row_names.push_back(std::string());
103

	
104
    return soplex->nRows() - 1;
105
  }
106

	
94 107

	
95 108
  void SoplexLp::_eraseCol(int i) {
96 109
    soplex->removeCol(i);
97 110
    _col_names_ref.erase(_col_names[i]);
98 111
    _col_names[i] = _col_names.back();
99 112
    _col_names_ref[_col_names.back()] = i;
... ...
@@ -271,13 +284,13 @@
271 284
    return soplex->obj(i);
272 285
  }
273 286

	
274 287
  SoplexLp::SolveExitStatus SoplexLp::_solve() {
275 288

	
276 289
    _clear_temporals();
277
    
290

	
278 291
    _applyMessageLevel();
279 292

	
280 293
    soplex::SPxSolver::Status status = soplex->solve();
281 294

	
282 295
    switch (status) {
283 296
    case soplex::SPxSolver::OPTIMAL:
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -81,12 +81,13 @@
81 81
  protected:
82 82

	
83 83
    virtual const char* _solverName() const;
84 84

	
85 85
    virtual int _addCol();
86 86
    virtual int _addRow();
87
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
87 88

	
88 89
    virtual void _eraseCol(int i);
89 90
    virtual void _eraseRow(int i);
90 91

	
91 92
    virtual void _eraseColId(int i);
92 93
    virtual void _eraseRowId(int i);
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -26,16 +26,60 @@
26 26

	
27 27
#include <vector>
28 28
#include <limits>
29 29
#include <lemon/bin_heap.h>
30 30
#include <lemon/path.h>
31 31
#include <lemon/list_graph.h>
32
#include <lemon/dijkstra.h>
32 33
#include <lemon/maps.h>
33 34

	
34 35
namespace lemon {
35 36

	
37
  /// \brief Default traits class of Suurballe algorithm.
38
  ///
39
  /// Default traits class of Suurballe algorithm.
40
  /// \tparam GR The digraph type the algorithm runs on.
41
  /// \tparam LEN The type of the length map.
42
  /// The default value is <tt>GR::ArcMap<int></tt>.
43
#ifdef DOXYGEN
44
  template <typename GR, typename LEN>
45
#else
46
  template < typename GR,
47
             typename LEN = typename GR::template ArcMap<int> >
48
#endif
49
  struct SuurballeDefaultTraits
50
  {
51
    /// The type of the digraph.
52
    typedef GR Digraph;
53
    /// The type of the length map.
54
    typedef LEN LengthMap;
55
    /// The type of the lengths.
56
    typedef typename LEN::Value Length;
57
    /// The type of the flow map.
58
    typedef typename GR::template ArcMap<int> FlowMap;
59
    /// The type of the potential map.
60
    typedef typename GR::template NodeMap<Length> PotentialMap;
61

	
62
    /// \brief The path type
63
    ///
64
    /// The type used for storing the found arc-disjoint paths.
65
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
66
    /// and it must have an \c addBack() function.
67
    typedef lemon::Path<Digraph> Path;
68

	
69
    /// The cross reference type used for the heap.
70
    typedef typename GR::template NodeMap<int> HeapCrossRef;
71

	
72
    /// \brief The heap type used for internal Dijkstra computations.
73
    ///
74
    /// The type of the heap used for internal Dijkstra computations.
75
    /// It must conform to the \ref lemon::concepts::Heap "Heap" concept
76
    /// and its priority type must be \c Length.
77
    typedef BinHeap<Length, HeapCrossRef> Heap;
78
  };
79

	
36 80
  /// \addtogroup shortest_path
37 81
  /// @{
38 82

	
39 83
  /// \brief Algorithm for finding arc-disjoint paths between two nodes
40 84
  /// having minimum total length.
41 85
  ///
... ...
@@ -43,177 +87,294 @@
43 87
  /// finding arc-disjoint paths having minimum total length (cost)
44 88
  /// from a given source node to a given target node in a digraph.
45 89
  ///
46 90
  /// Note that this problem is a special case of the \ref min_cost_flow
47 91
  /// "minimum cost flow problem". This implementation is actually an
48 92
  /// efficient specialized version of the \ref CapacityScaling
49
  /// "Successive Shortest Path" algorithm directly for this problem.
93
  /// "successive shortest path" algorithm directly for this problem.
50 94
  /// Therefore this class provides query functions for flow values and
51 95
  /// node potentials (the dual solution) just like the minimum cost flow
52 96
  /// algorithms.
53 97
  ///
54 98
  /// \tparam GR The digraph type the algorithm runs on.
55 99
  /// \tparam LEN The type of the length map.
56 100
  /// The default value is <tt>GR::ArcMap<int></tt>.
57 101
  ///
58 102
  /// \warning Length values should be \e non-negative.
59 103
  ///
60
  /// \note For finding node-disjoint paths this algorithm can be used
104
  /// \note For finding \e node-disjoint paths, this algorithm can be used
61 105
  /// along with the \ref SplitNodes adaptor.
62 106
#ifdef DOXYGEN
63
  template <typename GR, typename LEN>
107
  template <typename GR, typename LEN, typename TR>
64 108
#else
65 109
  template < typename GR,
66
             typename LEN = typename GR::template ArcMap<int> >
110
             typename LEN = typename GR::template ArcMap<int>,
111
             typename TR = SuurballeDefaultTraits<GR, LEN> >
67 112
#endif
68 113
  class Suurballe
69 114
  {
70 115
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
71 116

	
72 117
    typedef ConstMap<Arc, int> ConstArcMap;
73 118
    typedef typename GR::template NodeMap<Arc> PredMap;
74 119

	
75 120
  public:
76 121

	
77
    /// The type of the digraph the algorithm runs on.
78
    typedef GR Digraph;
122
    /// The type of the digraph.
123
    typedef typename TR::Digraph Digraph;
79 124
    /// The type of the length map.
80
    typedef LEN LengthMap;
125
    typedef typename TR::LengthMap LengthMap;
81 126
    /// The type of the lengths.
82
    typedef typename LengthMap::Value Length;
83
#ifdef DOXYGEN
127
    typedef typename TR::Length Length;
128

	
84 129
    /// The type of the flow map.
85
    typedef GR::ArcMap<int> FlowMap;
130
    typedef typename TR::FlowMap FlowMap;
86 131
    /// The type of the potential map.
87
    typedef GR::NodeMap<Length> PotentialMap;
88
#else
89
    /// The type of the flow map.
90
    typedef typename Digraph::template ArcMap<int> FlowMap;
91
    /// The type of the potential map.
92
    typedef typename Digraph::template NodeMap<Length> PotentialMap;
93
#endif
132
    typedef typename TR::PotentialMap PotentialMap;
133
    /// The type of the path structures.
134
    typedef typename TR::Path Path;
135
    /// The cross reference type used for the heap.
136
    typedef typename TR::HeapCrossRef HeapCrossRef;
137
    /// The heap type used for internal Dijkstra computations.
138
    typedef typename TR::Heap Heap;
94 139

	
95
    /// The type of the path structures.
96
    typedef SimplePath<GR> Path;
140
    /// The \ref SuurballeDefaultTraits "traits class" of the algorithm.
141
    typedef TR Traits;
97 142

	
98 143
  private:
99 144

	
100 145
    // ResidualDijkstra is a special implementation of the
101 146
    // Dijkstra algorithm for finding shortest paths in the
102 147
    // residual network with respect to the reduced arc lengths
103 148
    // and modifying the node potentials according to the
104 149
    // distance of the nodes.
105 150
    class ResidualDijkstra
106 151
    {
107
      typedef typename Digraph::template NodeMap<int> HeapCrossRef;
108
      typedef BinHeap<Length, HeapCrossRef> Heap;
152
    private:
153

	
154
      const Digraph &_graph;
155
      const LengthMap &_length;
156
      const FlowMap &_flow;
157
      PotentialMap &_pi;
158
      PredMap &_pred;
159
      Node _s;
160
      Node _t;
161

	
162
      PotentialMap _dist;
163
      std::vector<Node> _proc_nodes;
164

	
165
    public:
166

	
167
      // Constructor
168
      ResidualDijkstra(Suurballe &srb) :
169
        _graph(srb._graph), _length(srb._length),
170
        _flow(*srb._flow), _pi(*srb._potential), _pred(srb._pred),
171
        _s(srb._s), _t(srb._t), _dist(_graph) {}
172

	
173
      // Run the algorithm and return true if a path is found
174
      // from the source node to the target node.
175
      bool run(int cnt) {
176
        return cnt == 0 ? startFirst() : start();
177
      }
109 178

	
110 179
    private:
111 180

	
112
      // The digraph the algorithm runs on
113
      const Digraph &_graph;
114

	
115
      // The main maps
116
      const FlowMap &_flow;
117
      const LengthMap &_length;
118
      PotentialMap &_potential;
119

	
120
      // The distance map
121
      PotentialMap _dist;
122
      // The pred arc map
123
      PredMap &_pred;
124
      // The processed (i.e. permanently labeled) nodes
125
      std::vector<Node> _proc_nodes;
126

	
127
      Node _s;
128
      Node _t;
129

	
130
    public:
131

	
132
      /// Constructor.
133
      ResidualDijkstra( const Digraph &graph,
134
                        const FlowMap &flow,
135
                        const LengthMap &length,
136
                        PotentialMap &potential,
137
                        PredMap &pred,
138
                        Node s, Node t ) :
139
        _graph(graph), _flow(flow), _length(length), _potential(potential),
140
        _dist(graph), _pred(pred), _s(s), _t(t) {}
141

	
142
      /// \brief Run the algorithm. It returns \c true if a path is found
143
      /// from the source node to the target node.
144
      bool run() {
181
      // Execute the algorithm for the first time (the flow and potential
182
      // functions have to be identically zero).
183
      bool startFirst() {
145 184
        HeapCrossRef heap_cross_ref(_graph, Heap::PRE_HEAP);
146 185
        Heap heap(heap_cross_ref);
147 186
        heap.push(_s, 0);
148 187
        _pred[_s] = INVALID;
149 188
        _proc_nodes.clear();
150 189

	
151 190
        // Process nodes
152 191
        while (!heap.empty() && heap.top() != _t) {
153 192
          Node u = heap.top(), v;
154
          Length d = heap.prio() + _potential[u], nd;
193
          Length d = heap.prio(), dn;
155 194
          _dist[u] = heap.prio();
195
          _proc_nodes.push_back(u);
156 196
          heap.pop();
197

	
198
          // Traverse outgoing arcs
199
          for (OutArcIt e(_graph, u); e != INVALID; ++e) {
200
            v = _graph.target(e);
201
            switch(heap.state(v)) {
202
              case Heap::PRE_HEAP:
203
                heap.push(v, d + _length[e]);
204
                _pred[v] = e;
205
                break;
206
              case Heap::IN_HEAP:
207
                dn = d + _length[e];
208
                if (dn < heap[v]) {
209
                  heap.decrease(v, dn);
210
                  _pred[v] = e;
211
                }
212
                break;
213
              case Heap::POST_HEAP:
214
                break;
215
            }
216
          }
217
        }
218
        if (heap.empty()) return false;
219

	
220
        // Update potentials of processed nodes
221
        Length t_dist = heap.prio();
222
        for (int i = 0; i < int(_proc_nodes.size()); ++i)
223
          _pi[_proc_nodes[i]] = _dist[_proc_nodes[i]] - t_dist;
224
        return true;
225
      }
226

	
227
      // Execute the algorithm.
228
      bool start() {
229
        HeapCrossRef heap_cross_ref(_graph, Heap::PRE_HEAP);
230
        Heap heap(heap_cross_ref);
231
        heap.push(_s, 0);
232
        _pred[_s] = INVALID;
233
        _proc_nodes.clear();
234

	
235
        // Process nodes
236
        while (!heap.empty() && heap.top() != _t) {
237
          Node u = heap.top(), v;
238
          Length d = heap.prio() + _pi[u], dn;
239
          _dist[u] = heap.prio();
157 240
          _proc_nodes.push_back(u);
241
          heap.pop();
158 242

	
159 243
          // Traverse outgoing arcs
160 244
          for (OutArcIt e(_graph, u); e != INVALID; ++e) {
161 245
            if (_flow[e] == 0) {
162 246
              v = _graph.target(e);
163 247
              switch(heap.state(v)) {
164
              case Heap::PRE_HEAP:
165
                heap.push(v, d + _length[e] - _potential[v]);
166
                _pred[v] = e;
167
                break;
168
              case Heap::IN_HEAP:
169
                nd = d + _length[e] - _potential[v];
170
                if (nd < heap[v]) {
171
                  heap.decrease(v, nd);
248
                case Heap::PRE_HEAP:
249
                  heap.push(v, d + _length[e] - _pi[v]);
172 250
                  _pred[v] = e;
173
                }
174
                break;
175
              case Heap::POST_HEAP:
176
                break;
251
                  break;
252
                case Heap::IN_HEAP:
253
                  dn = d + _length[e] - _pi[v];
254
                  if (dn < heap[v]) {
255
                    heap.decrease(v, dn);
256
                    _pred[v] = e;
257
                  }
258
                  break;
259
                case Heap::POST_HEAP:
260
                  break;
177 261
              }
178 262
            }
179 263
          }
180 264

	
181 265
          // Traverse incoming arcs
182 266
          for (InArcIt e(_graph, u); e != INVALID; ++e) {
183 267
            if (_flow[e] == 1) {
184 268
              v = _graph.source(e);
185 269
              switch(heap.state(v)) {
186
              case Heap::PRE_HEAP:
187
                heap.push(v, d - _length[e] - _potential[v]);
188
                _pred[v] = e;
189
                break;
190
              case Heap::IN_HEAP:
191
                nd = d - _length[e] - _potential[v];
192
                if (nd < heap[v]) {
193
                  heap.decrease(v, nd);
270
                case Heap::PRE_HEAP:
271
                  heap.push(v, d - _length[e] - _pi[v]);
194 272
                  _pred[v] = e;
195
                }
196
                break;
197
              case Heap::POST_HEAP:
198
                break;
273
                  break;
274
                case Heap::IN_HEAP:
275
                  dn = d - _length[e] - _pi[v];
276
                  if (dn < heap[v]) {
277
                    heap.decrease(v, dn);
278
                    _pred[v] = e;
279
                  }
280
                  break;
281
                case Heap::POST_HEAP:
282
                  break;
199 283
              }
200 284
            }
201 285
          }
202 286
        }
203 287
        if (heap.empty()) return false;
204 288

	
205 289
        // Update potentials of processed nodes
206 290
        Length t_dist = heap.prio();
207 291
        for (int i = 0; i < int(_proc_nodes.size()); ++i)
208
          _potential[_proc_nodes[i]] += _dist[_proc_nodes[i]] - t_dist;
292
          _pi[_proc_nodes[i]] += _dist[_proc_nodes[i]] - t_dist;
209 293
        return true;
210 294
      }
211 295

	
212 296
    }; //class ResidualDijkstra
213 297

	
298
  public:
299

	
300
    /// \name Named Template Parameters
301
    /// @{
302

	
303
    template <typename T>
304
    struct SetFlowMapTraits : public Traits {
305
      typedef T FlowMap;
306
    };
307

	
308
    /// \brief \ref named-templ-param "Named parameter" for setting
309
    /// \c FlowMap type.
310
    ///
311
    /// \ref named-templ-param "Named parameter" for setting
312
    /// \c FlowMap type.
313
    template <typename T>
314
    struct SetFlowMap
315
      : public Suurballe<GR, LEN, SetFlowMapTraits<T> > {
316
      typedef Suurballe<GR, LEN, SetFlowMapTraits<T> > Create;
317
    };
318

	
319
    template <typename T>
320
    struct SetPotentialMapTraits : public Traits {
321
      typedef T PotentialMap;
322
    };
323

	
324
    /// \brief \ref named-templ-param "Named parameter" for setting
325
    /// \c PotentialMap type.
326
    ///
327
    /// \ref named-templ-param "Named parameter" for setting
328
    /// \c PotentialMap type.
329
    template <typename T>
330
    struct SetPotentialMap
331
      : public Suurballe<GR, LEN, SetPotentialMapTraits<T> > {
332
      typedef Suurballe<GR, LEN, SetPotentialMapTraits<T> > Create;
333
    };
334

	
335
    template <typename T>
336
    struct SetPathTraits : public Traits {
337
      typedef T Path;
338
    };
339

	
340
    /// \brief \ref named-templ-param "Named parameter" for setting
341
    /// \c %Path type.
342
    ///
343
    /// \ref named-templ-param "Named parameter" for setting \c %Path type.
344
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
345
    /// and it must have an \c addBack() function.
346
    template <typename T>
347
    struct SetPath
348
      : public Suurballe<GR, LEN, SetPathTraits<T> > {
349
      typedef Suurballe<GR, LEN, SetPathTraits<T> > Create;
350
    };
351

	
352
    template <typename H, typename CR>
353
    struct SetHeapTraits : public Traits {
354
      typedef H Heap;
355
      typedef CR HeapCrossRef;
356
    };
357

	
358
    /// \brief \ref named-templ-param "Named parameter" for setting
359
    /// \c Heap and \c HeapCrossRef types.
360
    ///
361
    /// \ref named-templ-param "Named parameter" for setting \c Heap
362
    /// and \c HeapCrossRef types with automatic allocation.
363
    /// They will be used for internal Dijkstra computations.
364
    /// The heap type must conform to the \ref lemon::concepts::Heap "Heap"
365
    /// concept and its priority type must be \c Length.
366
    template <typename H,
367
              typename CR = typename Digraph::template NodeMap<int> >
368
    struct SetHeap
369
      : public Suurballe<GR, LEN, SetHeapTraits<H, CR> > {
370
      typedef Suurballe<GR, LEN, SetHeapTraits<H, CR> > Create;
371
    };
372

	
373
    /// @}
374

	
214 375
  private:
215 376

	
216 377
    // The digraph the algorithm runs on
217 378
    const Digraph &_graph;
218 379
    // The length map
219 380
    const LengthMap &_length;
... ...
@@ -223,45 +384,53 @@
223 384
    bool _local_flow;
224 385
    // Node map of the current potentials
225 386
    PotentialMap *_potential;
226 387
    bool _local_potential;
227 388

	
228 389
    // The source node
229
    Node _source;
390
    Node _s;
230 391
    // The target node
231
    Node _target;
392
    Node _t;
232 393

	
233 394
    // Container to store the found paths
234
    std::vector< SimplePath<Digraph> > paths;
395
    std::vector<Path> _paths;
235 396
    int _path_num;
236 397

	
237 398
    // The pred arc map
238 399
    PredMap _pred;
239
    // Implementation of the Dijkstra algorithm for finding augmenting
240
    // shortest paths in the residual network
241
    ResidualDijkstra *_dijkstra;
400

	
401
    // Data for full init
402
    PotentialMap *_init_dist;
403
    PredMap *_init_pred;
404
    bool _full_init;
405

	
406
  protected:
407

	
408
    Suurballe() {}
242 409

	
243 410
  public:
244 411

	
245 412
    /// \brief Constructor.
246 413
    ///
247 414
    /// Constructor.
248 415
    ///
249 416
    /// \param graph The digraph the algorithm runs on.
250 417
    /// \param length The length (cost) values of the arcs.
251 418
    Suurballe( const Digraph &graph,
252 419
               const LengthMap &length ) :
253 420
      _graph(graph), _length(length), _flow(0), _local_flow(false),
254
      _potential(0), _local_potential(false), _pred(graph)
421
      _potential(0), _local_potential(false), _pred(graph),
422
      _init_dist(0), _init_pred(0)
255 423
    {}
256 424

	
257 425
    /// Destructor.
258 426
    ~Suurballe() {
259 427
      if (_local_flow) delete _flow;
260 428
      if (_local_potential) delete _potential;
261
      delete _dijkstra;
429
      delete _init_dist;
430
      delete _init_pred;
262 431
    }
263 432

	
264 433
    /// \brief Set the flow map.
265 434
    ///
266 435
    /// This function sets the flow map.
267 436
    /// If it is not used before calling \ref run() or \ref init(),
... ...
@@ -300,16 +469,19 @@
300 469
      _potential = &map;
301 470
      return *this;
302 471
    }
303 472

	
304 473
    /// \name Execution Control
305 474
    /// The simplest way to execute the algorithm is to call the run()
306
    /// function.
307
    /// \n
475
    /// function.\n
476
    /// If you need to execute the algorithm many times using the same
477
    /// source node, then you may call fullInit() once and start()
478
    /// for each target node.\n
308 479
    /// If you only need the flow that is the union of the found
309
    /// arc-disjoint paths, you may call init() and findFlow().
480
    /// arc-disjoint paths, then you may call findFlow() instead of
481
    /// start().
310 482

	
311 483
    /// @{
312 484

	
313 485
    /// \brief Run the algorithm.
314 486
    ///
315 487
    /// This function runs the algorithm.
... ...
@@ -323,41 +495,94 @@
323 495
    /// arc-disjoint paths found.
324 496
    ///
325 497
    /// \note Apart from the return value, <tt>s.run(s, t, k)</tt> is
326 498
    /// just a shortcut of the following code.
327 499
    /// \code
328 500
    ///   s.init(s);
329
    ///   s.findFlow(t, k);
330
    ///   s.findPaths();
501
    ///   s.start(t, k);
331 502
    /// \endcode
332 503
    int run(const Node& s, const Node& t, int k = 2) {
333 504
      init(s);
334
      findFlow(t, k);
335
      findPaths();
505
      start(t, k);
336 506
      return _path_num;
337 507
    }
338 508

	
339 509
    /// \brief Initialize the algorithm.
340 510
    ///
341
    /// This function initializes the algorithm.
511
    /// This function initializes the algorithm with the given source node.
342 512
    ///
343 513
    /// \param s The source node.
344 514
    void init(const Node& s) {
345
      _source = s;
515
      _s = s;
346 516

	
347 517
      // Initialize maps
348 518
      if (!_flow) {
349 519
        _flow = new FlowMap(_graph);
350 520
        _local_flow = true;
351 521
      }
352 522
      if (!_potential) {
353 523
        _potential = new PotentialMap(_graph);
354 524
        _local_potential = true;
355 525
      }
356
      for (ArcIt e(_graph); e != INVALID; ++e) (*_flow)[e] = 0;
357
      for (NodeIt n(_graph); n != INVALID; ++n) (*_potential)[n] = 0;
526
      _full_init = false;
527
    }
528

	
529
    /// \brief Initialize the algorithm and perform Dijkstra.
530
    ///
531
    /// This function initializes the algorithm and performs a full
532
    /// Dijkstra search from the given source node. It makes consecutive
533
    /// executions of \ref start() "start(t, k)" faster, since they
534
    /// have to perform %Dijkstra only k-1 times.
535
    ///
536
    /// This initialization is usually worth using instead of \ref init()
537
    /// if the algorithm is executed many times using the same source node.
538
    ///
539
    /// \param s The source node.
540
    void fullInit(const Node& s) {
541
      // Initialize maps
542
      init(s);
543
      if (!_init_dist) {
544
        _init_dist = new PotentialMap(_graph);
545
      }
546
      if (!_init_pred) {
547
        _init_pred = new PredMap(_graph);
548
      }
549

	
550
      // Run a full Dijkstra
551
      typename Dijkstra<Digraph, LengthMap>
552
        ::template SetStandardHeap<Heap>
553
        ::template SetDistMap<PotentialMap>
554
        ::template SetPredMap<PredMap>
555
        ::Create dijk(_graph, _length);
556
      dijk.distMap(*_init_dist).predMap(*_init_pred);
557
      dijk.run(s);
558

	
559
      _full_init = true;
560
    }
561

	
562
    /// \brief Execute the algorithm.
563
    ///
564
    /// This function executes the algorithm.
565
    ///
566
    /// \param t The target node.
567
    /// \param k The number of paths to be found.
568
    ///
569
    /// \return \c k if there are at least \c k arc-disjoint paths from
570
    /// \c s to \c t in the digraph. Otherwise it returns the number of
571
    /// arc-disjoint paths found.
572
    ///
573
    /// \note Apart from the return value, <tt>s.start(t, k)</tt> is
574
    /// just a shortcut of the following code.
575
    /// \code
576
    ///   s.findFlow(t, k);
577
    ///   s.findPaths();
578
    /// \endcode
579
    int start(const Node& t, int k = 2) {
580
      findFlow(t, k);
581
      findPaths();
582
      return _path_num;
358 583
    }
359 584

	
360 585
    /// \brief Execute the algorithm to find an optimal flow.
361 586
    ///
362 587
    /// This function executes the successive shortest path algorithm to
363 588
    /// find a minimum cost flow, which is the union of \c k (or less)
... ...
@@ -369,26 +594,45 @@
369 594
    /// \return \c k if there are at least \c k arc-disjoint paths from
370 595
    /// the source node to the given node \c t in the digraph.
371 596
    /// Otherwise it returns the number of arc-disjoint paths found.
372 597
    ///
373 598
    /// \pre \ref init() must be called before using this function.
374 599
    int findFlow(const Node& t, int k = 2) {
375
      _target = t;
376
      _dijkstra =
377
        new ResidualDijkstra( _graph, *_flow, _length, *_potential, _pred,
378
                              _source, _target );
600
      _t = t;
601
      ResidualDijkstra dijkstra(*this);
602

	
603
      // Initialization
604
      for (ArcIt e(_graph); e != INVALID; ++e) {
605
        (*_flow)[e] = 0;
606
      }
607
      if (_full_init) {
608
        for (NodeIt n(_graph); n != INVALID; ++n) {
609
          (*_potential)[n] = (*_init_dist)[n];
610
        }
611
        Node u = _t;
612
        Arc e;
613
        while ((e = (*_init_pred)[u]) != INVALID) {
614
          (*_flow)[e] = 1;
615
          u = _graph.source(e);
616
        }
617
        _path_num = 1;
618
      } else {
619
        for (NodeIt n(_graph); n != INVALID; ++n) {
620
          (*_potential)[n] = 0;
621
        }
622
        _path_num = 0;
623
      }
379 624

	
380 625
      // Find shortest paths
381
      _path_num = 0;
382 626
      while (_path_num < k) {
383 627
        // Run Dijkstra
384
        if (!_dijkstra->run()) break;
628
        if (!dijkstra.run(_path_num)) break;
385 629
        ++_path_num;
386 630

	
387 631
        // Set the flow along the found shortest path
388
        Node u = _target;
632
        Node u = _t;
389 633
        Arc e;
390 634
        while ((e = _pred[u]) != INVALID) {
391 635
          if (u == _graph.target(e)) {
392 636
            (*_flow)[e] = 1;
393 637
            u = _graph.source(e);
394 638
          } else {
... ...
@@ -399,30 +643,30 @@
399 643
      }
400 644
      return _path_num;
401 645
    }
402 646

	
403 647
    /// \brief Compute the paths from the flow.
404 648
    ///
405
    /// This function computes the paths from the found minimum cost flow,
406
    /// which is the union of some arc-disjoint paths.
649
    /// This function computes arc-disjoint paths from the found minimum
650
    /// cost flow, which is the union of them.
407 651
    ///
408 652
    /// \pre \ref init() and \ref findFlow() must be called before using
409 653
    /// this function.
410 654
    void findPaths() {
411 655
      FlowMap res_flow(_graph);
412 656
      for(ArcIt a(_graph); a != INVALID; ++a) res_flow[a] = (*_flow)[a];
413 657

	
414
      paths.clear();
415
      paths.resize(_path_num);
658
      _paths.clear();
659
      _paths.resize(_path_num);
416 660
      for (int i = 0; i < _path_num; ++i) {
417
        Node n = _source;
418
        while (n != _target) {
661
        Node n = _s;
662
        while (n != _t) {
419 663
          OutArcIt e(_graph, n);
420 664
          for ( ; res_flow[e] == 0; ++e) ;
421 665
          n = _graph.target(e);
422
          paths[i].addBack(e);
666
          _paths[i].addBack(e);
423 667
          res_flow[e] = 0;
424 668
        }
425 669
      }
426 670
    }
427 671

	
428 672
    /// @}
... ...
@@ -515,13 +759,13 @@
515 759
    /// \param i The function returns the <tt>i</tt>-th path.
516 760
    /// \c i must be between \c 0 and <tt>%pathNum()-1</tt>.
517 761
    ///
518 762
    /// \pre \ref run() or \ref findPaths() must be called before using
519 763
    /// this function.
520 764
    const Path& path(int i) const {
521
      return paths[i];
765
      return _paths[i];
522 766
    }
523 767

	
524 768
    /// @}
525 769

	
526 770
  }; //class Suurballe
527 771

	
Ignore white space 6 line context
... ...
@@ -372,13 +372,13 @@
372 372
    }
373 373

	
374 374
    ///Returns the running state of the timer
375 375

	
376 376
    ///This function returns the number of stop() exections that is
377 377
    ///necessary to really stop the timer.
378
    ///For example the timer
378
    ///For example, the timer
379 379
    ///is running if and only if the return value is \c true
380 380
    ///(i.e. greater than
381 381
    ///zero).
382 382
    int running()  { return _running; }
383 383

	
384 384

	
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -40,13 +40,13 @@
40 40
  ///
41 41
  /// The class implements the \e Union-Find data structure.
42 42
  /// The union operation uses rank heuristic, while
43 43
  /// the find operation uses path compression.
44 44
  /// This is a very simple but efficient implementation, providing
45 45
  /// only four methods: join (union), find, insert and size.
46
  /// For more features see the \ref UnionFindEnum class.
46
  /// For more features, see the \ref UnionFindEnum class.
47 47
  ///
48 48
  /// It is primarily used in Kruskal algorithm for finding minimal
49 49
  /// cost spanning tree in a graph.
50 50
  /// \sa kruskal()
51 51
  ///
52 52
  /// \pre You need to add all the elements by the \ref insert()
Ignore white space 6 line context
1 1
#! /usr/bin/env python
2
#
3
# This file is a part of LEMON, a generic C++ optimization library.
4
#
5
# Copyright (C) 2003-2009
6
# Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
# (Egervary Research Group on Combinatorial Optimization, EGRES).
8
#
9
# Permission to use, modify and distribute this software is granted
10
# provided that this copyright notice appears in all copies. For
11
# precise terms see the accompanying LICENSE file.
12
#
13
# This software is provided "AS IS" with no warranty of any kind,
14
# express or implied, and with no claim as to its suitability for any
15
# purpose.
2 16

	
3 17
import sys
4 18

	
5 19
from mercurial import ui, hg
6 20
from mercurial import util
7 21

	
Ignore white space 6 line context
1 1
#!/bin/bash
2
#
3
# This file is a part of LEMON, a generic C++ optimization library.
4
#
5
# Copyright (C) 2003-2009
6
# Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
# (Egervary Research Group on Combinatorial Optimization, EGRES).
8
#
9
# Permission to use, modify and distribute this software is granted
10
# provided that this copyright notice appears in all copies. For
11
# precise terms see the accompanying LICENSE file.
12
#
13
# This software is provided "AS IS" with no warranty of any kind,
14
# express or implied, and with no claim as to its suitability for any
15
# purpose.
2 16

	
3 17
set -e
4 18

	
5 19
if [ $# = 0 ]; then
6 20
    echo "Usage: $0 release-id"
7 21
    exit 1
Ignore white space 6 line context
1 1
#!/bin/bash
2
#
3
# This file is a part of LEMON, a generic C++ optimization library.
4
#
5
# Copyright (C) 2003-2009
6
# Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
# (Egervary Research Group on Combinatorial Optimization, EGRES).
8
#
9
# Permission to use, modify and distribute this software is granted
10
# provided that this copyright notice appears in all copies. For
11
# precise terms see the accompanying LICENSE file.
12
#
13
# This software is provided "AS IS" with no warranty of any kind,
14
# express or implied, and with no claim as to its suitability for any
15
# purpose.
2 16

	
3 17
YEAR=`date +%Y`
4 18
HGROOT=`hg root`
5 19

	
6 20
function hg_year() {
7 21
    if [ -n "$(hg st $1)" ]; then
Ignore white space 6 line context
... ...
@@ -10,36 +10,40 @@
10 10
SET(TEST_WITH_VALGRIND "NO" CACHE STRING
11 11
  "Run the test with valgrind (YES/NO).")
12 12
SET(VALGRIND_FLAGS "" CACHE STRING "Valgrind flags used by the tests.")
13 13

	
14 14
SET(TESTS
15 15
  adaptors_test
16
  bellman_ford_test
16 17
  bfs_test
17 18
  circulation_test
18 19
  connectivity_test
19 20
  counter_test
20 21
  dfs_test
21 22
  digraph_test
22 23
  dijkstra_test
23 24
  dim_test
24 25
  edge_set_test
25 26
  error_test
26 27
  euler_test
28
  fractional_matching_test
27 29
  gomory_hu_test
28 30
  graph_copy_test
29 31
  graph_test
30 32
  graph_utils_test
31 33
  hao_orlin_test
32 34
  heap_test
33 35
  kruskal_test
34 36
  lgf_test
35 37
  maps_test
36 38
  matching_test
37 39
  min_cost_arborescence_test
38 40
  min_cost_flow_test
41
  min_mean_cycle_test
39 42
  path_test
43
  planarity_test
40 44
  preflow_test
41 45
  radix_sort_test
42 46
  random_test
43 47
  suurballe_test
44 48
  time_measure_test
45 49
  unionfind_test
Ignore white space 6 line context
1
if USE_VALGRIND
2
TESTS_ENVIRONMENT=$(top_srcdir)/scripts/valgrind-wrapper.sh
3
endif
4

	
1 5
EXTRA_DIST += \
2 6
	test/CMakeLists.txt
3 7

	
4 8
noinst_HEADERS += \
5 9
	test/graph_test.h \
6 10
	test/test_tools.h
7 11

	
8 12
check_PROGRAMS += \
9 13
	test/adaptors_test \
14
	test/bellman_ford_test \
10 15
	test/bfs_test \
11 16
	test/circulation_test \
12 17
	test/connectivity_test \
13 18
	test/counter_test \
14 19
	test/dfs_test \
15 20
	test/digraph_test \
16 21
	test/dijkstra_test \
17 22
	test/dim_test \
18 23
	test/edge_set_test \
19 24
	test/error_test \
20 25
	test/euler_test \
26
	test/fractional_matching_test \
21 27
	test/gomory_hu_test \
22 28
	test/graph_copy_test \
23 29
	test/graph_test \
24 30
	test/graph_utils_test \
25 31
	test/hao_orlin_test \
26 32
	test/heap_test \
27 33
	test/kruskal_test \
28 34
	test/lgf_test \
29 35
	test/maps_test \
30 36
	test/matching_test \
31 37
	test/min_cost_arborescence_test \
32 38
	test/min_cost_flow_test \
39
	test/min_mean_cycle_test \
33 40
	test/path_test \
41
	test/planarity_test \
34 42
	test/preflow_test \
35 43
	test/radix_sort_test \
36 44
	test/random_test \
37 45
	test/suurballe_test \
38 46
	test/test_tools_fail \
39 47
	test/test_tools_pass \
... ...
@@ -50,23 +58,25 @@
50 58
endif HAVE_MIP
51 59

	
52 60
TESTS += $(check_PROGRAMS)
53 61
XFAIL_TESTS += test/test_tools_fail$(EXEEXT)
54 62

	
55 63
test_adaptors_test_SOURCES = test/adaptors_test.cc
64
test_bellman_ford_test_SOURCES = test/bellman_ford_test.cc
56 65
test_bfs_test_SOURCES = test/bfs_test.cc
57 66
test_circulation_test_SOURCES = test/circulation_test.cc
58 67
test_counter_test_SOURCES = test/counter_test.cc
59 68
test_connectivity_test_SOURCES = test/connectivity_test.cc
60 69
test_dfs_test_SOURCES = test/dfs_test.cc
61 70
test_digraph_test_SOURCES = test/digraph_test.cc
62 71
test_dijkstra_test_SOURCES = test/dijkstra_test.cc
63 72
test_dim_test_SOURCES = test/dim_test.cc
64 73
test_edge_set_test_SOURCES = test/edge_set_test.cc
65 74
test_error_test_SOURCES = test/error_test.cc
66 75
test_euler_test_SOURCES = test/euler_test.cc
76
test_fractional_matching_test_SOURCES = test/fractional_matching_test.cc
67 77
test_gomory_hu_test_SOURCES = test/gomory_hu_test.cc
68 78
test_graph_copy_test_SOURCES = test/graph_copy_test.cc
69 79
test_graph_test_SOURCES = test/graph_test.cc
70 80
test_graph_utils_test_SOURCES = test/graph_utils_test.cc
71 81
test_heap_test_SOURCES = test/heap_test.cc
72 82
test_kruskal_test_SOURCES = test/kruskal_test.cc
... ...
@@ -75,13 +85,15 @@
75 85
test_lp_test_SOURCES = test/lp_test.cc
76 86
test_maps_test_SOURCES = test/maps_test.cc
77 87
test_mip_test_SOURCES = test/mip_test.cc
78 88
test_matching_test_SOURCES = test/matching_test.cc
79 89
test_min_cost_arborescence_test_SOURCES = test/min_cost_arborescence_test.cc
80 90
test_min_cost_flow_test_SOURCES = test/min_cost_flow_test.cc
91
test_min_mean_cycle_test_SOURCES = test/min_mean_cycle_test.cc
81 92
test_path_test_SOURCES = test/path_test.cc
93
test_planarity_test_SOURCES = test/planarity_test.cc
82 94
test_preflow_test_SOURCES = test/preflow_test.cc
83 95
test_radix_sort_test_SOURCES = test/radix_sort_test.cc
84 96
test_suurballe_test_SOURCES = test/suurballe_test.cc
85 97
test_random_test_SOURCES = test/random_test.cc
86 98
test_test_tools_fail_SOURCES = test/test_tools_fail.cc
87 99
test_test_tools_pass_SOURCES = test/test_tools_pass.cc
Ignore white space 6 line context
... ...
@@ -1368,57 +1368,49 @@
1368 1368
  GridGraph::Node n1 = graph(0,0);
1369 1369
  GridGraph::Node n2 = graph(0,1);
1370 1370
  GridGraph::Node n3 = graph(1,0);
1371 1371
  GridGraph::Node n4 = graph(1,1);
1372 1372

	
1373 1373
  GridGraph::EdgeMap<bool> dir_map(graph);
1374
  dir_map[graph.right(n1)] = graph.u(graph.right(n1)) == n1;
1375
  dir_map[graph.up(n1)] = graph.u(graph.up(n1)) != n1;
1376
  dir_map[graph.left(n4)] = graph.u(graph.left(n4)) != n4;
1377
  dir_map[graph.down(n4)] = graph.u(graph.down(n4)) != n4;
1374
  dir_map[graph.right(n1)] = graph.u(graph.right(n1)) != n1;
1375
  dir_map[graph.up(n1)] = graph.u(graph.up(n1)) == n1;
1376
  dir_map[graph.left(n4)] = graph.u(graph.left(n4)) == n4;
1377
  dir_map[graph.down(n4)] = graph.u(graph.down(n4)) == n4;
1378 1378

	
1379 1379
  // Apply several adaptors on the grid graph
1380
  typedef SplitNodes< ReverseDigraph< const Orienter<
1381
            const GridGraph, GridGraph::EdgeMap<bool> > > >
1382
    RevSplitGridGraph;
1383
  typedef ReverseDigraph<const RevSplitGridGraph> SplitGridGraph;
1380
  typedef SplitNodes<Orienter< const GridGraph, GridGraph::EdgeMap<bool> > >
1381
    SplitGridGraph;
1384 1382
  typedef Undirector<const SplitGridGraph> USplitGridGraph;
1385
  typedef Undirector<const USplitGridGraph> UUSplitGridGraph;
1386
  checkConcept<concepts::Digraph, RevSplitGridGraph>();
1387 1383
  checkConcept<concepts::Digraph, SplitGridGraph>();
1388 1384
  checkConcept<concepts::Graph, USplitGridGraph>();
1389
  checkConcept<concepts::Graph, UUSplitGridGraph>();
1390 1385

	
1391
  RevSplitGridGraph rev_adaptor =
1392
    splitNodes(reverseDigraph(orienter(graph, dir_map)));
1393
  SplitGridGraph adaptor = reverseDigraph(rev_adaptor);
1386
  SplitGridGraph adaptor = splitNodes(orienter(graph, dir_map));
1394 1387
  USplitGridGraph uadaptor = undirector(adaptor);
1395
  UUSplitGridGraph uuadaptor = undirector(uadaptor);
1396 1388

	
1397 1389
  // Check adaptor
1398 1390
  checkGraphNodeList(adaptor, 8);
1399 1391
  checkGraphArcList(adaptor, 8);
1400 1392
  checkGraphConArcList(adaptor, 8);
1401 1393

	
1402
  checkGraphOutArcList(adaptor, rev_adaptor.inNode(n1), 1);
1403
  checkGraphOutArcList(adaptor, rev_adaptor.outNode(n1), 1);
1404
  checkGraphOutArcList(adaptor, rev_adaptor.inNode(n2), 2);
1405
  checkGraphOutArcList(adaptor, rev_adaptor.outNode(n2), 1);
1406
  checkGraphOutArcList(adaptor, rev_adaptor.inNode(n3), 1);
1407
  checkGraphOutArcList(adaptor, rev_adaptor.outNode(n3), 1);
1408
  checkGraphOutArcList(adaptor, rev_adaptor.inNode(n4), 0);
1409
  checkGraphOutArcList(adaptor, rev_adaptor.outNode(n4), 1);
1394
  checkGraphOutArcList(adaptor, adaptor.inNode(n1), 1);
1395
  checkGraphOutArcList(adaptor, adaptor.outNode(n1), 1);
1396
  checkGraphOutArcList(adaptor, adaptor.inNode(n2), 1);
1397
  checkGraphOutArcList(adaptor, adaptor.outNode(n2), 0);
1398
  checkGraphOutArcList(adaptor, adaptor.inNode(n3), 1);
1399
  checkGraphOutArcList(adaptor, adaptor.outNode(n3), 1);
1400
  checkGraphOutArcList(adaptor, adaptor.inNode(n4), 1);
1401
  checkGraphOutArcList(adaptor, adaptor.outNode(n4), 2);
1410 1402

	
1411
  checkGraphInArcList(adaptor, rev_adaptor.inNode(n1), 1);
1412
  checkGraphInArcList(adaptor, rev_adaptor.outNode(n1), 1);
1413
  checkGraphInArcList(adaptor, rev_adaptor.inNode(n2), 1);
1414
  checkGraphInArcList(adaptor, rev_adaptor.outNode(n2), 0);
1415
  checkGraphInArcList(adaptor, rev_adaptor.inNode(n3), 1);
1416
  checkGraphInArcList(adaptor, rev_adaptor.outNode(n3), 1);
1417
  checkGraphInArcList(adaptor, rev_adaptor.inNode(n4), 1);
1418
  checkGraphInArcList(adaptor, rev_adaptor.outNode(n4), 2);
1403
  checkGraphInArcList(adaptor, adaptor.inNode(n1), 1);
1404
  checkGraphInArcList(adaptor, adaptor.outNode(n1), 1);
1405
  checkGraphInArcList(adaptor, adaptor.inNode(n2), 2);
1406
  checkGraphInArcList(adaptor, adaptor.outNode(n2), 1);
1407
  checkGraphInArcList(adaptor, adaptor.inNode(n3), 1);
1408
  checkGraphInArcList(adaptor, adaptor.outNode(n3), 1);
1409
  checkGraphInArcList(adaptor, adaptor.inNode(n4), 0);
1410
  checkGraphInArcList(adaptor, adaptor.outNode(n4), 1);
1419 1411

	
1420 1412
  checkNodeIds(adaptor);
1421 1413
  checkArcIds(adaptor);
1422 1414

	
1423 1415
  checkGraphNodeMap(adaptor);
1424 1416
  checkGraphArcMap(adaptor);
... ...
@@ -1435,35 +1427,20 @@
1435 1427
  checkArcIds(uadaptor);
1436 1428

	
1437 1429
  checkGraphNodeMap(uadaptor);
1438 1430
  checkGraphEdgeMap(uadaptor);
1439 1431
  checkGraphArcMap(uadaptor);
1440 1432

	
1441
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.inNode(n1), 2);
1442
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.outNode(n1), 2);
1443
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.inNode(n2), 3);
1444
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.outNode(n2), 1);
1445
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.inNode(n3), 2);
1446
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.outNode(n3), 2);
1447
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.inNode(n4), 1);
1448
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.outNode(n4), 3);
1449

	
1450
  // Check uuadaptor
1451
  checkGraphNodeList(uuadaptor, 8);
1452
  checkGraphEdgeList(uuadaptor, 16);
1453
  checkGraphArcList(uuadaptor, 32);
1454
  checkGraphConEdgeList(uuadaptor, 16);
1455
  checkGraphConArcList(uuadaptor, 32);
1456

	
1457
  checkNodeIds(uuadaptor);
1458
  checkEdgeIds(uuadaptor);
1459
  checkArcIds(uuadaptor);
1460

	
1461
  checkGraphNodeMap(uuadaptor);
1462
  checkGraphEdgeMap(uuadaptor);
1463
  checkGraphArcMap(uuadaptor);
1433
  checkGraphIncEdgeArcLists(uadaptor, adaptor.inNode(n1), 2);
1434
  checkGraphIncEdgeArcLists(uadaptor, adaptor.outNode(n1), 2);
1435
  checkGraphIncEdgeArcLists(uadaptor, adaptor.inNode(n2), 3);
1436
  checkGraphIncEdgeArcLists(uadaptor, adaptor.outNode(n2), 1);
1437
  checkGraphIncEdgeArcLists(uadaptor, adaptor.inNode(n3), 2);
1438
  checkGraphIncEdgeArcLists(uadaptor, adaptor.outNode(n3), 2);
1439
  checkGraphIncEdgeArcLists(uadaptor, adaptor.inNode(n4), 1);
1440
  checkGraphIncEdgeArcLists(uadaptor, adaptor.outNode(n4), 3);
1464 1441
}
1465 1442

	
1466 1443
int main(int, const char **) {
1467 1444
  // Check the digraph adaptors (using ListDigraph)
1468 1445
  checkReverseDigraph();
1469 1446
  checkSubDigraph();
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -80,13 +80,13 @@
80 80
    n = bfs_test.processNextNode();
81 81
    n = bfs_test.processNextNode(t, b);
82 82
    n = bfs_test.processNextNode(nm, n);
83 83
    n = const_bfs_test.nextNode();
84 84
    b = const_bfs_test.emptyQueue();
85 85
    i = const_bfs_test.queueSize();
86
    
86

	
87 87
    bfs_test.start();
88 88
    bfs_test.start(t);
89 89
    bfs_test.start(nm);
90 90

	
91 91
    l  = const_bfs_test.dist(t);
92 92
    e  = const_bfs_test.predArc(t);
... ...
@@ -101,37 +101,37 @@
101 101
      ::SetPredMap<concepts::ReadWriteMap<Node,Arc> >
102 102
      ::SetDistMap<concepts::ReadWriteMap<Node,int> >
103 103
      ::SetReachedMap<concepts::ReadWriteMap<Node,bool> >
104 104
      ::SetStandardProcessedMap
105 105
      ::SetProcessedMap<concepts::WriteMap<Node,bool> >
106 106
      ::Create bfs_test(G);
107
      
107

	
108 108
    concepts::ReadWriteMap<Node,Arc> pred_map;
109 109
    concepts::ReadWriteMap<Node,int> dist_map;
110 110
    concepts::ReadWriteMap<Node,bool> reached_map;
111 111
    concepts::WriteMap<Node,bool> processed_map;
112
    
112

	
113 113
    bfs_test
114 114
      .predMap(pred_map)
115 115
      .distMap(dist_map)
116 116
      .reachedMap(reached_map)
117 117
      .processedMap(processed_map);
118 118

	
119 119
    bfs_test.run(s);
120 120
    bfs_test.run(s,t);
121 121
    bfs_test.run();
122
    
122

	
123 123
    bfs_test.init();
124 124
    bfs_test.addSource(s);
125 125
    n = bfs_test.processNextNode();
126 126
    n = bfs_test.processNextNode(t, b);
127 127
    n = bfs_test.processNextNode(nm, n);
128 128
    n = bfs_test.nextNode();
129 129
    b = bfs_test.emptyQueue();
130 130
    i = bfs_test.queueSize();
131
    
131

	
132 132
    bfs_test.start();
133 133
    bfs_test.start(t);
134 134
    bfs_test.start(nm);
135 135

	
136 136
    l  = bfs_test.dist(t);
137 137
    e  = bfs_test.predArc(t);
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -78,29 +78,34 @@
78 78
            ::SetFlowMap<FlowMap>
79 79
            ::SetElevator<Elev>
80 80
            ::SetStandardElevator<LinkedElev>
81 81
            ::Create CirculationType;
82 82
  CirculationType circ_test(g, lcap, ucap, supply);
83 83
  const CirculationType& const_circ_test = circ_test;
84
   
84

	
85 85
  circ_test
86 86
    .lowerMap(lcap)
87 87
    .upperMap(ucap)
88 88
    .supplyMap(supply)
89 89
    .flowMap(flow);
90 90

	
91
  const CirculationType::Elevator& elev = const_circ_test.elevator();
92
  circ_test.elevator(const_cast<CirculationType::Elevator&>(elev));
93
  CirculationType::Tolerance tol = const_circ_test.tolerance();
94
  circ_test.tolerance(tol);
95

	
91 96
  circ_test.init();
92 97
  circ_test.greedyInit();
93 98
  circ_test.start();
94 99
  circ_test.run();
95 100

	
96 101
  v = const_circ_test.flow(a);
97 102
  const FlowMap& fm = const_circ_test.flowMap();
98 103
  b = const_circ_test.barrier(n);
99 104
  const_circ_test.barrierMap(bar);
100
  
105

	
101 106
  ignore_unused_variable_warning(fm);
102 107
}
103 108

	
104 109
template <class G, class LM, class UM, class DM>
105 110
void checkCirculation(const G& g, const LM& lm, const UM& um,
106 111
                      const DM& dm, bool find)
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -26,18 +26,18 @@
26 26

	
27 27

	
28 28
int main()
29 29
{
30 30
  typedef ListDigraph Digraph;
31 31
  typedef Undirector<Digraph> Graph;
32
  
32

	
33 33
  {
34 34
    Digraph d;
35 35
    Digraph::NodeMap<int> order(d);
36 36
    Graph g(d);
37
    
37

	
38 38
    check(stronglyConnected(d), "The empty digraph is strongly connected");
39 39
    check(countStronglyConnectedComponents(d) == 0,
40 40
          "The empty digraph has 0 strongly connected component");
41 41
    check(connected(g), "The empty graph is connected");
42 42
    check(countConnectedComponents(g) == 0,
43 43
          "The empty graph has 0 connected component");
... ...
@@ -45,13 +45,13 @@
45 45
    check(biNodeConnected(g), "The empty graph is bi-node-connected");
46 46
    check(countBiNodeConnectedComponents(g) == 0,
47 47
          "The empty graph has 0 bi-node-connected component");
48 48
    check(biEdgeConnected(g), "The empty graph is bi-edge-connected");
49 49
    check(countBiEdgeConnectedComponents(g) == 0,
50 50
          "The empty graph has 0 bi-edge-connected component");
51
          
51

	
52 52
    check(dag(d), "The empty digraph is DAG.");
53 53
    check(checkedTopologicalSort(d, order), "The empty digraph is DAG.");
54 54
    check(loopFree(d), "The empty digraph is loop-free.");
55 55
    check(parallelFree(d), "The empty digraph is parallel-free.");
56 56
    check(simpleGraph(d), "The empty digraph is simple.");
57 57

	
... ...
@@ -79,13 +79,13 @@
79 79
    check(biNodeConnected(g), "This graph is bi-node-connected");
80 80
    check(countBiNodeConnectedComponents(g) == 0,
81 81
          "This graph has 0 bi-node-connected component");
82 82
    check(biEdgeConnected(g), "This graph is bi-edge-connected");
83 83
    check(countBiEdgeConnectedComponents(g) == 1,
84 84
          "This graph has 1 bi-edge-connected component");
85
          
85

	
86 86
    check(dag(d), "This digraph is DAG.");
87 87
    check(checkedTopologicalSort(d, order), "This digraph is DAG.");
88 88
    check(loopFree(d), "This digraph is loop-free.");
89 89
    check(parallelFree(d), "This digraph is parallel-free.");
90 90
    check(simpleGraph(d), "This digraph is simple.");
91 91

	
... ...
@@ -98,20 +98,20 @@
98 98
  }
99 99

	
100 100
  {
101 101
    Digraph d;
102 102
    Digraph::NodeMap<int> order(d);
103 103
    Graph g(d);
104
    
104

	
105 105
    Digraph::Node n1 = d.addNode();
106 106
    Digraph::Node n2 = d.addNode();
107 107
    Digraph::Node n3 = d.addNode();
108 108
    Digraph::Node n4 = d.addNode();
109 109
    Digraph::Node n5 = d.addNode();
110 110
    Digraph::Node n6 = d.addNode();
111
    
111

	
112 112
    d.addArc(n1, n3);
113 113
    d.addArc(n3, n2);
114 114
    d.addArc(n2, n1);
115 115
    d.addArc(n4, n2);
116 116
    d.addArc(n4, n3);
117 117
    d.addArc(n5, n6);
... ...
@@ -133,29 +133,29 @@
133 133
    check(!acyclic(g), "This graph is not acyclic.");
134 134
    check(!tree(g), "This graph is not tree.");
135 135
    check(!bipartite(g), "This graph is not bipartite.");
136 136
    check(loopFree(g), "This graph is loop-free.");
137 137
    check(!parallelFree(g), "This graph is not parallel-free.");
138 138
    check(!simpleGraph(g), "This graph is not simple.");
139
    
139

	
140 140
    d.addArc(n3, n3);
141
    
141

	
142 142
    check(!loopFree(d), "This digraph is not loop-free.");
143 143
    check(!loopFree(g), "This graph is not loop-free.");
144 144
    check(!simpleGraph(d), "This digraph is not simple.");
145
    
145

	
146 146
    d.addArc(n3, n2);
147
    
147

	
148 148
    check(!parallelFree(d), "This digraph is not parallel-free.");
149 149
  }
150
  
150

	
151 151
  {
152 152
    Digraph d;
153 153
    Digraph::ArcMap<bool> cutarcs(d, false);
154 154
    Graph g(d);
155
    
155

	
156 156
    Digraph::Node n1 = d.addNode();
157 157
    Digraph::Node n2 = d.addNode();
158 158
    Digraph::Node n3 = d.addNode();
159 159
    Digraph::Node n4 = d.addNode();
160 160
    Digraph::Node n5 = d.addNode();
161 161
    Digraph::Node n6 = d.addNode();
... ...
@@ -169,13 +169,13 @@
169 169
    d.addArc(n6, n4);
170 170
    d.addArc(n4, n6);
171 171
    d.addArc(n2, n5);
172 172
    d.addArc(n1, n8);
173 173
    d.addArc(n6, n7);
174 174
    d.addArc(n7, n6);
175
   
175

	
176 176
    check(!stronglyConnected(d), "This digraph is not strongly connected");
177 177
    check(countStronglyConnectedComponents(d) == 3,
178 178
          "This digraph has 3 strongly connected components");
179 179
    Digraph::NodeMap<int> scomp1(d);
180 180
    check(stronglyConnectedComponents(d, scomp1) == 3,
181 181
          "This digraph has 3 strongly connected components");
... ...
@@ -232,13 +232,13 @@
232 232

	
233 233
  {
234 234
    // DAG example for topological sort from the book New Algorithms
235 235
    // (T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein)
236 236
    Digraph d;
237 237
    Digraph::NodeMap<int> order(d);
238
    
238

	
239 239
    Digraph::Node belt = d.addNode();
240 240
    Digraph::Node trousers = d.addNode();
241 241
    Digraph::Node necktie = d.addNode();
242 242
    Digraph::Node coat = d.addNode();
243 243
    Digraph::Node socks = d.addNode();
244 244
    Digraph::Node shirt = d.addNode();
... ...
@@ -252,25 +252,25 @@
252 252
    d.addArc(trousers, shoe);
253 253
    d.addArc(trousers, belt);
254 254
    d.addArc(belt, coat);
255 255
    d.addArc(shirt, belt);
256 256
    d.addArc(shirt, necktie);
257 257
    d.addArc(necktie, coat);
258
    
258

	
259 259
    check(dag(d), "This digraph is DAG.");
260 260
    topologicalSort(d, order);
261 261
    for (Digraph::ArcIt a(d); a != INVALID; ++a) {
262 262
      check(order[d.source(a)] < order[d.target(a)],
263 263
            "Wrong topologicalSort()");
264 264
    }
265 265
  }
266 266

	
267 267
  {
268 268
    ListGraph g;
269 269
    ListGraph::NodeMap<bool> map(g);
270
    
270

	
271 271
    ListGraph::Node n1 = g.addNode();
272 272
    ListGraph::Node n2 = g.addNode();
273 273
    ListGraph::Node n3 = g.addNode();
274 274
    ListGraph::Node n4 = g.addNode();
275 275
    ListGraph::Node n5 = g.addNode();
276 276
    ListGraph::Node n6 = g.addNode();
... ...
@@ -280,16 +280,16 @@
280 280
    g.addEdge(n1, n4);
281 281
    g.addEdge(n2, n5);
282 282
    g.addEdge(n3, n6);
283 283
    g.addEdge(n4, n6);
284 284
    g.addEdge(n4, n7);
285 285
    g.addEdge(n5, n7);
286
   
286

	
287 287
    check(bipartite(g), "This graph is bipartite");
288 288
    check(bipartitePartitions(g, map), "This graph is bipartite");
289
    
289

	
290 290
    check(map[n1] == map[n2] && map[n1] == map[n6] && map[n1] == map[n7],
291 291
          "Wrong bipartitePartitions()");
292 292
    check(map[n3] == map[n4] && map[n3] == map[n5],
293 293
          "Wrong bipartitePartitions()");
294 294
  }
295 295

	
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -83,13 +83,13 @@
83 83
    dfs_test.init();
84 84
    dfs_test.addSource(s);
85 85
    e = dfs_test.processNextArc();
86 86
    e = const_dfs_test.nextArc();
87 87
    b = const_dfs_test.emptyQueue();
88 88
    i = const_dfs_test.queueSize();
89
    
89

	
90 90
    dfs_test.start();
91 91
    dfs_test.start(t);
92 92
    dfs_test.start(am);
93 93

	
94 94
    l  = const_dfs_test.dist(t);
95 95
    e  = const_dfs_test.predArc(t);
... ...
@@ -109,13 +109,13 @@
109 109
      ::Create dfs_test(G);
110 110

	
111 111
    concepts::ReadWriteMap<Node,Arc> pred_map;
112 112
    concepts::ReadWriteMap<Node,int> dist_map;
113 113
    concepts::ReadWriteMap<Node,bool> reached_map;
114 114
    concepts::WriteMap<Node,bool> processed_map;
115
    
115

	
116 116
    dfs_test
117 117
      .predMap(pred_map)
118 118
      .distMap(dist_map)
119 119
      .reachedMap(reached_map)
120 120
      .processedMap(processed_map);
121 121

	
... ...
@@ -126,13 +126,13 @@
126 126

	
127 127
    dfs_test.addSource(s);
128 128
    e = dfs_test.processNextArc();
129 129
    e = dfs_test.nextArc();
130 130
    b = dfs_test.emptyQueue();
131 131
    i = dfs_test.queueSize();
132
    
132

	
133 133
    dfs_test.start();
134 134
    dfs_test.start(t);
135 135
    dfs_test.start(am);
136 136

	
137 137
    l  = dfs_test.dist(t);
138 138
    e  = dfs_test.predArc(t);
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -16,12 +16,13 @@
16 16
 *
17 17
 */
18 18

	
19 19
#include <lemon/concepts/digraph.h>
20 20
#include <lemon/list_graph.h>
21 21
#include <lemon/smart_graph.h>
22
#include <lemon/static_graph.h>
22 23
#include <lemon/full_graph.h>
23 24

	
24 25
#include "test_tools.h"
25 26
#include "graph_test.h"
26 27

	
27 28
using namespace lemon;
... ...
@@ -32,12 +33,15 @@
32 33
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
33 34
  Digraph G;
34 35

	
35 36
  checkGraphNodeList(G, 0);
36 37
  checkGraphArcList(G, 0);
37 38

	
39
  G.reserveNode(3);
40
  G.reserveArc(4);
41

	
38 42
  Node
39 43
    n1 = G.addNode(),
40 44
    n2 = G.addNode(),
41 45
    n3 = G.addNode();
42 46
  checkGraphNodeList(G, 3);
43 47
  checkGraphArcList(G, 0);
... ...
@@ -280,12 +284,20 @@
280 284
  G.addNode();
281 285
  snapshot.save(G);
282 286

	
283 287
  G.addArc(G.addNode(), G.addNode());
284 288

	
285 289
  snapshot.restore();
290
  snapshot.save(G);
291

	
292
  checkGraphNodeList(G, 4);
293
  checkGraphArcList(G, 4);
294

	
295
  G.addArc(G.addNode(), G.addNode());
296

	
297
  snapshot.restore();
286 298

	
287 299
  checkGraphNodeList(G, 4);
288 300
  checkGraphArcList(G, 4);
289 301
}
290 302

	
291 303
void checkConcepts() {
... ...
@@ -314,12 +326,16 @@
314 326
  { // Checking SmartDigraph
315 327
    checkConcept<Digraph, SmartDigraph>();
316 328
    checkConcept<AlterableDigraphComponent<>, SmartDigraph>();
317 329
    checkConcept<ExtendableDigraphComponent<>, SmartDigraph>();
318 330
    checkConcept<ClearableDigraphComponent<>, SmartDigraph>();
319 331
  }
332
  { // Checking StaticDigraph
333
    checkConcept<Digraph, StaticDigraph>();
334
    checkConcept<ClearableDigraphComponent<>, StaticDigraph>();
335
  }
320 336
  { // Checking FullDigraph
321 337
    checkConcept<Digraph, FullDigraph>();
322 338
  }
323 339
}
324 340

	
325 341
template <typename Digraph>
... ...
@@ -369,16 +385,128 @@
369 385
  check(g.valid(e2), "Wrong validity check");
370 386

	
371 387
  check(!g.valid(g.nodeFromId(-1)), "Wrong validity check");
372 388
  check(!g.valid(g.arcFromId(-1)), "Wrong validity check");
373 389
}
374 390

	
391
void checkStaticDigraph() {
392
  SmartDigraph g;
393
  SmartDigraph::NodeMap<StaticDigraph::Node> nref(g);
394
  SmartDigraph::ArcMap<StaticDigraph::Arc> aref(g);
395

	
396
  StaticDigraph G;
397

	
398
  checkGraphNodeList(G, 0);
399
  checkGraphArcList(G, 0);
400

	
401
  G.build(g, nref, aref);
402

	
403
  checkGraphNodeList(G, 0);
404
  checkGraphArcList(G, 0);
405

	
406
  SmartDigraph::Node
407
    n1 = g.addNode(),
408
    n2 = g.addNode(),
409
    n3 = g.addNode();
410

	
411
  G.build(g, nref, aref);
412

	
413
  checkGraphNodeList(G, 3);
414
  checkGraphArcList(G, 0);
415

	
416
  SmartDigraph::Arc a1 = g.addArc(n1, n2);
417

	
418
  G.build(g, nref, aref);
419

	
420
  check(G.source(aref[a1]) == nref[n1] && G.target(aref[a1]) == nref[n2],
421
        "Wrong arc or wrong references");
422
  checkGraphNodeList(G, 3);
423
  checkGraphArcList(G, 1);
424

	
425
  checkGraphOutArcList(G, nref[n1], 1);
426
  checkGraphOutArcList(G, nref[n2], 0);
427
  checkGraphOutArcList(G, nref[n3], 0);
428

	
429
  checkGraphInArcList(G, nref[n1], 0);
430
  checkGraphInArcList(G, nref[n2], 1);
431
  checkGraphInArcList(G, nref[n3], 0);
432

	
433
  checkGraphConArcList(G, 1);
434

	
435
  SmartDigraph::Arc
436
    a2 = g.addArc(n2, n1),
437
    a3 = g.addArc(n2, n3),
438
    a4 = g.addArc(n2, n3);
439

	
440
  digraphCopy(g, G).nodeRef(nref).run();
441

	
442
  checkGraphNodeList(G, 3);
443
  checkGraphArcList(G, 4);
444

	
445
  checkGraphOutArcList(G, nref[n1], 1);
446
  checkGraphOutArcList(G, nref[n2], 3);
447
  checkGraphOutArcList(G, nref[n3], 0);
448

	
449
  checkGraphInArcList(G, nref[n1], 1);
450
  checkGraphInArcList(G, nref[n2], 1);
451
  checkGraphInArcList(G, nref[n3], 2);
452

	
453
  checkGraphConArcList(G, 4);
454

	
455
  std::vector<std::pair<int,int> > arcs;
456
  arcs.push_back(std::make_pair(0,1));
457
  arcs.push_back(std::make_pair(0,2));
458
  arcs.push_back(std::make_pair(1,3));
459
  arcs.push_back(std::make_pair(1,2));
460
  arcs.push_back(std::make_pair(3,0));
461
  arcs.push_back(std::make_pair(3,3));
462
  arcs.push_back(std::make_pair(4,2));
463
  arcs.push_back(std::make_pair(4,3));
464
  arcs.push_back(std::make_pair(4,1));
465

	
466
  G.build(6, arcs.begin(), arcs.end());
467

	
468
  checkGraphNodeList(G, 6);
469
  checkGraphArcList(G, 9);
470

	
471
  checkGraphOutArcList(G, G.node(0), 2);
472
  checkGraphOutArcList(G, G.node(1), 2);
473
  checkGraphOutArcList(G, G.node(2), 0);
474
  checkGraphOutArcList(G, G.node(3), 2);
475
  checkGraphOutArcList(G, G.node(4), 3);
476
  checkGraphOutArcList(G, G.node(5), 0);
477

	
478
  checkGraphInArcList(G, G.node(0), 1);
479
  checkGraphInArcList(G, G.node(1), 2);
480
  checkGraphInArcList(G, G.node(2), 3);
481
  checkGraphInArcList(G, G.node(3), 3);
482
  checkGraphInArcList(G, G.node(4), 0);
483
  checkGraphInArcList(G, G.node(5), 0);
484

	
485
  checkGraphConArcList(G, 9);
486

	
487
  checkNodeIds(G);
488
  checkArcIds(G);
489
  checkGraphNodeMap(G);
490
  checkGraphArcMap(G);
491

	
492
  int n = G.nodeNum();
493
  int m = G.arcNum();
494
  check(G.index(G.node(n-1)) == n-1, "Wrong index.");
495
  check(G.index(G.arc(m-1)) == m-1, "Wrong index.");
496
}
497

	
375 498
void checkFullDigraph(int num) {
376 499
  typedef FullDigraph Digraph;
377 500
  DIGRAPH_TYPEDEFS(Digraph);
501

	
378 502
  Digraph G(num);
503
  check(G.nodeNum() == num && G.arcNum() == num * num, "Wrong size");
504

	
505
  G.resize(num);
506
  check(G.nodeNum() == num && G.arcNum() == num * num, "Wrong size");
379 507

	
380 508
  checkGraphNodeList(G, num);
381 509
  checkGraphArcList(G, num * num);
382 510

	
383 511
  for (NodeIt n(G); n != INVALID; ++n) {
384 512
    checkGraphOutArcList(G, n, num);
... ...
@@ -416,12 +544,15 @@
416 544
  { // Checking SmartDigraph
417 545
    checkDigraphBuild<SmartDigraph>();
418 546
    checkDigraphSplit<SmartDigraph>();
419 547
    checkDigraphSnapshot<SmartDigraph>();
420 548
    checkDigraphValidity<SmartDigraph>();
421 549
  }
550
  { // Checking StaticDigraph
551
    checkStaticDigraph();
552
  }
422 553
  { // Checking FullDigraph
423 554
    checkFullDigraph(8);
424 555
  }
425 556
}
426 557

	
427 558
int main() {
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -82,13 +82,13 @@
82 82
    dijkstra_test.addSource(s);
83 83
    dijkstra_test.addSource(s, 1);
84 84
    n = dijkstra_test.processNextNode();
85 85
    n = const_dijkstra_test.nextNode();
86 86
    b = const_dijkstra_test.emptyQueue();
87 87
    i = const_dijkstra_test.queueSize();
88
    
88

	
89 89
    dijkstra_test.start();
90 90
    dijkstra_test.start(t);
91 91
    dijkstra_test.start(nm);
92 92

	
93 93
    l  = const_dijkstra_test.dist(t);
94 94
    e  = const_dijkstra_test.predArc(t);
... ...
@@ -106,23 +106,23 @@
106 106
      ::SetDistMap<concepts::ReadWriteMap<Node,VType> >
107 107
      ::SetStandardProcessedMap
108 108
      ::SetProcessedMap<concepts::WriteMap<Node,bool> >
109 109
      ::SetOperationTraits<DijkstraDefaultOperationTraits<VType> >
110 110
      ::SetHeap<BinHeap<VType, concepts::ReadWriteMap<Node,int> > >
111 111
      ::SetStandardHeap<BinHeap<VType, concepts::ReadWriteMap<Node,int> > >
112
      ::SetHeap<BinHeap<VType, concepts::ReadWriteMap<Node,int> >, 
112
      ::SetHeap<BinHeap<VType, concepts::ReadWriteMap<Node,int> >,
113 113
                concepts::ReadWriteMap<Node,int> >
114 114
      ::Create dijkstra_test(G,length);
115 115

	
116 116
    LengthMap length_map;
117 117
    concepts::ReadWriteMap<Node,Arc> pred_map;
118 118
    concepts::ReadWriteMap<Node,VType> dist_map;
119 119
    concepts::WriteMap<Node,bool> processed_map;
120 120
    concepts::ReadWriteMap<Node,int> heap_cross_ref;
121 121
    BinHeap<VType, concepts::ReadWriteMap<Node,int> > heap(heap_cross_ref);
122
    
122

	
123 123
    dijkstra_test
124 124
      .lengthMap(length_map)
125 125
      .predMap(pred_map)
126 126
      .distMap(dist_map)
127 127
      .processedMap(processed_map)
128 128
      .heap(heap, heap_cross_ref);
... ...
@@ -133,13 +133,13 @@
133 133
    dijkstra_test.addSource(s);
134 134
    dijkstra_test.addSource(s, 1);
135 135
    n = dijkstra_test.processNextNode();
136 136
    n = dijkstra_test.nextNode();
137 137
    b = dijkstra_test.emptyQueue();
138 138
    i = dijkstra_test.queueSize();
139
    
139

	
140 140
    dijkstra_test.start();
141 141
    dijkstra_test.start(t);
142 142
    dijkstra_test.start(nm);
143 143

	
144 144
    l  = dijkstra_test.dist(t);
145 145
    e  = dijkstra_test.predArc(t);
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -82,17 +82,17 @@
82 82
}
83 83

	
84 84
int main()
85 85
{
86 86
  typedef ListDigraph Digraph;
87 87
  typedef Undirector<Digraph> Graph;
88
  
88

	
89 89
  {
90 90
    Digraph d;
91 91
    Graph g(d);
92
    
92

	
93 93
    checkDiEulerIt(d);
94 94
    checkDiEulerIt(g);
95 95
    checkEulerIt(g);
96 96

	
97 97
    check(eulerian(d), "This graph is Eulerian");
98 98
    check(eulerian(g), "This graph is Eulerian");
... ...
@@ -125,13 +125,13 @@
125 125
  {
126 126
    Digraph d;
127 127
    Graph g(d);
128 128
    Digraph::Node n1 = d.addNode();
129 129
    Digraph::Node n2 = d.addNode();
130 130
    Digraph::Node n3 = d.addNode();
131
    
131

	
132 132
    d.addArc(n1, n2);
133 133
    d.addArc(n2, n1);
134 134
    d.addArc(n2, n3);
135 135
    d.addArc(n3, n2);
136 136

	
137 137
    checkDiEulerIt(d);
... ...
@@ -150,13 +150,13 @@
150 150
    Digraph::Node n1 = d.addNode();
151 151
    Digraph::Node n2 = d.addNode();
152 152
    Digraph::Node n3 = d.addNode();
153 153
    Digraph::Node n4 = d.addNode();
154 154
    Digraph::Node n5 = d.addNode();
155 155
    Digraph::Node n6 = d.addNode();
156
    
156

	
157 157
    d.addArc(n1, n2);
158 158
    d.addArc(n2, n4);
159 159
    d.addArc(n1, n3);
160 160
    d.addArc(n3, n4);
161 161
    d.addArc(n4, n1);
162 162
    d.addArc(n3, n5);
... ...
@@ -186,13 +186,13 @@
186 186
    Digraph::Node n0 = d.addNode();
187 187
    Digraph::Node n1 = d.addNode();
188 188
    Digraph::Node n2 = d.addNode();
189 189
    Digraph::Node n3 = d.addNode();
190 190
    Digraph::Node n4 = d.addNode();
191 191
    Digraph::Node n5 = d.addNode();
192
    
192

	
193 193
    d.addArc(n1, n2);
194 194
    d.addArc(n2, n3);
195 195
    d.addArc(n3, n1);
196 196

	
197 197
    checkDiEulerIt(d);
198 198
    checkDiEulerIt(d, n2);
... ...
@@ -208,13 +208,13 @@
208 208
  {
209 209
    Digraph d;
210 210
    Graph g(d);
211 211
    Digraph::Node n1 = d.addNode();
212 212
    Digraph::Node n2 = d.addNode();
213 213
    Digraph::Node n3 = d.addNode();
214
    
214

	
215 215
    d.addArc(n1, n2);
216 216
    d.addArc(n2, n3);
217 217

	
218 218
    check(!eulerian(d), "This graph is not Eulerian");
219 219
    check(!eulerian(g), "This graph is not Eulerian");
220 220
  }
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2010
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
1 19
#include <iostream>
2 20

	
3 21
#include "test_tools.h"
4 22
#include <lemon/smart_graph.h>
5 23
#include <lemon/concepts/graph.h>
6 24
#include <lemon/concepts/maps.h>
... ...
@@ -30,13 +48,13 @@
30 48
  "0 3  5     10\n"
31 49
  "0 3  6     7\n"
32 50
  "4 2  7     1\n"
33 51
  "@attributes\n"
34 52
  "source 0\n"
35 53
  "target 3\n";
36
  
54

	
37 55
void checkGomoryHuCompile()
38 56
{
39 57
  typedef int Value;
40 58
  typedef concepts::Graph Graph;
41 59

	
42 60
  typedef Graph::Node Node;
... ...
@@ -66,13 +84,13 @@
66 84

	
67 85
GRAPH_TYPEDEFS(Graph);
68 86
typedef Graph::EdgeMap<int> IntEdgeMap;
69 87
typedef Graph::NodeMap<bool> BoolNodeMap;
70 88

	
71 89
int cutValue(const Graph& graph, const BoolNodeMap& cut,
72
	     const IntEdgeMap& capacity) {
90
             const IntEdgeMap& capacity) {
73 91

	
74 92
  int sum = 0;
75 93
  for (EdgeIt e(graph); e != INVALID; ++e) {
76 94
    Node s = graph.u(e);
77 95
    Node t = graph.v(e);
78 96

	
... ...
@@ -104,20 +122,20 @@
104 122
      check(pf.flowValue() == ght.minCutValue(u, v), "Wrong cut 1");
105 123
      check(cm[u] != cm[v], "Wrong cut 2");
106 124
      check(pf.flowValue() == cutValue(graph, cm, capacity), "Wrong cut 3");
107 125

	
108 126
      int sum=0;
109 127
      for(GomoryHu<Graph>::MinCutEdgeIt a(ght, u, v);a!=INVALID;++a)
110
        sum+=capacity[a]; 
128
        sum+=capacity[a];
111 129
      check(sum == ght.minCutValue(u, v), "Problem with MinCutEdgeIt");
112 130

	
113 131
      sum=0;
114 132
      for(GomoryHu<Graph>::MinCutNodeIt n(ght, u, v,true);n!=INVALID;++n)
115 133
        sum++;
116 134
      for(GomoryHu<Graph>::MinCutNodeIt n(ght, u, v,false);n!=INVALID;++n)
117 135
        sum++;
118 136
      check(sum == countNodes(graph), "Problem with MinCutNodeIt");
119 137
    }
120 138
  }
121
  
139

	
122 140
  return 0;
123 141
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -35,12 +35,15 @@
35 35

	
36 36
  Graph G;
37 37
  checkGraphNodeList(G, 0);
38 38
  checkGraphEdgeList(G, 0);
39 39
  checkGraphArcList(G, 0);
40 40

	
41
  G.reserveNode(3);
42
  G.reserveEdge(3);
43

	
41 44
  Node
42 45
    n1 = G.addNode(),
43 46
    n2 = G.addNode(),
44 47
    n3 = G.addNode();
45 48
  checkGraphNodeList(G, 3);
46 49
  checkGraphEdgeList(G, 0);
... ...
@@ -253,23 +256,39 @@
253 256
  G.addNode();
254 257
  snapshot.save(G);
255 258

	
256 259
  G.addEdge(G.addNode(), G.addNode());
257 260

	
258 261
  snapshot.restore();
262
  snapshot.save(G);
263

	
264
  checkGraphNodeList(G, 4);
265
  checkGraphEdgeList(G, 3);
266
  checkGraphArcList(G, 6);
267

	
268
  G.addEdge(G.addNode(), G.addNode());
269

	
270
  snapshot.restore();
259 271

	
260 272
  checkGraphNodeList(G, 4);
261 273
  checkGraphEdgeList(G, 3);
262 274
  checkGraphArcList(G, 6);
263 275
}
264 276

	
265 277
void checkFullGraph(int num) {
266 278
  typedef FullGraph Graph;
267 279
  GRAPH_TYPEDEFS(Graph);
268 280

	
269 281
  Graph G(num);
282
  check(G.nodeNum() == num && G.edgeNum() == num * (num - 1) / 2,
283
        "Wrong size");
284

	
285
  G.resize(num);
286
  check(G.nodeNum() == num && G.edgeNum() == num * (num - 1) / 2,
287
        "Wrong size");
288

	
270 289
  checkGraphNodeList(G, num);
271 290
  checkGraphEdgeList(G, num * (num - 1) / 2);
272 291

	
273 292
  for (NodeIt n(G); n != INVALID; ++n) {
274 293
    checkGraphOutArcList(G, n, num - 1);
275 294
    checkGraphInArcList(G, n, num - 1);
... ...
@@ -408,12 +427,16 @@
408 427
  GRAPH_TYPEDEFS(Graph);
409 428
  Graph G(width, height);
410 429

	
411 430
  check(G.width() == width, "Wrong column number");
412 431
  check(G.height() == height, "Wrong row number");
413 432

	
433
  G.resize(width, height);
434
  check(G.width() == width, "Wrong column number");
435
  check(G.height() == height, "Wrong row number");
436

	
414 437
  for (int i = 0; i < width; ++i) {
415 438
    for (int j = 0; j < height; ++j) {
416 439
      check(G.col(G(i, j)) == i, "Wrong column");
417 440
      check(G.row(G(i, j)) == j, "Wrong row");
418 441
      check(G.pos(G(i, j)).x == i, "Wrong column");
419 442
      check(G.pos(G(i, j)).y == j, "Wrong row");
... ...
@@ -483,12 +506,17 @@
483 506
}
484 507

	
485 508
void checkHypercubeGraph(int dim) {
486 509
  GRAPH_TYPEDEFS(HypercubeGraph);
487 510

	
488 511
  HypercubeGraph G(dim);
512
  check(G.dimension() == dim, "Wrong dimension");
513

	
514
  G.resize(dim);
515
  check(G.dimension() == dim, "Wrong dimension");
516

	
489 517
  checkGraphNodeList(G, 1 << dim);
490 518
  checkGraphEdgeList(G, dim * (1 << (dim-1)));
491 519
  checkGraphArcList(G, dim * (1 << dim));
492 520

	
493 521
  Node n = G.nodeFromId(dim);
494 522

	
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -80,13 +80,13 @@
80 80

	
81 81
  v = const_ho_test.minCutValue();
82 82
  v = const_ho_test.minCutMap(cut);
83 83
}
84 84

	
85 85
template <typename Graph, typename CapMap, typename CutMap>
86
typename CapMap::Value 
86
typename CapMap::Value
87 87
  cutValue(const Graph& graph, const CapMap& cap, const CutMap& cut)
88 88
{
89 89
  typename CapMap::Value sum = 0;
90 90
  for (typename Graph::ArcIt a(graph); a != INVALID; ++a) {
91 91
    if (cut[graph.source(a)] && !cut[graph.target(a)])
92 92
      sum += cap[a];
... ...
@@ -107,13 +107,13 @@
107 107
    .run();
108 108

	
109 109
  {
110 110
    HaoOrlin<SmartDigraph> ho(graph, cap1);
111 111
    ho.run();
112 112
    ho.minCutMap(cut);
113
    
113

	
114 114
    check(ho.minCutValue() == 1, "Wrong cut value");
115 115
    check(ho.minCutValue() == cutValue(graph, cap1, cut), "Wrong cut value");
116 116
  }
117 117
  {
118 118
    HaoOrlin<SmartDigraph> ho(graph, cap2);
119 119
    ho.run();
... ...
@@ -123,41 +123,41 @@
123 123
    check(ho.minCutValue() == cutValue(graph, cap2, cut), "Wrong cut value");
124 124
  }
125 125
  {
126 126
    HaoOrlin<SmartDigraph> ho(graph, cap3);
127 127
    ho.run();
128 128
    ho.minCutMap(cut);
129
    
129

	
130 130
    check(ho.minCutValue() == 1, "Wrong cut value");
131 131
    check(ho.minCutValue() == cutValue(graph, cap3, cut), "Wrong cut value");
132 132
  }
133
  
133

	
134 134
  typedef Undirector<SmartDigraph> UGraph;
135 135
  UGraph ugraph(graph);
136
  
136

	
137 137
  {
138 138
    HaoOrlin<UGraph, SmartDigraph::ArcMap<int> > ho(ugraph, cap1);
139 139
    ho.run();
140 140
    ho.minCutMap(cut);
141
    
141

	
142 142
    check(ho.minCutValue() == 2, "Wrong cut value");
143 143
    check(ho.minCutValue() == cutValue(ugraph, cap1, cut), "Wrong cut value");
144 144
  }
145 145
  {
146 146
    HaoOrlin<UGraph, SmartDigraph::ArcMap<int> > ho(ugraph, cap2);
147 147
    ho.run();
148 148
    ho.minCutMap(cut);
149
    
149

	
150 150
    check(ho.minCutValue() == 5, "Wrong cut value");
151 151
    check(ho.minCutValue() == cutValue(ugraph, cap2, cut), "Wrong cut value");
152 152
  }
153 153
  {
154 154
    HaoOrlin<UGraph, SmartDigraph::ArcMap<int> > ho(ugraph, cap3);
155 155
    ho.run();
156 156
    ho.minCutMap(cut);
157
    
157

	
158 158
    check(ho.minCutValue() == 5, "Wrong cut value");
159 159
    check(ho.minCutValue() == cutValue(ugraph, cap3, cut), "Wrong cut value");
160 160
  }
161 161

	
162 162
  return 0;
163 163
}
Ignore white space 6 line context
... ...
@@ -22,20 +22,23 @@
22 22
#include <vector>
23 23

	
24 24
#include <lemon/concept_check.h>
25 25
#include <lemon/concepts/heap.h>
26 26

	
27 27
#include <lemon/smart_graph.h>
28

	
29 28
#include <lemon/lgf_reader.h>
30 29
#include <lemon/dijkstra.h>
31 30
#include <lemon/maps.h>
32 31

	
33 32
#include <lemon/bin_heap.h>
33
#include <lemon/quad_heap.h>
34
#include <lemon/dheap.h>
34 35
#include <lemon/fib_heap.h>
36
#include <lemon/pairing_heap.h>
35 37
#include <lemon/radix_heap.h>
38
#include <lemon/binomial_heap.h>
36 39
#include <lemon/bucket_heap.h>
37 40

	
38 41
#include "test_tools.h"
39 42

	
40 43
using namespace lemon;
41 44
using namespace lemon::concepts;
... ...
@@ -86,53 +89,48 @@
86 89

	
87 90
int test_len = sizeof(test_seq) / sizeof(test_seq[0]);
88 91

	
89 92
template <typename Heap>
90 93
void heapSortTest() {
91 94
  RangeMap<int> map(test_len, -1);
92

	
93 95
  Heap heap(map);
94 96

	
95 97
  std::vector<int> v(test_len);
96

	
97 98
  for (int i = 0; i < test_len; ++i) {
98 99
    v[i] = test_seq[i];
99 100
    heap.push(i, v[i]);
100 101
  }
101 102
  std::sort(v.begin(), v.end());
102 103
  for (int i = 0; i < test_len; ++i) {
103
    check(v[i] == heap.prio() ,"Wrong order in heap sort.");
104
    check(v[i] == heap.prio(), "Wrong order in heap sort.");
104 105
    heap.pop();
105 106
  }
106 107
}
107 108

	
108 109
template <typename Heap>
109 110
void heapIncreaseTest() {
110 111
  RangeMap<int> map(test_len, -1);
111 112

	
112 113
  Heap heap(map);
113 114

	
114 115
  std::vector<int> v(test_len);
115

	
116 116
  for (int i = 0; i < test_len; ++i) {
117 117
    v[i] = test_seq[i];
118 118
    heap.push(i, v[i]);
119 119
  }
120 120
  for (int i = 0; i < test_len; ++i) {
121 121
    v[i] += test_inc[i];
122 122
    heap.increase(i, v[i]);
123 123
  }
124 124
  std::sort(v.begin(), v.end());
125 125
  for (int i = 0; i < test_len; ++i) {
126
    check(v[i] == heap.prio() ,"Wrong order in heap increase test.");
126
    check(v[i] == heap.prio(), "Wrong order in heap increase test.");
127 127
    heap.pop();
128 128
  }
129 129
}
130 130

	
131

	
132

	
133 131
template <typename Heap>
134 132
void dijkstraHeapTest(const Digraph& digraph, const IntArcMap& length,
135 133
                      Node source) {
136 134

	
137 135
  typename Dijkstra<Digraph, IntArcMap>::template SetStandardHeap<Heap>::
138 136
    Create dijkstra(digraph, length);
... ...
@@ -141,22 +139,22 @@
141 139

	
142 140
  for(ArcIt a(digraph); a != INVALID; ++a) {
143 141
    Node s = digraph.source(a);
144 142
    Node t = digraph.target(a);
145 143
    if (dijkstra.reached(s)) {
146 144
      check( dijkstra.dist(t) - dijkstra.dist(s) <= length[a],
147
             "Error in a shortest path tree!");
145
             "Error in shortest path tree.");
148 146
    }
149 147
  }
150 148

	
151 149
  for(NodeIt n(digraph); n != INVALID; ++n) {
152 150
    if ( dijkstra.reached(n) && dijkstra.predArc(n) != INVALID ) {
153 151
      Arc a = dijkstra.predArc(n);
154 152
      Node s = digraph.source(a);
155 153
      check( dijkstra.dist(n) - dijkstra.dist(s) == length[a],
156
             "Error in a shortest path tree!");
154
             "Error in shortest path tree.");
157 155
    }
158 156
  }
159 157

	
160 158
}
161 159

	
162 160
int main() {
... ...
@@ -172,23 +170,111 @@
172 170
  std::istringstream input(test_lgf);
173 171
  digraphReader(digraph, input).
174 172
    arcMap("capacity", length).
175 173
    node("source", source).
176 174
    run();
177 175

	
176
  // BinHeap
178 177
  {
179 178
    typedef BinHeap<Prio, ItemIntMap> IntHeap;
180 179
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
181 180
    heapSortTest<IntHeap>();
182 181
    heapIncreaseTest<IntHeap>();
183 182

	
184 183
    typedef BinHeap<Prio, IntNodeMap > NodeHeap;
185 184
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
186 185
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
187 186
  }
188 187

	
188
  // QuadHeap
189
  {
190
    typedef QuadHeap<Prio, ItemIntMap> IntHeap;
191
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
192
    heapSortTest<IntHeap>();
193
    heapIncreaseTest<IntHeap>();
194

	
195
    typedef QuadHeap<Prio, IntNodeMap > NodeHeap;
196
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
197
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
198
  }
199

	
200
  // DHeap
201
  {
202
    typedef DHeap<Prio, ItemIntMap> IntHeap;
203
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
204
    heapSortTest<IntHeap>();
205
    heapIncreaseTest<IntHeap>();
206

	
207
    typedef DHeap<Prio, IntNodeMap > NodeHeap;
208
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
209
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
210
  }
211

	
212
  // FibHeap
213
  {
214
    typedef FibHeap<Prio, ItemIntMap> IntHeap;
215
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
216
    heapSortTest<IntHeap>();
217
    heapIncreaseTest<IntHeap>();
218

	
219
    typedef FibHeap<Prio, IntNodeMap > NodeHeap;
220
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
221
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
222
  }
223

	
224
  // PairingHeap
225
  {
226
    typedef PairingHeap<Prio, ItemIntMap> IntHeap;
227
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
228
    heapSortTest<IntHeap>();
229
    heapIncreaseTest<IntHeap>();
230

	
231
    typedef PairingHeap<Prio, IntNodeMap > NodeHeap;
232
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
233
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
234
  }
235

	
236
  // RadixHeap
237
  {
238
    typedef RadixHeap<ItemIntMap> IntHeap;
239
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
240
    heapSortTest<IntHeap>();
241
    heapIncreaseTest<IntHeap>();
242

	
243
    typedef RadixHeap<IntNodeMap > NodeHeap;
244
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
245
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
246
  }
247

	
248
  // BinomialHeap
249
  {
250
    typedef BinomialHeap<Prio, ItemIntMap> IntHeap;
251
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
252
    heapSortTest<IntHeap>();
253
    heapIncreaseTest<IntHeap>();
254

	
255
    typedef BinomialHeap<Prio, IntNodeMap > NodeHeap;
256
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
257
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
258
  }
259

	
260
  // BucketHeap, SimpleBucketHeap
261
  {
262
    typedef BucketHeap<ItemIntMap> IntHeap;
263
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
264
    heapSortTest<IntHeap>();
265
    heapIncreaseTest<IntHeap>();
266

	
267
    typedef BucketHeap<IntNodeMap > NodeHeap;
268
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
269
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
270

	
271
    typedef SimpleBucketHeap<ItemIntMap> SimpleIntHeap;
272
    heapSortTest<SimpleIntHeap>();
273
  }
274

	
189 275
  {
190 276
    typedef FibHeap<Prio, ItemIntMap> IntHeap;
191 277
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
192 278
    heapSortTest<IntHeap>();
193 279
    heapIncreaseTest<IntHeap>();
194 280

	
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -20,26 +20,43 @@
20 20
#include <set>
21 21

	
22 22
#include <lemon/concept_check.h>
23 23
#include <lemon/concepts/maps.h>
24 24
#include <lemon/maps.h>
25 25
#include <lemon/list_graph.h>
26
#include <lemon/smart_graph.h>
27
#include <lemon/adaptors.h>
28
#include <lemon/dfs.h>
29
#include <algorithm>
26 30

	
27 31
#include "test_tools.h"
28 32

	
29 33
using namespace lemon;
30 34
using namespace lemon::concepts;
31 35

	
32 36
struct A {};
33 37
inline bool operator<(A, A) { return true; }
34 38
struct B {};
35 39

	
36 40
class C {
37
  int x;
41
  int _x;
38 42
public:
39
  C(int _x) : x(_x) {}
43
  C(int x) : _x(x) {}
44
  int get() const { return _x; }
45
};
46
inline bool operator<(C c1, C c2) { return c1.get() < c2.get(); }
47
inline bool operator==(C c1, C c2) { return c1.get() == c2.get(); }
48

	
49
C createC(int x) { return C(x); }
50

	
51
template <typename T>
52
class Less {
53
  T _t;
54
public:
55
  Less(T t): _t(t) {}
56
  bool operator()(const T& t) const { return t < _t; }
40 57
};
41 58

	
42 59
class F {
43 60
public:
44 61
  typedef A argument_type;
45 62
  typedef B result_type;
... ...
@@ -50,12 +67,20 @@
50 67
};
51 68

	
52 69
int func(A) { return 3; }
53 70

	
54 71
int binc(int a, B) { return a+1; }
55 72

	
73
template <typename T>
74
class Sum {
75
  T& _sum;
76
public:
77
  Sum(T& sum) : _sum(sum) {}
78
  void operator()(const T& t) { _sum += t; }
79
};
80

	
56 81
typedef ReadMap<A, double> DoubleMap;
57 82
typedef ReadWriteMap<A, double> DoubleWriteMap;
58 83
typedef ReferenceMap<A, double, double&, const double&> DoubleRefMap;
59 84

	
60 85
typedef ReadMap<A, bool> BoolMap;
61 86
typedef ReadWriteMap<A, bool> BoolWriteMap;
... ...
@@ -197,13 +222,14 @@
197 222
    checkConcept<ReadMap<A,B>, FunctorToMap<F> >();
198 223
    FunctorToMap<F> map1;
199 224
    FunctorToMap<F> map2 = FunctorToMap<F>(F());
200 225
    B b = functorToMap(F())[A()];
201 226

	
202 227
    checkConcept<ReadMap<A,B>, MapToFunctor<ReadMap<A,B> > >();
203
    MapToFunctor<ReadMap<A,B> > map = MapToFunctor<ReadMap<A,B> >(ReadMap<A,B>());
228
    MapToFunctor<ReadMap<A,B> > map =
229
      MapToFunctor<ReadMap<A,B> >(ReadMap<A,B>());
204 230

	
205 231
    check(functorToMap(&func)[A()] == 3,
206 232
          "Something is wrong with FunctorToMap");
207 233
    check(mapToFunctor(constMap<A,int>(2))(A()) == 2,
208 234
          "Something is wrong with MapToFunctor");
209 235
    check(mapToFunctor(functorToMap(&func))(A()) == 3 &&
... ...
@@ -326,12 +352,16 @@
326 352
          "Something is wrong with EqualMap");
327 353
  }
328 354

	
329 355
  // LoggerBoolMap
330 356
  {
331 357
    typedef std::vector<int> vec;
358
    checkConcept<WriteMap<int, bool>, LoggerBoolMap<vec::iterator> >();
359
    checkConcept<WriteMap<int, bool>,
360
                 LoggerBoolMap<std::back_insert_iterator<vec> > >();
361

	
332 362
    vec v1;
333 363
    vec v2(10);
334 364
    LoggerBoolMap<std::back_insert_iterator<vec> >
335 365
      map1(std::back_inserter(v1));
336 366
    LoggerBoolMap<vec::iterator> map2(v2.begin());
337 367
    map1.set(10, false);
... ...
@@ -345,31 +375,248 @@
345 375
          "Something is wrong with LoggerBoolMap");
346 376

	
347 377
    int i = 0;
348 378
    for ( LoggerBoolMap<vec::iterator>::Iterator it = map2.begin();
349 379
          it != map2.end(); ++it )
350 380
      check(v1[i++] == *it, "Something is wrong with LoggerBoolMap");
381

	
382
    typedef ListDigraph Graph;
383
    DIGRAPH_TYPEDEFS(Graph);
384
    Graph gr;
385

	
386
    Node n0 = gr.addNode();
387
    Node n1 = gr.addNode();
388
    Node n2 = gr.addNode();
389
    Node n3 = gr.addNode();
390

	
391
    gr.addArc(n3, n0);
392
    gr.addArc(n3, n2);
393
    gr.addArc(n0, n2);
394
    gr.addArc(n2, n1);
395
    gr.addArc(n0, n1);
396

	
397
    {
398
      std::vector<Node> v;
399
      dfs(gr).processedMap(loggerBoolMap(std::back_inserter(v))).run();
400

	
401
      check(v.size()==4 && v[0]==n1 && v[1]==n2 && v[2]==n0 && v[3]==n3,
402
            "Something is wrong with LoggerBoolMap");
403
    }
404
    {
405
      std::vector<Node> v(countNodes(gr));
406
      dfs(gr).processedMap(loggerBoolMap(v.begin())).run();
407

	
408
      check(v.size()==4 && v[0]==n1 && v[1]==n2 && v[2]==n0 && v[3]==n3,
409
            "Something is wrong with LoggerBoolMap");
410
    }
351 411
  }
352
  
412

	
413
  // IdMap, RangeIdMap
414
  {
415
    typedef ListDigraph Graph;
416
    DIGRAPH_TYPEDEFS(Graph);
417

	
418
    checkConcept<ReadMap<Node, int>, IdMap<Graph, Node> >();
419
    checkConcept<ReadMap<Arc, int>, IdMap<Graph, Arc> >();
420
    checkConcept<ReadMap<Node, int>, RangeIdMap<Graph, Node> >();
421
    checkConcept<ReadMap<Arc, int>, RangeIdMap<Graph, Arc> >();
422

	
423
    Graph gr;
424
    IdMap<Graph, Node> nmap(gr);
425
    IdMap<Graph, Arc> amap(gr);
426
    RangeIdMap<Graph, Node> nrmap(gr);
427
    RangeIdMap<Graph, Arc> armap(gr);
428

	
429
    Node n0 = gr.addNode();
430
    Node n1 = gr.addNode();
431
    Node n2 = gr.addNode();
432

	
433
    Arc a0 = gr.addArc(n0, n1);
434
    Arc a1 = gr.addArc(n0, n2);
435
    Arc a2 = gr.addArc(n2, n1);
436
    Arc a3 = gr.addArc(n2, n0);
437

	
438
    check(nmap[n0] == gr.id(n0) && nmap(gr.id(n0)) == n0, "Wrong IdMap");
439
    check(nmap[n1] == gr.id(n1) && nmap(gr.id(n1)) == n1, "Wrong IdMap");
440
    check(nmap[n2] == gr.id(n2) && nmap(gr.id(n2)) == n2, "Wrong IdMap");
441

	
442
    check(amap[a0] == gr.id(a0) && amap(gr.id(a0)) == a0, "Wrong IdMap");
443
    check(amap[a1] == gr.id(a1) && amap(gr.id(a1)) == a1, "Wrong IdMap");
444
    check(amap[a2] == gr.id(a2) && amap(gr.id(a2)) == a2, "Wrong IdMap");
445
    check(amap[a3] == gr.id(a3) && amap(gr.id(a3)) == a3, "Wrong IdMap");
446

	
447
    check(nmap.inverse()[gr.id(n0)] == n0, "Wrong IdMap::InverseMap");
448
    check(amap.inverse()[gr.id(a0)] == a0, "Wrong IdMap::InverseMap");
449

	
450
    check(nrmap.size() == 3 && armap.size() == 4,
451
          "Wrong RangeIdMap::size()");
452

	
453
    check(nrmap[n0] == 0 && nrmap(0) == n0, "Wrong RangeIdMap");
454
    check(nrmap[n1] == 1 && nrmap(1) == n1, "Wrong RangeIdMap");
455
    check(nrmap[n2] == 2 && nrmap(2) == n2, "Wrong RangeIdMap");
456

	
457
    check(armap[a0] == 0 && armap(0) == a0, "Wrong RangeIdMap");
458
    check(armap[a1] == 1 && armap(1) == a1, "Wrong RangeIdMap");
459
    check(armap[a2] == 2 && armap(2) == a2, "Wrong RangeIdMap");
460
    check(armap[a3] == 3 && armap(3) == a3, "Wrong RangeIdMap");
461

	
462
    check(nrmap.inverse()[0] == n0, "Wrong RangeIdMap::InverseMap");
463
    check(armap.inverse()[0] == a0, "Wrong RangeIdMap::InverseMap");
464

	
465
    gr.erase(n1);
466

	
467
    if (nrmap[n0] == 1) nrmap.swap(n0, n2);
468
    nrmap.swap(n2, n0);
469
    if (armap[a1] == 1) armap.swap(a1, a3);
470
    armap.swap(a3, a1);
471

	
472
    check(nrmap.size() == 2 && armap.size() == 2,
473
          "Wrong RangeIdMap::size()");
474

	
475
    check(nrmap[n0] == 1 && nrmap(1) == n0, "Wrong RangeIdMap");
476
    check(nrmap[n2] == 0 && nrmap(0) == n2, "Wrong RangeIdMap");
477

	
478
    check(armap[a1] == 1 && armap(1) == a1, "Wrong RangeIdMap");
479
    check(armap[a3] == 0 && armap(0) == a3, "Wrong RangeIdMap");
480

	
481
    check(nrmap.inverse()[0] == n2, "Wrong RangeIdMap::InverseMap");
482
    check(armap.inverse()[0] == a3, "Wrong RangeIdMap::InverseMap");
483
  }
484

	
485
  // SourceMap, TargetMap, ForwardMap, BackwardMap, InDegMap, OutDegMap
486
  {
487
    typedef ListGraph Graph;
488
    GRAPH_TYPEDEFS(Graph);
489

	
490
    checkConcept<ReadMap<Arc, Node>, SourceMap<Graph> >();
491
    checkConcept<ReadMap<Arc, Node>, TargetMap<Graph> >();
492
    checkConcept<ReadMap<Edge, Arc>, ForwardMap<Graph> >();
493
    checkConcept<ReadMap<Edge, Arc>, BackwardMap<Graph> >();
494
    checkConcept<ReadMap<Node, int>, InDegMap<Graph> >();
495
    checkConcept<ReadMap<Node, int>, OutDegMap<Graph> >();
496

	
497
    Graph gr;
498
    Node n0 = gr.addNode();
499
    Node n1 = gr.addNode();
500
    Node n2 = gr.addNode();
501

	
502
    gr.addEdge(n0,n1);
503
    gr.addEdge(n1,n2);
504
    gr.addEdge(n0,n2);
505
    gr.addEdge(n2,n1);
506
    gr.addEdge(n1,n2);
507
    gr.addEdge(n0,n1);
508

	
509
    for (EdgeIt e(gr); e != INVALID; ++e) {
510
      check(forwardMap(gr)[e] == gr.direct(e, true), "Wrong ForwardMap");
511
      check(backwardMap(gr)[e] == gr.direct(e, false), "Wrong BackwardMap");
512
    }
513

	
514
    check(mapCompare(gr,
515
          sourceMap(orienter(gr, constMap<Edge, bool>(true))),
516
          targetMap(orienter(gr, constMap<Edge, bool>(false)))),
517
          "Wrong SourceMap or TargetMap");
518

	
519
    typedef Orienter<Graph, const ConstMap<Edge, bool> > Digraph;
520
    Digraph dgr(gr, constMap<Edge, bool>(true));
521
    OutDegMap<Digraph> odm(dgr);
522
    InDegMap<Digraph> idm(dgr);
523

	
524
    check(odm[n0] == 3 && odm[n1] == 2 && odm[n2] == 1, "Wrong OutDegMap");
525
    check(idm[n0] == 0 && idm[n1] == 3 && idm[n2] == 3, "Wrong InDegMap");
526

	
527
    gr.addEdge(n2, n0);
528

	
529
    check(odm[n0] == 3 && odm[n1] == 2 && odm[n2] == 2, "Wrong OutDegMap");
530
    check(idm[n0] == 1 && idm[n1] == 3 && idm[n2] == 3, "Wrong InDegMap");
531
  }
532

	
353 533
  // CrossRefMap
354 534
  {
355 535
    typedef ListDigraph Graph;
356 536
    DIGRAPH_TYPEDEFS(Graph);
357 537

	
358 538
    checkConcept<ReadWriteMap<Node, int>,
359 539
                 CrossRefMap<Graph, Node, int> >();
360
    
540
    checkConcept<ReadWriteMap<Node, bool>,
541
                 CrossRefMap<Graph, Node, bool> >();
542
    checkConcept<ReadWriteMap<Node, double>,
543
                 CrossRefMap<Graph, Node, double> >();
544

	
545
    Graph gr;
546
    typedef CrossRefMap<Graph, Node, char> CRMap;
547
    CRMap map(gr);
548

	
549
    Node n0 = gr.addNode();
550
    Node n1 = gr.addNode();
551
    Node n2 = gr.addNode();
552

	
553
    map.set(n0, 'A');
554
    map.set(n1, 'B');
555
    map.set(n2, 'C');
556

	
557
    check(map[n0] == 'A' && map('A') == n0 && map.inverse()['A'] == n0,
558
          "Wrong CrossRefMap");
559
    check(map[n1] == 'B' && map('B') == n1 && map.inverse()['B'] == n1,
560
          "Wrong CrossRefMap");
561
    check(map[n2] == 'C' && map('C') == n2 && map.inverse()['C'] == n2,
562
          "Wrong CrossRefMap");
563
    check(map.count('A') == 1 && map.count('B') == 1 && map.count('C') == 1,
564
          "Wrong CrossRefMap::count()");
565

	
566
    CRMap::ValueIt it = map.beginValue();
567
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
568
          it == map.endValue(), "Wrong value iterator");
569

	
570
    map.set(n2, 'A');
571

	
572
    check(map[n0] == 'A' && map[n1] == 'B' && map[n2] == 'A',
573
          "Wrong CrossRefMap");
574
    check(map('A') == n0 && map.inverse()['A'] == n0, "Wrong CrossRefMap");
575
    check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap");
576
    check(map('C') == INVALID && map.inverse()['C'] == INVALID,
577
          "Wrong CrossRefMap");
578
    check(map.count('A') == 2 && map.count('B') == 1 && map.count('C') == 0,
579
          "Wrong CrossRefMap::count()");
580

	
581
    it = map.beginValue();
582
    check(*it++ == 'A' && *it++ == 'A' && *it++ == 'B' &&
583
          it == map.endValue(), "Wrong value iterator");
584

	
585
    map.set(n0, 'C');
586

	
587
    check(map[n0] == 'C' && map[n1] == 'B' && map[n2] == 'A',
588
          "Wrong CrossRefMap");
589
    check(map('A') == n2 && map.inverse()['A'] == n2, "Wrong CrossRefMap");
590
    check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap");
591
    check(map('C') == n0 && map.inverse()['C'] == n0, "Wrong CrossRefMap");
592
    check(map.count('A') == 1 && map.count('B') == 1 && map.count('C') == 1,
593
          "Wrong CrossRefMap::count()");
594

	
595
    it = map.beginValue();
596
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
597
          it == map.endValue(), "Wrong value iterator");
598
  }
599

	
600
  // CrossRefMap
601
  {
602
    typedef SmartDigraph Graph;
603
    DIGRAPH_TYPEDEFS(Graph);
604

	
605
    checkConcept<ReadWriteMap<Node, int>,
606
                 CrossRefMap<Graph, Node, int> >();
607

	
361 608
    Graph gr;
362 609
    typedef CrossRefMap<Graph, Node, char> CRMap;
363 610
    typedef CRMap::ValueIterator ValueIt;
364 611
    CRMap map(gr);
365
    
612

	
366 613
    Node n0 = gr.addNode();
367 614
    Node n1 = gr.addNode();
368 615
    Node n2 = gr.addNode();
369
    
616

	
370 617
    map.set(n0, 'A');
371 618
    map.set(n1, 'B');
372 619
    map.set(n2, 'C');
373 620
    map.set(n2, 'A');
374 621
    map.set(n0, 'C');
375 622

	
... ...
@@ -381,8 +628,376 @@
381 628

	
382 629
    ValueIt it = map.beginValue();
383 630
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
384 631
          it == map.endValue(), "Wrong value iterator");
385 632
  }
386 633

	
634
  // Iterable bool map
635
  {
636
    typedef SmartGraph Graph;
637
    typedef SmartGraph::Node Item;
638

	
639
    typedef IterableBoolMap<SmartGraph, SmartGraph::Node> Ibm;
640
    checkConcept<ReferenceMap<Item, bool, bool&, const bool&>, Ibm>();
641

	
642
    const int num = 10;
643
    Graph g;
644
    Ibm map0(g, true);
645
    std::vector<Item> items;
646
    for (int i = 0; i < num; ++i) {
647
      items.push_back(g.addNode());
648
    }
649

	
650
    Ibm map1(g, true);
651
    int n = 0;
652
    for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
653
      check(map1[static_cast<Item>(it)], "Wrong TrueIt");
654
      ++n;
655
    }
656
    check(n == num, "Wrong number");
657

	
658
    n = 0;
659
    for (Ibm::ItemIt it(map1, true); it != INVALID; ++it) {
660
        check(map1[static_cast<Item>(it)], "Wrong ItemIt for true");
661
        ++n;
662
    }
663
    check(n == num, "Wrong number");
664
    check(Ibm::FalseIt(map1) == INVALID, "Wrong FalseIt");
665
    check(Ibm::ItemIt(map1, false) == INVALID, "Wrong ItemIt for false");
666

	
667
    map1[items[5]] = true;
668

	
669
    n = 0;
670
    for (Ibm::ItemIt it(map1, true); it != INVALID; ++it) {
671
        check(map1[static_cast<Item>(it)], "Wrong ItemIt for true");
672
        ++n;
673
    }
674
    check(n == num, "Wrong number");
675

	
676
    map1[items[num / 2]] = false;
677
    check(map1[items[num / 2]] == false, "Wrong map value");
678

	
679
    n = 0;
680
    for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
681
        check(map1[static_cast<Item>(it)], "Wrong TrueIt for true");
682
        ++n;
683
    }
684
    check(n == num - 1, "Wrong number");
685

	
686
    n = 0;
687
    for (Ibm::FalseIt it(map1); it != INVALID; ++it) {
688
        check(!map1[static_cast<Item>(it)], "Wrong FalseIt for true");
689
        ++n;
690
    }
691
    check(n == 1, "Wrong number");
692

	
693
    map1[items[0]] = false;
694
    check(map1[items[0]] == false, "Wrong map value");
695

	
696
    map1[items[num - 1]] = false;
697
    check(map1[items[num - 1]] == false, "Wrong map value");
698

	
699
    n = 0;
700
    for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
701
        check(map1[static_cast<Item>(it)], "Wrong TrueIt for true");
702
        ++n;
703
    }
704
    check(n == num - 3, "Wrong number");
705
    check(map1.trueNum() == num - 3, "Wrong number");
706

	
707
    n = 0;
708
    for (Ibm::FalseIt it(map1); it != INVALID; ++it) {
709
        check(!map1[static_cast<Item>(it)], "Wrong FalseIt for true");
710
        ++n;
711
    }
712
    check(n == 3, "Wrong number");
713
    check(map1.falseNum() == 3, "Wrong number");
714
  }
715

	
716
  // Iterable int map
717
  {
718
    typedef SmartGraph Graph;
719
    typedef SmartGraph::Node Item;
720
    typedef IterableIntMap<SmartGraph, SmartGraph::Node> Iim;
721

	
722
    checkConcept<ReferenceMap<Item, int, int&, const int&>, Iim>();
723

	
724
    const int num = 10;
725
    Graph g;
726
    Iim map0(g, 0);
727
    std::vector<Item> items;
728
    for (int i = 0; i < num; ++i) {
729
      items.push_back(g.addNode());
730
    }
731

	
732
    Iim map1(g);
733
    check(map1.size() == 0, "Wrong size");
734

	
735
    for (int i = 0; i < num; ++i) {
736
      map1[items[i]] = i;
737
    }
738
    check(map1.size() == num, "Wrong size");
739

	
740
    for (int i = 0; i < num; ++i) {
741
      Iim::ItemIt it(map1, i);
742
      check(static_cast<Item>(it) == items[i], "Wrong value");
743
      ++it;
744
      check(static_cast<Item>(it) == INVALID, "Wrong value");
745
    }
746

	
747
    for (int i = 0; i < num; ++i) {
748
      map1[items[i]] = i % 2;
749
    }
750
    check(map1.size() == 2, "Wrong size");
751

	
752
    int n = 0;
753
    for (Iim::ItemIt it(map1, 0); it != INVALID; ++it) {
754
      check(map1[static_cast<Item>(it)] == 0, "Wrong value");
755
      ++n;
756
    }
757
    check(n == (num + 1) / 2, "Wrong number");
758

	
759
    for (Iim::ItemIt it(map1, 1); it != INVALID; ++it) {
760
      check(map1[static_cast<Item>(it)] == 1, "Wrong value");
761
      ++n;
762
    }
763
    check(n == num, "Wrong number");
764

	
765
  }
766

	
767
  // Iterable value map
768
  {
769
    typedef SmartGraph Graph;
770
    typedef SmartGraph::Node Item;
771
    typedef IterableValueMap<SmartGraph, SmartGraph::Node, double> Ivm;
772

	
773
    checkConcept<ReadWriteMap<Item, double>, Ivm>();
774

	
775
    const int num = 10;
776
    Graph g;
777
    Ivm map0(g, 0.0);
778
    std::vector<Item> items;
779
    for (int i = 0; i < num; ++i) {
780
      items.push_back(g.addNode());
781
    }
782

	
783
    Ivm map1(g, 0.0);
784
    check(distance(map1.beginValue(), map1.endValue()) == 1, "Wrong size");
785
    check(*map1.beginValue() == 0.0, "Wrong value");
786

	
787
    for (int i = 0; i < num; ++i) {
788
      map1.set(items[i], static_cast<double>(i));
789
    }
790
    check(distance(map1.beginValue(), map1.endValue()) == num, "Wrong size");
791

	
792
    for (int i = 0; i < num; ++i) {
793
      Ivm::ItemIt it(map1, static_cast<double>(i));
794
      check(static_cast<Item>(it) == items[i], "Wrong value");
795
      ++it;
796
      check(static_cast<Item>(it) == INVALID, "Wrong value");
797
    }
798

	
799
    for (Ivm::ValueIt vit = map1.beginValue();
800
         vit != map1.endValue(); ++vit) {
801
      check(map1[static_cast<Item>(Ivm::ItemIt(map1, *vit))] == *vit,
802
            "Wrong ValueIt");
803
    }
804

	
805
    for (int i = 0; i < num; ++i) {
806
      map1.set(items[i], static_cast<double>(i % 2));
807
    }
808
    check(distance(map1.beginValue(), map1.endValue()) == 2, "Wrong size");
809

	
810
    int n = 0;
811
    for (Ivm::ItemIt it(map1, 0.0); it != INVALID; ++it) {
812
      check(map1[static_cast<Item>(it)] == 0.0, "Wrong value");
813
      ++n;
814
    }
815
    check(n == (num + 1) / 2, "Wrong number");
816

	
817
    for (Ivm::ItemIt it(map1, 1.0); it != INVALID; ++it) {
818
      check(map1[static_cast<Item>(it)] == 1.0, "Wrong value");
819
      ++n;
820
    }
821
    check(n == num, "Wrong number");
822

	
823
  }
824

	
825
  // Graph map utilities:
826
  // mapMin(), mapMax(), mapMinValue(), mapMaxValue()
827
  // mapFind(), mapFindIf(), mapCount(), mapCountIf()
828
  // mapCopy(), mapCompare(), mapFill()
829
  {
830
    DIGRAPH_TYPEDEFS(SmartDigraph);
831

	
832
    SmartDigraph g;
833
    Node n1 = g.addNode();
834
    Node n2 = g.addNode();
835
    Node n3 = g.addNode();
836

	
837
    SmartDigraph::NodeMap<int> map1(g);
838
    SmartDigraph::ArcMap<char> map2(g);
839
    ConstMap<Node, A> cmap1 = A();
840
    ConstMap<Arc, C> cmap2 = C(0);
841

	
842
    map1[n1] = 10;
843
    map1[n2] = 5;
844
    map1[n3] = 12;
845

	
846
    // mapMin(), mapMax(), mapMinValue(), mapMaxValue()
847
    check(mapMin(g, map1) == n2, "Wrong mapMin()");
848
    check(mapMax(g, map1) == n3, "Wrong mapMax()");
849
    check(mapMin(g, map1, std::greater<int>()) == n3, "Wrong mapMin()");
850
    check(mapMax(g, map1, std::greater<int>()) == n2, "Wrong mapMax()");
851
    check(mapMinValue(g, map1) == 5, "Wrong mapMinValue()");
852
    check(mapMaxValue(g, map1) == 12, "Wrong mapMaxValue()");
853

	
854
    check(mapMin(g, map2) == INVALID, "Wrong mapMin()");
855
    check(mapMax(g, map2) == INVALID, "Wrong mapMax()");
856

	
857
    check(mapMin(g, cmap1) != INVALID, "Wrong mapMin()");
858
    check(mapMax(g, cmap2) == INVALID, "Wrong mapMax()");
859

	
860
    Arc a1 = g.addArc(n1, n2);
861
    Arc a2 = g.addArc(n1, n3);
862
    Arc a3 = g.addArc(n2, n3);
863
    Arc a4 = g.addArc(n3, n1);
864

	
865
    map2[a1] = 'b';
866
    map2[a2] = 'a';
867
    map2[a3] = 'b';
868
    map2[a4] = 'c';
869

	
870
    // mapMin(), mapMax(), mapMinValue(), mapMaxValue()
871
    check(mapMin(g, map2) == a2, "Wrong mapMin()");
872
    check(mapMax(g, map2) == a4, "Wrong mapMax()");
873
    check(mapMin(g, map2, std::greater<int>()) == a4, "Wrong mapMin()");
874
    check(mapMax(g, map2, std::greater<int>()) == a2, "Wrong mapMax()");
875
    check(mapMinValue(g, map2, std::greater<int>()) == 'c',
876
          "Wrong mapMinValue()");
877
    check(mapMaxValue(g, map2, std::greater<int>()) == 'a',
878
          "Wrong mapMaxValue()");
879

	
880
    check(mapMin(g, cmap1) != INVALID, "Wrong mapMin()");
881
    check(mapMax(g, cmap2) != INVALID, "Wrong mapMax()");
882
    check(mapMaxValue(g, cmap2) == C(0), "Wrong mapMaxValue()");
883

	
884
    check(mapMin(g, composeMap(functorToMap(&createC), map2)) == a2,
885
          "Wrong mapMin()");
886
    check(mapMax(g, composeMap(functorToMap(&createC), map2)) == a4,
887
          "Wrong mapMax()");
888
    check(mapMinValue(g, composeMap(functorToMap(&createC), map2)) == C('a'),
889
          "Wrong mapMinValue()");
890
    check(mapMaxValue(g, composeMap(functorToMap(&createC), map2)) == C('c'),
891
          "Wrong mapMaxValue()");
892

	
893
    // mapFind(), mapFindIf()
894
    check(mapFind(g, map1, 5) == n2, "Wrong mapFind()");
895
    check(mapFind(g, map1, 6) == INVALID, "Wrong mapFind()");
896
    check(mapFind(g, map2, 'a') == a2, "Wrong mapFind()");
897
    check(mapFind(g, map2, 'e') == INVALID, "Wrong mapFind()");
898
    check(mapFind(g, cmap2, C(0)) == ArcIt(g), "Wrong mapFind()");
899
    check(mapFind(g, cmap2, C(1)) == INVALID, "Wrong mapFind()");
900

	
901
    check(mapFindIf(g, map1, Less<int>(7)) == n2,
902
          "Wrong mapFindIf()");
903
    check(mapFindIf(g, map1, Less<int>(5)) == INVALID,
904
          "Wrong mapFindIf()");
905
    check(mapFindIf(g, map2, Less<char>('d')) == ArcIt(g),
906
          "Wrong mapFindIf()");
907
    check(mapFindIf(g, map2, Less<char>('a')) == INVALID,
908
          "Wrong mapFindIf()");
909

	
910
    // mapCount(), mapCountIf()
911
    check(mapCount(g, map1, 5) == 1, "Wrong mapCount()");
912
    check(mapCount(g, map1, 6) == 0, "Wrong mapCount()");
913
    check(mapCount(g, map2, 'a') == 1, "Wrong mapCount()");
914
    check(mapCount(g, map2, 'b') == 2, "Wrong mapCount()");
915
    check(mapCount(g, map2, 'e') == 0, "Wrong mapCount()");
916
    check(mapCount(g, cmap2, C(0)) == 4, "Wrong mapCount()");
917
    check(mapCount(g, cmap2, C(1)) == 0, "Wrong mapCount()");
918

	
919
    check(mapCountIf(g, map1, Less<int>(11)) == 2,
920
          "Wrong mapCountIf()");
921
    check(mapCountIf(g, map1, Less<int>(13)) == 3,
922
          "Wrong mapCountIf()");
923
    check(mapCountIf(g, map1, Less<int>(5)) == 0,
924
          "Wrong mapCountIf()");
925
    check(mapCountIf(g, map2, Less<char>('d')) == 4,
926
          "Wrong mapCountIf()");
927
    check(mapCountIf(g, map2, Less<char>('c')) == 3,
928
          "Wrong mapCountIf()");
929
    check(mapCountIf(g, map2, Less<char>('a')) == 0,
930
          "Wrong mapCountIf()");
931

	
932
    // MapIt, ConstMapIt
933
/*
934
These tests can be used after applying bugfix #330
935
    typedef SmartDigraph::NodeMap<int>::MapIt MapIt;
936
    typedef SmartDigraph::NodeMap<int>::ConstMapIt ConstMapIt;
937
    check(*std::min_element(MapIt(map1), MapIt(INVALID)) == 5,
938
          "Wrong NodeMap<>::MapIt");
939
    check(*std::max_element(ConstMapIt(map1), ConstMapIt(INVALID)) == 12,
940
          "Wrong NodeMap<>::MapIt");
941

	
942
    int sum = 0;
943
    std::for_each(MapIt(map1), MapIt(INVALID), Sum<int>(sum));
944
    check(sum == 27, "Wrong NodeMap<>::MapIt");
945
    std::for_each(ConstMapIt(map1), ConstMapIt(INVALID), Sum<int>(sum));
946
    check(sum == 54, "Wrong NodeMap<>::ConstMapIt");
947
*/
948

	
949
    // mapCopy(), mapCompare(), mapFill()
950
    check(mapCompare(g, map1, map1), "Wrong mapCompare()");
951
    check(mapCompare(g, cmap2, cmap2), "Wrong mapCompare()");
952
    check(mapCompare(g, map1, shiftMap(map1, 0)), "Wrong mapCompare()");
953
    check(mapCompare(g, map2, scaleMap(map2, 1)), "Wrong mapCompare()");
954
    check(!mapCompare(g, map1, shiftMap(map1, 1)), "Wrong mapCompare()");
955

	
956
    SmartDigraph::NodeMap<int> map3(g, 0);
957
    SmartDigraph::ArcMap<char> map4(g, 'a');
958

	
959
    check(!mapCompare(g, map1, map3), "Wrong mapCompare()");
960
    check(!mapCompare(g, map2, map4), "Wrong mapCompare()");
961

	
962
    mapCopy(g, map1, map3);
963
    mapCopy(g, map2, map4);
964

	
965
    check(mapCompare(g, map1, map3), "Wrong mapCompare() or mapCopy()");
966
    check(mapCompare(g, map2, map4), "Wrong mapCompare() or mapCopy()");
967

	
968
    Undirector<SmartDigraph> ug(g);
969
    Undirector<SmartDigraph>::EdgeMap<char> umap1(ug, 'x');
970
    Undirector<SmartDigraph>::ArcMap<double> umap2(ug, 3.14);
971

	
972
    check(!mapCompare(g, map2, umap1), "Wrong mapCompare() or mapCopy()");
973
    check(!mapCompare(g, umap1, map2), "Wrong mapCompare() or mapCopy()");
974
    check(!mapCompare(ug, map2, umap1), "Wrong mapCompare() or mapCopy()");
975
    check(!mapCompare(ug, umap1, map2), "Wrong mapCompare() or mapCopy()");
976

	
977
    mapCopy(g, map2, umap1);
978

	
979
    check(mapCompare(g, map2, umap1), "Wrong mapCompare() or mapCopy()");
980
    check(mapCompare(g, umap1, map2), "Wrong mapCompare() or mapCopy()");
981
    check(mapCompare(ug, map2, umap1), "Wrong mapCompare() or mapCopy()");
982
    check(mapCompare(ug, umap1, map2), "Wrong mapCompare() or mapCopy()");
983

	
984
    mapCopy(g, map2, umap1);
985
    mapCopy(g, umap1, map2);
986
    mapCopy(ug, map2, umap1);
987
    mapCopy(ug, umap1, map2);
988

	
989
    check(!mapCompare(ug, umap1, umap2), "Wrong mapCompare() or mapCopy()");
990
    mapCopy(ug, umap1, umap2);
991
    check(mapCompare(ug, umap1, umap2), "Wrong mapCompare() or mapCopy()");
992

	
993
    check(!mapCompare(g, map1, constMap<Node>(2)), "Wrong mapCompare()");
994
    mapFill(g, map1, 2);
995
    check(mapCompare(g, constMap<Node>(2), map1), "Wrong mapFill()");
996

	
997
    check(!mapCompare(g, map2, constMap<Arc>('z')), "Wrong mapCompare()");
998
    mapCopy(g, constMap<Arc>('z'), map2);
999
    check(mapCompare(g, constMap<Arc>('z'), map2), "Wrong mapCopy()");
1000
  }
1001

	
387 1002
  return 0;
388 1003
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -131,22 +131,22 @@
131 131
  mat_test.init();
132 132
  mat_test.greedyInit();
133 133
  mat_test.matchingInit(mat);
134 134
  mat_test.startSparse();
135 135
  mat_test.startDense();
136 136
  mat_test.run();
137
  
137

	
138 138
  const_mat_test.matchingSize();
139 139
  const_mat_test.matching(e);
140 140
  const_mat_test.matching(n);
141 141
  const MaxMatching<Graph>::MatchingMap& mmap =
142 142
    const_mat_test.matchingMap();
143 143
  e = mmap[n];
144 144
  const_mat_test.mate(n);
145 145

	
146
  MaxMatching<Graph>::Status stat = 
146
  MaxMatching<Graph>::Status stat =
147 147
    const_mat_test.status(n);
148 148
  const MaxMatching<Graph>::StatusMap& smap =
149 149
    const_mat_test.statusMap();
150 150
  stat = smap[n];
151 151
  const_mat_test.barrier(n);
152 152
}
... ...
@@ -167,22 +167,22 @@
167 167
  const MaxWeightedMatching<Graph>&
168 168
    const_mat_test = mat_test;
169 169

	
170 170
  mat_test.init();
171 171
  mat_test.start();
172 172
  mat_test.run();
173
  
173

	
174 174
  const_mat_test.matchingWeight();
175 175
  const_mat_test.matchingSize();
176 176
  const_mat_test.matching(e);
177 177
  const_mat_test.matching(n);
178 178
  const MaxWeightedMatching<Graph>::MatchingMap& mmap =
179 179
    const_mat_test.matchingMap();
180 180
  e = mmap[n];
181 181
  const_mat_test.mate(n);
182
  
182

	
183 183
  int k = 0;
184 184
  const_mat_test.dualValue();
185 185
  const_mat_test.nodeValue(n);
186 186
  const_mat_test.blossomNum();
187 187
  const_mat_test.blossomSize(k);
188 188
  const_mat_test.blossomValue(k);
... ...
@@ -204,21 +204,21 @@
204 204
  const MaxWeightedPerfectMatching<Graph>&
205 205
    const_mat_test = mat_test;
206 206

	
207 207
  mat_test.init();
208 208
  mat_test.start();
209 209
  mat_test.run();
210
  
210

	
211 211
  const_mat_test.matchingWeight();
212 212
  const_mat_test.matching(e);
213 213
  const_mat_test.matching(n);
214 214
  const MaxWeightedPerfectMatching<Graph>::MatchingMap& mmap =
215 215
    const_mat_test.matchingMap();
216 216
  e = mmap[n];
217 217
  const_mat_test.mate(n);
218
  
218

	
219 219
  int k = 0;
220 220
  const_mat_test.dualValue();
221 221
  const_mat_test.nodeValue(n);
222 222
  const_mat_test.blossomNum();
223 223
  const_mat_test.blossomSize(k);
224 224
  const_mat_test.blossomValue(k);
... ...
@@ -398,27 +398,51 @@
398 398
    SmartGraph::EdgeMap<int> weight(graph);
399 399

	
400 400
    istringstream lgfs(lgf[i]);
401 401
    graphReader(graph, lgfs).
402 402
      edgeMap("weight", weight).run();
403 403

	
404
    MaxMatching<SmartGraph> mm(graph);
405
    mm.run();
406
    checkMatching(graph, mm);
404
    bool perfect;
405
    {
406
      MaxMatching<SmartGraph> mm(graph);
407
      mm.run();
408
      checkMatching(graph, mm);
409
      perfect = 2 * mm.matchingSize() == countNodes(graph);
410
    }
407 411

	
408
    MaxWeightedMatching<SmartGraph> mwm(graph, weight);
409
    mwm.run();
410
    checkWeightedMatching(graph, weight, mwm);
412
    {
413
      MaxWeightedMatching<SmartGraph> mwm(graph, weight);
414
      mwm.run();
415
      checkWeightedMatching(graph, weight, mwm);
416
    }
411 417

	
412
    MaxWeightedPerfectMatching<SmartGraph> mwpm(graph, weight);
413
    bool perfect = mwpm.run();
418
    {
419
      MaxWeightedMatching<SmartGraph> mwm(graph, weight);
420
      mwm.init();
421
      mwm.start();
422
      checkWeightedMatching(graph, weight, mwm);
423
    }
414 424

	
415
    check(perfect == (mm.matchingSize() * 2 == countNodes(graph)),
416
          "Perfect matching found");
425
    {
426
      MaxWeightedPerfectMatching<SmartGraph> mwpm(graph, weight);
427
      bool result = mwpm.run();
417 428

	
418
    if (perfect) {
419
      checkWeightedPerfectMatching(graph, weight, mwpm);
429
      check(result == perfect, "Perfect matching found");
430
      if (perfect) {
431
        checkWeightedPerfectMatching(graph, weight, mwpm);
432
      }
433
    }
434

	
435
    {
436
      MaxWeightedPerfectMatching<SmartGraph> mwpm(graph, weight);
437
      mwpm.init();
438
      bool result = mwpm.start();
439

	
440
      check(result == perfect, "Perfect matching found");
441
      if (perfect) {
442
        checkWeightedPerfectMatching(graph, weight, mwpm);
443
      }
420 444
    }
421 445
  }
422 446

	
423 447
  return 0;
424 448
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -107,28 +107,28 @@
107 107
  mcarb_test.init();
108 108
  mcarb_test.addSource(s);
109 109
  mcarb_test.start();
110 110
  n = mcarb_test.processNextNode();
111 111
  b = const_mcarb_test.emptyQueue();
112 112
  i = const_mcarb_test.queueSize();
113
  
113

	
114 114
  c = const_mcarb_test.arborescenceCost();
115 115
  b = const_mcarb_test.arborescence(e);
116 116
  e = const_mcarb_test.pred(n);
117 117
  const MinCostArbType::ArborescenceMap &am =
118 118
    const_mcarb_test.arborescenceMap();
119 119
  const MinCostArbType::PredMap &pm =
120 120
    const_mcarb_test.predMap();
121 121
  b = const_mcarb_test.reached(n);
122 122
  b = const_mcarb_test.processed(n);
123
  
123

	
124 124
  i = const_mcarb_test.dualNum();
125 125
  c = const_mcarb_test.dualValue();
126 126
  i = const_mcarb_test.dualSize(i);
127 127
  c = const_mcarb_test.dualValue(i);
128
  
128

	
129 129
  ignore_unused_variable_warning(am);
130 130
  ignore_unused_variable_warning(pm);
131 131
}
132 132

	
133 133
int main() {
134 134
  typedef SmartDigraph Digraph;
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -21,20 +21,25 @@
21 21
#include <limits>
22 22

	
23 23
#include <lemon/list_graph.h>
24 24
#include <lemon/lgf_reader.h>
25 25

	
26 26
#include <lemon/network_simplex.h>
27
#include <lemon/capacity_scaling.h>
28
#include <lemon/cost_scaling.h>
29
#include <lemon/cycle_canceling.h>
27 30

	
28 31
#include <lemon/concepts/digraph.h>
32
#include <lemon/concepts/heap.h>
29 33
#include <lemon/concept_check.h>
30 34

	
31 35
#include "test_tools.h"
32 36

	
33 37
using namespace lemon;
34 38

	
39
// Test networks
35 40
char test_lgf[] =
36 41
  "@nodes\n"
37 42
  "label  sup1 sup2 sup3 sup4 sup5 sup6\n"
38 43
  "    1    20   27    0   30   20   30\n"
39 44
  "    2    -4    0    0    0   -8   -3\n"
40 45
  "    3     0    0    0    0    0    0\n"
... ...
@@ -44,13 +49,13 @@
44 49
  "    7     0    0    0    0    0    0\n"
45 50
  "    8     0    0    0    0    0    3\n"
46 51
  "    9     3    0    0    0    0    0\n"
47 52
  "   10    -2    0    0    0   -7   -2\n"
48 53
  "   11     0    0    0    0  -10    0\n"
49 54
  "   12   -20  -27    0  -30  -30  -20\n"
50
  "\n"                
55
  "\n"
51 56
  "@arcs\n"
52 57
  "       cost  cap low1 low2 low3\n"
53 58
  " 1  2    70   11    0    8    8\n"
54 59
  " 1  3   150    3    0    1    0\n"
55 60
  " 1  4    80   15    0    2    2\n"
56 61
  " 2  8    80   12    0    0    0\n"
... ...
@@ -73,36 +78,89 @@
73 78
  "12 11    30   10    0    0  -10\n"
74 79
  "\n"
75 80
  "@attributes\n"
76 81
  "source 1\n"
77 82
  "target 12\n";
78 83

	
84
char test_neg1_lgf[] =
85
  "@nodes\n"
86
  "label   sup\n"
87
  "    1   100\n"
88
  "    2     0\n"
89
  "    3     0\n"
90
  "    4  -100\n"
91
  "    5     0\n"
92
  "    6     0\n"
93
  "    7     0\n"
94
  "@arcs\n"
95
  "      cost   low1   low2\n"
96
  "1 2    100      0      0\n"
97
  "1 3     30      0      0\n"
98
  "2 4     20      0      0\n"
99
  "3 4     80      0      0\n"
100
  "3 2     50      0      0\n"
101
  "5 3     10      0      0\n"
102
  "5 6     80      0   1000\n"
103
  "6 7     30      0  -1000\n"
104
  "7 5   -120      0      0\n";
105

	
106
char test_neg2_lgf[] =
107
  "@nodes\n"
108
  "label   sup\n"
109
  "    1   100\n"
110
  "    2  -300\n"
111
  "@arcs\n"
112
  "      cost\n"
113
  "1 2     -1\n";
114

	
115

	
116
// Test data
117
typedef ListDigraph Digraph;
118
DIGRAPH_TYPEDEFS(ListDigraph);
119

	
120
Digraph gr;
121
Digraph::ArcMap<int> c(gr), l1(gr), l2(gr), l3(gr), u(gr);
122
Digraph::NodeMap<int> s1(gr), s2(gr), s3(gr), s4(gr), s5(gr), s6(gr);
123
ConstMap<Arc, int> cc(1), cu(std::numeric_limits<int>::max());
124
Node v, w;
125

	
126
Digraph neg1_gr;
127
Digraph::ArcMap<int> neg1_c(neg1_gr), neg1_l1(neg1_gr), neg1_l2(neg1_gr);
128
ConstMap<Arc, int> neg1_u1(std::numeric_limits<int>::max()), neg1_u2(5000);
129
Digraph::NodeMap<int> neg1_s(neg1_gr);
130

	
131
Digraph neg2_gr;
132
Digraph::ArcMap<int> neg2_c(neg2_gr);
133
ConstMap<Arc, int> neg2_l(0), neg2_u(1000);
134
Digraph::NodeMap<int> neg2_s(neg2_gr);
135

	
79 136

	
80 137
enum SupplyType {
81 138
  EQ,
82 139
  GEQ,
83 140
  LEQ
84 141
};
85 142

	
143

	
86 144
// Check the interface of an MCF algorithm
87 145
template <typename GR, typename Value, typename Cost>
88 146
class McfClassConcept
89 147
{
90 148
public:
91 149

	
92 150
  template <typename MCF>
93 151
  struct Constraints {
94 152
    void constraints() {
95 153
      checkConcept<concepts::Digraph, GR>();
96
      
154

	
97 155
      const Constraints& me = *this;
98 156

	
99 157
      MCF mcf(me.g);
100 158
      const MCF& const_mcf = mcf;
101 159

	
102
      b = mcf.reset()
160
      b = mcf.reset().resetParams()
103 161
             .lowerMap(me.lower)
104 162
             .upperMap(me.upper)
105 163
             .costMap(me.cost)
106 164
             .supplyMap(me.sup)
107 165
             .stSupply(me.n, me.n, me.k)
108 166
             .run();
... ...
@@ -119,13 +177,13 @@
119 177
    typedef typename GR::Arc Arc;
120 178
    typedef concepts::ReadMap<Node, Value> NM;
121 179
    typedef concepts::ReadMap<Arc, Value> VAM;
122 180
    typedef concepts::ReadMap<Arc, Cost> CAM;
123 181
    typedef concepts::WriteMap<Arc, Value> FlowMap;
124 182
    typedef concepts::WriteMap<Node, Cost> PotMap;
125
  
183

	
126 184
    GR g;
127 185
    VAM lower;
128 186
    VAM upper;
129 187
    CAM cost;
130 188
    NM sup;
131 189
    Node n;
... ...
@@ -173,39 +231,39 @@
173 231

	
174 232
// Check the feasibility of the given potentials (dual soluiton)
175 233
// using the "Complementary Slackness" optimality condition
176 234
template < typename GR, typename LM, typename UM,
177 235
           typename CM, typename SM, typename FM, typename PM >
178 236
bool checkPotential( const GR& gr, const LM& lower, const UM& upper,
179
                     const CM& cost, const SM& supply, const FM& flow, 
237
                     const CM& cost, const SM& supply, const FM& flow,
180 238
                     const PM& pi, SupplyType type )
181 239
{
182 240
  TEMPLATE_DIGRAPH_TYPEDEFS(GR);
183 241

	
184 242
  bool opt = true;
185 243
  for (ArcIt e(gr); opt && e != INVALID; ++e) {
186 244
    typename CM::Value red_cost =
187 245
      cost[e] + pi[gr.source(e)] - pi[gr.target(e)];
188 246
    opt = red_cost == 0 ||
189 247
          (red_cost > 0 && flow[e] == lower[e]) ||
190 248
          (red_cost < 0 && flow[e] == upper[e]);
191 249
  }
192
  
250

	
193 251
  for (NodeIt n(gr); opt && n != INVALID; ++n) {
194 252
    typename SM::Value sum = 0;
195 253
    for (OutArcIt e(gr, n); e != INVALID; ++e)
196 254
      sum += flow[e];
197 255
    for (InArcIt e(gr, n); e != INVALID; ++e)
198 256
      sum -= flow[e];
199 257
    if (type != LEQ) {
200 258
      opt = (pi[n] <= 0) && (sum == supply[n] || pi[n] == 0);
201 259
    } else {
202 260
      opt = (pi[n] >= 0) && (sum == supply[n] || pi[n] == 0);
203 261
    }
204 262
  }
205
  
263

	
206 264
  return opt;
207 265
}
208 266

	
209 267
// Check whether the dual cost is equal to the primal cost
210 268
template < typename GR, typename LM, typename UM,
211 269
           typename CM, typename SM, typename PM >
... ...
@@ -224,22 +282,22 @@
224 282
    if (lower[a] != 0) {
225 283
      dual_cost += lower[a] * cost[a];
226 284
      red_supply[gr.source(a)] -= lower[a];
227 285
      red_supply[gr.target(a)] += lower[a];
228 286
    }
229 287
  }
230
  
288

	
231 289
  for (NodeIt n(gr); n != INVALID; ++n) {
232 290
    dual_cost -= red_supply[n] * pi[n];
233 291
  }
234 292
  for (ArcIt a(gr); a != INVALID; ++a) {
235 293
    typename CM::Value red_cost =
236 294
      cost[a] + pi[gr.source(a)] - pi[gr.target(a)];
237 295
    dual_cost -= (upper[a] - lower[a]) * std::max(-red_cost, 0);
238 296
  }
239
  
297

	
240 298
  return dual_cost == total;
241 299
}
242 300

	
243 301
// Run a minimum cost flow algorithm and check the results
244 302
template < typename MCF, typename GR,
245 303
           typename LM, typename UM,
... ...
@@ -265,36 +323,105 @@
265 323
          "Wrong potentials " + test_id);
266 324
    check(checkDualCost(gr, lower, upper, cost, supply, pi, total),
267 325
          "Wrong dual cost " + test_id);
268 326
  }
269 327
}
270 328

	
329
template < typename MCF, typename Param >
330
void runMcfGeqTests( Param param,
331
                     const std::string &test_str = "",
332
                     bool full_neg_cost_support = false )
333
{
334
  MCF mcf1(gr), mcf2(neg1_gr), mcf3(neg2_gr);
335

	
336
  // Basic tests
337
  mcf1.upperMap(u).costMap(c).supplyMap(s1);
338
  checkMcf(mcf1, mcf1.run(param), gr, l1, u, c, s1,
339
           mcf1.OPTIMAL, true,     5240, test_str + "-1");
340
  mcf1.stSupply(v, w, 27);
341
  checkMcf(mcf1, mcf1.run(param), gr, l1, u, c, s2,
342
           mcf1.OPTIMAL, true,     7620, test_str + "-2");
343
  mcf1.lowerMap(l2).supplyMap(s1);
344
  checkMcf(mcf1, mcf1.run(param), gr, l2, u, c, s1,
345
           mcf1.OPTIMAL, true,     5970, test_str + "-3");
346
  mcf1.stSupply(v, w, 27);
347
  checkMcf(mcf1, mcf1.run(param), gr, l2, u, c, s2,
348
           mcf1.OPTIMAL, true,     8010, test_str + "-4");
349
  mcf1.resetParams().supplyMap(s1);
350
  checkMcf(mcf1, mcf1.run(param), gr, l1, cu, cc, s1,
351
           mcf1.OPTIMAL, true,       74, test_str + "-5");
352
  mcf1.lowerMap(l2).stSupply(v, w, 27);
353
  checkMcf(mcf1, mcf1.run(param), gr, l2, cu, cc, s2,
354
           mcf1.OPTIMAL, true,       94, test_str + "-6");
355
  mcf1.reset();
356
  checkMcf(mcf1, mcf1.run(param), gr, l1, cu, cc, s3,
357
           mcf1.OPTIMAL, true,        0, test_str + "-7");
358
  mcf1.lowerMap(l2).upperMap(u);
359
  checkMcf(mcf1, mcf1.run(param), gr, l2, u, cc, s3,
360
           mcf1.INFEASIBLE, false,    0, test_str + "-8");
361
  mcf1.lowerMap(l3).upperMap(u).costMap(c).supplyMap(s4);
362
  checkMcf(mcf1, mcf1.run(param), gr, l3, u, c, s4,
363
           mcf1.OPTIMAL, true,     6360, test_str + "-9");
364

	
365
  // Tests for the GEQ form
366
  mcf1.resetParams().upperMap(u).costMap(c).supplyMap(s5);
367
  checkMcf(mcf1, mcf1.run(param), gr, l1, u, c, s5,
368
           mcf1.OPTIMAL, true,     3530, test_str + "-10", GEQ);
369
  mcf1.lowerMap(l2);
370
  checkMcf(mcf1, mcf1.run(param), gr, l2, u, c, s5,
371
           mcf1.OPTIMAL, true,     4540, test_str + "-11", GEQ);
372
  mcf1.supplyMap(s6);
373
  checkMcf(mcf1, mcf1.run(param), gr, l2, u, c, s6,
374
           mcf1.INFEASIBLE, false,    0, test_str + "-12", GEQ);
375

	
376
  // Tests with negative costs
377
  mcf2.lowerMap(neg1_l1).costMap(neg1_c).supplyMap(neg1_s);
378
  checkMcf(mcf2, mcf2.run(param), neg1_gr, neg1_l1, neg1_u1, neg1_c, neg1_s,
379
           mcf2.UNBOUNDED, false,     0, test_str + "-13");
380
  mcf2.upperMap(neg1_u2);
381
  checkMcf(mcf2, mcf2.run(param), neg1_gr, neg1_l1, neg1_u2, neg1_c, neg1_s,
382
           mcf2.OPTIMAL, true,   -40000, test_str + "-14");
383
  mcf2.resetParams().lowerMap(neg1_l2).costMap(neg1_c).supplyMap(neg1_s);
384
  checkMcf(mcf2, mcf2.run(param), neg1_gr, neg1_l2, neg1_u1, neg1_c, neg1_s,
385
           mcf2.UNBOUNDED, false,     0, test_str + "-15");
386

	
387
  mcf3.costMap(neg2_c).supplyMap(neg2_s);
388
  if (full_neg_cost_support) {
389
    checkMcf(mcf3, mcf3.run(param), neg2_gr, neg2_l, neg2_u, neg2_c, neg2_s,
390
             mcf3.OPTIMAL, true,   -300, test_str + "-16", GEQ);
391
  } else {
392
    checkMcf(mcf3, mcf3.run(param), neg2_gr, neg2_l, neg2_u, neg2_c, neg2_s,
393
             mcf3.UNBOUNDED, false,   0, test_str + "-17", GEQ);
394
  }
395
  mcf3.upperMap(neg2_u);
396
  checkMcf(mcf3, mcf3.run(param), neg2_gr, neg2_l, neg2_u, neg2_c, neg2_s,
397
           mcf3.OPTIMAL, true,     -300, test_str + "-18", GEQ);
398
}
399

	
400
template < typename MCF, typename Param >
401
void runMcfLeqTests( Param param,
402
                     const std::string &test_str = "" )
403
{
404
  // Tests for the LEQ form
405
  MCF mcf1(gr);
406
  mcf1.supplyType(mcf1.LEQ);
407
  mcf1.upperMap(u).costMap(c).supplyMap(s6);
408
  checkMcf(mcf1, mcf1.run(param), gr, l1, u, c, s6,
409
           mcf1.OPTIMAL, true,   5080, test_str + "-19", LEQ);
410
  mcf1.lowerMap(l2);
411
  checkMcf(mcf1, mcf1.run(param), gr, l2, u, c, s6,
412
           mcf1.OPTIMAL, true,   5930, test_str + "-20", LEQ);
413
  mcf1.supplyMap(s5);
414
  checkMcf(mcf1, mcf1.run(param), gr, l2, u, c, s5,
415
           mcf1.INFEASIBLE, false,  0, test_str + "-21", LEQ);
416
}
417

	
418

	
271 419
int main()
272 420
{
273
  // Check the interfaces
274
  {
275
    typedef concepts::Digraph GR;
276
    checkConcept< McfClassConcept<GR, int, int>,
277
                  NetworkSimplex<GR> >();
278
    checkConcept< McfClassConcept<GR, double, double>,
279
                  NetworkSimplex<GR, double> >();
280
    checkConcept< McfClassConcept<GR, int, double>,
281
                  NetworkSimplex<GR, int, double> >();
282
  }
283

	
284
  // Run various MCF tests
285
  typedef ListDigraph Digraph;
286
  DIGRAPH_TYPEDEFS(ListDigraph);
287

	
288
  // Read the test digraph
289
  Digraph gr;
290
  Digraph::ArcMap<int> c(gr), l1(gr), l2(gr), l3(gr), u(gr);
291
  Digraph::NodeMap<int> s1(gr), s2(gr), s3(gr), s4(gr), s5(gr), s6(gr);
292
  ConstMap<Arc, int> cc(1), cu(std::numeric_limits<int>::max());
293
  Node v, w;
294

	
421
  // Read the test networks
295 422
  std::istringstream input(test_lgf);
296 423
  DigraphReader<Digraph>(gr, input)
297 424
    .arcMap("cost", c)
298 425
    .arcMap("cap", u)
299 426
    .arcMap("low1", l1)
300 427
    .arcMap("low2", l2)
... ...
@@ -305,146 +432,111 @@
305 432
    .nodeMap("sup4", s4)
306 433
    .nodeMap("sup5", s5)
307 434
    .nodeMap("sup6", s6)
308 435
    .node("source", v)
309 436
    .node("target", w)
310 437
    .run();
311
  
312
  // Build test digraphs with negative costs
313
  Digraph neg_gr;
314
  Node n1 = neg_gr.addNode();
315
  Node n2 = neg_gr.addNode();
316
  Node n3 = neg_gr.addNode();
317
  Node n4 = neg_gr.addNode();
318
  Node n5 = neg_gr.addNode();
319
  Node n6 = neg_gr.addNode();
320
  Node n7 = neg_gr.addNode();
321
  
322
  Arc a1 = neg_gr.addArc(n1, n2);
323
  Arc a2 = neg_gr.addArc(n1, n3);
324
  Arc a3 = neg_gr.addArc(n2, n4);
325
  Arc a4 = neg_gr.addArc(n3, n4);
326
  Arc a5 = neg_gr.addArc(n3, n2);
327
  Arc a6 = neg_gr.addArc(n5, n3);
328
  Arc a7 = neg_gr.addArc(n5, n6);
329
  Arc a8 = neg_gr.addArc(n6, n7);
330
  Arc a9 = neg_gr.addArc(n7, n5);
331
  
332
  Digraph::ArcMap<int> neg_c(neg_gr), neg_l1(neg_gr, 0), neg_l2(neg_gr, 0);
333
  ConstMap<Arc, int> neg_u1(std::numeric_limits<int>::max()), neg_u2(5000);
334
  Digraph::NodeMap<int> neg_s(neg_gr, 0);
335
  
336
  neg_l2[a7] =  1000;
337
  neg_l2[a8] = -1000;
338
  
339
  neg_s[n1] =  100;
340
  neg_s[n4] = -100;
341
  
342
  neg_c[a1] =  100;
343
  neg_c[a2] =   30;
344
  neg_c[a3] =   20;
345
  neg_c[a4] =   80;
346
  neg_c[a5] =   50;
347
  neg_c[a6] =   10;
348
  neg_c[a7] =   80;
349
  neg_c[a8] =   30;
350
  neg_c[a9] = -120;
351 438

	
352
  Digraph negs_gr;
353
  Digraph::NodeMap<int> negs_s(negs_gr);
354
  Digraph::ArcMap<int> negs_c(negs_gr);
355
  ConstMap<Arc, int> negs_l(0), negs_u(1000);
356
  n1 = negs_gr.addNode();
357
  n2 = negs_gr.addNode();
358
  negs_s[n1] = 100;
359
  negs_s[n2] = -300;
360
  negs_c[negs_gr.addArc(n1, n2)] = -1;
439
  std::istringstream neg_inp1(test_neg1_lgf);
440
  DigraphReader<Digraph>(neg1_gr, neg_inp1)
441
    .arcMap("cost", neg1_c)
442
    .arcMap("low1", neg1_l1)
443
    .arcMap("low2", neg1_l2)
444
    .nodeMap("sup", neg1_s)
445
    .run();
361 446

	
447
  std::istringstream neg_inp2(test_neg2_lgf);
448
  DigraphReader<Digraph>(neg2_gr, neg_inp2)
449
    .arcMap("cost", neg2_c)
450
    .nodeMap("sup", neg2_s)
451
    .run();
362 452

	
363
  // A. Test NetworkSimplex with the default pivot rule
453
  // Check the interface of NetworkSimplex
364 454
  {
365
    NetworkSimplex<Digraph> mcf(gr);
366

	
367
    // Check the equality form
368
    mcf.upperMap(u).costMap(c);
369
    checkMcf(mcf, mcf.supplyMap(s1).run(),
370
             gr, l1, u, c, s1, mcf.OPTIMAL, true,   5240, "#A1");
371
    checkMcf(mcf, mcf.stSupply(v, w, 27).run(),
372
             gr, l1, u, c, s2, mcf.OPTIMAL, true,   7620, "#A2");
373
    mcf.lowerMap(l2);
374
    checkMcf(mcf, mcf.supplyMap(s1).run(),
375
             gr, l2, u, c, s1, mcf.OPTIMAL, true,   5970, "#A3");
376
    checkMcf(mcf, mcf.stSupply(v, w, 27).run(),
377
             gr, l2, u, c, s2, mcf.OPTIMAL, true,   8010, "#A4");
378
    mcf.reset();
379
    checkMcf(mcf, mcf.supplyMap(s1).run(),
380
             gr, l1, cu, cc, s1, mcf.OPTIMAL, true,   74, "#A5");
381
    checkMcf(mcf, mcf.lowerMap(l2).stSupply(v, w, 27).run(),
382
             gr, l2, cu, cc, s2, mcf.OPTIMAL, true,   94, "#A6");
383
    mcf.reset();
384
    checkMcf(mcf, mcf.run(),
385
             gr, l1, cu, cc, s3, mcf.OPTIMAL, true,    0, "#A7");
386
    checkMcf(mcf, mcf.lowerMap(l2).upperMap(u).run(),
387
             gr, l2, u, cc, s3, mcf.INFEASIBLE, false, 0, "#A8");
388
    mcf.reset().lowerMap(l3).upperMap(u).costMap(c).supplyMap(s4);
389
    checkMcf(mcf, mcf.run(),
390
             gr, l3, u, c, s4, mcf.OPTIMAL, true,   6360, "#A9");
391

	
392
    // Check the GEQ form
393
    mcf.reset().upperMap(u).costMap(c).supplyMap(s5);
394
    checkMcf(mcf, mcf.run(),
395
             gr, l1, u, c, s5, mcf.OPTIMAL, true,   3530, "#A10", GEQ);
396
    mcf.supplyType(mcf.GEQ);
397
    checkMcf(mcf, mcf.lowerMap(l2).run(),
398
             gr, l2, u, c, s5, mcf.OPTIMAL, true,   4540, "#A11", GEQ);
399
    mcf.supplyMap(s6);
400
    checkMcf(mcf, mcf.run(),
401
             gr, l2, u, c, s6, mcf.INFEASIBLE, false,  0, "#A12", GEQ);
402

	
403
    // Check the LEQ form
404
    mcf.reset().supplyType(mcf.LEQ);
405
    mcf.upperMap(u).costMap(c).supplyMap(s6);
406
    checkMcf(mcf, mcf.run(),
407
             gr, l1, u, c, s6, mcf.OPTIMAL, true,   5080, "#A13", LEQ);
408
    checkMcf(mcf, mcf.lowerMap(l2).run(),
409
             gr, l2, u, c, s6, mcf.OPTIMAL, true,   5930, "#A14", LEQ);
410
    mcf.supplyMap(s5);
411
    checkMcf(mcf, mcf.run(),
412
             gr, l2, u, c, s5, mcf.INFEASIBLE, false,  0, "#A15", LEQ);
413

	
414
    // Check negative costs
415
    NetworkSimplex<Digraph> neg_mcf(neg_gr);
416
    neg_mcf.lowerMap(neg_l1).costMap(neg_c).supplyMap(neg_s);
417
    checkMcf(neg_mcf, neg_mcf.run(), neg_gr, neg_l1, neg_u1,
418
      neg_c, neg_s, neg_mcf.UNBOUNDED, false,    0, "#A16");
419
    neg_mcf.upperMap(neg_u2);
420
    checkMcf(neg_mcf, neg_mcf.run(), neg_gr, neg_l1, neg_u2,
421
      neg_c, neg_s, neg_mcf.OPTIMAL, true,  -40000, "#A17");
422
    neg_mcf.reset().lowerMap(neg_l2).costMap(neg_c).supplyMap(neg_s);
423
    checkMcf(neg_mcf, neg_mcf.run(), neg_gr, neg_l2, neg_u1,
424
      neg_c, neg_s, neg_mcf.UNBOUNDED, false,    0, "#A18");
425
      
426
    NetworkSimplex<Digraph> negs_mcf(negs_gr);
427
    negs_mcf.costMap(negs_c).supplyMap(negs_s);
428
    checkMcf(negs_mcf, negs_mcf.run(), negs_gr, negs_l, negs_u,
429
      negs_c, negs_s, negs_mcf.OPTIMAL, true, -300, "#A19", GEQ);
455
    typedef concepts::Digraph GR;
456
    checkConcept< McfClassConcept<GR, int, int>,
457
                  NetworkSimplex<GR> >();
458
    checkConcept< McfClassConcept<GR, double, double>,
459
                  NetworkSimplex<GR, double> >();
460
    checkConcept< McfClassConcept<GR, int, double>,
461
                  NetworkSimplex<GR, int, double> >();
430 462
  }
431 463

	
432
  // B. Test NetworkSimplex with each pivot rule
464
  // Check the interface of CapacityScaling
433 465
  {
434
    NetworkSimplex<Digraph> mcf(gr);
435
    mcf.supplyMap(s1).costMap(c).upperMap(u).lowerMap(l2);
466
    typedef concepts::Digraph GR;
467
    checkConcept< McfClassConcept<GR, int, int>,
468
                  CapacityScaling<GR> >();
469
    checkConcept< McfClassConcept<GR, double, double>,
470
                  CapacityScaling<GR, double> >();
471
    checkConcept< McfClassConcept<GR, int, double>,
472
                  CapacityScaling<GR, int, double> >();
473
    typedef CapacityScaling<GR>::
474
      SetHeap<concepts::Heap<int, RangeMap<int> > >::Create CAS;
475
    checkConcept< McfClassConcept<GR, int, int>, CAS >();
476
  }
436 477

	
437
    checkMcf(mcf, mcf.run(NetworkSimplex<Digraph>::FIRST_ELIGIBLE),
438
             gr, l2, u, c, s1, mcf.OPTIMAL, true,   5970, "#B1");
439
    checkMcf(mcf, mcf.run(NetworkSimplex<Digraph>::BEST_ELIGIBLE),
440
             gr, l2, u, c, s1, mcf.OPTIMAL, true,   5970, "#B2");
441
    checkMcf(mcf, mcf.run(NetworkSimplex<Digraph>::BLOCK_SEARCH),
442
             gr, l2, u, c, s1, mcf.OPTIMAL, true,   5970, "#B3");
443
    checkMcf(mcf, mcf.run(NetworkSimplex<Digraph>::CANDIDATE_LIST),
444
             gr, l2, u, c, s1, mcf.OPTIMAL, true,   5970, "#B4");
445
    checkMcf(mcf, mcf.run(NetworkSimplex<Digraph>::ALTERING_LIST),
446
             gr, l2, u, c, s1, mcf.OPTIMAL, true,   5970, "#B5");
478
  // Check the interface of CostScaling
479
  {
480
    typedef concepts::Digraph GR;
481
    checkConcept< McfClassConcept<GR, int, int>,
482
                  CostScaling<GR> >();
483
    checkConcept< McfClassConcept<GR, double, double>,
484
                  CostScaling<GR, double> >();
485
    checkConcept< McfClassConcept<GR, int, double>,
486
                  CostScaling<GR, int, double> >();
487
    typedef CostScaling<GR>::
488
      SetLargeCost<double>::Create COS;
489
    checkConcept< McfClassConcept<GR, int, int>, COS >();
490
  }
491

	
492
  // Check the interface of CycleCanceling
493
  {
494
    typedef concepts::Digraph GR;
495
    checkConcept< McfClassConcept<GR, int, int>,
496
                  CycleCanceling<GR> >();
497
    checkConcept< McfClassConcept<GR, double, double>,
498
                  CycleCanceling<GR, double> >();
499
    checkConcept< McfClassConcept<GR, int, double>,
500
                  CycleCanceling<GR, int, double> >();
501
  }
502

	
503
  // Test NetworkSimplex
504
  {
505
    typedef NetworkSimplex<Digraph> MCF;
506
    runMcfGeqTests<MCF>(MCF::FIRST_ELIGIBLE, "NS-FE", true);
507
    runMcfLeqTests<MCF>(MCF::FIRST_ELIGIBLE, "NS-FE");
508
    runMcfGeqTests<MCF>(MCF::BEST_ELIGIBLE,  "NS-BE", true);
509
    runMcfLeqTests<MCF>(MCF::BEST_ELIGIBLE,  "NS-BE");
510
    runMcfGeqTests<MCF>(MCF::BLOCK_SEARCH,   "NS-BS", true);
511
    runMcfLeqTests<MCF>(MCF::BLOCK_SEARCH,   "NS-BS");
512
    runMcfGeqTests<MCF>(MCF::CANDIDATE_LIST, "NS-CL", true);
513
    runMcfLeqTests<MCF>(MCF::CANDIDATE_LIST, "NS-CL");
514
    runMcfGeqTests<MCF>(MCF::ALTERING_LIST,  "NS-AL", true);
515
    runMcfLeqTests<MCF>(MCF::ALTERING_LIST,  "NS-AL");
516
  }
517

	
518
  // Test CapacityScaling
519
  {
520
    typedef CapacityScaling<Digraph> MCF;
521
    runMcfGeqTests<MCF>(0, "SSP");
522
    runMcfGeqTests<MCF>(2, "CAS");
523
  }
524

	
525
  // Test CostScaling
526
  {
527
    typedef CostScaling<Digraph> MCF;
528
    runMcfGeqTests<MCF>(MCF::PUSH, "COS-PR");
529
    runMcfGeqTests<MCF>(MCF::AUGMENT, "COS-AR");
530
    runMcfGeqTests<MCF>(MCF::PARTIAL_AUGMENT, "COS-PAR");
531
  }
532

	
533
  // Test CycleCanceling
534
  {
535
    typedef CycleCanceling<Digraph> MCF;
536
    runMcfGeqTests<MCF>(MCF::SIMPLE_CYCLE_CANCELING, "SCC");
537
    runMcfGeqTests<MCF>(MCF::MINIMUM_MEAN_CYCLE_CANCELING, "MMCC");
538
    runMcfGeqTests<MCF>(MCF::CANCEL_AND_TIGHTEN, "CAT");
447 539
  }
448 540

	
449 541
  return 0;
450 542
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -92,12 +92,17 @@
92 92
            ::SetElevator<Elev>
93 93
            ::SetStandardElevator<LinkedElev>
94 94
            ::Create PreflowType;
95 95
  PreflowType preflow_test(g, cap, n, n);
96 96
  const PreflowType& const_preflow_test = preflow_test;
97 97

	
98
  const PreflowType::Elevator& elev = const_preflow_test.elevator();
99
  preflow_test.elevator(const_cast<PreflowType::Elevator&>(elev));
100
  PreflowType::Tolerance tol = const_preflow_test.tolerance();
101
  preflow_test.tolerance(tol);
102

	
98 103
  preflow_test
99 104
    .capacityMap(cap)
100 105
    .flowMap(flow)
101 106
    .source(n)
102 107
    .target(n);
103 108

	
... ...
@@ -110,13 +115,13 @@
110 115

	
111 116
  v = const_preflow_test.flowValue();
112 117
  v = const_preflow_test.flow(e);
113 118
  const FlowMap& fm = const_preflow_test.flowMap();
114 119
  b = const_preflow_test.minCut(n);
115 120
  const_preflow_test.minCutMap(cut);
116
  
121

	
117 122
  ignore_unused_variable_warning(fm);
118 123
}
119 124

	
120 125
int cutValue (const SmartDigraph& g,
121 126
              const SmartDigraph::NodeMap<bool>& cut,
122 127
              const SmartDigraph::ArcMap<int>& cap) {
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -20,12 +20,13 @@
20 20

	
21 21
#include <lemon/list_graph.h>
22 22
#include <lemon/lgf_reader.h>
23 23
#include <lemon/path.h>
24 24
#include <lemon/suurballe.h>
25 25
#include <lemon/concepts/digraph.h>
26
#include <lemon/concepts/heap.h>
26 27

	
27 28
#include "test_tools.h"
28 29

	
29 30
using namespace lemon;
30 31

	
31 32
char test_lgf[] =
... ...
@@ -77,14 +78,20 @@
77 78
  typedef int VType;
78 79
  typedef concepts::Digraph Digraph;
79 80

	
80 81
  typedef Digraph::Node Node;
81 82
  typedef Digraph::Arc Arc;
82 83
  typedef concepts::ReadMap<Arc, VType> LengthMap;
83
  
84
  typedef Suurballe<Digraph, LengthMap> SuurballeType;
84

	
85
  typedef Suurballe<Digraph, LengthMap> ST;
86
  typedef Suurballe<Digraph, LengthMap>
87
    ::SetFlowMap<ST::FlowMap>
88
    ::SetPotentialMap<ST::PotentialMap>
89
    ::SetPath<SimplePath<Digraph> >
90
    ::SetHeap<concepts::Heap<VType, Digraph::NodeMap<int> > >
91
    ::Create SuurballeType;
85 92

	
86 93
  Digraph g;
87 94
  Node n;
88 95
  Arc e;
89 96
  LengthMap len;
90 97
  SuurballeType::FlowMap flow(g);
... ...
@@ -98,28 +105,31 @@
98 105
    .potentialMap(pi);
99 106

	
100 107
  int k;
101 108
  k = suurb_test.run(n, n);
102 109
  k = suurb_test.run(n, n, k);
103 110
  suurb_test.init(n);
111
  suurb_test.fullInit(n);
112
  suurb_test.start(n);
113
  suurb_test.start(n, k);
104 114
  k = suurb_test.findFlow(n);
105 115
  k = suurb_test.findFlow(n, k);
106 116
  suurb_test.findPaths();
107
  
117

	
108 118
  int f;
109 119
  VType c;
110 120
  c = const_suurb_test.totalLength();
111 121
  f = const_suurb_test.flow(e);
112 122
  const SuurballeType::FlowMap& fm =
113 123
    const_suurb_test.flowMap();
114 124
  c = const_suurb_test.potential(n);
115 125
  const SuurballeType::PotentialMap& pm =
116 126
    const_suurb_test.potentialMap();
117 127
  k = const_suurb_test.pathNum();
118 128
  Path<Digraph> p = const_suurb_test.path(k);
119
  
129

	
120 130
  ignore_unused_variable_warning(fm);
121 131
  ignore_unused_variable_warning(pm);
122 132
}
123 133

	
124 134
// Check the feasibility of the flow
125 135
template <typename Digraph, typename FlowMap>
... ...
@@ -192,50 +202,64 @@
192 202
  DigraphReader<ListDigraph>(digraph, input).
193 203
    arcMap("length", length).
194 204
    node("source", s).
195 205
    node("target", t).
196 206
    run();
197 207

	
198
  // Find 2 paths
208
  // Check run()
199 209
  {
200 210
    Suurballe<ListDigraph> suurballe(digraph, length);
211

	
212
    // Find 2 paths
201 213
    check(suurballe.run(s, t) == 2, "Wrong number of paths");
202 214
    check(checkFlow(digraph, suurballe.flowMap(), s, t, 2),
203 215
          "The flow is not feasible");
204 216
    check(suurballe.totalLength() == 510, "The flow is not optimal");
205 217
    check(checkOptimality(digraph, length, suurballe.flowMap(),
206 218
                          suurballe.potentialMap()),
207 219
          "Wrong potentials");
208 220
    for (int i = 0; i < suurballe.pathNum(); ++i)
209 221
      check(checkPath(digraph, suurballe.path(i), s, t), "Wrong path");
210
  }
211 222

	
212
  // Find 3 paths
213
  {
214
    Suurballe<ListDigraph> suurballe(digraph, length);
223
    // Find 3 paths
215 224
    check(suurballe.run(s, t, 3) == 3, "Wrong number of paths");
216 225
    check(checkFlow(digraph, suurballe.flowMap(), s, t, 3),
217 226
          "The flow is not feasible");
218 227
    check(suurballe.totalLength() == 1040, "The flow is not optimal");
219 228
    check(checkOptimality(digraph, length, suurballe.flowMap(),
220 229
                          suurballe.potentialMap()),
221 230
          "Wrong potentials");
222 231
    for (int i = 0; i < suurballe.pathNum(); ++i)
223 232
      check(checkPath(digraph, suurballe.path(i), s, t), "Wrong path");
224
  }
225 233

	
226
  // Find 5 paths (only 3 can be found)
227
  {
228
    Suurballe<ListDigraph> suurballe(digraph, length);
234
    // Find 5 paths (only 3 can be found)
229 235
    check(suurballe.run(s, t, 5) == 3, "Wrong number of paths");
230 236
    check(checkFlow(digraph, suurballe.flowMap(), s, t, 3),
231 237
          "The flow is not feasible");
232 238
    check(suurballe.totalLength() == 1040, "The flow is not optimal");
233 239
    check(checkOptimality(digraph, length, suurballe.flowMap(),
234 240
                          suurballe.potentialMap()),
235 241
          "Wrong potentials");
236 242
    for (int i = 0; i < suurballe.pathNum(); ++i)
237 243
      check(checkPath(digraph, suurballe.path(i), s, t), "Wrong path");
238 244
  }
239 245

	
246
  // Check fullInit() + start()
247
  {
248
    Suurballe<ListDigraph> suurballe(digraph, length);
249
    suurballe.fullInit(s);
250

	
251
    // Find 2 paths
252
    check(suurballe.start(t) == 2, "Wrong number of paths");
253
    check(suurballe.totalLength() == 510, "The flow is not optimal");
254

	
255
    // Find 3 paths
256
    check(suurballe.start(t, 3) == 3, "Wrong number of paths");
257
    check(suurballe.totalLength() == 1040, "The flow is not optimal");
258

	
259
    // Find 5 paths (only 3 can be found)
260
    check(suurballe.start(t, 5) == 3, "Wrong number of paths");
261
    check(suurballe.totalLength() == 1040, "The flow is not optimal");
262
  }
263

	
240 264
  return 0;
241 265
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -34,13 +34,17 @@
34 34
///using good source browsers like e.g. \c emacs.
35 35
///
36 36
///For example
37 37
///\code check(0==1,"This is obviously false.");\endcode will
38 38
///print something like this (and then exits).
39 39
///\verbatim file_name.cc:123: error: This is obviously false. \endverbatim
40
#define check(rc, msg) \
41
  if(!(rc)) { \
42
    std::cerr << __FILE__ ":" << __LINE__ << ": error: " << msg << std::endl; \
43
    abort(); \
44
  } else { } \
40
#define check(rc, msg)                                                  \
41
  {                                                                     \
42
    if(!(rc)) {                                                         \
43
      std::cerr << __FILE__ ":" << __LINE__ << ": error: "              \
44
                << msg << std::endl;                                    \
45
      abort();                                                          \
46
    } else { }                                                          \
47
  }                                                                     \
48

	
45 49

	
46 50
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
... ...
@@ -85,16 +85,16 @@
85 85
  ti.restart();
86 86
  Preflow<Digraph, Digraph::ArcMap<Value> > pre(g,cap,s,t);
87 87
  if(report) std::cerr << "Setup Preflow class: " << ti << '\n';
88 88
  ti.restart();
89 89
  pre.run();
90 90
  if(report) std::cerr << "Run Preflow: " << ti << '\n';
91
  if(report) std::cerr << "\nMax flow value: " << pre.flowValue() << '\n';  
91
  if(report) std::cerr << "\nMax flow value: " << pre.flowValue() << '\n';
92 92
}
93 93

	
94
template<class Value>
94
template<class Value, class LargeValue>
95 95
void solve_min(ArgParser &ap, std::istream &is, std::ostream &,
96 96
               Value infty, DimacsDescriptor &desc)
97 97
{
98 98
  bool report = !ap.given("q");
99 99
  Digraph g;
100 100
  Digraph::ArcMap<Value> lower(g), cap(g), cost(g);
... ...
@@ -124,13 +124,14 @@
124 124
  if (report) std::cerr << "Setup NetworkSimplex class: " << ti << '\n';
125 125
  ti.restart();
126 126
  bool res = ns.run();
127 127
  if (report) {
128 128
    std::cerr << "Run NetworkSimplex: " << ti << "\n\n";
129 129
    std::cerr << "Feasible flow: " << (res ? "found" : "not found") << '\n';
130
    if (res) std::cerr << "Min flow cost: " << ns.totalCost() << '\n';
130
    if (res) std::cerr << "Min flow cost: "
131
                       << ns.template totalCost<LargeValue>() << '\n';
131 132
  }
132 133
}
133 134

	
134 135
void solve_mat(ArgParser &ap, std::istream &is, std::ostream &,
135 136
              DimacsDescriptor &desc)
136 137
{
... ...
@@ -144,17 +145,17 @@
144 145
  MaxMatching<Graph> mat(g);
145 146
  if(report) std::cerr << "Setup MaxMatching class: " << ti << '\n';
146 147
  ti.restart();
147 148
  mat.run();
148 149
  if(report) std::cerr << "Run MaxMatching: " << ti << '\n';
149 150
  if(report) std::cerr << "\nCardinality of max matching: "
150
                       << mat.matchingSize() << '\n';  
151
                       << mat.matchingSize() << '\n';
151 152
}
152 153

	
153 154

	
154
template<class Value>
155
template<class Value, class LargeValue>
155 156
void solve(ArgParser &ap, std::istream &is, std::ostream &os,
156 157
           DimacsDescriptor &desc)
157 158
{
158 159
  std::stringstream iss(static_cast<std::string>(ap["infcap"]));
159 160
  Value infty;
160 161
  iss >> infty;
... ...
@@ -162,17 +163,17 @@
162 163
    {
163 164
      std::cerr << "Cannot interpret '"
164 165
                << static_cast<std::string>(ap["infcap"]) << "' as infinite"
165 166
                << std::endl;
166 167
      exit(1);
167 168
    }
168
  
169

	
169 170
  switch(desc.type)
170 171
    {
171 172
    case DimacsDescriptor::MIN:
172
      solve_min<Value>(ap,is,os,infty,desc);
173
      solve_min<Value, LargeValue>(ap,is,os,infty,desc);
173 174
      break;
174 175
    case DimacsDescriptor::MAX:
175 176
      solve_max<Value>(ap,is,os,infty,desc);
176 177
      break;
177 178
    case DimacsDescriptor::SP:
178 179
      solve_sp<Value>(ap,is,os,desc);
... ...
@@ -234,13 +235,13 @@
234 235
      return 1;
235 236
    }
236 237
  std::istream& is = (ap.files().size()<1 ? std::cin : input);
237 238
  std::ostream& os = (ap.files().size()<2 ? std::cout : output);
238 239

	
239 240
  DimacsDescriptor desc = dimacsType(is);
240
  
241

	
241 242
  if(!ap.given("q"))
242 243
    {
243 244
      std::cout << "Problem type: ";
244 245
      switch(desc.type)
245 246
        {
246 247
        case DimacsDescriptor::MIN:
... ...
@@ -259,19 +260,21 @@
259 260
          break;
260 261
        }
261 262
      std::cout << "\nNum of nodes: " << desc.nodeNum;
262 263
      std::cout << "\nNum of arcs:  " << desc.edgeNum;
263 264
      std::cout << "\n\n";
264 265
    }
265
    
266

	
266 267
  if(ap.given("double"))
267
    solve<double>(ap,is,os,desc);
268
    solve<double, double>(ap,is,os,desc);
268 269
  else if(ap.given("ldouble"))
269
    solve<long double>(ap,is,os,desc);
270
    solve<long double, long double>(ap,is,os,desc);
270 271
#ifdef LEMON_HAVE_LONG_LONG
271 272
  else if(ap.given("long"))
272
    solve<long long>(ap,is,os,desc);
273
    solve<long long, long long>(ap,is,os,desc);
274
  else solve<int, long long>(ap,is,os,desc);
275
#else
276
  else solve<int, long>(ap,is,os,desc);
273 277
#endif
274
  else solve<int>(ap,is,os,desc);
275 278

	
276 279
  return 0;
277 280
}
Ignore white space 6 line context
... ...
@@ -32,16 +32,16 @@
32 32
        -e "s/graph/_digr_aph_label_/g"\
33 33
        -e "s/UEdge/_Ed_ge_label_/g"\
34 34
        -e "s/u[Ee]dge/_ed_ge_label_/g"\
35 35
        -e "s/IncEdgeIt/_In_cEd_geIt_label_/g"\
36 36
        -e "s/Edge\>/_Ar_c_label_/g"\
37 37
        -e "s/\<edge\>/_ar_c_label_/g"\
38
        -e "s/_edge\>/_ar_c_label_/g"\
38
        -e "s/_edge\>/__ar_c_label_/g"\
39 39
        -e "s/Edges\>/_Ar_c_label_s/g"\
40 40
        -e "s/\<edges\>/_ar_c_label_s/g"\
41
        -e "s/_edges\>/_ar_c_label_s/g"\
41
        -e "s/_edges\>/__ar_c_label_s/g"\
42 42
        -e "s/\([Ee]\)dge\([a-z]\)/_\1d_ge_label_\2/g"\
43 43
        -e "s/\([a-z]\)edge/\1_ed_ge_label_/g"\
44 44
        -e "s/Edge/_Ar_c_label_/g"\
45 45
        -e "s/edge/_ar_c_label_/g"\
46 46
        -e "s/A[Nn]ode/_Re_d_label_/g"\
47 47
        -e "s/B[Nn]ode/_Blu_e_label_/g"\
... ...
@@ -65,12 +65,17 @@
65 65
        -e "s/_Re_d_label_/Red/g"\
66 66
        -e "s/_Blu_e_label_/Blue/g"\
67 67
        -e "s/_re_d_label_/red/g"\
68 68
        -e "s/_blu_e_label_/blue/g"\
69 69
        -e "s/_GR_APH_TY_PEDE_FS_label_/GRAPH_TYPEDEFS/g"\
70 70
        -e "s/_DIGR_APH_TY_PEDE_FS_label_/DIGRAPH_TYPEDEFS/g"\
71
        -e "s/\<digraph_adaptor\.h\>/adaptors.h/g"\
72
        -e "s/\<digraph_utils\.h\>/core.h/g"\
73
        -e "s/\<digraph_reader\.h\>/lgf_reader.h/g"\
74
        -e "s/\<digraph_writer\.h\>/lgf_writer.h/g"\
75
        -e "s/\<topology\.h\>/connectivity.h/g"\
71 76
        -e "s/DigraphToEps/GraphToEps/g"\
72 77
        -e "s/digraphToEps/graphToEps/g"\
73 78
        -e "s/\<DefPredMap\>/SetPredMap/g"\
74 79
        -e "s/\<DefDistMap\>/SetDistMap/g"\
75 80
        -e "s/\<DefReachedMap\>/SetReachedMap/g"\
76 81
        -e "s/\<DefProcessedMap\>/SetProcessedMap/g"\
0 comments (0 inline)