Merge
authorAlpar Juttner <alpar@cs.elte.hu>
Tue, 21 Apr 2009 10:34:49 +0100
changeset 591f63e87b9748e
parent 590 a3402913cffe
parent 589 2ca0cdb5f366
child 592 0ba8dfce7259
Merge
lemon/lgf_reader.h
lemon/lgf_writer.h
     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>