1.1 --- a/doc/CMakeLists.txt Sat Apr 18 21:54:30 2009 +0200
1.2 +++ b/doc/CMakeLists.txt Tue Apr 21 10:34:49 2009 +0100
1.3 @@ -14,12 +14,18 @@
1.4 ADD_CUSTOM_TARGET(html
1.5 COMMAND rm -rf gen-images
1.6 COMMAND mkdir gen-images
1.7 + COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/bipartite_matching.png ${CMAKE_CURRENT_SOURCE_DIR}/images/bipartite_matching.eps
1.8 + COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/bipartite_partitions.png ${CMAKE_CURRENT_SOURCE_DIR}/images/bipartite_partitions.eps
1.9 + COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/connected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/connected_components.eps
1.10 + COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/edge_biconnected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/edge_biconnected_components.eps
1.11 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/grid_graph.png ${CMAKE_CURRENT_SOURCE_DIR}/images/grid_graph.eps
1.12 + COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/node_biconnected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/node_biconnected_components.eps
1.13 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_0.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_0.eps
1.14 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_1.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_1.eps
1.15 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_2.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_2.eps
1.16 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_3.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_3.eps
1.17 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_4.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_4.eps
1.18 + COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/strongly_connected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/strongly_connected_components.eps
1.19 COMMAND rm -rf html
1.20 COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile
1.21 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
1.22 @@ -27,11 +33,18 @@
1.23 ADD_CUSTOM_TARGET(html
1.24 COMMAND if exist gen-images rmdir /s /q gen-images
1.25 COMMAND mkdir gen-images
1.26 + COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/bipartite_matching.png ${CMAKE_CURRENT_SOURCE_DIR}/images/bipartite_matching.eps
1.27 + COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/bipartite_partitions.png ${CMAKE_CURRENT_SOURCE_DIR}/images/bipartite_partitions.eps
1.28 + COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/connected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/connected_components.eps
1.29 + COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/edge_biconnected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/edge_biconnected_components.eps
1.30 + COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/grid_graph.png ${CMAKE_CURRENT_SOURCE_DIR}/images/grid_graph.eps
1.31 + COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/node_biconnected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/node_biconnected_components.eps
1.32 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_0.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_0.eps
1.33 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_1.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_1.eps
1.34 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_2.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_2.eps
1.35 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_3.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_3.eps
1.36 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_4.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_4.eps
1.37 + COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/strongly_connected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/strongly_connected_components.eps
1.38 COMMAND if exist html rmdir /s /q html
1.39 COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile
1.40 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
2.1 --- a/doc/Makefile.am Sat Apr 18 21:54:30 2009 +0200
2.2 +++ b/doc/Makefile.am Tue Apr 21 10:34:49 2009 +0100
2.3 @@ -21,8 +21,17 @@
2.4 nodeshape_3.eps \
2.5 nodeshape_4.eps
2.6
2.7 +DOC_EPS_IMAGES27 = \
2.8 + bipartite_matching.eps \
2.9 + bipartite_partitions.eps \
2.10 + connected_components.eps \
2.11 + edge_biconnected_components.eps \
2.12 + node_biconnected_components.eps \
2.13 + strongly_connected_components.eps
2.14 +
2.15 DOC_EPS_IMAGES = \
2.16 - $(DOC_EPS_IMAGES18)
2.17 + $(DOC_EPS_IMAGES18) \
2.18 + $(DOC_EPS_IMAGES27)
2.19
2.20 DOC_PNG_IMAGES = \
2.21 $(DOC_EPS_IMAGES:%.eps=doc/gen-images/%.png)
2.22 @@ -45,6 +54,17 @@
2.23 exit 1; \
2.24 fi
2.25
2.26 +$(DOC_EPS_IMAGES27:%.eps=doc/gen-images/%.png): doc/gen-images/%.png: doc/images/%.eps
2.27 + -mkdir doc/gen-images
2.28 + if test ${gs_found} = yes; then \
2.29 + $(GS_COMMAND) -sDEVICE=pngalpha -r27 -sOutputFile=$@ $<; \
2.30 + else \
2.31 + echo; \
2.32 + echo "Ghostscript not found."; \
2.33 + echo; \
2.34 + exit 1; \
2.35 + fi
2.36 +
2.37 html-local: $(DOC_PNG_IMAGES)
2.38 if test ${doxygen_found} = yes; then \
2.39 cd doc; \
3.1 --- a/doc/groups.dox Sat Apr 18 21:54:30 2009 +0200
3.2 +++ b/doc/groups.dox Tue Apr 21 10:34:49 2009 +0100
3.3 @@ -407,7 +407,7 @@
3.4 */
3.5
3.6 /**
3.7 -@defgroup graph_prop Connectivity and Other Graph Properties
3.8 +@defgroup graph_properties Connectivity and Other Graph Properties
3.9 @ingroup algs
3.10 \brief Algorithms for discovering the graph properties
3.11
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
4.2 +++ b/doc/images/bipartite_matching.eps Tue Apr 21 10:34:49 2009 +0100
4.3 @@ -0,0 +1,586 @@
4.4 +%!PS-Adobe-3.0 EPSF-3.0
4.5 +%%BoundingBox: 15 18 829 570
4.6 +%%HiResBoundingBox: 15.1913 18.4493 828.078 569.438
4.7 +%%Creator: Karbon14 EPS Exportfilter 0.5
4.8 +%%CreationDate: (04/15/06 15:20:26)
4.9 +%%For: (Balazs Dezso) ()
4.10 +%%Title: ()
4.11 +
4.12 +/N {newpath} def
4.13 +/C {closepath} def
4.14 +/m {moveto} def
4.15 +/c {curveto} def
4.16 +/l {lineto} def
4.17 +/s {stroke} def
4.18 +/f {fill} def
4.19 +/w {setlinewidth} def
4.20 +/d {setdash} def
4.21 +/r {setrgbcolor} def
4.22 +/S {gsave} def
4.23 +/R {grestore} def
4.24 +
4.25 +N
4.26 +251.402 32.047 m
4.27 +532.945 293.946 814.484 555.844 814.484 555.844 c
4.28 +[] 0 d 1 0 0 r 3.92814 w s
4.29 +
4.30 +N
4.31 +749.012 32.047 m
4.32 +742.465 293.946 735.918 555.844 735.918 555.844 c
4.33 +[] 0 d 0 0 0 r 1.96407 w s
4.34 +
4.35 +N
4.36 +539.492 32.047 m
4.37 +637.703 293.946 735.918 555.844 735.918 555.844 c
4.38 +[] 0 d 0 0 0 r 1.96407 w s
4.39 +
4.40 +N
4.41 +172.832 32.047 m
4.42 +454.375 293.946 735.918 555.844 735.918 555.844 c
4.43 +[] 0 d 0 0 0 r 1.96407 w s
4.44 +
4.45 +N
4.46 +107.355 32.047 m
4.47 +421.637 293.946 735.918 555.844 735.918 555.844 c
4.48 +[] 0 d 1 0 0 r 3.92814 w s
4.49 +
4.50 +N
4.51 +644.25 555.844 m
4.52 +696.633 293.946 749.012 32.047 749.012 32.047 c
4.53 +[] 0 d 0 0 0 r 1.96407 w s
4.54 +
4.55 +N
4.56 +474.016 555.844 m
4.57 +611.516 293.946 749.012 32.047 749.012 32.047 c
4.58 +[] 0 d 1 0 0 r 3.92814 w s
4.59 +
4.60 +N
4.61 +683.535 32.047 m
4.62 +663.894 293.946 644.25 555.844 644.25 555.844 c
4.63 +[] 0 d 0 0 0 r 1.96407 w s
4.64 +
4.65 +N
4.66 +120.453 555.844 m
4.67 +401.992 293.946 683.535 32.047 683.535 32.047 c
4.68 +[] 0 d 0 0 0 r 1.96407 w s
4.69 +
4.70 +N
4.71 +28.7853 555.844 m
4.72 +356.16 293.946 683.535 32.047 683.535 32.047 c
4.73 +[] 0 d 1 0 0 r 3.92814 w s
4.74 +
4.75 +N
4.76 +539.492 32.047 m
4.77 +546.039 293.946 552.586 555.844 552.586 555.844 c
4.78 +[] 0 d 1 0 0 r 3.92814 w s
4.79 +
4.80 +N
4.81 +316.875 32.047 m
4.82 +349.613 293.946 382.351 555.844 382.351 555.844 c
4.83 +[] 0 d 1 0 0 r 3.92814 w s
4.84 +
4.85 +N
4.86 +107.355 32.047 m
4.87 +244.855 293.946 382.351 555.844 382.351 555.844 c
4.88 +[] 0 d 0 0 0 r 1.96407 w s
4.89 +
4.90 +N
4.91 +290.687 555.844 m
4.92 +375.805 293.946 460.922 32.047 460.922 32.047 c
4.93 +[] 0 d 1 0 0 r 3.92814 w s
4.94 +
4.95 +N
4.96 +120.453 555.844 m
4.97 +290.687 293.946 460.922 32.047 460.922 32.047 c
4.98 +[] 0 d 0 0 0 r 1.96407 w s
4.99 +
4.100 +N
4.101 +172.832 32.047 m
4.102 +146.64 293.946 120.453 555.844 120.453 555.844 c
4.103 +[] 0 d 1 0 0 r 3.92814 w s
4.104 +
4.105 +N
4.106 +15.6913 555.844 m
4.107 +15.6913 555.844 l
4.108 +15.6913 548.614 21.5553 542.75 28.7853 542.75 c
4.109 +36.0163 542.75 41.8833 548.614 41.8833 555.844 c
4.110 +41.8833 563.075 36.0163 568.938 28.7853 568.938 c
4.111 +21.5553 568.938 15.6913 563.075 15.6913 555.844 c
4.112 +15.6913 555.844 l
4.113 +C
4.114 +S 0 0 0 r f R
4.115 +
4.116 +N
4.117 +16.8833 555.844 m
4.118 +16.8833 555.844 l
4.119 +16.8833 549.27 22.2113 543.942 28.7853 543.942 c
4.120 +35.3593 543.942 40.6913 549.27 40.6913 555.844 c
4.121 +40.6913 562.418 35.3593 567.747 28.7853 567.747 c
4.122 +22.2113 567.747 16.8833 562.418 16.8833 555.844 c
4.123 +16.8833 555.844 l
4.124 +C
4.125 +S 1 0.5 1 r f R
4.126 +
4.127 +N
4.128 +107.355 555.844 m
4.129 +107.355 555.844 l
4.130 +107.355 548.614 113.223 542.75 120.453 542.75 c
4.131 +127.683 542.75 133.547 548.614 133.547 555.844 c
4.132 +133.547 563.075 127.683 568.938 120.453 568.938 c
4.133 +113.223 568.938 107.355 563.075 107.355 555.844 c
4.134 +107.355 555.844 l
4.135 +C
4.136 +S 0 0 0 r f R
4.137 +
4.138 +N
4.139 +108.547 555.844 m
4.140 +108.547 555.844 l
4.141 +108.547 549.27 113.879 543.942 120.453 543.942 c
4.142 +127.027 543.942 132.355 549.27 132.355 555.844 c
4.143 +132.355 562.418 127.027 567.747 120.453 567.747 c
4.144 +113.879 567.747 108.547 562.418 108.547 555.844 c
4.145 +108.547 555.844 l
4.146 +C
4.147 +S 1 0 1 r f R
4.148 +
4.149 +N
4.150 +199.019 555.844 m
4.151 +199.019 555.844 l
4.152 +199.019 548.614 204.887 542.75 212.117 542.75 c
4.153 +219.348 542.75 225.211 548.614 225.211 555.844 c
4.154 +225.211 563.075 219.348 568.938 212.117 568.938 c
4.155 +204.887 568.938 199.019 563.075 199.019 555.844 c
4.156 +199.019 555.844 l
4.157 +C
4.158 +S 0 0 0 r f R
4.159 +
4.160 +N
4.161 +200.211 555.844 m
4.162 +200.211 555.844 l
4.163 +200.211 549.27 205.543 543.942 212.117 543.942 c
4.164 +218.691 543.942 224.019 549.27 224.019 555.844 c
4.165 +224.019 562.418 218.691 567.747 212.117 567.747 c
4.166 +205.543 567.747 200.211 562.418 200.211 555.844 c
4.167 +200.211 555.844 l
4.168 +C
4.169 +S 1 0.5 1 r f R
4.170 +
4.171 +N
4.172 +277.59 555.844 m
4.173 +277.59 555.844 l
4.174 +277.59 548.614 283.457 542.75 290.687 542.75 c
4.175 +297.918 542.75 303.781 548.614 303.781 555.844 c
4.176 +303.781 563.075 297.918 568.938 290.687 568.938 c
4.177 +283.457 568.938 277.59 563.075 277.59 555.844 c
4.178 +277.59 555.844 l
4.179 +C
4.180 +S 0 0 0 r f R
4.181 +
4.182 +N
4.183 +278.781 555.844 m
4.184 +278.781 555.844 l
4.185 +278.781 549.27 284.113 543.942 290.687 543.942 c
4.186 +297.262 543.942 302.59 549.27 302.59 555.844 c
4.187 +302.59 562.418 297.262 567.747 290.687 567.747 c
4.188 +284.113 567.747 278.781 562.418 278.781 555.844 c
4.189 +278.781 555.844 l
4.190 +C
4.191 +S 1 0 1 r f R
4.192 +
4.193 +N
4.194 +369.258 555.844 m
4.195 +369.258 555.844 l
4.196 +369.258 548.614 375.121 542.75 382.351 542.75 c
4.197 +389.582 542.75 395.445 548.614 395.445 555.844 c
4.198 +395.445 563.075 389.582 568.938 382.351 568.938 c
4.199 +375.121 568.938 369.258 563.075 369.258 555.844 c
4.200 +369.258 555.844 l
4.201 +C
4.202 +S 0 0 0 r f R
4.203 +
4.204 +N
4.205 +370.445 555.844 m
4.206 +370.445 555.844 l
4.207 +370.445 549.27 375.777 543.942 382.351 543.942 c
4.208 +388.926 543.942 394.258 549.27 394.258 555.844 c
4.209 +394.258 562.418 388.926 567.747 382.351 567.747 c
4.210 +375.777 567.747 370.445 562.418 370.445 555.844 c
4.211 +370.445 555.844 l
4.212 +C
4.213 +S 1 0 1 r f R
4.214 +
4.215 +N
4.216 +460.922 555.844 m
4.217 +460.922 555.844 l
4.218 +460.922 548.614 466.785 542.75 474.016 542.75 c
4.219 +481.246 542.75 487.109 548.614 487.109 555.844 c
4.220 +487.109 563.075 481.246 568.938 474.016 568.938 c
4.221 +466.785 568.938 460.922 563.075 460.922 555.844 c
4.222 +460.922 555.844 l
4.223 +C
4.224 +S 0 0 0 r f R
4.225 +
4.226 +N
4.227 +462.113 555.844 m
4.228 +462.113 555.844 l
4.229 +462.113 549.27 467.441 543.942 474.016 543.942 c
4.230 +480.59 543.942 485.922 549.27 485.922 555.844 c
4.231 +485.922 562.418 480.59 567.747 474.016 567.747 c
4.232 +467.441 567.747 462.113 562.418 462.113 555.844 c
4.233 +462.113 555.844 l
4.234 +C
4.235 +S 1 0.5 1 r f R
4.236 +
4.237 +N
4.238 +539.492 555.844 m
4.239 +539.492 555.844 l
4.240 +539.492 548.614 545.355 542.75 552.586 542.75 c
4.241 +559.816 542.75 565.68 548.614 565.68 555.844 c
4.242 +565.68 563.075 559.816 568.938 552.586 568.938 c
4.243 +545.355 568.938 539.492 563.075 539.492 555.844 c
4.244 +539.492 555.844 l
4.245 +C
4.246 +S 0 0 0 r f R
4.247 +
4.248 +N
4.249 +540.683 555.844 m
4.250 +540.683 555.844 l
4.251 +540.683 549.27 546.012 543.942 552.586 543.942 c
4.252 +559.16 543.942 564.492 549.27 564.492 555.844 c
4.253 +564.492 562.418 559.16 567.747 552.586 567.747 c
4.254 +546.012 567.747 540.683 562.418 540.683 555.844 c
4.255 +540.683 555.844 l
4.256 +C
4.257 +S 1 0 1 r f R
4.258 +
4.259 +N
4.260 +631.156 555.844 m
4.261 +631.156 555.844 l
4.262 +631.156 548.614 637.019 542.75 644.25 542.75 c
4.263 +651.48 542.75 657.348 548.614 657.348 555.844 c
4.264 +657.348 563.075 651.48 568.938 644.25 568.938 c
4.265 +637.019 568.938 631.156 563.075 631.156 555.844 c
4.266 +631.156 555.844 l
4.267 +C
4.268 +S 0 0 0 r f R
4.269 +
4.270 +N
4.271 +632.348 555.844 m
4.272 +632.348 555.844 l
4.273 +632.348 549.27 637.676 543.942 644.25 543.942 c
4.274 +650.824 543.942 656.156 549.27 656.156 555.844 c
4.275 +656.156 562.418 650.824 567.747 644.25 567.747 c
4.276 +637.676 567.747 632.348 562.418 632.348 555.844 c
4.277 +632.348 555.844 l
4.278 +C
4.279 +S 1 0.5 1 r f R
4.280 +
4.281 +N
4.282 +722.82 555.844 m
4.283 +722.82 555.844 l
4.284 +722.82 548.614 728.687 542.75 735.918 542.75 c
4.285 +743.149 542.75 749.012 548.614 749.012 555.844 c
4.286 +749.012 563.075 743.149 568.938 735.918 568.938 c
4.287 +728.687 568.938 722.82 563.075 722.82 555.844 c
4.288 +722.82 555.844 l
4.289 +C
4.290 +S 0 0 0 r f R
4.291 +
4.292 +N
4.293 +724.012 555.844 m
4.294 +724.012 555.844 l
4.295 +724.012 549.27 729.344 543.942 735.918 543.942 c
4.296 +742.492 543.942 747.82 549.27 747.82 555.844 c
4.297 +747.82 562.418 742.492 567.747 735.918 567.747 c
4.298 +729.344 567.747 724.012 562.418 724.012 555.844 c
4.299 +724.012 555.844 l
4.300 +C
4.301 +S 1 0 1 r f R
4.302 +
4.303 +N
4.304 +801.391 555.844 m
4.305 +801.391 555.844 l
4.306 +801.391 548.614 807.254 542.75 814.484 542.75 c
4.307 +821.715 542.75 827.578 548.614 827.578 555.844 c
4.308 +827.578 563.075 821.715 568.938 814.484 568.938 c
4.309 +807.254 568.938 801.391 563.075 801.391 555.844 c
4.310 +801.391 555.844 l
4.311 +C
4.312 +S 0 0 0 r f R
4.313 +
4.314 +N
4.315 +802.582 555.844 m
4.316 +802.582 555.844 l
4.317 +802.582 549.27 807.91 543.942 814.484 543.942 c
4.318 +821.059 543.942 826.387 549.27 826.387 555.844 c
4.319 +826.387 562.418 821.059 567.747 814.484 567.747 c
4.320 +807.91 567.747 802.582 562.418 802.582 555.844 c
4.321 +802.582 555.844 l
4.322 +C
4.323 +S 1 0 1 r f R
4.324 +
4.325 +N
4.326 +15.6913 32.047 m
4.327 +15.6913 32.047 l
4.328 +15.6913 24.8165 21.5553 18.9493 28.7853 18.9493 c
4.329 +36.0163 18.9493 41.8833 24.8165 41.8833 32.047 c
4.330 +41.8833 39.2775 36.0163 45.1407 28.7853 45.1407 c
4.331 +21.5553 45.1407 15.6913 39.2775 15.6913 32.047 c
4.332 +15.6913 32.047 l
4.333 +C
4.334 +S 0 0 0 r f R
4.335 +
4.336 +N
4.337 +16.8833 32.047 m
4.338 +16.8833 32.047 l
4.339 +16.8833 25.4728 22.2113 20.1407 28.7853 20.1407 c
4.340 +35.3593 20.1407 40.6913 25.4728 40.6913 32.047 c
4.341 +40.6913 38.6212 35.3593 43.9493 28.7853 43.9493 c
4.342 +22.2113 43.9493 16.8833 38.6212 16.8833 32.047 c
4.343 +16.8833 32.047 l
4.344 +C
4.345 +S 0.5 0.5 1 r f R
4.346 +
4.347 +N
4.348 +94.2623 32.047 m
4.349 +94.2623 32.047 l
4.350 +94.2623 24.8165 100.125 18.9493 107.355 18.9493 c
4.351 +114.586 18.9493 120.453 24.8165 120.453 32.047 c
4.352 +120.453 39.2775 114.586 45.1407 107.355 45.1407 c
4.353 +100.125 45.1407 94.2623 39.2775 94.2623 32.047 c
4.354 +94.2623 32.047 l
4.355 +C
4.356 +S 0 0 0 r f R
4.357 +
4.358 +N
4.359 +95.4533 32.047 m
4.360 +95.4533 32.047 l
4.361 +95.4533 25.4728 100.781 20.1407 107.355 20.1407 c
4.362 +113.93 20.1407 119.262 25.4728 119.262 32.047 c
4.363 +119.262 38.6212 113.93 43.9493 107.355 43.9493 c
4.364 +100.781 43.9493 95.4533 38.6212 95.4533 32.047 c
4.365 +95.4533 32.047 l
4.366 +C
4.367 +S 0.5 0.5 1 r f R
4.368 +
4.369 +N
4.370 +159.734 32.047 m
4.371 +159.734 32.047 l
4.372 +159.734 24.8165 165.601 18.9493 172.832 18.9493 c
4.373 +180.062 18.9493 185.926 24.8165 185.926 32.047 c
4.374 +185.926 39.2775 180.062 45.1407 172.832 45.1407 c
4.375 +165.601 45.1407 159.734 39.2775 159.734 32.047 c
4.376 +159.734 32.047 l
4.377 +C
4.378 +S 0 0 0 r f R
4.379 +
4.380 +N
4.381 +160.926 32.047 m
4.382 +160.926 32.047 l
4.383 +160.926 25.4728 166.258 20.1407 172.832 20.1407 c
4.384 +179.406 20.1407 184.734 25.4728 184.734 32.047 c
4.385 +184.734 38.6212 179.406 43.9493 172.832 43.9493 c
4.386 +166.258 43.9493 160.926 38.6212 160.926 32.047 c
4.387 +160.926 32.047 l
4.388 +C
4.389 +S 0.5 0.5 1 r f R
4.390 +
4.391 +N
4.392 +238.305 32.047 m
4.393 +238.305 32.047 l
4.394 +238.305 24.8165 244.172 18.9493 251.402 18.9493 c
4.395 +258.633 18.9493 264.496 24.8165 264.496 32.047 c
4.396 +264.496 39.2775 258.633 45.1407 251.402 45.1407 c
4.397 +244.172 45.1407 238.305 39.2775 238.305 32.047 c
4.398 +238.305 32.047 l
4.399 +C
4.400 +S 0 0 0 r f R
4.401 +
4.402 +N
4.403 +239.496 32.047 m
4.404 +239.496 32.047 l
4.405 +239.496 25.4728 244.828 20.1407 251.402 20.1407 c
4.406 +257.976 20.1407 263.305 25.4728 263.305 32.047 c
4.407 +263.305 38.6212 257.976 43.9493 251.402 43.9493 c
4.408 +244.828 43.9493 239.496 38.6212 239.496 32.047 c
4.409 +239.496 32.047 l
4.410 +C
4.411 +S 0.5 0.5 1 r f R
4.412 +
4.413 +N
4.414 +303.781 32.047 m
4.415 +303.781 32.047 l
4.416 +303.781 24.8165 309.644 18.9493 316.875 18.9493 c
4.417 +324.105 18.9493 329.973 24.8165 329.973 32.047 c
4.418 +329.973 39.2775 324.105 45.1407 316.875 45.1407 c
4.419 +309.644 45.1407 303.781 39.2775 303.781 32.047 c
4.420 +303.781 32.047 l
4.421 +C
4.422 +S 0 0 0 r f R
4.423 +
4.424 +N
4.425 +304.973 32.047 m
4.426 +304.973 32.047 l
4.427 +304.973 25.4728 310.301 20.1407 316.875 20.1407 c
4.428 +323.449 20.1407 328.781 25.4728 328.781 32.047 c
4.429 +328.781 38.6212 323.449 43.9493 316.875 43.9493 c
4.430 +310.301 43.9493 304.973 38.6212 304.973 32.047 c
4.431 +304.973 32.047 l
4.432 +C
4.433 +S 0.5 0.5 1 r f R
4.434 +
4.435 +N
4.436 +382.351 32.047 m
4.437 +382.351 32.047 l
4.438 +382.351 24.8165 388.215 18.9493 395.445 18.9493 c
4.439 +402.676 18.9493 408.543 24.8165 408.543 32.047 c
4.440 +408.543 39.2775 402.676 45.1407 395.445 45.1407 c
4.441 +388.215 45.1407 382.351 39.2775 382.351 32.047 c
4.442 +382.351 32.047 l
4.443 +C
4.444 +S 0 0 0 r f R
4.445 +
4.446 +N
4.447 +383.543 32.047 m
4.448 +383.543 32.047 l
4.449 +383.543 25.4728 388.871 20.1407 395.445 20.1407 c
4.450 +402.019 20.1407 407.351 25.4728 407.351 32.047 c
4.451 +407.351 38.6212 402.019 43.9493 395.445 43.9493 c
4.452 +388.871 43.9493 383.543 38.6212 383.543 32.047 c
4.453 +383.543 32.047 l
4.454 +C
4.455 +S 0.5 0.5 1 r f R
4.456 +
4.457 +N
4.458 +447.828 32.047 m
4.459 +447.828 32.047 l
4.460 +447.828 24.8165 453.691 18.9493 460.922 18.9493 c
4.461 +468.152 18.9493 474.016 24.8165 474.016 32.047 c
4.462 +474.016 39.2775 468.152 45.1407 460.922 45.1407 c
4.463 +453.691 45.1407 447.828 39.2775 447.828 32.047 c
4.464 +447.828 32.047 l
4.465 +C
4.466 +S 0 0 0 r f R
4.467 +
4.468 +N
4.469 +449.016 32.047 m
4.470 +449.016 32.047 l
4.471 +449.016 25.4728 454.348 20.1407 460.922 20.1407 c
4.472 +467.496 20.1407 472.824 25.4728 472.824 32.047 c
4.473 +472.824 38.6212 467.496 43.9493 460.922 43.9493 c
4.474 +454.348 43.9493 449.016 38.6212 449.016 32.047 c
4.475 +449.016 32.047 l
4.476 +C
4.477 +S 0.5 0.5 1 r f R
4.478 +
4.479 +N
4.480 +526.394 32.047 m
4.481 +526.394 32.047 l
4.482 +526.394 24.8165 532.262 18.9493 539.492 18.9493 c
4.483 +546.723 18.9493 552.586 24.8165 552.586 32.047 c
4.484 +552.586 39.2775 546.723 45.1407 539.492 45.1407 c
4.485 +532.262 45.1407 526.394 39.2775 526.394 32.047 c
4.486 +526.394 32.047 l
4.487 +C
4.488 +S 0 0 0 r f R
4.489 +
4.490 +N
4.491 +527.586 32.047 m
4.492 +527.586 32.047 l
4.493 +527.586 25.4728 532.918 20.1407 539.492 20.1407 c
4.494 +546.066 20.1407 551.394 25.4728 551.394 32.047 c
4.495 +551.394 38.6212 546.066 43.9493 539.492 43.9493 c
4.496 +532.918 43.9493 527.586 38.6212 527.586 32.047 c
4.497 +527.586 32.047 l
4.498 +C
4.499 +S 0.5 0.5 1 r f R
4.500 +
4.501 +N
4.502 +591.871 32.047 m
4.503 +591.871 32.047 l
4.504 +591.871 24.8165 597.734 18.9493 604.965 18.9493 c
4.505 +612.195 18.9493 618.062 24.8165 618.062 32.047 c
4.506 +618.062 39.2775 612.195 45.1407 604.965 45.1407 c
4.507 +597.734 45.1407 591.871 39.2775 591.871 32.047 c
4.508 +591.871 32.047 l
4.509 +C
4.510 +S 0 0 0 r f R
4.511 +
4.512 +N
4.513 +593.062 32.047 m
4.514 +593.062 32.047 l
4.515 +593.062 25.4728 598.39 20.1407 604.965 20.1407 c
4.516 +611.539 20.1407 616.871 25.4728 616.871 32.047 c
4.517 +616.871 38.6212 611.539 43.9493 604.965 43.9493 c
4.518 +598.39 43.9493 593.062 38.6212 593.062 32.047 c
4.519 +593.062 32.047 l
4.520 +C
4.521 +S 0.5 0.5 1 r f R
4.522 +
4.523 +N
4.524 +670.441 32.047 m
4.525 +670.441 32.047 l
4.526 +670.441 24.8165 676.305 18.9493 683.535 18.9493 c
4.527 +690.766 18.9493 696.633 24.8165 696.633 32.047 c
4.528 +696.633 39.2775 690.766 45.1407 683.535 45.1407 c
4.529 +676.305 45.1407 670.441 39.2775 670.441 32.047 c
4.530 +670.441 32.047 l
4.531 +C
4.532 +S 0 0 0 r f R
4.533 +
4.534 +N
4.535 +671.633 32.047 m
4.536 +671.633 32.047 l
4.537 +671.633 25.4728 676.961 20.1407 683.535 20.1407 c
4.538 +690.109 20.1407 695.441 25.4728 695.441 32.047 c
4.539 +695.441 38.6212 690.109 43.9493 683.535 43.9493 c
4.540 +676.961 43.9493 671.633 38.6212 671.633 32.047 c
4.541 +671.633 32.047 l
4.542 +C
4.543 +S 0 0 1 r f R
4.544 +
4.545 +N
4.546 +735.918 32.047 m
4.547 +735.918 32.047 l
4.548 +735.918 24.8165 741.781 18.9493 749.012 18.9493 c
4.549 +756.242 18.9493 762.106 24.8165 762.106 32.047 c
4.550 +762.106 39.2775 756.242 45.1407 749.012 45.1407 c
4.551 +741.781 45.1407 735.918 39.2775 735.918 32.047 c
4.552 +735.918 32.047 l
4.553 +C
4.554 +S 0 0 0 r f R
4.555 +
4.556 +N
4.557 +737.105 32.047 m
4.558 +737.105 32.047 l
4.559 +737.105 25.4728 742.437 20.1407 749.012 20.1407 c
4.560 +755.586 20.1407 760.914 25.4728 760.914 32.047 c
4.561 +760.914 38.6212 755.586 43.9493 749.012 43.9493 c
4.562 +742.437 43.9493 737.105 38.6212 737.105 32.047 c
4.563 +737.105 32.047 l
4.564 +C
4.565 +S 0 0 1 r f R
4.566 +
4.567 +N
4.568 +801.391 32.047 m
4.569 +801.391 32.047 l
4.570 +801.391 24.8165 807.254 18.9493 814.484 18.9493 c
4.571 +821.715 18.9493 827.578 24.8165 827.578 32.047 c
4.572 +827.578 39.2775 821.715 45.1407 814.484 45.1407 c
4.573 +807.254 45.1407 801.391 39.2775 801.391 32.047 c
4.574 +801.391 32.047 l
4.575 +C
4.576 +S 0 0 0 r f R
4.577 +
4.578 +N
4.579 +802.582 32.047 m
4.580 +802.582 32.047 l
4.581 +802.582 25.4728 807.91 20.1407 814.484 20.1407 c
4.582 +821.059 20.1407 826.387 25.4728 826.387 32.047 c
4.583 +826.387 38.6212 821.059 43.9493 814.484 43.9493 c
4.584 +807.91 43.9493 802.582 38.6212 802.582 32.047 c
4.585 +802.582 32.047 l
4.586 +C
4.587 +S 0.5 0.5 1 r f R
4.588 +
4.589 +%%EOF
5.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
5.2 +++ b/doc/images/bipartite_partitions.eps Tue Apr 21 10:34:49 2009 +0100
5.3 @@ -0,0 +1,114 @@
5.4 +%!PS-Adobe-2.0 EPSF-2.0
5.5 +%%Creator: LEMON, graphToEps()
5.6 +%%CreationDate: Tue Nov 15 16:51:43 2005
5.7 +%%BoundingBox: 0 0 842 596
5.8 +%%EndComments
5.9 +/lb { setlinewidth setrgbcolor newpath moveto
5.10 + 4 2 roll 1 index 1 index curveto stroke } bind def
5.11 +/l { setlinewidth setrgbcolor newpath moveto lineto stroke } bind def
5.12 +/c { newpath dup 3 index add 2 index moveto 0 360 arc closepath } bind def
5.13 +/sq { newpath 2 index 1 index add 2 index 2 index add moveto
5.14 + 2 index 1 index sub 2 index 2 index add lineto
5.15 + 2 index 1 index sub 2 index 2 index sub lineto
5.16 + 2 index 1 index add 2 index 2 index sub lineto
5.17 + closepath pop pop pop} bind def
5.18 +/di { newpath 2 index 1 index add 2 index moveto
5.19 + 2 index 2 index 2 index add lineto
5.20 + 2 index 1 index sub 2 index lineto
5.21 + 2 index 2 index 2 index sub lineto
5.22 + closepath pop pop pop} bind def
5.23 +/nc { 0 0 0 setrgbcolor 5 index 5 index 5 index c fill
5.24 + setrgbcolor 1.1 div c fill
5.25 + } bind def
5.26 +/nsq { 0 0 0 setrgbcolor 5 index 5 index 5 index sq fill
5.27 + setrgbcolor 1.1 div sq fill
5.28 + } bind def
5.29 +/ndi { 0 0 0 setrgbcolor 5 index 5 index 5 index di fill
5.30 + setrgbcolor 1.1 div di fill
5.31 + } bind def
5.32 +/arrl 1 def
5.33 +/arrw 0.3 def
5.34 +/lrl { 2 index mul exch 2 index mul exch rlineto pop} bind def
5.35 +/arr { setrgbcolor /y1 exch def /x1 exch def /dy exch def /dx exch def
5.36 + /w exch def /len exch def
5.37 + newpath x1 dy w 2 div mul add y1 dx w 2 div mul sub moveto
5.38 + len w sub arrl sub dx dy lrl
5.39 + arrw dy dx neg lrl
5.40 + dx arrl w add mul dy w 2 div arrw add mul sub
5.41 + dy arrl w add mul dx w 2 div arrw add mul add rlineto
5.42 + dx arrl w add mul neg dy w 2 div arrw add mul sub
5.43 + dy arrl w add mul neg dx w 2 div arrw add mul add rlineto
5.44 + arrw dy dx neg lrl
5.45 + len w sub arrl sub neg dx dy lrl
5.46 + closepath fill } bind def
5.47 +/cshow { 2 index 2 index moveto dup stringwidth pop
5.48 + neg 2 div fosi .35 mul neg rmoveto show pop pop} def
5.49 +
5.50 +gsave
5.51 +90 rotate
5.52 +0 -842 translate
5.53 +71.6378 15 translate
5.54 +0.389093 dup scale
5.55 +90 rotate
5.56 +1197.47 -613.138 translate
5.57 +%Edges:
5.58 +gsave
5.59 +513.857 -446.322 296.569 -487.43 79.2808 -528.539 0 0 0 2 lb
5.60 +513.857 -446.322 575.52 -315.655 637.183 -184.989 0 0 0 2 lb
5.61 +393.468 566.711 494.771 434.577 596.074 302.442 0 0 0 2 lb
5.62 +393.468 566.711 155.625 579.925 -82.2171 593.138 0 0 0 2 lb
5.63 +393.468 566.711 251.056 450.726 108.644 334.741 0 0 0 2 lb
5.64 +869.153 52.8539 732.613 177.648 596.074 302.442 0 0 0 2 lb
5.65 +869.153 52.8539 753.168 -66.0676 637.183 -184.989 0 0 0 2 lb
5.66 +-82.2171 593.138 -91.0261 346.487 -99.8351 99.8351 0 0 0 2 lb
5.67 +-663.61 546.157 -753.168 394.936 -842.726 243.715 0 0 0 2 lb
5.68 +-663.61 546.157 -574.052 437.513 -484.494 328.869 0 0 0 2 lb
5.69 +-1077.63 161.498 -960.178 202.606 -842.726 243.715 0 0 0 2 lb
5.70 +-1077.63 161.498 -968.987 66.0674 -860.344 -29.3633 0 0 0 2 lb
5.71 +-1177.47 -234.906 -1029.18 -381.722 -880.898 -528.539 0 0 0 2 lb
5.72 +-1177.47 -234.906 -1018.91 -132.135 -860.344 -29.3633 0 0 0 2 lb
5.73 +-880.898 -528.539 -744.359 -387.595 -607.82 -246.651 0 0 0 2 lb
5.74 +-499.175 -499.175 -355.295 -475.685 -211.415 -452.194 0 0 0 2 lb
5.75 +-499.175 -499.175 -553.498 -372.913 -607.82 -246.651 0 0 0 2 lb
5.76 +-499.175 -499.175 -386.587 -315.087 -274 -131 0 0 0 2 lb
5.77 +79.2808 -528.539 -66.0671 -490.366 -211.415 -452.194 0 0 0 2 lb
5.78 +637.183 -184.989 421.363 -253.993 205.543 -322.996 0 0 0 2 lb
5.79 +205.543 -322.996 162.966 -226.097 120.389 -129.198 0 0 0 2 lb
5.80 +399.34 88.0898 259.865 -20.5541 120.389 -129.198 0 0 0 2 lb
5.81 +399.34 88.0898 253.992 211.415 108.644 334.741 0 0 0 2 lb
5.82 +-842.726 243.715 -471.281 171.775 -99.8351 99.8351 0 0 0 2 lb
5.83 +-842.726 243.715 -558.363 56.3575 -274 -131 0 0 0 2 lb
5.84 +-860.344 -29.3633 -734.082 -138.007 -607.82 -246.651 0 0 0 2 lb
5.85 +-211.415 -452.194 -45.513 -290.696 120.389 -129.198 0 0 0 2 lb
5.86 +-99.8351 99.8351 4.40445 217.288 108.644 334.741 0 0 0 2 lb
5.87 +-99.8351 99.8351 -292.165 214.352 -484.494 328.869 0 0 0 2 lb
5.88 +120.389 -129.198 -76.8055 -130.099 -274 -131 0 0 0 2 lb
5.89 +grestore
5.90 +%Nodes:
5.91 +gsave
5.92 +-274 -131 20 1 0 0 nc
5.93 +-607.82 -246.651 20 1 0 0 nc
5.94 +-484.494 328.869 20 0 0 1 nc
5.95 +108.644 334.741 20 0 0 1 nc
5.96 +120.389 -129.198 20 0 0 1 nc
5.97 +-99.8351 99.8351 20 1 0 0 nc
5.98 +-211.415 -452.194 20 1 0 0 nc
5.99 +-860.344 -29.3633 20 0 0 1 nc
5.100 +-842.726 243.715 20 0 0 1 nc
5.101 +399.34 88.0898 20 1 0 0 nc
5.102 +205.543 -322.996 20 1 0 0 nc
5.103 +637.183 -184.989 20 0 0 1 nc
5.104 +79.2808 -528.539 20 0 0 1 nc
5.105 +-499.175 -499.175 20 0 0 1 nc
5.106 +-880.898 -528.539 20 0 0 1 nc
5.107 +-1177.47 -234.906 20 1 0 0 nc
5.108 +-1077.63 161.498 20 1 0 0 nc
5.109 +-663.61 546.157 20 1 0 0 nc
5.110 +-82.2171 593.138 20 0 0 1 nc
5.111 +596.074 302.442 20 0 0 1 nc
5.112 +869.153 52.8539 20 1 0 0 nc
5.113 +393.468 566.711 20 1 0 0 nc
5.114 +513.857 -446.322 20 1 0 0 nc
5.115 +grestore
5.116 +grestore
5.117 +showpage
6.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
6.2 +++ b/doc/images/connected_components.eps Tue Apr 21 10:34:49 2009 +0100
6.3 @@ -0,0 +1,159 @@
6.4 +%!PS-Adobe-2.0 EPSF-2.0
6.5 +%%Creator: LEMON, graphToEps()
6.6 +%%CreationDate: Fri Nov 4 13:47:12 2005
6.7 +%%BoundingBox: 0 0 842 596
6.8 +%%EndComments
6.9 +/lb { setlinewidth setrgbcolor newpath moveto
6.10 + 4 2 roll 1 index 1 index curveto stroke } bind def
6.11 +/l { setlinewidth setrgbcolor newpath moveto lineto stroke } bind def
6.12 +/c { newpath dup 3 index add 2 index moveto 0 360 arc closepath } bind def
6.13 +/sq { newpath 2 index 1 index add 2 index 2 index add moveto
6.14 + 2 index 1 index sub 2 index 2 index add lineto
6.15 + 2 index 1 index sub 2 index 2 index sub lineto
6.16 + 2 index 1 index add 2 index 2 index sub lineto
6.17 + closepath pop pop pop} bind def
6.18 +/di { newpath 2 index 1 index add 2 index moveto
6.19 + 2 index 2 index 2 index add lineto
6.20 + 2 index 1 index sub 2 index lineto
6.21 + 2 index 2 index 2 index sub lineto
6.22 + closepath pop pop pop} bind def
6.23 +/nc { 0 0 0 setrgbcolor 5 index 5 index 5 index c fill
6.24 + setrgbcolor 1.1 div c fill
6.25 + } bind def
6.26 +/nsq { 0 0 0 setrgbcolor 5 index 5 index 5 index sq fill
6.27 + setrgbcolor 1.1 div sq fill
6.28 + } bind def
6.29 +/ndi { 0 0 0 setrgbcolor 5 index 5 index 5 index di fill
6.30 + setrgbcolor 1.1 div di fill
6.31 + } bind def
6.32 +/arrl 1 def
6.33 +/arrw 0.3 def
6.34 +/lrl { 2 index mul exch 2 index mul exch rlineto pop} bind def
6.35 +/arr { setrgbcolor /y1 exch def /x1 exch def /dy exch def /dx exch def
6.36 + /w exch def /len exch def
6.37 + newpath x1 dy w 2 div mul add y1 dx w 2 div mul sub moveto
6.38 + len w sub arrl sub dx dy lrl
6.39 + arrw dy dx neg lrl
6.40 + dx arrl w add mul dy w 2 div arrw add mul sub
6.41 + dy arrl w add mul dx w 2 div arrw add mul add rlineto
6.42 + dx arrl w add mul neg dy w 2 div arrw add mul sub
6.43 + dy arrl w add mul neg dx w 2 div arrw add mul add rlineto
6.44 + arrw dy dx neg lrl
6.45 + len w sub arrl sub neg dx dy lrl
6.46 + closepath fill } bind def
6.47 +/cshow { 2 index 2 index moveto dup stringwidth pop
6.48 + neg 2 div fosi .35 mul neg rmoveto show pop pop} def
6.49 +
6.50 +gsave
6.51 +90 rotate
6.52 +0 -842 translate
6.53 +71.0944 15 translate
6.54 +0.434694 dup scale
6.55 +90 rotate
6.56 +860.856 -588.349 translate
6.57 +%Edges:
6.58 +gsave
6.59 +574.035 177.301 622.149 225.748 670.264 274.195 0 0 0 2 lb
6.60 +694.579 115.483 682.421 194.839 670.264 274.195 0 0 0 2 lb
6.61 +280.402 10.3938 246.402 -6.60595 212.403 -23.6057 0 0 0 2 lb
6.62 +280.402 10.3938 283.493 -18.9695 286.584 -48.3327 0 0 0 2 lb
6.63 +212.403 -23.6057 249.493 -35.9692 286.584 -48.3327 0 0 0 2 lb
6.64 +286.584 -48.3327 326.765 -79.2414 366.947 -110.15 0 0 0 2 lb
6.65 +286.584 -48.3327 278.857 -111.695 271.13 -175.058 0 0 0 2 lb
6.66 +438.037 -88.514 417.946 -142.604 397.855 -196.694 0 0 0 2 lb
6.67 +438.037 -88.514 402.492 -99.332 366.947 -110.15 0 0 0 2 lb
6.68 +397.855 -196.694 382.401 -153.422 366.947 -110.15 0 0 0 2 lb
6.69 +366.947 -110.15 319.038 -142.604 271.13 -175.058 0 0 0 2 lb
6.70 +271.13 -175.058 274.221 -213.694 277.311 -252.33 0 0 0 2 lb
6.71 +271.13 -175.058 238.675 -190.512 206.221 -205.967 0 0 0 2 lb
6.72 +277.311 -252.33 241.766 -229.149 206.221 -205.967 0 0 0 2 lb
6.73 +-840.856 -246.718 -804.351 -66.7145 -767.847 113.289 0 0 0 2 lb
6.74 +-579.033 445.603 -673.44 279.446 -767.847 113.289 0 0 0 2 lb
6.75 +-579.033 445.603 -524.906 302.104 -470.779 158.605 0 0 0 2 lb
6.76 +-767.847 113.289 -619.313 135.947 -470.779 158.605 0 0 0 2 lb
6.77 +906.312 201.403 946.592 42.798 986.873 -115.807 0 0 0 2 lb
6.78 +906.312 201.403 834.562 91.8901 762.812 -17.6227 0 0 0 2 lb
6.79 +986.873 -115.807 874.842 -66.7148 762.812 -17.6227 0 0 0 2 lb
6.80 +-470.779 158.605 -390.218 50.3508 -309.657 -57.9033 0 0 0 2 lb
6.81 +422.945 521.129 208.955 541.269 -5.03507 561.41 0 0 0 2 lb
6.82 +422.945 521.129 376.371 417.911 329.797 314.692 0 0 0 2 lb
6.83 +422.945 521.129 474.554 276.928 526.164 32.7279 0 0 0 2 lb
6.84 +-5.03507 561.41 -36.5042 440.568 -67.9734 319.727 0 0 0 2 lb
6.85 +329.797 314.692 130.912 317.209 -67.9734 319.727 0 0 0 2 lb
6.86 +-67.9734 319.727 229.095 176.227 526.164 32.7279 0 0 0 2 lb
6.87 +762.812 -17.6227 644.488 7.5526 526.164 32.7279 0 0 0 2 lb
6.88 +762.812 -17.6227 746.448 -162.381 730.084 -307.139 0 0 0 2 lb
6.89 +526.164 32.7279 470.779 -128.394 415.393 -289.516 0 0 0 2 lb
6.90 +730.084 -307.139 572.738 -298.327 415.393 -289.516 0 0 0 2 lb
6.91 +415.393 -289.516 173.71 -318.468 -67.9734 -347.42 0 0 0 2 lb
6.92 +-67.9734 -347.42 -188.815 -202.662 -309.657 -57.9033 0 0 0 2 lb
6.93 +-67.9734 -347.42 -195.758 -390.692 -323.543 -433.964 0 0 0 2 lb
6.94 +-309.657 -57.9033 -424.775 -160.272 -539.894 -262.64 0 0 0 2 lb
6.95 +-323.543 -433.964 -431.719 -348.302 -539.894 -262.64 0 0 0 2 lb
6.96 +-26.6953 -19.9585 44.8558 -96.8093 116.407 -173.66 0 0 0 2 lb
6.97 +-26.6953 -19.9585 87.2563 9.19185 201.208 38.3422 0 0 0 2 lb
6.98 +-26.6953 -19.9585 -144.622 43.6422 -262.548 107.243 0 0 0 2 lb
6.99 +-26.6953 -19.9585 -20.0703 56.8923 -13.4452 133.743 0 0 0 2 lb
6.100 +116.407 -173.66 158.808 -67.6589 201.208 38.3422 0 0 0 2 lb
6.101 +-262.548 107.243 -137.997 120.493 -13.4452 133.743 0 0 0 2 lb
6.102 +-262.548 107.243 -221.472 176.144 -180.397 245.045 0 0 0 2 lb
6.103 +-13.4452 133.743 -96.9211 189.394 -180.397 245.045 0 0 0 2 lb
6.104 +-180.397 245.045 -142.256 345.099 -132.697 451.748 0 0 0 2 lb
6.105 +-180.397 245.045 -170.838 351.694 -132.697 451.748 0 0 0 2 lb
6.106 +-416.25 345.746 -274.474 398.747 -132.697 451.748 0 0 0 2 lb
6.107 +-416.25 345.746 -393.725 457.048 -371.2 568.349 0 0 0 2 lb
6.108 +-132.697 451.748 -251.948 510.048 -371.2 568.349 0 0 0 2 lb
6.109 +670.264 274.195 629.188 409.347 588.113 544.499 0 0 0 2 lb
6.110 +670.264 274.195 797.466 341.771 924.667 409.347 0 0 0 2 lb
6.111 +588.113 544.499 756.39 476.923 924.667 409.347 0 0 0 2 lb
6.112 +-689.204 -237.261 -614.799 -102.648 -567.302 43.6423 0 0 0 2 lb
6.113 +-689.204 -237.261 -641.707 -90.9706 -567.302 43.6423 0 0 0 2 lb
6.114 +grestore
6.115 +%Nodes:
6.116 +gsave
6.117 +-567.302 43.6423 20 0 0 0 nc
6.118 +-689.204 -237.261 20 0 0 0 nc
6.119 +924.667 409.347 20 1 0 0 nc
6.120 +588.113 544.499 20 1 0 0 nc
6.121 +670.264 274.195 20 1 0 0 nc
6.122 +-371.2 568.349 20 0 1 0 nc
6.123 +-132.697 451.748 20 0 1 0 nc
6.124 +-416.25 345.746 20 0 1 0 nc
6.125 +-180.397 245.045 20 0 1 0 nc
6.126 +-13.4452 133.743 20 0 1 0 nc
6.127 +-262.548 107.243 20 0 1 0 nc
6.128 +201.208 38.3422 20 0 1 0 nc
6.129 +116.407 -173.66 20 0 1 0 nc
6.130 +-26.6953 -19.9585 20 0 1 0 nc
6.131 +-539.894 -262.64 20 0 0 1 nc
6.132 +-323.543 -433.964 20 0 0 1 nc
6.133 +-309.657 -57.9033 20 0 0 1 nc
6.134 +-67.9734 -347.42 20 0 0 1 nc
6.135 +415.393 -289.516 20 0 0 1 nc
6.136 +730.084 -307.139 20 0 0 1 nc
6.137 +526.164 32.7279 20 0 0 1 nc
6.138 +762.812 -17.6227 20 0 0 1 nc
6.139 +-67.9734 319.727 20 0 0 1 nc
6.140 +329.797 314.692 20 0 0 1 nc
6.141 +-5.03507 561.41 20 0 0 1 nc
6.142 +422.945 521.129 20 0 0 1 nc
6.143 +-470.779 158.605 20 0 0 1 nc
6.144 +986.873 -115.807 20 0 0 1 nc
6.145 +906.312 201.403 20 0 0 1 nc
6.146 +-767.847 113.289 20 0 0 1 nc
6.147 +-579.033 445.603 20 0 0 1 nc
6.148 +-840.856 -246.718 20 0 0 1 nc
6.149 +206.221 -205.967 20 1 1 0 nc
6.150 +277.311 -252.33 20 1 1 0 nc
6.151 +271.13 -175.058 20 1 1 0 nc
6.152 +366.947 -110.15 20 1 1 0 nc
6.153 +397.855 -196.694 20 1 1 0 nc
6.154 +438.037 -88.514 20 1 1 0 nc
6.155 +286.584 -48.3327 20 1 1 0 nc
6.156 +212.403 -23.6057 20 1 1 0 nc
6.157 +280.402 10.3938 20 1 1 0 nc
6.158 +694.579 115.483 20 1 0 0 nc
6.159 +574.035 177.301 20 1 0 0 nc
6.160 +grestore
6.161 +grestore
6.162 +showpage
7.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
7.2 +++ b/doc/images/edge_biconnected_components.eps Tue Apr 21 10:34:49 2009 +0100
7.3 @@ -0,0 +1,159 @@
7.4 +%!PS-Adobe-2.0 EPSF-2.0
7.5 +%%Creator: LEMON, graphToEps()
7.6 +%%CreationDate: Fri Nov 4 13:47:12 2005
7.7 +%%BoundingBox: 0 0 842 596
7.8 +%%EndComments
7.9 +/lb { setlinewidth setrgbcolor newpath moveto
7.10 + 4 2 roll 1 index 1 index curveto stroke } bind def
7.11 +/l { setlinewidth setrgbcolor newpath moveto lineto stroke } bind def
7.12 +/c { newpath dup 3 index add 2 index moveto 0 360 arc closepath } bind def
7.13 +/sq { newpath 2 index 1 index add 2 index 2 index add moveto
7.14 + 2 index 1 index sub 2 index 2 index add lineto
7.15 + 2 index 1 index sub 2 index 2 index sub lineto
7.16 + 2 index 1 index add 2 index 2 index sub lineto
7.17 + closepath pop pop pop} bind def
7.18 +/di { newpath 2 index 1 index add 2 index moveto
7.19 + 2 index 2 index 2 index add lineto
7.20 + 2 index 1 index sub 2 index lineto
7.21 + 2 index 2 index 2 index sub lineto
7.22 + closepath pop pop pop} bind def
7.23 +/nc { 0 0 0 setrgbcolor 5 index 5 index 5 index c fill
7.24 + setrgbcolor 1.1 div c fill
7.25 + } bind def
7.26 +/nsq { 0 0 0 setrgbcolor 5 index 5 index 5 index sq fill
7.27 + setrgbcolor 1.1 div sq fill
7.28 + } bind def
7.29 +/ndi { 0 0 0 setrgbcolor 5 index 5 index 5 index di fill
7.30 + setrgbcolor 1.1 div di fill
7.31 + } bind def
7.32 +/arrl 1 def
7.33 +/arrw 0.3 def
7.34 +/lrl { 2 index mul exch 2 index mul exch rlineto pop} bind def
7.35 +/arr { setrgbcolor /y1 exch def /x1 exch def /dy exch def /dx exch def
7.36 + /w exch def /len exch def
7.37 + newpath x1 dy w 2 div mul add y1 dx w 2 div mul sub moveto
7.38 + len w sub arrl sub dx dy lrl
7.39 + arrw dy dx neg lrl
7.40 + dx arrl w add mul dy w 2 div arrw add mul sub
7.41 + dy arrl w add mul dx w 2 div arrw add mul add rlineto
7.42 + dx arrl w add mul neg dy w 2 div arrw add mul sub
7.43 + dy arrl w add mul neg dx w 2 div arrw add mul add rlineto
7.44 + arrw dy dx neg lrl
7.45 + len w sub arrl sub neg dx dy lrl
7.46 + closepath fill } bind def
7.47 +/cshow { 2 index 2 index moveto dup stringwidth pop
7.48 + neg 2 div fosi .35 mul neg rmoveto show pop pop} def
7.49 +
7.50 +gsave
7.51 +90 rotate
7.52 +0 -842 translate
7.53 +71.0944 15 translate
7.54 +0.434694 dup scale
7.55 +90 rotate
7.56 +860.856 -588.349 translate
7.57 +%Edges:
7.58 +gsave
7.59 +574.035 177.301 622.149 225.748 670.264 274.195 1 0 0 2 lb
7.60 +694.579 115.483 682.421 194.839 670.264 274.195 1 0 0 2 lb
7.61 +280.402 10.3938 246.402 -6.60595 212.403 -23.6057 0 0 1 2 lb
7.62 +280.402 10.3938 283.493 -18.9695 286.584 -48.3327 0 0 1 2 lb
7.63 +212.403 -23.6057 249.493 -35.9692 286.584 -48.3327 0 0 1 2 lb
7.64 +286.584 -48.3327 326.765 -79.2414 366.947 -110.15 0 0 1 2 lb
7.65 +286.584 -48.3327 278.857 -111.695 271.13 -175.058 0 0 1 2 lb
7.66 +438.037 -88.514 417.946 -142.604 397.855 -196.694 0 0 1 2 lb
7.67 +438.037 -88.514 402.492 -99.332 366.947 -110.15 0 0 1 2 lb
7.68 +397.855 -196.694 382.401 -153.422 366.947 -110.15 0 0 1 2 lb
7.69 +366.947 -110.15 319.038 -142.604 271.13 -175.058 0 0 1 2 lb
7.70 +271.13 -175.058 274.221 -213.694 277.311 -252.33 0 0 1 2 lb
7.71 +271.13 -175.058 238.675 -190.512 206.221 -205.967 0 0 1 2 lb
7.72 +277.311 -252.33 241.766 -229.149 206.221 -205.967 0 0 1 2 lb
7.73 +-840.856 -246.718 -804.351 -66.7145 -767.847 113.289 1 0 0 2 lb
7.74 +-579.033 445.603 -673.44 279.446 -767.847 113.289 0 0 1 2 lb
7.75 +-579.033 445.603 -524.906 302.104 -470.779 158.605 0 0 1 2 lb
7.76 +-767.847 113.289 -619.313 135.947 -470.779 158.605 0 0 1 2 lb
7.77 +906.312 201.403 946.592 42.798 986.873 -115.807 0 0 1 2 lb
7.78 +906.312 201.403 834.562 91.8901 762.812 -17.6227 0 0 1 2 lb
7.79 +986.873 -115.807 874.842 -66.7148 762.812 -17.6227 0 0 1 2 lb
7.80 +-470.779 158.605 -390.218 50.3508 -309.657 -57.9033 1 0 0 2 lb
7.81 +422.945 521.129 208.955 541.269 -5.03507 561.41 0 0 1 2 lb
7.82 +422.945 521.129 376.371 417.911 329.797 314.692 0 0 1 2 lb
7.83 +422.945 521.129 474.554 276.928 526.164 32.7279 0 0 1 2 lb
7.84 +-5.03507 561.41 -36.5042 440.568 -67.9734 319.727 0 0 1 2 lb
7.85 +329.797 314.692 130.912 317.209 -67.9734 319.727 0 0 1 2 lb
7.86 +-67.9734 319.727 229.095 176.227 526.164 32.7279 0 0 1 2 lb
7.87 +762.812 -17.6227 644.488 7.5526 526.164 32.7279 0 0 1 2 lb
7.88 +762.812 -17.6227 746.448 -162.381 730.084 -307.139 0 0 1 2 lb
7.89 +526.164 32.7279 470.779 -128.394 415.393 -289.516 0 0 1 2 lb
7.90 +730.084 -307.139 572.738 -298.327 415.393 -289.516 0 0 1 2 lb
7.91 +415.393 -289.516 173.71 -318.468 -67.9734 -347.42 1 0 0 2 lb
7.92 +-67.9734 -347.42 -188.815 -202.662 -309.657 -57.9033 0 0 1 2 lb
7.93 +-67.9734 -347.42 -195.758 -390.692 -323.543 -433.964 0 0 1 2 lb
7.94 +-309.657 -57.9033 -424.775 -160.272 -539.894 -262.64 0 0 1 2 lb
7.95 +-323.543 -433.964 -431.719 -348.302 -539.894 -262.64 0 0 1 2 lb
7.96 +-26.6953 -19.9585 44.8558 -96.8093 116.407 -173.66 0 0 1 2 lb
7.97 +-26.6953 -19.9585 87.2563 9.19185 201.208 38.3422 0 0 1 2 lb
7.98 +-26.6953 -19.9585 -144.622 43.6422 -262.548 107.243 0 0 1 2 lb
7.99 +-26.6953 -19.9585 -20.0703 56.8923 -13.4452 133.743 0 0 1 2 lb
7.100 +116.407 -173.66 158.808 -67.6589 201.208 38.3422 0 0 1 2 lb
7.101 +-262.548 107.243 -137.997 120.493 -13.4452 133.743 0 0 1 2 lb
7.102 +-262.548 107.243 -221.472 176.144 -180.397 245.045 0 0 1 2 lb
7.103 +-13.4452 133.743 -96.9211 189.394 -180.397 245.045 0 0 1 2 lb
7.104 +-180.397 245.045 -142.256 345.099 -132.697 451.748 0 0 1 2 lb
7.105 +-180.397 245.045 -170.838 351.694 -132.697 451.748 0 0 1 2 lb
7.106 +-416.25 345.746 -274.474 398.747 -132.697 451.748 0 0 1 2 lb
7.107 +-416.25 345.746 -393.725 457.048 -371.2 568.349 0 0 1 2 lb
7.108 +-132.697 451.748 -251.948 510.048 -371.2 568.349 0 0 1 2 lb
7.109 +670.264 274.195 629.188 409.347 588.113 544.499 0 0 1 2 lb
7.110 +670.264 274.195 797.466 341.771 924.667 409.347 0 0 1 2 lb
7.111 +588.113 544.499 756.39 476.923 924.667 409.347 0 0 1 2 lb
7.112 +-689.204 -237.261 -614.799 -102.648 -567.302 43.6423 0 0 1 2 lb
7.113 +-689.204 -237.261 -641.707 -90.9706 -567.302 43.6423 0 0 1 2 lb
7.114 +grestore
7.115 +%Nodes:
7.116 +gsave
7.117 +-567.302 43.6423 20 0 0 0 nc
7.118 +-689.204 -237.261 20 0 0 0 nc
7.119 +924.667 409.347 20 0 0 1 nc
7.120 +588.113 544.499 20 0 0 1 nc
7.121 +670.264 274.195 20 0 0 1 nc
7.122 +-371.2 568.349 20 1 1 0 nc
7.123 +-132.697 451.748 20 1 1 0 nc
7.124 +-416.25 345.746 20 1 1 0 nc
7.125 +-180.397 245.045 20 1 1 0 nc
7.126 +-13.4452 133.743 20 1 1 0 nc
7.127 +-262.548 107.243 20 1 1 0 nc
7.128 +201.208 38.3422 20 1 1 0 nc
7.129 +116.407 -173.66 20 1 1 0 nc
7.130 +-26.6953 -19.9585 20 1 1 0 nc
7.131 +-539.894 -262.64 20 0 0.5 0 nc
7.132 +-323.543 -433.964 20 0 0.5 0 nc
7.133 +-309.657 -57.9033 20 0 0.5 0 nc
7.134 +-67.9734 -347.42 20 0 0.5 0 nc
7.135 +415.393 -289.516 20 0.5 0 0 nc
7.136 +730.084 -307.139 20 0.5 0 0 nc
7.137 +526.164 32.7279 20 0.5 0 0 nc
7.138 +762.812 -17.6227 20 0.5 0 0 nc
7.139 +-67.9734 319.727 20 0.5 0 0 nc
7.140 +329.797 314.692 20 0.5 0 0 nc
7.141 +-5.03507 561.41 20 0.5 0 0 nc
7.142 +422.945 521.129 20 0.5 0 0 nc
7.143 +-470.779 158.605 20 0 1 1 nc
7.144 +986.873 -115.807 20 0.5 0 0 nc
7.145 +906.312 201.403 20 0.5 0 0 nc
7.146 +-767.847 113.289 20 0 1 1 nc
7.147 +-579.033 445.603 20 0 1 1 nc
7.148 +-840.856 -246.718 20 1 0 1 nc
7.149 +206.221 -205.967 20 0 0 0.5 nc
7.150 +277.311 -252.33 20 0 0 0.5 nc
7.151 +271.13 -175.058 20 0 0 0.5 nc
7.152 +366.947 -110.15 20 0 0 0.5 nc
7.153 +397.855 -196.694 20 0 0 0.5 nc
7.154 +438.037 -88.514 20 0 0 0.5 nc
7.155 +286.584 -48.3327 20 0 0 0.5 nc
7.156 +212.403 -23.6057 20 0 0 0.5 nc
7.157 +280.402 10.3938 20 0 0 0.5 nc
7.158 +694.579 115.483 20 1 0 0 nc
7.159 +574.035 177.301 20 0 1 0 nc
7.160 +grestore
7.161 +grestore
7.162 +showpage
8.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
8.2 +++ b/doc/images/node_biconnected_components.eps Tue Apr 21 10:34:49 2009 +0100
8.3 @@ -0,0 +1,159 @@
8.4 +%!PS-Adobe-2.0 EPSF-2.0
8.5 +%%Creator: LEMON, graphToEps()
8.6 +%%CreationDate: Fri Nov 4 13:47:12 2005
8.7 +%%BoundingBox: 0 0 842 596
8.8 +%%EndComments
8.9 +/lb { setlinewidth setrgbcolor newpath moveto
8.10 + 4 2 roll 1 index 1 index curveto stroke } bind def
8.11 +/l { setlinewidth setrgbcolor newpath moveto lineto stroke } bind def
8.12 +/c { newpath dup 3 index add 2 index moveto 0 360 arc closepath } bind def
8.13 +/sq { newpath 2 index 1 index add 2 index 2 index add moveto
8.14 + 2 index 1 index sub 2 index 2 index add lineto
8.15 + 2 index 1 index sub 2 index 2 index sub lineto
8.16 + 2 index 1 index add 2 index 2 index sub lineto
8.17 + closepath pop pop pop} bind def
8.18 +/di { newpath 2 index 1 index add 2 index moveto
8.19 + 2 index 2 index 2 index add lineto
8.20 + 2 index 1 index sub 2 index lineto
8.21 + 2 index 2 index 2 index sub lineto
8.22 + closepath pop pop pop} bind def
8.23 +/nc { 0 0 0 setrgbcolor 5 index 5 index 5 index c fill
8.24 + setrgbcolor 1.1 div c fill
8.25 + } bind def
8.26 +/nsq { 0 0 0 setrgbcolor 5 index 5 index 5 index sq fill
8.27 + setrgbcolor 1.1 div sq fill
8.28 + } bind def
8.29 +/ndi { 0 0 0 setrgbcolor 5 index 5 index 5 index di fill
8.30 + setrgbcolor 1.1 div di fill
8.31 + } bind def
8.32 +/arrl 1 def
8.33 +/arrw 0.3 def
8.34 +/lrl { 2 index mul exch 2 index mul exch rlineto pop} bind def
8.35 +/arr { setrgbcolor /y1 exch def /x1 exch def /dy exch def /dx exch def
8.36 + /w exch def /len exch def
8.37 + newpath x1 dy w 2 div mul add y1 dx w 2 div mul sub moveto
8.38 + len w sub arrl sub dx dy lrl
8.39 + arrw dy dx neg lrl
8.40 + dx arrl w add mul dy w 2 div arrw add mul sub
8.41 + dy arrl w add mul dx w 2 div arrw add mul add rlineto
8.42 + dx arrl w add mul neg dy w 2 div arrw add mul sub
8.43 + dy arrl w add mul neg dx w 2 div arrw add mul add rlineto
8.44 + arrw dy dx neg lrl
8.45 + len w sub arrl sub neg dx dy lrl
8.46 + closepath fill } bind def
8.47 +/cshow { 2 index 2 index moveto dup stringwidth pop
8.48 + neg 2 div fosi .35 mul neg rmoveto show pop pop} def
8.49 +
8.50 +gsave
8.51 +90 rotate
8.52 +0 -842 translate
8.53 +71.0944 15 translate
8.54 +0.434694 dup scale
8.55 +90 rotate
8.56 +860.856 -588.349 translate
8.57 +%Edges:
8.58 +gsave
8.59 +574.035 177.301 622.149 225.748 670.264 274.195 0 1 0 5 lb
8.60 +694.579 115.483 682.421 194.839 670.264 274.195 1 0 0 5 lb
8.61 +280.402 10.3938 246.402 -6.60595 212.403 -23.6057 1 1 0.5 5 lb
8.62 +280.402 10.3938 283.493 -18.9695 286.584 -48.3327 1 1 0.5 5 lb
8.63 +212.403 -23.6057 249.493 -35.9692 286.584 -48.3327 1 1 0.5 5 lb
8.64 +286.584 -48.3327 326.765 -79.2414 366.947 -110.15 1 0.5 1 5 lb
8.65 +286.584 -48.3327 278.857 -111.695 271.13 -175.058 1 0.5 1 5 lb
8.66 +438.037 -88.514 417.946 -142.604 397.855 -196.694 0.5 0.5 1 5 lb
8.67 +438.037 -88.514 402.492 -99.332 366.947 -110.15 0.5 0.5 1 5 lb
8.68 +397.855 -196.694 382.401 -153.422 366.947 -110.15 0.5 0.5 1 5 lb
8.69 +366.947 -110.15 319.038 -142.604 271.13 -175.058 1 0.5 1 5 lb
8.70 +271.13 -175.058 274.221 -213.694 277.311 -252.33 0.5 1 1 5 lb
8.71 +271.13 -175.058 238.675 -190.512 206.221 -205.967 0.5 1 1 5 lb
8.72 +277.311 -252.33 241.766 -229.149 206.221 -205.967 0.5 1 1 5 lb
8.73 +-840.856 -246.718 -804.351 -66.7145 -767.847 113.289 0 0.5 0 5 lb
8.74 +-579.033 445.603 -673.44 279.446 -767.847 113.289 0 0 0.5 5 lb
8.75 +-579.033 445.603 -524.906 302.104 -470.779 158.605 0 0 0.5 5 lb
8.76 +-767.847 113.289 -619.313 135.947 -470.779 158.605 0 0 0.5 5 lb
8.77 +906.312 201.403 946.592 42.798 986.873 -115.807 0 0.5 0.5 5 lb
8.78 +906.312 201.403 834.562 91.8901 762.812 -17.6227 0 0.5 0.5 5 lb
8.79 +986.873 -115.807 874.842 -66.7148 762.812 -17.6227 0 0.5 0.5 5 lb
8.80 +-470.779 158.605 -390.218 50.3508 -309.657 -57.9033 0.5 0.5 0 5 lb
8.81 +422.945 521.129 208.955 541.269 -5.03507 561.41 0.5 0 0.5 5 lb
8.82 +422.945 521.129 376.371 417.911 329.797 314.692 0.5 0 0.5 5 lb
8.83 +422.945 521.129 474.554 276.928 526.164 32.7279 0.5 0 0.5 5 lb
8.84 +-5.03507 561.41 -36.5042 440.568 -67.9734 319.727 0.5 0 0.5 5 lb
8.85 +329.797 314.692 130.912 317.209 -67.9734 319.727 0.5 0 0.5 5 lb
8.86 +-67.9734 319.727 229.095 176.227 526.164 32.7279 0.5 0 0.5 5 lb
8.87 +762.812 -17.6227 644.488 7.5526 526.164 32.7279 0.5 0.5 0.5 5 lb
8.88 +762.812 -17.6227 746.448 -162.381 730.084 -307.139 0.5 0.5 0.5 5 lb
8.89 +526.164 32.7279 470.779 -128.394 415.393 -289.516 0.5 0.5 0.5 5 lb
8.90 +730.084 -307.139 572.738 -298.327 415.393 -289.516 0.5 0.5 0.5 5 lb
8.91 +415.393 -289.516 173.71 -318.468 -67.9734 -347.42 1 0.5 0.5 5 lb
8.92 +-67.9734 -347.42 -188.815 -202.662 -309.657 -57.9033 0.5 1 0.5 5 lb
8.93 +-67.9734 -347.42 -195.758 -390.692 -323.543 -433.964 0.5 1 0.5 5 lb
8.94 +-309.657 -57.9033 -424.775 -160.272 -539.894 -262.64 0.5 1 0.5 5 lb
8.95 +-323.543 -433.964 -431.719 -348.302 -539.894 -262.64 0.5 1 0.5 5 lb
8.96 +-26.6953 -19.9585 44.8558 -96.8093 116.407 -173.66 1 1 0 5 lb
8.97 +-26.6953 -19.9585 87.2563 9.19185 201.208 38.3422 1 1 0 5 lb
8.98 +-26.6953 -19.9585 -144.622 43.6422 -262.548 107.243 1 0 1 5 lb
8.99 +-26.6953 -19.9585 -20.0703 56.8923 -13.4452 133.743 1 0 1 5 lb
8.100 +116.407 -173.66 158.808 -67.6589 201.208 38.3422 1 1 0 5 lb
8.101 +-262.548 107.243 -137.997 120.493 -13.4452 133.743 1 0 1 5 lb
8.102 +-262.548 107.243 -221.472 176.144 -180.397 245.045 1 0 1 5 lb
8.103 +-13.4452 133.743 -96.9211 189.394 -180.397 245.045 1 0 1 5 lb
8.104 +-180.397 245.045 -140.307 344.649 -132.697 451.748 0 1 1 5 lb
8.105 +-180.397 245.045 -172.787 352.144 -132.697 451.748 0 1 1 5 lb
8.106 +-416.25 345.746 -274.474 398.747 -132.697 451.748 0.5 0 0 5 lb
8.107 +-416.25 345.746 -393.725 457.048 -371.2 568.349 0.5 0 0 5 lb
8.108 +-132.697 451.748 -251.948 510.048 -371.2 568.349 0.5 0 0 5 lb
8.109 +670.264 274.195 629.188 409.347 588.113 544.499 0 0 1 5 lb
8.110 +670.264 274.195 797.466 341.771 924.667 409.347 0 0 1 5 lb
8.111 +588.113 544.499 756.39 476.923 924.667 409.347 0 0 1 5 lb
8.112 +-689.204 -237.261 -612.964 -103.444 -567.302 43.6423 0 0 0 5 lb
8.113 +-689.204 -237.261 -643.542 -90.1744 -567.302 43.6423 0 0 0 5 lb
8.114 +grestore
8.115 +%Nodes:
8.116 +gsave
8.117 +-567.302 43.6423 20 0 0 1 nc
8.118 +-689.204 -237.261 20 0 0 1 nc
8.119 +924.667 409.347 20 0 0 1 nc
8.120 +588.113 544.499 20 0 0 1 nc
8.121 +670.264 274.195 20 1 0 0 nc
8.122 +-371.2 568.349 20 0 0 1 nc
8.123 +-132.697 451.748 20 1 0 0 nc
8.124 +-416.25 345.746 20 0 0 1 nc
8.125 +-180.397 245.045 20 1 0 0 nc
8.126 +-13.4452 133.743 20 0 0 1 nc
8.127 +-262.548 107.243 20 0 0 1 nc
8.128 +201.208 38.3422 20 0 0 1 nc
8.129 +116.407 -173.66 20 0 0 1 nc
8.130 +-26.6953 -19.9585 20 1 0 0 nc
8.131 +-539.894 -262.64 20 0 0 1 nc
8.132 +-323.543 -433.964 20 0 0 1 nc
8.133 +-309.657 -57.9033 20 1 0 0 nc
8.134 +-67.9734 -347.42 20 1 0 0 nc
8.135 +415.393 -289.516 20 1 0 0 nc
8.136 +730.084 -307.139 20 0 0 1 nc
8.137 +526.164 32.7279 20 1 0 0 nc
8.138 +762.812 -17.6227 20 1 0 0 nc
8.139 +-67.9734 319.727 20 0 0 1 nc
8.140 +329.797 314.692 20 0 0 1 nc
8.141 +-5.03507 561.41 20 0 0 1 nc
8.142 +422.945 521.129 20 0 0 1 nc
8.143 +-470.779 158.605 20 1 0 0 nc
8.144 +986.873 -115.807 20 0 0 1 nc
8.145 +906.312 201.403 20 0 0 1 nc
8.146 +-767.847 113.289 20 1 0 0 nc
8.147 +-579.033 445.603 20 0 0 1 nc
8.148 +-840.856 -246.718 20 0 0 1 nc
8.149 +206.221 -205.967 20 0 0 1 nc
8.150 +277.311 -252.33 20 0 0 1 nc
8.151 +271.13 -175.058 20 1 0 0 nc
8.152 +366.947 -110.15 20 1 0 0 nc
8.153 +397.855 -196.694 20 0 0 1 nc
8.154 +438.037 -88.514 20 0 0 1 nc
8.155 +286.584 -48.3327 20 1 0 0 nc
8.156 +212.403 -23.6057 20 0 0 1 nc
8.157 +280.402 10.3938 20 0 0 1 nc
8.158 +694.579 115.483 20 0 0 1 nc
8.159 +574.035 177.301 20 0 0 1 nc
8.160 +grestore
8.161 +grestore
8.162 +showpage
9.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
9.2 +++ b/doc/images/strongly_connected_components.eps Tue Apr 21 10:34:49 2009 +0100
9.3 @@ -0,0 +1,180 @@
9.4 +%!PS-Adobe-2.0 EPSF-2.0
9.5 +%%Creator: LEMON, graphToEps()
9.6 +%%CreationDate: Fri Nov 4 13:47:12 2005
9.7 +%%BoundingBox: 0 0 842 596
9.8 +%%EndComments
9.9 +/lb { setlinewidth setrgbcolor newpath moveto
9.10 + 4 2 roll 1 index 1 index curveto stroke } bind def
9.11 +/l { setlinewidth setrgbcolor newpath moveto lineto stroke } bind def
9.12 +/c { newpath dup 3 index add 2 index moveto 0 360 arc closepath } bind def
9.13 +/sq { newpath 2 index 1 index add 2 index 2 index add moveto
9.14 + 2 index 1 index sub 2 index 2 index add lineto
9.15 + 2 index 1 index sub 2 index 2 index sub lineto
9.16 + 2 index 1 index add 2 index 2 index sub lineto
9.17 + closepath pop pop pop} bind def
9.18 +/di { newpath 2 index 1 index add 2 index moveto
9.19 + 2 index 2 index 2 index add lineto
9.20 + 2 index 1 index sub 2 index lineto
9.21 + 2 index 2 index 2 index sub lineto
9.22 + closepath pop pop pop} bind def
9.23 +/nc { 0 0 0 setrgbcolor 5 index 5 index 5 index c fill
9.24 + setrgbcolor 1.1 div c fill
9.25 + } bind def
9.26 +/nsq { 0 0 0 setrgbcolor 5 index 5 index 5 index sq fill
9.27 + setrgbcolor 1.1 div sq fill
9.28 + } bind def
9.29 +/ndi { 0 0 0 setrgbcolor 5 index 5 index 5 index di fill
9.30 + setrgbcolor 1.1 div di fill
9.31 + } bind def
9.32 +/arrl 10 def
9.33 +/arrw 3 def
9.34 +/lrl { 2 index mul exch 2 index mul exch rlineto pop} bind def
9.35 +/arr { setrgbcolor /y1 exch def /x1 exch def /dy exch def /dx exch def
9.36 + /w exch def /len exch def
9.37 + newpath x1 dy w 2 div mul add y1 dx w 2 div mul sub moveto
9.38 + len w sub arrl sub dx dy lrl
9.39 + arrw dy dx neg lrl
9.40 + dx arrl w add mul dy w 2 div arrw add mul sub
9.41 + dy arrl w add mul dx w 2 div arrw add mul add rlineto
9.42 + dx arrl w add mul neg dy w 2 div arrw add mul sub
9.43 + dy arrl w add mul neg dx w 2 div arrw add mul add rlineto
9.44 + arrw dy dx neg lrl
9.45 + len w sub arrl sub neg dx dy lrl
9.46 + closepath fill } bind def
9.47 +/cshow { 2 index 2 index moveto dup stringwidth pop
9.48 + neg 2 div fosi .35 mul neg rmoveto show pop pop} def
9.49 +
9.50 +gsave
9.51 +90 rotate
9.52 +0 -842 translate
9.53 +77.1122 15 translate
9.54 +0.585745 dup scale
9.55 +90 rotate
9.56 +695.963 -397.916 translate
9.57 +%Edges:
9.58 +gsave
9.59 +2 setlinewidth 0 0 1 setrgbcolor newpath
9.60 +218.178 27.2723 moveto
9.61 +192.373 -40.1551 188.622 -49.9556 169.228 -100.631 curveto stroke
9.62 +newpath 164.939 -111.838 moveto 165.492 -99.2013 lineto 172.964 -102.061 lineto closepath fill
9.63 +2 setlinewidth 0 0 1 setrgbcolor newpath
9.64 +44.8044 15.5841 moveto
9.65 +119.293 20.6059 129.775 21.3125 186.25 25.1199 curveto stroke
9.66 +newpath 198.223 25.927 moveto 186.519 21.1289 lineto 185.981 29.1108 lineto closepath fill
9.67 +2 setlinewidth 1 0 0 setrgbcolor newpath
9.68 +218.178 27.2723 moveto
9.69 +285.395 -87.4449 290.763 -96.6058 348.102 -194.464 curveto stroke
9.70 +newpath 354.169 -204.818 moveto 344.651 -196.487 lineto 351.554 -192.442 lineto closepath fill
9.71 +2 setlinewidth 0 0 1 setrgbcolor newpath
9.72 +157.79 -130.517 moveto
9.73 +108.71 -67.0521 102.27 -58.7243 64.3804 -9.72954 curveto stroke
9.74 +newpath 57.0394 -0.236898 moveto 67.5446 -7.28254 lineto 61.2162 -12.1765 lineto closepath fill
9.75 +2 setlinewidth 1 0 0 setrgbcolor newpath
9.76 +-105.193 -261.035 moveto
9.77 +-35.6576 -132.801 -30.5923 -123.459 29.5506 -12.5464 curveto stroke
9.78 +newpath 35.2708 -1.99743 moveto 33.0669 -14.4531 lineto 26.0343 -10.6397 lineto closepath fill
9.79 +2 setlinewidth 0 0 1 setrgbcolor newpath
9.80 +-465.576 -42.8564 moveto
9.81 +-559.078 -25.5413 -569.47 -23.6169 -644.498 -9.72286 curveto stroke
9.82 +newpath -656.297 -7.5378 moveto -643.77 -5.78973 lineto -645.226 -13.656 lineto closepath fill
9.83 +2 setlinewidth 0 0 1 setrgbcolor newpath
9.84 +-574.666 -153.893 moveto
9.85 +-528.842 -107.252 -521.515 -99.794 -488.002 -65.683 curveto stroke
9.86 +newpath -479.592 -57.123 moveto -485.149 -68.4863 lineto -490.856 -62.8797 lineto closepath fill
9.87 +2 setlinewidth 1 0 0 setrgbcolor newpath
9.88 +-490.901 120.777 moveto
9.89 +-480.122 51.1328 -478.519 40.7713 -470.47 -11.2329 curveto stroke
9.90 +newpath -468.635 -23.0917 moveto -474.423 -11.8447 lineto -466.517 -10.6212 lineto closepath fill
9.91 +2 setlinewidth 0 0 1 setrgbcolor newpath
9.92 +-675.963 -3.89604 moveto
9.93 +-632.116 -68.8235 -626.228 -77.5422 -592.575 -127.374 curveto stroke
9.94 +newpath -585.859 -137.319 moveto -595.89 -129.612 lineto -589.26 -125.135 lineto closepath fill
9.95 +2 setlinewidth 0 0 1 setrgbcolor newpath
9.96 +-490.901 120.777 moveto
9.97 +-435.445 215.844 -430.107 224.995 -384.3 303.522 curveto stroke
9.98 +newpath -378.253 313.887 moveto -380.845 301.507 lineto -387.755 305.537 lineto closepath fill
9.99 +2 setlinewidth 0 0 1 setrgbcolor newpath
9.100 +-266.879 114.933 moveto
9.101 +-367.067 117.547 -377.642 117.822 -458.912 119.943 curveto stroke
9.102 +newpath -470.908 120.255 moveto -458.807 123.941 lineto -459.016 115.944 lineto closepath fill
9.103 +2 setlinewidth 0 0 1 setrgbcolor newpath
9.104 +-368.176 331.163 moveto
9.105 +-322.511 233.685 -318.018 224.095 -280.454 143.911 curveto stroke
9.106 +newpath -275.364 133.044 moveto -284.076 142.214 lineto -276.832 145.608 lineto closepath fill
9.107 +2 setlinewidth 1 0 0 setrgbcolor newpath
9.108 +-266.879 114.933 moveto
9.109 +-224.004 235.52 -220.448 245.52 -184.094 347.765 curveto stroke
9.110 +newpath -180.074 359.072 moveto -180.325 346.425 lineto -187.863 349.105 lineto closepath fill
9.111 +2 setlinewidth 0 0 1 setrgbcolor newpath
9.112 +-251.294 -335.059 moveto
9.113 +-189.25 -303.624 -179.902 -298.887 -133.738 -275.498 curveto stroke
9.114 +newpath -123.034 -270.074 moveto -131.93 -279.066 lineto -135.546 -271.93 lineto closepath fill
9.115 +2 setlinewidth 0 0 1 setrgbcolor newpath
9.116 +-389.604 -136.361 moveto
9.117 +-327.15 -226.083 -321.098 -234.777 -269.576 -308.795 curveto stroke
9.118 +newpath -262.72 -318.644 moveto -272.859 -311.081 lineto -266.293 -306.51 lineto closepath fill
9.119 +2 setlinewidth 1 0 0 setrgbcolor newpath
9.120 +5.84406 175.322 moveto
9.121 +-76.0754 267.926 -83.1051 275.873 -152.172 353.948 curveto stroke
9.122 +newpath -160.122 362.936 moveto -149.176 356.598 lineto -155.168 351.298 lineto closepath fill
9.123 +2 setlinewidth 0 0 1 setrgbcolor newpath
9.124 +169.478 311.683 moveto
9.125 +96.8003 251.119 88.6819 244.353 30.4273 195.808 curveto stroke
9.126 +newpath 21.2086 188.126 moveto 27.8666 198.881 lineto 32.988 192.735 lineto closepath fill
9.127 +2 setlinewidth 0 0 1 setrgbcolor newpath
9.128 +342.851 111.037 moveto
9.129 +263.766 202.563 256.831 210.589 190.4 287.47 curveto stroke
9.130 +newpath 182.554 296.55 moveto 193.427 290.085 lineto 187.373 284.855 lineto closepath fill
9.131 +2 setlinewidth 0 0 1 setrgbcolor newpath
9.132 +5.84406 175.322 moveto
9.133 +163.16 145.314 173.605 143.321 311.418 117.033 curveto stroke
9.134 +newpath 323.205 114.784 moveto 310.668 113.104 lineto 312.167 120.962 lineto closepath fill
9.135 +2 setlinewidth 0 0 1 setrgbcolor newpath
9.136 +342.851 111.037 moveto
9.137 +497.255 2.58683 505.964 -3.53033 643.932 -100.436 curveto stroke
9.138 +newpath 653.752 -107.334 moveto 641.633 -103.71 lineto 646.231 -97.163 lineto closepath fill
9.139 +2 setlinewidth 0 0 1 setrgbcolor newpath
9.140 +364.28 -222.074 moveto
9.141 +354.298 -66.9063 353.616 -56.2971 344.905 79.1029 curveto stroke
9.142 +newpath 344.135 91.0781 moveto 348.897 79.3597 lineto 340.914 78.8461 lineto closepath fill
9.143 +2 setlinewidth 0 0 1 setrgbcolor newpath
9.144 +670.118 -118.829 moveto
9.145 +528.037 -166.793 517.967 -170.192 394.599 -211.839 curveto stroke
9.146 +newpath 383.229 -215.677 moveto 393.32 -208.049 lineto 395.878 -215.629 lineto closepath fill
9.147 +2 setlinewidth 1 0 0 setrgbcolor newpath
9.148 +-105.193 -261.035 moveto
9.149 +118.401 -242.479 129.015 -241.598 332.39 -224.721 curveto stroke
9.150 +newpath 344.348 -223.728 moveto 332.72 -228.707 lineto 332.059 -220.734 lineto closepath fill
9.151 +2 setlinewidth 0 0 1 setrgbcolor newpath
9.152 +-105.193 -261.035 moveto
9.153 +-160.867 -161.176 -166.028 -151.918 -212.336 -68.858 curveto stroke
9.154 +newpath -218.179 -58.3769 moveto -208.842 -66.9102 lineto -215.829 -70.8058 lineto closepath fill
9.155 +2 setlinewidth 0 0 1 setrgbcolor newpath
9.156 +-227.918 -40.9084 moveto
9.157 +-298.35 -82.4884 -307.42 -87.8432 -362.048 -120.093 curveto stroke
9.158 +newpath -372.381 -126.193 moveto -364.081 -116.648 lineto -360.014 -123.537 lineto closepath fill
9.159 +grestore
9.160 +%Nodes:
9.161 +gsave
9.162 +-389.604 -136.361 20 0 1 0 nc
9.163 +-227.918 -40.9084 20 0 1 0 nc
9.164 +-105.193 -261.035 20 0 1 0 nc
9.165 +364.28 -222.074 20 1 1 0 nc
9.166 +670.118 -118.829 20 1 1 0 nc
9.167 +342.851 111.037 20 1 1 0 nc
9.168 +5.84406 175.322 20 1 1 0 nc
9.169 +169.478 311.683 20 1 1 0 nc
9.170 +-173.374 377.916 20 1 0 1 nc
9.171 +-251.294 -335.059 20 0 1 0 nc
9.172 +-266.879 114.933 20 0 0 0 nc
9.173 +-368.176 331.163 20 0 0 0 nc
9.174 +-490.901 120.777 20 0 0 0 nc
9.175 +-574.666 -153.893 20 1 0 0 nc
9.176 +-675.963 -3.89604 20 1 0 0 nc
9.177 +-465.576 -42.8564 20 1 0 0 nc
9.178 +44.8044 15.5841 20 0 0 1 nc
9.179 +157.79 -130.517 20 0 0 1 nc
9.180 +218.178 27.2723 20 0 0 1 nc
9.181 +grestore
9.182 +grestore
9.183 +showpage
10.1 --- a/lemon/adaptors.h Sat Apr 18 21:54:30 2009 +0200
10.2 +++ b/lemon/adaptors.h Tue Apr 21 10:34:49 2009 +0100
10.3 @@ -2192,6 +2192,9 @@
10.4
10.5 typedef typename ItemSetTraits<DGR, Edge>::ItemNotifier EdgeNotifier;
10.6 EdgeNotifier& notifier(Edge) const { return _digraph->notifier(Edge()); }
10.7 +
10.8 + typedef EdgeNotifier ArcNotifier;
10.9 + ArcNotifier& notifier(Arc) const { return _digraph->notifier(Edge()); }
10.10
10.11 protected:
10.12
11.1 --- a/lemon/bin_heap.h Sat Apr 18 21:54:30 2009 +0200
11.2 +++ b/lemon/bin_heap.h Tue Apr 21 10:34:49 2009 +0100
11.3 @@ -73,9 +73,9 @@
11.4 /// The item-int map must be initialized in such way that it assigns
11.5 /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
11.6 enum State {
11.7 - IN_HEAP = 0, ///< \e
11.8 - PRE_HEAP = -1, ///< \e
11.9 - POST_HEAP = -2 ///< \e
11.10 + IN_HEAP = 0, ///< = 0.
11.11 + PRE_HEAP = -1, ///< = -1.
11.12 + POST_HEAP = -2 ///< = -2.
11.13 };
11.14
11.15 private:
12.1 --- a/lemon/bits/graph_adaptor_extender.h Sat Apr 18 21:54:30 2009 +0200
12.2 +++ b/lemon/bits/graph_adaptor_extender.h Tue Apr 21 10:34:49 2009 +0100
12.3 @@ -22,8 +22,6 @@
12.4 #include <lemon/core.h>
12.5 #include <lemon/error.h>
12.6
12.7 -#include <lemon/bits/default_map.h>
12.8 -
12.9 namespace lemon {
12.10
12.11 template <typename _Digraph>
13.1 --- a/lemon/bits/map_extender.h Sat Apr 18 21:54:30 2009 +0200
13.2 +++ b/lemon/bits/map_extender.h Tue Apr 21 10:34:49 2009 +0100
13.3 @@ -47,6 +47,8 @@
13.4
13.5 typedef typename Parent::Key Key;
13.6 typedef typename Parent::Value Value;
13.7 + typedef typename Parent::Reference Reference;
13.8 + typedef typename Parent::ConstReference ConstReference;
13.9
13.10 class MapIt;
13.11 class ConstMapIt;
13.12 @@ -187,6 +189,8 @@
13.13
13.14 typedef typename Parent::Key Key;
13.15 typedef typename Parent::Value Value;
13.16 + typedef typename Parent::Reference Reference;
13.17 + typedef typename Parent::ConstReference ConstReference;
13.18
13.19 class MapIt;
13.20 class ConstMapIt;
14.1 --- a/lemon/cbc.cc Sat Apr 18 21:54:30 2009 +0200
14.2 +++ b/lemon/cbc.cc Tue Apr 21 10:34:49 2009 +0100
14.3 @@ -55,12 +55,15 @@
14.4 _prob->setProblemName("LEMON");
14.5 _osi_solver = 0;
14.6 _cbc_model = 0;
14.7 + messageLevel(MESSAGE_NOTHING);
14.8 }
14.9
14.10 CbcMip::CbcMip(const CbcMip& other) {
14.11 _prob = new CoinModel(*other._prob);
14.12 + _prob->setProblemName("LEMON");
14.13 _osi_solver = 0;
14.14 _cbc_model = 0;
14.15 + messageLevel(MESSAGE_NOTHING);
14.16 }
14.17
14.18 CbcMip::~CbcMip() {
14.19 @@ -270,24 +273,8 @@
14.20 }
14.21 _cbc_model= new CbcModel(*_osi_solver);
14.22
14.23 - switch (_message_level) {
14.24 - case MESSAGE_NO_OUTPUT:
14.25 - _osi_solver->messageHandler()->setLogLevel(0);
14.26 - _cbc_model->setLogLevel(0);
14.27 - break;
14.28 - case MESSAGE_ERROR_MESSAGE:
14.29 - _osi_solver->messageHandler()->setLogLevel(1);
14.30 - _cbc_model->setLogLevel(1);
14.31 - break;
14.32 - case MESSAGE_NORMAL_OUTPUT:
14.33 - _osi_solver->messageHandler()->setLogLevel(2);
14.34 - _cbc_model->setLogLevel(2);
14.35 - break;
14.36 - case MESSAGE_FULL_OUTPUT:
14.37 - _osi_solver->messageHandler()->setLogLevel(3);
14.38 - _cbc_model->setLogLevel(3);
14.39 - break;
14.40 - }
14.41 + _osi_solver->messageHandler()->setLogLevel(_message_level);
14.42 + _cbc_model->setLogLevel(_message_level);
14.43
14.44 _cbc_model->initialSolve();
14.45 _cbc_model->solver()->setHintParam(OsiDoReducePrint, true, OsiHintTry);
14.46 @@ -453,8 +440,24 @@
14.47 cols.clear();
14.48 }
14.49
14.50 - void CbcMip::messageLevel(MessageLevel m) {
14.51 - _message_level = m;
14.52 + void CbcMip::_messageLevel(MessageLevel level) {
14.53 + switch (level) {
14.54 + case MESSAGE_NOTHING:
14.55 + _message_level = 0;
14.56 + break;
14.57 + case MESSAGE_ERROR:
14.58 + _message_level = 1;
14.59 + break;
14.60 + case MESSAGE_WARNING:
14.61 + _message_level = 1;
14.62 + break;
14.63 + case MESSAGE_NORMAL:
14.64 + _message_level = 2;
14.65 + break;
14.66 + case MESSAGE_VERBOSE:
14.67 + _message_level = 3;
14.68 + break;
14.69 + }
14.70 }
14.71
14.72 } //END OF NAMESPACE LEMON
15.1 --- a/lemon/cbc.h Sat Apr 18 21:54:30 2009 +0200
15.2 +++ b/lemon/cbc.h Tue Apr 21 10:34:49 2009 +0100
15.3 @@ -115,33 +115,12 @@
15.4
15.5 virtual void _clear();
15.6
15.7 - public:
15.8 + virtual void _messageLevel(MessageLevel level);
15.9 + void _applyMessageLevel();
15.10
15.11 - ///Enum for \c messageLevel() parameter
15.12 - enum MessageLevel {
15.13 - /// no output (default value)
15.14 - MESSAGE_NO_OUTPUT = 0,
15.15 - /// error messages only
15.16 - MESSAGE_ERROR_MESSAGE = 1,
15.17 - /// normal output
15.18 - MESSAGE_NORMAL_OUTPUT = 2,
15.19 - /// full output (includes informational messages)
15.20 - MESSAGE_FULL_OUTPUT = 3
15.21 - };
15.22 + int _message_level;
15.23
15.24 - private:
15.25 -
15.26 - MessageLevel _message_level;
15.27 -
15.28 - public:
15.29 -
15.30 - ///Set the verbosity of the messages
15.31 -
15.32 - ///Set the verbosity of the messages
15.33 - ///
15.34 - ///\param m is the level of the messages output by the solver routines.
15.35 - void messageLevel(MessageLevel m);
15.36 -
15.37 +
15.38
15.39 };
15.40
16.1 --- a/lemon/circulation.h Sat Apr 18 21:54:30 2009 +0200
16.2 +++ b/lemon/circulation.h Tue Apr 21 10:34:49 2009 +0100
16.3 @@ -453,13 +453,13 @@
16.4 createStructures();
16.5
16.6 for(NodeIt n(_g);n!=INVALID;++n) {
16.7 - _excess->set(n, (*_delta)[n]);
16.8 + (*_excess)[n] = (*_delta)[n];
16.9 }
16.10
16.11 for (ArcIt e(_g);e!=INVALID;++e) {
16.12 _flow->set(e, (*_lo)[e]);
16.13 - _excess->set(_g.target(e), (*_excess)[_g.target(e)] + (*_flow)[e]);
16.14 - _excess->set(_g.source(e), (*_excess)[_g.source(e)] - (*_flow)[e]);
16.15 + (*_excess)[_g.target(e)] += (*_flow)[e];
16.16 + (*_excess)[_g.source(e)] -= (*_flow)[e];
16.17 }
16.18
16.19 // global relabeling tested, but in general case it provides
16.20 @@ -482,23 +482,23 @@
16.21 createStructures();
16.22
16.23 for(NodeIt n(_g);n!=INVALID;++n) {
16.24 - _excess->set(n, (*_delta)[n]);
16.25 + (*_excess)[n] = (*_delta)[n];
16.26 }
16.27
16.28 for (ArcIt e(_g);e!=INVALID;++e) {
16.29 if (!_tol.positive((*_excess)[_g.target(e)] + (*_up)[e])) {
16.30 _flow->set(e, (*_up)[e]);
16.31 - _excess->set(_g.target(e), (*_excess)[_g.target(e)] + (*_up)[e]);
16.32 - _excess->set(_g.source(e), (*_excess)[_g.source(e)] - (*_up)[e]);
16.33 + (*_excess)[_g.target(e)] += (*_up)[e];
16.34 + (*_excess)[_g.source(e)] -= (*_up)[e];
16.35 } else if (_tol.positive((*_excess)[_g.target(e)] + (*_lo)[e])) {
16.36 _flow->set(e, (*_lo)[e]);
16.37 - _excess->set(_g.target(e), (*_excess)[_g.target(e)] + (*_lo)[e]);
16.38 - _excess->set(_g.source(e), (*_excess)[_g.source(e)] - (*_lo)[e]);
16.39 + (*_excess)[_g.target(e)] += (*_lo)[e];
16.40 + (*_excess)[_g.source(e)] -= (*_lo)[e];
16.41 } else {
16.42 Value fc = -(*_excess)[_g.target(e)];
16.43 _flow->set(e, fc);
16.44 - _excess->set(_g.target(e), 0);
16.45 - _excess->set(_g.source(e), (*_excess)[_g.source(e)] - fc);
16.46 + (*_excess)[_g.target(e)] = 0;
16.47 + (*_excess)[_g.source(e)] -= fc;
16.48 }
16.49 }
16.50
16.51 @@ -537,16 +537,16 @@
16.52 if((*_level)[v]<actlevel) {
16.53 if(!_tol.less(fc, exc)) {
16.54 _flow->set(e, (*_flow)[e] + exc);
16.55 - _excess->set(v, (*_excess)[v] + exc);
16.56 + (*_excess)[v] += exc;
16.57 if(!_level->active(v) && _tol.positive((*_excess)[v]))
16.58 _level->activate(v);
16.59 - _excess->set(act,0);
16.60 + (*_excess)[act] = 0;
16.61 _level->deactivate(act);
16.62 goto next_l;
16.63 }
16.64 else {
16.65 _flow->set(e, (*_up)[e]);
16.66 - _excess->set(v, (*_excess)[v] + fc);
16.67 + (*_excess)[v] += fc;
16.68 if(!_level->active(v) && _tol.positive((*_excess)[v]))
16.69 _level->activate(v);
16.70 exc-=fc;
16.71 @@ -561,16 +561,16 @@
16.72 if((*_level)[v]<actlevel) {
16.73 if(!_tol.less(fc, exc)) {
16.74 _flow->set(e, (*_flow)[e] - exc);
16.75 - _excess->set(v, (*_excess)[v] + exc);
16.76 + (*_excess)[v] += exc;
16.77 if(!_level->active(v) && _tol.positive((*_excess)[v]))
16.78 _level->activate(v);
16.79 - _excess->set(act,0);
16.80 + (*_excess)[act] = 0;
16.81 _level->deactivate(act);
16.82 goto next_l;
16.83 }
16.84 else {
16.85 _flow->set(e, (*_lo)[e]);
16.86 - _excess->set(v, (*_excess)[v] + fc);
16.87 + (*_excess)[v] += fc;
16.88 if(!_level->active(v) && _tol.positive((*_excess)[v]))
16.89 _level->activate(v);
16.90 exc-=fc;
16.91 @@ -579,7 +579,7 @@
16.92 else if((*_level)[v]<mlevel) mlevel=(*_level)[v];
16.93 }
16.94
16.95 - _excess->set(act, exc);
16.96 + (*_excess)[act] = exc;
16.97 if(!_tol.positive(exc)) _level->deactivate(act);
16.98 else if(mlevel==_node_num) {
16.99 _level->liftHighestActiveToTop();
17.1 --- a/lemon/clp.cc Sat Apr 18 21:54:30 2009 +0200
17.2 +++ b/lemon/clp.cc Tue Apr 21 10:34:49 2009 +0100
17.3 @@ -24,7 +24,7 @@
17.4 ClpLp::ClpLp() {
17.5 _prob = new ClpSimplex();
17.6 _init_temporals();
17.7 - messageLevel(MESSAGE_NO_OUTPUT);
17.8 + messageLevel(MESSAGE_NOTHING);
17.9 }
17.10
17.11 ClpLp::ClpLp(const ClpLp& other) {
17.12 @@ -32,7 +32,7 @@
17.13 rows = other.rows;
17.14 cols = other.cols;
17.15 _init_temporals();
17.16 - messageLevel(MESSAGE_NO_OUTPUT);
17.17 + messageLevel(MESSAGE_NOTHING);
17.18 }
17.19
17.20 ClpLp::~ClpLp() {
17.21 @@ -430,8 +430,24 @@
17.22 _clear_temporals();
17.23 }
17.24
17.25 - void ClpLp::messageLevel(MessageLevel m) {
17.26 - _prob->setLogLevel(static_cast<int>(m));
17.27 + void ClpLp::_messageLevel(MessageLevel level) {
17.28 + switch (level) {
17.29 + case MESSAGE_NOTHING:
17.30 + _prob->setLogLevel(0);
17.31 + break;
17.32 + case MESSAGE_ERROR:
17.33 + _prob->setLogLevel(1);
17.34 + break;
17.35 + case MESSAGE_WARNING:
17.36 + _prob->setLogLevel(2);
17.37 + break;
17.38 + case MESSAGE_NORMAL:
17.39 + _prob->setLogLevel(3);
17.40 + break;
17.41 + case MESSAGE_VERBOSE:
17.42 + _prob->setLogLevel(4);
17.43 + break;
17.44 + }
17.45 }
17.46
17.47 } //END OF NAMESPACE LEMON
18.1 --- a/lemon/clp.h Sat Apr 18 21:54:30 2009 +0200
18.2 +++ b/lemon/clp.h Tue Apr 21 10:34:49 2009 +0100
18.3 @@ -136,6 +136,8 @@
18.4
18.5 virtual void _clear();
18.6
18.7 + virtual void _messageLevel(MessageLevel);
18.8 +
18.9 public:
18.10
18.11 ///Solves LP with primal simplex method.
18.12 @@ -153,26 +155,6 @@
18.13 ///Returns the variable identifier understood by CLP.
18.14 int clpCol(Col c) const { return cols(id(c)); }
18.15
18.16 - ///Enum for \c messageLevel() parameter
18.17 - enum MessageLevel {
18.18 - /// no output (default value)
18.19 - MESSAGE_NO_OUTPUT = 0,
18.20 - /// print final solution
18.21 - MESSAGE_FINAL_SOLUTION = 1,
18.22 - /// print factorization
18.23 - MESSAGE_FACTORIZATION = 2,
18.24 - /// normal output
18.25 - MESSAGE_NORMAL_OUTPUT = 3,
18.26 - /// verbose output
18.27 - MESSAGE_VERBOSE_OUTPUT = 4
18.28 - };
18.29 - ///Set the verbosity of the messages
18.30 -
18.31 - ///Set the verbosity of the messages
18.32 - ///
18.33 - ///\param m is the level of the messages output by the solver routines.
18.34 - void messageLevel(MessageLevel m);
18.35 -
18.36 };
18.37
18.38 } //END OF NAMESPACE LEMON
19.1 --- a/lemon/concepts/digraph.h Sat Apr 18 21:54:30 2009 +0200
19.2 +++ b/lemon/concepts/digraph.h Tue Apr 21 10:34:49 2009 +0100
19.3 @@ -421,12 +421,11 @@
19.4 /// Gives back the opposite node on the given arc.
19.5 Node oppositeNode(const Node&, const Arc&) const { return INVALID; }
19.6
19.7 - /// \brief Read write map of the nodes to type \c T.
19.8 + /// \brief Reference map of the nodes to type \c T.
19.9 ///
19.10 - /// ReadWrite map of the nodes to type \c T.
19.11 - /// \sa Reference
19.12 + /// Reference map of the nodes to type \c T.
19.13 template<class T>
19.14 - class NodeMap : public ReadWriteMap< Node, T > {
19.15 + class NodeMap : public ReferenceMap<Node, T, T&, const T&> {
19.16 public:
19.17
19.18 ///\e
19.19 @@ -436,7 +435,8 @@
19.20
19.21 private:
19.22 ///Copy constructor
19.23 - NodeMap(const NodeMap& nm) : ReadWriteMap< Node, T >(nm) { }
19.24 + NodeMap(const NodeMap& nm) :
19.25 + ReferenceMap<Node, T, T&, const T&>(nm) { }
19.26 ///Assignment operator
19.27 template <typename CMap>
19.28 NodeMap& operator=(const CMap&) {
19.29 @@ -445,12 +445,11 @@
19.30 }
19.31 };
19.32
19.33 - /// \brief Read write map of the arcs to type \c T.
19.34 + /// \brief Reference map of the arcs to type \c T.
19.35 ///
19.36 /// Reference map of the arcs to type \c T.
19.37 - /// \sa Reference
19.38 template<class T>
19.39 - class ArcMap : public ReadWriteMap<Arc,T> {
19.40 + class ArcMap : public ReferenceMap<Arc, T, T&, const T&> {
19.41 public:
19.42
19.43 ///\e
19.44 @@ -459,7 +458,8 @@
19.45 ArcMap(const Digraph&, T) { }
19.46 private:
19.47 ///Copy constructor
19.48 - ArcMap(const ArcMap& em) : ReadWriteMap<Arc,T>(em) { }
19.49 + ArcMap(const ArcMap& em) :
19.50 + ReferenceMap<Arc, T, T&, const T&>(em) { }
19.51 ///Assignment operator
19.52 template <typename CMap>
19.53 ArcMap& operator=(const CMap&) {
19.54 @@ -471,6 +471,7 @@
19.55 template <typename _Digraph>
19.56 struct Constraints {
19.57 void constraints() {
19.58 + checkConcept<BaseDigraphComponent, _Digraph>();
19.59 checkConcept<IterableDigraphComponent<>, _Digraph>();
19.60 checkConcept<IDableDigraphComponent<>, _Digraph>();
19.61 checkConcept<MappableDigraphComponent<>, _Digraph>();
20.1 --- a/lemon/concepts/graph.h Sat Apr 18 21:54:30 2009 +0200
20.2 +++ b/lemon/concepts/graph.h Tue Apr 21 10:34:49 2009 +0100
20.3 @@ -497,12 +497,11 @@
20.4 InArcIt& operator++() { return *this; }
20.5 };
20.6
20.7 - /// \brief Read write map of the nodes to type \c T.
20.8 + /// \brief Reference map of the nodes to type \c T.
20.9 ///
20.10 - /// ReadWrite map of the nodes to type \c T.
20.11 - /// \sa Reference
20.12 + /// Reference map of the nodes to type \c T.
20.13 template<class T>
20.14 - class NodeMap : public ReadWriteMap< Node, T >
20.15 + class NodeMap : public ReferenceMap<Node, T, T&, const T&>
20.16 {
20.17 public:
20.18
20.19 @@ -513,7 +512,8 @@
20.20
20.21 private:
20.22 ///Copy constructor
20.23 - NodeMap(const NodeMap& nm) : ReadWriteMap< Node, T >(nm) { }
20.24 + NodeMap(const NodeMap& nm) :
20.25 + ReferenceMap<Node, T, T&, const T&>(nm) { }
20.26 ///Assignment operator
20.27 template <typename CMap>
20.28 NodeMap& operator=(const CMap&) {
20.29 @@ -522,12 +522,11 @@
20.30 }
20.31 };
20.32
20.33 - /// \brief Read write map of the directed arcs to type \c T.
20.34 + /// \brief Reference map of the arcs to type \c T.
20.35 ///
20.36 - /// Reference map of the directed arcs to type \c T.
20.37 - /// \sa Reference
20.38 + /// Reference map of the arcs to type \c T.
20.39 template<class T>
20.40 - class ArcMap : public ReadWriteMap<Arc,T>
20.41 + class ArcMap : public ReferenceMap<Arc, T, T&, const T&>
20.42 {
20.43 public:
20.44
20.45 @@ -537,7 +536,8 @@
20.46 ArcMap(const Graph&, T) { }
20.47 private:
20.48 ///Copy constructor
20.49 - ArcMap(const ArcMap& em) : ReadWriteMap<Arc,T>(em) { }
20.50 + ArcMap(const ArcMap& em) :
20.51 + ReferenceMap<Arc, T, T&, const T&>(em) { }
20.52 ///Assignment operator
20.53 template <typename CMap>
20.54 ArcMap& operator=(const CMap&) {
20.55 @@ -546,12 +546,11 @@
20.56 }
20.57 };
20.58
20.59 - /// Read write map of the edges to type \c T.
20.60 + /// Reference map of the edges to type \c T.
20.61
20.62 - /// Reference map of the arcs to type \c T.
20.63 - /// \sa Reference
20.64 + /// Reference map of the edges to type \c T.
20.65 template<class T>
20.66 - class EdgeMap : public ReadWriteMap<Edge,T>
20.67 + class EdgeMap : public ReferenceMap<Edge, T, T&, const T&>
20.68 {
20.69 public:
20.70
20.71 @@ -561,7 +560,8 @@
20.72 EdgeMap(const Graph&, T) { }
20.73 private:
20.74 ///Copy constructor
20.75 - EdgeMap(const EdgeMap& em) : ReadWriteMap<Edge,T>(em) {}
20.76 + EdgeMap(const EdgeMap& em) :
20.77 + ReferenceMap<Edge, T, T&, const T&>(em) {}
20.78 ///Assignment operator
20.79 template <typename CMap>
20.80 EdgeMap& operator=(const CMap&) {
20.81 @@ -748,6 +748,7 @@
20.82 template <typename _Graph>
20.83 struct Constraints {
20.84 void constraints() {
20.85 + checkConcept<BaseGraphComponent, _Graph>();
20.86 checkConcept<IterableGraphComponent<>, _Graph>();
20.87 checkConcept<IDableGraphComponent<>, _Graph>();
20.88 checkConcept<MappableGraphComponent<>, _Graph>();
21.1 --- a/lemon/concepts/graph_components.h Sat Apr 18 21:54:30 2009 +0200
21.2 +++ b/lemon/concepts/graph_components.h Tue Apr 21 10:34:49 2009 +0100
21.3 @@ -31,17 +31,16 @@
21.4 namespace lemon {
21.5 namespace concepts {
21.6
21.7 - /// \brief Skeleton class for graph Node and Arc types
21.8 + /// \brief Concept class for \c Node, \c Arc and \c Edge types.
21.9 ///
21.10 - /// This class describes the interface of Node and Arc (and Edge
21.11 - /// in undirected graphs) subtypes of graph types.
21.12 + /// This class describes the concept of \c Node, \c Arc and \c Edge
21.13 + /// subtypes of digraph and graph types.
21.14 ///
21.15 /// \note This class is a template class so that we can use it to
21.16 - /// create graph skeleton classes. The reason for this is than Node
21.17 - /// and Arc types should \em not derive from the same base class.
21.18 - /// For Node you should instantiate it with character 'n' and for Arc
21.19 - /// with 'a'.
21.20 -
21.21 + /// create graph skeleton classes. The reason for this is that \c Node
21.22 + /// and \c Arc (or \c Edge) types should \e not derive from the same
21.23 + /// base class. For \c Node you should instantiate it with character
21.24 + /// \c 'n', for \c Arc with \c 'a' and for \c Edge with \c 'e'.
21.25 #ifndef DOXYGEN
21.26 template <char sel = '0'>
21.27 #endif
21.28 @@ -49,45 +48,49 @@
21.29 public:
21.30 /// \brief Default constructor.
21.31 ///
21.32 + /// Default constructor.
21.33 /// \warning The default constructor is not required to set
21.34 /// the item to some well-defined value. So you should consider it
21.35 /// as uninitialized.
21.36 GraphItem() {}
21.37 +
21.38 /// \brief Copy constructor.
21.39 ///
21.40 /// Copy constructor.
21.41 + GraphItem(const GraphItem &) {}
21.42 +
21.43 + /// \brief Constructor for conversion from \c INVALID.
21.44 ///
21.45 - GraphItem(const GraphItem &) {}
21.46 - /// \brief Invalid constructor \& conversion.
21.47 - ///
21.48 - /// This constructor initializes the item to be invalid.
21.49 + /// Constructor for conversion from \c INVALID.
21.50 + /// It initializes the item to be invalid.
21.51 /// \sa Invalid for more details.
21.52 GraphItem(Invalid) {}
21.53 - /// \brief Assign operator for nodes.
21.54 +
21.55 + /// \brief Assignment operator.
21.56 ///
21.57 - /// The nodes are assignable.
21.58 - ///
21.59 - GraphItem& operator=(GraphItem const&) { return *this; }
21.60 + /// Assignment operator for the item.
21.61 + GraphItem& operator=(const GraphItem&) { return *this; }
21.62 +
21.63 /// \brief Equality operator.
21.64 ///
21.65 - /// Two iterators are equal if and only if they represents the
21.66 - /// same node in the graph or both are invalid.
21.67 - bool operator==(GraphItem) const { return false; }
21.68 + /// Equality operator.
21.69 + bool operator==(const GraphItem&) const { return false; }
21.70 +
21.71 /// \brief Inequality operator.
21.72 ///
21.73 - /// \sa operator==(const Node& n)
21.74 + /// Inequality operator.
21.75 + bool operator!=(const GraphItem&) const { return false; }
21.76 +
21.77 + /// \brief Ordering operator.
21.78 ///
21.79 - bool operator!=(GraphItem) const { return false; }
21.80 -
21.81 - /// \brief Artificial ordering operator.
21.82 - ///
21.83 - /// To allow the use of graph descriptors as key type in std::map or
21.84 - /// similar associative container we require this.
21.85 + /// This operator defines an ordering of the items.
21.86 + /// It makes possible to use graph item types as key types in
21.87 + /// associative containers (e.g. \c std::map).
21.88 ///
21.89 /// \note This operator only have to define some strict ordering of
21.90 /// the items; this order has nothing to do with the iteration
21.91 /// ordering of the items.
21.92 - bool operator<(GraphItem) const { return false; }
21.93 + bool operator<(const GraphItem&) const { return false; }
21.94
21.95 template<typename _GraphItem>
21.96 struct Constraints {
21.97 @@ -99,7 +102,6 @@
21.98 i1 = i2 = i3;
21.99
21.100 bool b;
21.101 - // b = (ia == ib) && (ia != ib) && (ia < ib);
21.102 b = (ia == ib) && (ia != ib);
21.103 b = (ia == INVALID) && (ib != INVALID);
21.104 b = (ia < ib);
21.105 @@ -110,13 +112,12 @@
21.106 };
21.107 };
21.108
21.109 - /// \brief An empty base directed graph class.
21.110 + /// \brief Base skeleton class for directed graphs.
21.111 ///
21.112 - /// This class provides the minimal set of features needed for a
21.113 - /// directed graph structure. All digraph concepts have to
21.114 - /// conform to this base directed graph. It just provides types
21.115 - /// for nodes and arcs and functions to get the source and the
21.116 - /// target of the arcs.
21.117 + /// This class describes the base interface of directed graph types.
21.118 + /// All digraph %concepts have to conform to this class.
21.119 + /// It just provides types for nodes and arcs and functions
21.120 + /// to get the source and the target nodes of arcs.
21.121 class BaseDigraphComponent {
21.122 public:
21.123
21.124 @@ -124,31 +125,27 @@
21.125
21.126 /// \brief Node class of the digraph.
21.127 ///
21.128 - /// This class represents the Nodes of the digraph.
21.129 - ///
21.130 + /// This class represents the nodes of the digraph.
21.131 typedef GraphItem<'n'> Node;
21.132
21.133 /// \brief Arc class of the digraph.
21.134 ///
21.135 - /// This class represents the Arcs of the digraph.
21.136 + /// This class represents the arcs of the digraph.
21.137 + typedef GraphItem<'a'> Arc;
21.138 +
21.139 + /// \brief Return the source node of an arc.
21.140 ///
21.141 - typedef GraphItem<'e'> Arc;
21.142 + /// This function returns the source node of an arc.
21.143 + Node source(const Arc&) const { return INVALID; }
21.144
21.145 - /// \brief Gives back the target node of an arc.
21.146 + /// \brief Return the target node of an arc.
21.147 ///
21.148 - /// Gives back the target node of an arc.
21.149 + /// This function returns the target node of an arc.
21.150 + Node target(const Arc&) const { return INVALID; }
21.151 +
21.152 + /// \brief Return the opposite node on the given arc.
21.153 ///
21.154 - Node target(const Arc&) const { return INVALID;}
21.155 -
21.156 - /// \brief Gives back the source node of an arc.
21.157 - ///
21.158 - /// Gives back the source node of an arc.
21.159 - ///
21.160 - Node source(const Arc&) const { return INVALID;}
21.161 -
21.162 - /// \brief Gives back the opposite node on the given arc.
21.163 - ///
21.164 - /// Gives back the opposite node on the given arc.
21.165 + /// This function returns the opposite node on the given arc.
21.166 Node oppositeNode(const Node&, const Arc&) const {
21.167 return INVALID;
21.168 }
21.169 @@ -174,91 +171,96 @@
21.170 };
21.171 };
21.172
21.173 - /// \brief An empty base undirected graph class.
21.174 + /// \brief Base skeleton class for undirected graphs.
21.175 ///
21.176 - /// This class provides the minimal set of features needed for an
21.177 - /// undirected graph structure. All undirected graph concepts have
21.178 - /// to conform to this base graph. It just provides types for
21.179 - /// nodes, arcs and edges and functions to get the
21.180 - /// source and the target of the arcs and edges,
21.181 - /// conversion from arcs to edges and function to get
21.182 - /// both direction of the edges.
21.183 + /// This class describes the base interface of undirected graph types.
21.184 + /// All graph %concepts have to conform to this class.
21.185 + /// It extends the interface of \ref BaseDigraphComponent with an
21.186 + /// \c Edge type and functions to get the end nodes of edges,
21.187 + /// to convert from arcs to edges and to get both direction of edges.
21.188 class BaseGraphComponent : public BaseDigraphComponent {
21.189 public:
21.190 typedef BaseDigraphComponent::Node Node;
21.191 typedef BaseDigraphComponent::Arc Arc;
21.192 - /// \brief Undirected arc class of the graph.
21.193 +
21.194 + /// \brief Undirected edge class of the graph.
21.195 ///
21.196 - /// This class represents the edges of the graph.
21.197 - /// The undirected graphs can be used as a directed graph which
21.198 - /// for each arc contains the opposite arc too so the graph is
21.199 - /// bidirected. The edge represents two opposite
21.200 - /// directed arcs.
21.201 - class Edge : public GraphItem<'u'> {
21.202 + /// This class represents the undirected edges of the graph.
21.203 + /// Undirected graphs can be used as directed graphs, each edge is
21.204 + /// represented by two opposite directed arcs.
21.205 + class Edge : public GraphItem<'e'> {
21.206 public:
21.207 - typedef GraphItem<'u'> Parent;
21.208 + typedef GraphItem<'e'> Parent;
21.209 +
21.210 /// \brief Default constructor.
21.211 ///
21.212 + /// Default constructor.
21.213 /// \warning The default constructor is not required to set
21.214 /// the item to some well-defined value. So you should consider it
21.215 /// as uninitialized.
21.216 Edge() {}
21.217 +
21.218 /// \brief Copy constructor.
21.219 ///
21.220 /// Copy constructor.
21.221 + Edge(const Edge &) : Parent() {}
21.222 +
21.223 + /// \brief Constructor for conversion from \c INVALID.
21.224 ///
21.225 - Edge(const Edge &) : Parent() {}
21.226 - /// \brief Invalid constructor \& conversion.
21.227 - ///
21.228 - /// This constructor initializes the item to be invalid.
21.229 + /// Constructor for conversion from \c INVALID.
21.230 + /// It initializes the item to be invalid.
21.231 /// \sa Invalid for more details.
21.232 Edge(Invalid) {}
21.233 - /// \brief Converter from arc to edge.
21.234 +
21.235 + /// \brief Constructor for conversion from an arc.
21.236 ///
21.237 + /// Constructor for conversion from an arc.
21.238 /// Besides the core graph item functionality each arc should
21.239 /// be convertible to the represented edge.
21.240 Edge(const Arc&) {}
21.241 - /// \brief Assign arc to edge.
21.242 +
21.243 + /// \brief Assign an arc to an edge.
21.244 ///
21.245 + /// This function assigns an arc to an edge.
21.246 /// Besides the core graph item functionality each arc should
21.247 /// be convertible to the represented edge.
21.248 Edge& operator=(const Arc&) { return *this; }
21.249 };
21.250
21.251 - /// \brief Returns the direction of the arc.
21.252 + /// \brief Return one end node of an edge.
21.253 + ///
21.254 + /// This function returns one end node of an edge.
21.255 + Node u(const Edge&) const { return INVALID; }
21.256 +
21.257 + /// \brief Return the other end node of an edge.
21.258 + ///
21.259 + /// This function returns the other end node of an edge.
21.260 + Node v(const Edge&) const { return INVALID; }
21.261 +
21.262 + /// \brief Return a directed arc related to an edge.
21.263 + ///
21.264 + /// This function returns a directed arc from its direction and the
21.265 + /// represented edge.
21.266 + Arc direct(const Edge&, bool) const { return INVALID; }
21.267 +
21.268 + /// \brief Return a directed arc related to an edge.
21.269 + ///
21.270 + /// This function returns a directed arc from its source node and the
21.271 + /// represented edge.
21.272 + Arc direct(const Edge&, const Node&) const { return INVALID; }
21.273 +
21.274 + /// \brief Return the direction of the arc.
21.275 ///
21.276 /// Returns the direction of the arc. Each arc represents an
21.277 /// edge with a direction. It gives back the
21.278 /// direction.
21.279 bool direction(const Arc&) const { return true; }
21.280
21.281 - /// \brief Returns the directed arc.
21.282 + /// \brief Return the opposite arc.
21.283 ///
21.284 - /// Returns the directed arc from its direction and the
21.285 - /// represented edge.
21.286 - Arc direct(const Edge&, bool) const { return INVALID;}
21.287 -
21.288 - /// \brief Returns the directed arc.
21.289 - ///
21.290 - /// Returns the directed arc from its source and the
21.291 - /// represented edge.
21.292 - Arc direct(const Edge&, const Node&) const { return INVALID;}
21.293 -
21.294 - /// \brief Returns the opposite arc.
21.295 - ///
21.296 - /// Returns the opposite arc. It is the arc representing the
21.297 - /// same edge and has opposite direction.
21.298 - Arc oppositeArc(const Arc&) const { return INVALID;}
21.299 -
21.300 - /// \brief Gives back one ending of an edge.
21.301 - ///
21.302 - /// Gives back one ending of an edge.
21.303 - Node u(const Edge&) const { return INVALID;}
21.304 -
21.305 - /// \brief Gives back the other ending of an edge.
21.306 - ///
21.307 - /// Gives back the other ending of an edge.
21.308 - Node v(const Edge&) const { return INVALID;}
21.309 + /// This function returns the opposite arc, i.e. the arc representing
21.310 + /// the same edge and has opposite direction.
21.311 + Arc oppositeArc(const Arc&) const { return INVALID; }
21.312
21.313 template <typename _Graph>
21.314 struct Constraints {
21.315 @@ -268,7 +270,7 @@
21.316
21.317 void constraints() {
21.318 checkConcept<BaseDigraphComponent, _Graph>();
21.319 - checkConcept<GraphItem<'u'>, Edge>();
21.320 + checkConcept<GraphItem<'e'>, Edge>();
21.321 {
21.322 Node n;
21.323 Edge ue(INVALID);
21.324 @@ -276,6 +278,7 @@
21.325 n = graph.u(ue);
21.326 n = graph.v(ue);
21.327 e = graph.direct(ue, true);
21.328 + e = graph.direct(ue, false);
21.329 e = graph.direct(ue, n);
21.330 e = graph.oppositeArc(e);
21.331 ue = e;
21.332 @@ -289,12 +292,12 @@
21.333
21.334 };
21.335
21.336 - /// \brief An empty idable base digraph class.
21.337 + /// \brief Skeleton class for \e idable directed graphs.
21.338 ///
21.339 - /// This class provides beside the core digraph features
21.340 - /// core id functions for the digraph structure.
21.341 - /// The most of the base digraphs should conform to this concept.
21.342 - /// The id's are unique and immutable.
21.343 + /// This class describes the interface of \e idable directed graphs.
21.344 + /// It extends \ref BaseDigraphComponent with the core ID functions.
21.345 + /// The ids of the items must be unique and immutable.
21.346 + /// This concept is part of the Digraph concept.
21.347 template <typename BAS = BaseDigraphComponent>
21.348 class IDableDigraphComponent : public BAS {
21.349 public:
21.350 @@ -303,45 +306,43 @@
21.351 typedef typename Base::Node Node;
21.352 typedef typename Base::Arc Arc;
21.353
21.354 - /// \brief Gives back an unique integer id for the Node.
21.355 + /// \brief Return a unique integer id for the given node.
21.356 ///
21.357 - /// Gives back an unique integer id for the Node.
21.358 + /// This function returns a unique integer id for the given node.
21.359 + int id(const Node&) const { return -1; }
21.360 +
21.361 + /// \brief Return the node by its unique id.
21.362 ///
21.363 - int id(const Node&) const { return -1;}
21.364 + /// This function returns the node by its unique id.
21.365 + /// If the digraph does not contain a node with the given id,
21.366 + /// then the result of the function is undefined.
21.367 + Node nodeFromId(int) const { return INVALID; }
21.368
21.369 - /// \brief Gives back the node by the unique id.
21.370 + /// \brief Return a unique integer id for the given arc.
21.371 ///
21.372 - /// Gives back the node by the unique id.
21.373 - /// If the digraph does not contain node with the given id
21.374 - /// then the result of the function is undetermined.
21.375 - Node nodeFromId(int) const { return INVALID;}
21.376 + /// This function returns a unique integer id for the given arc.
21.377 + int id(const Arc&) const { return -1; }
21.378
21.379 - /// \brief Gives back an unique integer id for the Arc.
21.380 + /// \brief Return the arc by its unique id.
21.381 ///
21.382 - /// Gives back an unique integer id for the Arc.
21.383 + /// This function returns the arc by its unique id.
21.384 + /// If the digraph does not contain an arc with the given id,
21.385 + /// then the result of the function is undefined.
21.386 + Arc arcFromId(int) const { return INVALID; }
21.387 +
21.388 + /// \brief Return an integer greater or equal to the maximum
21.389 + /// node id.
21.390 ///
21.391 - int id(const Arc&) const { return -1;}
21.392 + /// This function returns an integer greater or equal to the
21.393 + /// maximum node id.
21.394 + int maxNodeId() const { return -1; }
21.395
21.396 - /// \brief Gives back the arc by the unique id.
21.397 + /// \brief Return an integer greater or equal to the maximum
21.398 + /// arc id.
21.399 ///
21.400 - /// Gives back the arc by the unique id.
21.401 - /// If the digraph does not contain arc with the given id
21.402 - /// then the result of the function is undetermined.
21.403 - Arc arcFromId(int) const { return INVALID;}
21.404 -
21.405 - /// \brief Gives back an integer greater or equal to the maximum
21.406 - /// Node id.
21.407 - ///
21.408 - /// Gives back an integer greater or equal to the maximum Node
21.409 - /// id.
21.410 - int maxNodeId() const { return -1;}
21.411 -
21.412 - /// \brief Gives back an integer greater or equal to the maximum
21.413 - /// Arc id.
21.414 - ///
21.415 - /// Gives back an integer greater or equal to the maximum Arc
21.416 - /// id.
21.417 - int maxArcId() const { return -1;}
21.418 + /// This function returns an integer greater or equal to the
21.419 + /// maximum arc id.
21.420 + int maxArcId() const { return -1; }
21.421
21.422 template <typename _Digraph>
21.423 struct Constraints {
21.424 @@ -367,12 +368,13 @@
21.425 };
21.426 };
21.427
21.428 - /// \brief An empty idable base undirected graph class.
21.429 + /// \brief Skeleton class for \e idable undirected graphs.
21.430 ///
21.431 - /// This class provides beside the core undirected graph features
21.432 - /// core id functions for the undirected graph structure. The
21.433 - /// most of the base undirected graphs should conform to this
21.434 - /// concept. The id's are unique and immutable.
21.435 + /// This class describes the interface of \e idable undirected
21.436 + /// graphs. It extends \ref IDableDigraphComponent with the core ID
21.437 + /// functions of undirected graphs.
21.438 + /// The ids of the items must be unique and immutable.
21.439 + /// This concept is part of the Graph concept.
21.440 template <typename BAS = BaseGraphComponent>
21.441 class IDableGraphComponent : public IDableDigraphComponent<BAS> {
21.442 public:
21.443 @@ -382,31 +384,29 @@
21.444
21.445 using IDableDigraphComponent<Base>::id;
21.446
21.447 - /// \brief Gives back an unique integer id for the Edge.
21.448 + /// \brief Return a unique integer id for the given edge.
21.449 ///
21.450 - /// Gives back an unique integer id for the Edge.
21.451 + /// This function returns a unique integer id for the given edge.
21.452 + int id(const Edge&) const { return -1; }
21.453 +
21.454 + /// \brief Return the edge by its unique id.
21.455 ///
21.456 - int id(const Edge&) const { return -1;}
21.457 + /// This function returns the edge by its unique id.
21.458 + /// If the graph does not contain an edge with the given id,
21.459 + /// then the result of the function is undefined.
21.460 + Edge edgeFromId(int) const { return INVALID; }
21.461
21.462 - /// \brief Gives back the edge by the unique id.
21.463 + /// \brief Return an integer greater or equal to the maximum
21.464 + /// edge id.
21.465 ///
21.466 - /// Gives back the edge by the unique id. If the
21.467 - /// graph does not contain arc with the given id then the
21.468 - /// result of the function is undetermined.
21.469 - Edge edgeFromId(int) const { return INVALID;}
21.470 -
21.471 - /// \brief Gives back an integer greater or equal to the maximum
21.472 - /// Edge id.
21.473 - ///
21.474 - /// Gives back an integer greater or equal to the maximum Edge
21.475 - /// id.
21.476 - int maxEdgeId() const { return -1;}
21.477 + /// This function returns an integer greater or equal to the
21.478 + /// maximum edge id.
21.479 + int maxEdgeId() const { return -1; }
21.480
21.481 template <typename _Graph>
21.482 struct Constraints {
21.483
21.484 void constraints() {
21.485 - checkConcept<Base, _Graph >();
21.486 checkConcept<IDableDigraphComponent<Base>, _Graph >();
21.487 typename _Graph::Edge edge;
21.488 int ueid = graph.id(edge);
21.489 @@ -420,59 +420,71 @@
21.490 };
21.491 };
21.492
21.493 - /// \brief Skeleton class for graph NodeIt and ArcIt
21.494 + /// \brief Concept class for \c NodeIt, \c ArcIt and \c EdgeIt types.
21.495 ///
21.496 - /// Skeleton class for graph NodeIt and ArcIt.
21.497 - ///
21.498 + /// This class describes the concept of \c NodeIt, \c ArcIt and
21.499 + /// \c EdgeIt subtypes of digraph and graph types.
21.500 template <typename GR, typename Item>
21.501 class GraphItemIt : public Item {
21.502 public:
21.503 /// \brief Default constructor.
21.504 ///
21.505 - /// @warning The default constructor sets the iterator
21.506 - /// to an undefined value.
21.507 + /// Default constructor.
21.508 + /// \warning The default constructor is not required to set
21.509 + /// the iterator to some well-defined value. So you should consider it
21.510 + /// as uninitialized.
21.511 GraphItemIt() {}
21.512 +
21.513 /// \brief Copy constructor.
21.514 ///
21.515 /// Copy constructor.
21.516 + GraphItemIt(const GraphItemIt& it) : Item(it) {}
21.517 +
21.518 + /// \brief Constructor that sets the iterator to the first item.
21.519 ///
21.520 - GraphItemIt(const GraphItemIt& ) {}
21.521 - /// \brief Sets the iterator to the first item.
21.522 + /// Constructor that sets the iterator to the first item.
21.523 + explicit GraphItemIt(const GR&) {}
21.524 +
21.525 + /// \brief Constructor for conversion from \c INVALID.
21.526 ///
21.527 - /// Sets the iterator to the first item of \c the graph.
21.528 - ///
21.529 - explicit GraphItemIt(const GR&) {}
21.530 - /// \brief Invalid constructor \& conversion.
21.531 - ///
21.532 - /// This constructor initializes the item to be invalid.
21.533 + /// Constructor for conversion from \c INVALID.
21.534 + /// It initializes the iterator to be invalid.
21.535 /// \sa Invalid for more details.
21.536 GraphItemIt(Invalid) {}
21.537 - /// \brief Assign operator for items.
21.538 +
21.539 + /// \brief Assignment operator.
21.540 ///
21.541 - /// The items are assignable.
21.542 + /// Assignment operator for the iterator.
21.543 + GraphItemIt& operator=(const GraphItemIt&) { return *this; }
21.544 +
21.545 + /// \brief Increment the iterator.
21.546 ///
21.547 - GraphItemIt& operator=(const GraphItemIt&) { return *this; }
21.548 - /// \brief Next item.
21.549 - ///
21.550 - /// Assign the iterator to the next item.
21.551 - ///
21.552 + /// This operator increments the iterator, i.e. assigns it to the
21.553 + /// next item.
21.554 GraphItemIt& operator++() { return *this; }
21.555 +
21.556 /// \brief Equality operator
21.557 ///
21.558 + /// Equality operator.
21.559 /// Two iterators are equal if and only if they point to the
21.560 /// same object or both are invalid.
21.561 bool operator==(const GraphItemIt&) const { return true;}
21.562 +
21.563 /// \brief Inequality operator
21.564 ///
21.565 - /// \sa operator==(Node n)
21.566 - ///
21.567 + /// Inequality operator.
21.568 + /// Two iterators are equal if and only if they point to the
21.569 + /// same object or both are invalid.
21.570 bool operator!=(const GraphItemIt&) const { return true;}
21.571
21.572 template<typename _GraphItemIt>
21.573 struct Constraints {
21.574 void constraints() {
21.575 + checkConcept<GraphItem<>, _GraphItemIt>();
21.576 _GraphItemIt it1(g);
21.577 _GraphItemIt it2;
21.578 + _GraphItemIt it3 = it1;
21.579 + _GraphItemIt it4 = INVALID;
21.580
21.581 it2 = ++it1;
21.582 ++it2 = it1;
21.583 @@ -481,16 +493,20 @@
21.584 Item bi = it1;
21.585 bi = it2;
21.586 }
21.587 - GR& g;
21.588 + const GR& g;
21.589 };
21.590 };
21.591
21.592 - /// \brief Skeleton class for graph InArcIt and OutArcIt
21.593 + /// \brief Concept class for \c InArcIt, \c OutArcIt and
21.594 + /// \c IncEdgeIt types.
21.595 ///
21.596 - /// \note Because InArcIt and OutArcIt may not inherit from the same
21.597 - /// base class, the \c sel is a additional template parameter (selector).
21.598 - /// For InArcIt you should instantiate it with character 'i' and for
21.599 - /// OutArcIt with 'o'.
21.600 + /// This class describes the concept of \c InArcIt, \c OutArcIt
21.601 + /// and \c IncEdgeIt subtypes of digraph and graph types.
21.602 + ///
21.603 + /// \note Since these iterator classes do not inherit from the same
21.604 + /// base class, there is an additional template parameter (selector)
21.605 + /// \c sel. For \c InArcIt you should instantiate it with character
21.606 + /// \c 'i', for \c OutArcIt with \c 'o' and for \c IncEdgeIt with \c 'e'.
21.607 template <typename GR,
21.608 typename Item = typename GR::Arc,
21.609 typename Base = typename GR::Node,
21.610 @@ -499,47 +515,54 @@
21.611 public:
21.612 /// \brief Default constructor.
21.613 ///
21.614 - /// @warning The default constructor sets the iterator
21.615 - /// to an undefined value.
21.616 + /// Default constructor.
21.617 + /// \warning The default constructor is not required to set
21.618 + /// the iterator to some well-defined value. So you should consider it
21.619 + /// as uninitialized.
21.620 GraphIncIt() {}
21.621 +
21.622 /// \brief Copy constructor.
21.623 ///
21.624 /// Copy constructor.
21.625 + GraphIncIt(const GraphIncIt& it) : Item(it) {}
21.626 +
21.627 + /// \brief Constructor that sets the iterator to the first
21.628 + /// incoming or outgoing arc.
21.629 ///
21.630 - GraphIncIt(GraphIncIt const& gi) : Item(gi) {}
21.631 - /// \brief Sets the iterator to the first arc incoming into or outgoing
21.632 - /// from the node.
21.633 + /// Constructor that sets the iterator to the first arc
21.634 + /// incoming to or outgoing from the given node.
21.635 + explicit GraphIncIt(const GR&, const Base&) {}
21.636 +
21.637 + /// \brief Constructor for conversion from \c INVALID.
21.638 ///
21.639 - /// Sets the iterator to the first arc incoming into or outgoing
21.640 - /// from the node.
21.641 - ///
21.642 - explicit GraphIncIt(const GR&, const Base&) {}
21.643 - /// \brief Invalid constructor \& conversion.
21.644 - ///
21.645 - /// This constructor initializes the item to be invalid.
21.646 + /// Constructor for conversion from \c INVALID.
21.647 + /// It initializes the iterator to be invalid.
21.648 /// \sa Invalid for more details.
21.649 GraphIncIt(Invalid) {}
21.650 - /// \brief Assign operator for iterators.
21.651 +
21.652 + /// \brief Assignment operator.
21.653 ///
21.654 - /// The iterators are assignable.
21.655 + /// Assignment operator for the iterator.
21.656 + GraphIncIt& operator=(const GraphIncIt&) { return *this; }
21.657 +
21.658 + /// \brief Increment the iterator.
21.659 ///
21.660 - GraphIncIt& operator=(GraphIncIt const&) { return *this; }
21.661 - /// \brief Next item.
21.662 - ///
21.663 - /// Assign the iterator to the next item.
21.664 - ///
21.665 + /// This operator increments the iterator, i.e. assigns it to the
21.666 + /// next arc incoming to or outgoing from the given node.
21.667 GraphIncIt& operator++() { return *this; }
21.668
21.669 /// \brief Equality operator
21.670 ///
21.671 + /// Equality operator.
21.672 /// Two iterators are equal if and only if they point to the
21.673 /// same object or both are invalid.
21.674 bool operator==(const GraphIncIt&) const { return true;}
21.675
21.676 /// \brief Inequality operator
21.677 ///
21.678 - /// \sa operator==(Node n)
21.679 - ///
21.680 + /// Inequality operator.
21.681 + /// Two iterators are equal if and only if they point to the
21.682 + /// same object or both are invalid.
21.683 bool operator!=(const GraphIncIt&) const { return true;}
21.684
21.685 template <typename _GraphIncIt>
21.686 @@ -548,27 +571,25 @@
21.687 checkConcept<GraphItem<sel>, _GraphIncIt>();
21.688 _GraphIncIt it1(graph, node);
21.689 _GraphIncIt it2;
21.690 + _GraphIncIt it3 = it1;
21.691 + _GraphIncIt it4 = INVALID;
21.692
21.693 it2 = ++it1;
21.694 ++it2 = it1;
21.695 ++(++it1);
21.696 Item e = it1;
21.697 e = it2;
21.698 -
21.699 }
21.700 -
21.701 - Item arc;
21.702 - Base node;
21.703 - GR graph;
21.704 - _GraphIncIt it;
21.705 + const Base& node;
21.706 + const GR& graph;
21.707 };
21.708 };
21.709
21.710 -
21.711 - /// \brief An empty iterable digraph class.
21.712 + /// \brief Skeleton class for iterable directed graphs.
21.713 ///
21.714 - /// This class provides beside the core digraph features
21.715 - /// iterator based iterable interface for the digraph structure.
21.716 + /// This class describes the interface of iterable directed
21.717 + /// graphs. It extends \ref BaseDigraphComponent with the core
21.718 + /// iterable interface.
21.719 /// This concept is part of the Digraph concept.
21.720 template <typename BAS = BaseDigraphComponent>
21.721 class IterableDigraphComponent : public BAS {
21.722 @@ -581,70 +602,61 @@
21.723
21.724 typedef IterableDigraphComponent Digraph;
21.725
21.726 - /// \name Base iteration
21.727 + /// \name Base Iteration
21.728 ///
21.729 - /// This interface provides functions for iteration on digraph items
21.730 + /// This interface provides functions for iteration on digraph items.
21.731 ///
21.732 /// @{
21.733
21.734 - /// \brief Gives back the first node in the iterating order.
21.735 + /// \brief Return the first node.
21.736 ///
21.737 - /// Gives back the first node in the iterating order.
21.738 - ///
21.739 + /// This function gives back the first node in the iteration order.
21.740 void first(Node&) const {}
21.741
21.742 - /// \brief Gives back the next node in the iterating order.
21.743 + /// \brief Return the next node.
21.744 ///
21.745 - /// Gives back the next node in the iterating order.
21.746 - ///
21.747 + /// This function gives back the next node in the iteration order.
21.748 void next(Node&) const {}
21.749
21.750 - /// \brief Gives back the first arc in the iterating order.
21.751 + /// \brief Return the first arc.
21.752 ///
21.753 - /// Gives back the first arc in the iterating order.
21.754 - ///
21.755 + /// This function gives back the first arc in the iteration order.
21.756 void first(Arc&) const {}
21.757
21.758 - /// \brief Gives back the next arc in the iterating order.
21.759 + /// \brief Return the next arc.
21.760 ///
21.761 - /// Gives back the next arc in the iterating order.
21.762 - ///
21.763 + /// This function gives back the next arc in the iteration order.
21.764 void next(Arc&) const {}
21.765
21.766 -
21.767 - /// \brief Gives back the first of the arcs point to the given
21.768 - /// node.
21.769 + /// \brief Return the first arc incomming to the given node.
21.770 ///
21.771 - /// Gives back the first of the arcs point to the given node.
21.772 - ///
21.773 + /// This function gives back the first arc incomming to the
21.774 + /// given node.
21.775 void firstIn(Arc&, const Node&) const {}
21.776
21.777 - /// \brief Gives back the next of the arcs points to the given
21.778 - /// node.
21.779 + /// \brief Return the next arc incomming to the given node.
21.780 ///
21.781 - /// Gives back the next of the arcs points to the given node.
21.782 - ///
21.783 + /// This function gives back the next arc incomming to the
21.784 + /// given node.
21.785 void nextIn(Arc&) const {}
21.786
21.787 - /// \brief Gives back the first of the arcs start from the
21.788 + /// \brief Return the first arc outgoing form the given node.
21.789 + ///
21.790 + /// This function gives back the first arc outgoing form the
21.791 /// given node.
21.792 - ///
21.793 - /// Gives back the first of the arcs start from the given node.
21.794 - ///
21.795 void firstOut(Arc&, const Node&) const {}
21.796
21.797 - /// \brief Gives back the next of the arcs start from the given
21.798 - /// node.
21.799 + /// \brief Return the next arc outgoing form the given node.
21.800 ///
21.801 - /// Gives back the next of the arcs start from the given node.
21.802 - ///
21.803 + /// This function gives back the next arc outgoing form the
21.804 + /// given node.
21.805 void nextOut(Arc&) const {}
21.806
21.807 /// @}
21.808
21.809 - /// \name Class based iteration
21.810 + /// \name Class Based Iteration
21.811 ///
21.812 - /// This interface provides functions for iteration on digraph items
21.813 + /// This interface provides iterator classes for digraph items.
21.814 ///
21.815 /// @{
21.816
21.817 @@ -654,15 +666,15 @@
21.818 ///
21.819 typedef GraphItemIt<Digraph, Node> NodeIt;
21.820
21.821 - /// \brief This iterator goes through each node.
21.822 + /// \brief This iterator goes through each arc.
21.823 ///
21.824 - /// This iterator goes through each node.
21.825 + /// This iterator goes through each arc.
21.826 ///
21.827 typedef GraphItemIt<Digraph, Arc> ArcIt;
21.828
21.829 /// \brief This iterator goes trough the incoming arcs of a node.
21.830 ///
21.831 - /// This iterator goes trough the \e inccoming arcs of a certain node
21.832 + /// This iterator goes trough the \e incoming arcs of a certain node
21.833 /// of a digraph.
21.834 typedef GraphIncIt<Digraph, Arc, Node, 'i'> InArcIt;
21.835
21.836 @@ -674,26 +686,26 @@
21.837
21.838 /// \brief The base node of the iterator.
21.839 ///
21.840 - /// Gives back the base node of the iterator.
21.841 - /// It is always the target of the pointed arc.
21.842 + /// This function gives back the base node of the iterator.
21.843 + /// It is always the target node of the pointed arc.
21.844 Node baseNode(const InArcIt&) const { return INVALID; }
21.845
21.846 /// \brief The running node of the iterator.
21.847 ///
21.848 - /// Gives back the running node of the iterator.
21.849 - /// It is always the source of the pointed arc.
21.850 + /// This function gives back the running node of the iterator.
21.851 + /// It is always the source node of the pointed arc.
21.852 Node runningNode(const InArcIt&) const { return INVALID; }
21.853
21.854 /// \brief The base node of the iterator.
21.855 ///
21.856 - /// Gives back the base node of the iterator.
21.857 - /// It is always the source of the pointed arc.
21.858 + /// This function gives back the base node of the iterator.
21.859 + /// It is always the source node of the pointed arc.
21.860 Node baseNode(const OutArcIt&) const { return INVALID; }
21.861
21.862 /// \brief The running node of the iterator.
21.863 ///
21.864 - /// Gives back the running node of the iterator.
21.865 - /// It is always the target of the pointed arc.
21.866 + /// This function gives back the running node of the iterator.
21.867 + /// It is always the target node of the pointed arc.
21.868 Node runningNode(const OutArcIt&) const { return INVALID; }
21.869
21.870 /// @}
21.871 @@ -735,25 +747,25 @@
21.872 typename _Digraph::Node, 'o'>, typename _Digraph::OutArcIt>();
21.873
21.874 typename _Digraph::Node n;
21.875 - typename _Digraph::InArcIt ieit(INVALID);
21.876 - typename _Digraph::OutArcIt oeit(INVALID);
21.877 - n = digraph.baseNode(ieit);
21.878 - n = digraph.runningNode(ieit);
21.879 - n = digraph.baseNode(oeit);
21.880 - n = digraph.runningNode(oeit);
21.881 + const typename _Digraph::InArcIt iait(INVALID);
21.882 + const typename _Digraph::OutArcIt oait(INVALID);
21.883 + n = digraph.baseNode(iait);
21.884 + n = digraph.runningNode(iait);
21.885 + n = digraph.baseNode(oait);
21.886 + n = digraph.runningNode(oait);
21.887 ignore_unused_variable_warning(n);
21.888 }
21.889 }
21.890
21.891 const _Digraph& digraph;
21.892 -
21.893 };
21.894 };
21.895
21.896 - /// \brief An empty iterable undirected graph class.
21.897 + /// \brief Skeleton class for iterable undirected graphs.
21.898 ///
21.899 - /// This class provides beside the core graph features iterator
21.900 - /// based iterable interface for the undirected graph structure.
21.901 + /// This class describes the interface of iterable undirected
21.902 + /// graphs. It extends \ref IterableDigraphComponent with the core
21.903 + /// iterable interface of undirected graphs.
21.904 /// This concept is part of the Graph concept.
21.905 template <typename BAS = BaseGraphComponent>
21.906 class IterableGraphComponent : public IterableDigraphComponent<BAS> {
21.907 @@ -767,44 +779,38 @@
21.908
21.909 typedef IterableGraphComponent Graph;
21.910
21.911 - /// \name Base iteration
21.912 + /// \name Base Iteration
21.913 ///
21.914 - /// This interface provides functions for iteration on graph items
21.915 + /// This interface provides functions for iteration on edges.
21.916 + ///
21.917 /// @{
21.918
21.919 using IterableDigraphComponent<Base>::first;
21.920 using IterableDigraphComponent<Base>::next;
21.921
21.922 - /// \brief Gives back the first edge in the iterating
21.923 - /// order.
21.924 + /// \brief Return the first edge.
21.925 ///
21.926 - /// Gives back the first edge in the iterating order.
21.927 - ///
21.928 + /// This function gives back the first edge in the iteration order.
21.929 void first(Edge&) const {}
21.930
21.931 - /// \brief Gives back the next edge in the iterating
21.932 - /// order.
21.933 + /// \brief Return the next edge.
21.934 ///
21.935 - /// Gives back the next edge in the iterating order.
21.936 - ///
21.937 + /// This function gives back the next edge in the iteration order.
21.938 void next(Edge&) const {}
21.939
21.940 -
21.941 - /// \brief Gives back the first of the edges from the
21.942 + /// \brief Return the first edge incident to the given node.
21.943 + ///
21.944 + /// This function gives back the first edge incident to the given
21.945 + /// node. The bool parameter gives back the direction for which the
21.946 + /// source node of the directed arc representing the edge is the
21.947 /// given node.
21.948 - ///
21.949 - /// Gives back the first of the edges from the given
21.950 - /// node. The bool parameter gives back that direction which
21.951 - /// gives a good direction of the edge so the source of the
21.952 - /// directed arc is the given node.
21.953 void firstInc(Edge&, bool&, const Node&) const {}
21.954
21.955 /// \brief Gives back the next of the edges from the
21.956 /// given node.
21.957 ///
21.958 - /// Gives back the next of the edges from the given
21.959 - /// node. The bool parameter should be used as the \c firstInc()
21.960 - /// use it.
21.961 + /// This function gives back the next edge incident to the given
21.962 + /// node. The bool parameter should be used as \c firstInc() use it.
21.963 void nextInc(Edge&, bool&) const {}
21.964
21.965 using IterableDigraphComponent<Base>::baseNode;
21.966 @@ -812,30 +818,32 @@
21.967
21.968 /// @}
21.969
21.970 - /// \name Class based iteration
21.971 + /// \name Class Based Iteration
21.972 ///
21.973 - /// This interface provides functions for iteration on graph items
21.974 + /// This interface provides iterator classes for edges.
21.975 ///
21.976 /// @{
21.977
21.978 - /// \brief This iterator goes through each node.
21.979 + /// \brief This iterator goes through each edge.
21.980 ///
21.981 - /// This iterator goes through each node.
21.982 + /// This iterator goes through each edge.
21.983 typedef GraphItemIt<Graph, Edge> EdgeIt;
21.984 - /// \brief This iterator goes trough the incident arcs of a
21.985 +
21.986 + /// \brief This iterator goes trough the incident edges of a
21.987 /// node.
21.988 ///
21.989 - /// This iterator goes trough the incident arcs of a certain
21.990 + /// This iterator goes trough the incident edges of a certain
21.991 /// node of a graph.
21.992 - typedef GraphIncIt<Graph, Edge, Node, 'u'> IncEdgeIt;
21.993 + typedef GraphIncIt<Graph, Edge, Node, 'e'> IncEdgeIt;
21.994 +
21.995 /// \brief The base node of the iterator.
21.996 ///
21.997 - /// Gives back the base node of the iterator.
21.998 + /// This function gives back the base node of the iterator.
21.999 Node baseNode(const IncEdgeIt&) const { return INVALID; }
21.1000
21.1001 /// \brief The running node of the iterator.
21.1002 ///
21.1003 - /// Gives back the running node of the iterator.
21.1004 + /// This function gives back the running node of the iterator.
21.1005 Node runningNode(const IncEdgeIt&) const { return INVALID; }
21.1006
21.1007 /// @}
21.1008 @@ -864,12 +872,12 @@
21.1009 checkConcept<GraphItemIt<_Graph, typename _Graph::Edge>,
21.1010 typename _Graph::EdgeIt >();
21.1011 checkConcept<GraphIncIt<_Graph, typename _Graph::Edge,
21.1012 - typename _Graph::Node, 'u'>, typename _Graph::IncEdgeIt>();
21.1013 + typename _Graph::Node, 'e'>, typename _Graph::IncEdgeIt>();
21.1014
21.1015 typename _Graph::Node n;
21.1016 - typename _Graph::IncEdgeIt ueit(INVALID);
21.1017 - n = graph.baseNode(ueit);
21.1018 - n = graph.runningNode(ueit);
21.1019 + const typename _Graph::IncEdgeIt ieit(INVALID);
21.1020 + n = graph.baseNode(ieit);
21.1021 + n = graph.runningNode(ieit);
21.1022 }
21.1023 }
21.1024
21.1025 @@ -877,13 +885,14 @@
21.1026 };
21.1027 };
21.1028
21.1029 - /// \brief An empty alteration notifier digraph class.
21.1030 + /// \brief Skeleton class for alterable directed graphs.
21.1031 ///
21.1032 - /// This class provides beside the core digraph features alteration
21.1033 - /// notifier interface for the digraph structure. This implements
21.1034 + /// This class describes the interface of alterable directed
21.1035 + /// graphs. It extends \ref BaseDigraphComponent with the alteration
21.1036 + /// notifier interface. It implements
21.1037 /// an observer-notifier pattern for each digraph item. More
21.1038 /// obsevers can be registered into the notifier and whenever an
21.1039 - /// alteration occured in the digraph all the observers will
21.1040 + /// alteration occured in the digraph all the observers will be
21.1041 /// notified about it.
21.1042 template <typename BAS = BaseDigraphComponent>
21.1043 class AlterableDigraphComponent : public BAS {
21.1044 @@ -894,23 +903,23 @@
21.1045 typedef typename Base::Arc Arc;
21.1046
21.1047
21.1048 - /// The node observer registry.
21.1049 + /// Node alteration notifier class.
21.1050 typedef AlterationNotifier<AlterableDigraphComponent, Node>
21.1051 NodeNotifier;
21.1052 - /// The arc observer registry.
21.1053 + /// Arc alteration notifier class.
21.1054 typedef AlterationNotifier<AlterableDigraphComponent, Arc>
21.1055 ArcNotifier;
21.1056
21.1057 - /// \brief Gives back the node alteration notifier.
21.1058 + /// \brief Return the node alteration notifier.
21.1059 ///
21.1060 - /// Gives back the node alteration notifier.
21.1061 + /// This function gives back the node alteration notifier.
21.1062 NodeNotifier& notifier(Node) const {
21.1063 - return NodeNotifier();
21.1064 + return NodeNotifier();
21.1065 }
21.1066
21.1067 - /// \brief Gives back the arc alteration notifier.
21.1068 + /// \brief Return the arc alteration notifier.
21.1069 ///
21.1070 - /// Gives back the arc alteration notifier.
21.1071 + /// This function gives back the arc alteration notifier.
21.1072 ArcNotifier& notifier(Arc) const {
21.1073 return ArcNotifier();
21.1074 }
21.1075 @@ -930,18 +939,17 @@
21.1076 }
21.1077
21.1078 const _Digraph& digraph;
21.1079 -
21.1080 };
21.1081 -
21.1082 };
21.1083
21.1084 - /// \brief An empty alteration notifier undirected graph class.
21.1085 + /// \brief Skeleton class for alterable undirected graphs.
21.1086 ///
21.1087 - /// This class provides beside the core graph features alteration
21.1088 - /// notifier interface for the graph structure. This implements
21.1089 - /// an observer-notifier pattern for each graph item. More
21.1090 + /// This class describes the interface of alterable undirected
21.1091 + /// graphs. It extends \ref AlterableDigraphComponent with the alteration
21.1092 + /// notifier interface of undirected graphs. It implements
21.1093 + /// an observer-notifier pattern for the edges. More
21.1094 /// obsevers can be registered into the notifier and whenever an
21.1095 - /// alteration occured in the graph all the observers will
21.1096 + /// alteration occured in the graph all the observers will be
21.1097 /// notified about it.
21.1098 template <typename BAS = BaseGraphComponent>
21.1099 class AlterableGraphComponent : public AlterableDigraphComponent<BAS> {
21.1100 @@ -951,13 +959,13 @@
21.1101 typedef typename Base::Edge Edge;
21.1102
21.1103
21.1104 - /// The arc observer registry.
21.1105 + /// Edge alteration notifier class.
21.1106 typedef AlterationNotifier<AlterableGraphComponent, Edge>
21.1107 EdgeNotifier;
21.1108
21.1109 - /// \brief Gives back the arc alteration notifier.
21.1110 + /// \brief Return the edge alteration notifier.
21.1111 ///
21.1112 - /// Gives back the arc alteration notifier.
21.1113 + /// This function gives back the edge alteration notifier.
21.1114 EdgeNotifier& notifier(Edge) const {
21.1115 return EdgeNotifier();
21.1116 }
21.1117 @@ -965,7 +973,7 @@
21.1118 template <typename _Graph>
21.1119 struct Constraints {
21.1120 void constraints() {
21.1121 - checkConcept<AlterableGraphComponent<Base>, _Graph>();
21.1122 + checkConcept<AlterableDigraphComponent<Base>, _Graph>();
21.1123 typename _Graph::EdgeNotifier& uen
21.1124 = graph.notifier(typename _Graph::Edge());
21.1125 ignore_unused_variable_warning(uen);
21.1126 @@ -975,13 +983,14 @@
21.1127 };
21.1128 };
21.1129
21.1130 - /// \brief Class describing the concept of graph maps
21.1131 + /// \brief Concept class for standard graph maps.
21.1132 ///
21.1133 - /// This class describes the common interface of the graph maps
21.1134 - /// (NodeMap, ArcMap), that is maps that can be used to
21.1135 - /// associate data to graph descriptors (nodes or arcs).
21.1136 + /// This class describes the concept of standard graph maps, i.e.
21.1137 + /// the \c NodeMap, \c ArcMap and \c EdgeMap subtypes of digraph and
21.1138 + /// graph types, which can be used for associating data to graph items.
21.1139 + /// The standard graph maps must conform to the ReferenceMap concept.
21.1140 template <typename GR, typename K, typename V>
21.1141 - class GraphMap : public ReadWriteMap<K, V> {
21.1142 + class GraphMap : public ReferenceMap<K, V, V&, const V&> {
21.1143 public:
21.1144
21.1145 typedef ReadWriteMap<K, V> Parent;
21.1146 @@ -992,6 +1001,13 @@
21.1147 typedef K Key;
21.1148 /// The value type of the map.
21.1149 typedef V Value;
21.1150 + /// The reference type of the map.
21.1151 + typedef Value& Reference;
21.1152 + /// The const reference type of the map.
21.1153 + typedef const Value& ConstReference;
21.1154 +
21.1155 + // The reference map tag.
21.1156 + typedef True ReferenceMapTag;
21.1157
21.1158 /// \brief Construct a new map.
21.1159 ///
21.1160 @@ -999,7 +1015,7 @@
21.1161 explicit GraphMap(const Graph&) {}
21.1162 /// \brief Construct a new map with default value.
21.1163 ///
21.1164 - /// Construct a new map for the graph and initalise the values.
21.1165 + /// Construct a new map for the graph and initalize the values.
21.1166 GraphMap(const Graph&, const Value&) {}
21.1167
21.1168 private:
21.1169 @@ -1008,9 +1024,9 @@
21.1170 /// Copy Constructor.
21.1171 GraphMap(const GraphMap&) : Parent() {}
21.1172
21.1173 - /// \brief Assign operator.
21.1174 + /// \brief Assignment operator.
21.1175 ///
21.1176 - /// Assign operator. It does not mofify the underlying graph,
21.1177 + /// Assignment operator. It does not mofify the underlying graph,
21.1178 /// it just iterates on the current item set and set the map
21.1179 /// with the value returned by the assigned map.
21.1180 template <typename CMap>
21.1181 @@ -1023,33 +1039,35 @@
21.1182 template<typename _Map>
21.1183 struct Constraints {
21.1184 void constraints() {
21.1185 - checkConcept<ReadWriteMap<Key, Value>, _Map >();
21.1186 - // Construction with a graph parameter
21.1187 - _Map a(g);
21.1188 - // Constructor with a graph and a default value parameter
21.1189 - _Map a2(g,t);
21.1190 - // Copy constructor.
21.1191 - // _Map b(c);
21.1192 + checkConcept
21.1193 + <ReferenceMap<Key, Value, Value&, const Value&>, _Map>();
21.1194 + _Map m1(g);
21.1195 + _Map m2(g,t);
21.1196 +
21.1197 + // Copy constructor
21.1198 + // _Map m3(m);
21.1199
21.1200 + // Assignment operator
21.1201 // ReadMap<Key, Value> cmap;
21.1202 - // b = cmap;
21.1203 + // m3 = cmap;
21.1204
21.1205 - ignore_unused_variable_warning(a);
21.1206 - ignore_unused_variable_warning(a2);
21.1207 - // ignore_unused_variable_warning(b);
21.1208 + ignore_unused_variable_warning(m1);
21.1209 + ignore_unused_variable_warning(m2);
21.1210 + // ignore_unused_variable_warning(m3);
21.1211 }
21.1212
21.1213 - const _Map &c;
21.1214 + const _Map &m;
21.1215 const Graph &g;
21.1216 const typename GraphMap::Value &t;
21.1217 };
21.1218
21.1219 };
21.1220
21.1221 - /// \brief An empty mappable digraph class.
21.1222 + /// \brief Skeleton class for mappable directed graphs.
21.1223 ///
21.1224 - /// This class provides beside the core digraph features
21.1225 - /// map interface for the digraph structure.
21.1226 + /// This class describes the interface of mappable directed graphs.
21.1227 + /// It extends \ref BaseDigraphComponent with the standard digraph
21.1228 + /// map classes, namely \c NodeMap and \c ArcMap.
21.1229 /// This concept is part of the Digraph concept.
21.1230 template <typename BAS = BaseDigraphComponent>
21.1231 class MappableDigraphComponent : public BAS {
21.1232 @@ -1061,12 +1079,12 @@
21.1233
21.1234 typedef MappableDigraphComponent Digraph;
21.1235
21.1236 - /// \brief ReadWrite map of the nodes.
21.1237 + /// \brief Standard graph map for the nodes.
21.1238 ///
21.1239 - /// ReadWrite map of the nodes.
21.1240 - ///
21.1241 + /// Standard graph map for the nodes.
21.1242 + /// It conforms to the ReferenceMap concept.
21.1243 template <typename V>
21.1244 - class NodeMap : public GraphMap<Digraph, Node, V> {
21.1245 + class NodeMap : public GraphMap<MappableDigraphComponent, Node, V> {
21.1246 public:
21.1247 typedef GraphMap<MappableDigraphComponent, Node, V> Parent;
21.1248
21.1249 @@ -1078,7 +1096,7 @@
21.1250
21.1251 /// \brief Construct a new map with default value.
21.1252 ///
21.1253 - /// Construct a new map for the digraph and initalise the values.
21.1254 + /// Construct a new map for the digraph and initalize the values.
21.1255 NodeMap(const MappableDigraphComponent& digraph, const V& value)
21.1256 : Parent(digraph, value) {}
21.1257
21.1258 @@ -1088,9 +1106,9 @@
21.1259 /// Copy Constructor.
21.1260 NodeMap(const NodeMap& nm) : Parent(nm) {}
21.1261
21.1262 - /// \brief Assign operator.
21.1263 + /// \brief Assignment operator.
21.1264 ///
21.1265 - /// Assign operator.
21.1266 + /// Assignment operator.
21.1267 template <typename CMap>
21.1268 NodeMap& operator=(const CMap&) {
21.1269 checkConcept<ReadMap<Node, V>, CMap>();
21.1270 @@ -1099,12 +1117,12 @@
21.1271
21.1272 };
21.1273
21.1274 - /// \brief ReadWrite map of the arcs.
21.1275 + /// \brief Standard graph map for the arcs.
21.1276 ///
21.1277 - /// ReadWrite map of the arcs.
21.1278 - ///
21.1279 + /// Standard graph map for the arcs.
21.1280 + /// It conforms to the ReferenceMap concept.
21.1281 template <typename V>
21.1282 - class ArcMap : public GraphMap<Digraph, Arc, V> {
21.1283 + class ArcMap : public GraphMap<MappableDigraphComponent, Arc, V> {
21.1284 public:
21.1285 typedef GraphMap<MappableDigraphComponent, Arc, V> Parent;
21.1286
21.1287 @@ -1116,7 +1134,7 @@
21.1288
21.1289 /// \brief Construct a new map with default value.
21.1290 ///
21.1291 - /// Construct a new map for the digraph and initalise the values.
21.1292 + /// Construct a new map for the digraph and initalize the values.
21.1293 ArcMap(const MappableDigraphComponent& digraph, const V& value)
21.1294 : Parent(digraph, value) {}
21.1295
21.1296 @@ -1126,9 +1144,9 @@
21.1297 /// Copy Constructor.
21.1298 ArcMap(const ArcMap& nm) : Parent(nm) {}
21.1299
21.1300 - /// \brief Assign operator.
21.1301 + /// \brief Assignment operator.
21.1302 ///
21.1303 - /// Assign operator.
21.1304 + /// Assignment operator.
21.1305 template <typename CMap>
21.1306 ArcMap& operator=(const CMap&) {
21.1307 checkConcept<ReadMap<Arc, V>, CMap>();
21.1308 @@ -1178,14 +1196,15 @@
21.1309 }
21.1310 }
21.1311
21.1312 - _Digraph& digraph;
21.1313 + const _Digraph& digraph;
21.1314 };
21.1315 };
21.1316
21.1317 - /// \brief An empty mappable base bipartite graph class.
21.1318 + /// \brief Skeleton class for mappable undirected graphs.
21.1319 ///
21.1320 - /// This class provides beside the core graph features
21.1321 - /// map interface for the graph structure.
21.1322 + /// This class describes the interface of mappable undirected graphs.
21.1323 + /// It extends \ref MappableDigraphComponent with the standard graph
21.1324 + /// map class for edges (\c EdgeMap).
21.1325 /// This concept is part of the Graph concept.
21.1326 template <typename BAS = BaseGraphComponent>
21.1327 class MappableGraphComponent : public MappableDigraphComponent<BAS> {
21.1328 @@ -1196,12 +1215,12 @@
21.1329
21.1330 typedef MappableGraphComponent Graph;
21.1331
21.1332 - /// \brief ReadWrite map of the edges.
21.1333 + /// \brief Standard graph map for the edges.
21.1334 ///
21.1335 - /// ReadWrite map of the edges.
21.1336 - ///
21.1337 + /// Standard graph map for the edges.
21.1338 + /// It conforms to the ReferenceMap concept.
21.1339 template <typename V>
21.1340 - class EdgeMap : public GraphMap<Graph, Edge, V> {
21.1341 + class EdgeMap : public GraphMap<MappableGraphComponent, Edge, V> {
21.1342 public:
21.1343 typedef GraphMap<MappableGraphComponent, Edge, V> Parent;
21.1344
21.1345 @@ -1213,7 +1232,7 @@
21.1346
21.1347 /// \brief Construct a new map with default value.
21.1348 ///
21.1349 - /// Construct a new map for the graph and initalise the values.
21.1350 + /// Construct a new map for the graph and initalize the values.
21.1351 EdgeMap(const MappableGraphComponent& graph, const V& value)
21.1352 : Parent(graph, value) {}
21.1353
21.1354 @@ -1223,9 +1242,9 @@
21.1355 /// Copy Constructor.
21.1356 EdgeMap(const EdgeMap& nm) : Parent(nm) {}
21.1357
21.1358 - /// \brief Assign operator.
21.1359 + /// \brief Assignment operator.
21.1360 ///
21.1361 - /// Assign operator.
21.1362 + /// Assignment operator.
21.1363 template <typename CMap>
21.1364 EdgeMap& operator=(const CMap&) {
21.1365 checkConcept<ReadMap<Edge, V>, CMap>();
21.1366 @@ -1245,7 +1264,7 @@
21.1367 };
21.1368
21.1369 void constraints() {
21.1370 - checkConcept<MappableGraphComponent<Base>, _Graph>();
21.1371 + checkConcept<MappableDigraphComponent<Base>, _Graph>();
21.1372
21.1373 { // int map test
21.1374 typedef typename _Graph::template EdgeMap<int> IntEdgeMap;
21.1375 @@ -1262,16 +1281,16 @@
21.1376 }
21.1377 }
21.1378
21.1379 - _Graph& graph;
21.1380 + const _Graph& graph;
21.1381 };
21.1382 };
21.1383
21.1384 - /// \brief An empty extendable digraph class.
21.1385 + /// \brief Skeleton class for extendable directed graphs.
21.1386 ///
21.1387 - /// This class provides beside the core digraph features digraph
21.1388 - /// extendable interface for the digraph structure. The main
21.1389 - /// difference between the base and this interface is that the
21.1390 - /// digraph alterations should handled already on this level.
21.1391 + /// This class describes the interface of extendable directed graphs.
21.1392 + /// It extends \ref BaseDigraphComponent with functions for adding
21.1393 + /// nodes and arcs to the digraph.
21.1394 + /// This concept requires \ref AlterableDigraphComponent.
21.1395 template <typename BAS = BaseDigraphComponent>
21.1396 class ExtendableDigraphComponent : public BAS {
21.1397 public:
21.1398 @@ -1280,17 +1299,17 @@
21.1399 typedef typename Base::Node Node;
21.1400 typedef typename Base::Arc Arc;
21.1401
21.1402 - /// \brief Adds a new node to the digraph.
21.1403 + /// \brief Add a new node to the digraph.
21.1404 ///
21.1405 - /// Adds a new node to the digraph.
21.1406 - ///
21.1407 + /// This function adds a new node to the digraph.
21.1408 Node addNode() {
21.1409 return INVALID;
21.1410 }
21.1411
21.1412 - /// \brief Adds a new arc connects the given two nodes.
21.1413 + /// \brief Add a new arc connecting the given two nodes.
21.1414 ///
21.1415 - /// Adds a new arc connects the the given two nodes.
21.1416 + /// This function adds a new arc connecting the given two nodes
21.1417 + /// of the digraph.
21.1418 Arc addArc(const Node&, const Node&) {
21.1419 return INVALID;
21.1420 }
21.1421 @@ -1310,13 +1329,12 @@
21.1422 };
21.1423 };
21.1424
21.1425 - /// \brief An empty extendable base undirected graph class.
21.1426 + /// \brief Skeleton class for extendable undirected graphs.
21.1427 ///
21.1428 - /// This class provides beside the core undirected graph features
21.1429 - /// core undircted graph extend interface for the graph structure.
21.1430 - /// The main difference between the base and this interface is
21.1431 - /// that the graph alterations should handled already on this
21.1432 - /// level.
21.1433 + /// This class describes the interface of extendable undirected graphs.
21.1434 + /// It extends \ref BaseGraphComponent with functions for adding
21.1435 + /// nodes and edges to the graph.
21.1436 + /// This concept requires \ref AlterableGraphComponent.
21.1437 template <typename BAS = BaseGraphComponent>
21.1438 class ExtendableGraphComponent : public BAS {
21.1439 public:
21.1440 @@ -1325,18 +1343,18 @@
21.1441 typedef typename Base::Node Node;
21.1442 typedef typename Base::Edge Edge;
21.1443
21.1444 - /// \brief Adds a new node to the graph.
21.1445 + /// \brief Add a new node to the digraph.
21.1446 ///
21.1447 - /// Adds a new node to the graph.
21.1448 - ///
21.1449 + /// This function adds a new node to the digraph.
21.1450 Node addNode() {
21.1451 return INVALID;
21.1452 }
21.1453
21.1454 - /// \brief Adds a new arc connects the given two nodes.
21.1455 + /// \brief Add a new edge connecting the given two nodes.
21.1456 ///
21.1457 - /// Adds a new arc connects the the given two nodes.
21.1458 - Edge addArc(const Node&, const Node&) {
21.1459 + /// This function adds a new edge connecting the given two nodes
21.1460 + /// of the graph.
21.1461 + Edge addEdge(const Node&, const Node&) {
21.1462 return INVALID;
21.1463 }
21.1464
21.1465 @@ -1355,12 +1373,12 @@
21.1466 };
21.1467 };
21.1468
21.1469 - /// \brief An empty erasable digraph class.
21.1470 + /// \brief Skeleton class for erasable directed graphs.
21.1471 ///
21.1472 - /// This class provides beside the core digraph features core erase
21.1473 - /// functions for the digraph structure. The main difference between
21.1474 - /// the base and this interface is that the digraph alterations
21.1475 - /// should handled already on this level.
21.1476 + /// This class describes the interface of erasable directed graphs.
21.1477 + /// It extends \ref BaseDigraphComponent with functions for removing
21.1478 + /// nodes and arcs from the digraph.
21.1479 + /// This concept requires \ref AlterableDigraphComponent.
21.1480 template <typename BAS = BaseDigraphComponent>
21.1481 class ErasableDigraphComponent : public BAS {
21.1482 public:
21.1483 @@ -1371,23 +1389,22 @@
21.1484
21.1485 /// \brief Erase a node from the digraph.
21.1486 ///
21.1487 - /// Erase a node from the digraph. This function should
21.1488 - /// erase all arcs connecting to the node.
21.1489 + /// This function erases the given node from the digraph and all arcs
21.1490 + /// connected to the node.
21.1491 void erase(const Node&) {}
21.1492
21.1493 /// \brief Erase an arc from the digraph.
21.1494 ///
21.1495 - /// Erase an arc from the digraph.
21.1496 - ///
21.1497 + /// This function erases the given arc from the digraph.
21.1498 void erase(const Arc&) {}
21.1499
21.1500 template <typename _Digraph>
21.1501 struct Constraints {
21.1502 void constraints() {
21.1503 checkConcept<Base, _Digraph>();
21.1504 - typename _Digraph::Node node;
21.1505 + const typename _Digraph::Node node(INVALID);
21.1506 digraph.erase(node);
21.1507 - typename _Digraph::Arc arc;
21.1508 + const typename _Digraph::Arc arc(INVALID);
21.1509 digraph.erase(arc);
21.1510 }
21.1511
21.1512 @@ -1395,12 +1412,12 @@
21.1513 };
21.1514 };
21.1515
21.1516 - /// \brief An empty erasable base undirected graph class.
21.1517 + /// \brief Skeleton class for erasable undirected graphs.
21.1518 ///
21.1519 - /// This class provides beside the core undirected graph features
21.1520 - /// core erase functions for the undirceted graph structure. The
21.1521 - /// main difference between the base and this interface is that
21.1522 - /// the graph alterations should handled already on this level.
21.1523 + /// This class describes the interface of erasable undirected graphs.
21.1524 + /// It extends \ref BaseGraphComponent with functions for removing
21.1525 + /// nodes and edges from the graph.
21.1526 + /// This concept requires \ref AlterableGraphComponent.
21.1527 template <typename BAS = BaseGraphComponent>
21.1528 class ErasableGraphComponent : public BAS {
21.1529 public:
21.1530 @@ -1411,23 +1428,22 @@
21.1531
21.1532 /// \brief Erase a node from the graph.
21.1533 ///
21.1534 - /// Erase a node from the graph. This function should erase
21.1535 - /// arcs connecting to the node.
21.1536 + /// This function erases the given node from the graph and all edges
21.1537 + /// connected to the node.
21.1538 void erase(const Node&) {}
21.1539
21.1540 - /// \brief Erase an arc from the graph.
21.1541 + /// \brief Erase an edge from the digraph.
21.1542 ///
21.1543 - /// Erase an arc from the graph.
21.1544 - ///
21.1545 + /// This function erases the given edge from the digraph.
21.1546 void erase(const Edge&) {}
21.1547
21.1548 template <typename _Graph>
21.1549 struct Constraints {
21.1550 void constraints() {
21.1551 checkConcept<Base, _Graph>();
21.1552 - typename _Graph::Node node;
21.1553 + const typename _Graph::Node node(INVALID);
21.1554 graph.erase(node);
21.1555 - typename _Graph::Edge edge;
21.1556 + const typename _Graph::Edge edge(INVALID);
21.1557 graph.erase(edge);
21.1558 }
21.1559
21.1560 @@ -1435,12 +1451,12 @@
21.1561 };
21.1562 };
21.1563
21.1564 - /// \brief An empty clearable base digraph class.
21.1565 + /// \brief Skeleton class for clearable directed graphs.
21.1566 ///
21.1567 - /// This class provides beside the core digraph features core clear
21.1568 - /// functions for the digraph structure. The main difference between
21.1569 - /// the base and this interface is that the digraph alterations
21.1570 - /// should handled already on this level.
21.1571 + /// This class describes the interface of clearable directed graphs.
21.1572 + /// It extends \ref BaseDigraphComponent with a function for clearing
21.1573 + /// the digraph.
21.1574 + /// This concept requires \ref AlterableDigraphComponent.
21.1575 template <typename BAS = BaseDigraphComponent>
21.1576 class ClearableDigraphComponent : public BAS {
21.1577 public:
21.1578 @@ -1449,8 +1465,7 @@
21.1579
21.1580 /// \brief Erase all nodes and arcs from the digraph.
21.1581 ///
21.1582 - /// Erase all nodes and arcs from the digraph.
21.1583 - ///
21.1584 + /// This function erases all nodes and arcs from the digraph.
21.1585 void clear() {}
21.1586
21.1587 template <typename _Digraph>
21.1588 @@ -1460,29 +1475,35 @@
21.1589 digraph.clear();
21.1590 }
21.1591
21.1592 - _Digraph digraph;
21.1593 + _Digraph& digraph;
21.1594 };
21.1595 };
21.1596
21.1597 - /// \brief An empty clearable base undirected graph class.
21.1598 + /// \brief Skeleton class for clearable undirected graphs.
21.1599 ///
21.1600 - /// This class provides beside the core undirected graph features
21.1601 - /// core clear functions for the undirected graph structure. The
21.1602 - /// main difference between the base and this interface is that
21.1603 - /// the graph alterations should handled already on this level.
21.1604 + /// This class describes the interface of clearable undirected graphs.
21.1605 + /// It extends \ref BaseGraphComponent with a function for clearing
21.1606 + /// the graph.
21.1607 + /// This concept requires \ref AlterableGraphComponent.
21.1608 template <typename BAS = BaseGraphComponent>
21.1609 class ClearableGraphComponent : public ClearableDigraphComponent<BAS> {
21.1610 public:
21.1611
21.1612 typedef BAS Base;
21.1613
21.1614 + /// \brief Erase all nodes and edges from the graph.
21.1615 + ///
21.1616 + /// This function erases all nodes and edges from the graph.
21.1617 + void clear() {}
21.1618 +
21.1619 template <typename _Graph>
21.1620 struct Constraints {
21.1621 void constraints() {
21.1622 - checkConcept<ClearableGraphComponent<Base>, _Graph>();
21.1623 + checkConcept<Base, _Graph>();
21.1624 + graph.clear();
21.1625 }
21.1626
21.1627 - _Graph graph;
21.1628 + _Graph& graph;
21.1629 };
21.1630 };
21.1631
22.1 --- a/lemon/concepts/heap.h Sat Apr 18 21:54:30 2009 +0200
22.2 +++ b/lemon/concepts/heap.h Tue Apr 21 10:34:49 2009 +0100
22.3 @@ -71,9 +71,9 @@
22.4 /// The item-int map must be initialized in such way that it assigns
22.5 /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
22.6 enum State {
22.7 - IN_HEAP = 0, ///< The "in heap" state constant.
22.8 - PRE_HEAP = -1, ///< The "pre heap" state constant.
22.9 - POST_HEAP = -2 ///< The "post heap" state constant.
22.10 + IN_HEAP = 0, ///< = 0. The "in heap" state constant.
22.11 + PRE_HEAP = -1, ///< = -1. The "pre heap" state constant.
22.12 + POST_HEAP = -2 ///< = -2. The "post heap" state constant.
22.13 };
22.14
22.15 /// \brief The constructor.
23.1 --- a/lemon/connectivity.h Sat Apr 18 21:54:30 2009 +0200
23.2 +++ b/lemon/connectivity.h Tue Apr 21 10:34:49 2009 +0100
23.3 @@ -32,7 +32,7 @@
23.4 #include <stack>
23.5 #include <functional>
23.6
23.7 -/// \ingroup connectivity
23.8 +/// \ingroup graph_properties
23.9 /// \file
23.10 /// \brief Connectivity algorithms
23.11 ///
23.12 @@ -40,7 +40,7 @@
23.13
23.14 namespace lemon {
23.15
23.16 - /// \ingroup connectivity
23.17 + /// \ingroup graph_properties
23.18 ///
23.19 /// \brief Check whether the given undirected graph is connected.
23.20 ///
23.21 @@ -63,7 +63,7 @@
23.22 return true;
23.23 }
23.24
23.25 - /// \ingroup connectivity
23.26 + /// \ingroup graph_properties
23.27 ///
23.28 /// \brief Count the number of connected components of an undirected graph
23.29 ///
23.30 @@ -105,19 +105,21 @@
23.31 return compNum;
23.32 }
23.33
23.34 - /// \ingroup connectivity
23.35 + /// \ingroup graph_properties
23.36 ///
23.37 /// \brief Find the connected components of an undirected graph
23.38 ///
23.39 /// Find the connected components of an undirected graph.
23.40 ///
23.41 + /// \image html connected_components.png
23.42 + /// \image latex connected_components.eps "Connected components" width=\textwidth
23.43 + ///
23.44 /// \param graph The graph. It must be undirected.
23.45 /// \retval compMap A writable node map. The values will be set from 0 to
23.46 /// the number of the connected components minus one. Each values of the map
23.47 /// will be set exactly once, the values of a certain component will be
23.48 /// set continuously.
23.49 /// \return The number of components
23.50 - ///
23.51 template <class Graph, class NodeMap>
23.52 int connectedComponents(const Graph &graph, NodeMap &compMap) {
23.53 checkConcept<concepts::Graph, Graph>();
23.54 @@ -227,7 +229,7 @@
23.55 }
23.56
23.57
23.58 - /// \ingroup connectivity
23.59 + /// \ingroup graph_properties
23.60 ///
23.61 /// \brief Check whether the given directed graph is strongly connected.
23.62 ///
23.63 @@ -285,7 +287,7 @@
23.64 return true;
23.65 }
23.66
23.67 - /// \ingroup connectivity
23.68 + /// \ingroup graph_properties
23.69 ///
23.70 /// \brief Count the strongly connected components of a directed graph
23.71 ///
23.72 @@ -349,7 +351,7 @@
23.73 return compNum;
23.74 }
23.75
23.76 - /// \ingroup connectivity
23.77 + /// \ingroup graph_properties
23.78 ///
23.79 /// \brief Find the strongly connected components of a directed graph
23.80 ///
23.81 @@ -361,13 +363,15 @@
23.82 /// that there is no arc going from a higher numbered component to
23.83 /// a lower.
23.84 ///
23.85 + /// \image html strongly_connected_components.png
23.86 + /// \image latex strongly_connected_components.eps "Strongly connected components" width=\textwidth
23.87 + ///
23.88 /// \param digraph The digraph.
23.89 /// \retval compMap A writable node map. The values will be set from 0 to
23.90 /// the number of the strongly connected components minus one. Each value
23.91 /// of the map will be set exactly once, the values of a certain component
23.92 /// will be set continuously.
23.93 /// \return The number of components
23.94 - ///
23.95 template <typename Digraph, typename NodeMap>
23.96 int stronglyConnectedComponents(const Digraph& digraph, NodeMap& compMap) {
23.97 checkConcept<concepts::Digraph, Digraph>();
23.98 @@ -416,7 +420,7 @@
23.99 return compNum;
23.100 }
23.101
23.102 - /// \ingroup connectivity
23.103 + /// \ingroup graph_properties
23.104 ///
23.105 /// \brief Find the cut arcs of the strongly connected components.
23.106 ///
23.107 @@ -700,7 +704,7 @@
23.108 template <typename Graph>
23.109 int countBiNodeConnectedComponents(const Graph& graph);
23.110
23.111 - /// \ingroup connectivity
23.112 + /// \ingroup graph_properties
23.113 ///
23.114 /// \brief Checks the graph is bi-node-connected.
23.115 ///
23.116 @@ -715,7 +719,7 @@
23.117 return countBiNodeConnectedComponents(graph) <= 1;
23.118 }
23.119
23.120 - /// \ingroup connectivity
23.121 + /// \ingroup graph_properties
23.122 ///
23.123 /// \brief Count the biconnected components.
23.124 ///
23.125 @@ -750,7 +754,7 @@
23.126 return compNum;
23.127 }
23.128
23.129 - /// \ingroup connectivity
23.130 + /// \ingroup graph_properties
23.131 ///
23.132 /// \brief Find the bi-node-connected components.
23.133 ///
23.134 @@ -759,13 +763,15 @@
23.135 /// relation on the undirected edges. Two undirected edge are in relationship
23.136 /// when they are on same circle.
23.137 ///
23.138 + /// \image html node_biconnected_components.png
23.139 + /// \image latex node_biconnected_components.eps "bi-node-connected components" width=\textwidth
23.140 + ///
23.141 /// \param graph The graph.
23.142 /// \retval compMap A writable uedge map. The values will be set from 0
23.143 /// to the number of the biconnected components minus one. Each values
23.144 /// of the map will be set exactly once, the values of a certain component
23.145 /// will be set continuously.
23.146 /// \return The number of components.
23.147 - ///
23.148 template <typename Graph, typename EdgeMap>
23.149 int biNodeConnectedComponents(const Graph& graph,
23.150 EdgeMap& compMap) {
23.151 @@ -793,7 +799,7 @@
23.152 return compNum;
23.153 }
23.154
23.155 - /// \ingroup connectivity
23.156 + /// \ingroup graph_properties
23.157 ///
23.158 /// \brief Find the bi-node-connected cut nodes.
23.159 ///
23.160 @@ -1023,7 +1029,7 @@
23.161 template <typename Graph>
23.162 int countBiEdgeConnectedComponents(const Graph& graph);
23.163
23.164 - /// \ingroup connectivity
23.165 + /// \ingroup graph_properties
23.166 ///
23.167 /// \brief Checks that the graph is bi-edge-connected.
23.168 ///
23.169 @@ -1038,7 +1044,7 @@
23.170 return countBiEdgeConnectedComponents(graph) <= 1;
23.171 }
23.172
23.173 - /// \ingroup connectivity
23.174 + /// \ingroup graph_properties
23.175 ///
23.176 /// \brief Count the bi-edge-connected components.
23.177 ///
23.178 @@ -1073,7 +1079,7 @@
23.179 return compNum;
23.180 }
23.181
23.182 - /// \ingroup connectivity
23.183 + /// \ingroup graph_properties
23.184 ///
23.185 /// \brief Find the bi-edge-connected components.
23.186 ///
23.187 @@ -1082,13 +1088,15 @@
23.188 /// relation on the nodes. Two nodes are in relationship when they are
23.189 /// connected at least two edge-disjoint paths.
23.190 ///
23.191 + /// \image html edge_biconnected_components.png
23.192 + /// \image latex edge_biconnected_components.eps "bi-edge-connected components" width=\textwidth
23.193 + ///
23.194 /// \param graph The graph.
23.195 /// \retval compMap A writable node map. The values will be set from 0 to
23.196 /// the number of the biconnected components minus one. Each values
23.197 /// of the map will be set exactly once, the values of a certain component
23.198 /// will be set continuously.
23.199 /// \return The number of components.
23.200 - ///
23.201 template <typename Graph, typename NodeMap>
23.202 int biEdgeConnectedComponents(const Graph& graph, NodeMap& compMap) {
23.203 checkConcept<concepts::Graph, Graph>();
23.204 @@ -1115,7 +1123,7 @@
23.205 return compNum;
23.206 }
23.207
23.208 - /// \ingroup connectivity
23.209 + /// \ingroup graph_properties
23.210 ///
23.211 /// \brief Find the bi-edge-connected cut edges.
23.212 ///
23.213 @@ -1179,7 +1187,7 @@
23.214
23.215 }
23.216
23.217 - /// \ingroup connectivity
23.218 + /// \ingroup graph_properties
23.219 ///
23.220 /// \brief Sort the nodes of a DAG into topolgical order.
23.221 ///
23.222 @@ -1218,7 +1226,7 @@
23.223 }
23.224 }
23.225
23.226 - /// \ingroup connectivity
23.227 + /// \ingroup graph_properties
23.228 ///
23.229 /// \brief Sort the nodes of a DAG into topolgical order.
23.230 ///
23.231 @@ -1273,7 +1281,7 @@
23.232 return true;
23.233 }
23.234
23.235 - /// \ingroup connectivity
23.236 + /// \ingroup graph_properties
23.237 ///
23.238 /// \brief Check that the given directed graph is a DAG.
23.239 ///
23.240 @@ -1315,7 +1323,7 @@
23.241 return true;
23.242 }
23.243
23.244 - /// \ingroup connectivity
23.245 + /// \ingroup graph_properties
23.246 ///
23.247 /// \brief Check that the given undirected graph is acyclic.
23.248 ///
23.249 @@ -1349,7 +1357,7 @@
23.250 return true;
23.251 }
23.252
23.253 - /// \ingroup connectivity
23.254 + /// \ingroup graph_properties
23.255 ///
23.256 /// \brief Check that the given undirected graph is tree.
23.257 ///
23.258 @@ -1441,7 +1449,7 @@
23.259 };
23.260 }
23.261
23.262 - /// \ingroup connectivity
23.263 + /// \ingroup graph_properties
23.264 ///
23.265 /// \brief Check if the given undirected graph is bipartite or not
23.266 ///
23.267 @@ -1478,7 +1486,7 @@
23.268 return true;
23.269 }
23.270
23.271 - /// \ingroup connectivity
23.272 + /// \ingroup graph_properties
23.273 ///
23.274 /// \brief Check if the given undirected graph is bipartite or not
23.275 ///
23.276 @@ -1486,6 +1494,10 @@
23.277 /// or not. The \ref Bfs algorithm is used to calculate the result.
23.278 /// During the execution, the \c partMap will be set as the two
23.279 /// partitions of the graph.
23.280 + ///
23.281 + /// \image html bipartite_partitions.png
23.282 + /// \image latex bipartite_partitions.eps "Bipartite partititions" width=\textwidth
23.283 + ///
23.284 /// \param graph The undirected graph.
23.285 /// \retval partMap A writable bool map of nodes. It will be set as the
23.286 /// two partitions of the graph.
24.1 --- a/lemon/core.h Sat Apr 18 21:54:30 2009 +0200
24.2 +++ b/lemon/core.h Tue Apr 21 10:34:49 2009 +0100
24.3 @@ -1315,27 +1315,27 @@
24.4
24.5 virtual void clear() {
24.6 for(NodeIt n(_g);n!=INVALID;++n) {
24.7 - _head.set(n, INVALID);
24.8 + _head[n] = INVALID;
24.9 }
24.10 }
24.11
24.12 void insert(Arc arc) {
24.13 Node s = _g.source(arc);
24.14 Node t = _g.target(arc);
24.15 - _left.set(arc, INVALID);
24.16 - _right.set(arc, INVALID);
24.17 + _left[arc] = INVALID;
24.18 + _right[arc] = INVALID;
24.19
24.20 Arc e = _head[s];
24.21 if (e == INVALID) {
24.22 - _head.set(s, arc);
24.23 - _parent.set(arc, INVALID);
24.24 + _head[s] = arc;
24.25 + _parent[arc] = INVALID;
24.26 return;
24.27 }
24.28 while (true) {
24.29 if (t < _g.target(e)) {
24.30 if (_left[e] == INVALID) {
24.31 - _left.set(e, arc);
24.32 - _parent.set(arc, e);
24.33 + _left[e] = arc;
24.34 + _parent[arc] = e;
24.35 splay(arc);
24.36 return;
24.37 } else {
24.38 @@ -1343,8 +1343,8 @@
24.39 }
24.40 } else {
24.41 if (_right[e] == INVALID) {
24.42 - _right.set(e, arc);
24.43 - _parent.set(arc, e);
24.44 + _right[e] = arc;
24.45 + _parent[arc] = e;
24.46 splay(arc);
24.47 return;
24.48 } else {
24.49 @@ -1357,27 +1357,27 @@
24.50 void remove(Arc arc) {
24.51 if (_left[arc] == INVALID) {
24.52 if (_right[arc] != INVALID) {
24.53 - _parent.set(_right[arc], _parent[arc]);
24.54 + _parent[_right[arc]] = _parent[arc];
24.55 }
24.56 if (_parent[arc] != INVALID) {
24.57 if (_left[_parent[arc]] == arc) {
24.58 - _left.set(_parent[arc], _right[arc]);
24.59 + _left[_parent[arc]] = _right[arc];
24.60 } else {
24.61 - _right.set(_parent[arc], _right[arc]);
24.62 + _right[_parent[arc]] = _right[arc];
24.63 }
24.64 } else {
24.65 - _head.set(_g.source(arc), _right[arc]);
24.66 + _head[_g.source(arc)] = _right[arc];
24.67 }
24.68 } else if (_right[arc] == INVALID) {
24.69 - _parent.set(_left[arc], _parent[arc]);
24.70 + _parent[_left[arc]] = _parent[arc];
24.71 if (_parent[arc] != INVALID) {
24.72 if (_left[_parent[arc]] == arc) {
24.73 - _left.set(_parent[arc], _left[arc]);
24.74 + _left[_parent[arc]] = _left[arc];
24.75 } else {
24.76 - _right.set(_parent[arc], _left[arc]);
24.77 + _right[_parent[arc]] = _left[arc];
24.78 }
24.79 } else {
24.80 - _head.set(_g.source(arc), _left[arc]);
24.81 + _head[_g.source(arc)] = _left[arc];
24.82 }
24.83 } else {
24.84 Arc e = _left[arc];
24.85 @@ -1387,38 +1387,38 @@
24.86 e = _right[e];
24.87 }
24.88 Arc s = _parent[e];
24.89 - _right.set(_parent[e], _left[e]);
24.90 + _right[_parent[e]] = _left[e];
24.91 if (_left[e] != INVALID) {
24.92 - _parent.set(_left[e], _parent[e]);
24.93 + _parent[_left[e]] = _parent[e];
24.94 }
24.95
24.96 - _left.set(e, _left[arc]);
24.97 - _parent.set(_left[arc], e);
24.98 - _right.set(e, _right[arc]);
24.99 - _parent.set(_right[arc], e);
24.100 + _left[e] = _left[arc];
24.101 + _parent[_left[arc]] = e;
24.102 + _right[e] = _right[arc];
24.103 + _parent[_right[arc]] = e;
24.104
24.105 - _parent.set(e, _parent[arc]);
24.106 + _parent[e] = _parent[arc];
24.107 if (_parent[arc] != INVALID) {
24.108 if (_left[_parent[arc]] == arc) {
24.109 - _left.set(_parent[arc], e);
24.110 + _left[_parent[arc]] = e;
24.111 } else {
24.112 - _right.set(_parent[arc], e);
24.113 + _right[_parent[arc]] = e;
24.114 }
24.115 }
24.116 splay(s);
24.117 } else {
24.118 - _right.set(e, _right[arc]);
24.119 - _parent.set(_right[arc], e);
24.120 - _parent.set(e, _parent[arc]);
24.121 + _right[e] = _right[arc];
24.122 + _parent[_right[arc]] = e;
24.123 + _parent[e] = _parent[arc];
24.124
24.125 if (_parent[arc] != INVALID) {
24.126 if (_left[_parent[arc]] == arc) {
24.127 - _left.set(_parent[arc], e);
24.128 + _left[_parent[arc]] = e;
24.129 } else {
24.130 - _right.set(_parent[arc], e);
24.131 + _right[_parent[arc]] = e;
24.132 }
24.133 } else {
24.134 - _head.set(_g.source(arc), e);
24.135 + _head[_g.source(arc)] = e;
24.136 }
24.137 }
24.138 }
24.139 @@ -1430,17 +1430,17 @@
24.140 Arc me=v[m];
24.141 if (a < m) {
24.142 Arc left = refreshRec(v,a,m-1);
24.143 - _left.set(me, left);
24.144 - _parent.set(left, me);
24.145 + _left[me] = left;
24.146 + _parent[left] = me;
24.147 } else {
24.148 - _left.set(me, INVALID);
24.149 + _left[me] = INVALID;
24.150 }
24.151 if (m < b) {
24.152 Arc right = refreshRec(v,m+1,b);
24.153 - _right.set(me, right);
24.154 - _parent.set(right, me);
24.155 + _right[me] = right;
24.156 + _parent[right] = me;
24.157 } else {
24.158 - _right.set(me, INVALID);
24.159 + _right[me] = INVALID;
24.160 }
24.161 return me;
24.162 }
24.163 @@ -1452,46 +1452,46 @@
24.164 if (!v.empty()) {
24.165 std::sort(v.begin(),v.end(),ArcLess(_g));
24.166 Arc head = refreshRec(v,0,v.size()-1);
24.167 - _head.set(n, head);
24.168 - _parent.set(head, INVALID);
24.169 + _head[n] = head;
24.170 + _parent[head] = INVALID;
24.171 }
24.172 - else _head.set(n, INVALID);
24.173 + else _head[n] = INVALID;
24.174 }
24.175 }
24.176
24.177 void zig(Arc v) {
24.178 Arc w = _parent[v];
24.179 - _parent.set(v, _parent[w]);
24.180 - _parent.set(w, v);
24.181 - _left.set(w, _right[v]);
24.182 - _right.set(v, w);
24.183 + _parent[v] = _parent[w];
24.184 + _parent[w] = v;
24.185 + _left[w] = _right[v];
24.186 + _right[v] = w;
24.187 if (_parent[v] != INVALID) {
24.188 if (_right[_parent[v]] == w) {
24.189 - _right.set(_parent[v], v);
24.190 + _right[_parent[v]] = v;
24.191 } else {
24.192 - _left.set(_parent[v], v);
24.193 + _left[_parent[v]] = v;
24.194 }
24.195 }
24.196 if (_left[w] != INVALID){
24.197 - _parent.set(_left[w], w);
24.198 + _parent[_left[w]] = w;
24.199 }
24.200 }
24.201
24.202 void zag(Arc v) {
24.203 Arc w = _parent[v];
24.204 - _parent.set(v, _parent[w]);
24.205 - _parent.set(w, v);
24.206 - _right.set(w, _left[v]);
24.207 - _left.set(v, w);
24.208 + _parent[v] = _parent[w];
24.209 + _parent[w] = v;
24.210 + _right[w] = _left[v];
24.211 + _left[v] = w;
24.212 if (_parent[v] != INVALID){
24.213 if (_left[_parent[v]] == w) {
24.214 - _left.set(_parent[v], v);
24.215 + _left[_parent[v]] = v;
24.216 } else {
24.217 - _right.set(_parent[v], v);
24.218 + _right[_parent[v]] = v;
24.219 }
24.220 }
24.221 if (_right[w] != INVALID){
24.222 - _parent.set(_right[w], w);
24.223 + _parent[_right[w]] = w;
24.224 }
24.225 }
24.226
25.1 --- a/lemon/cplex.cc Sat Apr 18 21:54:30 2009 +0200
25.2 +++ b/lemon/cplex.cc Tue Apr 21 10:34:49 2009 +0100
25.3 @@ -72,12 +72,14 @@
25.4 CplexBase::CplexBase() : LpBase() {
25.5 int status;
25.6 _prob = CPXcreateprob(cplexEnv(), &status, "Cplex problem");
25.7 + messageLevel(MESSAGE_NOTHING);
25.8 }
25.9
25.10 CplexBase::CplexBase(const CplexEnv& env)
25.11 : LpBase(), _env(env) {
25.12 int status;
25.13 _prob = CPXcreateprob(cplexEnv(), &status, "Cplex problem");
25.14 + messageLevel(MESSAGE_NOTHING);
25.15 }
25.16
25.17 CplexBase::CplexBase(const CplexBase& cplex)
25.18 @@ -86,6 +88,7 @@
25.19 _prob = CPXcloneprob(cplexEnv(), cplex._prob, &status);
25.20 rows = cplex.rows;
25.21 cols = cplex.cols;
25.22 + messageLevel(MESSAGE_NOTHING);
25.23 }
25.24
25.25 CplexBase::~CplexBase() {
25.26 @@ -438,6 +441,25 @@
25.27 cols.clear();
25.28 }
25.29
25.30 + void CplexBase::_messageLevel(MessageLevel level) {
25.31 + switch (level) {
25.32 + case MESSAGE_NOTHING:
25.33 + _message_enabled = false;
25.34 + break;
25.35 + case MESSAGE_ERROR:
25.36 + case MESSAGE_WARNING:
25.37 + case MESSAGE_NORMAL:
25.38 + case MESSAGE_VERBOSE:
25.39 + _message_enabled = true;
25.40 + break;
25.41 + }
25.42 + }
25.43 +
25.44 + void CplexBase::_applyMessageLevel() {
25.45 + CPXsetintparam(cplexEnv(), CPX_PARAM_SCRIND,
25.46 + _message_enabled ? CPX_ON : CPX_OFF);
25.47 + }
25.48 +
25.49 // CplexLp members
25.50
25.51 CplexLp::CplexLp()
25.52 @@ -507,21 +529,25 @@
25.53
25.54 CplexLp::SolveExitStatus CplexLp::_solve() {
25.55 _clear_temporals();
25.56 + _applyMessageLevel();
25.57 return convertStatus(CPXlpopt(cplexEnv(), _prob));
25.58 }
25.59
25.60 CplexLp::SolveExitStatus CplexLp::solvePrimal() {
25.61 _clear_temporals();
25.62 + _applyMessageLevel();
25.63 return convertStatus(CPXprimopt(cplexEnv(), _prob));
25.64 }
25.65
25.66 CplexLp::SolveExitStatus CplexLp::solveDual() {
25.67 _clear_temporals();
25.68 + _applyMessageLevel();
25.69 return convertStatus(CPXdualopt(cplexEnv(), _prob));
25.70 }
25.71
25.72 CplexLp::SolveExitStatus CplexLp::solveBarrier() {
25.73 _clear_temporals();
25.74 + _applyMessageLevel();
25.75 return convertStatus(CPXbaropt(cplexEnv(), _prob));
25.76 }
25.77
25.78 @@ -600,7 +626,7 @@
25.79 return _dual_ray[i];
25.80 }
25.81
25.82 - //7.5-os cplex statusai (Vigyazat: a 9.0-asei masok!)
25.83 + // Cplex 7.0 status values
25.84 // This table lists the statuses, returned by the CPXgetstat()
25.85 // routine, for solutions to LP problems or mixed integer problems. If
25.86 // no solution exists, the return value is zero.
25.87 @@ -647,7 +673,7 @@
25.88 // 20 CPX_PIVOT
25.89 // User pivot used
25.90 //
25.91 - // Ezeket hova tegyem:
25.92 + // Pending return values
25.93 // ??case CPX_ABORT_DUAL_INFEAS
25.94 // ??case CPX_ABORT_CROSSOVER
25.95 // ??case CPX_INForUNBD
25.96 @@ -718,7 +744,6 @@
25.97 #else
25.98 statusSwitch(cplexEnv(),stat);
25.99 //CPXgetstat(cplexEnv(), _prob);
25.100 - //printf("A primal status: %d, CPX_OPTIMAL=%d \n",stat,CPX_OPTIMAL);
25.101 switch (stat) {
25.102 case 0:
25.103 return UNDEFINED; //Undefined
25.104 @@ -751,7 +776,7 @@
25.105 #endif
25.106 }
25.107
25.108 - //9.0-as cplex verzio statusai
25.109 + // Cplex 9.0 status values
25.110 // CPX_STAT_ABORT_DUAL_OBJ_LIM
25.111 // CPX_STAT_ABORT_IT_LIM
25.112 // CPX_STAT_ABORT_OBJ_LIM
25.113 @@ -864,6 +889,7 @@
25.114
25.115 CplexMip::SolveExitStatus CplexMip::_solve() {
25.116 int status;
25.117 + _applyMessageLevel();
25.118 status = CPXmipopt (cplexEnv(), _prob);
25.119 if (status==0)
25.120 return SOLVED;
26.1 --- a/lemon/cplex.h Sat Apr 18 21:54:30 2009 +0200
26.2 +++ b/lemon/cplex.h Tue Apr 21 10:34:49 2009 +0100
26.3 @@ -144,14 +144,29 @@
26.4
26.5 virtual void _clear();
26.6
26.7 + virtual void _messageLevel(MessageLevel level);
26.8 + void _applyMessageLevel();
26.9 +
26.10 + bool _message_enabled;
26.11 +
26.12 public:
26.13
26.14 /// Returns the used \c CplexEnv instance
26.15 const CplexEnv& env() const { return _env; }
26.16 +
26.17 + /// \brief Returns the const cpxenv pointer
26.18 ///
26.19 + /// \note The cpxenv might be destructed with the solver.
26.20 const cpxenv* cplexEnv() const { return _env.cplexEnv(); }
26.21
26.22 + /// \brief Returns the const cpxenv pointer
26.23 + ///
26.24 + /// \note The cpxenv might be destructed with the solver.
26.25 + cpxenv* cplexEnv() { return _env.cplexEnv(); }
26.26 +
26.27 + /// Returns the cplex problem object
26.28 cpxlp* cplexLp() { return _prob; }
26.29 + /// Returns the cplex problem object
26.30 const cpxlp* cplexLp() const { return _prob; }
26.31
26.32 };
27.1 --- a/lemon/dfs.h Sat Apr 18 21:54:30 2009 +0200
27.2 +++ b/lemon/dfs.h Tue Apr 21 10:34:49 2009 +0100
27.3 @@ -206,7 +206,7 @@
27.4
27.5 typedef Dfs Create;
27.6
27.7 - ///\name Named template parameters
27.8 + ///\name Named Template Parameters
27.9
27.10 ///@{
27.11
28.1 --- a/lemon/dijkstra.h Sat Apr 18 21:54:30 2009 +0200
28.2 +++ b/lemon/dijkstra.h Tue Apr 21 10:34:49 2009 +0100
28.3 @@ -286,7 +286,7 @@
28.4
28.5 typedef Dijkstra Create;
28.6
28.7 - ///\name Named template parameters
28.8 + ///\name Named Template Parameters
28.9
28.10 ///@{
28.11
29.1 --- a/lemon/dimacs.h Sat Apr 18 21:54:30 2009 +0200
29.2 +++ b/lemon/dimacs.h Tue Apr 21 10:34:49 2009 +0100
29.3 @@ -37,11 +37,16 @@
29.4 /// DIMACS file type descriptor.
29.5 struct DimacsDescriptor
29.6 {
29.7 - ///File type enum
29.8 - enum Type
29.9 - {
29.10 - NONE, MIN, MAX, SP, MAT
29.11 - };
29.12 + ///\brief DIMACS file type enum
29.13 + ///
29.14 + ///DIMACS file type enum.
29.15 + enum Type {
29.16 + NONE, ///< Undefined type.
29.17 + MIN, ///< DIMACS file type for minimum cost flow problems.
29.18 + MAX, ///< DIMACS file type for maximum flow problems.
29.19 + SP, ///< DIMACS file type for shostest path problems.
29.20 + MAT ///< DIMACS file type for plain graphs and matching problems.
29.21 + };
29.22 ///The file type
29.23 Type type;
29.24 ///The number of nodes in the graph
29.25 @@ -49,16 +54,16 @@
29.26 ///The number of edges in the graph
29.27 int edgeNum;
29.28 int lineShift;
29.29 - /// Constructor. Sets the type to NONE.
29.30 + ///Constructor. It sets the type to \c NONE.
29.31 DimacsDescriptor() : type(NONE) {}
29.32 };
29.33
29.34 ///Discover the type of a DIMACS file
29.35
29.36 - ///It starts seeking the beginning of the file for the problem type
29.37 - ///and size info. The found data is returned in a special struct
29.38 - ///that can be evaluated and passed to the appropriate reader
29.39 - ///function.
29.40 + ///This function starts seeking the beginning of the given file for the
29.41 + ///problem type and size info.
29.42 + ///The found data is returned in a special struct that can be evaluated
29.43 + ///and passed to the appropriate reader function.
29.44 DimacsDescriptor dimacsType(std::istream& is)
29.45 {
29.46 DimacsDescriptor r;
29.47 @@ -96,8 +101,7 @@
29.48 }
29.49
29.50
29.51 -
29.52 - /// DIMACS minimum cost flow reader function.
29.53 + /// \brief DIMACS minimum cost flow reader function.
29.54 ///
29.55 /// This function reads a minimum cost flow instance from DIMACS format,
29.56 /// i.e. from a DIMACS file having a line starting with
29.57 @@ -253,7 +257,7 @@
29.58 }
29.59 }
29.60
29.61 - /// DIMACS maximum flow reader function.
29.62 + /// \brief DIMACS maximum flow reader function.
29.63 ///
29.64 /// This function reads a maximum flow instance from DIMACS format,
29.65 /// i.e. from a DIMACS file having a line starting with
29.66 @@ -287,7 +291,7 @@
29.67 _readDimacs(is,g,capacity,s,t,infty,desc);
29.68 }
29.69
29.70 - /// DIMACS shortest path reader function.
29.71 + /// \brief DIMACS shortest path reader function.
29.72 ///
29.73 /// This function reads a shortest path instance from DIMACS format,
29.74 /// i.e. from a DIMACS file having a line starting with
29.75 @@ -313,7 +317,7 @@
29.76 _readDimacs(is, g, length, s, t, 0, desc);
29.77 }
29.78
29.79 - /// DIMACS capacitated digraph reader function.
29.80 + /// \brief DIMACS capacitated digraph reader function.
29.81 ///
29.82 /// This function reads an arc capacitated digraph instance from
29.83 /// DIMACS 'max' or 'sp' format.
29.84 @@ -359,11 +363,11 @@
29.85 g.addArc(s,t);
29.86 }
29.87
29.88 - /// DIMACS plain (di)graph reader function.
29.89 + /// \brief DIMACS plain (di)graph reader function.
29.90 ///
29.91 - /// This function reads a (di)graph without any designated nodes and
29.92 - /// maps from DIMACS format, i.e. from DIMACS files having a line
29.93 - /// starting with
29.94 + /// This function reads a plain (di)graph without any designated nodes
29.95 + /// and maps (e.g. a matching instance) from DIMACS format, i.e. from
29.96 + /// DIMACS files having a line starting with
29.97 /// \code
29.98 /// p mat
29.99 /// \endcode
30.1 --- a/lemon/elevator.h Sat Apr 18 21:54:30 2009 +0200
30.2 +++ b/lemon/elevator.h Tue Apr 21 10:34:49 2009 +0100
30.3 @@ -76,7 +76,7 @@
30.4
30.5 void copy(Item i, Vit p)
30.6 {
30.7 - _where.set(*p=i,p);
30.8 + _where[*p=i] = p;
30.9 }
30.10 void copy(Vit s, Vit p)
30.11 {
30.12 @@ -84,15 +84,15 @@
30.13 {
30.14 Item i=*s;
30.15 *p=i;
30.16 - _where.set(i,p);
30.17 + _where[i] = p;
30.18 }
30.19 }
30.20 void swap(Vit i, Vit j)
30.21 {
30.22 Item ti=*i;
30.23 Vit ct = _where[ti];
30.24 - _where.set(ti,_where[*i=*j]);
30.25 - _where.set(*j,ct);
30.26 + _where[ti] = _where[*i=*j];
30.27 + _where[*j] = ct;
30.28 *j=ti;
30.29 }
30.30
30.31 @@ -226,7 +226,7 @@
30.32 void liftHighestActive()
30.33 {
30.34 Item it = *_last_active[_highest_active];
30.35 - _level.set(it,_level[it]+1);
30.36 + ++_level[it];
30.37 swap(_last_active[_highest_active]--,_last_active[_highest_active+1]);
30.38 --_first[++_highest_active];
30.39 }
30.40 @@ -249,7 +249,7 @@
30.41 --_last_active[l];
30.42 }
30.43 copy(li,_first[new_level]);
30.44 - _level.set(li,new_level);
30.45 + _level[li] = new_level;
30.46 _highest_active=new_level;
30.47 }
30.48
30.49 @@ -269,7 +269,7 @@
30.50 }
30.51 copy(li,_first[_max_level]);
30.52 --_last_active[_max_level];
30.53 - _level.set(li,_max_level);
30.54 + _level[li] = _max_level;
30.55
30.56 while(_highest_active>=0 &&
30.57 _last_active[_highest_active]<_first[_highest_active])
30.58 @@ -299,7 +299,7 @@
30.59 Item liftActiveOn(int level)
30.60 {
30.61 Item it =*_last_active[level];
30.62 - _level.set(it,_level[it]+1);
30.63 + ++_level[it];
30.64 swap(_last_active[level]--, --_first[level+1]);
30.65 if (level+1>_highest_active) ++_highest_active;
30.66 }
30.67 @@ -319,7 +319,7 @@
30.68 copy(--_first[l+1], _last_active[l]--);
30.69 }
30.70 copy(ai,_first[new_level]);
30.71 - _level.set(ai,new_level);
30.72 + _level[ai] = new_level;
30.73 if (new_level>_highest_active) _highest_active=new_level;
30.74 }
30.75
30.76 @@ -339,7 +339,7 @@
30.77 }
30.78 copy(ai,_first[_max_level]);
30.79 --_last_active[_max_level];
30.80 - _level.set(ai,_max_level);
30.81 + _level[ai] = _max_level;
30.82
30.83 if (_highest_active==level) {
30.84 while(_highest_active>=0 &&
30.85 @@ -370,7 +370,7 @@
30.86 copy(--_first[l+1],_last_active[l]--);
30.87 }
30.88 copy(i,_first[new_level]);
30.89 - _level.set(i,new_level);
30.90 + _level[i] = new_level;
30.91 if(new_level>_highest_active) _highest_active=new_level;
30.92 }
30.93
30.94 @@ -382,7 +382,7 @@
30.95 ///only if you really know what it is for.
30.96 ///\pre The item is on the top level.
30.97 void dirtyTopButOne(Item i) {
30.98 - _level.set(i,_max_level - 1);
30.99 + _level[i] = _max_level - 1;
30.100 }
30.101
30.102 ///Lift all items on and above the given level to the top level.
30.103 @@ -394,7 +394,7 @@
30.104 const Vit f=_first[l];
30.105 const Vit tl=_first[_max_level];
30.106 for(Vit i=f;i!=tl;++i)
30.107 - _level.set(*i,_max_level);
30.108 + _level[*i] = _max_level;
30.109 for(int i=l;i<=_max_level;i++)
30.110 {
30.111 _first[i]=f;
30.112 @@ -433,8 +433,8 @@
30.113 for(typename ItemSetTraits<GR,Item>::ItemIt i(_g);i!=INVALID;++i)
30.114 {
30.115 *n=i;
30.116 - _where.set(i,n);
30.117 - _level.set(i,_max_level);
30.118 + _where[i] = n;
30.119 + _level[i] = _max_level;
30.120 ++n;
30.121 }
30.122 }
30.123 @@ -443,7 +443,7 @@
30.124 void initAddItem(Item i)
30.125 {
30.126 swap(_where[i],_init_num);
30.127 - _level.set(i,_init_lev);
30.128 + _level[i] = _init_lev;
30.129 ++_init_num;
30.130 }
30.131
30.132 @@ -551,7 +551,7 @@
30.133 ///Activate item \c i.
30.134 ///\pre Item \c i shouldn't be active before.
30.135 void activate(Item i) {
30.136 - _active.set(i, true);
30.137 + _active[i] = true;
30.138
30.139 int level = _level[i];
30.140 if (level > _highest_active) {
30.141 @@ -560,16 +560,16 @@
30.142
30.143 if (_prev[i] == INVALID || _active[_prev[i]]) return;
30.144 //unlace
30.145 - _next.set(_prev[i], _next[i]);
30.146 + _next[_prev[i]] = _next[i];
30.147 if (_next[i] != INVALID) {
30.148 - _prev.set(_next[i], _prev[i]);
30.149 + _prev[_next[i]] = _prev[i];
30.150 } else {
30.151 _last[level] = _prev[i];
30.152 }
30.153 //lace
30.154 - _next.set(i, _first[level]);
30.155 - _prev.set(_first[level], i);
30.156 - _prev.set(i, INVALID);
30.157 + _next[i] = _first[level];
30.158 + _prev[_first[level]] = i;
30.159 + _prev[i] = INVALID;
30.160 _first[level] = i;
30.161
30.162 }
30.163 @@ -579,23 +579,23 @@
30.164 ///Deactivate item \c i.
30.165 ///\pre Item \c i must be active before.
30.166 void deactivate(Item i) {
30.167 - _active.set(i, false);
30.168 + _active[i] = false;
30.169 int level = _level[i];
30.170
30.171 if (_next[i] == INVALID || !_active[_next[i]])
30.172 goto find_highest_level;
30.173
30.174 //unlace
30.175 - _prev.set(_next[i], _prev[i]);
30.176 + _prev[_next[i]] = _prev[i];
30.177 if (_prev[i] != INVALID) {
30.178 - _next.set(_prev[i], _next[i]);
30.179 + _next[_prev[i]] = _next[i];
30.180 } else {
30.181 _first[_level[i]] = _next[i];
30.182 }
30.183 //lace
30.184 - _prev.set(i, _last[level]);
30.185 - _next.set(_last[level], i);
30.186 - _next.set(i, INVALID);
30.187 + _prev[i] = _last[level];
30.188 + _next[_last[level]] = i;
30.189 + _next[i] = INVALID;
30.190 _last[level] = i;
30.191
30.192 find_highest_level:
30.193 @@ -685,21 +685,21 @@
30.194 void liftHighestActive() {
30.195 Item i = _first[_highest_active];
30.196 if (_next[i] != INVALID) {
30.197 - _prev.set(_next[i], INVALID);
30.198 + _prev[_next[i]] = INVALID;
30.199 _first[_highest_active] = _next[i];
30.200 } else {
30.201 _first[_highest_active] = INVALID;
30.202 _last[_highest_active] = INVALID;
30.203 }
30.204 - _level.set(i, ++_highest_active);
30.205 + _level[i] = ++_highest_active;
30.206 if (_first[_highest_active] == INVALID) {
30.207 _first[_highest_active] = i;
30.208 _last[_highest_active] = i;
30.209 - _prev.set(i, INVALID);
30.210 - _next.set(i, INVALID);
30.211 + _prev[i] = INVALID;
30.212 + _next[i] = INVALID;
30.213 } else {
30.214 - _prev.set(_first[_highest_active], i);
30.215 - _next.set(i, _first[_highest_active]);
30.216 + _prev[_first[_highest_active]] = i;
30.217 + _next[i] = _first[_highest_active];
30.218 _first[_highest_active] = i;
30.219 }
30.220 }
30.221 @@ -714,20 +714,20 @@
30.222 void liftHighestActive(int new_level) {
30.223 Item i = _first[_highest_active];
30.224 if (_next[i] != INVALID) {
30.225 - _prev.set(_next[i], INVALID);
30.226 + _prev[_next[i]] = INVALID;
30.227 _first[_highest_active] = _next[i];
30.228 } else {
30.229 _first[_highest_active] = INVALID;
30.230 _last[_highest_active] = INVALID;
30.231 }
30.232 - _level.set(i, _highest_active = new_level);
30.233 + _level[i] = _highest_active = new_level;
30.234 if (_first[_highest_active] == INVALID) {
30.235 _first[_highest_active] = _last[_highest_active] = i;
30.236 - _prev.set(i, INVALID);
30.237 - _next.set(i, INVALID);
30.238 + _prev[i] = INVALID;
30.239 + _next[i] = INVALID;
30.240 } else {
30.241 - _prev.set(_first[_highest_active], i);
30.242 - _next.set(i, _first[_highest_active]);
30.243 + _prev[_first[_highest_active]] = i;
30.244 + _next[i] = _first[_highest_active];
30.245 _first[_highest_active] = i;
30.246 }
30.247 }
30.248 @@ -738,9 +738,9 @@
30.249 ///deactivate it.
30.250 void liftHighestActiveToTop() {
30.251 Item i = _first[_highest_active];
30.252 - _level.set(i, _max_level);
30.253 + _level[i] = _max_level;
30.254 if (_next[i] != INVALID) {
30.255 - _prev.set(_next[i], INVALID);
30.256 + _prev[_next[i]] = INVALID;
30.257 _first[_highest_active] = _next[i];
30.258 } else {
30.259 _first[_highest_active] = INVALID;
30.260 @@ -774,20 +774,20 @@
30.261 {
30.262 Item i = _first[l];
30.263 if (_next[i] != INVALID) {
30.264 - _prev.set(_next[i], INVALID);
30.265 + _prev[_next[i]] = INVALID;
30.266 _first[l] = _next[i];
30.267 } else {
30.268 _first[l] = INVALID;
30.269 _last[l] = INVALID;
30.270 }
30.271 - _level.set(i, ++l);
30.272 + _level[i] = ++l;
30.273 if (_first[l] == INVALID) {
30.274 _first[l] = _last[l] = i;
30.275 - _prev.set(i, INVALID);
30.276 - _next.set(i, INVALID);
30.277 + _prev[i] = INVALID;
30.278 + _next[i] = INVALID;
30.279 } else {
30.280 - _prev.set(_first[l], i);
30.281 - _next.set(i, _first[l]);
30.282 + _prev[_first[l]] = i;
30.283 + _next[i] = _first[l];
30.284 _first[l] = i;
30.285 }
30.286 if (_highest_active < l) {
30.287 @@ -803,20 +803,20 @@
30.288 {
30.289 Item i = _first[l];
30.290 if (_next[i] != INVALID) {
30.291 - _prev.set(_next[i], INVALID);
30.292 + _prev[_next[i]] = INVALID;
30.293 _first[l] = _next[i];
30.294 } else {
30.295 _first[l] = INVALID;
30.296 _last[l] = INVALID;
30.297 }
30.298 - _level.set(i, l = new_level);
30.299 + _level[i] = l = new_level;
30.300 if (_first[l] == INVALID) {
30.301 _first[l] = _last[l] = i;
30.302 - _prev.set(i, INVALID);
30.303 - _next.set(i, INVALID);
30.304 + _prev[i] = INVALID;
30.305 + _next[i] = INVALID;
30.306 } else {
30.307 - _prev.set(_first[l], i);
30.308 - _next.set(i, _first[l]);
30.309 + _prev[_first[l]] = i;
30.310 + _next[i] = _first[l];
30.311 _first[l] = i;
30.312 }
30.313 if (_highest_active < l) {
30.314 @@ -832,13 +832,13 @@
30.315 {
30.316 Item i = _first[l];
30.317 if (_next[i] != INVALID) {
30.318 - _prev.set(_next[i], INVALID);
30.319 + _prev[_next[i]] = INVALID;
30.320 _first[l] = _next[i];
30.321 } else {
30.322 _first[l] = INVALID;
30.323 _last[l] = INVALID;
30.324 }
30.325 - _level.set(i, _max_level);
30.326 + _level[i] = _max_level;
30.327 if (l == _highest_active) {
30.328 while (_highest_active >= 0 && activeFree(_highest_active))
30.329 --_highest_active;
30.330 @@ -856,23 +856,23 @@
30.331 ///
30.332 void lift(Item i, int new_level) {
30.333 if (_next[i] != INVALID) {
30.334 - _prev.set(_next[i], _prev[i]);
30.335 + _prev[_next[i]] = _prev[i];
30.336 } else {
30.337 _last[new_level] = _prev[i];
30.338 }
30.339 if (_prev[i] != INVALID) {
30.340 - _next.set(_prev[i], _next[i]);
30.341 + _next[_prev[i]] = _next[i];
30.342 } else {
30.343 _first[new_level] = _next[i];
30.344 }
30.345 - _level.set(i, new_level);
30.346 + _level[i] = new_level;
30.347 if (_first[new_level] == INVALID) {
30.348 _first[new_level] = _last[new_level] = i;
30.349 - _prev.set(i, INVALID);
30.350 - _next.set(i, INVALID);
30.351 + _prev[i] = INVALID;
30.352 + _next[i] = INVALID;
30.353 } else {
30.354 - _prev.set(_first[new_level], i);
30.355 - _next.set(i, _first[new_level]);
30.356 + _prev[_first[new_level]] = i;
30.357 + _next[i] = _first[new_level];
30.358 _first[new_level] = i;
30.359 }
30.360 if (_highest_active < new_level) {
30.361 @@ -888,7 +888,7 @@
30.362 ///only if you really know what it is for.
30.363 ///\pre The item is on the top level.
30.364 void dirtyTopButOne(Item i) {
30.365 - _level.set(i, _max_level - 1);
30.366 + _level[i] = _max_level - 1;
30.367 }
30.368
30.369 ///Lift all items on and above the given level to the top level.
30.370 @@ -899,7 +899,7 @@
30.371 for (int i = l + 1; _first[i] != INVALID; ++i) {
30.372 Item n = _first[i];
30.373 while (n != INVALID) {
30.374 - _level.set(n, _max_level);
30.375 + _level[n] = _max_level;
30.376 n = _next[n];
30.377 }
30.378 _first[i] = INVALID;
30.379 @@ -937,23 +937,23 @@
30.380 _init_level = 0;
30.381 for(typename ItemSetTraits<GR,Item>::ItemIt i(_graph);
30.382 i != INVALID; ++i) {
30.383 - _level.set(i, _max_level);
30.384 - _active.set(i, false);
30.385 + _level[i] = _max_level;
30.386 + _active[i] = false;
30.387 }
30.388 }
30.389
30.390 ///Add an item to the current level.
30.391 void initAddItem(Item i) {
30.392 - _level.set(i, _init_level);
30.393 + _level[i] = _init_level;
30.394 if (_last[_init_level] == INVALID) {
30.395 _first[_init_level] = i;
30.396 _last[_init_level] = i;
30.397 - _prev.set(i, INVALID);
30.398 - _next.set(i, INVALID);
30.399 + _prev[i] = INVALID;
30.400 + _next[i] = INVALID;
30.401 } else {
30.402 - _prev.set(i, _last[_init_level]);
30.403 - _next.set(i, INVALID);
30.404 - _next.set(_last[_init_level], i);
30.405 + _prev[i] = _last[_init_level];
30.406 + _next[i] = INVALID;
30.407 + _next[_last[_init_level]] = i;
30.408 _last[_init_level] = i;
30.409 }
30.410 }
31.1 --- a/lemon/euler.h Sat Apr 18 21:54:30 2009 +0200
31.2 +++ b/lemon/euler.h Tue Apr 21 10:34:49 2009 +0100
31.3 @@ -24,7 +24,7 @@
31.4 #include<lemon/connectivity.h>
31.5 #include <list>
31.6
31.7 -/// \ingroup graph_prop
31.8 +/// \ingroup graph_properties
31.9 /// \file
31.10 /// \brief Euler tour
31.11 ///
31.12 @@ -36,7 +36,7 @@
31.13
31.14 ///Euler iterator for digraphs.
31.15
31.16 - /// \ingroup graph_prop
31.17 + /// \ingroup graph_properties
31.18 ///This iterator converts to the \c Arc type of the digraph and using
31.19 ///operator ++, it provides an Euler tour of a \e directed
31.20 ///graph (if there exists).
31.21 @@ -123,7 +123,7 @@
31.22
31.23 ///Euler iterator for graphs.
31.24
31.25 - /// \ingroup graph_prop
31.26 + /// \ingroup graph_properties
31.27 ///This iterator converts to the \c Arc (or \c Edge)
31.28 ///type of the digraph and using
31.29 ///operator ++, it provides an Euler tour of an undirected
31.30 @@ -228,7 +228,7 @@
31.31
31.32 ///Checks if the graph is Eulerian
31.33
31.34 - /// \ingroup graph_prop
31.35 + /// \ingroup graph_properties
31.36 ///Checks if the graph is Eulerian. It works for both directed and undirected
31.37 ///graphs.
31.38 ///\note By definition, a digraph is called \e Eulerian if
32.1 --- a/lemon/full_graph.h Sat Apr 18 21:54:30 2009 +0200
32.2 +++ b/lemon/full_graph.h Tue Apr 21 10:34:49 2009 +0100
32.3 @@ -157,9 +157,8 @@
32.4 /// can neither add nor delete either arcs or nodes, and it needs
32.5 /// constant space in memory.
32.6 ///
32.7 - /// This class conforms to the \ref concepts::Digraph "Digraph" concept
32.8 - /// and it also has an important extra feature that its maps are
32.9 - /// real \ref concepts::ReferenceMap "reference map"s.
32.10 + /// This class fully conforms to the \ref concepts::Digraph
32.11 + /// "Digraph concept".
32.12 ///
32.13 /// The \c FullDigraph and \c FullGraph classes are very similar,
32.14 /// but there are two differences. While this class conforms only
32.15 @@ -527,9 +526,7 @@
32.16 /// add nor delete either edges or nodes, and it needs constant
32.17 /// space in memory.
32.18 ///
32.19 - /// This class conforms to the \ref concepts::Graph "Graph" concept
32.20 - /// and it also has an important extra feature that its maps are
32.21 - /// real \ref concepts::ReferenceMap "reference map"s.
32.22 + /// This class fully conforms to the \ref concepts::Graph "Graph concept".
32.23 ///
32.24 /// The \c FullGraph and \c FullDigraph classes are very similar,
32.25 /// but there are two differences. While the \c FullDigraph class
33.1 --- a/lemon/glpk.cc Sat Apr 18 21:54:30 2009 +0200
33.2 +++ b/lemon/glpk.cc Tue Apr 21 10:34:49 2009 +0100
33.3 @@ -31,6 +31,7 @@
33.4 GlpkBase::GlpkBase() : LpBase() {
33.5 lp = glp_create_prob();
33.6 glp_create_index(lp);
33.7 + messageLevel(MESSAGE_NOTHING);
33.8 }
33.9
33.10 GlpkBase::GlpkBase(const GlpkBase &other) : LpBase() {
33.11 @@ -39,6 +40,7 @@
33.12 glp_create_index(lp);
33.13 rows = other.rows;
33.14 cols = other.cols;
33.15 + messageLevel(MESSAGE_NOTHING);
33.16 }
33.17
33.18 GlpkBase::~GlpkBase() {
33.19 @@ -526,19 +528,37 @@
33.20 glp_free_env();
33.21 }
33.22
33.23 + void GlpkBase::_messageLevel(MessageLevel level) {
33.24 + switch (level) {
33.25 + case MESSAGE_NOTHING:
33.26 + _message_level = GLP_MSG_OFF;
33.27 + break;
33.28 + case MESSAGE_ERROR:
33.29 + _message_level = GLP_MSG_ERR;
33.30 + break;
33.31 + case MESSAGE_WARNING:
33.32 + _message_level = GLP_MSG_ERR;
33.33 + break;
33.34 + case MESSAGE_NORMAL:
33.35 + _message_level = GLP_MSG_ON;
33.36 + break;
33.37 + case MESSAGE_VERBOSE:
33.38 + _message_level = GLP_MSG_ALL;
33.39 + break;
33.40 + }
33.41 + }
33.42 +
33.43 GlpkBase::FreeEnvHelper GlpkBase::freeEnvHelper;
33.44
33.45 // GlpkLp members
33.46
33.47 GlpkLp::GlpkLp()
33.48 : LpBase(), LpSolver(), GlpkBase() {
33.49 - messageLevel(MESSAGE_NO_OUTPUT);
33.50 presolver(false);
33.51 }
33.52
33.53 GlpkLp::GlpkLp(const GlpkLp& other)
33.54 : LpBase(other), LpSolver(other), GlpkBase(other) {
33.55 - messageLevel(MESSAGE_NO_OUTPUT);
33.56 presolver(false);
33.57 }
33.58
33.59 @@ -562,20 +582,7 @@
33.60 glp_smcp smcp;
33.61 glp_init_smcp(&smcp);
33.62
33.63 - switch (_message_level) {
33.64 - case MESSAGE_NO_OUTPUT:
33.65 - smcp.msg_lev = GLP_MSG_OFF;
33.66 - break;
33.67 - case MESSAGE_ERROR_MESSAGE:
33.68 - smcp.msg_lev = GLP_MSG_ERR;
33.69 - break;
33.70 - case MESSAGE_NORMAL_OUTPUT:
33.71 - smcp.msg_lev = GLP_MSG_ON;
33.72 - break;
33.73 - case MESSAGE_FULL_OUTPUT:
33.74 - smcp.msg_lev = GLP_MSG_ALL;
33.75 - break;
33.76 - }
33.77 + smcp.msg_lev = _message_level;
33.78 smcp.presolve = _presolve;
33.79
33.80 // If the basis is not valid we get an error return value.
33.81 @@ -604,20 +611,7 @@
33.82 glp_smcp smcp;
33.83 glp_init_smcp(&smcp);
33.84
33.85 - switch (_message_level) {
33.86 - case MESSAGE_NO_OUTPUT:
33.87 - smcp.msg_lev = GLP_MSG_OFF;
33.88 - break;
33.89 - case MESSAGE_ERROR_MESSAGE:
33.90 - smcp.msg_lev = GLP_MSG_ERR;
33.91 - break;
33.92 - case MESSAGE_NORMAL_OUTPUT:
33.93 - smcp.msg_lev = GLP_MSG_ON;
33.94 - break;
33.95 - case MESSAGE_FULL_OUTPUT:
33.96 - smcp.msg_lev = GLP_MSG_ALL;
33.97 - break;
33.98 - }
33.99 + smcp.msg_lev = _message_level;
33.100 smcp.meth = GLP_DUAL;
33.101 smcp.presolve = _presolve;
33.102
33.103 @@ -858,20 +852,14 @@
33.104 _presolve = presolve;
33.105 }
33.106
33.107 - void GlpkLp::messageLevel(MessageLevel m) {
33.108 - _message_level = m;
33.109 - }
33.110 -
33.111 // GlpkMip members
33.112
33.113 GlpkMip::GlpkMip()
33.114 : LpBase(), MipSolver(), GlpkBase() {
33.115 - messageLevel(MESSAGE_NO_OUTPUT);
33.116 }
33.117
33.118 GlpkMip::GlpkMip(const GlpkMip& other)
33.119 : LpBase(), MipSolver(), GlpkBase(other) {
33.120 - messageLevel(MESSAGE_NO_OUTPUT);
33.121 }
33.122
33.123 void GlpkMip::_setColType(int i, GlpkMip::ColTypes col_type) {
33.124 @@ -900,20 +888,7 @@
33.125 glp_smcp smcp;
33.126 glp_init_smcp(&smcp);
33.127
33.128 - switch (_message_level) {
33.129 - case MESSAGE_NO_OUTPUT:
33.130 - smcp.msg_lev = GLP_MSG_OFF;
33.131 - break;
33.132 - case MESSAGE_ERROR_MESSAGE:
33.133 - smcp.msg_lev = GLP_MSG_ERR;
33.134 - break;
33.135 - case MESSAGE_NORMAL_OUTPUT:
33.136 - smcp.msg_lev = GLP_MSG_ON;
33.137 - break;
33.138 - case MESSAGE_FULL_OUTPUT:
33.139 - smcp.msg_lev = GLP_MSG_ALL;
33.140 - break;
33.141 - }
33.142 + smcp.msg_lev = _message_level;
33.143 smcp.meth = GLP_DUAL;
33.144
33.145 // If the basis is not valid we get an error return value.
33.146 @@ -938,20 +913,7 @@
33.147 glp_iocp iocp;
33.148 glp_init_iocp(&iocp);
33.149
33.150 - switch (_message_level) {
33.151 - case MESSAGE_NO_OUTPUT:
33.152 - iocp.msg_lev = GLP_MSG_OFF;
33.153 - break;
33.154 - case MESSAGE_ERROR_MESSAGE:
33.155 - iocp.msg_lev = GLP_MSG_ERR;
33.156 - break;
33.157 - case MESSAGE_NORMAL_OUTPUT:
33.158 - iocp.msg_lev = GLP_MSG_ON;
33.159 - break;
33.160 - case MESSAGE_FULL_OUTPUT:
33.161 - iocp.msg_lev = GLP_MSG_ALL;
33.162 - break;
33.163 - }
33.164 + iocp.msg_lev = _message_level;
33.165
33.166 if (glp_intopt(lp, &iocp) != 0) return UNSOLVED;
33.167 return SOLVED;
33.168 @@ -1002,8 +964,4 @@
33.169
33.170 const char* GlpkMip::_solverName() const { return "GlpkMip"; }
33.171
33.172 - void GlpkMip::messageLevel(MessageLevel m) {
33.173 - _message_level = m;
33.174 - }
33.175 -
33.176 } //END OF NAMESPACE LEMON
34.1 --- a/lemon/glpk.h Sat Apr 18 21:54:30 2009 +0200
34.2 +++ b/lemon/glpk.h Tue Apr 21 10:34:49 2009 +0100
34.3 @@ -100,6 +100,8 @@
34.4
34.5 virtual void _clear();
34.6
34.7 + virtual void _messageLevel(MessageLevel level);
34.8 +
34.9 private:
34.10
34.11 static void freeEnv();
34.12 @@ -111,6 +113,10 @@
34.13 };
34.14
34.15 static FreeEnvHelper freeEnvHelper;
34.16 +
34.17 + protected:
34.18 +
34.19 + int _message_level;
34.20
34.21 public:
34.22
34.23 @@ -191,30 +197,6 @@
34.24 ///The presolver is off by default.
34.25 void presolver(bool presolve);
34.26
34.27 - ///Enum for \c messageLevel() parameter
34.28 - enum MessageLevel {
34.29 - /// no output (default value)
34.30 - MESSAGE_NO_OUTPUT = 0,
34.31 - /// error messages only
34.32 - MESSAGE_ERROR_MESSAGE = 1,
34.33 - /// normal output
34.34 - MESSAGE_NORMAL_OUTPUT = 2,
34.35 - /// full output (includes informational messages)
34.36 - MESSAGE_FULL_OUTPUT = 3
34.37 - };
34.38 -
34.39 - private:
34.40 -
34.41 - MessageLevel _message_level;
34.42 -
34.43 - public:
34.44 -
34.45 - ///Set the verbosity of the messages
34.46 -
34.47 - ///Set the verbosity of the messages
34.48 - ///
34.49 - ///\param m is the level of the messages output by the solver routines.
34.50 - void messageLevel(MessageLevel m);
34.51 };
34.52
34.53 /// \brief Interface for the GLPK MIP solver
34.54 @@ -244,30 +226,6 @@
34.55 virtual Value _getSol(int i) const;
34.56 virtual Value _getSolValue() const;
34.57
34.58 - ///Enum for \c messageLevel() parameter
34.59 - enum MessageLevel {
34.60 - /// no output (default value)
34.61 - MESSAGE_NO_OUTPUT = 0,
34.62 - /// error messages only
34.63 - MESSAGE_ERROR_MESSAGE = 1,
34.64 - /// normal output
34.65 - MESSAGE_NORMAL_OUTPUT = 2,
34.66 - /// full output (includes informational messages)
34.67 - MESSAGE_FULL_OUTPUT = 3
34.68 - };
34.69 -
34.70 - private:
34.71 -
34.72 - MessageLevel _message_level;
34.73 -
34.74 - public:
34.75 -
34.76 - ///Set the verbosity of the messages
34.77 -
34.78 - ///Set the verbosity of the messages
34.79 - ///
34.80 - ///\param m is the level of the messages output by the solver routines.
34.81 - void messageLevel(MessageLevel m);
34.82 };
34.83
34.84
35.1 --- a/lemon/gomory_hu.h Sat Apr 18 21:54:30 2009 +0200
35.2 +++ b/lemon/gomory_hu.h Tue Apr 21 10:34:49 2009 +0100
35.3 @@ -42,24 +42,22 @@
35.4 /// in this tree has the same weight as the minimum cut in the graph
35.5 /// between these nodes. Moreover the components obtained by removing
35.6 /// this edge from the tree determine the corresponding minimum cut.
35.7 - ///
35.8 /// Therefore once this tree is computed, the minimum cut between any pair
35.9 /// of nodes can easily be obtained.
35.10 ///
35.11 /// The algorithm calculates \e n-1 distinct minimum cuts (currently with
35.12 - /// the \ref Preflow algorithm), therefore the algorithm has
35.13 - /// \f$(O(n^3\sqrt{e})\f$ overall time complexity. It calculates a
35.14 - /// rooted Gomory-Hu tree, its structure and the weights can be obtained
35.15 - /// by \c predNode(), \c predValue() and \c rootDist().
35.16 - ///
35.17 - /// The members \c minCutMap() and \c minCutValue() calculate
35.18 + /// the \ref Preflow algorithm), thus it has \f$O(n^3\sqrt{e})\f$ overall
35.19 + /// time complexity. It calculates a rooted Gomory-Hu tree.
35.20 + /// The structure of the tree and the edge weights can be
35.21 + /// obtained using \c predNode(), \c predValue() and \c rootDist().
35.22 + /// The functions \c minCutMap() and \c minCutValue() calculate
35.23 /// the minimum cut and the minimum cut value between any two nodes
35.24 /// in the graph. You can also list (iterate on) the nodes and the
35.25 /// edges of the cuts using \c MinCutNodeIt and \c MinCutEdgeIt.
35.26 ///
35.27 /// \tparam GR The type of the undirected graph the algorithm runs on.
35.28 - /// \tparam CAP The type of the edge map describing the edge capacities.
35.29 - /// It is \ref concepts::Graph::EdgeMap "GR::EdgeMap<int>" by default.
35.30 + /// \tparam CAP The type of the edge map containing the capacities.
35.31 + /// The default map type is \ref concepts::Graph::EdgeMap "GR::EdgeMap<int>".
35.32 #ifdef DOXYGEN
35.33 template <typename GR,
35.34 typename CAP>
35.35 @@ -70,9 +68,9 @@
35.36 class GomoryHu {
35.37 public:
35.38
35.39 - /// The graph type
35.40 + /// The graph type of the algorithm
35.41 typedef GR Graph;
35.42 - /// The type of the edge capacity map
35.43 + /// The capacity map type of the algorithm
35.44 typedef CAP Capacity;
35.45 /// The value type of capacities
35.46 typedef typename Capacity::Value Value;
35.47 @@ -117,7 +115,7 @@
35.48
35.49 /// \brief Constructor
35.50 ///
35.51 - /// Constructor
35.52 + /// Constructor.
35.53 /// \param graph The undirected graph the algorithm runs on.
35.54 /// \param capacity The edge capacity map.
35.55 GomoryHu(const Graph& graph, const Capacity& capacity)
35.56 @@ -130,7 +128,7 @@
35.57
35.58 /// \brief Destructor
35.59 ///
35.60 - /// Destructor
35.61 + /// Destructor.
35.62 ~GomoryHu() {
35.63 destroyStructures();
35.64 }
35.65 @@ -143,11 +141,11 @@
35.66
35.67 _root = NodeIt(_graph);
35.68 for (NodeIt n(_graph); n != INVALID; ++n) {
35.69 - _pred->set(n, _root);
35.70 - _order->set(n, -1);
35.71 + (*_pred)[n] = _root;
35.72 + (*_order)[n] = -1;
35.73 }
35.74 - _pred->set(_root, INVALID);
35.75 - _weight->set(_root, std::numeric_limits<Value>::max());
35.76 + (*_pred)[_root] = INVALID;
35.77 + (*_weight)[_root] = std::numeric_limits<Value>::max();
35.78 }
35.79
35.80
35.81 @@ -164,22 +162,22 @@
35.82
35.83 fa.runMinCut();
35.84
35.85 - _weight->set(n, fa.flowValue());
35.86 + (*_weight)[n] = fa.flowValue();
35.87
35.88 for (NodeIt nn(_graph); nn != INVALID; ++nn) {
35.89 if (nn != n && fa.minCut(nn) && (*_pred)[nn] == pn) {
35.90 - _pred->set(nn, n);
35.91 + (*_pred)[nn] = n;
35.92 }
35.93 }
35.94 if ((*_pred)[pn] != INVALID && fa.minCut((*_pred)[pn])) {
35.95 - _pred->set(n, (*_pred)[pn]);
35.96 - _pred->set(pn, n);
35.97 - _weight->set(n, (*_weight)[pn]);
35.98 - _weight->set(pn, fa.flowValue());
35.99 + (*_pred)[n] = (*_pred)[pn];
35.100 + (*_pred)[pn] = n;
35.101 + (*_weight)[n] = (*_weight)[pn];
35.102 + (*_weight)[pn] = fa.flowValue();
35.103 }
35.104 }
35.105
35.106 - _order->set(_root, 0);
35.107 + (*_order)[_root] = 0;
35.108 int index = 1;
35.109
35.110 for (NodeIt n(_graph); n != INVALID; ++n) {
35.111 @@ -190,7 +188,7 @@
35.112 nn = (*_pred)[nn];
35.113 }
35.114 while (!st.empty()) {
35.115 - _order->set(st.back(), index++);
35.116 + (*_order)[st.back()] = index++;
35.117 st.pop_back();
35.118 }
35.119 }
35.120 @@ -215,43 +213,53 @@
35.121 ///\name Query Functions
35.122 ///The results of the algorithm can be obtained using these
35.123 ///functions.\n
35.124 - ///\ref run() "run()" should be called before using them.\n
35.125 + ///\ref run() should be called before using them.\n
35.126 ///See also \ref MinCutNodeIt and \ref MinCutEdgeIt.
35.127
35.128 ///@{
35.129
35.130 /// \brief Return the predecessor node in the Gomory-Hu tree.
35.131 ///
35.132 - /// This function returns the predecessor node in the Gomory-Hu tree.
35.133 - /// If the node is
35.134 - /// the root of the Gomory-Hu tree, then it returns \c INVALID.
35.135 - Node predNode(const Node& node) {
35.136 + /// This function returns the predecessor node of the given node
35.137 + /// in the Gomory-Hu tree.
35.138 + /// If \c node is the root of the tree, then it returns \c INVALID.
35.139 + ///
35.140 + /// \pre \ref run() must be called before using this function.
35.141 + Node predNode(const Node& node) const {
35.142 return (*_pred)[node];
35.143 }
35.144
35.145 - /// \brief Return the distance from the root node in the Gomory-Hu tree.
35.146 - ///
35.147 - /// This function returns the distance of \c node from the root node
35.148 - /// in the Gomory-Hu tree.
35.149 - int rootDist(const Node& node) {
35.150 - return (*_order)[node];
35.151 - }
35.152 -
35.153 /// \brief Return the weight of the predecessor edge in the
35.154 /// Gomory-Hu tree.
35.155 ///
35.156 - /// This function returns the weight of the predecessor edge in the
35.157 - /// Gomory-Hu tree. If the node is the root, the result is undefined.
35.158 - Value predValue(const Node& node) {
35.159 + /// This function returns the weight of the predecessor edge of the
35.160 + /// given node in the Gomory-Hu tree.
35.161 + /// If \c node is the root of the tree, the result is undefined.
35.162 + ///
35.163 + /// \pre \ref run() must be called before using this function.
35.164 + Value predValue(const Node& node) const {
35.165 return (*_weight)[node];
35.166 }
35.167
35.168 + /// \brief Return the distance from the root node in the Gomory-Hu tree.
35.169 + ///
35.170 + /// This function returns the distance of the given node from the root
35.171 + /// node in the Gomory-Hu tree.
35.172 + ///
35.173 + /// \pre \ref run() must be called before using this function.
35.174 + int rootDist(const Node& node) const {
35.175 + return (*_order)[node];
35.176 + }
35.177 +
35.178 /// \brief Return the minimum cut value between two nodes
35.179 ///
35.180 - /// This function returns the minimum cut value between two nodes. The
35.181 - /// algorithm finds the nearest common ancestor in the Gomory-Hu
35.182 - /// tree and calculates the minimum weight edge on the paths to
35.183 - /// the ancestor.
35.184 + /// This function returns the minimum cut value between the nodes
35.185 + /// \c s and \c t.
35.186 + /// It finds the nearest common ancestor of the given nodes in the
35.187 + /// Gomory-Hu tree and calculates the minimum weight edge on the
35.188 + /// paths to the ancestor.
35.189 + ///
35.190 + /// \pre \ref run() must be called before using this function.
35.191 Value minCutValue(const Node& s, const Node& t) const {
35.192 Node sn = s, tn = t;
35.193 Value value = std::numeric_limits<Value>::max();
35.194 @@ -274,16 +282,23 @@
35.195 /// in the \c cutMap parameter by setting the nodes in the component of
35.196 /// \c s to \c true and the other nodes to \c false.
35.197 ///
35.198 - /// For higher level interfaces, see MinCutNodeIt and MinCutEdgeIt.
35.199 + /// For higher level interfaces see MinCutNodeIt and MinCutEdgeIt.
35.200 + ///
35.201 + /// \param s The base node.
35.202 + /// \param t The node you want to separate from node \c s.
35.203 + /// \param cutMap The cut will be returned in this map.
35.204 + /// It must be a \c bool (or convertible) \ref concepts::ReadWriteMap
35.205 + /// "ReadWriteMap" on the graph nodes.
35.206 + ///
35.207 + /// \return The value of the minimum cut between \c s and \c t.
35.208 + ///
35.209 + /// \pre \ref run() must be called before using this function.
35.210 template <typename CutMap>
35.211 - Value minCutMap(const Node& s, ///< The base node.
35.212 + Value minCutMap(const Node& s, ///<
35.213 const Node& t,
35.214 - ///< The node you want to separate from node \c s.
35.215 + ///<
35.216 CutMap& cutMap
35.217 - ///< The cut will be returned in this map.
35.218 - /// It must be a \c bool (or convertible)
35.219 - /// \ref concepts::ReadWriteMap "ReadWriteMap"
35.220 - /// on the graph nodes.
35.221 + ///<
35.222 ) const {
35.223 Node sn = s, tn = t;
35.224 bool s_root=false;
35.225 @@ -309,9 +324,9 @@
35.226 }
35.227
35.228 typename Graph::template NodeMap<bool> reached(_graph, false);
35.229 - reached.set(_root, true);
35.230 + reached[_root] = true;
35.231 cutMap.set(_root, !s_root);
35.232 - reached.set(rn, true);
35.233 + reached[rn] = true;
35.234 cutMap.set(rn, s_root);
35.235
35.236 std::vector<Node> st;
35.237 @@ -338,7 +353,7 @@
35.238 /// Iterate on the nodes of a minimum cut
35.239
35.240 /// This iterator class lists the nodes of a minimum cut found by
35.241 - /// GomoryHu. Before using it, you must allocate a GomoryHu class,
35.242 + /// GomoryHu. Before using it, you must allocate a GomoryHu class
35.243 /// and call its \ref GomoryHu::run() "run()" method.
35.244 ///
35.245 /// This example counts the nodes in the minimum cut separating \c s from
35.246 @@ -435,7 +450,7 @@
35.247 /// Iterate on the edges of a minimum cut
35.248
35.249 /// This iterator class lists the edges of a minimum cut found by
35.250 - /// GomoryHu. Before using it, you must allocate a GomoryHu class,
35.251 + /// GomoryHu. Before using it, you must allocate a GomoryHu class
35.252 /// and call its \ref GomoryHu::run() "run()" method.
35.253 ///
35.254 /// This example computes the value of the minimum cut separating \c s from
35.255 @@ -447,8 +462,8 @@
35.256 /// for(GomoruHu<Graph>::MinCutEdgeIt e(gom,s,t); e!=INVALID; ++e)
35.257 /// value+=capacities[e];
35.258 /// \endcode
35.259 - /// the result will be the same as it is returned by
35.260 - /// \ref GomoryHu::minCutValue() "gom.minCutValue(s,t)"
35.261 + /// The result will be the same as the value returned by
35.262 + /// \ref GomoryHu::minCutValue() "gom.minCutValue(s,t)".
35.263 class MinCutEdgeIt
35.264 {
35.265 bool _side;
35.266 @@ -468,6 +483,10 @@
35.267 }
35.268
35.269 public:
35.270 + /// Constructor
35.271 +
35.272 + /// Constructor.
35.273 + ///
35.274 MinCutEdgeIt(GomoryHu const &gomory,
35.275 ///< The GomoryHu class. You must call its
35.276 /// run() method
35.277 @@ -478,7 +497,7 @@
35.278 bool side=true
35.279 ///< If it is \c true (default) then the listed arcs
35.280 /// will be oriented from the
35.281 - /// the nodes of the component containing \c s,
35.282 + /// nodes of the component containing \c s,
35.283 /// otherwise they will be oriented in the opposite
35.284 /// direction.
35.285 )
36.1 --- a/lemon/graph_to_eps.h Sat Apr 18 21:54:30 2009 +0200
36.2 +++ b/lemon/graph_to_eps.h Tue Apr 21 10:34:49 2009 +0100
36.3 @@ -268,22 +268,18 @@
36.4 /// = 1
36.5 ///\image html nodeshape_1.png
36.6 ///\image latex nodeshape_1.eps "SQUARE shape (1)" width=2cm
36.7 - ///
36.8 SQUARE=1,
36.9 /// = 2
36.10 ///\image html nodeshape_2.png
36.11 ///\image latex nodeshape_2.eps "DIAMOND shape (2)" width=2cm
36.12 - ///
36.13 DIAMOND=2,
36.14 /// = 3
36.15 ///\image html nodeshape_3.png
36.16 - ///\image latex nodeshape_2.eps "MALE shape (4)" width=2cm
36.17 - ///
36.18 + ///\image latex nodeshape_3.eps "MALE shape (3)" width=2cm
36.19 MALE=3,
36.20 /// = 4
36.21 ///\image html nodeshape_4.png
36.22 - ///\image latex nodeshape_2.eps "FEMALE shape (4)" width=2cm
36.23 - ///
36.24 + ///\image latex nodeshape_4.eps "FEMALE shape (4)" width=2cm
36.25 FEMALE=4
36.26 };
36.27
37.1 --- a/lemon/grid_graph.h Sat Apr 18 21:54:30 2009 +0200
37.2 +++ b/lemon/grid_graph.h Tue Apr 21 10:34:49 2009 +0100
37.3 @@ -497,9 +497,7 @@
37.4 ///\endcode
37.5 ///
37.6 /// This graph type fully conforms to the \ref concepts::Graph
37.7 - /// "Graph" concept, and it also has an important extra feature
37.8 - /// that its maps are real \ref concepts::ReferenceMap
37.9 - /// "reference map"s.
37.10 + /// "Graph concept".
37.11 class GridGraph : public ExtendedGridGraphBase {
37.12 public:
37.13
38.1 --- a/lemon/hao_orlin.h Sat Apr 18 21:54:30 2009 +0200
38.2 +++ b/lemon/hao_orlin.h Tue Apr 21 10:34:49 2009 +0100
38.3 @@ -31,39 +31,41 @@
38.4 /// \ingroup min_cut
38.5 /// \brief Implementation of the Hao-Orlin algorithm.
38.6 ///
38.7 -/// Implementation of the Hao-Orlin algorithm class for testing network
38.8 -/// reliability.
38.9 +/// Implementation of the Hao-Orlin algorithm for finding a minimum cut
38.10 +/// in a digraph.
38.11
38.12 namespace lemon {
38.13
38.14 /// \ingroup min_cut
38.15 ///
38.16 - /// \brief %Hao-Orlin algorithm to find a minimum cut in directed graphs.
38.17 + /// \brief Hao-Orlin algorithm for finding a minimum cut in a digraph.
38.18 ///
38.19 - /// Hao-Orlin calculates a minimum cut in a directed graph
38.20 - /// \f$D=(V,A)\f$. It takes a fixed node \f$ source \in V \f$ and
38.21 + /// This class implements the Hao-Orlin algorithm for finding a minimum
38.22 + /// value cut in a directed graph \f$D=(V,A)\f$.
38.23 + /// It takes a fixed node \f$ source \in V \f$ and
38.24 /// consists of two phases: in the first phase it determines a
38.25 /// minimum cut with \f$ source \f$ on the source-side (i.e. a set
38.26 - /// \f$ X\subsetneq V \f$ with \f$ source \in X \f$ and minimal
38.27 - /// out-degree) and in the second phase it determines a minimum cut
38.28 + /// \f$ X\subsetneq V \f$ with \f$ source \in X \f$ and minimal outgoing
38.29 + /// capacity) and in the second phase it determines a minimum cut
38.30 /// with \f$ source \f$ on the sink-side (i.e. a set
38.31 - /// \f$ X\subsetneq V \f$ with \f$ source \notin X \f$ and minimal
38.32 - /// out-degree). Obviously, the smaller of these two cuts will be a
38.33 + /// \f$ X\subsetneq V \f$ with \f$ source \notin X \f$ and minimal outgoing
38.34 + /// capacity). Obviously, the smaller of these two cuts will be a
38.35 /// minimum cut of \f$ D \f$. The algorithm is a modified
38.36 - /// push-relabel preflow algorithm and our implementation calculates
38.37 + /// preflow push-relabel algorithm. Our implementation calculates
38.38 /// the minimum cut in \f$ O(n^2\sqrt{m}) \f$ time (we use the
38.39 /// highest-label rule), or in \f$O(nm)\f$ for unit capacities. The
38.40 - /// purpose of such algorithm is testing network reliability. For an
38.41 - /// undirected graph you can run just the first phase of the
38.42 - /// algorithm or you can use the algorithm of Nagamochi and Ibaraki
38.43 - /// which solves the undirected problem in
38.44 - /// \f$ O(nm + n^2 \log n) \f$ time: it is implemented in the
38.45 - /// NagamochiIbaraki algorithm class.
38.46 + /// purpose of such algorithm is e.g. testing network reliability.
38.47 ///
38.48 - /// \param GR The digraph class the algorithm runs on.
38.49 - /// \param CAP An arc map of capacities which can be any numreric type.
38.50 - /// The default type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
38.51 - /// \param TOL Tolerance class for handling inexact computations. The
38.52 + /// For an undirected graph you can run just the first phase of the
38.53 + /// algorithm or you can use the algorithm of Nagamochi and Ibaraki,
38.54 + /// which solves the undirected problem in \f$ O(nm + n^2 \log n) \f$
38.55 + /// time. It is implemented in the NagamochiIbaraki algorithm class.
38.56 + ///
38.57 + /// \tparam GR The type of the digraph the algorithm runs on.
38.58 + /// \tparam CAP The type of the arc map containing the capacities,
38.59 + /// which can be any numreric type. The default map type is
38.60 + /// \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
38.61 + /// \tparam TOL Tolerance class for handling inexact computations. The
38.62 /// default tolerance type is \ref Tolerance "Tolerance<CAP::Value>".
38.63 #ifdef DOXYGEN
38.64 template <typename GR, typename CAP, typename TOL>
38.65 @@ -73,15 +75,20 @@
38.66 typename TOL = Tolerance<typename CAP::Value> >
38.67 #endif
38.68 class HaoOrlin {
38.69 + public:
38.70 +
38.71 + /// The digraph type of the algorithm
38.72 + typedef GR Digraph;
38.73 + /// The capacity map type of the algorithm
38.74 + typedef CAP CapacityMap;
38.75 + /// The tolerance type of the algorithm
38.76 + typedef TOL Tolerance;
38.77 +
38.78 private:
38.79
38.80 - typedef GR Digraph;
38.81 - typedef CAP CapacityMap;
38.82 - typedef TOL Tolerance;
38.83 -
38.84 typedef typename CapacityMap::Value Value;
38.85
38.86 - TEMPLATE_GRAPH_TYPEDEFS(Digraph);
38.87 + TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
38.88
38.89 const Digraph& _graph;
38.90 const CapacityMap* _capacity;
38.91 @@ -161,56 +168,56 @@
38.92 private:
38.93
38.94 void activate(const Node& i) {
38.95 - _active->set(i, true);
38.96 + (*_active)[i] = true;
38.97
38.98 int bucket = (*_bucket)[i];
38.99
38.100 if ((*_prev)[i] == INVALID || (*_active)[(*_prev)[i]]) return;
38.101 //unlace
38.102 - _next->set((*_prev)[i], (*_next)[i]);
38.103 + (*_next)[(*_prev)[i]] = (*_next)[i];
38.104 if ((*_next)[i] != INVALID) {
38.105 - _prev->set((*_next)[i], (*_prev)[i]);
38.106 + (*_prev)[(*_next)[i]] = (*_prev)[i];
38.107 } else {
38.108 _last[bucket] = (*_prev)[i];
38.109 }
38.110 //lace
38.111 - _next->set(i, _first[bucket]);
38.112 - _prev->set(_first[bucket], i);
38.113 - _prev->set(i, INVALID);
38.114 + (*_next)[i] = _first[bucket];
38.115 + (*_prev)[_first[bucket]] = i;
38.116 + (*_prev)[i] = INVALID;
38.117 _first[bucket] = i;
38.118 }
38.119
38.120 void deactivate(const Node& i) {
38.121 - _active->set(i, false);
38.122 + (*_active)[i] = false;
38.123 int bucket = (*_bucket)[i];
38.124
38.125 if ((*_next)[i] == INVALID || !(*_active)[(*_next)[i]]) return;
38.126
38.127 //unlace
38.128 - _prev->set((*_next)[i], (*_prev)[i]);
38.129 + (*_prev)[(*_next)[i]] = (*_prev)[i];
38.130 if ((*_prev)[i] != INVALID) {
38.131 - _next->set((*_prev)[i], (*_next)[i]);
38.132 + (*_next)[(*_prev)[i]] = (*_next)[i];
38.133 } else {
38.134 _first[bucket] = (*_next)[i];
38.135 }
38.136 //lace
38.137 - _prev->set(i, _last[bucket]);
38.138 - _next->set(_last[bucket], i);
38.139 - _next->set(i, INVALID);
38.140 + (*_prev)[i] = _last[bucket];
38.141 + (*_next)[_last[bucket]] = i;
38.142 + (*_next)[i] = INVALID;
38.143 _last[bucket] = i;
38.144 }
38.145
38.146 void addItem(const Node& i, int bucket) {
38.147 (*_bucket)[i] = bucket;
38.148 if (_last[bucket] != INVALID) {
38.149 - _prev->set(i, _last[bucket]);
38.150 - _next->set(_last[bucket], i);
38.151 - _next->set(i, INVALID);
38.152 + (*_prev)[i] = _last[bucket];
38.153 + (*_next)[_last[bucket]] = i;
38.154 + (*_next)[i] = INVALID;
38.155 _last[bucket] = i;
38.156 } else {
38.157 - _prev->set(i, INVALID);
38.158 + (*_prev)[i] = INVALID;
38.159 _first[bucket] = i;
38.160 - _next->set(i, INVALID);
38.161 + (*_next)[i] = INVALID;
38.162 _last[bucket] = i;
38.163 }
38.164 }
38.165 @@ -218,11 +225,12 @@
38.166 void findMinCutOut() {
38.167
38.168 for (NodeIt n(_graph); n != INVALID; ++n) {
38.169 - _excess->set(n, 0);
38.170 + (*_excess)[n] = 0;
38.171 + (*_source_set)[n] = false;
38.172 }
38.173
38.174 for (ArcIt a(_graph); a != INVALID; ++a) {
38.175 - _flow->set(a, 0);
38.176 + (*_flow)[a] = 0;
38.177 }
38.178
38.179 int bucket_num = 0;
38.180 @@ -232,7 +240,7 @@
38.181 {
38.182 typename Digraph::template NodeMap<bool> reached(_graph, false);
38.183
38.184 - reached.set(_source, true);
38.185 + reached[_source] = true;
38.186 bool first_set = true;
38.187
38.188 for (NodeIt t(_graph); t != INVALID; ++t) {
38.189 @@ -240,7 +248,7 @@
38.190 _sets.push_front(std::list<int>());
38.191
38.192 queue[qlast++] = t;
38.193 - reached.set(t, true);
38.194 + reached[t] = true;
38.195
38.196 while (qfirst != qlast) {
38.197 if (qsep == qfirst) {
38.198 @@ -257,7 +265,7 @@
38.199 for (InArcIt a(_graph, n); a != INVALID; ++a) {
38.200 Node u = _graph.source(a);
38.201 if (!reached[u] && _tolerance.positive((*_capacity)[a])) {
38.202 - reached.set(u, true);
38.203 + reached[u] = true;
38.204 queue[qlast++] = u;
38.205 }
38.206 }
38.207 @@ -266,18 +274,18 @@
38.208 }
38.209
38.210 ++bucket_num;
38.211 - _bucket->set(_source, 0);
38.212 + (*_bucket)[_source] = 0;
38.213 _dormant[0] = true;
38.214 }
38.215 - _source_set->set(_source, true);
38.216 + (*_source_set)[_source] = true;
38.217
38.218 Node target = _last[_sets.back().back()];
38.219 {
38.220 for (OutArcIt a(_graph, _source); a != INVALID; ++a) {
38.221 if (_tolerance.positive((*_capacity)[a])) {
38.222 Node u = _graph.target(a);
38.223 - _flow->set(a, (*_capacity)[a]);
38.224 - _excess->set(u, (*_excess)[u] + (*_capacity)[a]);
38.225 + (*_flow)[a] = (*_capacity)[a];
38.226 + (*_excess)[u] += (*_capacity)[a];
38.227 if (!(*_active)[u] && u != _source) {
38.228 activate(u);
38.229 }
38.230 @@ -318,14 +326,14 @@
38.231 activate(v);
38.232 }
38.233 if (!_tolerance.less(rem, excess)) {
38.234 - _flow->set(a, (*_flow)[a] + excess);
38.235 - _excess->set(v, (*_excess)[v] + excess);
38.236 + (*_flow)[a] += excess;
38.237 + (*_excess)[v] += excess;
38.238 excess = 0;
38.239 goto no_more_push;
38.240 } else {
38.241 excess -= rem;
38.242 - _excess->set(v, (*_excess)[v] + rem);
38.243 - _flow->set(a, (*_capacity)[a]);
38.244 + (*_excess)[v] += rem;
38.245 + (*_flow)[a] = (*_capacity)[a];
38.246 }
38.247 } else if (next_bucket > (*_bucket)[v]) {
38.248 next_bucket = (*_bucket)[v];
38.249 @@ -342,14 +350,14 @@
38.250 activate(v);
38.251 }
38.252 if (!_tolerance.less(rem, excess)) {
38.253 - _flow->set(a, (*_flow)[a] - excess);
38.254 - _excess->set(v, (*_excess)[v] + excess);
38.255 + (*_flow)[a] -= excess;
38.256 + (*_excess)[v] += excess;
38.257 excess = 0;
38.258 goto no_more_push;
38.259 } else {
38.260 excess -= rem;
38.261 - _excess->set(v, (*_excess)[v] + rem);
38.262 - _flow->set(a, 0);
38.263 + (*_excess)[v] += rem;
38.264 + (*_flow)[a] = 0;
38.265 }
38.266 } else if (next_bucket > (*_bucket)[v]) {
38.267 next_bucket = (*_bucket)[v];
38.268 @@ -358,7 +366,7 @@
38.269
38.270 no_more_push:
38.271
38.272 - _excess->set(n, excess);
38.273 + (*_excess)[n] = excess;
38.274
38.275 if (excess != 0) {
38.276 if ((*_next)[n] == INVALID) {
38.277 @@ -376,16 +384,16 @@
38.278 }
38.279 } else if (next_bucket == _node_num) {
38.280 _first[(*_bucket)[n]] = (*_next)[n];
38.281 - _prev->set((*_next)[n], INVALID);
38.282 + (*_prev)[(*_next)[n]] = INVALID;
38.283
38.284 std::list<std::list<int> >::iterator new_set =
38.285 _sets.insert(--_sets.end(), std::list<int>());
38.286
38.287 new_set->push_front(bucket_num);
38.288 - _bucket->set(n, bucket_num);
38.289 + (*_bucket)[n] = bucket_num;
38.290 _first[bucket_num] = _last[bucket_num] = n;
38.291 - _next->set(n, INVALID);
38.292 - _prev->set(n, INVALID);
38.293 + (*_next)[n] = INVALID;
38.294 + (*_prev)[n] = INVALID;
38.295 _dormant[bucket_num] = true;
38.296 ++bucket_num;
38.297
38.298 @@ -395,7 +403,7 @@
38.299 }
38.300 } else {
38.301 _first[*_highest] = (*_next)[n];
38.302 - _prev->set((*_next)[n], INVALID);
38.303 + (*_prev)[(*_next)[n]] = INVALID;
38.304
38.305 while (next_bucket != *_highest) {
38.306 --_highest;
38.307 @@ -409,10 +417,10 @@
38.308 }
38.309 --_highest;
38.310
38.311 - _bucket->set(n, *_highest);
38.312 - _next->set(n, _first[*_highest]);
38.313 + (*_bucket)[n] = *_highest;
38.314 + (*_next)[n] = _first[*_highest];
38.315 if (_first[*_highest] != INVALID) {
38.316 - _prev->set(_first[*_highest], n);
38.317 + (*_prev)[_first[*_highest]] = n;
38.318 } else {
38.319 _last[*_highest] = n;
38.320 }
38.321 @@ -434,13 +442,13 @@
38.322 if ((*_excess)[target] < _min_cut) {
38.323 _min_cut = (*_excess)[target];
38.324 for (NodeIt i(_graph); i != INVALID; ++i) {
38.325 - _min_cut_map->set(i, true);
38.326 + (*_min_cut_map)[i] = true;
38.327 }
38.328 for (std::list<int>::iterator it = _sets.back().begin();
38.329 it != _sets.back().end(); ++it) {
38.330 Node n = _first[*it];
38.331 while (n != INVALID) {
38.332 - _min_cut_map->set(n, false);
38.333 + (*_min_cut_map)[n] = false;
38.334 n = (*_next)[n];
38.335 }
38.336 }
38.337 @@ -453,13 +461,13 @@
38.338 _last[(*_bucket)[target]] = (*_prev)[target];
38.339 new_target = (*_prev)[target];
38.340 } else {
38.341 - _prev->set((*_next)[target], (*_prev)[target]);
38.342 + (*_prev)[(*_next)[target]] = (*_prev)[target];
38.343 new_target = (*_next)[target];
38.344 }
38.345 if ((*_prev)[target] == INVALID) {
38.346 _first[(*_bucket)[target]] = (*_next)[target];
38.347 } else {
38.348 - _next->set((*_prev)[target], (*_next)[target]);
38.349 + (*_next)[(*_prev)[target]] = (*_next)[target];
38.350 }
38.351 } else {
38.352 _sets.back().pop_back();
38.353 @@ -475,9 +483,9 @@
38.354 new_target = _last[_sets.back().back()];
38.355 }
38.356
38.357 - _bucket->set(target, 0);
38.358 + (*_bucket)[target] = 0;
38.359
38.360 - _source_set->set(target, true);
38.361 + (*_source_set)[target] = true;
38.362 for (OutArcIt a(_graph, target); a != INVALID; ++a) {
38.363 Value rem = (*_capacity)[a] - (*_flow)[a];
38.364 if (!_tolerance.positive(rem)) continue;
38.365 @@ -485,8 +493,8 @@
38.366 if (!(*_active)[v] && !(*_source_set)[v]) {
38.367 activate(v);
38.368 }
38.369 - _excess->set(v, (*_excess)[v] + rem);
38.370 - _flow->set(a, (*_capacity)[a]);
38.371 + (*_excess)[v] += rem;
38.372 + (*_flow)[a] = (*_capacity)[a];
38.373 }
38.374
38.375 for (InArcIt a(_graph, target); a != INVALID; ++a) {
38.376 @@ -496,8 +504,8 @@
38.377 if (!(*_active)[v] && !(*_source_set)[v]) {
38.378 activate(v);
38.379 }
38.380 - _excess->set(v, (*_excess)[v] + rem);
38.381 - _flow->set(a, 0);
38.382 + (*_excess)[v] += rem;
38.383 + (*_flow)[a] = 0;
38.384 }
38.385
38.386 target = new_target;
38.387 @@ -517,11 +525,12 @@
38.388 void findMinCutIn() {
38.389
38.390 for (NodeIt n(_graph); n != INVALID; ++n) {
38.391 - _excess->set(n, 0);
38.392 + (*_excess)[n] = 0;
38.393 + (*_source_set)[n] = false;
38.394 }
38.395
38.396 for (ArcIt a(_graph); a != INVALID; ++a) {
38.397 - _flow->set(a, 0);
38.398 + (*_flow)[a] = 0;
38.399 }
38.400
38.401 int bucket_num = 0;
38.402 @@ -531,7 +540,7 @@
38.403 {
38.404 typename Digraph::template NodeMap<bool> reached(_graph, false);
38.405
38.406 - reached.set(_source, true);
38.407 + reached[_source] = true;
38.408
38.409 bool first_set = true;
38.410
38.411 @@ -540,7 +549,7 @@
38.412 _sets.push_front(std::list<int>());
38.413
38.414 queue[qlast++] = t;
38.415 - reached.set(t, true);
38.416 + reached[t] = true;
38.417
38.418 while (qfirst != qlast) {
38.419 if (qsep == qfirst) {
38.420 @@ -557,7 +566,7 @@
38.421 for (OutArcIt a(_graph, n); a != INVALID; ++a) {
38.422 Node u = _graph.target(a);
38.423 if (!reached[u] && _tolerance.positive((*_capacity)[a])) {
38.424 - reached.set(u, true);
38.425 + reached[u] = true;
38.426 queue[qlast++] = u;
38.427 }
38.428 }
38.429 @@ -566,18 +575,18 @@
38.430 }
38.431
38.432 ++bucket_num;
38.433 - _bucket->set(_source, 0);
38.434 + (*_bucket)[_source] = 0;
38.435 _dormant[0] = true;
38.436 }
38.437 - _source_set->set(_source, true);
38.438 + (*_source_set)[_source] = true;
38.439
38.440 Node target = _last[_sets.back().back()];
38.441 {
38.442 for (InArcIt a(_graph, _source); a != INVALID; ++a) {
38.443 if (_tolerance.positive((*_capacity)[a])) {
38.444 Node u = _graph.source(a);
38.445 - _flow->set(a, (*_capacity)[a]);
38.446 - _excess->set(u, (*_excess)[u] + (*_capacity)[a]);
38.447 + (*_flow)[a] = (*_capacity)[a];
38.448 + (*_excess)[u] += (*_capacity)[a];
38.449 if (!(*_active)[u] && u != _source) {
38.450 activate(u);
38.451 }
38.452 @@ -618,14 +627,14 @@
38.453 activate(v);
38.454 }
38.455 if (!_tolerance.less(rem, excess)) {
38.456 - _flow->set(a, (*_flow)[a] + excess);
38.457 - _excess->set(v, (*_excess)[v] + excess);
38.458 + (*_flow)[a] += excess;
38.459 + (*_excess)[v] += excess;
38.460 excess = 0;
38.461 goto no_more_push;
38.462 } else {
38.463 excess -= rem;
38.464 - _excess->set(v, (*_excess)[v] + rem);
38.465 - _flow->set(a, (*_capacity)[a]);
38.466 + (*_excess)[v] += rem;
38.467 + (*_flow)[a] = (*_capacity)[a];
38.468 }
38.469 } else if (next_bucket > (*_bucket)[v]) {
38.470 next_bucket = (*_bucket)[v];
38.471 @@ -642,14 +651,14 @@
38.472 activate(v);
38.473 }
38.474 if (!_tolerance.less(rem, excess)) {
38.475 - _flow->set(a, (*_flow)[a] - excess);
38.476 - _excess->set(v, (*_excess)[v] + excess);
38.477 + (*_flow)[a] -= excess;
38.478 + (*_excess)[v] += excess;
38.479 excess = 0;
38.480 goto no_more_push;
38.481 } else {
38.482 excess -= rem;
38.483 - _excess->set(v, (*_excess)[v] + rem);
38.484 - _flow->set(a, 0);
38.485 + (*_excess)[v] += rem;
38.486 + (*_flow)[a] = 0;
38.487 }
38.488 } else if (next_bucket > (*_bucket)[v]) {
38.489 next_bucket = (*_bucket)[v];
38.490 @@ -658,7 +667,7 @@
38.491
38.492 no_more_push:
38.493
38.494 - _excess->set(n, excess);
38.495 + (*_excess)[n] = excess;
38.496
38.497 if (excess != 0) {
38.498 if ((*_next)[n] == INVALID) {
38.499 @@ -676,16 +685,16 @@
38.500 }
38.501 } else if (next_bucket == _node_num) {
38.502 _first[(*_bucket)[n]] = (*_next)[n];
38.503 - _prev->set((*_next)[n], INVALID);
38.504 + (*_prev)[(*_next)[n]] = INVALID;
38.505
38.506 std::list<std::list<int> >::iterator new_set =
38.507 _sets.insert(--_sets.end(), std::list<int>());
38.508
38.509 new_set->push_front(bucket_num);
38.510 - _bucket->set(n, bucket_num);
38.511 + (*_bucket)[n] = bucket_num;
38.512 _first[bucket_num] = _last[bucket_num] = n;
38.513 - _next->set(n, INVALID);
38.514 - _prev->set(n, INVALID);
38.515 + (*_next)[n] = INVALID;
38.516 + (*_prev)[n] = INVALID;
38.517 _dormant[bucket_num] = true;
38.518 ++bucket_num;
38.519
38.520 @@ -695,7 +704,7 @@
38.521 }
38.522 } else {
38.523 _first[*_highest] = (*_next)[n];
38.524 - _prev->set((*_next)[n], INVALID);
38.525 + (*_prev)[(*_next)[n]] = INVALID;
38.526
38.527 while (next_bucket != *_highest) {
38.528 --_highest;
38.529 @@ -708,10 +717,10 @@
38.530 }
38.531 --_highest;
38.532
38.533 - _bucket->set(n, *_highest);
38.534 - _next->set(n, _first[*_highest]);
38.535 + (*_bucket)[n] = *_highest;
38.536 + (*_next)[n] = _first[*_highest];
38.537 if (_first[*_highest] != INVALID) {
38.538 - _prev->set(_first[*_highest], n);
38.539 + (*_prev)[_first[*_highest]] = n;
38.540 } else {
38.541 _last[*_highest] = n;
38.542 }
38.543 @@ -733,13 +742,13 @@
38.544 if ((*_excess)[target] < _min_cut) {
38.545 _min_cut = (*_excess)[target];
38.546 for (NodeIt i(_graph); i != INVALID; ++i) {
38.547 - _min_cut_map->set(i, false);
38.548 + (*_min_cut_map)[i] = false;
38.549 }
38.550 for (std::list<int>::iterator it = _sets.back().begin();
38.551 it != _sets.back().end(); ++it) {
38.552 Node n = _first[*it];
38.553 while (n != INVALID) {
38.554 - _min_cut_map->set(n, true);
38.555 + (*_min_cut_map)[n] = true;
38.556 n = (*_next)[n];
38.557 }
38.558 }
38.559 @@ -752,13 +761,13 @@
38.560 _last[(*_bucket)[target]] = (*_prev)[target];
38.561 new_target = (*_prev)[target];
38.562 } else {
38.563 - _prev->set((*_next)[target], (*_prev)[target]);
38.564 + (*_prev)[(*_next)[target]] = (*_prev)[target];
38.565 new_target = (*_next)[target];
38.566 }
38.567 if ((*_prev)[target] == INVALID) {
38.568 _first[(*_bucket)[target]] = (*_next)[target];
38.569 } else {
38.570 - _next->set((*_prev)[target], (*_next)[target]);
38.571 + (*_next)[(*_prev)[target]] = (*_next)[target];
38.572 }
38.573 } else {
38.574 _sets.back().pop_back();
38.575 @@ -774,9 +783,9 @@
38.576 new_target = _last[_sets.back().back()];
38.577 }
38.578
38.579 - _bucket->set(target, 0);
38.580 + (*_bucket)[target] = 0;
38.581
38.582 - _source_set->set(target, true);
38.583 + (*_source_set)[target] = true;
38.584 for (InArcIt a(_graph, target); a != INVALID; ++a) {
38.585 Value rem = (*_capacity)[a] - (*_flow)[a];
38.586 if (!_tolerance.positive(rem)) continue;
38.587 @@ -784,8 +793,8 @@
38.588 if (!(*_active)[v] && !(*_source_set)[v]) {
38.589 activate(v);
38.590 }
38.591 - _excess->set(v, (*_excess)[v] + rem);
38.592 - _flow->set(a, (*_capacity)[a]);
38.593 + (*_excess)[v] += rem;
38.594 + (*_flow)[a] = (*_capacity)[a];
38.595 }
38.596
38.597 for (OutArcIt a(_graph, target); a != INVALID; ++a) {
38.598 @@ -795,8 +804,8 @@
38.599 if (!(*_active)[v] && !(*_source_set)[v]) {
38.600 activate(v);
38.601 }
38.602 - _excess->set(v, (*_excess)[v] + rem);
38.603 - _flow->set(a, 0);
38.604 + (*_excess)[v] += rem;
38.605 + (*_flow)[a] = 0;
38.606 }
38.607
38.608 target = new_target;
38.609 @@ -815,31 +824,32 @@
38.610
38.611 public:
38.612
38.613 - /// \name Execution control
38.614 + /// \name Execution Control
38.615 /// The simplest way to execute the algorithm is to use
38.616 /// one of the member functions called \ref run().
38.617 /// \n
38.618 - /// If you need more control on the execution,
38.619 - /// first you must call \ref init(), then the \ref calculateIn() or
38.620 - /// \ref calculateOut() functions.
38.621 + /// If you need better control on the execution,
38.622 + /// you have to call one of the \ref init() functions first, then
38.623 + /// \ref calculateOut() and/or \ref calculateIn().
38.624
38.625 /// @{
38.626
38.627 - /// \brief Initializes the internal data structures.
38.628 + /// \brief Initialize the internal data structures.
38.629 ///
38.630 - /// Initializes the internal data structures. It creates
38.631 - /// the maps, residual graph adaptors and some bucket structures
38.632 - /// for the algorithm.
38.633 + /// This function initializes the internal data structures. It creates
38.634 + /// the maps and some bucket structures for the algorithm.
38.635 + /// The first node is used as the source node for the push-relabel
38.636 + /// algorithm.
38.637 void init() {
38.638 init(NodeIt(_graph));
38.639 }
38.640
38.641 - /// \brief Initializes the internal data structures.
38.642 + /// \brief Initialize the internal data structures.
38.643 ///
38.644 - /// Initializes the internal data structures. It creates
38.645 - /// the maps, residual graph adaptor and some bucket structures
38.646 - /// for the algorithm. Node \c source is used as the push-relabel
38.647 - /// algorithm's source.
38.648 + /// This function initializes the internal data structures. It creates
38.649 + /// the maps and some bucket structures for the algorithm.
38.650 + /// The given node is used as the source node for the push-relabel
38.651 + /// algorithm.
38.652 void init(const Node& source) {
38.653 _source = source;
38.654
38.655 @@ -879,31 +889,35 @@
38.656 }
38.657
38.658
38.659 - /// \brief Calculates a minimum cut with \f$ source \f$ on the
38.660 + /// \brief Calculate a minimum cut with \f$ source \f$ on the
38.661 /// source-side.
38.662 ///
38.663 - /// Calculates a minimum cut with \f$ source \f$ on the
38.664 + /// This function calculates a minimum cut with \f$ source \f$ on the
38.665 /// source-side (i.e. a set \f$ X\subsetneq V \f$ with
38.666 - /// \f$ source \in X \f$ and minimal out-degree).
38.667 + /// \f$ source \in X \f$ and minimal outgoing capacity).
38.668 + ///
38.669 + /// \pre \ref init() must be called before using this function.
38.670 void calculateOut() {
38.671 findMinCutOut();
38.672 }
38.673
38.674 - /// \brief Calculates a minimum cut with \f$ source \f$ on the
38.675 - /// target-side.
38.676 + /// \brief Calculate a minimum cut with \f$ source \f$ on the
38.677 + /// sink-side.
38.678 ///
38.679 - /// Calculates a minimum cut with \f$ source \f$ on the
38.680 - /// target-side (i.e. a set \f$ X\subsetneq V \f$ with
38.681 - /// \f$ source \in X \f$ and minimal out-degree).
38.682 + /// This function calculates a minimum cut with \f$ source \f$ on the
38.683 + /// sink-side (i.e. a set \f$ X\subsetneq V \f$ with
38.684 + /// \f$ source \notin X \f$ and minimal outgoing capacity).
38.685 + ///
38.686 + /// \pre \ref init() must be called before using this function.
38.687 void calculateIn() {
38.688 findMinCutIn();
38.689 }
38.690
38.691
38.692 - /// \brief Runs the algorithm.
38.693 + /// \brief Run the algorithm.
38.694 ///
38.695 - /// Runs the algorithm. It finds nodes \c source and \c target
38.696 - /// arbitrarily and then calls \ref init(), \ref calculateOut()
38.697 + /// This function runs the algorithm. It finds nodes \c source and
38.698 + /// \c target arbitrarily and then calls \ref init(), \ref calculateOut()
38.699 /// and \ref calculateIn().
38.700 void run() {
38.701 init();
38.702 @@ -911,11 +925,11 @@
38.703 calculateIn();
38.704 }
38.705
38.706 - /// \brief Runs the algorithm.
38.707 + /// \brief Run the algorithm.
38.708 ///
38.709 - /// Runs the algorithm. It uses the given \c source node, finds a
38.710 - /// proper \c target and then calls the \ref init(), \ref
38.711 - /// calculateOut() and \ref calculateIn().
38.712 + /// This function runs the algorithm. It uses the given \c source node,
38.713 + /// finds a proper \c target node and then calls the \ref init(),
38.714 + /// \ref calculateOut() and \ref calculateIn().
38.715 void run(const Node& s) {
38.716 init(s);
38.717 calculateOut();
38.718 @@ -926,32 +940,41 @@
38.719
38.720 /// \name Query Functions
38.721 /// The result of the %HaoOrlin algorithm
38.722 - /// can be obtained using these functions.
38.723 - /// \n
38.724 - /// Before using these functions, either \ref run(), \ref
38.725 - /// calculateOut() or \ref calculateIn() must be called.
38.726 + /// can be obtained using these functions.\n
38.727 + /// \ref run(), \ref calculateOut() or \ref calculateIn()
38.728 + /// should be called before using them.
38.729
38.730 /// @{
38.731
38.732 - /// \brief Returns the value of the minimum value cut.
38.733 + /// \brief Return the value of the minimum cut.
38.734 ///
38.735 - /// Returns the value of the minimum value cut.
38.736 + /// This function returns the value of the minimum cut.
38.737 + ///
38.738 + /// \pre \ref run(), \ref calculateOut() or \ref calculateIn()
38.739 + /// must be called before using this function.
38.740 Value minCutValue() const {
38.741 return _min_cut;
38.742 }
38.743
38.744
38.745 - /// \brief Returns a minimum cut.
38.746 + /// \brief Return a minimum cut.
38.747 ///
38.748 - /// Sets \c nodeMap to the characteristic vector of a minimum
38.749 - /// value cut: it will give a nonempty set \f$ X\subsetneq V \f$
38.750 - /// with minimal out-degree (i.e. \c nodeMap will be true exactly
38.751 - /// for the nodes of \f$ X \f$). \pre nodeMap should be a
38.752 - /// bool-valued node-map.
38.753 - template <typename NodeMap>
38.754 - Value minCutMap(NodeMap& nodeMap) const {
38.755 + /// This function sets \c cutMap to the characteristic vector of a
38.756 + /// minimum value cut: it will give a non-empty set \f$ X\subsetneq V \f$
38.757 + /// with minimal outgoing capacity (i.e. \c cutMap will be \c true exactly
38.758 + /// for the nodes of \f$ X \f$).
38.759 + ///
38.760 + /// \param cutMap A \ref concepts::WriteMap "writable" node map with
38.761 + /// \c bool (or convertible) value type.
38.762 + ///
38.763 + /// \return The value of the minimum cut.
38.764 + ///
38.765 + /// \pre \ref run(), \ref calculateOut() or \ref calculateIn()
38.766 + /// must be called before using this function.
38.767 + template <typename CutMap>
38.768 + Value minCutMap(CutMap& cutMap) const {
38.769 for (NodeIt it(_graph); it != INVALID; ++it) {
38.770 - nodeMap.set(it, (*_min_cut_map)[it]);
38.771 + cutMap.set(it, (*_min_cut_map)[it]);
38.772 }
38.773 return _min_cut;
38.774 }
38.775 @@ -960,7 +983,6 @@
38.776
38.777 }; //class HaoOrlin
38.778
38.779 -
38.780 } //namespace lemon
38.781
38.782 #endif //LEMON_HAO_ORLIN_H
39.1 --- a/lemon/hypercube_graph.h Sat Apr 18 21:54:30 2009 +0200
39.2 +++ b/lemon/hypercube_graph.h Tue Apr 21 10:34:49 2009 +0100
39.3 @@ -292,9 +292,7 @@
39.4 /// (assuming that the size of \c int is 32 bit).
39.5 ///
39.6 /// This graph type fully conforms to the \ref concepts::Graph
39.7 - /// "Graph" concept, and it also has an important extra feature
39.8 - /// that its maps are real \ref concepts::ReferenceMap
39.9 - /// "reference map"s.
39.10 + /// "Graph concept".
39.11 class HypercubeGraph : public ExtendedHypercubeGraphBase {
39.12 public:
39.13
40.1 --- a/lemon/kruskal.h Sat Apr 18 21:54:30 2009 +0200
40.2 +++ b/lemon/kruskal.h Tue Apr 21 10:34:49 2009 +0100
40.3 @@ -248,11 +248,11 @@
40.4
40.5 /// \ingroup spantree
40.6 ///
40.7 - /// \brief Kruskal algorithm to find a minimum cost spanning tree of
40.8 + /// \brief Kruskal's algorithm for finding a minimum cost spanning tree of
40.9 /// a graph.
40.10 ///
40.11 /// This function runs Kruskal's algorithm to find a minimum cost
40.12 - /// spanning tree.
40.13 + /// spanning tree of a graph.
40.14 /// Due to some C++ hacking, it accepts various input and output types.
40.15 ///
40.16 /// \param g The graph the algorithm runs on.
40.17 @@ -264,17 +264,17 @@
40.18 /// \param in This object is used to describe the arc/edge costs.
40.19 /// It can be one of the following choices.
40.20 /// - An STL compatible 'Forward Container' with
40.21 - /// <tt>std::pair<GR::Arc,X></tt> or
40.22 - /// <tt>std::pair<GR::Edge,X></tt> as its <tt>value_type</tt>, where
40.23 - /// \c X is the type of the costs. The pairs indicates the arcs/edges
40.24 + /// <tt>std::pair<GR::Arc,C></tt> or
40.25 + /// <tt>std::pair<GR::Edge,C></tt> as its <tt>value_type</tt>, where
40.26 + /// \c C is the type of the costs. The pairs indicates the arcs/edges
40.27 /// along with the assigned cost. <em>They must be in a
40.28 /// cost-ascending order.</em>
40.29 /// - Any readable arc/edge map. The values of the map indicate the
40.30 /// arc/edge costs.
40.31 ///
40.32 /// \retval out Here we also have a choice.
40.33 - /// - It can be a writable \c bool arc/edge map. After running the
40.34 - /// algorithm it will contain the found minimum cost spanning
40.35 + /// - It can be a writable arc/edge map with \c bool value type. After
40.36 + /// running the algorithm it will contain the found minimum cost spanning
40.37 /// tree: the value of an arc/edge will be set to \c true if it belongs
40.38 /// to the tree, otherwise it will be set to \c false. The value of
40.39 /// each arc/edge will be set exactly once.
40.40 @@ -301,8 +301,8 @@
40.41 /// forest is calculated instead of a spanning tree.
40.42
40.43 #ifdef DOXYGEN
40.44 - template <class Graph, class In, class Out>
40.45 - Value kruskal(GR const& g, const In& in, Out& out)
40.46 + template <typename Graph, typename In, typename Out>
40.47 + Value kruskal(const Graph& g, const In& in, Out& out)
40.48 #else
40.49 template <class Graph, class In, class Out>
40.50 inline typename _kruskal_bits::KruskalValueSelector<In>::Value
40.51 @@ -314,8 +314,6 @@
40.52 }
40.53
40.54
40.55 -
40.56 -
40.57 template <class Graph, class In, class Out>
40.58 inline typename _kruskal_bits::KruskalValueSelector<In>::Value
40.59 kruskal(const Graph& graph, const In& in, const Out& out)
41.1 --- a/lemon/lgf_reader.h Sat Apr 18 21:54:30 2009 +0200
41.2 +++ b/lemon/lgf_reader.h Tue Apr 21 10:34:49 2009 +0100
41.3 @@ -592,7 +592,7 @@
41.4
41.5 public:
41.6
41.7 - /// \name Reading rules
41.8 + /// \name Reading Rules
41.9 /// @{
41.10
41.11 /// \brief Node map reading rule
41.12 @@ -697,7 +697,7 @@
41.13
41.14 /// @}
41.15
41.16 - /// \name Select section by name
41.17 + /// \name Select Section by Name
41.18 /// @{
41.19
41.20 /// \brief Set \c \@nodes section to be read
41.21 @@ -726,7 +726,7 @@
41.22
41.23 /// @}
41.24
41.25 - /// \name Using previously constructed node or arc set
41.26 + /// \name Using Previously Constructed Node or Arc Set
41.27 /// @{
41.28
41.29 /// \brief Use previously constructed node set
41.30 @@ -1115,7 +1115,7 @@
41.31
41.32 public:
41.33
41.34 - /// \name Execution of the reader
41.35 + /// \name Execution of the Reader
41.36 /// @{
41.37
41.38 /// \brief Start the batch processing
41.39 @@ -1415,7 +1415,7 @@
41.40
41.41 public:
41.42
41.43 - /// \name Reading rules
41.44 + /// \name Reading Rules
41.45 /// @{
41.46
41.47 /// \brief Node map reading rule
41.48 @@ -1566,7 +1566,7 @@
41.49
41.50 /// @}
41.51
41.52 - /// \name Select section by name
41.53 + /// \name Select Section by Name
41.54 /// @{
41.55
41.56 /// \brief Set \c \@nodes section to be read
41.57 @@ -1595,7 +1595,7 @@
41.58
41.59 /// @}
41.60
41.61 - /// \name Using previously constructed node or edge set
41.62 + /// \name Using Previously Constructed Node or Edge Set
41.63 /// @{
41.64
41.65 /// \brief Use previously constructed node set
41.66 @@ -1985,7 +1985,7 @@
41.67
41.68 public:
41.69
41.70 - /// \name Execution of the reader
41.71 + /// \name Execution of the Reader
41.72 /// @{
41.73
41.74 /// \brief Start the batch processing
41.75 @@ -2209,7 +2209,7 @@
41.76
41.77 public:
41.78
41.79 - /// \name Section readers
41.80 + /// \name Section Readers
41.81 /// @{
41.82
41.83 /// \brief Add a section processor with line oriented reading
41.84 @@ -2308,7 +2308,7 @@
41.85 public:
41.86
41.87
41.88 - /// \name Execution of the reader
41.89 + /// \name Execution of the Reader
41.90 /// @{
41.91
41.92 /// \brief Start the batch processing
41.93 @@ -2500,7 +2500,7 @@
41.94 public:
41.95
41.96
41.97 - /// \name Node sections
41.98 + /// \name Node Sections
41.99 /// @{
41.100
41.101 /// \brief Gives back the number of node sections in the file.
41.102 @@ -2526,7 +2526,7 @@
41.103
41.104 /// @}
41.105
41.106 - /// \name Arc/Edge sections
41.107 + /// \name Arc/Edge Sections
41.108 /// @{
41.109
41.110 /// \brief Gives back the number of arc/edge sections in the file.
41.111 @@ -2584,7 +2584,7 @@
41.112
41.113 /// @}
41.114
41.115 - /// \name Attribute sections
41.116 + /// \name Attribute Sections
41.117 /// @{
41.118
41.119 /// \brief Gives back the number of attribute sections in the file.
41.120 @@ -2610,7 +2610,7 @@
41.121
41.122 /// @}
41.123
41.124 - /// \name Extra sections
41.125 + /// \name Extra Sections
41.126 /// @{
41.127
41.128 /// \brief Gives back the number of extra sections in the file.
41.129 @@ -2686,7 +2686,7 @@
41.130
41.131 public:
41.132
41.133 - /// \name Execution of the contents reader
41.134 + /// \name Execution of the Contents Reader
41.135 /// @{
41.136
41.137 /// \brief Starts the reading
42.1 --- a/lemon/lgf_writer.h Sat Apr 18 21:54:30 2009 +0200
42.2 +++ b/lemon/lgf_writer.h Tue Apr 21 10:34:49 2009 +0100
42.3 @@ -536,7 +536,7 @@
42.4
42.5 public:
42.6
42.7 - /// \name Writing rules
42.8 + /// \name Writing Rules
42.9 /// @{
42.10
42.11 /// \brief Node map writing rule
42.12 @@ -639,7 +639,7 @@
42.13 return *this;
42.14 }
42.15
42.16 - /// \name Section captions
42.17 + /// \name Section Captions
42.18 /// @{
42.19
42.20 /// \brief Add an additional caption to the \c \@nodes section
42.21 @@ -666,7 +666,7 @@
42.22 return *this;
42.23 }
42.24
42.25 - /// \name Skipping section
42.26 + /// \name Skipping Section
42.27 /// @{
42.28
42.29 /// \brief Skip writing the node set
42.30 @@ -883,7 +883,7 @@
42.31
42.32 public:
42.33
42.34 - /// \name Execution of the writer
42.35 + /// \name Execution of the Writer
42.36 /// @{
42.37
42.38 /// \brief Start the batch processing
42.39 @@ -1129,7 +1129,7 @@
42.40
42.41 public:
42.42
42.43 - /// \name Writing rules
42.44 + /// \name Writing Rules
42.45 /// @{
42.46
42.47 /// \brief Node map writing rule
42.48 @@ -1278,7 +1278,7 @@
42.49 return *this;
42.50 }
42.51
42.52 - /// \name Section captions
42.53 + /// \name Section Captions
42.54 /// @{
42.55
42.56 /// \brief Add an additional caption to the \c \@nodes section
42.57 @@ -1305,7 +1305,7 @@
42.58 return *this;
42.59 }
42.60
42.61 - /// \name Skipping section
42.62 + /// \name Skipping Section
42.63 /// @{
42.64
42.65 /// \brief Skip writing the node set
42.66 @@ -1522,7 +1522,7 @@
42.67
42.68 public:
42.69
42.70 - /// \name Execution of the writer
42.71 + /// \name Execution of the Writer
42.72 /// @{
42.73
42.74 /// \brief Start the batch processing
42.75 @@ -1699,7 +1699,7 @@
42.76
42.77 public:
42.78
42.79 - /// \name Section writers
42.80 + /// \name Section Writers
42.81 /// @{
42.82
42.83 /// \brief Add a section writer with line oriented writing
42.84 @@ -1766,7 +1766,7 @@
42.85 public:
42.86
42.87
42.88 - /// \name Execution of the writer
42.89 + /// \name Execution of the Writer
42.90 /// @{
42.91
42.92 /// \brief Start the batch processing
43.1 --- a/lemon/list_graph.h Sat Apr 18 21:54:30 2009 +0200
43.2 +++ b/lemon/list_graph.h Tue Apr 21 10:34:49 2009 +0100
43.3 @@ -320,9 +320,6 @@
43.4 ///Most of the member functions and nested classes are documented
43.5 ///only in the concept class.
43.6 ///
43.7 - ///An important extra feature of this digraph implementation is that
43.8 - ///its maps are real \ref concepts::ReferenceMap "reference map"s.
43.9 - ///
43.10 ///\sa concepts::Digraph
43.11
43.12 class ListDigraph : public ExtendedListDigraphBase {
43.13 @@ -1176,9 +1173,6 @@
43.14 ///Most of the member functions and nested classes are documented
43.15 ///only in the concept class.
43.16 ///
43.17 - ///An important extra feature of this graph implementation is that
43.18 - ///its maps are real \ref concepts::ReferenceMap "reference map"s.
43.19 - ///
43.20 ///\sa concepts::Graph
43.21
43.22 class ListGraph : public ExtendedListGraphBase {
44.1 --- a/lemon/lp_base.h Sat Apr 18 21:54:30 2009 +0200
44.2 +++ b/lemon/lp_base.h Tue Apr 21 10:34:49 2009 +0100
44.3 @@ -52,12 +52,12 @@
44.4
44.5 ///Possible outcomes of an LP solving procedure
44.6 enum SolveExitStatus {
44.7 - ///This means that the problem has been successfully solved: either
44.8 + /// = 0. It means that the problem has been successfully solved: either
44.9 ///an optimal solution has been found or infeasibility/unboundedness
44.10 ///has been proved.
44.11 SOLVED = 0,
44.12 - ///Any other case (including the case when some user specified
44.13 - ///limit has been exceeded)
44.14 + /// = 1. Any other case (including the case when some user specified
44.15 + ///limit has been exceeded).
44.16 UNSOLVED = 1
44.17 };
44.18
44.19 @@ -69,6 +69,21 @@
44.20 MAX
44.21 };
44.22
44.23 + ///Enum for \c messageLevel() parameter
44.24 + enum MessageLevel {
44.25 + /// No output (default value).
44.26 + MESSAGE_NOTHING,
44.27 + /// Error messages only.
44.28 + MESSAGE_ERROR,
44.29 + /// Warnings.
44.30 + MESSAGE_WARNING,
44.31 + /// Normal output.
44.32 + MESSAGE_NORMAL,
44.33 + /// Verbose output.
44.34 + MESSAGE_VERBOSE
44.35 + };
44.36 +
44.37 +
44.38 ///The floating point type used by the solver
44.39 typedef double Value;
44.40 ///The infinity constant
44.41 @@ -973,6 +988,8 @@
44.42
44.43 virtual const char* _solverName() const = 0;
44.44
44.45 + virtual void _messageLevel(MessageLevel level) = 0;
44.46 +
44.47 //Own protected stuff
44.48
44.49 //Constant component of the objective function
44.50 @@ -988,7 +1005,7 @@
44.51 ///Gives back the name of the solver.
44.52 const char* solverName() const {return _solverName();}
44.53
44.54 - ///\name Build up and modify the LP
44.55 + ///\name Build Up and Modify the LP
44.56
44.57 ///@{
44.58
44.59 @@ -1527,6 +1544,9 @@
44.60 ///Clears the problem
44.61 void clear() { _clear(); }
44.62
44.63 + /// Sets the message level of the solver
44.64 + void messageLevel(MessageLevel level) { _messageLevel(level); }
44.65 +
44.66 ///@}
44.67
44.68 };
44.69 @@ -1768,15 +1788,15 @@
44.70
44.71 /// The problem types for primal and dual problems
44.72 enum ProblemType {
44.73 - ///Feasible solution hasn't been found (but may exist).
44.74 + /// = 0. Feasible solution hasn't been found (but may exist).
44.75 UNDEFINED = 0,
44.76 - ///The problem has no feasible solution
44.77 + /// = 1. The problem has no feasible solution.
44.78 INFEASIBLE = 1,
44.79 - ///Feasible solution found
44.80 + /// = 2. Feasible solution found.
44.81 FEASIBLE = 2,
44.82 - ///Optimal solution exists and found
44.83 + /// = 3. Optimal solution exists and found.
44.84 OPTIMAL = 3,
44.85 - ///The cost function is unbounded
44.86 + /// = 4. The cost function is unbounded.
44.87 UNBOUNDED = 4
44.88 };
44.89
44.90 @@ -1832,7 +1852,7 @@
44.91
44.92 ///@}
44.93
44.94 - ///\name Obtain the solution
44.95 + ///\name Obtain the Solution
44.96
44.97 ///@{
44.98
44.99 @@ -1954,17 +1974,16 @@
44.100
44.101 /// The problem types for MIP problems
44.102 enum ProblemType {
44.103 - ///Feasible solution hasn't been found (but may exist).
44.104 + /// = 0. Feasible solution hasn't been found (but may exist).
44.105 UNDEFINED = 0,
44.106 - ///The problem has no feasible solution
44.107 + /// = 1. The problem has no feasible solution.
44.108 INFEASIBLE = 1,
44.109 - ///Feasible solution found
44.110 + /// = 2. Feasible solution found.
44.111 FEASIBLE = 2,
44.112 - ///Optimal solution exists and found
44.113 + /// = 3. Optimal solution exists and found.
44.114 OPTIMAL = 3,
44.115 - ///The cost function is unbounded
44.116 - ///
44.117 - ///The Mip or at least the relaxed problem is unbounded
44.118 + /// = 4. The cost function is unbounded.
44.119 + ///The Mip or at least the relaxed problem is unbounded.
44.120 UNBOUNDED = 4
44.121 };
44.122
44.123 @@ -1986,14 +2005,14 @@
44.124
44.125 ///@}
44.126
44.127 - ///\name Setting column type
44.128 + ///\name Set Column Type
44.129 ///@{
44.130
44.131 ///Possible variable (column) types (e.g. real, integer, binary etc.)
44.132 enum ColTypes {
44.133 - ///Continuous variable (default)
44.134 + /// = 0. Continuous variable (default).
44.135 REAL = 0,
44.136 - ///Integer variable
44.137 + /// = 1. Integer variable.
44.138 INTEGER = 1
44.139 };
44.140
44.141 @@ -2014,7 +2033,7 @@
44.142 }
44.143 ///@}
44.144
44.145 - ///\name Obtain the solution
44.146 + ///\name Obtain the Solution
44.147
44.148 ///@{
44.149
45.1 --- a/lemon/lp_skeleton.cc Sat Apr 18 21:54:30 2009 +0200
45.2 +++ b/lemon/lp_skeleton.cc Tue Apr 21 10:34:49 2009 +0100
45.3 @@ -84,6 +84,8 @@
45.4 row_num = col_num = 0;
45.5 }
45.6
45.7 + void SkeletonSolverBase::_messageLevel(MessageLevel) {}
45.8 +
45.9 LpSkeleton::SolveExitStatus LpSkeleton::_solve() { return SOLVED; }
45.10
45.11 LpSkeleton::Value LpSkeleton::_getPrimal(int) const { return 0; }
46.1 --- a/lemon/lp_skeleton.h Sat Apr 18 21:54:30 2009 +0200
46.2 +++ b/lemon/lp_skeleton.h Tue Apr 21 10:34:49 2009 +0100
46.3 @@ -140,6 +140,8 @@
46.4 ///\e
46.5 virtual void _clear();
46.6
46.7 + ///\e
46.8 + virtual void _messageLevel(MessageLevel);
46.9 };
46.10
46.11 /// \brief Skeleton class for an LP solver interface
47.1 --- a/lemon/maps.h Sat Apr 18 21:54:30 2009 +0200
47.2 +++ b/lemon/maps.h Tue Apr 21 10:34:49 2009 +0100
47.3 @@ -2728,8 +2728,8 @@
47.4
47.5 /// \brief Potential difference map
47.6 ///
47.7 - /// PotentialMap returns the difference between the potentials of the
47.8 - /// source and target nodes of each arc in a digraph, i.e. it returns
47.9 + /// PotentialDifferenceMap returns the difference between the potentials of
47.10 + /// the source and target nodes of each arc in a digraph, i.e. it returns
47.11 /// \code
47.12 /// potential[gr.target(arc)] - potential[gr.source(arc)].
47.13 /// \endcode
48.1 --- a/lemon/max_matching.h Sat Apr 18 21:54:30 2009 +0200
48.2 +++ b/lemon/max_matching.h Tue Apr 21 10:34:49 2009 +0100
48.3 @@ -282,20 +282,20 @@
48.4 Node base = (*_blossom_rep)[_blossom_set->find(node)];
48.5
48.6 while (base != nca) {
48.7 - _ear->set(node, arc);
48.8 + (*_ear)[node] = arc;
48.9
48.10 Node n = node;
48.11 while (n != base) {
48.12 n = _graph.target((*_matching)[n]);
48.13 Arc a = (*_ear)[n];
48.14 n = _graph.target(a);
48.15 - _ear->set(n, _graph.oppositeArc(a));
48.16 + (*_ear)[n] = _graph.oppositeArc(a);
48.17 }
48.18 node = _graph.target((*_matching)[base]);
48.19 _tree_set->erase(base);
48.20 _tree_set->erase(node);
48.21 _blossom_set->insert(node, _blossom_set->find(base));
48.22 - _status->set(node, EVEN);
48.23 + (*_status)[node] = EVEN;
48.24 _node_queue[_last++] = node;
48.25 arc = _graph.oppositeArc((*_ear)[node]);
48.26 node = _graph.target((*_ear)[node]);
48.27 @@ -304,7 +304,7 @@
48.28 }
48.29 }
48.30
48.31 - _blossom_rep->set(_blossom_set->find(nca), nca);
48.32 + (*_blossom_rep)[_blossom_set->find(nca)] = nca;
48.33
48.34 {
48.35
48.36 @@ -313,20 +313,20 @@
48.37 Node base = (*_blossom_rep)[_blossom_set->find(node)];
48.38
48.39 while (base != nca) {
48.40 - _ear->set(node, arc);
48.41 + (*_ear)[node] = arc;
48.42
48.43 Node n = node;
48.44 while (n != base) {
48.45 n = _graph.target((*_matching)[n]);
48.46 Arc a = (*_ear)[n];
48.47 n = _graph.target(a);
48.48 - _ear->set(n, _graph.oppositeArc(a));
48.49 + (*_ear)[n] = _graph.oppositeArc(a);
48.50 }
48.51 node = _graph.target((*_matching)[base]);
48.52 _tree_set->erase(base);
48.53 _tree_set->erase(node);
48.54 _blossom_set->insert(node, _blossom_set->find(base));
48.55 - _status->set(node, EVEN);
48.56 + (*_status)[node] = EVEN;
48.57 _node_queue[_last++] = node;
48.58 arc = _graph.oppositeArc((*_ear)[node]);
48.59 node = _graph.target((*_ear)[node]);
48.60 @@ -335,7 +335,7 @@
48.61 }
48.62 }
48.63
48.64 - _blossom_rep->set(_blossom_set->find(nca), nca);
48.65 + (*_blossom_rep)[_blossom_set->find(nca)] = nca;
48.66 }
48.67
48.68
48.69 @@ -344,11 +344,11 @@
48.70 Node base = _graph.source(a);
48.71 Node odd = _graph.target(a);
48.72
48.73 - _ear->set(odd, _graph.oppositeArc(a));
48.74 + (*_ear)[odd] = _graph.oppositeArc(a);
48.75 Node even = _graph.target((*_matching)[odd]);
48.76 - _blossom_rep->set(_blossom_set->insert(even), even);
48.77 - _status->set(odd, ODD);
48.78 - _status->set(even, EVEN);
48.79 + (*_blossom_rep)[_blossom_set->insert(even)] = even;
48.80 + (*_status)[odd] = ODD;
48.81 + (*_status)[even] = EVEN;
48.82 int tree = _tree_set->find((*_blossom_rep)[_blossom_set->find(base)]);
48.83 _tree_set->insert(odd, tree);
48.84 _tree_set->insert(even, tree);
48.85 @@ -362,30 +362,30 @@
48.86
48.87 int tree = _tree_set->find((*_blossom_rep)[_blossom_set->find(even)]);
48.88
48.89 - _matching->set(odd, _graph.oppositeArc(a));
48.90 - _status->set(odd, MATCHED);
48.91 + (*_matching)[odd] = _graph.oppositeArc(a);
48.92 + (*_status)[odd] = MATCHED;
48.93
48.94 Arc arc = (*_matching)[even];
48.95 - _matching->set(even, a);
48.96 + (*_matching)[even] = a;
48.97
48.98 while (arc != INVALID) {
48.99 odd = _graph.target(arc);
48.100 arc = (*_ear)[odd];
48.101 even = _graph.target(arc);
48.102 - _matching->set(odd, arc);
48.103 + (*_matching)[odd] = arc;
48.104 arc = (*_matching)[even];
48.105 - _matching->set(even, _graph.oppositeArc((*_matching)[odd]));
48.106 + (*_matching)[even] = _graph.oppositeArc((*_matching)[odd]);
48.107 }
48.108
48.109 for (typename TreeSet::ItemIt it(*_tree_set, tree);
48.110 it != INVALID; ++it) {
48.111 if ((*_status)[it] == ODD) {
48.112 - _status->set(it, MATCHED);
48.113 + (*_status)[it] = MATCHED;
48.114 } else {
48.115 int blossom = _blossom_set->find(it);
48.116 for (typename BlossomSet::ItemIt jt(*_blossom_set, blossom);
48.117 jt != INVALID; ++jt) {
48.118 - _status->set(jt, MATCHED);
48.119 + (*_status)[jt] = MATCHED;
48.120 }
48.121 _blossom_set->eraseClass(blossom);
48.122 }
48.123 @@ -427,8 +427,8 @@
48.124 void init() {
48.125 createStructures();
48.126 for(NodeIt n(_graph); n != INVALID; ++n) {
48.127 - _matching->set(n, INVALID);
48.128 - _status->set(n, UNMATCHED);
48.129 + (*_matching)[n] = INVALID;
48.130 + (*_status)[n] = UNMATCHED;
48.131 }
48.132 }
48.133
48.134 @@ -438,18 +438,18 @@
48.135 void greedyInit() {
48.136 createStructures();
48.137 for (NodeIt n(_graph); n != INVALID; ++n) {
48.138 - _matching->set(n, INVALID);
48.139 - _status->set(n, UNMATCHED);
48.140 + (*_matching)[n] = INVALID;
48.141 + (*_status)[n] = UNMATCHED;
48.142 }
48.143 for (NodeIt n(_graph); n != INVALID; ++n) {
48.144 if ((*_matching)[n] == INVALID) {
48.145 for (OutArcIt a(_graph, n); a != INVALID ; ++a) {
48.146 Node v = _graph.target(a);
48.147 if ((*_matching)[v] == INVALID && v != n) {
48.148 - _matching->set(n, a);
48.149 - _status->set(n, MATCHED);
48.150 - _matching->set(v, _graph.oppositeArc(a));
48.151 - _status->set(v, MATCHED);
48.152 + (*_matching)[n] = a;
48.153 + (*_status)[n] = MATCHED;
48.154 + (*_matching)[v] = _graph.oppositeArc(a);
48.155 + (*_status)[v] = MATCHED;
48.156 break;
48.157 }
48.158 }
48.159 @@ -469,21 +469,21 @@
48.160 createStructures();
48.161
48.162 for (NodeIt n(_graph); n != INVALID; ++n) {
48.163 - _matching->set(n, INVALID);
48.164 - _status->set(n, UNMATCHED);
48.165 + (*_matching)[n] = INVALID;
48.166 + (*_status)[n] = UNMATCHED;
48.167 }
48.168 for(EdgeIt e(_graph); e!=INVALID; ++e) {
48.169 if (matching[e]) {
48.170
48.171 Node u = _graph.u(e);
48.172 if ((*_matching)[u] != INVALID) return false;
48.173 - _matching->set(u, _graph.direct(e, true));
48.174 - _status->set(u, MATCHED);
48.175 + (*_matching)[u] = _graph.direct(e, true);
48.176 + (*_status)[u] = MATCHED;
48.177
48.178 Node v = _graph.v(e);
48.179 if ((*_matching)[v] != INVALID) return false;
48.180 - _matching->set(v, _graph.direct(e, false));
48.181 - _status->set(v, MATCHED);
48.182 + (*_matching)[v] = _graph.direct(e, false);
48.183 + (*_status)[v] = MATCHED;
48.184 }
48.185 }
48.186 return true;
48.187 @@ -497,7 +497,7 @@
48.188 if ((*_status)[n] == UNMATCHED) {
48.189 (*_blossom_rep)[_blossom_set->insert(n)] = n;
48.190 _tree_set->insert(n);
48.191 - _status->set(n, EVEN);
48.192 + (*_status)[n] = EVEN;
48.193 processSparse(n);
48.194 }
48.195 }
48.196 @@ -512,7 +512,7 @@
48.197 if ((*_status)[n] == UNMATCHED) {
48.198 (*_blossom_rep)[_blossom_set->insert(n)] = n;
48.199 _tree_set->insert(n);
48.200 - _status->set(n, EVEN);
48.201 + (*_status)[n] = EVEN;
48.202 processDense(n);
48.203 }
48.204 }
48.205 @@ -1548,9 +1548,9 @@
48.206 int bi = (*_node_index)[base];
48.207 Value pot = (*_node_data)[bi].pot;
48.208
48.209 - _matching->set(base, matching);
48.210 + (*_matching)[base] = matching;
48.211 _blossom_node_list.push_back(base);
48.212 - _node_potential->set(base, pot);
48.213 + (*_node_potential)[base] = pot;
48.214 } else {
48.215
48.216 Value pot = (*_blossom_data)[blossom].pot;
48.217 @@ -1644,17 +1644,17 @@
48.218 createStructures();
48.219
48.220 for (ArcIt e(_graph); e != INVALID; ++e) {
48.221 - _node_heap_index->set(e, BinHeap<Value, IntArcMap>::PRE_HEAP);
48.222 + (*_node_heap_index)[e] = BinHeap<Value, IntArcMap>::PRE_HEAP;
48.223 }
48.224 for (NodeIt n(_graph); n != INVALID; ++n) {
48.225 - _delta1_index->set(n, _delta1->PRE_HEAP);
48.226 + (*_delta1_index)[n] = _delta1->PRE_HEAP;
48.227 }
48.228 for (EdgeIt e(_graph); e != INVALID; ++e) {
48.229 - _delta3_index->set(e, _delta3->PRE_HEAP);
48.230 + (*_delta3_index)[e] = _delta3->PRE_HEAP;
48.231 }
48.232 for (int i = 0; i < _blossom_num; ++i) {
48.233 - _delta2_index->set(i, _delta2->PRE_HEAP);
48.234 - _delta4_index->set(i, _delta4->PRE_HEAP);
48.235 + (*_delta2_index)[i] = _delta2->PRE_HEAP;
48.236 + (*_delta4_index)[i] = _delta4->PRE_HEAP;
48.237 }
48.238
48.239 int index = 0;
48.240 @@ -1666,7 +1666,7 @@
48.241 max = (dualScale * _weight[e]) / 2;
48.242 }
48.243 }
48.244 - _node_index->set(n, index);
48.245 + (*_node_index)[n] = index;
48.246 (*_node_data)[index].pot = max;
48.247 _delta1->push(n, max);
48.248 int blossom =
48.249 @@ -2741,9 +2741,9 @@
48.250 int bi = (*_node_index)[base];
48.251 Value pot = (*_node_data)[bi].pot;
48.252
48.253 - _matching->set(base, matching);
48.254 + (*_matching)[base] = matching;
48.255 _blossom_node_list.push_back(base);
48.256 - _node_potential->set(base, pot);
48.257 + (*_node_potential)[base] = pot;
48.258 } else {
48.259
48.260 Value pot = (*_blossom_data)[blossom].pot;
48.261 @@ -2831,14 +2831,14 @@
48.262 createStructures();
48.263
48.264 for (ArcIt e(_graph); e != INVALID; ++e) {
48.265 - _node_heap_index->set(e, BinHeap<Value, IntArcMap>::PRE_HEAP);
48.266 + (*_node_heap_index)[e] = BinHeap<Value, IntArcMap>::PRE_HEAP;
48.267 }
48.268 for (EdgeIt e(_graph); e != INVALID; ++e) {
48.269 - _delta3_index->set(e, _delta3->PRE_HEAP);
48.270 + (*_delta3_index)[e] = _delta3->PRE_HEAP;
48.271 }
48.272 for (int i = 0; i < _blossom_num; ++i) {
48.273 - _delta2_index->set(i, _delta2->PRE_HEAP);
48.274 - _delta4_index->set(i, _delta4->PRE_HEAP);
48.275 + (*_delta2_index)[i] = _delta2->PRE_HEAP;
48.276 + (*_delta4_index)[i] = _delta4->PRE_HEAP;
48.277 }
48.278
48.279 int index = 0;
48.280 @@ -2850,7 +2850,7 @@
48.281 max = (dualScale * _weight[e]) / 2;
48.282 }
48.283 }
48.284 - _node_index->set(n, index);
48.285 + (*_node_index)[n] = index;
48.286 (*_node_data)[index].pot = max;
48.287 int blossom =
48.288 _blossom_set->insert(n, std::numeric_limits<Value>::max());
49.1 --- a/lemon/min_cost_arborescence.h Sat Apr 18 21:54:30 2009 +0200
49.2 +++ b/lemon/min_cost_arborescence.h Tue Apr 21 10:34:49 2009 +0100
49.3 @@ -90,10 +90,10 @@
49.4
49.5 /// \ingroup spantree
49.6 ///
49.7 - /// \brief %MinCostArborescence algorithm class.
49.8 + /// \brief Minimum Cost Arborescence algorithm class.
49.9 ///
49.10 /// This class provides an efficient implementation of
49.11 - /// %MinCostArborescence algorithm. The arborescence is a tree
49.12 + /// Minimum Cost Arborescence algorithm. The arborescence is a tree
49.13 /// which is directed from a given source node of the digraph. One or
49.14 /// more sources should be given for the algorithm and it will calculate
49.15 /// the minimum cost subgraph which are union of arborescences with the
49.16 @@ -293,7 +293,7 @@
49.17 minimum = (*_cost_arcs)[nodes[i]];
49.18 }
49.19 }
49.20 - _arc_order->set(minimum.arc, _dual_variables.size());
49.21 + (*_arc_order)[minimum.arc] = _dual_variables.size();
49.22 DualVariable var(_dual_node_list.size() - 1,
49.23 _dual_node_list.size(), minimum.value);
49.24 _dual_variables.push_back(var);
49.25 @@ -335,7 +335,7 @@
49.26 minimum = (*_cost_arcs)[nodes[i]];
49.27 }
49.28 }
49.29 - _arc_order->set(minimum.arc, _dual_variables.size());
49.30 + (*_arc_order)[minimum.arc] = _dual_variables.size();
49.31 DualVariable var(node_bottom, _dual_node_list.size(), minimum.value);
49.32 _dual_variables.push_back(var);
49.33 StackLevel level;
49.34 @@ -364,7 +364,7 @@
49.35 while (!_heap->empty()) {
49.36 Node source = _heap->top();
49.37 _heap->pop();
49.38 - _node_order->set(source, -1);
49.39 + (*_node_order)[source] = -1;
49.40 for (OutArcIt it(*_digraph, source); it != INVALID; ++it) {
49.41 if ((*_arc_order)[it] < 0) continue;
49.42 Node target = _digraph->target(it);
49.43 @@ -390,7 +390,7 @@
49.44
49.45 public:
49.46
49.47 - /// \name Named template parameters
49.48 + /// \name Named Template Parameters
49.49
49.50 /// @{
49.51
49.52 @@ -630,7 +630,7 @@
49.53
49.54 /// @}
49.55
49.56 - /// \name Execution control
49.57 + /// \name Execution Control
49.58 /// The simplest way to execute the algorithm is to use
49.59 /// one of the member functions called \c run(...). \n
49.60 /// If you need more control on the execution,
49.61 @@ -650,13 +650,13 @@
49.62 _heap->clear();
49.63 for (NodeIt it(*_digraph); it != INVALID; ++it) {
49.64 (*_cost_arcs)[it].arc = INVALID;
49.65 - _node_order->set(it, -3);
49.66 - _heap_cross_ref->set(it, Heap::PRE_HEAP);
49.67 + (*_node_order)[it] = -3;
49.68 + (*_heap_cross_ref)[it] = Heap::PRE_HEAP;
49.69 _pred->set(it, INVALID);
49.70 }
49.71 for (ArcIt it(*_digraph); it != INVALID; ++it) {
49.72 _arborescence->set(it, false);
49.73 - _arc_order->set(it, -1);
49.74 + (*_arc_order)[it] = -1;
49.75 }
49.76 _dual_node_list.clear();
49.77 _dual_variables.clear();
50.1 --- a/lemon/preflow.h Sat Apr 18 21:54:30 2009 +0200
50.2 +++ b/lemon/preflow.h Tue Apr 21 10:34:49 2009 +0100
50.3 @@ -404,7 +404,7 @@
50.4
50.5 _phase = true;
50.6 for (NodeIt n(_graph); n != INVALID; ++n) {
50.7 - _excess->set(n, 0);
50.8 + (*_excess)[n] = 0;
50.9 }
50.10
50.11 for (ArcIt e(_graph); e != INVALID; ++e) {
50.12 @@ -417,10 +417,10 @@
50.13 _level->initAddItem(_target);
50.14
50.15 std::vector<Node> queue;
50.16 - reached.set(_source, true);
50.17 + reached[_source] = true;
50.18
50.19 queue.push_back(_target);
50.20 - reached.set(_target, true);
50.21 + reached[_target] = true;
50.22 while (!queue.empty()) {
50.23 _level->initNewLevel();
50.24 std::vector<Node> nqueue;
50.25 @@ -429,7 +429,7 @@
50.26 for (InArcIt e(_graph, n); e != INVALID; ++e) {
50.27 Node u = _graph.source(e);
50.28 if (!reached[u] && _tolerance.positive((*_capacity)[e])) {
50.29 - reached.set(u, true);
50.30 + reached[u] = true;
50.31 _level->initAddItem(u);
50.32 nqueue.push_back(u);
50.33 }
50.34 @@ -444,7 +444,7 @@
50.35 Node u = _graph.target(e);
50.36 if ((*_level)[u] == _level->maxLevel()) continue;
50.37 _flow->set(e, (*_capacity)[e]);
50.38 - _excess->set(u, (*_excess)[u] + (*_capacity)[e]);
50.39 + (*_excess)[u] += (*_capacity)[e];
50.40 if (u != _target && !_level->active(u)) {
50.41 _level->activate(u);
50.42 }
50.43 @@ -478,7 +478,7 @@
50.44 excess -= (*_flow)[e];
50.45 }
50.46 if (excess < 0 && n != _source) return false;
50.47 - _excess->set(n, excess);
50.48 + (*_excess)[n] = excess;
50.49 }
50.50
50.51 typename Digraph::template NodeMap<bool> reached(_graph, false);
50.52 @@ -487,10 +487,10 @@
50.53 _level->initAddItem(_target);
50.54
50.55 std::vector<Node> queue;
50.56 - reached.set(_source, true);
50.57 + reached[_source] = true;
50.58
50.59 queue.push_back(_target);
50.60 - reached.set(_target, true);
50.61 + reached[_target] = true;
50.62 while (!queue.empty()) {
50.63 _level->initNewLevel();
50.64 std::vector<Node> nqueue;
50.65 @@ -500,7 +500,7 @@
50.66 Node u = _graph.source(e);
50.67 if (!reached[u] &&
50.68 _tolerance.positive((*_capacity)[e] - (*_flow)[e])) {
50.69 - reached.set(u, true);
50.70 + reached[u] = true;
50.71 _level->initAddItem(u);
50.72 nqueue.push_back(u);
50.73 }
50.74 @@ -508,7 +508,7 @@
50.75 for (OutArcIt e(_graph, n); e != INVALID; ++e) {
50.76 Node v = _graph.target(e);
50.77 if (!reached[v] && _tolerance.positive((*_flow)[e])) {
50.78 - reached.set(v, true);
50.79 + reached[v] = true;
50.80 _level->initAddItem(v);
50.81 nqueue.push_back(v);
50.82 }
50.83 @@ -524,7 +524,7 @@
50.84 Node u = _graph.target(e);
50.85 if ((*_level)[u] == _level->maxLevel()) continue;
50.86 _flow->set(e, (*_capacity)[e]);
50.87 - _excess->set(u, (*_excess)[u] + rem);
50.88 + (*_excess)[u] += rem;
50.89 if (u != _target && !_level->active(u)) {
50.90 _level->activate(u);
50.91 }
50.92 @@ -536,7 +536,7 @@
50.93 Node v = _graph.source(e);
50.94 if ((*_level)[v] == _level->maxLevel()) continue;
50.95 _flow->set(e, 0);
50.96 - _excess->set(v, (*_excess)[v] + rem);
50.97 + (*_excess)[v] += rem;
50.98 if (v != _target && !_level->active(v)) {
50.99 _level->activate(v);
50.100 }
50.101 @@ -577,12 +577,12 @@
50.102 }
50.103 if (!_tolerance.less(rem, excess)) {
50.104 _flow->set(e, (*_flow)[e] + excess);
50.105 - _excess->set(v, (*_excess)[v] + excess);
50.106 + (*_excess)[v] += excess;
50.107 excess = 0;
50.108 goto no_more_push_1;
50.109 } else {
50.110 excess -= rem;
50.111 - _excess->set(v, (*_excess)[v] + rem);
50.112 + (*_excess)[v] += rem;
50.113 _flow->set(e, (*_capacity)[e]);
50.114 }
50.115 } else if (new_level > (*_level)[v]) {
50.116 @@ -600,12 +600,12 @@
50.117 }
50.118 if (!_tolerance.less(rem, excess)) {
50.119 _flow->set(e, (*_flow)[e] - excess);
50.120 - _excess->set(v, (*_excess)[v] + excess);
50.121 + (*_excess)[v] += excess;
50.122 excess = 0;
50.123 goto no_more_push_1;
50.124 } else {
50.125 excess -= rem;
50.126 - _excess->set(v, (*_excess)[v] + rem);
50.127 + (*_excess)[v] += rem;
50.128 _flow->set(e, 0);
50.129 }
50.130 } else if (new_level > (*_level)[v]) {
50.131 @@ -615,7 +615,7 @@
50.132
50.133 no_more_push_1:
50.134
50.135 - _excess->set(n, excess);
50.136 + (*_excess)[n] = excess;
50.137
50.138 if (excess != 0) {
50.139 if (new_level + 1 < _level->maxLevel()) {
50.140 @@ -650,12 +650,12 @@
50.141 }
50.142 if (!_tolerance.less(rem, excess)) {
50.143 _flow->set(e, (*_flow)[e] + excess);
50.144 - _excess->set(v, (*_excess)[v] + excess);
50.145 + (*_excess)[v] += excess;
50.146 excess = 0;
50.147 goto no_more_push_2;
50.148 } else {
50.149 excess -= rem;
50.150 - _excess->set(v, (*_excess)[v] + rem);
50.151 + (*_excess)[v] += rem;
50.152 _flow->set(e, (*_capacity)[e]);
50.153 }
50.154 } else if (new_level > (*_level)[v]) {
50.155 @@ -673,12 +673,12 @@
50.156 }
50.157 if (!_tolerance.less(rem, excess)) {
50.158 _flow->set(e, (*_flow)[e] - excess);
50.159 - _excess->set(v, (*_excess)[v] + excess);
50.160 + (*_excess)[v] += excess;
50.161 excess = 0;
50.162 goto no_more_push_2;
50.163 } else {
50.164 excess -= rem;
50.165 - _excess->set(v, (*_excess)[v] + rem);
50.166 + (*_excess)[v] += rem;
50.167 _flow->set(e, 0);
50.168 }
50.169 } else if (new_level > (*_level)[v]) {
50.170 @@ -688,7 +688,7 @@
50.171
50.172 no_more_push_2:
50.173
50.174 - _excess->set(n, excess);
50.175 + (*_excess)[n] = excess;
50.176
50.177 if (excess != 0) {
50.178 if (new_level + 1 < _level->maxLevel()) {
50.179 @@ -731,7 +731,7 @@
50.180
50.181 typename Digraph::template NodeMap<bool> reached(_graph);
50.182 for (NodeIt n(_graph); n != INVALID; ++n) {
50.183 - reached.set(n, (*_level)[n] < _level->maxLevel());
50.184 + reached[n] = (*_level)[n] < _level->maxLevel();
50.185 }
50.186
50.187 _level->initStart();
50.188 @@ -739,7 +739,7 @@
50.189
50.190 std::vector<Node> queue;
50.191 queue.push_back(_source);
50.192 - reached.set(_source, true);
50.193 + reached[_source] = true;
50.194
50.195 while (!queue.empty()) {
50.196 _level->initNewLevel();
50.197 @@ -749,7 +749,7 @@
50.198 for (OutArcIt e(_graph, n); e != INVALID; ++e) {
50.199 Node v = _graph.target(e);
50.200 if (!reached[v] && _tolerance.positive((*_flow)[e])) {
50.201 - reached.set(v, true);
50.202 + reached[v] = true;
50.203 _level->initAddItem(v);
50.204 nqueue.push_back(v);
50.205 }
50.206 @@ -758,7 +758,7 @@
50.207 Node u = _graph.source(e);
50.208 if (!reached[u] &&
50.209 _tolerance.positive((*_capacity)[e] - (*_flow)[e])) {
50.210 - reached.set(u, true);
50.211 + reached[u] = true;
50.212 _level->initAddItem(u);
50.213 nqueue.push_back(u);
50.214 }
50.215 @@ -792,12 +792,12 @@
50.216 }
50.217 if (!_tolerance.less(rem, excess)) {
50.218 _flow->set(e, (*_flow)[e] + excess);
50.219 - _excess->set(v, (*_excess)[v] + excess);
50.220 + (*_excess)[v] += excess;
50.221 excess = 0;
50.222 goto no_more_push;
50.223 } else {
50.224 excess -= rem;
50.225 - _excess->set(v, (*_excess)[v] + rem);
50.226 + (*_excess)[v] += rem;
50.227 _flow->set(e, (*_capacity)[e]);
50.228 }
50.229 } else if (new_level > (*_level)[v]) {
50.230 @@ -815,12 +815,12 @@
50.231 }
50.232 if (!_tolerance.less(rem, excess)) {
50.233 _flow->set(e, (*_flow)[e] - excess);
50.234 - _excess->set(v, (*_excess)[v] + excess);
50.235 + (*_excess)[v] += excess;
50.236 excess = 0;
50.237 goto no_more_push;
50.238 } else {
50.239 excess -= rem;
50.240 - _excess->set(v, (*_excess)[v] + rem);
50.241 + (*_excess)[v] += rem;
50.242 _flow->set(e, 0);
50.243 }
50.244 } else if (new_level > (*_level)[v]) {
50.245 @@ -830,7 +830,7 @@
50.246
50.247 no_more_push:
50.248
50.249 - _excess->set(n, excess);
50.250 + (*_excess)[n] = excess;
50.251
50.252 if (excess != 0) {
50.253 if (new_level + 1 < _level->maxLevel()) {
51.1 --- a/lemon/random.h Sat Apr 18 21:54:30 2009 +0200
51.2 +++ b/lemon/random.h Tue Apr 21 10:34:49 2009 +0100
51.3 @@ -659,7 +659,7 @@
51.4
51.5 /// @}
51.6
51.7 - ///\name Uniform distributions
51.8 + ///\name Uniform Distributions
51.9 ///
51.10 /// @{
51.11
51.12 @@ -762,7 +762,7 @@
51.13
51.14 /// @}
51.15
51.16 - ///\name Non-uniform distributions
51.17 + ///\name Non-uniform Distributions
51.18 ///
51.19 ///@{
51.20
51.21 @@ -938,7 +938,7 @@
51.22
51.23 ///@}
51.24
51.25 - ///\name Two dimensional distributions
51.26 + ///\name Two Dimensional Distributions
51.27 ///
51.28 ///@{
51.29
52.1 --- a/lemon/smart_graph.h Sat Apr 18 21:54:30 2009 +0200
52.2 +++ b/lemon/smart_graph.h Tue Apr 21 10:34:49 2009 +0100
52.3 @@ -191,9 +191,7 @@
52.4 ///It is also quite memory efficient, but at the price
52.5 ///that <b> it does support only limited (only stack-like)
52.6 ///node and arc deletions</b>.
52.7 - ///It conforms to the \ref concepts::Digraph "Digraph concept" with
52.8 - ///an important extra feature that its maps are real \ref
52.9 - ///concepts::ReferenceMap "reference map"s.
52.10 + ///It fully conforms to the \ref concepts::Digraph "Digraph concept".
52.11 ///
52.12 ///\sa concepts::Digraph.
52.13 class SmartDigraph : public ExtendedSmartDigraphBase {
52.14 @@ -629,15 +627,9 @@
52.15 /// It is also quite memory efficient, but at the price
52.16 /// that <b> it does support only limited (only stack-like)
52.17 /// node and arc deletions</b>.
52.18 - /// Except from this it conforms to
52.19 - /// the \ref concepts::Graph "Graph concept".
52.20 - ///
52.21 - /// It also has an
52.22 - /// important extra feature that
52.23 - /// its maps are real \ref concepts::ReferenceMap "reference map"s.
52.24 + /// It fully conforms to the \ref concepts::Graph "Graph concept".
52.25 ///
52.26 /// \sa concepts::Graph.
52.27 - ///
52.28 class SmartGraph : public ExtendedSmartGraphBase {
52.29 private:
52.30
53.1 --- a/lemon/soplex.cc Sat Apr 18 21:54:30 2009 +0200
53.2 +++ b/lemon/soplex.cc Tue Apr 21 10:34:49 2009 +0100
53.3 @@ -20,6 +20,7 @@
53.4 #include <lemon/soplex.h>
53.5
53.6 #include <soplex.h>
53.7 +#include <spxout.h>
53.8
53.9
53.10 ///\file
53.11 @@ -28,6 +29,7 @@
53.12
53.13 SoplexLp::SoplexLp() {
53.14 soplex = new soplex::SoPlex;
53.15 + messageLevel(MESSAGE_NOTHING);
53.16 }
53.17
53.18 SoplexLp::~SoplexLp() {
53.19 @@ -47,6 +49,7 @@
53.20 _row_names = lp._row_names;
53.21 _row_names_ref = lp._row_names_ref;
53.22
53.23 + messageLevel(MESSAGE_NOTHING);
53.24 }
53.25
53.26 void SoplexLp::_clear_temporals() {
53.27 @@ -271,6 +274,8 @@
53.28 SoplexLp::SolveExitStatus SoplexLp::_solve() {
53.29
53.30 _clear_temporals();
53.31 +
53.32 + _applyMessageLevel();
53.33
53.34 soplex::SPxSolver::Status status = soplex->solve();
53.35
53.36 @@ -419,5 +424,29 @@
53.37 _clear_temporals();
53.38 }
53.39
53.40 + void SoplexLp::_messageLevel(MessageLevel level) {
53.41 + switch (level) {
53.42 + case MESSAGE_NOTHING:
53.43 + _message_level = -1;
53.44 + break;
53.45 + case MESSAGE_ERROR:
53.46 + _message_level = soplex::SPxOut::ERROR;
53.47 + break;
53.48 + case MESSAGE_WARNING:
53.49 + _message_level = soplex::SPxOut::WARNING;
53.50 + break;
53.51 + case MESSAGE_NORMAL:
53.52 + _message_level = soplex::SPxOut::INFO2;
53.53 + break;
53.54 + case MESSAGE_VERBOSE:
53.55 + _message_level = soplex::SPxOut::DEBUG;
53.56 + break;
53.57 + }
53.58 + }
53.59 +
53.60 + void SoplexLp::_applyMessageLevel() {
53.61 + soplex::Param::setVerbose(_message_level);
53.62 + }
53.63 +
53.64 } //namespace lemon
53.65
54.1 --- a/lemon/soplex.h Sat Apr 18 21:54:30 2009 +0200
54.2 +++ b/lemon/soplex.h Tue Apr 21 10:34:49 2009 +0100
54.3 @@ -144,6 +144,11 @@
54.4
54.5 virtual void _clear();
54.6
54.7 + void _messageLevel(MessageLevel m);
54.8 + void _applyMessageLevel();
54.9 +
54.10 + int _message_level;
54.11 +
54.12 };
54.13
54.14 } //END OF NAMESPACE LEMON
55.1 --- a/lemon/suurballe.h Sat Apr 18 21:54:30 2009 +0200
55.2 +++ b/lemon/suurballe.h Tue Apr 21 10:34:49 2009 +0100
55.3 @@ -288,7 +288,7 @@
55.4 return *this;
55.5 }
55.6
55.7 - /// \name Execution control
55.8 + /// \name Execution Control
55.9 /// The simplest way to execute the algorithm is to call the run()
55.10 /// function.
55.11 /// \n
56.1 --- a/lemon/time_measure.h Sat Apr 18 21:54:30 2009 +0200
56.2 +++ b/lemon/time_measure.h Tue Apr 21 10:34:49 2009 +0100
56.3 @@ -287,7 +287,7 @@
56.4 ///
56.5 Timer(bool run=true) :_running(run) {_reset();}
56.6
56.7 - ///\name Control the state of the timer
56.8 + ///\name Control the State of the Timer
56.9 ///Basically a Timer can be either running or stopped,
56.10 ///but it provides a bit finer control on the execution.
56.11 ///The \ref lemon::Timer "Timer" also counts the number of
56.12 @@ -395,7 +395,7 @@
56.13
56.14 ///@}
56.15
56.16 - ///\name Query Functions for the ellapsed time
56.17 + ///\name Query Functions for the Ellapsed Time
56.18
56.19 ///@{
56.20
57.1 --- a/test/bfs_test.cc Sat Apr 18 21:54:30 2009 +0200
57.2 +++ b/test/bfs_test.cc Tue Apr 21 10:34:49 2009 +0100
57.3 @@ -58,41 +58,80 @@
57.4 typedef Digraph::Arc Arc;
57.5
57.6 Digraph G;
57.7 - Node s, t;
57.8 + Node s, t, n;
57.9 Arc e;
57.10 - int l;
57.11 + int l, i;
57.12 bool b;
57.13 BType::DistMap d(G);
57.14 BType::PredMap p(G);
57.15 Path<Digraph> pp;
57.16 + concepts::ReadMap<Node,bool> nm;
57.17
57.18 {
57.19 BType bfs_test(G);
57.20 + const BType& const_bfs_test = bfs_test;
57.21
57.22 bfs_test.run(s);
57.23 bfs_test.run(s,t);
57.24 bfs_test.run();
57.25
57.26 - l = bfs_test.dist(t);
57.27 - e = bfs_test.predArc(t);
57.28 - s = bfs_test.predNode(t);
57.29 - b = bfs_test.reached(t);
57.30 - d = bfs_test.distMap();
57.31 - p = bfs_test.predMap();
57.32 - pp = bfs_test.path(t);
57.33 + bfs_test.init();
57.34 + bfs_test.addSource(s);
57.35 + n = bfs_test.processNextNode();
57.36 + n = bfs_test.processNextNode(t, b);
57.37 + n = bfs_test.processNextNode(nm, n);
57.38 + n = const_bfs_test.nextNode();
57.39 + b = const_bfs_test.emptyQueue();
57.40 + i = const_bfs_test.queueSize();
57.41 +
57.42 + bfs_test.start();
57.43 + bfs_test.start(t);
57.44 + bfs_test.start(nm);
57.45 +
57.46 + l = const_bfs_test.dist(t);
57.47 + e = const_bfs_test.predArc(t);
57.48 + s = const_bfs_test.predNode(t);
57.49 + b = const_bfs_test.reached(t);
57.50 + d = const_bfs_test.distMap();
57.51 + p = const_bfs_test.predMap();
57.52 + pp = const_bfs_test.path(t);
57.53 }
57.54 {
57.55 BType
57.56 ::SetPredMap<concepts::ReadWriteMap<Node,Arc> >
57.57 ::SetDistMap<concepts::ReadWriteMap<Node,int> >
57.58 ::SetReachedMap<concepts::ReadWriteMap<Node,bool> >
57.59 + ::SetStandardProcessedMap
57.60 ::SetProcessedMap<concepts::WriteMap<Node,bool> >
57.61 - ::SetStandardProcessedMap
57.62 ::Create bfs_test(G);
57.63 +
57.64 + concepts::ReadWriteMap<Node,Arc> pred_map;
57.65 + concepts::ReadWriteMap<Node,int> dist_map;
57.66 + concepts::ReadWriteMap<Node,bool> reached_map;
57.67 + concepts::WriteMap<Node,bool> processed_map;
57.68 +
57.69 + bfs_test
57.70 + .predMap(pred_map)
57.71 + .distMap(dist_map)
57.72 + .reachedMap(reached_map)
57.73 + .processedMap(processed_map);
57.74
57.75 bfs_test.run(s);
57.76 bfs_test.run(s,t);
57.77 bfs_test.run();
57.78 +
57.79 + bfs_test.init();
57.80 + bfs_test.addSource(s);
57.81 + n = bfs_test.processNextNode();
57.82 + n = bfs_test.processNextNode(t, b);
57.83 + n = bfs_test.processNextNode(nm, n);
57.84 + n = bfs_test.nextNode();
57.85 + b = bfs_test.emptyQueue();
57.86 + i = bfs_test.queueSize();
57.87 +
57.88 + bfs_test.start();
57.89 + bfs_test.start(t);
57.90 + bfs_test.start(nm);
57.91
57.92 l = bfs_test.dist(t);
57.93 e = bfs_test.predArc(t);
58.1 --- a/test/circulation_test.cc Sat Apr 18 21:54:30 2009 +0200
58.2 +++ b/test/circulation_test.cc Tue Apr 21 10:34:49 2009 +0100
58.3 @@ -71,27 +71,34 @@
58.4 DeltaMap delta;
58.5 FlowMap flow;
58.6 BarrierMap bar;
58.7 + VType v;
58.8 + bool b;
58.9
58.10 - Circulation<Digraph, CapMap, CapMap, DeltaMap>
58.11 - ::SetFlowMap<FlowMap>
58.12 - ::SetElevator<Elev>
58.13 - ::SetStandardElevator<LinkedElev>
58.14 - ::Create circ_test(g,lcap,ucap,delta);
58.15 -
58.16 - circ_test.lowerCapMap(lcap);
58.17 - circ_test.upperCapMap(ucap);
58.18 - circ_test.deltaMap(delta);
58.19 - flow = circ_test.flowMap();
58.20 - circ_test.flowMap(flow);
58.21 + typedef Circulation<Digraph, CapMap, CapMap, DeltaMap>
58.22 + ::SetFlowMap<FlowMap>
58.23 + ::SetElevator<Elev>
58.24 + ::SetStandardElevator<LinkedElev>
58.25 + ::Create CirculationType;
58.26 + CirculationType circ_test(g, lcap, ucap, delta);
58.27 + const CirculationType& const_circ_test = circ_test;
58.28 +
58.29 + circ_test
58.30 + .lowerCapMap(lcap)
58.31 + .upperCapMap(ucap)
58.32 + .deltaMap(delta)
58.33 + .flowMap(flow);
58.34
58.35 circ_test.init();
58.36 circ_test.greedyInit();
58.37 circ_test.start();
58.38 circ_test.run();
58.39
58.40 - circ_test.barrier(n);
58.41 - circ_test.barrierMap(bar);
58.42 - circ_test.flow(a);
58.43 + v = const_circ_test.flow(a);
58.44 + const FlowMap& fm = const_circ_test.flowMap();
58.45 + b = const_circ_test.barrier(n);
58.46 + const_circ_test.barrierMap(bar);
58.47 +
58.48 + ignore_unused_variable_warning(fm);
58.49 }
58.50
58.51 template <class G, class LM, class UM, class DM>
59.1 --- a/test/dfs_test.cc Sat Apr 18 21:54:30 2009 +0200
59.2 +++ b/test/dfs_test.cc Tue Apr 21 10:34:49 2009 +0100
59.3 @@ -62,39 +62,74 @@
59.4 Digraph G;
59.5 Node s, t;
59.6 Arc e;
59.7 - int l;
59.8 + int l, i;
59.9 bool b;
59.10 DType::DistMap d(G);
59.11 DType::PredMap p(G);
59.12 Path<Digraph> pp;
59.13 + concepts::ReadMap<Arc,bool> am;
59.14
59.15 {
59.16 DType dfs_test(G);
59.17 + const DType& const_dfs_test = dfs_test;
59.18
59.19 dfs_test.run(s);
59.20 dfs_test.run(s,t);
59.21 dfs_test.run();
59.22
59.23 - l = dfs_test.dist(t);
59.24 - e = dfs_test.predArc(t);
59.25 - s = dfs_test.predNode(t);
59.26 - b = dfs_test.reached(t);
59.27 - d = dfs_test.distMap();
59.28 - p = dfs_test.predMap();
59.29 - pp = dfs_test.path(t);
59.30 + dfs_test.init();
59.31 + dfs_test.addSource(s);
59.32 + e = dfs_test.processNextArc();
59.33 + e = const_dfs_test.nextArc();
59.34 + b = const_dfs_test.emptyQueue();
59.35 + i = const_dfs_test.queueSize();
59.36 +
59.37 + dfs_test.start();
59.38 + dfs_test.start(t);
59.39 + dfs_test.start(am);
59.40 +
59.41 + l = const_dfs_test.dist(t);
59.42 + e = const_dfs_test.predArc(t);
59.43 + s = const_dfs_test.predNode(t);
59.44 + b = const_dfs_test.reached(t);
59.45 + d = const_dfs_test.distMap();
59.46 + p = const_dfs_test.predMap();
59.47 + pp = const_dfs_test.path(t);
59.48 }
59.49 {
59.50 DType
59.51 ::SetPredMap<concepts::ReadWriteMap<Node,Arc> >
59.52 ::SetDistMap<concepts::ReadWriteMap<Node,int> >
59.53 ::SetReachedMap<concepts::ReadWriteMap<Node,bool> >
59.54 + ::SetStandardProcessedMap
59.55 ::SetProcessedMap<concepts::WriteMap<Node,bool> >
59.56 - ::SetStandardProcessedMap
59.57 ::Create dfs_test(G);
59.58
59.59 + concepts::ReadWriteMap<Node,Arc> pred_map;
59.60 + concepts::ReadWriteMap<Node,int> dist_map;
59.61 + concepts::ReadWriteMap<Node,bool> reached_map;
59.62 + concepts::WriteMap<Node,bool> processed_map;
59.63 +
59.64 + dfs_test
59.65 + .predMap(pred_map)
59.66 + .distMap(dist_map)
59.67 + .reachedMap(reached_map)
59.68 + .processedMap(processed_map);
59.69 +
59.70 dfs_test.run(s);
59.71 dfs_test.run(s,t);
59.72 dfs_test.run();
59.73 + dfs_test.init();
59.74 +
59.75 + dfs_test.addSource(s);
59.76 + e = dfs_test.processNextArc();
59.77 + e = dfs_test.nextArc();
59.78 + b = dfs_test.emptyQueue();
59.79 + i = dfs_test.queueSize();
59.80 +
59.81 + dfs_test.start();
59.82 + dfs_test.start(t);
59.83 + dfs_test.start(am);
59.84
59.85 l = dfs_test.dist(t);
59.86 e = dfs_test.predArc(t);
60.1 --- a/test/dijkstra_test.cc Sat Apr 18 21:54:30 2009 +0200
60.2 +++ b/test/dijkstra_test.cc Tue Apr 21 10:34:49 2009 +0100
60.3 @@ -60,48 +60,94 @@
60.4 typedef Digraph::Arc Arc;
60.5
60.6 Digraph G;
60.7 - Node s, t;
60.8 + Node s, t, n;
60.9 Arc e;
60.10 VType l;
60.11 + int i;
60.12 bool b;
60.13 DType::DistMap d(G);
60.14 DType::PredMap p(G);
60.15 LengthMap length;
60.16 Path<Digraph> pp;
60.17 + concepts::ReadMap<Node,bool> nm;
60.18
60.19 {
60.20 DType dijkstra_test(G,length);
60.21 + const DType& const_dijkstra_test = dijkstra_test;
60.22
60.23 dijkstra_test.run(s);
60.24 dijkstra_test.run(s,t);
60.25
60.26 + dijkstra_test.init();
60.27 + dijkstra_test.addSource(s);
60.28 + dijkstra_test.addSource(s, 1);
60.29 + n = dijkstra_test.processNextNode();
60.30 + n = const_dijkstra_test.nextNode();
60.31 + b = const_dijkstra_test.emptyQueue();
60.32 + i = const_dijkstra_test.queueSize();
60.33 +
60.34 + dijkstra_test.start();
60.35 + dijkstra_test.start(t);
60.36 + dijkstra_test.start(nm);
60.37 +
60.38 + l = const_dijkstra_test.dist(t);
60.39 + e = const_dijkstra_test.predArc(t);
60.40 + s = const_dijkstra_test.predNode(t);
60.41 + b = const_dijkstra_test.reached(t);
60.42 + b = const_dijkstra_test.processed(t);
60.43 + d = const_dijkstra_test.distMap();
60.44 + p = const_dijkstra_test.predMap();
60.45 + pp = const_dijkstra_test.path(t);
60.46 + l = const_dijkstra_test.currentDist(t);
60.47 + }
60.48 + {
60.49 + DType
60.50 + ::SetPredMap<concepts::ReadWriteMap<Node,Arc> >
60.51 + ::SetDistMap<concepts::ReadWriteMap<Node,VType> >
60.52 + ::SetStandardProcessedMap
60.53 + ::SetProcessedMap<concepts::WriteMap<Node,bool> >
60.54 + ::SetOperationTraits<DijkstraDefaultOperationTraits<VType> >
60.55 + ::SetHeap<BinHeap<VType, concepts::ReadWriteMap<Node,int> > >
60.56 + ::SetStandardHeap<BinHeap<VType, concepts::ReadWriteMap<Node,int> > >
60.57 + ::SetHeap<BinHeap<VType, concepts::ReadWriteMap<Node,int> >,
60.58 + concepts::ReadWriteMap<Node,int> >
60.59 + ::Create dijkstra_test(G,length);
60.60 +
60.61 + LengthMap length_map;
60.62 + concepts::ReadWriteMap<Node,Arc> pred_map;
60.63 + concepts::ReadWriteMap<Node,VType> dist_map;
60.64 + concepts::WriteMap<Node,bool> processed_map;
60.65 + concepts::ReadWriteMap<Node,int> heap_cross_ref;
60.66 + BinHeap<VType, concepts::ReadWriteMap<Node,int> > heap(heap_cross_ref);
60.67 +
60.68 + dijkstra_test
60.69 + .lengthMap(length_map)
60.70 + .predMap(pred_map)
60.71 + .distMap(dist_map)
60.72 + .processedMap(processed_map)
60.73 + .heap(heap, heap_cross_ref);
60.74 +
60.75 + dijkstra_test.run(s);
60.76 + dijkstra_test.run(s,t);
60.77 +
60.78 + dijkstra_test.addSource(s);
60.79 + dijkstra_test.addSource(s, 1);
60.80 + n = dijkstra_test.processNextNode();
60.81 + n = dijkstra_test.nextNode();
60.82 + b = dijkstra_test.emptyQueue();
60.83 + i = dijkstra_test.queueSize();
60.84 +
60.85 + dijkstra_test.start();
60.86 + dijkstra_test.start(t);
60.87 + dijkstra_test.start(nm);
60.88 +
60.89 l = dijkstra_test.dist(t);
60.90 e = dijkstra_test.predArc(t);
60.91 s = dijkstra_test.predNode(t);
60.92 b = dijkstra_test.reached(t);
60.93 - d = dijkstra_test.distMap();
60.94 - p = dijkstra_test.predMap();
60.95 + b = dijkstra_test.processed(t);
60.96 pp = dijkstra_test.path(t);
60.97 - }
60.98 - {
60.99 - DType
60.100 - ::SetPredMap<concepts::ReadWriteMap<Node,Arc> >
60.101 - ::SetDistMap<concepts::ReadWriteMap<Node,VType> >
60.102 - ::SetProcessedMap<concepts::WriteMap<Node,bool> >
60.103 - ::SetStandardProcessedMap
60.104 - ::SetOperationTraits<DijkstraDefaultOperationTraits<VType> >
60.105 - ::SetHeap<BinHeap<VType, concepts::ReadWriteMap<Node,int> > >
60.106 - ::SetStandardHeap<BinHeap<VType, concepts::ReadWriteMap<Node,int> > >
60.107 - ::Create dijkstra_test(G,length);
60.108 -
60.109 - dijkstra_test.run(s);
60.110 - dijkstra_test.run(s,t);
60.111 -
60.112 - l = dijkstra_test.dist(t);
60.113 - e = dijkstra_test.predArc(t);
60.114 - s = dijkstra_test.predNode(t);
60.115 - b = dijkstra_test.reached(t);
60.116 - pp = dijkstra_test.path(t);
60.117 + l = dijkstra_test.currentDist(t);
60.118 }
60.119
60.120 }
61.1 --- a/test/gomory_hu_test.cc Sat Apr 18 21:54:30 2009 +0200
61.2 +++ b/test/gomory_hu_test.cc Tue Apr 21 10:34:49 2009 +0100
61.3 @@ -2,6 +2,8 @@
61.4
61.5 #include "test_tools.h"
61.6 #include <lemon/smart_graph.h>
61.7 +#include <lemon/concepts/graph.h>
61.8 +#include <lemon/concepts/maps.h>
61.9 #include <lemon/lgf_reader.h>
61.10 #include <lemon/gomory_hu.h>
61.11 #include <cstdlib>
61.12 @@ -32,6 +34,36 @@
61.13 "source 0\n"
61.14 "target 3\n";
61.15
61.16 +void checkGomoryHuCompile()
61.17 +{
61.18 + typedef int Value;
61.19 + typedef concepts::Graph Graph;
61.20 +
61.21 + typedef Graph::Node Node;
61.22 + typedef Graph::Edge Edge;
61.23 + typedef concepts::ReadMap<Edge, Value> CapMap;
61.24 + typedef concepts::ReadWriteMap<Node, bool> CutMap;
61.25 +
61.26 + Graph g;
61.27 + Node n;
61.28 + CapMap cap;
61.29 + CutMap cut;
61.30 + Value v;
61.31 + int d;
61.32 +
61.33 + GomoryHu<Graph, CapMap> gh_test(g, cap);
61.34 + const GomoryHu<Graph, CapMap>&
61.35 + const_gh_test = gh_test;
61.36 +
61.37 + gh_test.run();
61.38 +
61.39 + n = const_gh_test.predNode(n);
61.40 + v = const_gh_test.predValue(n);
61.41 + d = const_gh_test.rootDist(n);
61.42 + v = const_gh_test.minCutValue(n, n);
61.43 + v = const_gh_test.minCutMap(n, n, cut);
61.44 +}
61.45 +
61.46 GRAPH_TYPEDEFS(Graph);
61.47 typedef Graph::EdgeMap<int> IntEdgeMap;
61.48 typedef Graph::NodeMap<bool> BoolNodeMap;
61.49 @@ -70,8 +102,8 @@
61.50 BoolNodeMap cm(graph);
61.51 ght.minCutMap(u, v, cm);
61.52 check(pf.flowValue() == ght.minCutValue(u, v), "Wrong cut 1");
61.53 - check(cm[u] != cm[v], "Wrong cut 3");
61.54 - check(pf.flowValue() == cutValue(graph, cm, capacity), "Wrong cut 2");
61.55 + check(cm[u] != cm[v], "Wrong cut 2");
61.56 + check(pf.flowValue() == cutValue(graph, cm, capacity), "Wrong cut 3");
61.57
61.58 int sum=0;
61.59 for(GomoryHu<Graph>::MinCutEdgeIt a(ght, u, v);a!=INVALID;++a)
61.60 @@ -84,7 +116,6 @@
61.61 for(GomoryHu<Graph>::MinCutNodeIt n(ght, u, v,false);n!=INVALID;++n)
61.62 sum++;
61.63 check(sum == countNodes(graph), "Problem with MinCutNodeIt");
61.64 -
61.65 }
61.66 }
61.67
62.1 --- a/test/hao_orlin_test.cc Sat Apr 18 21:54:30 2009 +0200
62.2 +++ b/test/hao_orlin_test.cc Tue Apr 21 10:34:49 2009 +0100
62.3 @@ -19,9 +19,12 @@
62.4 #include <sstream>
62.5
62.6 #include <lemon/smart_graph.h>
62.7 +#include <lemon/adaptors.h>
62.8 +#include <lemon/concepts/digraph.h>
62.9 +#include <lemon/concepts/maps.h>
62.10 +#include <lemon/lgf_reader.h>
62.11 #include <lemon/hao_orlin.h>
62.12
62.13 -#include <lemon/lgf_reader.h>
62.14 #include "test_tools.h"
62.15
62.16 using namespace lemon;
62.17 @@ -37,27 +40,124 @@
62.18 "4\n"
62.19 "5\n"
62.20 "@edges\n"
62.21 - " label capacity\n"
62.22 - "0 1 0 2\n"
62.23 - "1 2 1 2\n"
62.24 - "2 0 2 2\n"
62.25 - "3 4 3 2\n"
62.26 - "4 5 4 2\n"
62.27 - "5 3 5 2\n"
62.28 - "2 3 6 3\n";
62.29 + " cap1 cap2 cap3\n"
62.30 + "0 1 1 1 1 \n"
62.31 + "0 2 2 2 4 \n"
62.32 + "1 2 4 4 4 \n"
62.33 + "3 4 1 1 1 \n"
62.34 + "3 5 2 2 4 \n"
62.35 + "4 5 4 4 4 \n"
62.36 + "5 4 4 4 4 \n"
62.37 + "2 3 1 6 6 \n"
62.38 + "4 0 1 6 6 \n";
62.39 +
62.40 +void checkHaoOrlinCompile()
62.41 +{
62.42 + typedef int Value;
62.43 + typedef concepts::Digraph Digraph;
62.44 +
62.45 + typedef Digraph::Node Node;
62.46 + typedef Digraph::Arc Arc;
62.47 + typedef concepts::ReadMap<Arc, Value> CapMap;
62.48 + typedef concepts::WriteMap<Node, bool> CutMap;
62.49 +
62.50 + Digraph g;
62.51 + Node n;
62.52 + CapMap cap;
62.53 + CutMap cut;
62.54 + Value v;
62.55 +
62.56 + HaoOrlin<Digraph, CapMap> ho_test(g, cap);
62.57 + const HaoOrlin<Digraph, CapMap>&
62.58 + const_ho_test = ho_test;
62.59 +
62.60 + ho_test.init();
62.61 + ho_test.init(n);
62.62 + ho_test.calculateOut();
62.63 + ho_test.calculateIn();
62.64 + ho_test.run();
62.65 + ho_test.run(n);
62.66 +
62.67 + v = const_ho_test.minCutValue();
62.68 + v = const_ho_test.minCutMap(cut);
62.69 +}
62.70 +
62.71 +template <typename Graph, typename CapMap, typename CutMap>
62.72 +typename CapMap::Value
62.73 + cutValue(const Graph& graph, const CapMap& cap, const CutMap& cut)
62.74 +{
62.75 + typename CapMap::Value sum = 0;
62.76 + for (typename Graph::ArcIt a(graph); a != INVALID; ++a) {
62.77 + if (cut[graph.source(a)] && !cut[graph.target(a)])
62.78 + sum += cap[a];
62.79 + }
62.80 + return sum;
62.81 +}
62.82
62.83 int main() {
62.84 - SmartGraph graph;
62.85 - SmartGraph::EdgeMap<int> capacity(graph);
62.86 + SmartDigraph graph;
62.87 + SmartDigraph::ArcMap<int> cap1(graph), cap2(graph), cap3(graph);
62.88 + SmartDigraph::NodeMap<bool> cut(graph);
62.89
62.90 - istringstream lgfs(lgf);
62.91 - graphReader(graph, lgfs).
62.92 - edgeMap("capacity", capacity).run();
62.93 + istringstream input(lgf);
62.94 + digraphReader(graph, input)
62.95 + .arcMap("cap1", cap1)
62.96 + .arcMap("cap2", cap2)
62.97 + .arcMap("cap3", cap3)
62.98 + .run();
62.99
62.100 - HaoOrlin<SmartGraph, SmartGraph::EdgeMap<int> > ho(graph, capacity);
62.101 - ho.run();
62.102 + {
62.103 + HaoOrlin<SmartDigraph> ho(graph, cap1);
62.104 + ho.run();
62.105 + ho.minCutMap(cut);
62.106 +
62.107 + check(ho.minCutValue() == 1, "Wrong cut value");
62.108 + check(ho.minCutValue() == cutValue(graph, cap1, cut), "Wrong cut value");
62.109 + }
62.110 + {
62.111 + HaoOrlin<SmartDigraph> ho(graph, cap2);
62.112 + ho.run();
62.113 + ho.minCutMap(cut);
62.114
62.115 - check(ho.minCutValue() == 3, "Wrong cut value");
62.116 + check(ho.minCutValue() == 1, "Wrong cut value");
62.117 + check(ho.minCutValue() == cutValue(graph, cap2, cut), "Wrong cut value");
62.118 + }
62.119 + {
62.120 + HaoOrlin<SmartDigraph> ho(graph, cap3);
62.121 + ho.run();
62.122 + ho.minCutMap(cut);
62.123 +
62.124 + check(ho.minCutValue() == 1, "Wrong cut value");
62.125 + check(ho.minCutValue() == cutValue(graph, cap3, cut), "Wrong cut value");
62.126 + }
62.127 +
62.128 + typedef Undirector<SmartDigraph> UGraph;
62.129 + UGraph ugraph(graph);
62.130 +
62.131 + {
62.132 + HaoOrlin<UGraph, SmartDigraph::ArcMap<int> > ho(ugraph, cap1);
62.133 + ho.run();
62.134 + ho.minCutMap(cut);
62.135 +
62.136 + check(ho.minCutValue() == 2, "Wrong cut value");
62.137 + check(ho.minCutValue() == cutValue(ugraph, cap1, cut), "Wrong cut value");
62.138 + }
62.139 + {
62.140 + HaoOrlin<UGraph, SmartDigraph::ArcMap<int> > ho(ugraph, cap2);
62.141 + ho.run();
62.142 + ho.minCutMap(cut);
62.143 +
62.144 + check(ho.minCutValue() == 5, "Wrong cut value");
62.145 + check(ho.minCutValue() == cutValue(ugraph, cap2, cut), "Wrong cut value");
62.146 + }
62.147 + {
62.148 + HaoOrlin<UGraph, SmartDigraph::ArcMap<int> > ho(ugraph, cap3);
62.149 + ho.run();
62.150 + ho.minCutMap(cut);
62.151 +
62.152 + check(ho.minCutValue() == 5, "Wrong cut value");
62.153 + check(ho.minCutValue() == cutValue(ugraph, cap3, cut), "Wrong cut value");
62.154 + }
62.155
62.156 return 0;
62.157 }
63.1 --- a/test/kruskal_test.cc Sat Apr 18 21:54:30 2009 +0200
63.2 +++ b/test/kruskal_test.cc Tue Apr 21 10:34:49 2009 +0100
63.3 @@ -99,16 +99,16 @@
63.4 check(kruskal(G, edge_cost_map, tree_map)==10,
63.5 "Total cost should be 10");
63.6
63.7 - edge_cost_map.set(e1, -10);
63.8 - edge_cost_map.set(e2, -9);
63.9 - edge_cost_map.set(e3, -8);
63.10 - edge_cost_map.set(e4, -7);
63.11 - edge_cost_map.set(e5, -6);
63.12 - edge_cost_map.set(e6, -5);
63.13 - edge_cost_map.set(e7, -4);
63.14 - edge_cost_map.set(e8, -3);
63.15 - edge_cost_map.set(e9, -2);
63.16 - edge_cost_map.set(e10, -1);
63.17 + edge_cost_map[e1] = -10;
63.18 + edge_cost_map[e2] = -9;
63.19 + edge_cost_map[e3] = -8;
63.20 + edge_cost_map[e4] = -7;
63.21 + edge_cost_map[e5] = -6;
63.22 + edge_cost_map[e6] = -5;
63.23 + edge_cost_map[e7] = -4;
63.24 + edge_cost_map[e8] = -3;
63.25 + edge_cost_map[e9] = -2;
63.26 + edge_cost_map[e10] = -1;
63.27
63.28 vector<Edge> tree_edge_vec(5);
63.29
64.1 --- a/test/lp_test.cc Sat Apr 18 21:54:30 2009 +0200
64.2 +++ b/test/lp_test.cc Tue Apr 21 10:34:49 2009 +0100
64.3 @@ -395,12 +395,7 @@
64.4 aTest(lp_cplex2);
64.5 cloneTest<CplexLp>();
64.6 } catch (CplexEnv::LicenseError& error) {
64.7 -#ifdef LEMON_FORCE_CPLEX_CHECK
64.8 check(false, error.what());
64.9 -#else
64.10 - std::cerr << error.what() << std::endl;
64.11 - std::cerr << "Cplex license check failed, lp check skipped" << std::endl;
64.12 -#endif
64.13 }
64.14 #endif
64.15
65.1 --- a/test/mip_test.cc Sat Apr 18 21:54:30 2009 +0200
65.2 +++ b/test/mip_test.cc Tue Apr 21 10:34:49 2009 +0100
65.3 @@ -143,12 +143,7 @@
65.4 aTest(mip2);
65.5 cloneTest<CplexMip>();
65.6 } catch (CplexEnv::LicenseError& error) {
65.7 -#ifdef LEMON_FORCE_CPLEX_CHECK
65.8 check(false, error.what());
65.9 -#else
65.10 - std::cerr << error.what() << std::endl;
65.11 - std::cerr << "Cplex license check failed, lp check skipped" << std::endl;
65.12 -#endif
65.13 }
65.14 #endif
65.15
66.1 --- a/test/preflow_test.cc Sat Apr 18 21:54:30 2009 +0200
66.2 +++ b/test/preflow_test.cc Tue Apr 21 10:34:49 2009 +0100
66.3 @@ -84,18 +84,22 @@
66.4 CapMap cap;
66.5 FlowMap flow;
66.6 CutMap cut;
66.7 + VType v;
66.8 + bool b;
66.9
66.10 - Preflow<Digraph, CapMap>
66.11 - ::SetFlowMap<FlowMap>
66.12 - ::SetElevator<Elev>
66.13 - ::SetStandardElevator<LinkedElev>
66.14 - ::Create preflow_test(g,cap,n,n);
66.15 + typedef Preflow<Digraph, CapMap>
66.16 + ::SetFlowMap<FlowMap>
66.17 + ::SetElevator<Elev>
66.18 + ::SetStandardElevator<LinkedElev>
66.19 + ::Create PreflowType;
66.20 + PreflowType preflow_test(g, cap, n, n);
66.21 + const PreflowType& const_preflow_test = preflow_test;
66.22
66.23 - preflow_test.capacityMap(cap);
66.24 - flow = preflow_test.flowMap();
66.25 - preflow_test.flowMap(flow);
66.26 - preflow_test.source(n);
66.27 - preflow_test.target(n);
66.28 + preflow_test
66.29 + .capacityMap(cap)
66.30 + .flowMap(flow)
66.31 + .source(n)
66.32 + .target(n);
66.33
66.34 preflow_test.init();
66.35 preflow_test.init(cap);
66.36 @@ -104,11 +108,13 @@
66.37 preflow_test.run();
66.38 preflow_test.runMinCut();
66.39
66.40 - preflow_test.flowValue();
66.41 - preflow_test.minCut(n);
66.42 - preflow_test.minCutMap(cut);
66.43 - preflow_test.flow(e);
66.44 -
66.45 + v = const_preflow_test.flowValue();
66.46 + v = const_preflow_test.flow(e);
66.47 + const FlowMap& fm = const_preflow_test.flowMap();
66.48 + b = const_preflow_test.minCut(n);
66.49 + const_preflow_test.minCutMap(cut);
66.50 +
66.51 + ignore_unused_variable_warning(fm);
66.52 }
66.53
66.54 int cutValue (const SmartDigraph& g,
67.1 --- a/tools/dimacs-solver.cc Sat Apr 18 21:54:30 2009 +0200
67.2 +++ b/tools/dimacs-solver.cc Tue Apr 21 10:34:49 2009 +0100
67.3 @@ -23,11 +23,10 @@
67.4 /// This program solves various problems given in DIMACS format.
67.5 ///
67.6 /// See
67.7 -/// \verbatim
67.8 -/// dimacs-solver --help
67.9 -/// \endverbatim
67.10 +/// \code
67.11 +/// dimacs-solver --help
67.12 +/// \endcode
67.13 /// for more info on usage.
67.14 -///
67.15
67.16 #include <iostream>
67.17 #include <fstream>
68.1 --- a/tools/dimacs-to-lgf.cc Sat Apr 18 21:54:30 2009 +0200
68.2 +++ b/tools/dimacs-to-lgf.cc Tue Apr 21 10:34:49 2009 +0100
68.3 @@ -24,11 +24,10 @@
68.4 /// (LGF).
68.5 ///
68.6 /// See
68.7 -/// \verbatim
68.8 -/// dimacs-to-lgf --help
68.9 -/// \endverbatim
68.10 -/// for more info on usage.
68.11 -///
68.12 +/// \code
68.13 +/// dimacs-to-lgf --help
68.14 +/// \endcode
68.15 +/// for more info on the usage.
68.16
68.17 #include <iostream>
68.18 #include <fstream>
69.1 --- a/tools/lemon-0.x-to-1.x.sh Sat Apr 18 21:54:30 2009 +0200
69.2 +++ b/tools/lemon-0.x-to-1.x.sh Tue Apr 21 10:34:49 2009 +0100
69.3 @@ -89,6 +89,10 @@
69.4 -e "s/\<\([Ff]\)orkWriteMap\>/\1orkMap/g"\
69.5 -e "s/\<StoreBoolMap\>/LoggerBoolMap/g"\
69.6 -e "s/\<storeBoolMap\>/loggerBoolMap/g"\
69.7 + -e "s/\<InvertableMap\>/CrossRefMap/g"\
69.8 + -e "s/\<invertableMap\>/crossRefMap/g"\
69.9 + -e "s/\<DescriptorMap\>/RangeIdMap/g"\
69.10 + -e "s/\<descriptorMap\>/rangeIdMap/g"\
69.11 -e "s/\<BoundingBox\>/Box/g"\
69.12 -e "s/\<readNauty\>/readNautyGraph/g"\
69.13 -e "s/\<RevDigraphAdaptor\>/ReverseDigraph/g"\
70.1 --- a/tools/lgf-gen.cc Sat Apr 18 21:54:30 2009 +0200
70.2 +++ b/tools/lgf-gen.cc Tue Apr 21 10:34:49 2009 +0100
70.3 @@ -23,12 +23,10 @@
70.4 /// Graph generator application for various types of plane graphs.
70.5 ///
70.6 /// See
70.7 -/// \verbatim
70.8 -/// lgf-gen --help
70.9 -/// \endverbatim
70.10 +/// \code
70.11 +/// lgf-gen --help
70.12 +/// \endcode
70.13 /// for more info on the usage.
70.14 -///
70.15 -
70.16
70.17 #include <algorithm>
70.18 #include <set>