↑ Collapse diff ↑
Ignore white space 6 line context
1
%%%%% Defining LEMON %%%%%
2

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

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

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

	
25

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

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

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

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

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

	
60

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

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

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

	
76

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

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

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

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

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

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

	
110

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

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

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

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

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

	
150

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

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

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

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

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

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

	
203

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

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

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

	
228

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

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

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

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

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

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

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

	
293
@mastersthesis{kellyoneill91netsimplex,
294
  author =       {Damian J. Kelly and Garrett M. O'Neill},
295
  title =        {The Minimum Cost Flow Problem and The Network
296
                  Simplex Method},
297
  school =       {University College},
298
  address =      {Dublin, Ireland},
299
  year =         1991,
300
  month =        sep,
301
}
Ignore white space 6 line context
1 1
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
2 2

	
3 3
SET(PROJECT_NAME "LEMON")
4 4
PROJECT(${PROJECT_NAME})
5 5

	
6 6
IF(EXISTS ${PROJECT_SOURCE_DIR}/cmake/version.cmake)
7 7
  INCLUDE(${PROJECT_SOURCE_DIR}/cmake/version.cmake)
8 8
ELSEIF(DEFINED ENV{LEMON_VERSION})
9 9
  SET(LEMON_VERSION $ENV{LEMON_VERSION} CACHE STRING "LEMON version string.")
10 10
ELSE()
11 11
  EXECUTE_PROCESS(
12 12
    COMMAND hg id -i
13 13
    WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
14 14
    OUTPUT_VARIABLE HG_REVISION
15 15
    ERROR_QUIET
16 16
    OUTPUT_STRIP_TRAILING_WHITESPACE
17 17
  )
18 18
  IF(HG_REVISION STREQUAL "")
19 19
    SET(HG_REVISION "hg-tip")
20 20
  ENDIF()
21 21
  SET(LEMON_VERSION ${HG_REVISION} CACHE STRING "LEMON version string.")
22 22
ENDIF()
23 23

	
24 24
SET(PROJECT_VERSION ${LEMON_VERSION})
25 25

	
26 26
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
27 27

	
28 28
FIND_PACKAGE(Doxygen)
29 29
FIND_PACKAGE(Ghostscript)
30 30
FIND_PACKAGE(GLPK 4.33)
31 31
FIND_PACKAGE(CPLEX)
32 32
FIND_PACKAGE(COIN)
33 33

	
34 34
INCLUDE(CheckTypeSize)
35 35
CHECK_TYPE_SIZE("long long" LONG_LONG)
36 36
SET(LEMON_HAVE_LONG_LONG ${HAVE_LONG_LONG})
37 37

	
38
INCLUDE(FindPythonInterp)
39

	
38 40
ENABLE_TESTING()
39 41

	
40 42
ADD_SUBDIRECTORY(lemon)
41 43
IF(${CMAKE_SOURCE_DIR} STREQUAL ${PROJECT_SOURCE_DIR})
42 44
  ADD_SUBDIRECTORY(demo)
43 45
  ADD_SUBDIRECTORY(tools)
44 46
  ADD_SUBDIRECTORY(doc)
45 47
  ADD_SUBDIRECTORY(test)
46 48
ENDIF()
47 49

	
48 50
CONFIGURE_FILE(
49 51
  ${PROJECT_SOURCE_DIR}/cmake/LEMONConfig.cmake.in
50 52
  ${PROJECT_BINARY_DIR}/cmake/LEMONConfig.cmake
51 53
  @ONLY
52 54
)
53 55
IF(UNIX)
54 56
  INSTALL(
55 57
    FILES ${PROJECT_BINARY_DIR}/cmake/LEMONConfig.cmake
56 58
    DESTINATION share/lemon/cmake
57 59
  )
58 60
ELSEIF(WIN32)
59 61
  INSTALL(
60 62
    FILES ${PROJECT_BINARY_DIR}/cmake/LEMONConfig.cmake
61 63
    DESTINATION cmake
62 64
  )
63 65
ENDIF()
64 66

	
65 67
IF(${CMAKE_SOURCE_DIR} STREQUAL ${PROJECT_SOURCE_DIR} AND WIN32)
66 68
  SET(CPACK_PACKAGE_NAME ${PROJECT_NAME})
67 69
  SET(CPACK_PACKAGE_VENDOR "EGRES")
68 70
  SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY
69 71
    "LEMON - Library for Efficient Modeling and Optimization in Networks")
70 72
  SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
71 73

	
72 74
  SET(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
73 75

	
74 76
  SET(CPACK_PACKAGE_INSTALL_DIRECTORY
75 77
    "${PROJECT_NAME} ${PROJECT_VERSION}")
76 78
  SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY
77 79
    "${PROJECT_NAME} ${PROJECT_VERSION}")
78 80

	
79 81
  SET(CPACK_COMPONENTS_ALL headers library html_documentation bin)
80 82

	
81 83
  SET(CPACK_COMPONENT_HEADERS_DISPLAY_NAME "C++ headers")
82 84
  SET(CPACK_COMPONENT_LIBRARY_DISPLAY_NAME "Dynamic-link library")
83 85
  SET(CPACK_COMPONENT_BIN_DISPLAY_NAME "Command line utilities")
84 86
  SET(CPACK_COMPONENT_HTML_DOCUMENTATION_DISPLAY_NAME "HTML documentation")
85 87

	
86 88
  SET(CPACK_COMPONENT_HEADERS_DESCRIPTION
87 89
    "C++ header files")
88 90
  SET(CPACK_COMPONENT_LIBRARY_DESCRIPTION
89 91
    "DLL and import library")
90 92
  SET(CPACK_COMPONENT_BIN_DESCRIPTION
91 93
    "Command line utilities")
92 94
  SET(CPACK_COMPONENT_HTML_DOCUMENTATION_DESCRIPTION
93 95
    "Doxygen generated documentation")
94 96

	
95 97
  SET(CPACK_COMPONENT_HEADERS_DEPENDS library)
96 98

	
97 99
  SET(CPACK_COMPONENT_HEADERS_GROUP "Development")
98 100
  SET(CPACK_COMPONENT_LIBRARY_GROUP "Development")
99 101
  SET(CPACK_COMPONENT_HTML_DOCUMENTATION_GROUP "Documentation")
100 102

	
101 103
  SET(CPACK_COMPONENT_GROUP_DEVELOPMENT_DESCRIPTION
102 104
    "Components needed to develop software using LEMON")
103 105
  SET(CPACK_COMPONENT_GROUP_DOCUMENTATION_DESCRIPTION
104 106
    "Documentation of LEMON")
105 107

	
106 108
  SET(CPACK_ALL_INSTALL_TYPES Full Developer)
107 109

	
108 110
  SET(CPACK_COMPONENT_HEADERS_INSTALL_TYPES Developer Full)
109 111
  SET(CPACK_COMPONENT_LIBRARY_INSTALL_TYPES Developer Full)
110 112
  SET(CPACK_COMPONENT_HTML_DOCUMENTATION_INSTALL_TYPES Full)
111 113

	
112 114
  SET(CPACK_GENERATOR "NSIS")
113 115
  SET(CPACK_NSIS_MUI_ICON "${PROJECT_SOURCE_DIR}/cmake/nsis/lemon.ico")
114 116
  SET(CPACK_NSIS_MUI_UNIICON "${PROJECT_SOURCE_DIR}/cmake/nsis/uninstall.ico")
115 117
  #SET(CPACK_PACKAGE_ICON "${PROJECT_SOURCE_DIR}/cmake/nsis\\\\installer.bmp")
116 118
  SET(CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\lemon.ico")
117 119
  SET(CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_INSTALL_DIRECTORY} ${PROJECT_NAME}")
118 120
  SET(CPACK_NSIS_HELP_LINK "http:\\\\\\\\lemon.cs.elte.hu")
119 121
  SET(CPACK_NSIS_URL_INFO_ABOUT "http:\\\\\\\\lemon.cs.elte.hu")
120 122
  SET(CPACK_NSIS_CONTACT "lemon-user@lemon.cs.elte.hu")
121 123
  SET(CPACK_NSIS_CREATE_ICONS_EXTRA "
122 124
    CreateShortCut \\\"$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\Documentation.lnk\\\" \\\"$INSTDIR\\\\share\\\\doc\\\\index.html\\\"
123 125
    ")
124 126
  SET(CPACK_NSIS_DELETE_ICONS_EXTRA "
125 127
    !insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP
126 128
    Delete \\\"$SMPROGRAMS\\\\$MUI_TEMP\\\\Documentation.lnk\\\"
127 129
    ")
128 130

	
129 131
  INCLUDE(CPack)
130 132
ENDIF()
Ignore white space 256 line context
1 1
ACLOCAL_AMFLAGS = -I m4
2 2

	
3 3
AM_CXXFLAGS = $(WARNINGCXXFLAGS)
4 4

	
5 5
AM_CPPFLAGS = -I$(top_srcdir) -I$(top_builddir)
6 6
LDADD = $(top_builddir)/lemon/libemon.la
7 7

	
8 8
EXTRA_DIST = \
9 9
	AUTHORS \
10 10
	LICENSE \
11 11
	m4/lx_check_cplex.m4 \
12 12
	m4/lx_check_glpk.m4 \
13 13
	m4/lx_check_soplex.m4 \
14 14
	m4/lx_check_coin.m4 \
15 15
	CMakeLists.txt \
16 16
	cmake/FindGhostscript.cmake \
17 17
	cmake/FindCPLEX.cmake \
18 18
	cmake/FindGLPK.cmake \
19 19
	cmake/FindCOIN.cmake \
20
	cmake/LEMONConfig.cmake.in \
20 21
	cmake/version.cmake.in \
21 22
	cmake/version.cmake \
22 23
	cmake/nsis/lemon.ico \
23 24
	cmake/nsis/uninstall.ico
24 25

	
25 26
pkgconfigdir = $(libdir)/pkgconfig
26 27
lemondir = $(pkgincludedir)
27 28
bitsdir = $(lemondir)/bits
28 29
conceptdir = $(lemondir)/concepts
29 30
pkgconfig_DATA =
30 31
lib_LTLIBRARIES =
31 32
lemon_HEADERS =
32 33
bits_HEADERS =
33 34
concept_HEADERS =
34 35
noinst_HEADERS =
35 36
noinst_PROGRAMS =
36 37
bin_PROGRAMS =
37 38
check_PROGRAMS =
38 39
dist_bin_SCRIPTS =
39 40
TESTS =
40 41
XFAIL_TESTS =
41 42

	
42 43
include lemon/Makefile.am
43 44
include test/Makefile.am
44 45
include doc/Makefile.am
45 46
include tools/Makefile.am
47
include scripts/Makefile.am
46 48

	
47 49
DIST_SUBDIRS = demo
48 50

	
49 51
demo:
50 52
	$(MAKE) $(AM_MAKEFLAGS) -C demo
51 53

	
52 54
MRPROPERFILES = \
53 55
	aclocal.m4 \
54 56
	config.h.in \
55 57
	config.h.in~ \
56 58
	configure \
57 59
	Makefile.in \
58 60
	build-aux/config.guess \
59 61
	build-aux/config.sub \
60 62
	build-aux/depcomp \
61 63
	build-aux/install-sh \
62 64
	build-aux/ltmain.sh \
63 65
	build-aux/missing \
64 66
	doc/doxygen.log
65 67

	
66 68
mrproper:
67 69
	$(MAKE) $(AM_MAKEFLAGS) maintainer-clean
68 70
	-rm -f $(MRPROPERFILES)
69 71

	
70 72
dist-bz2: dist
71 73
	zcat $(PACKAGE)-$(VERSION).tar.gz | \
72 74
	bzip2 --best -c > $(PACKAGE)-$(VERSION).tar.bz2
73 75

	
74 76
distcheck-bz2: distcheck
75 77
	zcat $(PACKAGE)-$(VERSION).tar.gz | \
76 78
	bzip2 --best -c > $(PACKAGE)-$(VERSION).tar.bz2
77 79

	
78 80
.PHONY: demo mrproper dist-bz2 distcheck-bz2
Ignore white space 6 line context
1 1
dnl Process this file with autoconf to produce a configure script.
2 2

	
3 3
dnl Version information.
4 4
m4_define([lemon_version_number],
5 5
          [m4_normalize(esyscmd([echo ${LEMON_VERSION}]))])
6 6
dnl m4_define([lemon_version_number], [])
7 7
m4_define([lemon_hg_path], [m4_normalize(esyscmd([./scripts/chg-len.py]))])
8 8
m4_define([lemon_hg_revision], [m4_normalize(esyscmd([hg id -i 2> /dev/null]))])
9 9
m4_define([lemon_version], [ifelse(lemon_version_number(),
10 10
                           [],
11 11
                           [ifelse(lemon_hg_revision(),
12 12
                           [],
13 13
                           [hg-tip],
14 14
                           [lemon_hg_path().lemon_hg_revision()])],
15 15
                           [lemon_version_number()])])
16 16

	
17 17
AC_PREREQ([2.59])
18 18
AC_INIT([LEMON], [lemon_version()], [lemon-user@lemon.cs.elte.hu], [lemon])
19 19
AC_CONFIG_AUX_DIR([build-aux])
20 20
AC_CONFIG_MACRO_DIR([m4])
21 21
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects nostdinc])
22 22
AC_CONFIG_SRCDIR([lemon/list_graph.h])
23 23
AC_CONFIG_HEADERS([config.h lemon/config.h])
24 24

	
25 25
AC_DEFINE([LEMON_VERSION], [lemon_version()], [The version string])
26 26

	
27 27
dnl Do compilation tests using the C++ compiler.
28 28
AC_LANG([C++])
29 29

	
30 30
dnl Check the existence of long long type.
31 31
AC_CHECK_TYPE(long long, [long_long_found=yes], [long_long_found=no])
32 32
if test x"$long_long_found" = x"yes"; then
33 33
  AC_DEFINE([LEMON_HAVE_LONG_LONG], [1], [Define to 1 if you have long long.])
34 34
fi
35 35

	
36 36
dnl Checks for programs.
37 37
AC_PROG_CXX
38 38
AC_PROG_CXXCPP
39 39
AC_PROG_INSTALL
40 40
AC_DISABLE_SHARED
41 41
AC_PROG_LIBTOOL
42 42

	
43 43
AC_CHECK_PROG([doxygen_found],[doxygen],[yes],[no])
44
AC_CHECK_PROG([python_found],[python],[yes],[no])
44 45
AC_CHECK_PROG([gs_found],[gs],[yes],[no])
45 46

	
46 47
dnl Detect Intel compiler.
47 48
AC_MSG_CHECKING([whether we are using the Intel C++ compiler])
48 49
AC_COMPILE_IFELSE([#ifndef __INTEL_COMPILER
49 50
choke me
50 51
#endif], [ICC=[yes]], [ICC=[no]])
51 52
if test x"$ICC" = x"yes"; then
52 53
  AC_MSG_RESULT([yes])
53 54
else
54 55
  AC_MSG_RESULT([no])
55 56
fi
56 57

	
57 58
dnl Set custom compiler flags when using g++.
58 59
if test "$GXX" = yes -a "$ICC" = no; then
59 60
  WARNINGCXXFLAGS="-Wall -W -Wall -W -Wunused -Wformat=2 -Wctor-dtor-privacy -Wnon-virtual-dtor -Wno-char-subscripts -Wwrite-strings -Wno-char-subscripts -Wreturn-type -Wcast-qual -Wcast-align -Wsign-promo -Woverloaded-virtual -ansi -fno-strict-aliasing -Wold-style-cast -Wno-unknown-pragmas"
60 61
fi
61 62
AC_SUBST([WARNINGCXXFLAGS])
62 63

	
63 64
dnl Checks for libraries.
64 65
LX_CHECK_GLPK
65 66
LX_CHECK_CPLEX
66 67
LX_CHECK_SOPLEX
67 68
LX_CHECK_COIN
68 69

	
69 70
AM_CONDITIONAL([HAVE_LP], [test x"$lx_lp_found" = x"yes"])
70 71
AM_CONDITIONAL([HAVE_MIP], [test x"$lx_mip_found" = x"yes"])
71 72

	
72 73
dnl Disable/enable building the binary tools.
73 74
AC_ARG_ENABLE([tools],
74 75
AS_HELP_STRING([--enable-tools], [build additional tools @<:@default@:>@])
75 76
AS_HELP_STRING([--disable-tools], [do not build additional tools]),
76 77
              [], [enable_tools=yes])
77 78
AC_MSG_CHECKING([whether to build the additional tools])
78 79
if test x"$enable_tools" != x"no"; then
79 80
  AC_MSG_RESULT([yes])
80 81
else
81 82
  AC_MSG_RESULT([no])
82 83
fi
83 84
AM_CONDITIONAL([WANT_TOOLS], [test x"$enable_tools" != x"no"])
84 85

	
86
dnl Support for running test cases using valgrind.
87
use_valgrind=no
88
AC_ARG_ENABLE([valgrind],
89
AS_HELP_STRING([--enable-valgrind], [use valgrind when running tests]),
90
              [use_valgrind=yes])
91

	
92
if [[ "$use_valgrind" = "yes" ]]; then
93
  AC_CHECK_PROG(HAVE_VALGRIND, valgrind, yes, no)
94

	
95
  if [[ "$HAVE_VALGRIND" = "no" ]]; then
96
    AC_MSG_ERROR([Valgrind not found in PATH.])
97
  fi
98
fi
99
AM_CONDITIONAL(USE_VALGRIND, [test "$use_valgrind" = "yes"])
100

	
85 101
dnl Checks for header files.
86 102
AC_CHECK_HEADERS(limits.h sys/time.h sys/times.h unistd.h)
87 103

	
88 104
dnl Checks for typedefs, structures, and compiler characteristics.
89 105
AC_C_CONST
90 106
AC_C_INLINE
91 107
AC_TYPE_SIZE_T
92 108
AC_HEADER_TIME
93 109
AC_STRUCT_TM
94 110

	
95 111
dnl Checks for library functions.
96 112
AC_HEADER_STDC
97 113
AC_CHECK_FUNCS(gettimeofday times ctime_r)
98 114

	
99 115
dnl Add dependencies on files generated by configure.
100 116
AC_SUBST([CONFIG_STATUS_DEPENDENCIES],
101 117
  ['$(top_srcdir)/doc/Doxyfile.in $(top_srcdir)/lemon/lemon.pc.in $(top_srcdir)/cmake/version.cmake.in'])
102 118

	
103 119
AC_CONFIG_FILES([
104 120
Makefile
105 121
demo/Makefile
106 122
cmake/version.cmake
107 123
doc/Doxyfile
108 124
lemon/lemon.pc
109 125
])
110 126

	
111 127
AC_OUTPUT
112 128

	
113 129
echo
114 130
echo '****************************** SUMMARY ******************************'
115 131
echo
116 132
echo Package version............... : $PACKAGE-$VERSION
117 133
echo
118 134
echo C++ compiler.................. : $CXX
119 135
echo C++ compiles flags............ : $WARNINGCXXFLAGS $CXXFLAGS
120 136
echo
121 137
echo Compiler supports long long... : $long_long_found
122 138
echo
123 139
echo GLPK support.................. : $lx_glpk_found
124 140
echo CPLEX support................. : $lx_cplex_found
125 141
echo SOPLEX support................ : $lx_soplex_found
126 142
echo CLP support................... : $lx_clp_found
127 143
echo CBC support................... : $lx_cbc_found
128 144
echo
129 145
echo Build additional tools........ : $enable_tools
146
echo Use valgrind for tests........ : $use_valgrind
130 147
echo
131 148
echo The packace will be installed in
132 149
echo -n '  '
133 150
echo $prefix.
134 151
echo
135 152
echo '*********************************************************************'
136 153

	
137 154
echo
138 155
echo Configure complete, now type \'make\' and then \'make install\'.
139 156
echo
Ignore white space 6 line context
1 1
SET(PACKAGE_NAME ${PROJECT_NAME})
2 2
SET(PACKAGE_VERSION ${PROJECT_VERSION})
3 3
SET(abs_top_srcdir ${PROJECT_SOURCE_DIR})
4 4
SET(abs_top_builddir ${PROJECT_BINARY_DIR})
5 5

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

	
12
IF(DOXYGEN_EXECUTABLE AND GHOSTSCRIPT_EXECUTABLE)
12
IF(DOXYGEN_EXECUTABLE AND PYTHONINTERP_FOUND AND GHOSTSCRIPT_EXECUTABLE)
13 13
  FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/)
14 14
  SET(GHOSTSCRIPT_OPTIONS -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha)
15 15
  ADD_CUSTOM_TARGET(html
16 16
    COMMAND ${CMAKE_COMMAND} -E remove_directory gen-images
17 17
    COMMAND ${CMAKE_COMMAND} -E make_directory gen-images
18 18
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/bipartite_matching.png ${CMAKE_CURRENT_SOURCE_DIR}/images/bipartite_matching.eps
19 19
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/bipartite_partitions.png ${CMAKE_CURRENT_SOURCE_DIR}/images/bipartite_partitions.eps
20 20
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/connected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/connected_components.eps
21 21
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/edge_biconnected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/edge_biconnected_components.eps
22 22
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/grid_graph.png ${CMAKE_CURRENT_SOURCE_DIR}/images/grid_graph.eps
23 23
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/node_biconnected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/node_biconnected_components.eps
24 24
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_0.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_0.eps
25 25
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_1.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_1.eps
26 26
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_2.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_2.eps
27 27
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_3.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_3.eps
28 28
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_4.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_4.eps
29 29
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/strongly_connected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/strongly_connected_components.eps
30 30
    COMMAND ${CMAKE_COMMAND} -E remove_directory html
31
    COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/scripts/bib2dox.py ${CMAKE_CURRENT_SOURCE_DIR}/references.bib >references.dox
31 32
    COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile
32 33
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
33 34
  )
34 35

	
35 36
  SET_TARGET_PROPERTIES(html PROPERTIES PROJECT_LABEL BUILD_DOC)
36 37

	
37 38
  IF(UNIX)
38 39
    INSTALL(
39 40
      DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/
40 41
      DESTINATION share/doc/lemon/html
41 42
      COMPONENT html_documentation
42 43
    )
43 44
  ELSEIF(WIN32)
44 45
    INSTALL(
45 46
      DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/
46 47
      DESTINATION doc
47 48
      COMPONENT html_documentation
48 49
    )
49 50
  ENDIF()
50 51

	
51 52
ENDIF()
Ignore white space 6 line context
1
# Doxyfile 1.5.7.1
1
# Doxyfile 1.5.9
2 2

	
3 3
#---------------------------------------------------------------------------
4 4
# Project related configuration options
5 5
#---------------------------------------------------------------------------
6 6
DOXYFILE_ENCODING      = UTF-8
7 7
PROJECT_NAME           = @PACKAGE_NAME@
8 8
PROJECT_NUMBER         = @PACKAGE_VERSION@
9 9
OUTPUT_DIRECTORY       = 
10 10
CREATE_SUBDIRS         = NO
11 11
OUTPUT_LANGUAGE        = English
12 12
BRIEF_MEMBER_DESC      = YES
13 13
REPEAT_BRIEF           = NO
14 14
ABBREVIATE_BRIEF       = 
15 15
ALWAYS_DETAILED_SEC    = NO
16 16
INLINE_INHERITED_MEMB  = NO
17 17
FULL_PATH_NAMES        = YES
18 18
STRIP_FROM_PATH        = "@abs_top_srcdir@"
19 19
STRIP_FROM_INC_PATH    = "@abs_top_srcdir@"
20 20
SHORT_NAMES            = YES
21 21
JAVADOC_AUTOBRIEF      = NO
22 22
QT_AUTOBRIEF           = NO
23 23
MULTILINE_CPP_IS_BRIEF = NO
24
DETAILS_AT_TOP         = YES
25 24
INHERIT_DOCS           = NO
26 25
SEPARATE_MEMBER_PAGES  = NO
27 26
TAB_SIZE               = 8
28 27
ALIASES                = 
29 28
OPTIMIZE_OUTPUT_FOR_C  = NO
30 29
OPTIMIZE_OUTPUT_JAVA   = NO
31 30
OPTIMIZE_FOR_FORTRAN   = NO
32 31
OPTIMIZE_OUTPUT_VHDL   = NO
33 32
BUILTIN_STL_SUPPORT    = YES
34 33
CPP_CLI_SUPPORT        = NO
35 34
SIP_SUPPORT            = NO
36 35
IDL_PROPERTY_SUPPORT   = YES
37 36
DISTRIBUTE_GROUP_DOC   = NO
38 37
SUBGROUPING            = YES
39 38
TYPEDEF_HIDES_STRUCT   = NO
40 39
SYMBOL_CACHE_SIZE      = 0
41 40
#---------------------------------------------------------------------------
42 41
# Build related configuration options
43 42
#---------------------------------------------------------------------------
44 43
EXTRACT_ALL            = NO
45 44
EXTRACT_PRIVATE        = YES
46 45
EXTRACT_STATIC         = YES
47 46
EXTRACT_LOCAL_CLASSES  = NO
48 47
EXTRACT_LOCAL_METHODS  = NO
49 48
EXTRACT_ANON_NSPACES   = NO
50 49
HIDE_UNDOC_MEMBERS     = YES
51 50
HIDE_UNDOC_CLASSES     = YES
52 51
HIDE_FRIEND_COMPOUNDS  = NO
53 52
HIDE_IN_BODY_DOCS      = NO
54 53
INTERNAL_DOCS          = NO
55 54
CASE_SENSE_NAMES       = YES
56 55
HIDE_SCOPE_NAMES       = YES
57 56
SHOW_INCLUDE_FILES     = YES
58 57
INLINE_INFO            = YES
59 58
SORT_MEMBER_DOCS       = NO
60 59
SORT_BRIEF_DOCS        = NO
61 60
SORT_GROUP_NAMES       = NO
62 61
SORT_BY_SCOPE_NAME     = NO
63 62
GENERATE_TODOLIST      = YES
64 63
GENERATE_TESTLIST      = YES
65 64
GENERATE_BUGLIST       = YES
66 65
GENERATE_DEPRECATEDLIST= YES
67 66
ENABLED_SECTIONS       = 
68 67
MAX_INITIALIZER_LINES  = 5
69 68
SHOW_USED_FILES        = NO
70 69
SHOW_DIRECTORIES       = YES
71 70
SHOW_FILES             = YES
72 71
SHOW_NAMESPACES        = YES
73 72
FILE_VERSION_FILTER    = 
74 73
LAYOUT_FILE            = DoxygenLayout.xml
75 74
#---------------------------------------------------------------------------
76 75
# configuration options related to warning and progress messages
77 76
#---------------------------------------------------------------------------
78 77
QUIET                  = NO
79 78
WARNINGS               = YES
80 79
WARN_IF_UNDOCUMENTED   = YES
81 80
WARN_IF_DOC_ERROR      = YES
82 81
WARN_NO_PARAMDOC       = NO
83 82
WARN_FORMAT            = "$file:$line: $text"
84 83
WARN_LOGFILE           = doxygen.log
85 84
#---------------------------------------------------------------------------
86 85
# configuration options related to the input files
87 86
#---------------------------------------------------------------------------
88 87
INPUT                  = "@abs_top_srcdir@/doc" \
89 88
                         "@abs_top_srcdir@/lemon" \
90 89
                         "@abs_top_srcdir@/lemon/bits" \
91 90
                         "@abs_top_srcdir@/lemon/concepts" \
92 91
                         "@abs_top_srcdir@/demo" \
93 92
                         "@abs_top_srcdir@/tools" \
94
                         "@abs_top_srcdir@/test/test_tools.h"
93
                         "@abs_top_srcdir@/test/test_tools.h" \
94
                         "@abs_top_builddir@/doc/references.dox"
95 95
INPUT_ENCODING         = UTF-8
96 96
FILE_PATTERNS          = *.h \
97 97
                         *.cc \
98 98
                         *.dox
99 99
RECURSIVE              = NO
100 100
EXCLUDE                = 
101 101
EXCLUDE_SYMLINKS       = NO
102 102
EXCLUDE_PATTERNS       = 
103 103
EXCLUDE_SYMBOLS        = 
104 104
EXAMPLE_PATH           = "@abs_top_srcdir@/demo" \
105 105
                         "@abs_top_srcdir@/LICENSE" \
106 106
                         "@abs_top_srcdir@/doc"
107 107
EXAMPLE_PATTERNS       = 
108 108
EXAMPLE_RECURSIVE      = NO
109 109
IMAGE_PATH             = "@abs_top_srcdir@/doc/images" \
110 110
                         "@abs_top_builddir@/doc/gen-images"
111 111
INPUT_FILTER           = 
112 112
FILTER_PATTERNS        = 
113 113
FILTER_SOURCE_FILES    = NO
114 114
#---------------------------------------------------------------------------
115 115
# configuration options related to source browsing
116 116
#---------------------------------------------------------------------------
117 117
SOURCE_BROWSER         = NO
118 118
INLINE_SOURCES         = NO
119 119
STRIP_CODE_COMMENTS    = YES
120 120
REFERENCED_BY_RELATION = NO
121 121
REFERENCES_RELATION    = NO
122 122
REFERENCES_LINK_SOURCE = YES
123 123
USE_HTAGS              = NO
124 124
VERBATIM_HEADERS       = NO
125 125
#---------------------------------------------------------------------------
126 126
# configuration options related to the alphabetical class index
127 127
#---------------------------------------------------------------------------
128 128
ALPHABETICAL_INDEX     = YES
129 129
COLS_IN_ALPHA_INDEX    = 2
130 130
IGNORE_PREFIX          = 
131 131
#---------------------------------------------------------------------------
132 132
# configuration options related to the HTML output
133 133
#---------------------------------------------------------------------------
134 134
GENERATE_HTML          = YES
135 135
HTML_OUTPUT            = html
136 136
HTML_FILE_EXTENSION    = .html
137 137
HTML_HEADER            = 
138 138
HTML_FOOTER            = 
139 139
HTML_STYLESHEET        = 
140 140
HTML_ALIGN_MEMBERS     = YES
141 141
HTML_DYNAMIC_SECTIONS  = NO
142 142
GENERATE_DOCSET        = NO
143 143
DOCSET_FEEDNAME        = "Doxygen generated docs"
144 144
DOCSET_BUNDLE_ID       = org.doxygen.Project
145 145
GENERATE_HTMLHELP      = NO
146 146
CHM_FILE               = 
147 147
HHC_LOCATION           = 
148 148
GENERATE_CHI           = NO
149 149
CHM_INDEX_ENCODING     = 
150 150
BINARY_TOC             = NO
151 151
TOC_EXPAND             = NO
152 152
GENERATE_QHP           = NO
153 153
QCH_FILE               = 
154 154
QHP_NAMESPACE          = org.doxygen.Project
155 155
QHP_VIRTUAL_FOLDER     = doc
156 156
QHG_LOCATION           = 
157 157
DISABLE_INDEX          = NO
158 158
ENUM_VALUES_PER_LINE   = 4
159 159
GENERATE_TREEVIEW      = NO
160 160
TREEVIEW_WIDTH         = 250
161 161
FORMULA_FONTSIZE       = 10
162 162
#---------------------------------------------------------------------------
163 163
# configuration options related to the LaTeX output
164 164
#---------------------------------------------------------------------------
165 165
GENERATE_LATEX         = NO
166 166
LATEX_OUTPUT           = latex
167 167
LATEX_CMD_NAME         = latex
168 168
MAKEINDEX_CMD_NAME     = makeindex
169 169
COMPACT_LATEX          = YES
170 170
PAPER_TYPE             = a4wide
171 171
EXTRA_PACKAGES         = amsmath \
172 172
                         amssymb
173 173
LATEX_HEADER           = 
174 174
PDF_HYPERLINKS         = YES
175 175
USE_PDFLATEX           = YES
176 176
LATEX_BATCHMODE        = NO
177 177
LATEX_HIDE_INDICES     = NO
178 178
#---------------------------------------------------------------------------
179 179
# configuration options related to the RTF output
180 180
#---------------------------------------------------------------------------
181 181
GENERATE_RTF           = NO
182 182
RTF_OUTPUT             = rtf
183 183
COMPACT_RTF            = NO
184 184
RTF_HYPERLINKS         = NO
185 185
RTF_STYLESHEET_FILE    = 
186 186
RTF_EXTENSIONS_FILE    = 
187 187
#---------------------------------------------------------------------------
188 188
# configuration options related to the man page output
189 189
#---------------------------------------------------------------------------
190 190
GENERATE_MAN           = NO
191 191
MAN_OUTPUT             = man
192 192
MAN_EXTENSION          = .3
193 193
MAN_LINKS              = NO
194 194
#---------------------------------------------------------------------------
195 195
# configuration options related to the XML output
196 196
#---------------------------------------------------------------------------
197 197
GENERATE_XML           = NO
198 198
XML_OUTPUT             = xml
199 199
XML_SCHEMA             = 
200 200
XML_DTD                = 
201 201
XML_PROGRAMLISTING     = YES
202 202
#---------------------------------------------------------------------------
203 203
# configuration options for the AutoGen Definitions output
204 204
#---------------------------------------------------------------------------
205 205
GENERATE_AUTOGEN_DEF   = NO
206 206
#---------------------------------------------------------------------------
207 207
# configuration options related to the Perl module output
208 208
#---------------------------------------------------------------------------
209 209
GENERATE_PERLMOD       = NO
210 210
PERLMOD_LATEX          = NO
211 211
PERLMOD_PRETTY         = YES
212 212
PERLMOD_MAKEVAR_PREFIX = 
213 213
#---------------------------------------------------------------------------
214 214
# Configuration options related to the preprocessor   
215 215
#---------------------------------------------------------------------------
216 216
ENABLE_PREPROCESSING   = YES
217 217
MACRO_EXPANSION        = NO
218 218
EXPAND_ONLY_PREDEF     = NO
219 219
SEARCH_INCLUDES        = YES
220 220
INCLUDE_PATH           = 
221 221
INCLUDE_FILE_PATTERNS  = 
222 222
PREDEFINED             = DOXYGEN
223 223
EXPAND_AS_DEFINED      = 
224 224
SKIP_FUNCTION_MACROS   = YES
225 225
#---------------------------------------------------------------------------
226
# Configuration::additions related to external references   
226
# Options related to the search engine   
227 227
#---------------------------------------------------------------------------
228 228
TAGFILES               = "@abs_top_srcdir@/doc/libstdc++.tag = http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/  "
229 229
GENERATE_TAGFILE       = html/lemon.tag
230 230
ALLEXTERNALS           = NO
231 231
EXTERNAL_GROUPS        = NO
232 232
PERL_PATH              = /usr/bin/perl
233 233
#---------------------------------------------------------------------------
234 234
# Configuration options related to the dot tool   
235 235
#---------------------------------------------------------------------------
236 236
CLASS_DIAGRAMS         = YES
237 237
MSCGEN_PATH            = 
238 238
HIDE_UNDOC_RELATIONS   = YES
239 239
HAVE_DOT               = YES
240 240
DOT_FONTNAME           = FreeSans
241 241
DOT_FONTSIZE           = 10
242 242
DOT_FONTPATH           = 
243 243
CLASS_GRAPH            = YES
244 244
COLLABORATION_GRAPH    = NO
245 245
GROUP_GRAPHS           = NO
246 246
UML_LOOK               = NO
247 247
TEMPLATE_RELATIONS     = NO
248 248
INCLUDE_GRAPH          = NO
249 249
INCLUDED_BY_GRAPH      = NO
250 250
CALL_GRAPH             = NO
251 251
CALLER_GRAPH           = NO
252 252
GRAPHICAL_HIERARCHY    = NO
253 253
DIRECTORY_GRAPH        = NO
254 254
DOT_IMAGE_FORMAT       = png
255 255
DOT_PATH               = 
256 256
DOTFILE_DIRS           = 
257 257
DOT_GRAPH_MAX_NODES    = 50
258 258
MAX_DOT_GRAPH_DEPTH    = 0
259 259
DOT_TRANSPARENT        = NO
260 260
DOT_MULTI_TARGETS      = NO
261 261
GENERATE_LEGEND        = YES
262 262
DOT_CLEANUP            = YES
263 263
#---------------------------------------------------------------------------
264 264
# Configuration::additions related to the search engine   
265 265
#---------------------------------------------------------------------------
266 266
SEARCHENGINE           = NO
Ignore white space 6 line context
1 1
EXTRA_DIST += \
2 2
	doc/Doxyfile.in \
3 3
	doc/DoxygenLayout.xml \
4 4
	doc/coding_style.dox \
5 5
	doc/dirs.dox \
6 6
	doc/groups.dox \
7 7
	doc/lgf.dox \
8 8
	doc/license.dox \
9 9
	doc/mainpage.dox \
10 10
	doc/migration.dox \
11 11
	doc/min_cost_flow.dox \
12 12
	doc/named-param.dox \
13 13
	doc/namespaces.dox \
14 14
	doc/html \
15 15
	doc/CMakeLists.txt
16 16

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

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

	
33 33
DOC_EPS_IMAGES = \
34 34
	$(DOC_EPS_IMAGES18) \
35 35
	$(DOC_EPS_IMAGES27)
36 36

	
37 37
DOC_PNG_IMAGES = \
38 38
	$(DOC_EPS_IMAGES:%.eps=doc/gen-images/%.png)
39 39

	
40 40
EXTRA_DIST += $(DOC_EPS_IMAGES:%=doc/images/%)
41 41

	
42 42
doc/html:
43 43
	$(MAKE) $(AM_MAKEFLAGS) html
44 44

	
45 45
GS_COMMAND=gs -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4
46 46

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

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

	
69
html-local: $(DOC_PNG_IMAGES)
69
references.dox: doc/references.bib
70
	if test ${python_found} = yes; then \
71
	  cd doc; \
72
	  python @abs_top_srcdir@/scripts/bib2dox.py @abs_top_builddir@/$< >$@; \
73
	  cd ..; \
74
	else \
75
	  echo; \
76
	  echo "Python not found."; \
77
	  echo; \
78
	  exit 1; \
79
	fi
80

	
81
html-local: $(DOC_PNG_IMAGES) references.dox
70 82
	if test ${doxygen_found} = yes; then \
71 83
	  cd doc; \
72 84
	  doxygen Doxyfile; \
73 85
	  cd ..; \
74 86
	else \
75 87
	  echo; \
76 88
	  echo "Doxygen not found."; \
77 89
	  echo; \
78 90
	  exit 1; \
79 91
	fi
80 92

	
81 93
clean-local:
82 94
	-rm -rf doc/html
83 95
	-rm -f doc/doxygen.log
84 96
	-rm -f $(DOC_PNG_IMAGES)
85 97
	-rm -rf doc/gen-images
86 98

	
87 99
update-external-tags:
88 100
	wget -O doc/libstdc++.tag.tmp http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/libstdc++.tag && \
89 101
	mv doc/libstdc++.tag.tmp doc/libstdc++.tag || \
90 102
	rm doc/libstdc++.tag.tmp
91 103

	
92 104
install-html-local: doc/html
93 105
	@$(NORMAL_INSTALL)
94 106
	$(mkinstalldirs) $(DESTDIR)$(htmldir)/html
95 107
	for p in doc/html/*.{html,css,png,map,gif,tag} ; do \
96 108
	  f="`echo $$p | sed -e 's|^.*/||'`"; \
97 109
	  echo " $(INSTALL_DATA) $$p $(DESTDIR)$(htmldir)/html/$$f"; \
98 110
	  $(INSTALL_DATA) $$p $(DESTDIR)$(htmldir)/html/$$f; \
99 111
	done
100 112

	
101 113
uninstall-local:
102 114
	@$(NORMAL_UNINSTALL)
103 115
	for p in doc/html/*.{html,css,png,map,gif,tag} ; do \
104 116
	  f="`echo $$p | sed -e 's|^.*/||'`"; \
105 117
	  echo " rm -f $(DESTDIR)$(htmldir)/html/$$f"; \
106 118
	  rm -f $(DESTDIR)$(htmldir)/html/$$f; \
107 119
	done
108 120

	
109 121
.PHONY: update-external-tags
Ignore white space 6 line context
... ...
@@ -155,539 +155,611 @@
155 155
@ingroup maps
156 156
\brief Special graph-related maps.
157 157

	
158 158
This group contains maps that are specifically designed to assign
159 159
values to the nodes and arcs/edges of graphs.
160 160

	
161 161
If you are looking for the standard graph maps (\c NodeMap, \c ArcMap,
162 162
\c EdgeMap), see the \ref graph_concepts "Graph Structure Concepts".
163 163
*/
164 164

	
165 165
/**
166 166
\defgroup map_adaptors Map Adaptors
167 167
\ingroup maps
168 168
\brief Tools to create new maps from existing ones
169 169

	
170 170
This group contains map adaptors that are used to create "implicit"
171 171
maps from other maps.
172 172

	
173 173
Most of them are \ref concepts::ReadMap "read-only maps".
174 174
They can make arithmetic and logical operations between one or two maps
175 175
(negation, shifting, addition, multiplication, logical 'and', 'or',
176 176
'not' etc.) or e.g. convert a map to another one of different Value type.
177 177

	
178 178
The typical usage of this classes is passing implicit maps to
179 179
algorithms.  If a function type algorithm is called then the function
180 180
type map adaptors can be used comfortable. For example let's see the
181 181
usage of map adaptors with the \c graphToEps() function.
182 182
\code
183 183
  Color nodeColor(int deg) {
184 184
    if (deg >= 2) {
185 185
      return Color(0.5, 0.0, 0.5);
186 186
    } else if (deg == 1) {
187 187
      return Color(1.0, 0.5, 1.0);
188 188
    } else {
189 189
      return Color(0.0, 0.0, 0.0);
190 190
    }
191 191
  }
192 192

	
193 193
  Digraph::NodeMap<int> degree_map(graph);
194 194

	
195 195
  graphToEps(graph, "graph.eps")
196 196
    .coords(coords).scaleToA4().undirected()
197 197
    .nodeColors(composeMap(functorToMap(nodeColor), degree_map))
198 198
    .run();
199 199
\endcode
200 200
The \c functorToMap() function makes an \c int to \c Color map from the
201 201
\c nodeColor() function. The \c composeMap() compose the \c degree_map
202 202
and the previously created map. The composed map is a proper function to
203 203
get the color of each node.
204 204

	
205 205
The usage with class type algorithms is little bit harder. In this
206 206
case the function type map adaptors can not be used, because the
207 207
function map adaptors give back temporary objects.
208 208
\code
209 209
  Digraph graph;
210 210

	
211 211
  typedef Digraph::ArcMap<double> DoubleArcMap;
212 212
  DoubleArcMap length(graph);
213 213
  DoubleArcMap speed(graph);
214 214

	
215 215
  typedef DivMap<DoubleArcMap, DoubleArcMap> TimeMap;
216 216
  TimeMap time(length, speed);
217 217

	
218 218
  Dijkstra<Digraph, TimeMap> dijkstra(graph, time);
219 219
  dijkstra.run(source, target);
220 220
\endcode
221 221
We have a length map and a maximum speed map on the arcs of a digraph.
222 222
The minimum time to pass the arc can be calculated as the division of
223 223
the two maps which can be done implicitly with the \c DivMap template
224 224
class. We use the implicit minimum time map as the length map of the
225 225
\c Dijkstra algorithm.
226 226
*/
227 227

	
228 228
/**
229 229
@defgroup paths Path Structures
230 230
@ingroup datas
231 231
\brief %Path structures implemented in LEMON.
232 232

	
233 233
This group contains the path structures implemented in LEMON.
234 234

	
235 235
LEMON provides flexible data structures to work with paths.
236 236
All of them have similar interfaces and they can be copied easily with
237 237
assignment operators and copy constructors. This makes it easy and
238 238
efficient to have e.g. the Dijkstra algorithm to store its result in
239 239
any kind of path structure.
240 240

	
241 241
\sa \ref concepts::Path "Path concept"
242 242
*/
243 243

	
244 244
/**
245 245
@defgroup heaps Heap Structures
246 246
@ingroup datas
247 247
\brief %Heap structures implemented in LEMON.
248 248

	
249 249
This group contains the heap structures implemented in LEMON.
250 250

	
251 251
LEMON provides several heap classes. They are efficient implementations
252 252
of the abstract data type \e priority \e queue. They store items with
253 253
specified values called \e priorities in such a way that finding and
254 254
removing the item with minimum priority are efficient.
255 255
The basic operations are adding and erasing items, changing the priority
256 256
of an item, etc.
257 257

	
258 258
Heaps are crucial in several algorithms, such as Dijkstra and Prim.
259 259
The heap implementations have the same interface, thus any of them can be
260 260
used easily in such algorithms.
261 261

	
262 262
\sa \ref concepts::Heap "Heap concept"
263 263
*/
264 264

	
265 265
/**
266 266
@defgroup matrices Matrices
267 267
@ingroup datas
268 268
\brief Two dimensional data storages implemented in LEMON.
269 269

	
270 270
This group contains two dimensional data storages implemented in LEMON.
271 271
*/
272 272

	
273 273
/**
274 274
@defgroup auxdat Auxiliary Data Structures
275 275
@ingroup datas
276 276
\brief Auxiliary data structures implemented in LEMON.
277 277

	
278 278
This group contains some data structures implemented in LEMON in
279 279
order to make it easier to implement combinatorial algorithms.
280 280
*/
281 281

	
282 282
/**
283
@defgroup geomdat Geometric Data Structures
284
@ingroup auxdat
285
\brief Geometric data structures implemented in LEMON.
286

	
287
This group contains geometric data structures implemented in LEMON.
288

	
289
 - \ref lemon::dim2::Point "dim2::Point" implements a two dimensional
290
   vector with the usual operations.
291
 - \ref lemon::dim2::Box "dim2::Box" can be used to determine the
292
   rectangular bounding box of a set of \ref lemon::dim2::Point
293
   "dim2::Point"'s.
294
*/
295

	
296
/**
297
@defgroup matrices Matrices
298
@ingroup auxdat
299
\brief Two dimensional data storages implemented in LEMON.
300

	
301
This group contains two dimensional data storages implemented in LEMON.
302
*/
303

	
304
/**
283 305
@defgroup algs Algorithms
284 306
\brief This group contains the several algorithms
285 307
implemented in LEMON.
286 308

	
287 309
This group contains the several algorithms
288 310
implemented in LEMON.
289 311
*/
290 312

	
291 313
/**
292 314
@defgroup search Graph Search
293 315
@ingroup algs
294 316
\brief Common graph search algorithms.
295 317

	
296 318
This group contains the common graph search algorithms, namely
297
\e breadth-first \e search (BFS) and \e depth-first \e search (DFS).
319
\e breadth-first \e search (BFS) and \e depth-first \e search (DFS)
320
\ref clrs01algorithms.
298 321
*/
299 322

	
300 323
/**
301 324
@defgroup shortest_path Shortest Path Algorithms
302 325
@ingroup algs
303 326
\brief Algorithms for finding shortest paths.
304 327

	
305
This group contains the algorithms for finding shortest paths in digraphs.
328
This group contains the algorithms for finding shortest paths in digraphs
329
\ref clrs01algorithms.
306 330

	
307 331
 - \ref Dijkstra algorithm for finding shortest paths from a source node
308 332
   when all arc lengths are non-negative.
309 333
 - \ref BellmanFord "Bellman-Ford" algorithm for finding shortest paths
310 334
   from a source node when arc lenghts can be either positive or negative,
311 335
   but the digraph should not contain directed cycles with negative total
312 336
   length.
313 337
 - \ref FloydWarshall "Floyd-Warshall" and \ref Johnson "Johnson" algorithms
314 338
   for solving the \e all-pairs \e shortest \e paths \e problem when arc
315 339
   lenghts can be either positive or negative, but the digraph should
316 340
   not contain directed cycles with negative total length.
317 341
 - \ref Suurballe A successive shortest path algorithm for finding
318 342
   arc-disjoint paths between two nodes having minimum total length.
319 343
*/
320 344

	
321 345
/**
346
@defgroup spantree Minimum Spanning Tree Algorithms
347
@ingroup algs
348
\brief Algorithms for finding minimum cost spanning trees and arborescences.
349

	
350
This group contains the algorithms for finding minimum cost spanning
351
trees and arborescences \ref clrs01algorithms.
352
*/
353

	
354
/**
322 355
@defgroup max_flow Maximum Flow Algorithms
323 356
@ingroup algs
324 357
\brief Algorithms for finding maximum flows.
325 358

	
326 359
This group contains the algorithms for finding maximum flows and
327
feasible circulations.
360
feasible circulations \ref clrs01algorithms, \ref amo93networkflows.
328 361

	
329 362
The \e maximum \e flow \e problem is to find a flow of maximum value between
330 363
a single source and a single target. Formally, there is a \f$G=(V,A)\f$
331 364
digraph, a \f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function and
332 365
\f$s, t \in V\f$ source and target nodes.
333 366
A maximum flow is an \f$f: A\rightarrow\mathbf{R}^+_0\f$ solution of the
334 367
following optimization problem.
335 368

	
336 369
\f[ \max\sum_{sv\in A} f(sv) - \sum_{vs\in A} f(vs) \f]
337 370
\f[ \sum_{uv\in A} f(uv) = \sum_{vu\in A} f(vu)
338 371
    \quad \forall u\in V\setminus\{s,t\} \f]
339 372
\f[ 0 \leq f(uv) \leq cap(uv) \quad \forall uv\in A \f]
340 373

	
341 374
LEMON contains several algorithms for solving maximum flow problems:
342
- \ref EdmondsKarp Edmonds-Karp algorithm.
343
- \ref Preflow Goldberg-Tarjan's preflow push-relabel algorithm.
344
- \ref DinitzSleatorTarjan Dinitz's blocking flow algorithm with dynamic trees.
345
- \ref GoldbergTarjan Preflow push-relabel algorithm with dynamic trees.
375
- \ref EdmondsKarp Edmonds-Karp algorithm
376
  \ref edmondskarp72theoretical.
377
- \ref Preflow Goldberg-Tarjan's preflow push-relabel algorithm
378
  \ref goldberg88newapproach.
379
- \ref DinitzSleatorTarjan Dinitz's blocking flow algorithm with dynamic trees
380
  \ref dinic70algorithm, \ref sleator83dynamic.
381
- \ref GoldbergTarjan !Preflow push-relabel algorithm with dynamic trees
382
  \ref goldberg88newapproach, \ref sleator83dynamic.
346 383

	
347
In most cases the \ref Preflow "Preflow" algorithm provides the
384
In most cases the \ref Preflow algorithm provides the
348 385
fastest method for computing a maximum flow. All implementations
349 386
also provide functions to query the minimum cut, which is the dual
350 387
problem of maximum flow.
351 388

	
352 389
\ref Circulation is a preflow push-relabel algorithm implemented directly 
353 390
for finding feasible circulations, which is a somewhat different problem,
354 391
but it is strongly related to maximum flow.
355 392
For more information, see \ref Circulation.
356 393
*/
357 394

	
358 395
/**
359 396
@defgroup min_cost_flow_algs Minimum Cost Flow Algorithms
360 397
@ingroup algs
361 398

	
362 399
\brief Algorithms for finding minimum cost flows and circulations.
363 400

	
364 401
This group contains the algorithms for finding minimum cost flows and
365
circulations. For more information about this problem and its dual
366
solution see \ref min_cost_flow "Minimum Cost Flow Problem".
402
circulations \ref amo93networkflows. For more information about this
403
problem and its dual solution, see \ref min_cost_flow
404
"Minimum Cost Flow Problem".
367 405

	
368 406
LEMON contains several algorithms for this problem.
369 407
 - \ref NetworkSimplex Primal Network Simplex algorithm with various
370
   pivot strategies.
408
   pivot strategies \ref dantzig63linearprog, \ref kellyoneill91netsimplex.
371 409
 - \ref CostScaling Push-Relabel and Augment-Relabel algorithms based on
372
   cost scaling.
410
   cost scaling \ref goldberg90approximation, \ref goldberg97efficient,
411
   \ref bunnagel98efficient.
373 412
 - \ref CapacityScaling Successive Shortest %Path algorithm with optional
374
   capacity scaling.
375
 - \ref CancelAndTighten The Cancel and Tighten algorithm.
376
 - \ref CycleCanceling Cycle-Canceling algorithms.
413
   capacity scaling \ref edmondskarp72theoretical.
414
 - \ref CancelAndTighten The Cancel and Tighten algorithm
415
   \ref goldberg89cyclecanceling.
416
 - \ref CycleCanceling Cycle-Canceling algorithms
417
   \ref klein67primal, \ref goldberg89cyclecanceling.
377 418

	
378 419
In general NetworkSimplex is the most efficient implementation,
379 420
but in special cases other algorithms could be faster.
380 421
For example, if the total supply and/or capacities are rather small,
381 422
CapacityScaling is usually the fastest algorithm (without effective scaling).
382 423
*/
383 424

	
384 425
/**
385 426
@defgroup min_cut Minimum Cut Algorithms
386 427
@ingroup algs
387 428

	
388 429
\brief Algorithms for finding minimum cut in graphs.
389 430

	
390 431
This group contains the algorithms for finding minimum cut in graphs.
391 432

	
392 433
The \e minimum \e cut \e problem is to find a non-empty and non-complete
393 434
\f$X\f$ subset of the nodes with minimum overall capacity on
394 435
outgoing arcs. Formally, there is a \f$G=(V,A)\f$ digraph, a
395 436
\f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function. The minimum
396 437
cut is the \f$X\f$ solution of the next optimization problem:
397 438

	
398 439
\f[ \min_{X \subset V, X\not\in \{\emptyset, V\}}
399
    \sum_{uv\in A, u\in X, v\not\in X}cap(uv) \f]
440
    \sum_{uv\in A: u\in X, v\not\in X}cap(uv) \f]
400 441

	
401 442
LEMON contains several algorithms related to minimum cut problems:
402 443

	
403 444
- \ref HaoOrlin "Hao-Orlin algorithm" for calculating minimum cut
404 445
  in directed graphs.
405 446
- \ref NagamochiIbaraki "Nagamochi-Ibaraki algorithm" for
406 447
  calculating minimum cut in undirected graphs.
407 448
- \ref GomoryHu "Gomory-Hu tree computation" for calculating
408 449
  all-pairs minimum cut in undirected graphs.
409 450

	
410 451
If you want to find minimum cut just between two distinict nodes,
411 452
see the \ref max_flow "maximum flow problem".
412 453
*/
413 454

	
414 455
/**
415
@defgroup graph_properties Connectivity and Other Graph Properties
456
@defgroup min_mean_cycle Minimum Mean Cycle Algorithms
416 457
@ingroup algs
417
\brief Algorithms for discovering the graph properties
458
\brief Algorithms for finding minimum mean cycles.
418 459

	
419
This group contains the algorithms for discovering the graph properties
420
like connectivity, bipartiteness, euler property, simplicity etc.
460
This group contains the algorithms for finding minimum mean cycles
461
\ref clrs01algorithms, \ref amo93networkflows.
421 462

	
422
\image html edge_biconnected_components.png
423
\image latex edge_biconnected_components.eps "bi-edge-connected components" width=\textwidth
424
*/
463
The \e minimum \e mean \e cycle \e problem is to find a directed cycle
464
of minimum mean length (cost) in a digraph.
465
The mean length of a cycle is the average length of its arcs, i.e. the
466
ratio between the total length of the cycle and the number of arcs on it.
425 467

	
426
/**
427
@defgroup planar Planarity Embedding and Drawing
428
@ingroup algs
429
\brief Algorithms for planarity checking, embedding and drawing
468
This problem has an important connection to \e conservative \e length
469
\e functions, too. A length function on the arcs of a digraph is called
470
conservative if and only if there is no directed cycle of negative total
471
length. For an arbitrary length function, the negative of the minimum
472
cycle mean is the smallest \f$\epsilon\f$ value so that increasing the
473
arc lengths uniformly by \f$\epsilon\f$ results in a conservative length
474
function.
430 475

	
431
This group contains the algorithms for planarity checking,
432
embedding and drawing.
476
LEMON contains three algorithms for solving the minimum mean cycle problem:
477
- \ref Karp "Karp"'s original algorithm \ref amo93networkflows,
478
  \ref dasdan98minmeancycle.
479
- \ref HartmannOrlin "Hartmann-Orlin"'s algorithm, which is an improved
480
  version of Karp's algorithm \ref dasdan98minmeancycle.
481
- \ref Howard "Howard"'s policy iteration algorithm
482
  \ref dasdan98minmeancycle.
433 483

	
434
\image html planar.png
435
\image latex planar.eps "Plane graph" width=\textwidth
484
In practice, the Howard algorithm proved to be by far the most efficient
485
one, though the best known theoretical bound on its running time is
486
exponential.
487
Both Karp and HartmannOrlin algorithms run in time O(ne) and use space
488
O(n<sup>2</sup>+e), but the latter one is typically faster due to the
489
applied early termination scheme.
436 490
*/
437 491

	
438 492
/**
439 493
@defgroup matching Matching Algorithms
440 494
@ingroup algs
441 495
\brief Algorithms for finding matchings in graphs and bipartite graphs.
442 496

	
443 497
This group contains the algorithms for calculating
444 498
matchings in graphs and bipartite graphs. The general matching problem is
445 499
finding a subset of the edges for which each node has at most one incident
446 500
edge.
447 501

	
448 502
There are several different algorithms for calculate matchings in
449 503
graphs.  The matching problems in bipartite graphs are generally
450 504
easier than in general graphs. The goal of the matching optimization
451 505
can be finding maximum cardinality, maximum weight or minimum cost
452 506
matching. The search can be constrained to find perfect or
453 507
maximum cardinality matching.
454 508

	
455 509
The matching algorithms implemented in LEMON:
456 510
- \ref MaxBipartiteMatching Hopcroft-Karp augmenting path algorithm
457 511
  for calculating maximum cardinality matching in bipartite graphs.
458 512
- \ref PrBipartiteMatching Push-relabel algorithm
459 513
  for calculating maximum cardinality matching in bipartite graphs.
460 514
- \ref MaxWeightedBipartiteMatching
461 515
  Successive shortest path algorithm for calculating maximum weighted
462 516
  matching and maximum weighted bipartite matching in bipartite graphs.
463 517
- \ref MinCostMaxBipartiteMatching
464 518
  Successive shortest path algorithm for calculating minimum cost maximum
465 519
  matching in bipartite graphs.
466 520
- \ref MaxMatching Edmond's blossom shrinking algorithm for calculating
467 521
  maximum cardinality matching in general graphs.
468 522
- \ref MaxWeightedMatching Edmond's blossom shrinking algorithm for calculating
469 523
  maximum weighted matching in general graphs.
470 524
- \ref MaxWeightedPerfectMatching
471 525
  Edmond's blossom shrinking algorithm for calculating maximum weighted
472 526
  perfect matching in general graphs.
473 527

	
474 528
\image html bipartite_matching.png
475 529
\image latex bipartite_matching.eps "Bipartite Matching" width=\textwidth
476 530
*/
477 531

	
478 532
/**
479
@defgroup spantree Minimum Spanning Tree Algorithms
533
@defgroup graph_properties Connectivity and Other Graph Properties
480 534
@ingroup algs
481
\brief Algorithms for finding minimum cost spanning trees and arborescences.
535
\brief Algorithms for discovering the graph properties
482 536

	
483
This group contains the algorithms for finding minimum cost spanning
484
trees and arborescences.
537
This group contains the algorithms for discovering the graph properties
538
like connectivity, bipartiteness, euler property, simplicity etc.
539

	
540
\image html connected_components.png
541
\image latex connected_components.eps "Connected components" width=\textwidth
542
*/
543

	
544
/**
545
@defgroup planar Planarity Embedding and Drawing
546
@ingroup algs
547
\brief Algorithms for planarity checking, embedding and drawing
548

	
549
This group contains the algorithms for planarity checking,
550
embedding and drawing.
551

	
552
\image html planar.png
553
\image latex planar.eps "Plane graph" width=\textwidth
554
*/
555

	
556
/**
557
@defgroup approx Approximation Algorithms
558
@ingroup algs
559
\brief Approximation algorithms.
560

	
561
This group contains the approximation and heuristic algorithms
562
implemented in LEMON.
485 563
*/
486 564

	
487 565
/**
488 566
@defgroup auxalg Auxiliary Algorithms
489 567
@ingroup algs
490 568
\brief Auxiliary algorithms implemented in LEMON.
491 569

	
492 570
This group contains some algorithms implemented in LEMON
493 571
in order to make it easier to implement complex algorithms.
494 572
*/
495 573

	
496 574
/**
497
@defgroup approx Approximation Algorithms
498
@ingroup algs
499
\brief Approximation algorithms.
500

	
501
This group contains the approximation and heuristic algorithms
502
implemented in LEMON.
503
*/
504

	
505
/**
506 575
@defgroup gen_opt_group General Optimization Tools
507 576
\brief This group contains some general optimization frameworks
508 577
implemented in LEMON.
509 578

	
510 579
This group contains some general optimization frameworks
511 580
implemented in LEMON.
512 581
*/
513 582

	
514 583
/**
515
@defgroup lp_group Lp and Mip Solvers
584
@defgroup lp_group LP and MIP Solvers
516 585
@ingroup gen_opt_group
517
\brief Lp and Mip solver interfaces for LEMON.
586
\brief LP and MIP solver interfaces for LEMON.
518 587

	
519
This group contains Lp and Mip solver interfaces for LEMON. The
520
various LP solvers could be used in the same manner with this
521
interface.
588
This group contains LP and MIP solver interfaces for LEMON.
589
Various LP solvers could be used in the same manner with this
590
high-level interface.
591

	
592
The currently supported solvers are \ref glpk, \ref clp, \ref cbc,
593
\ref cplex, \ref soplex.
522 594
*/
523 595

	
524 596
/**
525 597
@defgroup lp_utils Tools for Lp and Mip Solvers
526 598
@ingroup lp_group
527 599
\brief Helper tools to the Lp and Mip solvers.
528 600

	
529 601
This group adds some helper tools to general optimization framework
530 602
implemented in LEMON.
531 603
*/
532 604

	
533 605
/**
534 606
@defgroup metah Metaheuristics
535 607
@ingroup gen_opt_group
536 608
\brief Metaheuristics for LEMON library.
537 609

	
538 610
This group contains some metaheuristic optimization tools.
539 611
*/
540 612

	
541 613
/**
542 614
@defgroup utils Tools and Utilities
543 615
\brief Tools and utilities for programming in LEMON
544 616

	
545 617
Tools and utilities for programming in LEMON.
546 618
*/
547 619

	
548 620
/**
549 621
@defgroup gutils Basic Graph Utilities
550 622
@ingroup utils
551 623
\brief Simple basic graph utilities.
552 624

	
553 625
This group contains some simple basic graph utilities.
554 626
*/
555 627

	
556 628
/**
557 629
@defgroup misc Miscellaneous Tools
558 630
@ingroup utils
559 631
\brief Tools for development, debugging and testing.
560 632

	
561 633
This group contains several useful tools for development,
562 634
debugging and testing.
563 635
*/
564 636

	
565 637
/**
566 638
@defgroup timecount Time Measuring and Counting
567 639
@ingroup misc
568 640
\brief Simple tools for measuring the performance of algorithms.
569 641

	
570 642
This group contains simple tools for measuring the performance
571 643
of algorithms.
572 644
*/
573 645

	
574 646
/**
575 647
@defgroup exceptions Exceptions
576 648
@ingroup utils
577 649
\brief Exceptions defined in LEMON.
578 650

	
579 651
This group contains the exceptions defined in LEMON.
580 652
*/
581 653

	
582 654
/**
583 655
@defgroup io_group Input-Output
584 656
\brief Graph Input-Output methods
585 657

	
586 658
This group contains the tools for importing and exporting graphs
587 659
and graph related data. Now it supports the \ref lgf-format
588 660
"LEMON Graph Format", the \c DIMACS format and the encapsulated
589 661
postscript (EPS) format.
590 662
*/
591 663

	
592 664
/**
593 665
@defgroup lemon_io LEMON Graph Format
594 666
@ingroup io_group
595 667
\brief Reading and writing LEMON Graph Format.
596 668

	
597 669
This group contains methods for reading and writing
598 670
\ref lgf-format "LEMON Graph Format".
599 671
*/
600 672

	
601 673
/**
602 674
@defgroup eps_io Postscript Exporting
603 675
@ingroup io_group
604 676
\brief General \c EPS drawer and graph exporter
605 677

	
606 678
This group contains general \c EPS drawing methods and special
607 679
graph exporting tools.
608 680
*/
609 681

	
610 682
/**
611
@defgroup dimacs_group DIMACS format
683
@defgroup dimacs_group DIMACS Format
612 684
@ingroup io_group
613 685
\brief Read and write files in DIMACS format
614 686

	
615 687
Tools to read a digraph from or write it to a file in DIMACS format data.
616 688
*/
617 689

	
618 690
/**
619 691
@defgroup nauty_group NAUTY Format
620 692
@ingroup io_group
621 693
\brief Read \e Nauty format
622 694

	
623 695
Tool to read graphs from \e Nauty format data.
624 696
*/
625 697

	
626 698
/**
627 699
@defgroup concept Concepts
628 700
\brief Skeleton classes and concept checking classes
629 701

	
630 702
This group contains the data/algorithm skeletons and concept checking
631 703
classes implemented in LEMON.
632 704

	
633 705
The purpose of the classes in this group is fourfold.
634 706

	
635 707
- These classes contain the documentations of the %concepts. In order
636 708
  to avoid document multiplications, an implementation of a concept
637 709
  simply refers to the corresponding concept class.
638 710

	
639 711
- These classes declare every functions, <tt>typedef</tt>s etc. an
640 712
  implementation of the %concepts should provide, however completely
641 713
  without implementations and real data structures behind the
642 714
  interface. On the other hand they should provide nothing else. All
643 715
  the algorithms working on a data structure meeting a certain concept
644 716
  should compile with these classes. (Though it will not run properly,
645 717
  of course.) In this way it is easily to check if an algorithm
646 718
  doesn't use any extra feature of a certain implementation.
647 719

	
648 720
- The concept descriptor classes also provide a <em>checker class</em>
649 721
  that makes it possible to check whether a certain implementation of a
650 722
  concept indeed provides all the required features.
651 723

	
652 724
- Finally, They can serve as a skeleton of a new implementation of a concept.
653 725
*/
654 726

	
655 727
/**
656 728
@defgroup graph_concepts Graph Structure Concepts
657 729
@ingroup concept
658 730
\brief Skeleton and concept checking classes for graph structures
659 731

	
660
This group contains the skeletons and concept checking classes of LEMON's
661
graph structures and helper classes used to implement these.
732
This group contains the skeletons and concept checking classes of
733
graph structures.
662 734
*/
663 735

	
664 736
/**
665 737
@defgroup map_concepts Map Concepts
666 738
@ingroup concept
667 739
\brief Skeleton and concept checking classes for maps
668 740

	
669 741
This group contains the skeletons and concept checking classes of maps.
670 742
*/
671 743

	
672 744
/**
745
@defgroup tools Standalone Utility Applications
746

	
747
Some utility applications are listed here.
748

	
749
The standard compilation procedure (<tt>./configure;make</tt>) will compile
750
them, as well.
751
*/
752

	
753
/**
673 754
\anchor demoprograms
674 755

	
675 756
@defgroup demos Demo Programs
676 757

	
677 758
Some demo programs are listed here. Their full source codes can be found in
678 759
the \c demo subdirectory of the source tree.
679 760

	
680 761
In order to compile them, use the <tt>make demo</tt> or the
681 762
<tt>make check</tt> commands.
682 763
*/
683 764

	
684
/**
685
@defgroup tools Standalone Utility Applications
686

	
687
Some utility applications are listed here.
688

	
689
The standard compilation procedure (<tt>./configure;make</tt>) will compile
690
them, as well.
691
*/
692

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

	
19 19
/**
20 20
\mainpage LEMON Documentation
21 21

	
22 22
\section intro Introduction
23 23

	
24
\subsection whatis What is LEMON
25

	
26
LEMON stands for <b>L</b>ibrary for <b>E</b>fficient <b>M</b>odeling
27
and <b>O</b>ptimization in <b>N</b>etworks.
28
It is a C++ template
29
library aimed at combinatorial optimization tasks which
30
often involve in working
31
with graphs.
24
<b>LEMON</b> stands for <i><b>L</b>ibrary for <b>E</b>fficient <b>M</b>odeling
25
and <b>O</b>ptimization in <b>N</b>etworks</i>.
26
It is a C++ template library providing efficient implementation of common
27
data structures and algorithms with focus on combinatorial optimization
28
problems in graphs and networks.
32 29

	
33 30
<b>
34 31
LEMON is an <a class="el" href="http://opensource.org/">open&nbsp;source</a>
35 32
project.
36 33
You are free to use it in your commercial or
37 34
non-commercial applications under very permissive
38 35
\ref license "license terms".
39 36
</b>
40 37

	
41
\subsection howtoread How to read the documentation
38
The project is maintained by the 
39
<a href="http://www.cs.elte.hu/egres/">Egerv&aacute;ry Research Group on
40
Combinatorial Optimization</a> \ref egres
41
at the Operations Research Department of the
42
<a href="http://www.elte.hu/">E&ouml;tv&ouml;s Lor&aacute;nd University,
43
Budapest</a>, Hungary.
44
LEMON is also a member of the <a href="http://www.coin-or.org/">COIN-OR</a>
45
initiative \ref coinor.
46

	
47
\section howtoread How to Read the Documentation
42 48

	
43 49
If you would like to get to know the library, see
44 50
<a class="el" href="http://lemon.cs.elte.hu/pub/tutorial/">LEMON Tutorial</a>.
45 51

	
46 52
If you know what you are looking for, then try to find it under the
47 53
<a class="el" href="modules.html">Modules</a> section.
48 54

	
49 55
If you are a user of the old (0.x) series of LEMON, please check out the
50 56
\ref migration "Migration Guide" for the backward incompatibilities.
51 57
*/
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
namespace lemon {
20 20

	
21 21
/**
22 22
\page min_cost_flow Minimum Cost Flow Problem
23 23

	
24 24
\section mcf_def Definition (GEQ form)
25 25

	
26 26
The \e minimum \e cost \e flow \e problem is to find a feasible flow of
27 27
minimum total cost from a set of supply nodes to a set of demand nodes
28 28
in a network with capacity constraints (lower and upper bounds)
29
and arc costs.
29
and arc costs \ref amo93networkflows.
30 30

	
31 31
Formally, let \f$G=(V,A)\f$ be a digraph, \f$lower: A\rightarrow\mathbf{R}\f$,
32 32
\f$upper: A\rightarrow\mathbf{R}\cup\{+\infty\}\f$ denote the lower and
33 33
upper bounds for the flow values on the arcs, for which
34 34
\f$lower(uv) \leq upper(uv)\f$ must hold for all \f$uv\in A\f$,
35 35
\f$cost: A\rightarrow\mathbf{R}\f$ denotes the cost per unit flow
36 36
on the arcs and \f$sup: V\rightarrow\mathbf{R}\f$ denotes the
37 37
signed supply values of the nodes.
38 38
If \f$sup(u)>0\f$, then \f$u\f$ is a supply node with \f$sup(u)\f$
39 39
supply, if \f$sup(u)<0\f$, then \f$u\f$ is a demand node with
40 40
\f$-sup(u)\f$ demand.
41 41
A minimum cost flow is an \f$f: A\rightarrow\mathbf{R}\f$ solution
42 42
of the following optimization problem.
43 43

	
44 44
\f[ \min\sum_{uv\in A} f(uv) \cdot cost(uv) \f]
45 45
\f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \geq
46 46
    sup(u) \quad \forall u\in V \f]
47 47
\f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A \f]
48 48

	
49 49
The sum of the supply values, i.e. \f$\sum_{u\in V} sup(u)\f$ must be
50 50
zero or negative in order to have a feasible solution (since the sum
51 51
of the expressions on the left-hand side of the inequalities is zero).
52 52
It means that the total demand must be greater or equal to the total
53 53
supply and all the supplies have to be carried out from the supply nodes,
54 54
but there could be demands that are not satisfied.
55 55
If \f$\sum_{u\in V} sup(u)\f$ is zero, then all the supply/demand
56 56
constraints have to be satisfied with equality, i.e. all demands
57 57
have to be satisfied and all supplies have to be used.
58 58

	
59 59

	
60 60
\section mcf_algs Algorithms
61 61

	
62 62
LEMON contains several algorithms for solving this problem, for more
63 63
information see \ref min_cost_flow_algs "Minimum Cost Flow Algorithms".
64 64

	
65 65
A feasible solution for this problem can be found using \ref Circulation.
66 66

	
67 67

	
68 68
\section mcf_dual Dual Solution
69 69

	
70 70
The dual solution of the minimum cost flow problem is represented by
71 71
node potentials \f$\pi: V\rightarrow\mathbf{R}\f$.
72 72
An \f$f: A\rightarrow\mathbf{R}\f$ primal feasible solution is optimal
73 73
if and only if for some \f$\pi: V\rightarrow\mathbf{R}\f$ node potentials
74 74
the following \e complementary \e slackness optimality conditions hold.
75 75

	
76 76
 - For all \f$uv\in A\f$ arcs:
77 77
   - if \f$cost^\pi(uv)>0\f$, then \f$f(uv)=lower(uv)\f$;
78 78
   - if \f$lower(uv)<f(uv)<upper(uv)\f$, then \f$cost^\pi(uv)=0\f$;
79 79
   - if \f$cost^\pi(uv)<0\f$, then \f$f(uv)=upper(uv)\f$.
80 80
 - For all \f$u\in V\f$ nodes:
81
   - \f$\pi(u)<=0\f$;
81
   - \f$\pi(u)\leq 0\f$;
82 82
   - if \f$\sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \neq sup(u)\f$,
83 83
     then \f$\pi(u)=0\f$.
84 84
 
85 85
Here \f$cost^\pi(uv)\f$ denotes the \e reduced \e cost of the arc
86 86
\f$uv\in A\f$ with respect to the potential function \f$\pi\f$, i.e.
87 87
\f[ cost^\pi(uv) = cost(uv) + \pi(u) - \pi(v).\f]
88 88

	
89 89
All algorithms provide dual solution (node potentials), as well,
90 90
if an optimal flow is found.
91 91

	
92 92

	
93 93
\section mcf_eq Equality Form
94 94

	
95 95
The above \ref mcf_def "definition" is actually more general than the
96 96
usual formulation of the minimum cost flow problem, in which strict
97 97
equalities are required in the supply/demand contraints.
98 98

	
99 99
\f[ \min\sum_{uv\in A} f(uv) \cdot cost(uv) \f]
100 100
\f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) =
101 101
    sup(u) \quad \forall u\in V \f]
102 102
\f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A \f]
103 103

	
104 104
However if the sum of the supply values is zero, then these two problems
105 105
are equivalent.
106 106
The \ref min_cost_flow_algs "algorithms" in LEMON support the general
107 107
form, so if you need the equality form, you have to ensure this additional
108 108
contraint manually.
109 109

	
110 110

	
111 111
\section mcf_leq Opposite Inequalites (LEQ Form)
112 112

	
113 113
Another possible definition of the minimum cost flow problem is
114 114
when there are <em>"less or equal"</em> (LEQ) supply/demand constraints,
115 115
instead of the <em>"greater or equal"</em> (GEQ) constraints.
116 116

	
117 117
\f[ \min\sum_{uv\in A} f(uv) \cdot cost(uv) \f]
118 118
\f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \leq
119 119
    sup(u) \quad \forall u\in V \f]
120 120
\f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A \f]
121 121

	
122 122
It means that the total demand must be less or equal to the 
123 123
total supply (i.e. \f$\sum_{u\in V} sup(u)\f$ must be zero or
124 124
positive) and all the demands have to be satisfied, but there
125 125
could be supplies that are not carried out from the supply
126 126
nodes.
127 127
The equality form is also a special case of this form, of course.
128 128

	
129 129
You could easily transform this case to the \ref mcf_def "GEQ form"
130 130
of the problem by reversing the direction of the arcs and taking the
131 131
negative of the supply values (e.g. using \ref ReverseDigraph and
132 132
\ref NegMap adaptors).
133 133
However \ref NetworkSimplex algorithm also supports this form directly
134 134
for the sake of convenience.
135 135

	
136 136
Note that the optimality conditions for this supply constraint type are
137 137
slightly differ from the conditions that are discussed for the GEQ form,
138 138
namely the potentials have to be non-negative instead of non-positive.
139 139
An \f$f: A\rightarrow\mathbf{R}\f$ feasible solution of this problem
140 140
is optimal if and only if for some \f$\pi: V\rightarrow\mathbf{R}\f$
141 141
node potentials the following conditions hold.
142 142

	
143 143
 - For all \f$uv\in A\f$ arcs:
144 144
   - if \f$cost^\pi(uv)>0\f$, then \f$f(uv)=lower(uv)\f$;
145 145
   - if \f$lower(uv)<f(uv)<upper(uv)\f$, then \f$cost^\pi(uv)=0\f$;
146 146
   - if \f$cost^\pi(uv)<0\f$, then \f$f(uv)=upper(uv)\f$.
147 147
 - For all \f$u\in V\f$ nodes:
148
   - \f$\pi(u)>=0\f$;
148
   - \f$\pi(u)\geq 0\f$;
149 149
   - if \f$\sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \neq sup(u)\f$,
150 150
     then \f$\pi(u)=0\f$.
151 151

	
152 152
*/
153 153
}
Ignore white space 6 line context
1 1
EXTRA_DIST += \
2 2
	lemon/lemon.pc.in \
3 3
	lemon/CMakeLists.txt \
4 4
	lemon/config.h.cmake
5 5

	
6 6
pkgconfig_DATA += lemon/lemon.pc
7 7

	
8 8
lib_LTLIBRARIES += lemon/libemon.la
9 9

	
10 10
lemon_libemon_la_SOURCES = \
11 11
	lemon/arg_parser.cc \
12 12
	lemon/base.cc \
13 13
	lemon/color.cc \
14 14
	lemon/lp_base.cc \
15 15
	lemon/lp_skeleton.cc \
16 16
	lemon/random.cc \
17 17
	lemon/bits/windows.cc
18 18

	
19 19
nodist_lemon_HEADERS = lemon/config.h	
20 20

	
21 21
lemon_libemon_la_CXXFLAGS = \
22 22
	$(AM_CXXFLAGS) \
23 23
	$(GLPK_CFLAGS) \
24 24
	$(CPLEX_CFLAGS) \
25 25
	$(SOPLEX_CXXFLAGS) \
26 26
	$(CLP_CXXFLAGS) \
27 27
	$(CBC_CXXFLAGS)
28 28

	
29 29
lemon_libemon_la_LDFLAGS = \
30 30
	$(GLPK_LIBS) \
31 31
	$(CPLEX_LIBS) \
32 32
	$(SOPLEX_LIBS) \
33 33
	$(CLP_LIBS) \
34 34
	$(CBC_LIBS)
35 35

	
36 36
if HAVE_GLPK
37 37
lemon_libemon_la_SOURCES += lemon/glpk.cc
38 38
endif
39 39

	
40 40
if HAVE_CPLEX
41 41
lemon_libemon_la_SOURCES += lemon/cplex.cc
42 42
endif
43 43

	
44 44
if HAVE_SOPLEX
45 45
lemon_libemon_la_SOURCES += lemon/soplex.cc
46 46
endif
47 47

	
48 48
if HAVE_CLP
49 49
lemon_libemon_la_SOURCES += lemon/clp.cc
50 50
endif
51 51

	
52 52
if HAVE_CBC
53 53
lemon_libemon_la_SOURCES += lemon/cbc.cc
54 54
endif
55 55

	
56 56
lemon_HEADERS += \
57 57
	lemon/adaptors.h \
58 58
	lemon/arg_parser.h \
59 59
	lemon/assert.h \
60 60
	lemon/bellman_ford.h \
61 61
	lemon/bfs.h \
62 62
	lemon/bin_heap.h \
63 63
	lemon/binom_heap.h \
64 64
	lemon/bucket_heap.h \
65 65
	lemon/cbc.h \
66 66
	lemon/circulation.h \
67 67
	lemon/clp.h \
68 68
	lemon/color.h \
69 69
	lemon/concept_check.h \
70 70
	lemon/connectivity.h \
71 71
	lemon/counter.h \
72 72
	lemon/core.h \
73 73
	lemon/cplex.h \
74 74
	lemon/dfs.h \
75 75
	lemon/dijkstra.h \
76 76
	lemon/dim2.h \
77 77
	lemon/dimacs.h \
78 78
	lemon/edge_set.h \
79 79
	lemon/elevator.h \
80 80
	lemon/error.h \
81 81
	lemon/euler.h \
82 82
	lemon/fib_heap.h \
83 83
	lemon/fourary_heap.h \
84 84
	lemon/full_graph.h \
85 85
	lemon/glpk.h \
86 86
	lemon/gomory_hu.h \
87 87
	lemon/graph_to_eps.h \
88 88
	lemon/grid_graph.h \
89
	lemon/hartmann_orlin.h \
90
	lemon/howard.h \
89 91
	lemon/hypercube_graph.h \
92
	lemon/karp.h \
90 93
	lemon/kary_heap.h \
91 94
	lemon/kruskal.h \
92 95
	lemon/hao_orlin.h \
93 96
	lemon/lgf_reader.h \
94 97
	lemon/lgf_writer.h \
95 98
	lemon/list_graph.h \
96 99
	lemon/lp.h \
97 100
	lemon/lp_base.h \
98 101
	lemon/lp_skeleton.h \
99 102
	lemon/maps.h \
100 103
	lemon/matching.h \
101 104
	lemon/math.h \
102 105
	lemon/min_cost_arborescence.h \
103 106
	lemon/nauty_reader.h \
104 107
	lemon/network_simplex.h \
105 108
	lemon/pairing_heap.h \
106 109
	lemon/path.h \
107 110
	lemon/planarity.h \
108 111
	lemon/preflow.h \
109 112
	lemon/radix_heap.h \
110 113
	lemon/radix_sort.h \
111 114
	lemon/random.h \
112 115
	lemon/smart_graph.h \
113 116
	lemon/soplex.h \
117
	lemon/static_graph.h \
114 118
	lemon/suurballe.h \
115 119
	lemon/time_measure.h \
116 120
	lemon/tolerance.h \
117 121
	lemon/unionfind.h \
118 122
	lemon/bits/windows.h
119 123

	
120 124
bits_HEADERS += \
121 125
	lemon/bits/alteration_notifier.h \
122 126
	lemon/bits/array_map.h \
123 127
	lemon/bits/bezier.h \
124 128
	lemon/bits/default_map.h \
125 129
	lemon/bits/edge_set_extender.h \
126 130
	lemon/bits/enable_if.h \
127 131
	lemon/bits/graph_adaptor_extender.h \
128 132
	lemon/bits/graph_extender.h \
129 133
	lemon/bits/map_extender.h \
130 134
	lemon/bits/path_dump.h \
131 135
	lemon/bits/solver_bits.h \
132 136
	lemon/bits/traits.h \
133 137
	lemon/bits/variant.h \
134 138
	lemon/bits/vector_map.h
135 139

	
136 140
concept_HEADERS += \
137 141
	lemon/concepts/digraph.h \
138 142
	lemon/concepts/graph.h \
139 143
	lemon/concepts/graph_components.h \
140 144
	lemon/concepts/heap.h \
141 145
	lemon/concepts/maps.h \
142 146
	lemon/concepts/path.h
Ignore white space 6 line context
... ...
@@ -235,256 +235,259 @@
235 235
    Node nodeFromId(int ix) const { return _graph->nodeFromId(ix); }
236 236
    Arc arcFromId(int ix) const { return _graph->arcFromId(ix); }
237 237
    Edge edgeFromId(int ix) const { return _graph->edgeFromId(ix); }
238 238

	
239 239
    int maxNodeId() const { return _graph->maxNodeId(); }
240 240
    int maxArcId() const { return _graph->maxArcId(); }
241 241
    int maxEdgeId() const { return _graph->maxEdgeId(); }
242 242

	
243 243
    typedef typename ItemSetTraits<GR, Node>::ItemNotifier NodeNotifier;
244 244
    NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); }
245 245

	
246 246
    typedef typename ItemSetTraits<GR, Arc>::ItemNotifier ArcNotifier;
247 247
    ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); }
248 248

	
249 249
    typedef typename ItemSetTraits<GR, Edge>::ItemNotifier EdgeNotifier;
250 250
    EdgeNotifier& notifier(Edge) const { return _graph->notifier(Edge()); }
251 251

	
252 252
    template <typename V>
253 253
    class NodeMap : public GR::template NodeMap<V> {
254 254
      typedef typename GR::template NodeMap<V> Parent;
255 255

	
256 256
    public:
257 257
      explicit NodeMap(const GraphAdaptorBase<GR>& adapter)
258 258
        : Parent(*adapter._graph) {}
259 259
      NodeMap(const GraphAdaptorBase<GR>& adapter, const V& value)
260 260
        : Parent(*adapter._graph, value) {}
261 261

	
262 262
    private:
263 263
      NodeMap& operator=(const NodeMap& cmap) {
264 264
        return operator=<NodeMap>(cmap);
265 265
      }
266 266

	
267 267
      template <typename CMap>
268 268
      NodeMap& operator=(const CMap& cmap) {
269 269
        Parent::operator=(cmap);
270 270
        return *this;
271 271
      }
272 272

	
273 273
    };
274 274

	
275 275
    template <typename V>
276 276
    class ArcMap : public GR::template ArcMap<V> {
277 277
      typedef typename GR::template ArcMap<V> Parent;
278 278

	
279 279
    public:
280 280
      explicit ArcMap(const GraphAdaptorBase<GR>& adapter)
281 281
        : Parent(*adapter._graph) {}
282 282
      ArcMap(const GraphAdaptorBase<GR>& adapter, const V& value)
283 283
        : Parent(*adapter._graph, value) {}
284 284

	
285 285
    private:
286 286
      ArcMap& operator=(const ArcMap& cmap) {
287 287
        return operator=<ArcMap>(cmap);
288 288
      }
289 289

	
290 290
      template <typename CMap>
291 291
      ArcMap& operator=(const CMap& cmap) {
292 292
        Parent::operator=(cmap);
293 293
        return *this;
294 294
      }
295 295
    };
296 296

	
297 297
    template <typename V>
298 298
    class EdgeMap : public GR::template EdgeMap<V> {
299 299
      typedef typename GR::template EdgeMap<V> Parent;
300 300

	
301 301
    public:
302 302
      explicit EdgeMap(const GraphAdaptorBase<GR>& adapter)
303 303
        : Parent(*adapter._graph) {}
304 304
      EdgeMap(const GraphAdaptorBase<GR>& adapter, const V& value)
305 305
        : Parent(*adapter._graph, value) {}
306 306

	
307 307
    private:
308 308
      EdgeMap& operator=(const EdgeMap& cmap) {
309 309
        return operator=<EdgeMap>(cmap);
310 310
      }
311 311

	
312 312
      template <typename CMap>
313 313
      EdgeMap& operator=(const CMap& cmap) {
314 314
        Parent::operator=(cmap);
315 315
        return *this;
316 316
      }
317 317
    };
318 318

	
319 319
  };
320 320

	
321 321
  template <typename DGR>
322 322
  class ReverseDigraphBase : public DigraphAdaptorBase<DGR> {
323 323
    typedef DigraphAdaptorBase<DGR> Parent;
324 324
  public:
325 325
    typedef DGR Digraph;
326 326
  protected:
327 327
    ReverseDigraphBase() : Parent() { }
328 328
  public:
329 329
    typedef typename Parent::Node Node;
330 330
    typedef typename Parent::Arc Arc;
331 331

	
332 332
    void firstIn(Arc& a, const Node& n) const { Parent::firstOut(a, n); }
333 333
    void firstOut(Arc& a, const Node& n ) const { Parent::firstIn(a, n); }
334 334

	
335 335
    void nextIn(Arc& a) const { Parent::nextOut(a); }
336 336
    void nextOut(Arc& a) const { Parent::nextIn(a); }
337 337

	
338 338
    Node source(const Arc& a) const { return Parent::target(a); }
339 339
    Node target(const Arc& a) const { return Parent::source(a); }
340 340

	
341 341
    Arc addArc(const Node& u, const Node& v) { return Parent::addArc(v, u); }
342 342

	
343 343
    typedef FindArcTagIndicator<DGR> FindArcTag;
344 344
    Arc findArc(const Node& u, const Node& v,
345 345
                const Arc& prev = INVALID) const {
346 346
      return Parent::findArc(v, u, prev);
347 347
    }
348 348

	
349 349
  };
350 350

	
351 351
  /// \ingroup graph_adaptors
352 352
  ///
353 353
  /// \brief Adaptor class for reversing the orientation of the arcs in
354 354
  /// a digraph.
355 355
  ///
356 356
  /// ReverseDigraph can be used for reversing the arcs in a digraph.
357 357
  /// It conforms to the \ref concepts::Digraph "Digraph" concept.
358 358
  ///
359 359
  /// The adapted digraph can also be modified through this adaptor
360 360
  /// by adding or removing nodes or arcs, unless the \c GR template
361 361
  /// parameter is set to be \c const.
362 362
  ///
363
  /// This class provides item counting in the same time as the adapted
364
  /// digraph structure.
365
  ///
363 366
  /// \tparam DGR The type of the adapted digraph.
364 367
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
365 368
  /// It can also be specified to be \c const.
366 369
  ///
367 370
  /// \note The \c Node and \c Arc types of this adaptor and the adapted
368 371
  /// digraph are convertible to each other.
369 372
  template<typename DGR>
370 373
#ifdef DOXYGEN
371 374
  class ReverseDigraph {
372 375
#else
373 376
  class ReverseDigraph :
374 377
    public DigraphAdaptorExtender<ReverseDigraphBase<DGR> > {
375 378
#endif
376 379
    typedef DigraphAdaptorExtender<ReverseDigraphBase<DGR> > Parent;
377 380
  public:
378 381
    /// The type of the adapted digraph.
379 382
    typedef DGR Digraph;
380 383
  protected:
381 384
    ReverseDigraph() { }
382 385
  public:
383 386

	
384 387
    /// \brief Constructor
385 388
    ///
386 389
    /// Creates a reverse digraph adaptor for the given digraph.
387 390
    explicit ReverseDigraph(DGR& digraph) {
388 391
      Parent::initialize(digraph);
389 392
    }
390 393
  };
391 394

	
392 395
  /// \brief Returns a read-only ReverseDigraph adaptor
393 396
  ///
394 397
  /// This function just returns a read-only \ref ReverseDigraph adaptor.
395 398
  /// \ingroup graph_adaptors
396 399
  /// \relates ReverseDigraph
397 400
  template<typename DGR>
398 401
  ReverseDigraph<const DGR> reverseDigraph(const DGR& digraph) {
399 402
    return ReverseDigraph<const DGR>(digraph);
400 403
  }
401 404

	
402 405

	
403 406
  template <typename DGR, typename NF, typename AF, bool ch = true>
404 407
  class SubDigraphBase : public DigraphAdaptorBase<DGR> {
405 408
    typedef DigraphAdaptorBase<DGR> Parent;
406 409
  public:
407 410
    typedef DGR Digraph;
408 411
    typedef NF NodeFilterMap;
409 412
    typedef AF ArcFilterMap;
410 413

	
411 414
    typedef SubDigraphBase Adaptor;
412 415
  protected:
413 416
    NF* _node_filter;
414 417
    AF* _arc_filter;
415 418
    SubDigraphBase()
416 419
      : Parent(), _node_filter(0), _arc_filter(0) { }
417 420

	
418 421
    void initialize(DGR& digraph, NF& node_filter, AF& arc_filter) {
419 422
      Parent::initialize(digraph);
420 423
      _node_filter = &node_filter;
421 424
      _arc_filter = &arc_filter;      
422 425
    }
423 426

	
424 427
  public:
425 428

	
426 429
    typedef typename Parent::Node Node;
427 430
    typedef typename Parent::Arc Arc;
428 431

	
429 432
    void first(Node& i) const {
430 433
      Parent::first(i);
431 434
      while (i != INVALID && !(*_node_filter)[i]) Parent::next(i);
432 435
    }
433 436

	
434 437
    void first(Arc& i) const {
435 438
      Parent::first(i);
436 439
      while (i != INVALID && (!(*_arc_filter)[i]
437 440
                              || !(*_node_filter)[Parent::source(i)]
438 441
                              || !(*_node_filter)[Parent::target(i)]))
439 442
        Parent::next(i);
440 443
    }
441 444

	
442 445
    void firstIn(Arc& i, const Node& n) const {
443 446
      Parent::firstIn(i, n);
444 447
      while (i != INVALID && (!(*_arc_filter)[i]
445 448
                              || !(*_node_filter)[Parent::source(i)]))
446 449
        Parent::nextIn(i);
447 450
    }
448 451

	
449 452
    void firstOut(Arc& i, const Node& n) const {
450 453
      Parent::firstOut(i, n);
451 454
      while (i != INVALID && (!(*_arc_filter)[i]
452 455
                              || !(*_node_filter)[Parent::target(i)]))
453 456
        Parent::nextOut(i);
454 457
    }
455 458

	
456 459
    void next(Node& i) const {
457 460
      Parent::next(i);
458 461
      while (i != INVALID && !(*_node_filter)[i]) Parent::next(i);
459 462
    }
460 463

	
461 464
    void next(Arc& i) const {
462 465
      Parent::next(i);
463 466
      while (i != INVALID && (!(*_arc_filter)[i]
464 467
                              || !(*_node_filter)[Parent::source(i)]
465 468
                              || !(*_node_filter)[Parent::target(i)]))
466 469
        Parent::next(i);
467 470
    }
468 471

	
469 472
    void nextIn(Arc& i) const {
470 473
      Parent::nextIn(i);
471 474
      while (i != INVALID && (!(*_arc_filter)[i]
472 475
                              || !(*_node_filter)[Parent::source(i)]))
473 476
        Parent::nextIn(i);
474 477
    }
475 478

	
476 479
    void nextOut(Arc& i) const {
477 480
      Parent::nextOut(i);
478 481
      while (i != INVALID && (!(*_arc_filter)[i]
479 482
                              || !(*_node_filter)[Parent::target(i)]))
480 483
        Parent::nextOut(i);
481 484
    }
482 485

	
483 486
    void status(const Node& n, bool v) const { _node_filter->set(n, v); }
484 487
    void status(const Arc& a, bool v) const { _arc_filter->set(a, v); }
485 488

	
486 489
    bool status(const Node& n) const { return (*_node_filter)[n]; }
487 490
    bool status(const Arc& a) const { return (*_arc_filter)[a]; }
488 491

	
489 492
    typedef False NodeNumTag;
490 493
    typedef False ArcNumTag;
... ...
@@ -594,256 +597,258 @@
594 597

	
595 598
    void first(Arc& i) const {
596 599
      Parent::first(i);
597 600
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::next(i);
598 601
    }
599 602

	
600 603
    void firstIn(Arc& i, const Node& n) const {
601 604
      Parent::firstIn(i, n);
602 605
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextIn(i);
603 606
    }
604 607

	
605 608
    void firstOut(Arc& i, const Node& n) const {
606 609
      Parent::firstOut(i, n);
607 610
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i);
608 611
    }
609 612

	
610 613
    void next(Node& i) const {
611 614
      Parent::next(i);
612 615
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
613 616
    }
614 617
    void next(Arc& i) const {
615 618
      Parent::next(i);
616 619
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::next(i);
617 620
    }
618 621
    void nextIn(Arc& i) const {
619 622
      Parent::nextIn(i);
620 623
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextIn(i);
621 624
    }
622 625

	
623 626
    void nextOut(Arc& i) const {
624 627
      Parent::nextOut(i);
625 628
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i);
626 629
    }
627 630

	
628 631
    void status(const Node& n, bool v) const { _node_filter->set(n, v); }
629 632
    void status(const Arc& a, bool v) const { _arc_filter->set(a, v); }
630 633

	
631 634
    bool status(const Node& n) const { return (*_node_filter)[n]; }
632 635
    bool status(const Arc& a) const { return (*_arc_filter)[a]; }
633 636

	
634 637
    typedef False NodeNumTag;
635 638
    typedef False ArcNumTag;
636 639

	
637 640
    typedef FindArcTagIndicator<DGR> FindArcTag;
638 641
    Arc findArc(const Node& source, const Node& target,
639 642
                const Arc& prev = INVALID) const {
640 643
      if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
641 644
        return INVALID;
642 645
      }
643 646
      Arc arc = Parent::findArc(source, target, prev);
644 647
      while (arc != INVALID && !(*_arc_filter)[arc]) {
645 648
        arc = Parent::findArc(source, target, arc);
646 649
      }
647 650
      return arc;
648 651
    }
649 652

	
650 653
    template <typename V>
651 654
    class NodeMap 
652 655
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
653 656
          LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
654 657
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>, 
655 658
        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
656 659

	
657 660
    public:
658 661
      typedef V Value;
659 662

	
660 663
      NodeMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor)
661 664
        : Parent(adaptor) {}
662 665
      NodeMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor, const V& value)
663 666
        : Parent(adaptor, value) {}
664 667

	
665 668
    private:
666 669
      NodeMap& operator=(const NodeMap& cmap) {
667 670
        return operator=<NodeMap>(cmap);
668 671
      }
669 672

	
670 673
      template <typename CMap>
671 674
      NodeMap& operator=(const CMap& cmap) {
672 675
        Parent::operator=(cmap);
673 676
        return *this;
674 677
      }
675 678
    };
676 679

	
677 680
    template <typename V>
678 681
    class ArcMap 
679 682
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
680 683
          LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
681 684
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
682 685
        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> Parent;
683 686

	
684 687
    public:
685 688
      typedef V Value;
686 689

	
687 690
      ArcMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor)
688 691
        : Parent(adaptor) {}
689 692
      ArcMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor, const V& value)
690 693
        : Parent(adaptor, value) {}
691 694

	
692 695
    private:
693 696
      ArcMap& operator=(const ArcMap& cmap) {
694 697
        return operator=<ArcMap>(cmap);
695 698
      }
696 699

	
697 700
      template <typename CMap>
698 701
      ArcMap& operator=(const CMap& cmap) {
699 702
        Parent::operator=(cmap);
700 703
        return *this;
701 704
      }
702 705
    };
703 706

	
704 707
  };
705 708

	
706 709
  /// \ingroup graph_adaptors
707 710
  ///
708 711
  /// \brief Adaptor class for hiding nodes and arcs in a digraph
709 712
  ///
710 713
  /// SubDigraph can be used for hiding nodes and arcs in a digraph.
711 714
  /// A \c bool node map and a \c bool arc map must be specified, which
712 715
  /// define the filters for nodes and arcs.
713 716
  /// Only the nodes and arcs with \c true filter value are
714 717
  /// shown in the subdigraph. The arcs that are incident to hidden
715 718
  /// nodes are also filtered out.
716 719
  /// This adaptor conforms to the \ref concepts::Digraph "Digraph" concept.
717 720
  ///
718 721
  /// The adapted digraph can also be modified through this adaptor
719 722
  /// by adding or removing nodes or arcs, unless the \c GR template
720 723
  /// parameter is set to be \c const.
721 724
  ///
725
  /// This class provides only linear time counting for nodes and arcs.
726
  ///
722 727
  /// \tparam DGR The type of the adapted digraph.
723 728
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
724 729
  /// It can also be specified to be \c const.
725 730
  /// \tparam NF The type of the node filter map.
726 731
  /// It must be a \c bool (or convertible) node map of the
727 732
  /// adapted digraph. The default type is
728 733
  /// \ref concepts::Digraph::NodeMap "DGR::NodeMap<bool>".
729 734
  /// \tparam AF The type of the arc filter map.
730 735
  /// It must be \c bool (or convertible) arc map of the
731 736
  /// adapted digraph. The default type is
732 737
  /// \ref concepts::Digraph::ArcMap "DGR::ArcMap<bool>".
733 738
  ///
734 739
  /// \note The \c Node and \c Arc types of this adaptor and the adapted
735 740
  /// digraph are convertible to each other.
736 741
  ///
737 742
  /// \see FilterNodes
738 743
  /// \see FilterArcs
739 744
#ifdef DOXYGEN
740 745
  template<typename DGR, typename NF, typename AF>
741 746
  class SubDigraph {
742 747
#else
743 748
  template<typename DGR,
744 749
           typename NF = typename DGR::template NodeMap<bool>,
745 750
           typename AF = typename DGR::template ArcMap<bool> >
746 751
  class SubDigraph :
747 752
    public DigraphAdaptorExtender<SubDigraphBase<DGR, NF, AF, true> > {
748 753
#endif
749 754
  public:
750 755
    /// The type of the adapted digraph.
751 756
    typedef DGR Digraph;
752 757
    /// The type of the node filter map.
753 758
    typedef NF NodeFilterMap;
754 759
    /// The type of the arc filter map.
755 760
    typedef AF ArcFilterMap;
756 761

	
757 762
    typedef DigraphAdaptorExtender<SubDigraphBase<DGR, NF, AF, true> >
758 763
      Parent;
759 764

	
760 765
    typedef typename Parent::Node Node;
761 766
    typedef typename Parent::Arc Arc;
762 767

	
763 768
  protected:
764 769
    SubDigraph() { }
765 770
  public:
766 771

	
767 772
    /// \brief Constructor
768 773
    ///
769 774
    /// Creates a subdigraph for the given digraph with the
770 775
    /// given node and arc filter maps.
771 776
    SubDigraph(DGR& digraph, NF& node_filter, AF& arc_filter) {
772 777
      Parent::initialize(digraph, node_filter, arc_filter);
773 778
    }
774 779

	
775 780
    /// \brief Sets the status of the given node
776 781
    ///
777 782
    /// This function sets the status of the given node.
778 783
    /// It is done by simply setting the assigned value of \c n
779 784
    /// to \c v in the node filter map.
780 785
    void status(const Node& n, bool v) const { Parent::status(n, v); }
781 786

	
782 787
    /// \brief Sets the status of the given arc
783 788
    ///
784 789
    /// This function sets the status of the given arc.
785 790
    /// It is done by simply setting the assigned value of \c a
786 791
    /// to \c v in the arc filter map.
787 792
    void status(const Arc& a, bool v) const { Parent::status(a, v); }
788 793

	
789 794
    /// \brief Returns the status of the given node
790 795
    ///
791 796
    /// This function returns the status of the given node.
792 797
    /// It is \c true if the given node is enabled (i.e. not hidden).
793 798
    bool status(const Node& n) const { return Parent::status(n); }
794 799

	
795 800
    /// \brief Returns the status of the given arc
796 801
    ///
797 802
    /// This function returns the status of the given arc.
798 803
    /// It is \c true if the given arc is enabled (i.e. not hidden).
799 804
    bool status(const Arc& a) const { return Parent::status(a); }
800 805

	
801 806
    /// \brief Disables the given node
802 807
    ///
803 808
    /// This function disables the given node in the subdigraph,
804 809
    /// so the iteration jumps over it.
805 810
    /// It is the same as \ref status() "status(n, false)".
806 811
    void disable(const Node& n) const { Parent::status(n, false); }
807 812

	
808 813
    /// \brief Disables the given arc
809 814
    ///
810 815
    /// This function disables the given arc in the subdigraph,
811 816
    /// so the iteration jumps over it.
812 817
    /// It is the same as \ref status() "status(a, false)".
813 818
    void disable(const Arc& a) const { Parent::status(a, false); }
814 819

	
815 820
    /// \brief Enables the given node
816 821
    ///
817 822
    /// This function enables the given node in the subdigraph.
818 823
    /// It is the same as \ref status() "status(n, true)".
819 824
    void enable(const Node& n) const { Parent::status(n, true); }
820 825

	
821 826
    /// \brief Enables the given arc
822 827
    ///
823 828
    /// This function enables the given arc in the subdigraph.
824 829
    /// It is the same as \ref status() "status(a, true)".
825 830
    void enable(const Arc& a) const { Parent::status(a, true); }
826 831

	
827 832
  };
828 833

	
829 834
  /// \brief Returns a read-only SubDigraph adaptor
830 835
  ///
831 836
  /// This function just returns a read-only \ref SubDigraph adaptor.
832 837
  /// \ingroup graph_adaptors
833 838
  /// \relates SubDigraph
834 839
  template<typename DGR, typename NF, typename AF>
835 840
  SubDigraph<const DGR, NF, AF>
836 841
  subDigraph(const DGR& digraph,
837 842
             NF& node_filter, AF& arc_filter) {
838 843
    return SubDigraph<const DGR, NF, AF>
839 844
      (digraph, node_filter, arc_filter);
840 845
  }
841 846

	
842 847
  template<typename DGR, typename NF, typename AF>
843 848
  SubDigraph<const DGR, const NF, AF>
844 849
  subDigraph(const DGR& digraph,
845 850
             const NF& node_filter, AF& arc_filter) {
846 851
    return SubDigraph<const DGR, const NF, AF>
847 852
      (digraph, node_filter, arc_filter);
848 853
  }
849 854

	
... ...
@@ -1189,671 +1194,679 @@
1189 1194
    bool status(const Node& n) const { return (*_node_filter)[n]; }
1190 1195
    bool status(const Edge& e) const { return (*_edge_filter)[e]; }
1191 1196

	
1192 1197
    typedef False NodeNumTag;
1193 1198
    typedef False ArcNumTag;
1194 1199
    typedef False EdgeNumTag;
1195 1200

	
1196 1201
    typedef FindArcTagIndicator<Graph> FindArcTag;
1197 1202
    Arc findArc(const Node& u, const Node& v,
1198 1203
                const Arc& prev = INVALID) const {
1199 1204
      Arc arc = Parent::findArc(u, v, prev);
1200 1205
      while (arc != INVALID && !(*_edge_filter)[arc]) {
1201 1206
        arc = Parent::findArc(u, v, arc);
1202 1207
      }
1203 1208
      return arc;
1204 1209
    }
1205 1210

	
1206 1211
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
1207 1212
    Edge findEdge(const Node& u, const Node& v,
1208 1213
                  const Edge& prev = INVALID) const {
1209 1214
      Edge edge = Parent::findEdge(u, v, prev);
1210 1215
      while (edge != INVALID && !(*_edge_filter)[edge]) {
1211 1216
        edge = Parent::findEdge(u, v, edge);
1212 1217
      }
1213 1218
      return edge;
1214 1219
    }
1215 1220

	
1216 1221
    template <typename V>
1217 1222
    class NodeMap 
1218 1223
      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1219 1224
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> {
1220 1225
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
1221 1226
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent;
1222 1227

	
1223 1228
    public:
1224 1229
      typedef V Value;
1225 1230

	
1226 1231
      NodeMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
1227 1232
        : Parent(adaptor) {}
1228 1233
      NodeMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
1229 1234
        : Parent(adaptor, value) {}
1230 1235

	
1231 1236
    private:
1232 1237
      NodeMap& operator=(const NodeMap& cmap) {
1233 1238
        return operator=<NodeMap>(cmap);
1234 1239
      }
1235 1240

	
1236 1241
      template <typename CMap>
1237 1242
      NodeMap& operator=(const CMap& cmap) {
1238 1243
        Parent::operator=(cmap);
1239 1244
        return *this;
1240 1245
      }
1241 1246
    };
1242 1247

	
1243 1248
    template <typename V>
1244 1249
    class ArcMap 
1245 1250
      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1246 1251
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> {
1247 1252
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
1248 1253
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent;
1249 1254

	
1250 1255
    public:
1251 1256
      typedef V Value;
1252 1257

	
1253 1258
      ArcMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
1254 1259
        : Parent(adaptor) {}
1255 1260
      ArcMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
1256 1261
        : Parent(adaptor, value) {}
1257 1262

	
1258 1263
    private:
1259 1264
      ArcMap& operator=(const ArcMap& cmap) {
1260 1265
        return operator=<ArcMap>(cmap);
1261 1266
      }
1262 1267

	
1263 1268
      template <typename CMap>
1264 1269
      ArcMap& operator=(const CMap& cmap) {
1265 1270
        Parent::operator=(cmap);
1266 1271
        return *this;
1267 1272
      }
1268 1273
    };
1269 1274

	
1270 1275
    template <typename V>
1271 1276
    class EdgeMap 
1272 1277
      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1273 1278
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> {
1274 1279
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
1275 1280
	LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
1276 1281

	
1277 1282
    public:
1278 1283
      typedef V Value;
1279 1284

	
1280 1285
      EdgeMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
1281 1286
        : Parent(adaptor) {}
1282 1287

	
1283 1288
      EdgeMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
1284 1289
        : Parent(adaptor, value) {}
1285 1290

	
1286 1291
    private:
1287 1292
      EdgeMap& operator=(const EdgeMap& cmap) {
1288 1293
        return operator=<EdgeMap>(cmap);
1289 1294
      }
1290 1295

	
1291 1296
      template <typename CMap>
1292 1297
      EdgeMap& operator=(const CMap& cmap) {
1293 1298
        Parent::operator=(cmap);
1294 1299
        return *this;
1295 1300
      }
1296 1301
    };
1297 1302

	
1298 1303
  };
1299 1304

	
1300 1305
  /// \ingroup graph_adaptors
1301 1306
  ///
1302 1307
  /// \brief Adaptor class for hiding nodes and edges in an undirected
1303 1308
  /// graph.
1304 1309
  ///
1305 1310
  /// SubGraph can be used for hiding nodes and edges in a graph.
1306 1311
  /// A \c bool node map and a \c bool edge map must be specified, which
1307 1312
  /// define the filters for nodes and edges.
1308 1313
  /// Only the nodes and edges with \c true filter value are
1309 1314
  /// shown in the subgraph. The edges that are incident to hidden
1310 1315
  /// nodes are also filtered out.
1311 1316
  /// This adaptor conforms to the \ref concepts::Graph "Graph" concept.
1312 1317
  ///
1313 1318
  /// The adapted graph can also be modified through this adaptor
1314 1319
  /// by adding or removing nodes or edges, unless the \c GR template
1315 1320
  /// parameter is set to be \c const.
1316 1321
  ///
1322
  /// This class provides only linear time counting for nodes, edges and arcs.
1323
  ///
1317 1324
  /// \tparam GR The type of the adapted graph.
1318 1325
  /// It must conform to the \ref concepts::Graph "Graph" concept.
1319 1326
  /// It can also be specified to be \c const.
1320 1327
  /// \tparam NF The type of the node filter map.
1321 1328
  /// It must be a \c bool (or convertible) node map of the
1322 1329
  /// adapted graph. The default type is
1323 1330
  /// \ref concepts::Graph::NodeMap "GR::NodeMap<bool>".
1324 1331
  /// \tparam EF The type of the edge filter map.
1325 1332
  /// It must be a \c bool (or convertible) edge map of the
1326 1333
  /// adapted graph. The default type is
1327 1334
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<bool>".
1328 1335
  ///
1329 1336
  /// \note The \c Node, \c Edge and \c Arc types of this adaptor and the
1330 1337
  /// adapted graph are convertible to each other.
1331 1338
  ///
1332 1339
  /// \see FilterNodes
1333 1340
  /// \see FilterEdges
1334 1341
#ifdef DOXYGEN
1335 1342
  template<typename GR, typename NF, typename EF>
1336 1343
  class SubGraph {
1337 1344
#else
1338 1345
  template<typename GR,
1339 1346
           typename NF = typename GR::template NodeMap<bool>,
1340 1347
           typename EF = typename GR::template EdgeMap<bool> >
1341 1348
  class SubGraph :
1342 1349
    public GraphAdaptorExtender<SubGraphBase<GR, NF, EF, true> > {
1343 1350
#endif
1344 1351
  public:
1345 1352
    /// The type of the adapted graph.
1346 1353
    typedef GR Graph;
1347 1354
    /// The type of the node filter map.
1348 1355
    typedef NF NodeFilterMap;
1349 1356
    /// The type of the edge filter map.
1350 1357
    typedef EF EdgeFilterMap;
1351 1358

	
1352 1359
    typedef GraphAdaptorExtender<SubGraphBase<GR, NF, EF, true> >
1353 1360
      Parent;
1354 1361

	
1355 1362
    typedef typename Parent::Node Node;
1356 1363
    typedef typename Parent::Edge Edge;
1357 1364

	
1358 1365
  protected:
1359 1366
    SubGraph() { }
1360 1367
  public:
1361 1368

	
1362 1369
    /// \brief Constructor
1363 1370
    ///
1364 1371
    /// Creates a subgraph for the given graph with the given node
1365 1372
    /// and edge filter maps.
1366 1373
    SubGraph(GR& graph, NF& node_filter, EF& edge_filter) {
1367 1374
      initialize(graph, node_filter, edge_filter);
1368 1375
    }
1369 1376

	
1370 1377
    /// \brief Sets the status of the given node
1371 1378
    ///
1372 1379
    /// This function sets the status of the given node.
1373 1380
    /// It is done by simply setting the assigned value of \c n
1374 1381
    /// to \c v in the node filter map.
1375 1382
    void status(const Node& n, bool v) const { Parent::status(n, v); }
1376 1383

	
1377 1384
    /// \brief Sets the status of the given edge
1378 1385
    ///
1379 1386
    /// This function sets the status of the given edge.
1380 1387
    /// It is done by simply setting the assigned value of \c e
1381 1388
    /// to \c v in the edge filter map.
1382 1389
    void status(const Edge& e, bool v) const { Parent::status(e, v); }
1383 1390

	
1384 1391
    /// \brief Returns the status of the given node
1385 1392
    ///
1386 1393
    /// This function returns the status of the given node.
1387 1394
    /// It is \c true if the given node is enabled (i.e. not hidden).
1388 1395
    bool status(const Node& n) const { return Parent::status(n); }
1389 1396

	
1390 1397
    /// \brief Returns the status of the given edge
1391 1398
    ///
1392 1399
    /// This function returns the status of the given edge.
1393 1400
    /// It is \c true if the given edge is enabled (i.e. not hidden).
1394 1401
    bool status(const Edge& e) const { return Parent::status(e); }
1395 1402

	
1396 1403
    /// \brief Disables the given node
1397 1404
    ///
1398 1405
    /// This function disables the given node in the subdigraph,
1399 1406
    /// so the iteration jumps over it.
1400 1407
    /// It is the same as \ref status() "status(n, false)".
1401 1408
    void disable(const Node& n) const { Parent::status(n, false); }
1402 1409

	
1403 1410
    /// \brief Disables the given edge
1404 1411
    ///
1405 1412
    /// This function disables the given edge in the subgraph,
1406 1413
    /// so the iteration jumps over it.
1407 1414
    /// It is the same as \ref status() "status(e, false)".
1408 1415
    void disable(const Edge& e) const { Parent::status(e, false); }
1409 1416

	
1410 1417
    /// \brief Enables the given node
1411 1418
    ///
1412 1419
    /// This function enables the given node in the subdigraph.
1413 1420
    /// It is the same as \ref status() "status(n, true)".
1414 1421
    void enable(const Node& n) const { Parent::status(n, true); }
1415 1422

	
1416 1423
    /// \brief Enables the given edge
1417 1424
    ///
1418 1425
    /// This function enables the given edge in the subgraph.
1419 1426
    /// It is the same as \ref status() "status(e, true)".
1420 1427
    void enable(const Edge& e) const { Parent::status(e, true); }
1421 1428

	
1422 1429
  };
1423 1430

	
1424 1431
  /// \brief Returns a read-only SubGraph adaptor
1425 1432
  ///
1426 1433
  /// This function just returns a read-only \ref SubGraph adaptor.
1427 1434
  /// \ingroup graph_adaptors
1428 1435
  /// \relates SubGraph
1429 1436
  template<typename GR, typename NF, typename EF>
1430 1437
  SubGraph<const GR, NF, EF>
1431 1438
  subGraph(const GR& graph, NF& node_filter, EF& edge_filter) {
1432 1439
    return SubGraph<const GR, NF, EF>
1433 1440
      (graph, node_filter, edge_filter);
1434 1441
  }
1435 1442

	
1436 1443
  template<typename GR, typename NF, typename EF>
1437 1444
  SubGraph<const GR, const NF, EF>
1438 1445
  subGraph(const GR& graph, const NF& node_filter, EF& edge_filter) {
1439 1446
    return SubGraph<const GR, const NF, EF>
1440 1447
      (graph, node_filter, edge_filter);
1441 1448
  }
1442 1449

	
1443 1450
  template<typename GR, typename NF, typename EF>
1444 1451
  SubGraph<const GR, NF, const EF>
1445 1452
  subGraph(const GR& graph, NF& node_filter, const EF& edge_filter) {
1446 1453
    return SubGraph<const GR, NF, const EF>
1447 1454
      (graph, node_filter, edge_filter);
1448 1455
  }
1449 1456

	
1450 1457
  template<typename GR, typename NF, typename EF>
1451 1458
  SubGraph<const GR, const NF, const EF>
1452 1459
  subGraph(const GR& graph, const NF& node_filter, const EF& edge_filter) {
1453 1460
    return SubGraph<const GR, const NF, const EF>
1454 1461
      (graph, node_filter, edge_filter);
1455 1462
  }
1456 1463

	
1457 1464

	
1458 1465
  /// \ingroup graph_adaptors
1459 1466
  ///
1460 1467
  /// \brief Adaptor class for hiding nodes in a digraph or a graph.
1461 1468
  ///
1462 1469
  /// FilterNodes adaptor can be used for hiding nodes in a digraph or a
1463 1470
  /// graph. A \c bool node map must be specified, which defines the filter
1464 1471
  /// for the nodes. Only the nodes with \c true filter value and the
1465 1472
  /// arcs/edges incident to nodes both with \c true filter value are shown
1466 1473
  /// in the subgraph. This adaptor conforms to the \ref concepts::Digraph
1467 1474
  /// "Digraph" concept or the \ref concepts::Graph "Graph" concept
1468 1475
  /// depending on the \c GR template parameter.
1469 1476
  ///
1470 1477
  /// The adapted (di)graph can also be modified through this adaptor
1471 1478
  /// by adding or removing nodes or arcs/edges, unless the \c GR template
1472 1479
  /// parameter is set to be \c const.
1473 1480
  ///
1481
  /// This class provides only linear time item counting.
1482
  ///
1474 1483
  /// \tparam GR The type of the adapted digraph or graph.
1475 1484
  /// It must conform to the \ref concepts::Digraph "Digraph" concept
1476 1485
  /// or the \ref concepts::Graph "Graph" concept.
1477 1486
  /// It can also be specified to be \c const.
1478 1487
  /// \tparam NF The type of the node filter map.
1479 1488
  /// It must be a \c bool (or convertible) node map of the
1480 1489
  /// adapted (di)graph. The default type is
1481 1490
  /// \ref concepts::Graph::NodeMap "GR::NodeMap<bool>".
1482 1491
  ///
1483 1492
  /// \note The \c Node and <tt>Arc/Edge</tt> types of this adaptor and the
1484 1493
  /// adapted (di)graph are convertible to each other.
1485 1494
#ifdef DOXYGEN
1486 1495
  template<typename GR, typename NF>
1487 1496
  class FilterNodes {
1488 1497
#else
1489 1498
  template<typename GR,
1490 1499
           typename NF = typename GR::template NodeMap<bool>,
1491 1500
           typename Enable = void>
1492 1501
  class FilterNodes :
1493 1502
    public DigraphAdaptorExtender<
1494 1503
      SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >,
1495 1504
                     true> > {
1496 1505
#endif
1497 1506
    typedef DigraphAdaptorExtender<
1498 1507
      SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >, 
1499 1508
                     true> > Parent;
1500 1509

	
1501 1510
  public:
1502 1511

	
1503 1512
    typedef GR Digraph;
1504 1513
    typedef NF NodeFilterMap;
1505 1514

	
1506 1515
    typedef typename Parent::Node Node;
1507 1516

	
1508 1517
  protected:
1509 1518
    ConstMap<typename Digraph::Arc, Const<bool, true> > const_true_map;
1510 1519

	
1511 1520
    FilterNodes() : const_true_map() {}
1512 1521

	
1513 1522
  public:
1514 1523

	
1515 1524
    /// \brief Constructor
1516 1525
    ///
1517 1526
    /// Creates a subgraph for the given digraph or graph with the
1518 1527
    /// given node filter map.
1519 1528
    FilterNodes(GR& graph, NF& node_filter) 
1520 1529
      : Parent(), const_true_map()
1521 1530
    {
1522 1531
      Parent::initialize(graph, node_filter, const_true_map);
1523 1532
    }
1524 1533

	
1525 1534
    /// \brief Sets the status of the given node
1526 1535
    ///
1527 1536
    /// This function sets the status of the given node.
1528 1537
    /// It is done by simply setting the assigned value of \c n
1529 1538
    /// to \c v in the node filter map.
1530 1539
    void status(const Node& n, bool v) const { Parent::status(n, v); }
1531 1540

	
1532 1541
    /// \brief Returns the status of the given node
1533 1542
    ///
1534 1543
    /// This function returns the status of the given node.
1535 1544
    /// It is \c true if the given node is enabled (i.e. not hidden).
1536 1545
    bool status(const Node& n) const { return Parent::status(n); }
1537 1546

	
1538 1547
    /// \brief Disables the given node
1539 1548
    ///
1540 1549
    /// This function disables the given node, so the iteration
1541 1550
    /// jumps over it.
1542 1551
    /// It is the same as \ref status() "status(n, false)".
1543 1552
    void disable(const Node& n) const { Parent::status(n, false); }
1544 1553

	
1545 1554
    /// \brief Enables the given node
1546 1555
    ///
1547 1556
    /// This function enables the given node.
1548 1557
    /// It is the same as \ref status() "status(n, true)".
1549 1558
    void enable(const Node& n) const { Parent::status(n, true); }
1550 1559

	
1551 1560
  };
1552 1561

	
1553 1562
  template<typename GR, typename NF>
1554 1563
  class FilterNodes<GR, NF,
1555 1564
                    typename enable_if<UndirectedTagIndicator<GR> >::type> :
1556 1565
    public GraphAdaptorExtender<
1557 1566
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, 
1558 1567
                   true> > {
1559 1568

	
1560 1569
    typedef GraphAdaptorExtender<
1561 1570
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, 
1562 1571
                   true> > Parent;
1563 1572

	
1564 1573
  public:
1565 1574

	
1566 1575
    typedef GR Graph;
1567 1576
    typedef NF NodeFilterMap;
1568 1577

	
1569 1578
    typedef typename Parent::Node Node;
1570 1579

	
1571 1580
  protected:
1572 1581
    ConstMap<typename GR::Edge, Const<bool, true> > const_true_map;
1573 1582

	
1574 1583
    FilterNodes() : const_true_map() {}
1575 1584

	
1576 1585
  public:
1577 1586

	
1578 1587
    FilterNodes(GR& graph, NodeFilterMap& node_filter) :
1579 1588
      Parent(), const_true_map() {
1580 1589
      Parent::initialize(graph, node_filter, const_true_map);
1581 1590
    }
1582 1591

	
1583 1592
    void status(const Node& n, bool v) const { Parent::status(n, v); }
1584 1593
    bool status(const Node& n) const { return Parent::status(n); }
1585 1594
    void disable(const Node& n) const { Parent::status(n, false); }
1586 1595
    void enable(const Node& n) const { Parent::status(n, true); }
1587 1596

	
1588 1597
  };
1589 1598

	
1590 1599

	
1591 1600
  /// \brief Returns a read-only FilterNodes adaptor
1592 1601
  ///
1593 1602
  /// This function just returns a read-only \ref FilterNodes adaptor.
1594 1603
  /// \ingroup graph_adaptors
1595 1604
  /// \relates FilterNodes
1596 1605
  template<typename GR, typename NF>
1597 1606
  FilterNodes<const GR, NF>
1598 1607
  filterNodes(const GR& graph, NF& node_filter) {
1599 1608
    return FilterNodes<const GR, NF>(graph, node_filter);
1600 1609
  }
1601 1610

	
1602 1611
  template<typename GR, typename NF>
1603 1612
  FilterNodes<const GR, const NF>
1604 1613
  filterNodes(const GR& graph, const NF& node_filter) {
1605 1614
    return FilterNodes<const GR, const NF>(graph, node_filter);
1606 1615
  }
1607 1616

	
1608 1617
  /// \ingroup graph_adaptors
1609 1618
  ///
1610 1619
  /// \brief Adaptor class for hiding arcs in a digraph.
1611 1620
  ///
1612 1621
  /// FilterArcs adaptor can be used for hiding arcs in a digraph.
1613 1622
  /// A \c bool arc map must be specified, which defines the filter for
1614 1623
  /// the arcs. Only the arcs with \c true filter value are shown in the
1615 1624
  /// subdigraph. This adaptor conforms to the \ref concepts::Digraph
1616 1625
  /// "Digraph" concept.
1617 1626
  ///
1618 1627
  /// The adapted digraph can also be modified through this adaptor
1619 1628
  /// by adding or removing nodes or arcs, unless the \c GR template
1620 1629
  /// parameter is set to be \c const.
1621 1630
  ///
1631
  /// This class provides only linear time counting for nodes and arcs.
1632
  ///
1622 1633
  /// \tparam DGR The type of the adapted digraph.
1623 1634
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
1624 1635
  /// It can also be specified to be \c const.
1625 1636
  /// \tparam AF The type of the arc filter map.
1626 1637
  /// It must be a \c bool (or convertible) arc map of the
1627 1638
  /// adapted digraph. The default type is
1628 1639
  /// \ref concepts::Digraph::ArcMap "DGR::ArcMap<bool>".
1629 1640
  ///
1630 1641
  /// \note The \c Node and \c Arc types of this adaptor and the adapted
1631 1642
  /// digraph are convertible to each other.
1632 1643
#ifdef DOXYGEN
1633 1644
  template<typename DGR,
1634 1645
           typename AF>
1635 1646
  class FilterArcs {
1636 1647
#else
1637 1648
  template<typename DGR,
1638 1649
           typename AF = typename DGR::template ArcMap<bool> >
1639 1650
  class FilterArcs :
1640 1651
    public DigraphAdaptorExtender<
1641 1652
      SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >,
1642 1653
                     AF, false> > {
1643 1654
#endif
1644 1655
    typedef DigraphAdaptorExtender<
1645 1656
      SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >, 
1646 1657
                     AF, false> > Parent;
1647 1658

	
1648 1659
  public:
1649 1660

	
1650 1661
    /// The type of the adapted digraph.
1651 1662
    typedef DGR Digraph;
1652 1663
    /// The type of the arc filter map.
1653 1664
    typedef AF ArcFilterMap;
1654 1665

	
1655 1666
    typedef typename Parent::Arc Arc;
1656 1667

	
1657 1668
  protected:
1658 1669
    ConstMap<typename DGR::Node, Const<bool, true> > const_true_map;
1659 1670

	
1660 1671
    FilterArcs() : const_true_map() {}
1661 1672

	
1662 1673
  public:
1663 1674

	
1664 1675
    /// \brief Constructor
1665 1676
    ///
1666 1677
    /// Creates a subdigraph for the given digraph with the given arc
1667 1678
    /// filter map.
1668 1679
    FilterArcs(DGR& digraph, ArcFilterMap& arc_filter)
1669 1680
      : Parent(), const_true_map() {
1670 1681
      Parent::initialize(digraph, const_true_map, arc_filter);
1671 1682
    }
1672 1683

	
1673 1684
    /// \brief Sets the status of the given arc
1674 1685
    ///
1675 1686
    /// This function sets the status of the given arc.
1676 1687
    /// It is done by simply setting the assigned value of \c a
1677 1688
    /// to \c v in the arc filter map.
1678 1689
    void status(const Arc& a, bool v) const { Parent::status(a, v); }
1679 1690

	
1680 1691
    /// \brief Returns the status of the given arc
1681 1692
    ///
1682 1693
    /// This function returns the status of the given arc.
1683 1694
    /// It is \c true if the given arc is enabled (i.e. not hidden).
1684 1695
    bool status(const Arc& a) const { return Parent::status(a); }
1685 1696

	
1686 1697
    /// \brief Disables the given arc
1687 1698
    ///
1688 1699
    /// This function disables the given arc in the subdigraph,
1689 1700
    /// so the iteration jumps over it.
1690 1701
    /// It is the same as \ref status() "status(a, false)".
1691 1702
    void disable(const Arc& a) const { Parent::status(a, false); }
1692 1703

	
1693 1704
    /// \brief Enables the given arc
1694 1705
    ///
1695 1706
    /// This function enables the given arc in the subdigraph.
1696 1707
    /// It is the same as \ref status() "status(a, true)".
1697 1708
    void enable(const Arc& a) const { Parent::status(a, true); }
1698 1709

	
1699 1710
  };
1700 1711

	
1701 1712
  /// \brief Returns a read-only FilterArcs adaptor
1702 1713
  ///
1703 1714
  /// This function just returns a read-only \ref FilterArcs adaptor.
1704 1715
  /// \ingroup graph_adaptors
1705 1716
  /// \relates FilterArcs
1706 1717
  template<typename DGR, typename AF>
1707 1718
  FilterArcs<const DGR, AF>
1708 1719
  filterArcs(const DGR& digraph, AF& arc_filter) {
1709 1720
    return FilterArcs<const DGR, AF>(digraph, arc_filter);
1710 1721
  }
1711 1722

	
1712 1723
  template<typename DGR, typename AF>
1713 1724
  FilterArcs<const DGR, const AF>
1714 1725
  filterArcs(const DGR& digraph, const AF& arc_filter) {
1715 1726
    return FilterArcs<const DGR, const AF>(digraph, arc_filter);
1716 1727
  }
1717 1728

	
1718 1729
  /// \ingroup graph_adaptors
1719 1730
  ///
1720 1731
  /// \brief Adaptor class for hiding edges in a graph.
1721 1732
  ///
1722 1733
  /// FilterEdges adaptor can be used for hiding edges in a graph.
1723 1734
  /// A \c bool edge map must be specified, which defines the filter for
1724 1735
  /// the edges. Only the edges with \c true filter value are shown in the
1725 1736
  /// subgraph. This adaptor conforms to the \ref concepts::Graph
1726 1737
  /// "Graph" concept.
1727 1738
  ///
1728 1739
  /// The adapted graph can also be modified through this adaptor
1729 1740
  /// by adding or removing nodes or edges, unless the \c GR template
1730 1741
  /// parameter is set to be \c const.
1731 1742
  ///
1743
  /// This class provides only linear time counting for nodes, edges and arcs.
1744
  ///
1732 1745
  /// \tparam GR The type of the adapted graph.
1733 1746
  /// It must conform to the \ref concepts::Graph "Graph" concept.
1734 1747
  /// It can also be specified to be \c const.
1735 1748
  /// \tparam EF The type of the edge filter map.
1736 1749
  /// It must be a \c bool (or convertible) edge map of the
1737 1750
  /// adapted graph. The default type is
1738 1751
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<bool>".
1739 1752
  ///
1740 1753
  /// \note The \c Node, \c Edge and \c Arc types of this adaptor and the
1741 1754
  /// adapted graph are convertible to each other.
1742 1755
#ifdef DOXYGEN
1743 1756
  template<typename GR,
1744 1757
           typename EF>
1745 1758
  class FilterEdges {
1746 1759
#else
1747 1760
  template<typename GR,
1748 1761
           typename EF = typename GR::template EdgeMap<bool> >
1749 1762
  class FilterEdges :
1750 1763
    public GraphAdaptorExtender<
1751 1764
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >, 
1752 1765
                   EF, false> > {
1753 1766
#endif
1754 1767
    typedef GraphAdaptorExtender<
1755 1768
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >, 
1756 1769
                   EF, false> > Parent;
1757 1770

	
1758 1771
  public:
1759 1772

	
1760 1773
    /// The type of the adapted graph.
1761 1774
    typedef GR Graph;
1762 1775
    /// The type of the edge filter map.
1763 1776
    typedef EF EdgeFilterMap;
1764 1777

	
1765 1778
    typedef typename Parent::Edge Edge;
1766 1779

	
1767 1780
  protected:
1768 1781
    ConstMap<typename GR::Node, Const<bool, true> > const_true_map;
1769 1782

	
1770 1783
    FilterEdges() : const_true_map(true) {
1771 1784
      Parent::setNodeFilterMap(const_true_map);
1772 1785
    }
1773 1786

	
1774 1787
  public:
1775 1788

	
1776 1789
    /// \brief Constructor
1777 1790
    ///
1778 1791
    /// Creates a subgraph for the given graph with the given edge
1779 1792
    /// filter map.
1780 1793
    FilterEdges(GR& graph, EF& edge_filter) 
1781 1794
      : Parent(), const_true_map() {
1782 1795
      Parent::initialize(graph, const_true_map, edge_filter);
1783 1796
    }
1784 1797

	
1785 1798
    /// \brief Sets the status of the given edge
1786 1799
    ///
1787 1800
    /// This function sets the status of the given edge.
1788 1801
    /// It is done by simply setting the assigned value of \c e
1789 1802
    /// to \c v in the edge filter map.
1790 1803
    void status(const Edge& e, bool v) const { Parent::status(e, v); }
1791 1804

	
1792 1805
    /// \brief Returns the status of the given edge
1793 1806
    ///
1794 1807
    /// This function returns the status of the given edge.
1795 1808
    /// It is \c true if the given edge is enabled (i.e. not hidden).
1796 1809
    bool status(const Edge& e) const { return Parent::status(e); }
1797 1810

	
1798 1811
    /// \brief Disables the given edge
1799 1812
    ///
1800 1813
    /// This function disables the given edge in the subgraph,
1801 1814
    /// so the iteration jumps over it.
1802 1815
    /// It is the same as \ref status() "status(e, false)".
1803 1816
    void disable(const Edge& e) const { Parent::status(e, false); }
1804 1817

	
1805 1818
    /// \brief Enables the given edge
1806 1819
    ///
1807 1820
    /// This function enables the given edge in the subgraph.
1808 1821
    /// It is the same as \ref status() "status(e, true)".
1809 1822
    void enable(const Edge& e) const { Parent::status(e, true); }
1810 1823

	
1811 1824
  };
1812 1825

	
1813 1826
  /// \brief Returns a read-only FilterEdges adaptor
1814 1827
  ///
1815 1828
  /// This function just returns a read-only \ref FilterEdges adaptor.
1816 1829
  /// \ingroup graph_adaptors
1817 1830
  /// \relates FilterEdges
1818 1831
  template<typename GR, typename EF>
1819 1832
  FilterEdges<const GR, EF>
1820 1833
  filterEdges(const GR& graph, EF& edge_filter) {
1821 1834
    return FilterEdges<const GR, EF>(graph, edge_filter);
1822 1835
  }
1823 1836

	
1824 1837
  template<typename GR, typename EF>
1825 1838
  FilterEdges<const GR, const EF>
1826 1839
  filterEdges(const GR& graph, const EF& edge_filter) {
1827 1840
    return FilterEdges<const GR, const EF>(graph, edge_filter);
1828 1841
  }
1829 1842

	
1830 1843

	
1831 1844
  template <typename DGR>
1832 1845
  class UndirectorBase {
1833 1846
  public:
1834 1847
    typedef DGR Digraph;
1835 1848
    typedef UndirectorBase Adaptor;
1836 1849

	
1837 1850
    typedef True UndirectedTag;
1838 1851

	
1839 1852
    typedef typename Digraph::Arc Edge;
1840 1853
    typedef typename Digraph::Node Node;
1841 1854

	
1842 1855
    class Arc {
1843 1856
      friend class UndirectorBase;
1844 1857
    protected:
1845 1858
      Edge _edge;
1846 1859
      bool _forward;
1847 1860

	
1848 1861
      Arc(const Edge& edge, bool forward) 
1849 1862
        : _edge(edge), _forward(forward) {}
1850 1863

	
1851 1864
    public:
1852 1865
      Arc() {}
1853 1866

	
1854 1867
      Arc(Invalid) : _edge(INVALID), _forward(true) {}
1855 1868

	
1856 1869
      operator const Edge&() const { return _edge; }
1857 1870

	
1858 1871
      bool operator==(const Arc &other) const {
1859 1872
        return _forward == other._forward && _edge == other._edge;
... ...
@@ -2107,256 +2120,259 @@
2107 2120
      ReturnValue operator[](const Arc& a) {
2108 2121
        if (direction(a)) {
2109 2122
          return _forward[a];
2110 2123
        } else {
2111 2124
          return _backward[a];
2112 2125
        }
2113 2126
      }
2114 2127

	
2115 2128
    protected:
2116 2129

	
2117 2130
      MapImpl _forward, _backward;
2118 2131

	
2119 2132
    };
2120 2133

	
2121 2134
  public:
2122 2135

	
2123 2136
    template <typename V>
2124 2137
    class NodeMap : public DGR::template NodeMap<V> {
2125 2138
      typedef typename DGR::template NodeMap<V> Parent;
2126 2139

	
2127 2140
    public:
2128 2141
      typedef V Value;
2129 2142

	
2130 2143
      explicit NodeMap(const UndirectorBase<DGR>& adaptor)
2131 2144
        : Parent(*adaptor._digraph) {}
2132 2145

	
2133 2146
      NodeMap(const UndirectorBase<DGR>& adaptor, const V& value)
2134 2147
        : Parent(*adaptor._digraph, value) { }
2135 2148

	
2136 2149
    private:
2137 2150
      NodeMap& operator=(const NodeMap& cmap) {
2138 2151
        return operator=<NodeMap>(cmap);
2139 2152
      }
2140 2153

	
2141 2154
      template <typename CMap>
2142 2155
      NodeMap& operator=(const CMap& cmap) {
2143 2156
        Parent::operator=(cmap);
2144 2157
        return *this;
2145 2158
      }
2146 2159

	
2147 2160
    };
2148 2161

	
2149 2162
    template <typename V>
2150 2163
    class ArcMap
2151 2164
      : public SubMapExtender<UndirectorBase<DGR>, ArcMapBase<V> > {
2152 2165
      typedef SubMapExtender<UndirectorBase<DGR>, ArcMapBase<V> > Parent;
2153 2166

	
2154 2167
    public:
2155 2168
      typedef V Value;
2156 2169

	
2157 2170
      explicit ArcMap(const UndirectorBase<DGR>& adaptor)
2158 2171
        : Parent(adaptor) {}
2159 2172

	
2160 2173
      ArcMap(const UndirectorBase<DGR>& adaptor, const V& value)
2161 2174
        : Parent(adaptor, value) {}
2162 2175

	
2163 2176
    private:
2164 2177
      ArcMap& operator=(const ArcMap& cmap) {
2165 2178
        return operator=<ArcMap>(cmap);
2166 2179
      }
2167 2180

	
2168 2181
      template <typename CMap>
2169 2182
      ArcMap& operator=(const CMap& cmap) {
2170 2183
        Parent::operator=(cmap);
2171 2184
        return *this;
2172 2185
      }
2173 2186
    };
2174 2187

	
2175 2188
    template <typename V>
2176 2189
    class EdgeMap : public Digraph::template ArcMap<V> {
2177 2190
      typedef typename Digraph::template ArcMap<V> Parent;
2178 2191

	
2179 2192
    public:
2180 2193
      typedef V Value;
2181 2194

	
2182 2195
      explicit EdgeMap(const UndirectorBase<DGR>& adaptor)
2183 2196
        : Parent(*adaptor._digraph) {}
2184 2197

	
2185 2198
      EdgeMap(const UndirectorBase<DGR>& adaptor, const V& value)
2186 2199
        : Parent(*adaptor._digraph, value) {}
2187 2200

	
2188 2201
    private:
2189 2202
      EdgeMap& operator=(const EdgeMap& cmap) {
2190 2203
        return operator=<EdgeMap>(cmap);
2191 2204
      }
2192 2205

	
2193 2206
      template <typename CMap>
2194 2207
      EdgeMap& operator=(const CMap& cmap) {
2195 2208
        Parent::operator=(cmap);
2196 2209
        return *this;
2197 2210
      }
2198 2211

	
2199 2212
    };
2200 2213

	
2201 2214
    typedef typename ItemSetTraits<DGR, Node>::ItemNotifier NodeNotifier;
2202 2215
    NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
2203 2216

	
2204 2217
    typedef typename ItemSetTraits<DGR, Edge>::ItemNotifier EdgeNotifier;
2205 2218
    EdgeNotifier& notifier(Edge) const { return _digraph->notifier(Edge()); }
2206 2219
    
2207 2220
    typedef EdgeNotifier ArcNotifier;
2208 2221
    ArcNotifier& notifier(Arc) const { return _digraph->notifier(Edge()); }
2209 2222

	
2210 2223
  protected:
2211 2224

	
2212 2225
    UndirectorBase() : _digraph(0) {}
2213 2226

	
2214 2227
    DGR* _digraph;
2215 2228

	
2216 2229
    void initialize(DGR& digraph) {
2217 2230
      _digraph = &digraph;
2218 2231
    }
2219 2232

	
2220 2233
  };
2221 2234

	
2222 2235
  /// \ingroup graph_adaptors
2223 2236
  ///
2224 2237
  /// \brief Adaptor class for viewing a digraph as an undirected graph.
2225 2238
  ///
2226 2239
  /// Undirector adaptor can be used for viewing a digraph as an undirected
2227 2240
  /// graph. All arcs of the underlying digraph are showed in the
2228 2241
  /// adaptor as an edge (and also as a pair of arcs, of course).
2229 2242
  /// This adaptor conforms to the \ref concepts::Graph "Graph" concept.
2230 2243
  ///
2231 2244
  /// The adapted digraph can also be modified through this adaptor
2232 2245
  /// by adding or removing nodes or edges, unless the \c GR template
2233 2246
  /// parameter is set to be \c const.
2234 2247
  ///
2248
  /// This class provides item counting in the same time as the adapted
2249
  /// digraph structure.
2250
  ///
2235 2251
  /// \tparam DGR The type of the adapted digraph.
2236 2252
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
2237 2253
  /// It can also be specified to be \c const.
2238 2254
  ///
2239 2255
  /// \note The \c Node type of this adaptor and the adapted digraph are
2240 2256
  /// convertible to each other, moreover the \c Edge type of the adaptor
2241 2257
  /// and the \c Arc type of the adapted digraph are also convertible to
2242 2258
  /// each other.
2243 2259
  /// (Thus the \c Arc type of the adaptor is convertible to the \c Arc type
2244 2260
  /// of the adapted digraph.)
2245 2261
  template<typename DGR>
2246 2262
#ifdef DOXYGEN
2247 2263
  class Undirector {
2248 2264
#else
2249 2265
  class Undirector :
2250 2266
    public GraphAdaptorExtender<UndirectorBase<DGR> > {
2251 2267
#endif
2252 2268
    typedef GraphAdaptorExtender<UndirectorBase<DGR> > Parent;
2253 2269
  public:
2254 2270
    /// The type of the adapted digraph.
2255 2271
    typedef DGR Digraph;
2256 2272
  protected:
2257 2273
    Undirector() { }
2258 2274
  public:
2259 2275

	
2260 2276
    /// \brief Constructor
2261 2277
    ///
2262 2278
    /// Creates an undirected graph from the given digraph.
2263 2279
    Undirector(DGR& digraph) {
2264 2280
      initialize(digraph);
2265 2281
    }
2266 2282

	
2267 2283
    /// \brief Arc map combined from two original arc maps
2268 2284
    ///
2269 2285
    /// This map adaptor class adapts two arc maps of the underlying
2270 2286
    /// digraph to get an arc map of the undirected graph.
2271 2287
    /// Its value type is inherited from the first arc map type (\c FW).
2272 2288
    /// \tparam FW The type of the "foward" arc map.
2273 2289
    /// \tparam BK The type of the "backward" arc map.
2274 2290
    template <typename FW, typename BK>
2275 2291
    class CombinedArcMap {
2276 2292
    public:
2277 2293

	
2278 2294
      /// The key type of the map
2279 2295
      typedef typename Parent::Arc Key;
2280 2296
      /// The value type of the map
2281 2297
      typedef typename FW::Value Value;
2282 2298

	
2283 2299
      typedef typename MapTraits<FW>::ReferenceMapTag ReferenceMapTag;
2284 2300

	
2285 2301
      typedef typename MapTraits<FW>::ReturnValue ReturnValue;
2286 2302
      typedef typename MapTraits<FW>::ConstReturnValue ConstReturnValue;
2287 2303
      typedef typename MapTraits<FW>::ReturnValue Reference;
2288 2304
      typedef typename MapTraits<FW>::ConstReturnValue ConstReference;
2289 2305

	
2290 2306
      /// Constructor
2291 2307
      CombinedArcMap(FW& forward, BK& backward)
2292 2308
        : _forward(&forward), _backward(&backward) {}
2293 2309

	
2294 2310
      /// Sets the value associated with the given key.
2295 2311
      void set(const Key& e, const Value& a) {
2296 2312
        if (Parent::direction(e)) {
2297 2313
          _forward->set(e, a);
2298 2314
        } else {
2299 2315
          _backward->set(e, a);
2300 2316
        }
2301 2317
      }
2302 2318

	
2303 2319
      /// Returns the value associated with the given key.
2304 2320
      ConstReturnValue operator[](const Key& e) const {
2305 2321
        if (Parent::direction(e)) {
2306 2322
          return (*_forward)[e];
2307 2323
        } else {
2308 2324
          return (*_backward)[e];
2309 2325
        }
2310 2326
      }
2311 2327

	
2312 2328
      /// Returns a reference to the value associated with the given key.
2313 2329
      ReturnValue operator[](const Key& e) {
2314 2330
        if (Parent::direction(e)) {
2315 2331
          return (*_forward)[e];
2316 2332
        } else {
2317 2333
          return (*_backward)[e];
2318 2334
        }
2319 2335
      }
2320 2336

	
2321 2337
    protected:
2322 2338

	
2323 2339
      FW* _forward;
2324 2340
      BK* _backward;
2325 2341

	
2326 2342
    };
2327 2343

	
2328 2344
    /// \brief Returns a combined arc map
2329 2345
    ///
2330 2346
    /// This function just returns a combined arc map.
2331 2347
    template <typename FW, typename BK>
2332 2348
    static CombinedArcMap<FW, BK>
2333 2349
    combinedArcMap(FW& forward, BK& backward) {
2334 2350
      return CombinedArcMap<FW, BK>(forward, backward);
2335 2351
    }
2336 2352

	
2337 2353
    template <typename FW, typename BK>
2338 2354
    static CombinedArcMap<const FW, BK>
2339 2355
    combinedArcMap(const FW& forward, BK& backward) {
2340 2356
      return CombinedArcMap<const FW, BK>(forward, backward);
2341 2357
    }
2342 2358

	
2343 2359
    template <typename FW, typename BK>
2344 2360
    static CombinedArcMap<FW, const BK>
2345 2361
    combinedArcMap(FW& forward, const BK& backward) {
2346 2362
      return CombinedArcMap<FW, const BK>(forward, backward);
2347 2363
    }
2348 2364

	
2349 2365
    template <typename FW, typename BK>
2350 2366
    static CombinedArcMap<const FW, const BK>
2351 2367
    combinedArcMap(const FW& forward, const BK& backward) {
2352 2368
      return CombinedArcMap<const FW, const BK>(forward, backward);
2353 2369
    }
2354 2370

	
2355 2371
  };
2356 2372

	
2357 2373
  /// \brief Returns a read-only Undirector adaptor
2358 2374
  ///
2359 2375
  /// This function just returns a read-only \ref Undirector adaptor.
2360 2376
  /// \ingroup graph_adaptors
2361 2377
  /// \relates Undirector
2362 2378
  template<typename DGR>
... ...
@@ -2410,399 +2426,404 @@
2410 2426
    }
2411 2427
    Node target(const Arc& e) const {
2412 2428
      return (*_direction)[e] ? _graph->v(e) : _graph->u(e);
2413 2429
    }
2414 2430

	
2415 2431
    typedef NodeNumTagIndicator<Graph> NodeNumTag;
2416 2432
    int nodeNum() const { return _graph->nodeNum(); }
2417 2433

	
2418 2434
    typedef EdgeNumTagIndicator<Graph> ArcNumTag;
2419 2435
    int arcNum() const { return _graph->edgeNum(); }
2420 2436

	
2421 2437
    typedef FindEdgeTagIndicator<Graph> FindArcTag;
2422 2438
    Arc findArc(const Node& u, const Node& v,
2423 2439
                const Arc& prev = INVALID) const {
2424 2440
      Arc arc = _graph->findEdge(u, v, prev);
2425 2441
      while (arc != INVALID && source(arc) != u) {
2426 2442
        arc = _graph->findEdge(u, v, arc);
2427 2443
      }
2428 2444
      return arc;
2429 2445
    }
2430 2446

	
2431 2447
    Node addNode() {
2432 2448
      return Node(_graph->addNode());
2433 2449
    }
2434 2450

	
2435 2451
    Arc addArc(const Node& u, const Node& v) {
2436 2452
      Arc arc = _graph->addEdge(u, v);
2437 2453
      _direction->set(arc, _graph->u(arc) == u);
2438 2454
      return arc;
2439 2455
    }
2440 2456

	
2441 2457
    void erase(const Node& i) { _graph->erase(i); }
2442 2458
    void erase(const Arc& i) { _graph->erase(i); }
2443 2459

	
2444 2460
    void clear() { _graph->clear(); }
2445 2461

	
2446 2462
    int id(const Node& v) const { return _graph->id(v); }
2447 2463
    int id(const Arc& e) const { return _graph->id(e); }
2448 2464

	
2449 2465
    Node nodeFromId(int idx) const { return _graph->nodeFromId(idx); }
2450 2466
    Arc arcFromId(int idx) const { return _graph->edgeFromId(idx); }
2451 2467

	
2452 2468
    int maxNodeId() const { return _graph->maxNodeId(); }
2453 2469
    int maxArcId() const { return _graph->maxEdgeId(); }
2454 2470

	
2455 2471
    typedef typename ItemSetTraits<GR, Node>::ItemNotifier NodeNotifier;
2456 2472
    NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); }
2457 2473

	
2458 2474
    typedef typename ItemSetTraits<GR, Arc>::ItemNotifier ArcNotifier;
2459 2475
    ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); }
2460 2476

	
2461 2477
    template <typename V>
2462 2478
    class NodeMap : public GR::template NodeMap<V> {
2463 2479
      typedef typename GR::template NodeMap<V> Parent;
2464 2480

	
2465 2481
    public:
2466 2482

	
2467 2483
      explicit NodeMap(const OrienterBase<GR, DM>& adapter)
2468 2484
        : Parent(*adapter._graph) {}
2469 2485

	
2470 2486
      NodeMap(const OrienterBase<GR, DM>& adapter, const V& value)
2471 2487
        : Parent(*adapter._graph, value) {}
2472 2488

	
2473 2489
    private:
2474 2490
      NodeMap& operator=(const NodeMap& cmap) {
2475 2491
        return operator=<NodeMap>(cmap);
2476 2492
      }
2477 2493

	
2478 2494
      template <typename CMap>
2479 2495
      NodeMap& operator=(const CMap& cmap) {
2480 2496
        Parent::operator=(cmap);
2481 2497
        return *this;
2482 2498
      }
2483 2499

	
2484 2500
    };
2485 2501

	
2486 2502
    template <typename V>
2487 2503
    class ArcMap : public GR::template EdgeMap<V> {
2488 2504
      typedef typename Graph::template EdgeMap<V> Parent;
2489 2505

	
2490 2506
    public:
2491 2507

	
2492 2508
      explicit ArcMap(const OrienterBase<GR, DM>& adapter)
2493 2509
        : Parent(*adapter._graph) { }
2494 2510

	
2495 2511
      ArcMap(const OrienterBase<GR, DM>& adapter, const V& value)
2496 2512
        : Parent(*adapter._graph, value) { }
2497 2513

	
2498 2514
    private:
2499 2515
      ArcMap& operator=(const ArcMap& cmap) {
2500 2516
        return operator=<ArcMap>(cmap);
2501 2517
      }
2502 2518

	
2503 2519
      template <typename CMap>
2504 2520
      ArcMap& operator=(const CMap& cmap) {
2505 2521
        Parent::operator=(cmap);
2506 2522
        return *this;
2507 2523
      }
2508 2524
    };
2509 2525

	
2510 2526

	
2511 2527

	
2512 2528
  protected:
2513 2529
    Graph* _graph;
2514 2530
    DM* _direction;
2515 2531

	
2516 2532
    void initialize(GR& graph, DM& direction) {
2517 2533
      _graph = &graph;
2518 2534
      _direction = &direction;
2519 2535
    }
2520 2536

	
2521 2537
  };
2522 2538

	
2523 2539
  /// \ingroup graph_adaptors
2524 2540
  ///
2525 2541
  /// \brief Adaptor class for orienting the edges of a graph to get a digraph
2526 2542
  ///
2527 2543
  /// Orienter adaptor can be used for orienting the edges of a graph to
2528 2544
  /// get a digraph. A \c bool edge map of the underlying graph must be
2529 2545
  /// specified, which define the direction of the arcs in the adaptor.
2530 2546
  /// The arcs can be easily reversed by the \c reverseArc() member function
2531 2547
  /// of the adaptor.
2532 2548
  /// This class conforms to the \ref concepts::Digraph "Digraph" concept.
2533 2549
  ///
2534 2550
  /// The adapted graph can also be modified through this adaptor
2535 2551
  /// by adding or removing nodes or arcs, unless the \c GR template
2536 2552
  /// parameter is set to be \c const.
2537 2553
  ///
2554
  /// This class provides item counting in the same time as the adapted
2555
  /// graph structure.
2556
  ///
2538 2557
  /// \tparam GR The type of the adapted graph.
2539 2558
  /// It must conform to the \ref concepts::Graph "Graph" concept.
2540 2559
  /// It can also be specified to be \c const.
2541 2560
  /// \tparam DM The type of the direction map.
2542 2561
  /// It must be a \c bool (or convertible) edge map of the
2543 2562
  /// adapted graph. The default type is
2544 2563
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<bool>".
2545 2564
  ///
2546 2565
  /// \note The \c Node type of this adaptor and the adapted graph are
2547 2566
  /// convertible to each other, moreover the \c Arc type of the adaptor
2548 2567
  /// and the \c Edge type of the adapted graph are also convertible to
2549 2568
  /// each other.
2550 2569
#ifdef DOXYGEN
2551 2570
  template<typename GR,
2552 2571
           typename DM>
2553 2572
  class Orienter {
2554 2573
#else
2555 2574
  template<typename GR,
2556 2575
           typename DM = typename GR::template EdgeMap<bool> >
2557 2576
  class Orienter :
2558 2577
    public DigraphAdaptorExtender<OrienterBase<GR, DM> > {
2559 2578
#endif
2560 2579
    typedef DigraphAdaptorExtender<OrienterBase<GR, DM> > Parent;
2561 2580
  public:
2562 2581

	
2563 2582
    /// The type of the adapted graph.
2564 2583
    typedef GR Graph;
2565 2584
    /// The type of the direction edge map.
2566 2585
    typedef DM DirectionMap;
2567 2586

	
2568 2587
    typedef typename Parent::Arc Arc;
2569 2588

	
2570 2589
  protected:
2571 2590
    Orienter() { }
2572 2591

	
2573 2592
  public:
2574 2593

	
2575 2594
    /// \brief Constructor
2576 2595
    ///
2577 2596
    /// Constructor of the adaptor.
2578 2597
    Orienter(GR& graph, DM& direction) {
2579 2598
      Parent::initialize(graph, direction);
2580 2599
    }
2581 2600

	
2582 2601
    /// \brief Reverses the given arc
2583 2602
    ///
2584 2603
    /// This function reverses the given arc.
2585 2604
    /// It is done by simply negate the assigned value of \c a
2586 2605
    /// in the direction map.
2587 2606
    void reverseArc(const Arc& a) {
2588 2607
      Parent::reverseArc(a);
2589 2608
    }
2590 2609
  };
2591 2610

	
2592 2611
  /// \brief Returns a read-only Orienter adaptor
2593 2612
  ///
2594 2613
  /// This function just returns a read-only \ref Orienter adaptor.
2595 2614
  /// \ingroup graph_adaptors
2596 2615
  /// \relates Orienter
2597 2616
  template<typename GR, typename DM>
2598 2617
  Orienter<const GR, DM>
2599 2618
  orienter(const GR& graph, DM& direction) {
2600 2619
    return Orienter<const GR, DM>(graph, direction);
2601 2620
  }
2602 2621

	
2603 2622
  template<typename GR, typename DM>
2604 2623
  Orienter<const GR, const DM>
2605 2624
  orienter(const GR& graph, const DM& direction) {
2606 2625
    return Orienter<const GR, const DM>(graph, direction);
2607 2626
  }
2608 2627

	
2609 2628
  namespace _adaptor_bits {
2610 2629

	
2611 2630
    template <typename DGR, typename CM, typename FM, typename TL>
2612 2631
    class ResForwardFilter {
2613 2632
    public:
2614 2633

	
2615 2634
      typedef typename DGR::Arc Key;
2616 2635
      typedef bool Value;
2617 2636

	
2618 2637
    private:
2619 2638

	
2620 2639
      const CM* _capacity;
2621 2640
      const FM* _flow;
2622 2641
      TL _tolerance;
2623 2642

	
2624 2643
    public:
2625 2644

	
2626 2645
      ResForwardFilter(const CM& capacity, const FM& flow,
2627 2646
                       const TL& tolerance = TL())
2628 2647
        : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
2629 2648

	
2630 2649
      bool operator[](const typename DGR::Arc& a) const {
2631 2650
        return _tolerance.positive((*_capacity)[a] - (*_flow)[a]);
2632 2651
      }
2633 2652
    };
2634 2653

	
2635 2654
    template<typename DGR,typename CM, typename FM, typename TL>
2636 2655
    class ResBackwardFilter {
2637 2656
    public:
2638 2657

	
2639 2658
      typedef typename DGR::Arc Key;
2640 2659
      typedef bool Value;
2641 2660

	
2642 2661
    private:
2643 2662

	
2644 2663
      const CM* _capacity;
2645 2664
      const FM* _flow;
2646 2665
      TL _tolerance;
2647 2666

	
2648 2667
    public:
2649 2668

	
2650 2669
      ResBackwardFilter(const CM& capacity, const FM& flow,
2651 2670
                        const TL& tolerance = TL())
2652 2671
        : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
2653 2672

	
2654 2673
      bool operator[](const typename DGR::Arc& a) const {
2655 2674
        return _tolerance.positive((*_flow)[a]);
2656 2675
      }
2657 2676
    };
2658 2677

	
2659 2678
  }
2660 2679

	
2661 2680
  /// \ingroup graph_adaptors
2662 2681
  ///
2663 2682
  /// \brief Adaptor class for composing the residual digraph for directed
2664 2683
  /// flow and circulation problems.
2665 2684
  ///
2666 2685
  /// ResidualDigraph can be used for composing the \e residual digraph
2667 2686
  /// for directed flow and circulation problems. Let \f$ G=(V, A) \f$
2668 2687
  /// be a directed graph and let \f$ F \f$ be a number type.
2669 2688
  /// Let \f$ flow, cap: A\to F \f$ be functions on the arcs.
2670 2689
  /// This adaptor implements a digraph structure with node set \f$ V \f$
2671 2690
  /// and arc set \f$ A_{forward}\cup A_{backward} \f$,
2672 2691
  /// where \f$ A_{forward}=\{uv : uv\in A, flow(uv)<cap(uv)\} \f$ and
2673 2692
  /// \f$ A_{backward}=\{vu : uv\in A, flow(uv)>0\} \f$, i.e. the so
2674 2693
  /// called residual digraph.
2675 2694
  /// When the union \f$ A_{forward}\cup A_{backward} \f$ is taken,
2676 2695
  /// multiplicities are counted, i.e. the adaptor has exactly
2677 2696
  /// \f$ |A_{forward}| + |A_{backward}|\f$ arcs (it may have parallel
2678 2697
  /// arcs).
2679 2698
  /// This class conforms to the \ref concepts::Digraph "Digraph" concept.
2680 2699
  ///
2700
  /// This class provides only linear time counting for nodes and arcs.
2701
  ///
2681 2702
  /// \tparam DGR The type of the adapted digraph.
2682 2703
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
2683 2704
  /// It is implicitly \c const.
2684 2705
  /// \tparam CM The type of the capacity map.
2685 2706
  /// It must be an arc map of some numerical type, which defines
2686 2707
  /// the capacities in the flow problem. It is implicitly \c const.
2687 2708
  /// The default type is
2688 2709
  /// \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
2689 2710
  /// \tparam FM The type of the flow map.
2690 2711
  /// It must be an arc map of some numerical type, which defines
2691 2712
  /// the flow values in the flow problem. The default type is \c CM.
2692 2713
  /// \tparam TL The tolerance type for handling inexact computation.
2693 2714
  /// The default tolerance type depends on the value type of the
2694 2715
  /// capacity map.
2695 2716
  ///
2696 2717
  /// \note This adaptor is implemented using Undirector and FilterArcs
2697 2718
  /// adaptors.
2698 2719
  ///
2699 2720
  /// \note The \c Node type of this adaptor and the adapted digraph are
2700 2721
  /// convertible to each other, moreover the \c Arc type of the adaptor
2701 2722
  /// is convertible to the \c Arc type of the adapted digraph.
2702 2723
#ifdef DOXYGEN
2703 2724
  template<typename DGR, typename CM, typename FM, typename TL>
2704 2725
  class ResidualDigraph
2705 2726
#else
2706 2727
  template<typename DGR,
2707 2728
           typename CM = typename DGR::template ArcMap<int>,
2708 2729
           typename FM = CM,
2709 2730
           typename TL = Tolerance<typename CM::Value> >
2710 2731
  class ResidualDigraph 
2711 2732
    : public SubDigraph<
2712 2733
        Undirector<const DGR>,
2713 2734
        ConstMap<typename DGR::Node, Const<bool, true> >,
2714 2735
        typename Undirector<const DGR>::template CombinedArcMap<
2715 2736
          _adaptor_bits::ResForwardFilter<const DGR, CM, FM, TL>,
2716 2737
          _adaptor_bits::ResBackwardFilter<const DGR, CM, FM, TL> > >
2717 2738
#endif
2718 2739
  {
2719 2740
  public:
2720 2741

	
2721 2742
    /// The type of the underlying digraph.
2722 2743
    typedef DGR Digraph;
2723 2744
    /// The type of the capacity map.
2724 2745
    typedef CM CapacityMap;
2725 2746
    /// The type of the flow map.
2726 2747
    typedef FM FlowMap;
2727 2748
    /// The tolerance type.
2728 2749
    typedef TL Tolerance;
2729 2750

	
2730 2751
    typedef typename CapacityMap::Value Value;
2731 2752
    typedef ResidualDigraph Adaptor;
2732 2753

	
2733 2754
  protected:
2734 2755

	
2735 2756
    typedef Undirector<const Digraph> Undirected;
2736 2757

	
2737 2758
    typedef ConstMap<typename DGR::Node, Const<bool, true> > NodeFilter;
2738 2759

	
2739 2760
    typedef _adaptor_bits::ResForwardFilter<const DGR, CM,
2740 2761
                                            FM, TL> ForwardFilter;
2741 2762

	
2742 2763
    typedef _adaptor_bits::ResBackwardFilter<const DGR, CM,
2743 2764
                                             FM, TL> BackwardFilter;
2744 2765

	
2745 2766
    typedef typename Undirected::
2746 2767
      template CombinedArcMap<ForwardFilter, BackwardFilter> ArcFilter;
2747 2768

	
2748 2769
    typedef SubDigraph<Undirected, NodeFilter, ArcFilter> Parent;
2749 2770

	
2750 2771
    const CapacityMap* _capacity;
2751 2772
    FlowMap* _flow;
2752 2773

	
2753 2774
    Undirected _graph;
2754 2775
    NodeFilter _node_filter;
2755 2776
    ForwardFilter _forward_filter;
2756 2777
    BackwardFilter _backward_filter;
2757 2778
    ArcFilter _arc_filter;
2758 2779

	
2759 2780
  public:
2760 2781

	
2761 2782
    /// \brief Constructor
2762 2783
    ///
2763 2784
    /// Constructor of the residual digraph adaptor. The parameters are the
2764 2785
    /// digraph, the capacity map, the flow map, and a tolerance object.
2765 2786
    ResidualDigraph(const DGR& digraph, const CM& capacity,
2766 2787
                    FM& flow, const TL& tolerance = Tolerance())
2767 2788
      : Parent(), _capacity(&capacity), _flow(&flow), 
2768 2789
        _graph(digraph), _node_filter(),
2769 2790
        _forward_filter(capacity, flow, tolerance),
2770 2791
        _backward_filter(capacity, flow, tolerance),
2771 2792
        _arc_filter(_forward_filter, _backward_filter)
2772 2793
    {
2773 2794
      Parent::initialize(_graph, _node_filter, _arc_filter);
2774 2795
    }
2775 2796

	
2776 2797
    typedef typename Parent::Arc Arc;
2777 2798

	
2778 2799
    /// \brief Returns the residual capacity of the given arc.
2779 2800
    ///
2780 2801
    /// Returns the residual capacity of the given arc.
2781 2802
    Value residualCapacity(const Arc& a) const {
2782 2803
      if (Undirected::direction(a)) {
2783 2804
        return (*_capacity)[a] - (*_flow)[a];
2784 2805
      } else {
2785 2806
        return (*_flow)[a];
2786 2807
      }
2787 2808
    }
2788 2809

	
2789 2810
    /// \brief Augments on the given arc in the residual digraph.
2790 2811
    ///
2791 2812
    /// Augments on the given arc in the residual digraph. It increases
2792 2813
    /// or decreases the flow value on the original arc according to the
2793 2814
    /// direction of the residual arc.
2794 2815
    void augment(const Arc& a, const Value& v) const {
2795 2816
      if (Undirected::direction(a)) {
2796 2817
        _flow->set(a, (*_flow)[a] + v);
2797 2818
      } else {
2798 2819
        _flow->set(a, (*_flow)[a] - v);
2799 2820
      }
2800 2821
    }
2801 2822

	
2802 2823
    /// \brief Returns \c true if the given residual arc is a forward arc.
2803 2824
    ///
2804 2825
    /// Returns \c true if the given residual arc has the same orientation
2805 2826
    /// as the original arc, i.e. it is a so called forward arc.
2806 2827
    static bool forward(const Arc& a) {
2807 2828
      return Undirected::direction(a);
2808 2829
    }
... ...
@@ -3200,256 +3221,259 @@
3200 3221
      typedef typename MapTraits<ArcImpl>::ReferenceMapTag ReferenceMapTag;
3201 3222
      typedef typename MapTraits<ArcImpl>::ReturnValue ReturnValue;
3202 3223
      typedef typename MapTraits<ArcImpl>::ConstReturnValue ConstReturnValue;
3203 3224
      typedef typename MapTraits<ArcImpl>::ReturnValue Reference;
3204 3225
      typedef typename MapTraits<ArcImpl>::ConstReturnValue ConstReference;
3205 3226

	
3206 3227
      ArcMapBase(const SplitNodesBase<DGR>& adaptor)
3207 3228
        : _arc_map(*adaptor._digraph), _node_map(*adaptor._digraph) {}
3208 3229
      ArcMapBase(const SplitNodesBase<DGR>& adaptor, const V& value)
3209 3230
        : _arc_map(*adaptor._digraph, value),
3210 3231
          _node_map(*adaptor._digraph, value) {}
3211 3232

	
3212 3233
      void set(const Arc& key, const V& val) {
3213 3234
        if (SplitNodesBase<DGR>::origArc(key)) {
3214 3235
          _arc_map.set(static_cast<const DigraphArc&>(key), val);
3215 3236
        } else {
3216 3237
          _node_map.set(static_cast<const DigraphNode&>(key), val);
3217 3238
        }
3218 3239
      }
3219 3240

	
3220 3241
      ReturnValue operator[](const Arc& key) {
3221 3242
        if (SplitNodesBase<DGR>::origArc(key)) {
3222 3243
          return _arc_map[static_cast<const DigraphArc&>(key)];
3223 3244
        } else {
3224 3245
          return _node_map[static_cast<const DigraphNode&>(key)];
3225 3246
        }
3226 3247
      }
3227 3248

	
3228 3249
      ConstReturnValue operator[](const Arc& key) const {
3229 3250
        if (SplitNodesBase<DGR>::origArc(key)) {
3230 3251
          return _arc_map[static_cast<const DigraphArc&>(key)];
3231 3252
        } else {
3232 3253
          return _node_map[static_cast<const DigraphNode&>(key)];
3233 3254
        }
3234 3255
      }
3235 3256

	
3236 3257
    private:
3237 3258
      ArcImpl _arc_map;
3238 3259
      NodeImpl _node_map;
3239 3260
    };
3240 3261

	
3241 3262
  public:
3242 3263

	
3243 3264
    template <typename V>
3244 3265
    class NodeMap
3245 3266
      : public SubMapExtender<SplitNodesBase<DGR>, NodeMapBase<V> > {
3246 3267
      typedef SubMapExtender<SplitNodesBase<DGR>, NodeMapBase<V> > Parent;
3247 3268

	
3248 3269
    public:
3249 3270
      typedef V Value;
3250 3271

	
3251 3272
      NodeMap(const SplitNodesBase<DGR>& adaptor)
3252 3273
        : Parent(adaptor) {}
3253 3274

	
3254 3275
      NodeMap(const SplitNodesBase<DGR>& adaptor, const V& value)
3255 3276
        : Parent(adaptor, value) {}
3256 3277

	
3257 3278
    private:
3258 3279
      NodeMap& operator=(const NodeMap& cmap) {
3259 3280
        return operator=<NodeMap>(cmap);
3260 3281
      }
3261 3282

	
3262 3283
      template <typename CMap>
3263 3284
      NodeMap& operator=(const CMap& cmap) {
3264 3285
        Parent::operator=(cmap);
3265 3286
        return *this;
3266 3287
      }
3267 3288
    };
3268 3289

	
3269 3290
    template <typename V>
3270 3291
    class ArcMap
3271 3292
      : public SubMapExtender<SplitNodesBase<DGR>, ArcMapBase<V> > {
3272 3293
      typedef SubMapExtender<SplitNodesBase<DGR>, ArcMapBase<V> > Parent;
3273 3294

	
3274 3295
    public:
3275 3296
      typedef V Value;
3276 3297

	
3277 3298
      ArcMap(const SplitNodesBase<DGR>& adaptor)
3278 3299
        : Parent(adaptor) {}
3279 3300

	
3280 3301
      ArcMap(const SplitNodesBase<DGR>& adaptor, const V& value)
3281 3302
        : Parent(adaptor, value) {}
3282 3303

	
3283 3304
    private:
3284 3305
      ArcMap& operator=(const ArcMap& cmap) {
3285 3306
        return operator=<ArcMap>(cmap);
3286 3307
      }
3287 3308

	
3288 3309
      template <typename CMap>
3289 3310
      ArcMap& operator=(const CMap& cmap) {
3290 3311
        Parent::operator=(cmap);
3291 3312
        return *this;
3292 3313
      }
3293 3314
    };
3294 3315

	
3295 3316
  protected:
3296 3317

	
3297 3318
    SplitNodesBase() : _digraph(0) {}
3298 3319

	
3299 3320
    DGR* _digraph;
3300 3321

	
3301 3322
    void initialize(Digraph& digraph) {
3302 3323
      _digraph = &digraph;
3303 3324
    }
3304 3325

	
3305 3326
  };
3306 3327

	
3307 3328
  /// \ingroup graph_adaptors
3308 3329
  ///
3309 3330
  /// \brief Adaptor class for splitting the nodes of a digraph.
3310 3331
  ///
3311 3332
  /// SplitNodes adaptor can be used for splitting each node into an
3312 3333
  /// \e in-node and an \e out-node in a digraph. Formaly, the adaptor
3313 3334
  /// replaces each node \f$ u \f$ in the digraph with two nodes,
3314 3335
  /// namely node \f$ u_{in} \f$ and node \f$ u_{out} \f$.
3315 3336
  /// If there is a \f$ (v, u) \f$ arc in the original digraph, then the
3316 3337
  /// new target of the arc will be \f$ u_{in} \f$ and similarly the
3317 3338
  /// source of each original \f$ (u, v) \f$ arc will be \f$ u_{out} \f$.
3318 3339
  /// The adaptor adds an additional \e bind \e arc from \f$ u_{in} \f$
3319 3340
  /// to \f$ u_{out} \f$ for each node \f$ u \f$ of the original digraph.
3320 3341
  ///
3321 3342
  /// The aim of this class is running an algorithm with respect to node
3322 3343
  /// costs or capacities if the algorithm considers only arc costs or
3323 3344
  /// capacities directly.
3324 3345
  /// In this case you can use \c SplitNodes adaptor, and set the node
3325 3346
  /// costs/capacities of the original digraph to the \e bind \e arcs
3326 3347
  /// in the adaptor.
3327 3348
  ///
3349
  /// This class provides item counting in the same time as the adapted
3350
  /// digraph structure.
3351
  ///
3328 3352
  /// \tparam DGR The type of the adapted digraph.
3329 3353
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
3330 3354
  /// It is implicitly \c const.
3331 3355
  ///
3332 3356
  /// \note The \c Node type of this adaptor is converible to the \c Node
3333 3357
  /// type of the adapted digraph.
3334 3358
  template <typename DGR>
3335 3359
#ifdef DOXYGEN
3336 3360
  class SplitNodes {
3337 3361
#else
3338 3362
  class SplitNodes
3339 3363
    : public DigraphAdaptorExtender<SplitNodesBase<const DGR> > {
3340 3364
#endif
3341 3365
    typedef DigraphAdaptorExtender<SplitNodesBase<const DGR> > Parent;
3342 3366

	
3343 3367
  public:
3344 3368
    typedef DGR Digraph;
3345 3369

	
3346 3370
    typedef typename DGR::Node DigraphNode;
3347 3371
    typedef typename DGR::Arc DigraphArc;
3348 3372

	
3349 3373
    typedef typename Parent::Node Node;
3350 3374
    typedef typename Parent::Arc Arc;
3351 3375

	
3352 3376
    /// \brief Constructor
3353 3377
    ///
3354 3378
    /// Constructor of the adaptor.
3355 3379
    SplitNodes(const DGR& g) {
3356 3380
      Parent::initialize(g);
3357 3381
    }
3358 3382

	
3359 3383
    /// \brief Returns \c true if the given node is an in-node.
3360 3384
    ///
3361 3385
    /// Returns \c true if the given node is an in-node.
3362 3386
    static bool inNode(const Node& n) {
3363 3387
      return Parent::inNode(n);
3364 3388
    }
3365 3389

	
3366 3390
    /// \brief Returns \c true if the given node is an out-node.
3367 3391
    ///
3368 3392
    /// Returns \c true if the given node is an out-node.
3369 3393
    static bool outNode(const Node& n) {
3370 3394
      return Parent::outNode(n);
3371 3395
    }
3372 3396

	
3373 3397
    /// \brief Returns \c true if the given arc is an original arc.
3374 3398
    ///
3375 3399
    /// Returns \c true if the given arc is one of the arcs in the
3376 3400
    /// original digraph.
3377 3401
    static bool origArc(const Arc& a) {
3378 3402
      return Parent::origArc(a);
3379 3403
    }
3380 3404

	
3381 3405
    /// \brief Returns \c true if the given arc is a bind arc.
3382 3406
    ///
3383 3407
    /// Returns \c true if the given arc is a bind arc, i.e. it connects
3384 3408
    /// an in-node and an out-node.
3385 3409
    static bool bindArc(const Arc& a) {
3386 3410
      return Parent::bindArc(a);
3387 3411
    }
3388 3412

	
3389 3413
    /// \brief Returns the in-node created from the given original node.
3390 3414
    ///
3391 3415
    /// Returns the in-node created from the given original node.
3392 3416
    static Node inNode(const DigraphNode& n) {
3393 3417
      return Parent::inNode(n);
3394 3418
    }
3395 3419

	
3396 3420
    /// \brief Returns the out-node created from the given original node.
3397 3421
    ///
3398 3422
    /// Returns the out-node created from the given original node.
3399 3423
    static Node outNode(const DigraphNode& n) {
3400 3424
      return Parent::outNode(n);
3401 3425
    }
3402 3426

	
3403 3427
    /// \brief Returns the bind arc that corresponds to the given
3404 3428
    /// original node.
3405 3429
    ///
3406 3430
    /// Returns the bind arc in the adaptor that corresponds to the given
3407 3431
    /// original node, i.e. the arc connecting the in-node and out-node
3408 3432
    /// of \c n.
3409 3433
    static Arc arc(const DigraphNode& n) {
3410 3434
      return Parent::arc(n);
3411 3435
    }
3412 3436

	
3413 3437
    /// \brief Returns the arc that corresponds to the given original arc.
3414 3438
    ///
3415 3439
    /// Returns the arc in the adaptor that corresponds to the given
3416 3440
    /// original arc.
3417 3441
    static Arc arc(const DigraphArc& a) {
3418 3442
      return Parent::arc(a);
3419 3443
    }
3420 3444

	
3421 3445
    /// \brief Node map combined from two original node maps
3422 3446
    ///
3423 3447
    /// This map adaptor class adapts two node maps of the original digraph
3424 3448
    /// to get a node map of the split digraph.
3425 3449
    /// Its value type is inherited from the first node map type (\c IN).
3426 3450
    /// \tparam IN The type of the node map for the in-nodes. 
3427 3451
    /// \tparam OUT The type of the node map for the out-nodes.
3428 3452
    template <typename IN, typename OUT>
3429 3453
    class CombinedNodeMap {
3430 3454
    public:
3431 3455

	
3432 3456
      /// The key type of the map
3433 3457
      typedef Node Key;
3434 3458
      /// The value type of the map
3435 3459
      typedef typename IN::Value Value;
3436 3460

	
3437 3461
      typedef typename MapTraits<IN>::ReferenceMapTag ReferenceMapTag;
3438 3462
      typedef typename MapTraits<IN>::ReturnValue ReturnValue;
3439 3463
      typedef typename MapTraits<IN>::ConstReturnValue ConstReturnValue;
3440 3464
      typedef typename MapTraits<IN>::ReturnValue Reference;
3441 3465
      typedef typename MapTraits<IN>::ConstReturnValue ConstReference;
3442 3466

	
3443 3467
      /// Constructor
3444 3468
      CombinedNodeMap(IN& in_map, OUT& out_map)
3445 3469
        : _in_map(in_map), _out_map(out_map) {}
3446 3470

	
3447 3471
      /// Returns the value associated with the given key.
3448 3472
      Value operator[](const Key& key) const {
3449 3473
        if (SplitNodesBase<const DGR>::inNode(key)) {
3450 3474
          return _in_map[key];
3451 3475
        } else {
3452 3476
          return _out_map[key];
3453 3477
        }
3454 3478
      }
3455 3479

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

	
19 19
#ifndef LEMON_BELLMAN_FORD_H
20 20
#define LEMON_BELLMAN_FORD_H
21 21

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

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

	
32 33
#include <limits>
33 34

	
34 35
namespace lemon {
35 36

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

	
68 69
  template <typename V>
69 70
  struct BellmanFordDefaultOperationTraits<V, false> {
70 71
    typedef V Value;
71 72
    static Value zero() {
72 73
      return static_cast<Value>(0);
73 74
    }
74 75
    static Value infinity() {
75 76
      return std::numeric_limits<Value>::max();
76 77
    }
77 78
    static Value plus(const Value& left, const Value& right) {
78 79
      if (left == infinity() || right == infinity()) return infinity();
79 80
      return left + right;
80 81
    }
81 82
    static bool less(const Value& left, const Value& right) {
82 83
      return left < right;
83 84
    }
84 85
  };
85 86
  
86 87
  /// \brief Default traits class of BellmanFord class.
87 88
  ///
88 89
  /// Default traits class of BellmanFord class.
89 90
  /// \param GR The type of the digraph.
90 91
  /// \param LEN The type of the length map.
91 92
  template<typename GR, typename LEN>
92 93
  struct BellmanFordDefaultTraits {
93 94
    /// The type of the digraph the algorithm runs on. 
94 95
    typedef GR Digraph;
95 96

	
96 97
    /// \brief The type of the map that stores the arc lengths.
97 98
    ///
98 99
    /// The type of the map that stores the arc lengths.
99 100
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
100 101
    typedef LEN LengthMap;
101 102

	
102 103
    /// The type of the arc lengths.
103 104
    typedef typename LEN::Value Value;
104 105

	
105 106
    /// \brief Operation traits for Bellman-Ford algorithm.
106 107
    ///
107 108
    /// It defines the used operations and the infinity value for the
108 109
    /// given \c Value type.
109 110
    /// \see BellmanFordDefaultOperationTraits
110 111
    typedef BellmanFordDefaultOperationTraits<Value> OperationTraits;
111 112
 
112 113
    /// \brief The type of the map that stores the last arcs of the 
113 114
    /// shortest paths.
114 115
    /// 
115 116
    /// The type of the map that stores the last
116 117
    /// arcs of the shortest paths.
117 118
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
118 119
    typedef typename GR::template NodeMap<typename GR::Arc> PredMap;
119 120

	
120 121
    /// \brief Instantiates a \c PredMap.
121 122
    /// 
122 123
    /// This function instantiates a \ref PredMap. 
123 124
    /// \param g is the digraph to which we would like to define the
124 125
    /// \ref PredMap.
125 126
    static PredMap *createPredMap(const GR& g) {
126 127
      return new PredMap(g);
127 128
    }
128 129

	
129 130
    /// \brief The type of the map that stores the distances of the nodes.
130 131
    ///
131 132
    /// The type of the map that stores the distances of the nodes.
132 133
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
133 134
    typedef typename GR::template NodeMap<typename LEN::Value> DistMap;
134 135

	
135 136
    /// \brief Instantiates a \c DistMap.
136 137
    ///
137 138
    /// This function instantiates a \ref DistMap. 
138 139
    /// \param g is the digraph to which we would like to define the 
139 140
    /// \ref DistMap.
140 141
    static DistMap *createDistMap(const GR& g) {
141 142
      return new DistMap(g);
142 143
    }
143 144

	
144 145
  };
145 146
  
146 147
  /// \brief %BellmanFord algorithm class.
147 148
  ///
148 149
  /// \ingroup shortest_path
149 150
  /// This class provides an efficient implementation of the Bellman-Ford 
150 151
  /// algorithm. The maximum time complexity of the algorithm is
151 152
  /// <tt>O(ne)</tt>.
152 153
  ///
153 154
  /// The Bellman-Ford algorithm solves the single-source shortest path
... ...
@@ -174,257 +175,257 @@
174 175
  template <typename GR, typename LEN, typename TR>
175 176
#else
176 177
  template <typename GR=ListDigraph,
177 178
            typename LEN=typename GR::template ArcMap<int>,
178 179
            typename TR=BellmanFordDefaultTraits<GR,LEN> >
179 180
#endif
180 181
  class BellmanFord {
181 182
  public:
182 183

	
183 184
    ///The type of the underlying digraph.
184 185
    typedef typename TR::Digraph Digraph;
185 186
    
186 187
    /// \brief The type of the arc lengths.
187 188
    typedef typename TR::LengthMap::Value Value;
188 189
    /// \brief The type of the map that stores the arc lengths.
189 190
    typedef typename TR::LengthMap LengthMap;
190 191
    /// \brief The type of the map that stores the last
191 192
    /// arcs of the shortest paths.
192 193
    typedef typename TR::PredMap PredMap;
193 194
    /// \brief The type of the map that stores the distances of the nodes.
194 195
    typedef typename TR::DistMap DistMap;
195 196
    /// The type of the paths.
196 197
    typedef PredMapPath<Digraph, PredMap> Path;
197 198
    ///\brief The \ref BellmanFordDefaultOperationTraits
198 199
    /// "operation traits class" of the algorithm.
199 200
    typedef typename TR::OperationTraits OperationTraits;
200 201

	
201 202
    ///The \ref BellmanFordDefaultTraits "traits class" of the algorithm.
202 203
    typedef TR Traits;
203 204

	
204 205
  private:
205 206

	
206 207
    typedef typename Digraph::Node Node;
207 208
    typedef typename Digraph::NodeIt NodeIt;
208 209
    typedef typename Digraph::Arc Arc;
209 210
    typedef typename Digraph::OutArcIt OutArcIt;
210 211

	
211 212
    // Pointer to the underlying digraph.
212 213
    const Digraph *_gr;
213 214
    // Pointer to the length map
214 215
    const LengthMap *_length;
215 216
    // Pointer to the map of predecessors arcs.
216 217
    PredMap *_pred;
217 218
    // Indicates if _pred is locally allocated (true) or not.
218 219
    bool _local_pred;
219 220
    // Pointer to the map of distances.
220 221
    DistMap *_dist;
221 222
    // Indicates if _dist is locally allocated (true) or not.
222 223
    bool _local_dist;
223 224

	
224 225
    typedef typename Digraph::template NodeMap<bool> MaskMap;
225 226
    MaskMap *_mask;
226 227

	
227 228
    std::vector<Node> _process;
228 229

	
229 230
    // Creates the maps if necessary.
230 231
    void create_maps() {
231 232
      if(!_pred) {
232 233
	_local_pred = true;
233 234
	_pred = Traits::createPredMap(*_gr);
234 235
      }
235 236
      if(!_dist) {
236 237
	_local_dist = true;
237 238
	_dist = Traits::createDistMap(*_gr);
238 239
      }
239 240
      _mask = new MaskMap(*_gr, false);
240 241
    }
241 242
    
242 243
  public :
243 244
 
244 245
    typedef BellmanFord Create;
245 246

	
246 247
    /// \name Named Template Parameters
247 248

	
248 249
    ///@{
249 250

	
250 251
    template <class T>
251 252
    struct SetPredMapTraits : public Traits {
252 253
      typedef T PredMap;
253 254
      static PredMap *createPredMap(const Digraph&) {
254 255
        LEMON_ASSERT(false, "PredMap is not initialized");
255 256
        return 0; // ignore warnings
256 257
      }
257 258
    };
258 259

	
259 260
    /// \brief \ref named-templ-param "Named parameter" for setting
260 261
    /// \c PredMap type.
261 262
    ///
262 263
    /// \ref named-templ-param "Named parameter" for setting
263 264
    /// \c PredMap type.
264 265
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
265 266
    template <class T>
266 267
    struct SetPredMap 
267 268
      : public BellmanFord< Digraph, LengthMap, SetPredMapTraits<T> > {
268 269
      typedef BellmanFord< Digraph, LengthMap, SetPredMapTraits<T> > Create;
269 270
    };
270 271
    
271 272
    template <class T>
272 273
    struct SetDistMapTraits : public Traits {
273 274
      typedef T DistMap;
274 275
      static DistMap *createDistMap(const Digraph&) {
275 276
        LEMON_ASSERT(false, "DistMap is not initialized");
276 277
        return 0; // ignore warnings
277 278
      }
278 279
    };
279 280

	
280 281
    /// \brief \ref named-templ-param "Named parameter" for setting
281 282
    /// \c DistMap type.
282 283
    ///
283 284
    /// \ref named-templ-param "Named parameter" for setting
284 285
    /// \c DistMap type.
285 286
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
286 287
    template <class T>
287 288
    struct SetDistMap 
288 289
      : public BellmanFord< Digraph, LengthMap, SetDistMapTraits<T> > {
289 290
      typedef BellmanFord< Digraph, LengthMap, SetDistMapTraits<T> > Create;
290 291
    };
291 292

	
292 293
    template <class T>
293 294
    struct SetOperationTraitsTraits : public Traits {
294 295
      typedef T OperationTraits;
295 296
    };
296 297
    
297 298
    /// \brief \ref named-templ-param "Named parameter" for setting 
298 299
    /// \c OperationTraits type.
299 300
    ///
300 301
    /// \ref named-templ-param "Named parameter" for setting
301 302
    /// \c OperationTraits type.
302
    /// For more information see \ref BellmanFordDefaultOperationTraits.
303
    /// For more information, see \ref BellmanFordDefaultOperationTraits.
303 304
    template <class T>
304 305
    struct SetOperationTraits
305 306
      : public BellmanFord< Digraph, LengthMap, SetOperationTraitsTraits<T> > {
306 307
      typedef BellmanFord< Digraph, LengthMap, SetOperationTraitsTraits<T> >
307 308
      Create;
308 309
    };
309 310
    
310 311
    ///@}
311 312

	
312 313
  protected:
313 314
    
314 315
    BellmanFord() {}
315 316

	
316 317
  public:      
317 318
    
318 319
    /// \brief Constructor.
319 320
    ///
320 321
    /// Constructor.
321 322
    /// \param g The digraph the algorithm runs on.
322 323
    /// \param length The length map used by the algorithm.
323 324
    BellmanFord(const Digraph& g, const LengthMap& length) :
324 325
      _gr(&g), _length(&length),
325 326
      _pred(0), _local_pred(false),
326 327
      _dist(0), _local_dist(false), _mask(0) {}
327 328
    
328 329
    ///Destructor.
329 330
    ~BellmanFord() {
330 331
      if(_local_pred) delete _pred;
331 332
      if(_local_dist) delete _dist;
332 333
      if(_mask) delete _mask;
333 334
    }
334 335

	
335 336
    /// \brief Sets the length map.
336 337
    ///
337 338
    /// Sets the length map.
338 339
    /// \return <tt>(*this)</tt>
339 340
    BellmanFord &lengthMap(const LengthMap &map) {
340 341
      _length = &map;
341 342
      return *this;
342 343
    }
343 344

	
344 345
    /// \brief Sets the map that stores the predecessor arcs.
345 346
    ///
346 347
    /// Sets the map that stores the predecessor arcs.
347 348
    /// If you don't use this function before calling \ref run()
348 349
    /// or \ref init(), an instance will be allocated automatically.
349 350
    /// The destructor deallocates this automatically allocated map,
350 351
    /// of course.
351 352
    /// \return <tt>(*this)</tt>
352 353
    BellmanFord &predMap(PredMap &map) {
353 354
      if(_local_pred) {
354 355
	delete _pred;
355 356
	_local_pred=false;
356 357
      }
357 358
      _pred = &map;
358 359
      return *this;
359 360
    }
360 361

	
361 362
    /// \brief Sets the map that stores the distances of the nodes.
362 363
    ///
363 364
    /// Sets the map that stores the distances of the nodes calculated
364 365
    /// by the algorithm.
365 366
    /// If you don't use this function before calling \ref run()
366 367
    /// or \ref init(), an instance will be allocated automatically.
367 368
    /// The destructor deallocates this automatically allocated map,
368 369
    /// of course.
369 370
    /// \return <tt>(*this)</tt>
370 371
    BellmanFord &distMap(DistMap &map) {
371 372
      if(_local_dist) {
372 373
	delete _dist;
373 374
	_local_dist=false;
374 375
      }
375 376
      _dist = &map;
376 377
      return *this;
377 378
    }
378 379

	
379 380
    /// \name Execution Control
380 381
    /// The simplest way to execute the Bellman-Ford algorithm is to use
381 382
    /// one of the member functions called \ref run().\n
382 383
    /// If you need better control on the execution, you have to call
383 384
    /// \ref init() first, then you can add several source nodes
384 385
    /// with \ref addSource(). Finally the actual path computation can be
385 386
    /// performed with \ref start(), \ref checkedStart() or
386 387
    /// \ref limitedStart().
387 388

	
388 389
    ///@{
389 390

	
390 391
    /// \brief Initializes the internal data structures.
391 392
    /// 
392 393
    /// Initializes the internal data structures. The optional parameter
393 394
    /// is the initial distance of each node.
394 395
    void init(const Value value = OperationTraits::infinity()) {
395 396
      create_maps();
396 397
      for (NodeIt it(*_gr); it != INVALID; ++it) {
397 398
	_pred->set(it, INVALID);
398 399
	_dist->set(it, value);
399 400
      }
400 401
      _process.clear();
401 402
      if (OperationTraits::less(value, OperationTraits::infinity())) {
402 403
	for (NodeIt it(*_gr); it != INVALID; ++it) {
403 404
	  _process.push_back(it);
404 405
	  _mask->set(it, true);
405 406
	}
406 407
      }
407 408
    }
408 409
    
409 410
    /// \brief Adds a new source node.
410 411
    ///
411 412
    /// This function adds a new source node. The optional second parameter
412 413
    /// is the initial distance of the node.
413 414
    void addSource(Node source, Value dst = OperationTraits::zero()) {
414 415
      _dist->set(source, dst);
415 416
      if (!(*_mask)[source]) {
416 417
	_process.push_back(source);
417 418
	_mask->set(source, true);
418 419
      }
419 420
    }
420 421

	
421 422
    /// \brief Executes one round from the Bellman-Ford algorithm.
422 423
    ///
423 424
    /// If the algoritm calculated the distances in the previous round
424 425
    /// exactly for the paths of at most \c k arcs, then this function
425 426
    /// will calculate the distances exactly for the paths of at most
426 427
    /// <tt>k+1</tt> arcs. Performing \c k iterations using this function
427 428
    /// calculates the shortest path distances exactly for the paths
428 429
    /// consisting of at most \c k arcs.
429 430
    ///
430 431
    /// \warning The paths with limited arc number cannot be retrieved
... ...
@@ -592,315 +593,315 @@
592 593
      addSource(s);
593 594
      start();
594 595
    }
595 596
    
596 597
    /// \brief Runs the algorithm from the given root node with arc
597 598
    /// number limit.
598 599
    ///    
599 600
    /// This method runs the Bellman-Ford algorithm from the given root
600 601
    /// node \c s in order to compute the shortest path distance for each
601 602
    /// node using only the paths consisting of at most \c num arcs.
602 603
    ///
603 604
    /// The algorithm computes
604 605
    /// - the limited distance of each node from the root(s),
605 606
    /// - the predecessor arc for each node.
606 607
    ///
607 608
    /// \warning The paths with limited arc number cannot be retrieved
608 609
    /// easily with \ref path() or \ref predArc() functions. If you also
609 610
    /// need the shortest paths and not only the distances, you should
610 611
    /// store the \ref predMap() "predecessor map" after each iteration
611 612
    /// and build the path manually.
612 613
    ///
613 614
    /// \note bf.run(s, num) is just a shortcut of the following code.
614 615
    /// \code
615 616
    ///   bf.init();
616 617
    ///   bf.addSource(s);
617 618
    ///   bf.limitedStart(num);
618 619
    /// \endcode
619 620
    void run(Node s, int num) {
620 621
      init();
621 622
      addSource(s);
622 623
      limitedStart(num);
623 624
    }
624 625
    
625 626
    ///@}
626 627

	
627 628
    /// \brief LEMON iterator for getting the active nodes.
628 629
    ///
629 630
    /// This class provides a common style LEMON iterator that traverses
630 631
    /// the active nodes of the Bellman-Ford algorithm after the last
631 632
    /// phase. These nodes should be checked in the next phase to
632 633
    /// find augmenting arcs outgoing from them.
633 634
    class ActiveIt {
634 635
    public:
635 636

	
636 637
      /// \brief Constructor.
637 638
      ///
638 639
      /// Constructor for getting the active nodes of the given BellmanFord
639 640
      /// instance. 
640 641
      ActiveIt(const BellmanFord& algorithm) : _algorithm(&algorithm)
641 642
      {
642 643
        _index = _algorithm->_process.size() - 1;
643 644
      }
644 645

	
645 646
      /// \brief Invalid constructor.
646 647
      ///
647 648
      /// Invalid constructor.
648 649
      ActiveIt(Invalid) : _algorithm(0), _index(-1) {}
649 650

	
650 651
      /// \brief Conversion to \c Node.
651 652
      ///
652 653
      /// Conversion to \c Node.
653 654
      operator Node() const { 
654 655
        return _index >= 0 ? _algorithm->_process[_index] : INVALID;
655 656
      }
656 657

	
657 658
      /// \brief Increment operator.
658 659
      ///
659 660
      /// Increment operator.
660 661
      ActiveIt& operator++() {
661 662
        --_index;
662 663
        return *this; 
663 664
      }
664 665

	
665 666
      bool operator==(const ActiveIt& it) const { 
666 667
        return static_cast<Node>(*this) == static_cast<Node>(it); 
667 668
      }
668 669
      bool operator!=(const ActiveIt& it) const { 
669 670
        return static_cast<Node>(*this) != static_cast<Node>(it); 
670 671
      }
671 672
      bool operator<(const ActiveIt& it) const { 
672 673
        return static_cast<Node>(*this) < static_cast<Node>(it); 
673 674
      }
674 675
      
675 676
    private:
676 677
      const BellmanFord* _algorithm;
677 678
      int _index;
678 679
    };
679 680
    
680 681
    /// \name Query Functions
681 682
    /// The result of the Bellman-Ford algorithm can be obtained using these
682 683
    /// functions.\n
683 684
    /// Either \ref run() or \ref init() should be called before using them.
684 685
    
685 686
    ///@{
686 687

	
687 688
    /// \brief The shortest path to the given node.
688 689
    ///    
689 690
    /// Gives back the shortest path to the given node from the root(s).
690 691
    ///
691 692
    /// \warning \c t should be reached from the root(s).
692 693
    ///
693 694
    /// \pre Either \ref run() or \ref init() must be called before
694 695
    /// using this function.
695 696
    Path path(Node t) const
696 697
    {
697 698
      return Path(*_gr, *_pred, t);
698 699
    }
699 700
	  
700 701
    /// \brief The distance of the given node from the root(s).
701 702
    ///
702 703
    /// Returns the distance of the given node from the root(s).
703 704
    ///
704 705
    /// \warning If node \c v is not reached from the root(s), then
705 706
    /// the return value of this function is undefined.
706 707
    ///
707 708
    /// \pre Either \ref run() or \ref init() must be called before
708 709
    /// using this function.
709 710
    Value dist(Node v) const { return (*_dist)[v]; }
710 711

	
711 712
    /// \brief Returns the 'previous arc' of the shortest path tree for
712 713
    /// the given node.
713 714
    ///
714 715
    /// This function returns the 'previous arc' of the shortest path
715 716
    /// tree for node \c v, i.e. it returns the last arc of a
716 717
    /// shortest path from a root to \c v. It is \c INVALID if \c v
717 718
    /// is not reached from the root(s) or if \c v is a root.
718 719
    ///
719 720
    /// The shortest path tree used here is equal to the shortest path
720
    /// tree used in \ref predNode() and \predMap().
721
    /// tree used in \ref predNode() and \ref predMap().
721 722
    ///
722 723
    /// \pre Either \ref run() or \ref init() must be called before
723 724
    /// using this function.
724 725
    Arc predArc(Node v) const { return (*_pred)[v]; }
725 726

	
726 727
    /// \brief Returns the 'previous node' of the shortest path tree for
727 728
    /// the given node.
728 729
    ///
729 730
    /// This function returns the 'previous node' of the shortest path
730 731
    /// tree for node \c v, i.e. it returns the last but one node of
731 732
    /// a shortest path from a root to \c v. It is \c INVALID if \c v
732 733
    /// is not reached from the root(s) or if \c v is a root.
733 734
    ///
734 735
    /// The shortest path tree used here is equal to the shortest path
735
    /// tree used in \ref predArc() and \predMap().
736
    /// tree used in \ref predArc() and \ref predMap().
736 737
    ///
737 738
    /// \pre Either \ref run() or \ref init() must be called before
738 739
    /// using this function.
739 740
    Node predNode(Node v) const { 
740 741
      return (*_pred)[v] == INVALID ? INVALID : _gr->source((*_pred)[v]); 
741 742
    }
742 743
    
743 744
    /// \brief Returns a const reference to the node map that stores the
744 745
    /// distances of the nodes.
745 746
    ///
746 747
    /// Returns a const reference to the node map that stores the distances
747 748
    /// of the nodes calculated by the algorithm.
748 749
    ///
749 750
    /// \pre Either \ref run() or \ref init() must be called before
750 751
    /// using this function.
751 752
    const DistMap &distMap() const { return *_dist;}
752 753
 
753 754
    /// \brief Returns a const reference to the node map that stores the
754 755
    /// predecessor arcs.
755 756
    ///
756 757
    /// Returns a const reference to the node map that stores the predecessor
757 758
    /// arcs, which form the shortest path tree (forest).
758 759
    ///
759 760
    /// \pre Either \ref run() or \ref init() must be called before
760 761
    /// using this function.
761 762
    const PredMap &predMap() const { return *_pred; }
762 763
 
763 764
    /// \brief Checks if a node is reached from the root(s).
764 765
    ///
765 766
    /// Returns \c true if \c v is reached from the root(s).
766 767
    ///
767 768
    /// \pre Either \ref run() or \ref init() must be called before
768 769
    /// using this function.
769 770
    bool reached(Node v) const {
770 771
      return (*_dist)[v] != OperationTraits::infinity();
771 772
    }
772 773

	
773 774
    /// \brief Gives back a negative cycle.
774 775
    ///    
775 776
    /// This function gives back a directed cycle with negative total
776 777
    /// length if the algorithm has already found one.
777 778
    /// Otherwise it gives back an empty path.
778
    lemon::Path<Digraph> negativeCycle() {
779
    lemon::Path<Digraph> negativeCycle() const {
779 780
      typename Digraph::template NodeMap<int> state(*_gr, -1);
780 781
      lemon::Path<Digraph> cycle;
781 782
      for (int i = 0; i < int(_process.size()); ++i) {
782 783
        if (state[_process[i]] != -1) continue;
783 784
        for (Node v = _process[i]; (*_pred)[v] != INVALID;
784 785
             v = _gr->source((*_pred)[v])) {
785 786
          if (state[v] == i) {
786 787
            cycle.addFront((*_pred)[v]);
787 788
            for (Node u = _gr->source((*_pred)[v]); u != v;
788 789
                 u = _gr->source((*_pred)[u])) {
789 790
              cycle.addFront((*_pred)[u]);
790 791
            }
791 792
            return cycle;
792 793
          }
793 794
          else if (state[v] >= 0) {
794 795
            break;
795 796
          }
796 797
          state[v] = i;
797 798
        }
798 799
      }
799 800
      return cycle;
800 801
    }
801 802
    
802 803
    ///@}
803 804
  };
804 805
 
805 806
  /// \brief Default traits class of bellmanFord() function.
806 807
  ///
807 808
  /// Default traits class of bellmanFord() function.
808 809
  /// \tparam GR The type of the digraph.
809 810
  /// \tparam LEN The type of the length map.
810 811
  template <typename GR, typename LEN>
811 812
  struct BellmanFordWizardDefaultTraits {
812 813
    /// The type of the digraph the algorithm runs on. 
813 814
    typedef GR Digraph;
814 815

	
815 816
    /// \brief The type of the map that stores the arc lengths.
816 817
    ///
817 818
    /// The type of the map that stores the arc lengths.
818 819
    /// It must meet the \ref concepts::ReadMap "ReadMap" concept.
819 820
    typedef LEN LengthMap;
820 821

	
821 822
    /// The type of the arc lengths.
822 823
    typedef typename LEN::Value Value;
823 824

	
824 825
    /// \brief Operation traits for Bellman-Ford algorithm.
825 826
    ///
826 827
    /// It defines the used operations and the infinity value for the
827 828
    /// given \c Value type.
828 829
    /// \see BellmanFordDefaultOperationTraits
829 830
    typedef BellmanFordDefaultOperationTraits<Value> OperationTraits;
830 831

	
831 832
    /// \brief The type of the map that stores the last
832 833
    /// arcs of the shortest paths.
833 834
    /// 
834 835
    /// The type of the map that stores the last arcs of the shortest paths.
835 836
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
836 837
    typedef typename GR::template NodeMap<typename GR::Arc> PredMap;
837 838

	
838 839
    /// \brief Instantiates a \c PredMap.
839 840
    /// 
840 841
    /// This function instantiates a \ref PredMap.
841 842
    /// \param g is the digraph to which we would like to define the
842 843
    /// \ref PredMap.
843 844
    static PredMap *createPredMap(const GR &g) {
844 845
      return new PredMap(g);
845 846
    }
846 847

	
847 848
    /// \brief The type of the map that stores the distances of the nodes.
848 849
    ///
849 850
    /// The type of the map that stores the distances of the nodes.
850 851
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
851 852
    typedef typename GR::template NodeMap<Value> DistMap;
852 853

	
853 854
    /// \brief Instantiates a \c DistMap.
854 855
    ///
855 856
    /// This function instantiates a \ref DistMap. 
856 857
    /// \param g is the digraph to which we would like to define the
857 858
    /// \ref DistMap.
858 859
    static DistMap *createDistMap(const GR &g) {
859 860
      return new DistMap(g);
860 861
    }
861 862

	
862 863
    ///The type of the shortest paths.
863 864

	
864 865
    ///The type of the shortest paths.
865 866
    ///It must meet the \ref concepts::Path "Path" concept.
866 867
    typedef lemon::Path<Digraph> Path;
867 868
  };
868 869
  
869 870
  /// \brief Default traits class used by BellmanFordWizard.
870 871
  ///
871 872
  /// Default traits class used by BellmanFordWizard.
872 873
  /// \tparam GR The type of the digraph.
873 874
  /// \tparam LEN The type of the length map.
874 875
  template <typename GR, typename LEN>
875 876
  class BellmanFordWizardBase 
876 877
    : public BellmanFordWizardDefaultTraits<GR, LEN> {
877 878

	
878 879
    typedef BellmanFordWizardDefaultTraits<GR, LEN> Base;
879 880
  protected:
880 881
    // Type of the nodes in the digraph.
881 882
    typedef typename Base::Digraph::Node Node;
882 883

	
883 884
    // Pointer to the underlying digraph.
884 885
    void *_graph;
885 886
    // Pointer to the length map
886 887
    void *_length;
887 888
    // Pointer to the map of predecessors arcs.
888 889
    void *_pred;
889 890
    // Pointer to the map of distances.
890 891
    void *_dist;
891 892
    //Pointer to the shortest path to the target node.
892 893
    void *_path;
893 894
    //Pointer to the distance of the target node.
894 895
    void *_di;
895 896

	
896 897
    public:
897 898
    /// Constructor.
898 899
    
899 900
    /// This constructor does not require parameters, it initiates
900 901
    /// all of the attributes to default values \c 0.
901 902
    BellmanFordWizardBase() :
902 903
      _graph(0), _length(0), _pred(0), _dist(0), _path(0), _di(0) {}
903 904

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

	
19 19
#ifndef LEMON_BFS_H
20 20
#define LEMON_BFS_H
21 21

	
22 22
///\ingroup search
23 23
///\file
24 24
///\brief BFS algorithm.
25 25

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

	
33 33
namespace lemon {
34 34

	
35 35
  ///Default traits class of Bfs class.
36 36

	
37 37
  ///Default traits class of Bfs class.
38 38
  ///\tparam GR Digraph type.
39 39
  template<class GR>
40 40
  struct BfsDefaultTraits
41 41
  {
42 42
    ///The type of the digraph the algorithm runs on.
43 43
    typedef GR Digraph;
44 44

	
45 45
    ///\brief The type of the map that stores the predecessor
46 46
    ///arcs of the shortest paths.
47 47
    ///
48 48
    ///The type of the map that stores the predecessor
49 49
    ///arcs of the shortest paths.
50
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
50
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
51 51
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
52 52
    ///Instantiates a \c PredMap.
53 53

	
54 54
    ///This function instantiates a \ref PredMap.
55 55
    ///\param g is the digraph, to which we would like to define the
56 56
    ///\ref PredMap.
57 57
    static PredMap *createPredMap(const Digraph &g)
58 58
    {
59 59
      return new PredMap(g);
60 60
    }
61 61

	
62 62
    ///The type of the map that indicates which nodes are processed.
63 63

	
64 64
    ///The type of the map that indicates which nodes are processed.
65
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
65
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
66
    ///By default, it is a NullMap.
66 67
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
67 68
    ///Instantiates a \c ProcessedMap.
68 69

	
69 70
    ///This function instantiates a \ref ProcessedMap.
70 71
    ///\param g is the digraph, to which
71 72
    ///we would like to define the \ref ProcessedMap
72 73
#ifdef DOXYGEN
73 74
    static ProcessedMap *createProcessedMap(const Digraph &g)
74 75
#else
75 76
    static ProcessedMap *createProcessedMap(const Digraph &)
76 77
#endif
77 78
    {
78 79
      return new ProcessedMap();
79 80
    }
80 81

	
81 82
    ///The type of the map that indicates which nodes are reached.
82 83

	
83 84
    ///The type of the map that indicates which nodes are reached.
84
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85 86
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
86 87
    ///Instantiates a \c ReachedMap.
87 88

	
88 89
    ///This function instantiates a \ref ReachedMap.
89 90
    ///\param g is the digraph, to which
90 91
    ///we would like to define the \ref ReachedMap.
91 92
    static ReachedMap *createReachedMap(const Digraph &g)
92 93
    {
93 94
      return new ReachedMap(g);
94 95
    }
95 96

	
96 97
    ///The type of the map that stores the distances of the nodes.
97 98

	
98 99
    ///The type of the map that stores the distances of the nodes.
99
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
100
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
100 101
    typedef typename Digraph::template NodeMap<int> DistMap;
101 102
    ///Instantiates a \c DistMap.
102 103

	
103 104
    ///This function instantiates a \ref DistMap.
104 105
    ///\param g is the digraph, to which we would like to define the
105 106
    ///\ref DistMap.
106 107
    static DistMap *createDistMap(const Digraph &g)
107 108
    {
108 109
      return new DistMap(g);
109 110
    }
110 111
  };
111 112

	
112 113
  ///%BFS algorithm class.
113 114

	
114 115
  ///\ingroup search
115 116
  ///This class provides an efficient implementation of the %BFS algorithm.
116 117
  ///
117 118
  ///There is also a \ref bfs() "function-type interface" for the BFS
118 119
  ///algorithm, which is convenient in the simplier cases and it can be
119 120
  ///used easier.
120 121
  ///
121 122
  ///\tparam GR The type of the digraph the algorithm runs on.
122 123
  ///The default type is \ref ListDigraph.
123 124
#ifdef DOXYGEN
124 125
  template <typename GR,
125 126
            typename TR>
126 127
#else
127 128
  template <typename GR=ListDigraph,
128 129
            typename TR=BfsDefaultTraits<GR> >
129 130
#endif
130 131
  class Bfs {
131 132
  public:
132 133

	
133 134
    ///The type of the digraph the algorithm runs on.
134 135
    typedef typename TR::Digraph Digraph;
135 136

	
136 137
    ///\brief The type of the map that stores the predecessor arcs of the
137 138
    ///shortest paths.
138 139
    typedef typename TR::PredMap PredMap;
139 140
    ///The type of the map that stores the distances of the nodes.
140 141
    typedef typename TR::DistMap DistMap;
141 142
    ///The type of the map that indicates which nodes are reached.
142 143
    typedef typename TR::ReachedMap ReachedMap;
143 144
    ///The type of the map that indicates which nodes are processed.
144 145
    typedef typename TR::ProcessedMap ProcessedMap;
145 146
    ///The type of the paths.
146 147
    typedef PredMapPath<Digraph, PredMap> Path;
147 148

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

	
151 152
  private:
152 153

	
153 154
    typedef typename Digraph::Node Node;
154 155
    typedef typename Digraph::NodeIt NodeIt;
155 156
    typedef typename Digraph::Arc Arc;
156 157
    typedef typename Digraph::OutArcIt OutArcIt;
157 158

	
158 159
    //Pointer to the underlying digraph.
159 160
    const Digraph *G;
160 161
    //Pointer to the map of predecessor arcs.
161 162
    PredMap *_pred;
162 163
    //Indicates if _pred is locally allocated (true) or not.
163 164
    bool local_pred;
164 165
    //Pointer to the map of distances.
165 166
    DistMap *_dist;
166 167
    //Indicates if _dist is locally allocated (true) or not.
167 168
    bool local_dist;
168 169
    //Pointer to the map of reached status of the nodes.
169 170
    ReachedMap *_reached;
170 171
    //Indicates if _reached is locally allocated (true) or not.
171 172
    bool local_reached;
172 173
    //Pointer to the map of processed status of the nodes.
173 174
    ProcessedMap *_processed;
174 175
    //Indicates if _processed is locally allocated (true) or not.
175 176
    bool local_processed;
176 177

	
177 178
    std::vector<typename Digraph::Node> _queue;
178 179
    int _queue_head,_queue_tail,_queue_next_dist;
179 180
    int _curr_dist;
180 181

	
181 182
    //Creates the maps if necessary.
182 183
    void create_maps()
183 184
    {
184 185
      if(!_pred) {
185 186
        local_pred = true;
186 187
        _pred = Traits::createPredMap(*G);
187 188
      }
188 189
      if(!_dist) {
189 190
        local_dist = true;
190 191
        _dist = Traits::createDistMap(*G);
191 192
      }
192 193
      if(!_reached) {
193 194
        local_reached = true;
194 195
        _reached = Traits::createReachedMap(*G);
195 196
      }
196 197
      if(!_processed) {
197 198
        local_processed = true;
198 199
        _processed = Traits::createProcessedMap(*G);
199 200
      }
200 201
    }
201 202

	
202 203
  protected:
203 204

	
204 205
    Bfs() {}
205 206

	
206 207
  public:
207 208

	
208 209
    typedef Bfs Create;
209 210

	
210 211
    ///\name Named Template Parameters
211 212

	
212 213
    ///@{
213 214

	
214 215
    template <class T>
215 216
    struct SetPredMapTraits : public Traits {
216 217
      typedef T PredMap;
217 218
      static PredMap *createPredMap(const Digraph &)
218 219
      {
219 220
        LEMON_ASSERT(false, "PredMap is not initialized");
220 221
        return 0; // ignore warnings
221 222
      }
222 223
    };
223 224
    ///\brief \ref named-templ-param "Named parameter" for setting
224 225
    ///\c PredMap type.
225 226
    ///
226 227
    ///\ref named-templ-param "Named parameter" for setting
227 228
    ///\c PredMap type.
228
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
229
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
229 230
    template <class T>
230 231
    struct SetPredMap : public Bfs< Digraph, SetPredMapTraits<T> > {
231 232
      typedef Bfs< Digraph, SetPredMapTraits<T> > Create;
232 233
    };
233 234

	
234 235
    template <class T>
235 236
    struct SetDistMapTraits : public Traits {
236 237
      typedef T DistMap;
237 238
      static DistMap *createDistMap(const Digraph &)
238 239
      {
239 240
        LEMON_ASSERT(false, "DistMap is not initialized");
240 241
        return 0; // ignore warnings
241 242
      }
242 243
    };
243 244
    ///\brief \ref named-templ-param "Named parameter" for setting
244 245
    ///\c DistMap type.
245 246
    ///
246 247
    ///\ref named-templ-param "Named parameter" for setting
247 248
    ///\c DistMap type.
248
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
249
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
249 250
    template <class T>
250 251
    struct SetDistMap : public Bfs< Digraph, SetDistMapTraits<T> > {
251 252
      typedef Bfs< Digraph, SetDistMapTraits<T> > Create;
252 253
    };
253 254

	
254 255
    template <class T>
255 256
    struct SetReachedMapTraits : public Traits {
256 257
      typedef T ReachedMap;
257 258
      static ReachedMap *createReachedMap(const Digraph &)
258 259
      {
259 260
        LEMON_ASSERT(false, "ReachedMap is not initialized");
260 261
        return 0; // ignore warnings
261 262
      }
262 263
    };
263 264
    ///\brief \ref named-templ-param "Named parameter" for setting
264 265
    ///\c ReachedMap type.
265 266
    ///
266 267
    ///\ref named-templ-param "Named parameter" for setting
267 268
    ///\c ReachedMap type.
268
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
269
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
269 270
    template <class T>
270 271
    struct SetReachedMap : public Bfs< Digraph, SetReachedMapTraits<T> > {
271 272
      typedef Bfs< Digraph, SetReachedMapTraits<T> > Create;
272 273
    };
273 274

	
274 275
    template <class T>
275 276
    struct SetProcessedMapTraits : public Traits {
276 277
      typedef T ProcessedMap;
277 278
      static ProcessedMap *createProcessedMap(const Digraph &)
278 279
      {
279 280
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
280 281
        return 0; // ignore warnings
281 282
      }
282 283
    };
283 284
    ///\brief \ref named-templ-param "Named parameter" for setting
284 285
    ///\c ProcessedMap type.
285 286
    ///
286 287
    ///\ref named-templ-param "Named parameter" for setting
287 288
    ///\c ProcessedMap type.
288
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
289
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
289 290
    template <class T>
290 291
    struct SetProcessedMap : public Bfs< Digraph, SetProcessedMapTraits<T> > {
291 292
      typedef Bfs< Digraph, SetProcessedMapTraits<T> > Create;
292 293
    };
293 294

	
294 295
    struct SetStandardProcessedMapTraits : public Traits {
295 296
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
296 297
      static ProcessedMap *createProcessedMap(const Digraph &g)
297 298
      {
298 299
        return new ProcessedMap(g);
299 300
        return 0; // ignore warnings
300 301
      }
301 302
    };
302 303
    ///\brief \ref named-templ-param "Named parameter" for setting
303 304
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
304 305
    ///
305 306
    ///\ref named-templ-param "Named parameter" for setting
306 307
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
307 308
    ///If you don't set it explicitly, it will be automatically allocated.
308 309
    struct SetStandardProcessedMap :
309 310
      public Bfs< Digraph, SetStandardProcessedMapTraits > {
310 311
      typedef Bfs< Digraph, SetStandardProcessedMapTraits > Create;
311 312
    };
312 313

	
313 314
    ///@}
314 315

	
315 316
  public:
316 317

	
317 318
    ///Constructor.
318 319

	
319 320
    ///Constructor.
320 321
    ///\param g The digraph the algorithm runs on.
321 322
    Bfs(const Digraph &g) :
322 323
      G(&g),
323 324
      _pred(NULL), local_pred(false),
324 325
      _dist(NULL), local_dist(false),
325 326
      _reached(NULL), local_reached(false),
326 327
      _processed(NULL), local_processed(false)
327 328
    { }
328 329

	
329 330
    ///Destructor.
330 331
    ~Bfs()
331 332
    {
332 333
      if(local_pred) delete _pred;
333 334
      if(local_dist) delete _dist;
334 335
      if(local_reached) delete _reached;
335 336
      if(local_processed) delete _processed;
336 337
    }
337 338

	
338 339
    ///Sets the map that stores the predecessor arcs.
339 340

	
340 341
    ///Sets the map that stores the predecessor arcs.
341 342
    ///If you don't use this function before calling \ref run(Node) "run()"
342 343
    ///or \ref init(), an instance will be allocated automatically.
343 344
    ///The destructor deallocates this automatically allocated map,
344 345
    ///of course.
345 346
    ///\return <tt> (*this) </tt>
346 347
    Bfs &predMap(PredMap &m)
347 348
    {
348 349
      if(local_pred) {
349 350
        delete _pred;
350 351
        local_pred=false;
351 352
      }
352 353
      _pred = &m;
353 354
      return *this;
354 355
    }
355 356

	
356 357
    ///Sets the map that indicates which nodes are reached.
357 358

	
358 359
    ///Sets the map that indicates which nodes are reached.
359 360
    ///If you don't use this function before calling \ref run(Node) "run()"
360 361
    ///or \ref init(), an instance will be allocated automatically.
361 362
    ///The destructor deallocates this automatically allocated map,
362 363
    ///of course.
363 364
    ///\return <tt> (*this) </tt>
364 365
    Bfs &reachedMap(ReachedMap &m)
365 366
    {
366 367
      if(local_reached) {
367 368
        delete _reached;
368 369
        local_reached=false;
369 370
      }
370 371
      _reached = &m;
371 372
      return *this;
372 373
    }
373 374

	
374 375
    ///Sets the map that indicates which nodes are processed.
375 376

	
376 377
    ///Sets the map that indicates which nodes are processed.
377 378
    ///If you don't use this function before calling \ref run(Node) "run()"
378 379
    ///or \ref init(), an instance will be allocated automatically.
379 380
    ///The destructor deallocates this automatically allocated map,
380 381
    ///of course.
381 382
    ///\return <tt> (*this) </tt>
382 383
    Bfs &processedMap(ProcessedMap &m)
383 384
    {
384 385
      if(local_processed) {
385 386
        delete _processed;
386 387
        local_processed=false;
387 388
      }
388 389
      _processed = &m;
389 390
      return *this;
390 391
    }
391 392

	
392 393
    ///Sets the map that stores the distances of the nodes.
393 394

	
394 395
    ///Sets the map that stores the distances of the nodes calculated by
395 396
    ///the algorithm.
396 397
    ///If you don't use this function before calling \ref run(Node) "run()"
397 398
    ///or \ref init(), an instance will be allocated automatically.
398 399
    ///The destructor deallocates this automatically allocated map,
399 400
    ///of course.
400 401
    ///\return <tt> (*this) </tt>
401 402
    Bfs &distMap(DistMap &m)
402 403
    {
403 404
      if(local_dist) {
404 405
        delete _dist;
405 406
        local_dist=false;
406 407
      }
407 408
      _dist = &m;
408 409
      return *this;
409 410
    }
410 411

	
411 412
  public:
412 413

	
413 414
    ///\name Execution Control
414 415
    ///The simplest way to execute the BFS algorithm is to use one of the
415 416
    ///member functions called \ref run(Node) "run()".\n
416
    ///If you need more control on the execution, first you have to call
417
    ///\ref init(), then you can add several source nodes with
417
    ///If you need better control on the execution, you have to call
418
    ///\ref init() first, then you can add several source nodes with
418 419
    ///\ref addSource(). Finally the actual path computation can be
419 420
    ///performed with one of the \ref start() functions.
420 421

	
421 422
    ///@{
422 423

	
423 424
    ///\brief Initializes the internal data structures.
424 425
    ///
425 426
    ///Initializes the internal data structures.
426 427
    void init()
427 428
    {
428 429
      create_maps();
429 430
      _queue.resize(countNodes(*G));
430 431
      _queue_head=_queue_tail=0;
431 432
      _curr_dist=1;
432 433
      for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
433 434
        _pred->set(u,INVALID);
434 435
        _reached->set(u,false);
435 436
        _processed->set(u,false);
436 437
      }
437 438
    }
438 439

	
439 440
    ///Adds a new source node.
440 441

	
441 442
    ///Adds a new source node to the set of nodes to be processed.
442 443
    ///
443 444
    void addSource(Node s)
444 445
    {
445 446
      if(!(*_reached)[s])
446 447
        {
447 448
          _reached->set(s,true);
448 449
          _pred->set(s,INVALID);
449 450
          _dist->set(s,0);
450 451
          _queue[_queue_head++]=s;
451 452
          _queue_next_dist=_queue_head;
452 453
        }
453 454
    }
454 455

	
455 456
    ///Processes the next node.
456 457

	
457 458
    ///Processes the next node.
458 459
    ///
459 460
    ///\return The processed node.
460 461
    ///
461 462
    ///\pre The queue must not be empty.
462 463
    Node processNextNode()
463 464
    {
464 465
      if(_queue_tail==_queue_next_dist) {
465 466
        _curr_dist++;
466 467
        _queue_next_dist=_queue_head;
467 468
      }
468 469
      Node n=_queue[_queue_tail++];
469 470
      _processed->set(n,true);
470 471
      Node m;
471 472
      for(OutArcIt e(*G,n);e!=INVALID;++e)
472 473
        if(!(*_reached)[m=G->target(e)]) {
473 474
          _queue[_queue_head++]=m;
474 475
          _reached->set(m,true);
475 476
          _pred->set(m,e);
476 477
          _dist->set(m,_curr_dist);
477 478
        }
478 479
      return n;
479 480
    }
480 481

	
481 482
    ///Processes the next node.
482 483

	
483 484
    ///Processes the next node and checks if the given target node
484 485
    ///is reached. If the target node is reachable from the processed
485 486
    ///node, then the \c reach parameter will be set to \c true.
486 487
    ///
487 488
    ///\param target The target node.
488 489
    ///\retval reach Indicates if the target node is reached.
489 490
    ///It should be initially \c false.
490 491
    ///
491 492
    ///\return The processed node.
492 493
    ///
493 494
    ///\pre The queue must not be empty.
494 495
    Node processNextNode(Node target, bool& reach)
495 496
    {
496 497
      if(_queue_tail==_queue_next_dist) {
497 498
        _curr_dist++;
498 499
        _queue_next_dist=_queue_head;
499 500
      }
500 501
      Node n=_queue[_queue_tail++];
501 502
      _processed->set(n,true);
502 503
      Node m;
503 504
      for(OutArcIt e(*G,n);e!=INVALID;++e)
504 505
        if(!(*_reached)[m=G->target(e)]) {
505 506
          _queue[_queue_head++]=m;
506 507
          _reached->set(m,true);
507 508
          _pred->set(m,e);
508 509
          _dist->set(m,_curr_dist);
509 510
          reach = reach || (target == m);
510 511
        }
511 512
      return n;
512 513
    }
513 514

	
514 515
    ///Processes the next node.
515 516

	
516 517
    ///Processes the next node and checks if at least one of reached
517 518
    ///nodes has \c true value in the \c nm node map. If one node
518 519
    ///with \c true value is reachable from the processed node, then the
519 520
    ///\c rnode parameter will be set to the first of such nodes.
520 521
    ///
521 522
    ///\param nm A \c bool (or convertible) node map that indicates the
522 523
    ///possible targets.
523 524
    ///\retval rnode The reached target node.
524 525
    ///It should be initially \c INVALID.
525 526
    ///
526 527
    ///\return The processed node.
527 528
    ///
528 529
    ///\pre The queue must not be empty.
529 530
    template<class NM>
530 531
    Node processNextNode(const NM& nm, Node& rnode)
531 532
    {
532 533
      if(_queue_tail==_queue_next_dist) {
533 534
        _curr_dist++;
534 535
        _queue_next_dist=_queue_head;
535 536
      }
536 537
      Node n=_queue[_queue_tail++];
537 538
      _processed->set(n,true);
538 539
      Node m;
539 540
      for(OutArcIt e(*G,n);e!=INVALID;++e)
540 541
        if(!(*_reached)[m=G->target(e)]) {
541 542
          _queue[_queue_head++]=m;
542 543
          _reached->set(m,true);
543 544
          _pred->set(m,e);
544 545
          _dist->set(m,_curr_dist);
545 546
          if (nm[m] && rnode == INVALID) rnode = m;
... ...
@@ -575,983 +576,975 @@
575 576
    ///This method runs the %BFS algorithm from the root node(s)
576 577
    ///in order to compute the shortest path to each node.
577 578
    ///
578 579
    ///The algorithm computes
579 580
    ///- the shortest path tree (forest),
580 581
    ///- the distance of each node from the root(s).
581 582
    ///
582 583
    ///\pre init() must be called and at least one root node should be
583 584
    ///added with addSource() before using this function.
584 585
    ///
585 586
    ///\note <tt>b.start()</tt> is just a shortcut of the following code.
586 587
    ///\code
587 588
    ///  while ( !b.emptyQueue() ) {
588 589
    ///    b.processNextNode();
589 590
    ///  }
590 591
    ///\endcode
591 592
    void start()
592 593
    {
593 594
      while ( !emptyQueue() ) processNextNode();
594 595
    }
595 596

	
596 597
    ///Executes the algorithm until the given target node is reached.
597 598

	
598 599
    ///Executes the algorithm until the given target node is reached.
599 600
    ///
600 601
    ///This method runs the %BFS algorithm from the root node(s)
601 602
    ///in order to compute the shortest path to \c t.
602 603
    ///
603 604
    ///The algorithm computes
604 605
    ///- the shortest path to \c t,
605 606
    ///- the distance of \c t from the root(s).
606 607
    ///
607 608
    ///\pre init() must be called and at least one root node should be
608 609
    ///added with addSource() before using this function.
609 610
    ///
610 611
    ///\note <tt>b.start(t)</tt> is just a shortcut of the following code.
611 612
    ///\code
612 613
    ///  bool reach = false;
613 614
    ///  while ( !b.emptyQueue() && !reach ) {
614 615
    ///    b.processNextNode(t, reach);
615 616
    ///  }
616 617
    ///\endcode
617 618
    void start(Node t)
618 619
    {
619 620
      bool reach = false;
620 621
      while ( !emptyQueue() && !reach ) processNextNode(t, reach);
621 622
    }
622 623

	
623 624
    ///Executes the algorithm until a condition is met.
624 625

	
625 626
    ///Executes the algorithm until a condition is met.
626 627
    ///
627 628
    ///This method runs the %BFS algorithm from the root node(s) in
628 629
    ///order to compute the shortest path to a node \c v with
629 630
    /// <tt>nm[v]</tt> true, if such a node can be found.
630 631
    ///
631 632
    ///\param nm A \c bool (or convertible) node map. The algorithm
632 633
    ///will stop when it reaches a node \c v with <tt>nm[v]</tt> true.
633 634
    ///
634 635
    ///\return The reached node \c v with <tt>nm[v]</tt> true or
635 636
    ///\c INVALID if no such node was found.
636 637
    ///
637 638
    ///\pre init() must be called and at least one root node should be
638 639
    ///added with addSource() before using this function.
639 640
    ///
640 641
    ///\note <tt>b.start(nm)</tt> is just a shortcut of the following code.
641 642
    ///\code
642 643
    ///  Node rnode = INVALID;
643 644
    ///  while ( !b.emptyQueue() && rnode == INVALID ) {
644 645
    ///    b.processNextNode(nm, rnode);
645 646
    ///  }
646 647
    ///  return rnode;
647 648
    ///\endcode
648 649
    template<class NodeBoolMap>
649 650
    Node start(const NodeBoolMap &nm)
650 651
    {
651 652
      Node rnode = INVALID;
652 653
      while ( !emptyQueue() && rnode == INVALID ) {
653 654
        processNextNode(nm, rnode);
654 655
      }
655 656
      return rnode;
656 657
    }
657 658

	
658 659
    ///Runs the algorithm from the given source node.
659 660

	
660 661
    ///This method runs the %BFS algorithm from node \c s
661 662
    ///in order to compute the shortest path to each node.
662 663
    ///
663 664
    ///The algorithm computes
664 665
    ///- the shortest path tree,
665 666
    ///- the distance of each node from the root.
666 667
    ///
667 668
    ///\note <tt>b.run(s)</tt> is just a shortcut of the following code.
668 669
    ///\code
669 670
    ///  b.init();
670 671
    ///  b.addSource(s);
671 672
    ///  b.start();
672 673
    ///\endcode
673 674
    void run(Node s) {
674 675
      init();
675 676
      addSource(s);
676 677
      start();
677 678
    }
678 679

	
679 680
    ///Finds the shortest path between \c s and \c t.
680 681

	
681 682
    ///This method runs the %BFS algorithm from node \c s
682 683
    ///in order to compute the shortest path to node \c t
683 684
    ///(it stops searching when \c t is processed).
684 685
    ///
685 686
    ///\return \c true if \c t is reachable form \c s.
686 687
    ///
687 688
    ///\note Apart from the return value, <tt>b.run(s,t)</tt> is just a
688 689
    ///shortcut of the following code.
689 690
    ///\code
690 691
    ///  b.init();
691 692
    ///  b.addSource(s);
692 693
    ///  b.start(t);
693 694
    ///\endcode
694 695
    bool run(Node s,Node t) {
695 696
      init();
696 697
      addSource(s);
697 698
      start(t);
698 699
      return reached(t);
699 700
    }
700 701

	
701 702
    ///Runs the algorithm to visit all nodes in the digraph.
702 703

	
703
    ///This method runs the %BFS algorithm in order to
704
    ///compute the shortest path to each node.
705
    ///
706
    ///The algorithm computes
707
    ///- the shortest path tree (forest),
708
    ///- the distance of each node from the root(s).
704
    ///This method runs the %BFS algorithm in order to visit all nodes
705
    ///in the digraph.
709 706
    ///
710 707
    ///\note <tt>b.run(s)</tt> is just a shortcut of the following code.
711 708
    ///\code
712 709
    ///  b.init();
713 710
    ///  for (NodeIt n(gr); n != INVALID; ++n) {
714 711
    ///    if (!b.reached(n)) {
715 712
    ///      b.addSource(n);
716 713
    ///      b.start();
717 714
    ///    }
718 715
    ///  }
719 716
    ///\endcode
720 717
    void run() {
721 718
      init();
722 719
      for (NodeIt n(*G); n != INVALID; ++n) {
723 720
        if (!reached(n)) {
724 721
          addSource(n);
725 722
          start();
726 723
        }
727 724
      }
728 725
    }
729 726

	
730 727
    ///@}
731 728

	
732 729
    ///\name Query Functions
733 730
    ///The results of the BFS algorithm can be obtained using these
734 731
    ///functions.\n
735 732
    ///Either \ref run(Node) "run()" or \ref start() should be called
736 733
    ///before using them.
737 734

	
738 735
    ///@{
739 736

	
740
    ///The shortest path to a node.
737
    ///The shortest path to the given node.
741 738

	
742
    ///Returns the shortest path to a node.
739
    ///Returns the shortest path to the given node from the root(s).
743 740
    ///
744 741
    ///\warning \c t should be reached from the root(s).
745 742
    ///
746 743
    ///\pre Either \ref run(Node) "run()" or \ref init()
747 744
    ///must be called before using this function.
748 745
    Path path(Node t) const { return Path(*G, *_pred, t); }
749 746

	
750
    ///The distance of a node from the root(s).
747
    ///The distance of the given node from the root(s).
751 748

	
752
    ///Returns the distance of a node from the root(s).
749
    ///Returns the distance of the given node from the root(s).
753 750
    ///
754 751
    ///\warning If node \c v is not reached from the root(s), then
755 752
    ///the return value of this function is undefined.
756 753
    ///
757 754
    ///\pre Either \ref run(Node) "run()" or \ref init()
758 755
    ///must be called before using this function.
759 756
    int dist(Node v) const { return (*_dist)[v]; }
760 757

	
761
    ///Returns the 'previous arc' of the shortest path tree for a node.
762

	
758
    ///\brief Returns the 'previous arc' of the shortest path tree for
759
    ///the given node.
760
    ///
763 761
    ///This function returns the 'previous arc' of the shortest path
764 762
    ///tree for the node \c v, i.e. it returns the last arc of a
765 763
    ///shortest path from a root to \c v. It is \c INVALID if \c v
766 764
    ///is not reached from the root(s) or if \c v is a root.
767 765
    ///
768 766
    ///The shortest path tree used here is equal to the shortest path
769
    ///tree used in \ref predNode().
767
    ///tree used in \ref predNode() and \ref predMap().
770 768
    ///
771 769
    ///\pre Either \ref run(Node) "run()" or \ref init()
772 770
    ///must be called before using this function.
773 771
    Arc predArc(Node v) const { return (*_pred)[v];}
774 772

	
775
    ///Returns the 'previous node' of the shortest path tree for a node.
776

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

	
790 789
    ///\brief Returns a const reference to the node map that stores the
791 790
    /// distances of the nodes.
792 791
    ///
793 792
    ///Returns a const reference to the node map that stores the distances
794 793
    ///of the nodes calculated by the algorithm.
795 794
    ///
796 795
    ///\pre Either \ref run(Node) "run()" or \ref init()
797 796
    ///must be called before using this function.
798 797
    const DistMap &distMap() const { return *_dist;}
799 798

	
800 799
    ///\brief Returns a const reference to the node map that stores the
801 800
    ///predecessor arcs.
802 801
    ///
803 802
    ///Returns a const reference to the node map that stores the predecessor
804
    ///arcs, which form the shortest path tree.
803
    ///arcs, which form the shortest path tree (forest).
805 804
    ///
806 805
    ///\pre Either \ref run(Node) "run()" or \ref init()
807 806
    ///must be called before using this function.
808 807
    const PredMap &predMap() const { return *_pred;}
809 808

	
810
    ///Checks if a node is reached from the root(s).
809
    ///Checks if the given node is reached from the root(s).
811 810

	
812 811
    ///Returns \c true if \c v is reached from the root(s).
813 812
    ///
814 813
    ///\pre Either \ref run(Node) "run()" or \ref init()
815 814
    ///must be called before using this function.
816 815
    bool reached(Node v) const { return (*_reached)[v]; }
817 816

	
818 817
    ///@}
819 818
  };
820 819

	
821 820
  ///Default traits class of bfs() function.
822 821

	
823 822
  ///Default traits class of bfs() function.
824 823
  ///\tparam GR Digraph type.
825 824
  template<class GR>
826 825
  struct BfsWizardDefaultTraits
827 826
  {
828 827
    ///The type of the digraph the algorithm runs on.
829 828
    typedef GR Digraph;
830 829

	
831 830
    ///\brief The type of the map that stores the predecessor
832 831
    ///arcs of the shortest paths.
833 832
    ///
834 833
    ///The type of the map that stores the predecessor
835 834
    ///arcs of the shortest paths.
836
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
835
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
837 836
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
838 837
    ///Instantiates a PredMap.
839 838

	
840 839
    ///This function instantiates a PredMap.
841 840
    ///\param g is the digraph, to which we would like to define the
842 841
    ///PredMap.
843 842
    static PredMap *createPredMap(const Digraph &g)
844 843
    {
845 844
      return new PredMap(g);
846 845
    }
847 846

	
848 847
    ///The type of the map that indicates which nodes are processed.
849 848

	
850 849
    ///The type of the map that indicates which nodes are processed.
851
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
852
    ///By default it is a NullMap.
850
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
851
    ///By default, it is a NullMap.
853 852
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
854 853
    ///Instantiates a ProcessedMap.
855 854

	
856 855
    ///This function instantiates a ProcessedMap.
857 856
    ///\param g is the digraph, to which
858 857
    ///we would like to define the ProcessedMap.
859 858
#ifdef DOXYGEN
860 859
    static ProcessedMap *createProcessedMap(const Digraph &g)
861 860
#else
862 861
    static ProcessedMap *createProcessedMap(const Digraph &)
863 862
#endif
864 863
    {
865 864
      return new ProcessedMap();
866 865
    }
867 866

	
868 867
    ///The type of the map that indicates which nodes are reached.
869 868

	
870 869
    ///The type of the map that indicates which nodes are reached.
871
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
870
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
872 871
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
873 872
    ///Instantiates a ReachedMap.
874 873

	
875 874
    ///This function instantiates a ReachedMap.
876 875
    ///\param g is the digraph, to which
877 876
    ///we would like to define the ReachedMap.
878 877
    static ReachedMap *createReachedMap(const Digraph &g)
879 878
    {
880 879
      return new ReachedMap(g);
881 880
    }
882 881

	
883 882
    ///The type of the map that stores the distances of the nodes.
884 883

	
885 884
    ///The type of the map that stores the distances of the nodes.
886
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
885
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
887 886
    typedef typename Digraph::template NodeMap<int> DistMap;
888 887
    ///Instantiates a DistMap.
889 888

	
890 889
    ///This function instantiates a DistMap.
891 890
    ///\param g is the digraph, to which we would like to define
892 891
    ///the DistMap
893 892
    static DistMap *createDistMap(const Digraph &g)
894 893
    {
895 894
      return new DistMap(g);
896 895
    }
897 896

	
898 897
    ///The type of the shortest paths.
899 898

	
900 899
    ///The type of the shortest paths.
901
    ///It must meet the \ref concepts::Path "Path" concept.
900
    ///It must conform to the \ref concepts::Path "Path" concept.
902 901
    typedef lemon::Path<Digraph> Path;
903 902
  };
904 903

	
905 904
  /// Default traits class used by BfsWizard
906 905

	
907
  /// To make it easier to use Bfs algorithm
908
  /// we have created a wizard class.
909
  /// This \ref BfsWizard class needs default traits,
910
  /// as well as the \ref Bfs class.
911
  /// The \ref BfsWizardBase is a class to be the default traits of the
912
  /// \ref BfsWizard class.
906
  /// Default traits class used by BfsWizard.
907
  /// \tparam GR The type of the digraph.
913 908
  template<class GR>
914 909
  class BfsWizardBase : public BfsWizardDefaultTraits<GR>
915 910
  {
916 911

	
917 912
    typedef BfsWizardDefaultTraits<GR> Base;
918 913
  protected:
919 914
    //The type of the nodes in the digraph.
920 915
    typedef typename Base::Digraph::Node Node;
921 916

	
922 917
    //Pointer to the digraph the algorithm runs on.
923 918
    void *_g;
924 919
    //Pointer to the map of reached nodes.
925 920
    void *_reached;
926 921
    //Pointer to the map of processed nodes.
927 922
    void *_processed;
928 923
    //Pointer to the map of predecessors arcs.
929 924
    void *_pred;
930 925
    //Pointer to the map of distances.
931 926
    void *_dist;
932 927
    //Pointer to the shortest path to the target node.
933 928
    void *_path;
934 929
    //Pointer to the distance of the target node.
935 930
    int *_di;
936 931

	
937 932
    public:
938 933
    /// Constructor.
939 934

	
940
    /// This constructor does not require parameters, therefore it initiates
935
    /// This constructor does not require parameters, it initiates
941 936
    /// all of the attributes to \c 0.
942 937
    BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
943 938
                      _dist(0), _path(0), _di(0) {}
944 939

	
945 940
    /// Constructor.
946 941

	
947 942
    /// This constructor requires one parameter,
948 943
    /// others are initiated to \c 0.
949 944
    /// \param g The digraph the algorithm runs on.
950 945
    BfsWizardBase(const GR &g) :
951 946
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
952 947
      _reached(0), _processed(0), _pred(0), _dist(0),  _path(0), _di(0) {}
953 948

	
954 949
  };
955 950

	
956 951
  /// Auxiliary class for the function-type interface of BFS algorithm.
957 952

	
958 953
  /// This auxiliary class is created to implement the
959 954
  /// \ref bfs() "function-type interface" of \ref Bfs algorithm.
960 955
  /// It does not have own \ref run(Node) "run()" method, it uses the
961 956
  /// functions and features of the plain \ref Bfs.
962 957
  ///
963 958
  /// This class should only be used through the \ref bfs() function,
964 959
  /// which makes it easier to use the algorithm.
965 960
  template<class TR>
966 961
  class BfsWizard : public TR
967 962
  {
968 963
    typedef TR Base;
969 964

	
970
    ///The type of the digraph the algorithm runs on.
971 965
    typedef typename TR::Digraph Digraph;
972 966

	
973 967
    typedef typename Digraph::Node Node;
974 968
    typedef typename Digraph::NodeIt NodeIt;
975 969
    typedef typename Digraph::Arc Arc;
976 970
    typedef typename Digraph::OutArcIt OutArcIt;
977 971

	
978
    ///\brief The type of the map that stores the predecessor
979
    ///arcs of the shortest paths.
980 972
    typedef typename TR::PredMap PredMap;
981
    ///\brief The type of the map that stores the distances of the nodes.
982 973
    typedef typename TR::DistMap DistMap;
983
    ///\brief The type of the map that indicates which nodes are reached.
984 974
    typedef typename TR::ReachedMap ReachedMap;
985
    ///\brief The type of the map that indicates which nodes are processed.
986 975
    typedef typename TR::ProcessedMap ProcessedMap;
987
    ///The type of the shortest paths
988 976
    typedef typename TR::Path Path;
989 977

	
990 978
  public:
991 979

	
992 980
    /// Constructor.
993 981
    BfsWizard() : TR() {}
994 982

	
995 983
    /// Constructor that requires parameters.
996 984

	
997 985
    /// Constructor that requires parameters.
998 986
    /// These parameters will be the default values for the traits class.
999 987
    /// \param g The digraph the algorithm runs on.
1000 988
    BfsWizard(const Digraph &g) :
1001 989
      TR(g) {}
1002 990

	
1003 991
    ///Copy constructor
1004 992
    BfsWizard(const TR &b) : TR(b) {}
1005 993

	
1006 994
    ~BfsWizard() {}
1007 995

	
1008 996
    ///Runs BFS algorithm from the given source node.
1009 997

	
1010 998
    ///This method runs BFS algorithm from node \c s
1011 999
    ///in order to compute the shortest path to each node.
1012 1000
    void run(Node s)
1013 1001
    {
1014 1002
      Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1015 1003
      if (Base::_pred)
1016 1004
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1017 1005
      if (Base::_dist)
1018 1006
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1019 1007
      if (Base::_reached)
1020 1008
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
1021 1009
      if (Base::_processed)
1022 1010
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1023 1011
      if (s!=INVALID)
1024 1012
        alg.run(s);
1025 1013
      else
1026 1014
        alg.run();
1027 1015
    }
1028 1016

	
1029 1017
    ///Finds the shortest path between \c s and \c t.
1030 1018

	
1031 1019
    ///This method runs BFS algorithm from node \c s
1032 1020
    ///in order to compute the shortest path to node \c t
1033 1021
    ///(it stops searching when \c t is processed).
1034 1022
    ///
1035 1023
    ///\return \c true if \c t is reachable form \c s.
1036 1024
    bool run(Node s, Node t)
1037 1025
    {
1038 1026
      Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1039 1027
      if (Base::_pred)
1040 1028
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1041 1029
      if (Base::_dist)
1042 1030
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1043 1031
      if (Base::_reached)
1044 1032
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
1045 1033
      if (Base::_processed)
1046 1034
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1047 1035
      alg.run(s,t);
1048 1036
      if (Base::_path)
1049 1037
        *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
1050 1038
      if (Base::_di)
1051 1039
        *Base::_di = alg.dist(t);
1052 1040
      return alg.reached(t);
1053 1041
    }
1054 1042

	
1055 1043
    ///Runs BFS algorithm to visit all nodes in the digraph.
1056 1044

	
1057
    ///This method runs BFS algorithm in order to compute
1058
    ///the shortest path to each node.
1045
    ///This method runs BFS algorithm in order to visit all nodes
1046
    ///in the digraph.
1059 1047
    void run()
1060 1048
    {
1061 1049
      run(INVALID);
1062 1050
    }
1063 1051

	
1064 1052
    template<class T>
1065 1053
    struct SetPredMapBase : public Base {
1066 1054
      typedef T PredMap;
1067 1055
      static PredMap *createPredMap(const Digraph &) { return 0; };
1068 1056
      SetPredMapBase(const TR &b) : TR(b) {}
1069 1057
    };
1070
    ///\brief \ref named-func-param "Named parameter"
1071
    ///for setting PredMap object.
1058

	
1059
    ///\brief \ref named-templ-param "Named parameter" for setting
1060
    ///the predecessor map.
1072 1061
    ///
1073
    ///\ref named-func-param "Named parameter"
1074
    ///for setting PredMap object.
1062
    ///\ref named-templ-param "Named parameter" function for setting
1063
    ///the map that stores the predecessor arcs of the nodes.
1075 1064
    template<class T>
1076 1065
    BfsWizard<SetPredMapBase<T> > predMap(const T &t)
1077 1066
    {
1078 1067
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1079 1068
      return BfsWizard<SetPredMapBase<T> >(*this);
1080 1069
    }
1081 1070

	
1082 1071
    template<class T>
1083 1072
    struct SetReachedMapBase : public Base {
1084 1073
      typedef T ReachedMap;
1085 1074
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1086 1075
      SetReachedMapBase(const TR &b) : TR(b) {}
1087 1076
    };
1088
    ///\brief \ref named-func-param "Named parameter"
1089
    ///for setting ReachedMap object.
1077

	
1078
    ///\brief \ref named-templ-param "Named parameter" for setting
1079
    ///the reached map.
1090 1080
    ///
1091
    /// \ref named-func-param "Named parameter"
1092
    ///for setting ReachedMap object.
1081
    ///\ref named-templ-param "Named parameter" function for setting
1082
    ///the map that indicates which nodes are reached.
1093 1083
    template<class T>
1094 1084
    BfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1095 1085
    {
1096 1086
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1097 1087
      return BfsWizard<SetReachedMapBase<T> >(*this);
1098 1088
    }
1099 1089

	
1100 1090
    template<class T>
1101 1091
    struct SetDistMapBase : public Base {
1102 1092
      typedef T DistMap;
1103 1093
      static DistMap *createDistMap(const Digraph &) { return 0; };
1104 1094
      SetDistMapBase(const TR &b) : TR(b) {}
1105 1095
    };
1106
    ///\brief \ref named-func-param "Named parameter"
1107
    ///for setting DistMap object.
1096

	
1097
    ///\brief \ref named-templ-param "Named parameter" for setting
1098
    ///the distance map.
1108 1099
    ///
1109
    /// \ref named-func-param "Named parameter"
1110
    ///for setting DistMap object.
1100
    ///\ref named-templ-param "Named parameter" function for setting
1101
    ///the map that stores the distances of the nodes calculated
1102
    ///by the algorithm.
1111 1103
    template<class T>
1112 1104
    BfsWizard<SetDistMapBase<T> > distMap(const T &t)
1113 1105
    {
1114 1106
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1115 1107
      return BfsWizard<SetDistMapBase<T> >(*this);
1116 1108
    }
1117 1109

	
1118 1110
    template<class T>
1119 1111
    struct SetProcessedMapBase : public Base {
1120 1112
      typedef T ProcessedMap;
1121 1113
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1122 1114
      SetProcessedMapBase(const TR &b) : TR(b) {}
1123 1115
    };
1124
    ///\brief \ref named-func-param "Named parameter"
1125
    ///for setting ProcessedMap object.
1116

	
1117
    ///\brief \ref named-func-param "Named parameter" for setting
1118
    ///the processed map.
1126 1119
    ///
1127
    /// \ref named-func-param "Named parameter"
1128
    ///for setting ProcessedMap object.
1120
    ///\ref named-templ-param "Named parameter" function for setting
1121
    ///the map that indicates which nodes are processed.
1129 1122
    template<class T>
1130 1123
    BfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1131 1124
    {
1132 1125
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1133 1126
      return BfsWizard<SetProcessedMapBase<T> >(*this);
1134 1127
    }
1135 1128

	
1136 1129
    template<class T>
1137 1130
    struct SetPathBase : public Base {
1138 1131
      typedef T Path;
1139 1132
      SetPathBase(const TR &b) : TR(b) {}
1140 1133
    };
1141 1134
    ///\brief \ref named-func-param "Named parameter"
1142 1135
    ///for getting the shortest path to the target node.
1143 1136
    ///
1144 1137
    ///\ref named-func-param "Named parameter"
1145 1138
    ///for getting the shortest path to the target node.
1146 1139
    template<class T>
1147 1140
    BfsWizard<SetPathBase<T> > path(const T &t)
1148 1141
    {
1149 1142
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1150 1143
      return BfsWizard<SetPathBase<T> >(*this);
1151 1144
    }
1152 1145

	
1153 1146
    ///\brief \ref named-func-param "Named parameter"
1154 1147
    ///for getting the distance of the target node.
1155 1148
    ///
1156 1149
    ///\ref named-func-param "Named parameter"
1157 1150
    ///for getting the distance of the target node.
1158 1151
    BfsWizard dist(const int &d)
1159 1152
    {
1160 1153
      Base::_di=const_cast<int*>(&d);
1161 1154
      return *this;
1162 1155
    }
1163 1156

	
1164 1157
  };
1165 1158

	
1166 1159
  ///Function-type interface for BFS algorithm.
1167 1160

	
1168 1161
  /// \ingroup search
1169 1162
  ///Function-type interface for BFS algorithm.
1170 1163
  ///
1171 1164
  ///This function also has several \ref named-func-param "named parameters",
1172 1165
  ///they are declared as the members of class \ref BfsWizard.
1173 1166
  ///The following examples show how to use these parameters.
1174 1167
  ///\code
1175 1168
  ///  // Compute shortest path from node s to each node
1176 1169
  ///  bfs(g).predMap(preds).distMap(dists).run(s);
1177 1170
  ///
1178 1171
  ///  // Compute shortest path from s to t
1179 1172
  ///  bool reached = bfs(g).path(p).dist(d).run(s,t);
1180 1173
  ///\endcode
1181 1174
  ///\warning Don't forget to put the \ref BfsWizard::run(Node) "run()"
1182 1175
  ///to the end of the parameter list.
1183 1176
  ///\sa BfsWizard
1184 1177
  ///\sa Bfs
1185 1178
  template<class GR>
1186 1179
  BfsWizard<BfsWizardBase<GR> >
1187 1180
  bfs(const GR &digraph)
1188 1181
  {
1189 1182
    return BfsWizard<BfsWizardBase<GR> >(digraph);
1190 1183
  }
1191 1184

	
1192 1185
#ifdef DOXYGEN
1193 1186
  /// \brief Visitor class for BFS.
1194 1187
  ///
1195 1188
  /// This class defines the interface of the BfsVisit events, and
1196 1189
  /// it could be the base of a real visitor class.
1197 1190
  template <typename GR>
1198 1191
  struct BfsVisitor {
1199 1192
    typedef GR Digraph;
1200 1193
    typedef typename Digraph::Arc Arc;
1201 1194
    typedef typename Digraph::Node Node;
1202 1195
    /// \brief Called for the source node(s) of the BFS.
1203 1196
    ///
1204 1197
    /// This function is called for the source node(s) of the BFS.
1205 1198
    void start(const Node& node) {}
1206 1199
    /// \brief Called when a node is reached first time.
1207 1200
    ///
1208 1201
    /// This function is called when a node is reached first time.
1209 1202
    void reach(const Node& node) {}
1210 1203
    /// \brief Called when a node is processed.
1211 1204
    ///
1212 1205
    /// This function is called when a node is processed.
1213 1206
    void process(const Node& node) {}
1214 1207
    /// \brief Called when an arc reaches a new node.
1215 1208
    ///
1216 1209
    /// This function is called when the BFS finds an arc whose target node
1217 1210
    /// is not reached yet.
1218 1211
    void discover(const Arc& arc) {}
1219 1212
    /// \brief Called when an arc is examined but its target node is
1220 1213
    /// already discovered.
1221 1214
    ///
1222 1215
    /// This function is called when an arc is examined but its target node is
1223 1216
    /// already discovered.
1224 1217
    void examine(const Arc& arc) {}
1225 1218
  };
1226 1219
#else
1227 1220
  template <typename GR>
1228 1221
  struct BfsVisitor {
1229 1222
    typedef GR Digraph;
1230 1223
    typedef typename Digraph::Arc Arc;
1231 1224
    typedef typename Digraph::Node Node;
1232 1225
    void start(const Node&) {}
1233 1226
    void reach(const Node&) {}
1234 1227
    void process(const Node&) {}
1235 1228
    void discover(const Arc&) {}
1236 1229
    void examine(const Arc&) {}
1237 1230

	
1238 1231
    template <typename _Visitor>
1239 1232
    struct Constraints {
1240 1233
      void constraints() {
1241 1234
        Arc arc;
1242 1235
        Node node;
1243 1236
        visitor.start(node);
1244 1237
        visitor.reach(node);
1245 1238
        visitor.process(node);
1246 1239
        visitor.discover(arc);
1247 1240
        visitor.examine(arc);
1248 1241
      }
1249 1242
      _Visitor& visitor;
1250 1243
    };
1251 1244
  };
1252 1245
#endif
1253 1246

	
1254 1247
  /// \brief Default traits class of BfsVisit class.
1255 1248
  ///
1256 1249
  /// Default traits class of BfsVisit class.
1257 1250
  /// \tparam GR The type of the digraph the algorithm runs on.
1258 1251
  template<class GR>
1259 1252
  struct BfsVisitDefaultTraits {
1260 1253

	
1261 1254
    /// \brief The type of the digraph the algorithm runs on.
1262 1255
    typedef GR Digraph;
1263 1256

	
1264 1257
    /// \brief The type of the map that indicates which nodes are reached.
1265 1258
    ///
1266 1259
    /// The type of the map that indicates which nodes are reached.
1267
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1260
    /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1268 1261
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1269 1262

	
1270 1263
    /// \brief Instantiates a ReachedMap.
1271 1264
    ///
1272 1265
    /// This function instantiates a ReachedMap.
1273 1266
    /// \param digraph is the digraph, to which
1274 1267
    /// we would like to define the ReachedMap.
1275 1268
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1276 1269
      return new ReachedMap(digraph);
1277 1270
    }
1278 1271

	
1279 1272
  };
1280 1273

	
1281 1274
  /// \ingroup search
1282 1275
  ///
1283 1276
  /// \brief BFS algorithm class with visitor interface.
1284 1277
  ///
1285 1278
  /// This class provides an efficient implementation of the BFS algorithm
1286 1279
  /// with visitor interface.
1287 1280
  ///
1288 1281
  /// The BfsVisit class provides an alternative interface to the Bfs
1289 1282
  /// class. It works with callback mechanism, the BfsVisit object calls
1290 1283
  /// the member functions of the \c Visitor class on every BFS event.
1291 1284
  ///
1292 1285
  /// This interface of the BFS algorithm should be used in special cases
1293 1286
  /// when extra actions have to be performed in connection with certain
1294 1287
  /// events of the BFS algorithm. Otherwise consider to use Bfs or bfs()
1295 1288
  /// instead.
1296 1289
  ///
1297 1290
  /// \tparam GR The type of the digraph the algorithm runs on.
1298 1291
  /// The default type is \ref ListDigraph.
1299 1292
  /// The value of GR is not used directly by \ref BfsVisit,
1300 1293
  /// it is only passed to \ref BfsVisitDefaultTraits.
1301 1294
  /// \tparam VS The Visitor type that is used by the algorithm.
1302 1295
  /// \ref BfsVisitor "BfsVisitor<GR>" is an empty visitor, which
1303 1296
  /// does not observe the BFS events. If you want to observe the BFS
1304 1297
  /// events, you should implement your own visitor class.
1305 1298
  /// \tparam TR Traits class to set various data types used by the
1306 1299
  /// algorithm. The default traits class is
1307 1300
  /// \ref BfsVisitDefaultTraits "BfsVisitDefaultTraits<GR>".
1308 1301
  /// See \ref BfsVisitDefaultTraits for the documentation of
1309 1302
  /// a BFS visit traits class.
1310 1303
#ifdef DOXYGEN
1311 1304
  template <typename GR, typename VS, typename TR>
1312 1305
#else
1313 1306
  template <typename GR = ListDigraph,
1314 1307
            typename VS = BfsVisitor<GR>,
1315 1308
            typename TR = BfsVisitDefaultTraits<GR> >
1316 1309
#endif
1317 1310
  class BfsVisit {
1318 1311
  public:
1319 1312

	
1320 1313
    ///The traits class.
1321 1314
    typedef TR Traits;
1322 1315

	
1323 1316
    ///The type of the digraph the algorithm runs on.
1324 1317
    typedef typename Traits::Digraph Digraph;
1325 1318

	
1326 1319
    ///The visitor type used by the algorithm.
1327 1320
    typedef VS Visitor;
1328 1321

	
1329 1322
    ///The type of the map that indicates which nodes are reached.
1330 1323
    typedef typename Traits::ReachedMap ReachedMap;
1331 1324

	
1332 1325
  private:
1333 1326

	
1334 1327
    typedef typename Digraph::Node Node;
1335 1328
    typedef typename Digraph::NodeIt NodeIt;
1336 1329
    typedef typename Digraph::Arc Arc;
1337 1330
    typedef typename Digraph::OutArcIt OutArcIt;
1338 1331

	
1339 1332
    //Pointer to the underlying digraph.
1340 1333
    const Digraph *_digraph;
1341 1334
    //Pointer to the visitor object.
1342 1335
    Visitor *_visitor;
1343 1336
    //Pointer to the map of reached status of the nodes.
1344 1337
    ReachedMap *_reached;
1345 1338
    //Indicates if _reached is locally allocated (true) or not.
1346 1339
    bool local_reached;
1347 1340

	
1348 1341
    std::vector<typename Digraph::Node> _list;
1349 1342
    int _list_front, _list_back;
1350 1343

	
1351 1344
    //Creates the maps if necessary.
1352 1345
    void create_maps() {
1353 1346
      if(!_reached) {
1354 1347
        local_reached = true;
1355 1348
        _reached = Traits::createReachedMap(*_digraph);
1356 1349
      }
1357 1350
    }
1358 1351

	
1359 1352
  protected:
1360 1353

	
1361 1354
    BfsVisit() {}
1362 1355

	
1363 1356
  public:
1364 1357

	
1365 1358
    typedef BfsVisit Create;
1366 1359

	
1367 1360
    /// \name Named Template Parameters
1368 1361

	
1369 1362
    ///@{
1370 1363
    template <class T>
1371 1364
    struct SetReachedMapTraits : public Traits {
1372 1365
      typedef T ReachedMap;
1373 1366
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1374 1367
        LEMON_ASSERT(false, "ReachedMap is not initialized");
1375 1368
        return 0; // ignore warnings
1376 1369
      }
1377 1370
    };
1378 1371
    /// \brief \ref named-templ-param "Named parameter" for setting
1379 1372
    /// ReachedMap type.
1380 1373
    ///
1381 1374
    /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
1382 1375
    template <class T>
1383 1376
    struct SetReachedMap : public BfsVisit< Digraph, Visitor,
1384 1377
                                            SetReachedMapTraits<T> > {
1385 1378
      typedef BfsVisit< Digraph, Visitor, SetReachedMapTraits<T> > Create;
1386 1379
    };
1387 1380
    ///@}
1388 1381

	
1389 1382
  public:
1390 1383

	
1391 1384
    /// \brief Constructor.
1392 1385
    ///
1393 1386
    /// Constructor.
1394 1387
    ///
1395 1388
    /// \param digraph The digraph the algorithm runs on.
1396 1389
    /// \param visitor The visitor object of the algorithm.
1397 1390
    BfsVisit(const Digraph& digraph, Visitor& visitor)
1398 1391
      : _digraph(&digraph), _visitor(&visitor),
1399 1392
        _reached(0), local_reached(false) {}
1400 1393

	
1401 1394
    /// \brief Destructor.
1402 1395
    ~BfsVisit() {
1403 1396
      if(local_reached) delete _reached;
1404 1397
    }
1405 1398

	
1406 1399
    /// \brief Sets the map that indicates which nodes are reached.
1407 1400
    ///
1408 1401
    /// Sets the map that indicates which nodes are reached.
1409 1402
    /// If you don't use this function before calling \ref run(Node) "run()"
1410 1403
    /// or \ref init(), an instance will be allocated automatically.
1411 1404
    /// The destructor deallocates this automatically allocated map,
1412 1405
    /// of course.
1413 1406
    /// \return <tt> (*this) </tt>
1414 1407
    BfsVisit &reachedMap(ReachedMap &m) {
1415 1408
      if(local_reached) {
1416 1409
        delete _reached;
1417 1410
        local_reached = false;
1418 1411
      }
1419 1412
      _reached = &m;
1420 1413
      return *this;
1421 1414
    }
1422 1415

	
1423 1416
  public:
1424 1417

	
1425 1418
    /// \name Execution Control
1426 1419
    /// The simplest way to execute the BFS algorithm is to use one of the
1427 1420
    /// member functions called \ref run(Node) "run()".\n
1428
    /// If you need more control on the execution, first you have to call
1429
    /// \ref init(), then you can add several source nodes with
1421
    /// If you need better control on the execution, you have to call
1422
    /// \ref init() first, then you can add several source nodes with
1430 1423
    /// \ref addSource(). Finally the actual path computation can be
1431 1424
    /// performed with one of the \ref start() functions.
1432 1425

	
1433 1426
    /// @{
1434 1427

	
1435 1428
    /// \brief Initializes the internal data structures.
1436 1429
    ///
1437 1430
    /// Initializes the internal data structures.
1438 1431
    void init() {
1439 1432
      create_maps();
1440 1433
      _list.resize(countNodes(*_digraph));
1441 1434
      _list_front = _list_back = -1;
1442 1435
      for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
1443 1436
        _reached->set(u, false);
1444 1437
      }
1445 1438
    }
1446 1439

	
1447 1440
    /// \brief Adds a new source node.
1448 1441
    ///
1449 1442
    /// Adds a new source node to the set of nodes to be processed.
1450 1443
    void addSource(Node s) {
1451 1444
      if(!(*_reached)[s]) {
1452 1445
          _reached->set(s,true);
1453 1446
          _visitor->start(s);
1454 1447
          _visitor->reach(s);
1455 1448
          _list[++_list_back] = s;
1456 1449
        }
1457 1450
    }
1458 1451

	
1459 1452
    /// \brief Processes the next node.
1460 1453
    ///
1461 1454
    /// Processes the next node.
1462 1455
    ///
1463 1456
    /// \return The processed node.
1464 1457
    ///
1465 1458
    /// \pre The queue must not be empty.
1466 1459
    Node processNextNode() {
1467 1460
      Node n = _list[++_list_front];
1468 1461
      _visitor->process(n);
1469 1462
      Arc e;
1470 1463
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1471 1464
        Node m = _digraph->target(e);
1472 1465
        if (!(*_reached)[m]) {
1473 1466
          _visitor->discover(e);
1474 1467
          _visitor->reach(m);
1475 1468
          _reached->set(m, true);
1476 1469
          _list[++_list_back] = m;
1477 1470
        } else {
1478 1471
          _visitor->examine(e);
1479 1472
        }
1480 1473
      }
1481 1474
      return n;
1482 1475
    }
1483 1476

	
1484 1477
    /// \brief Processes the next node.
1485 1478
    ///
1486 1479
    /// Processes the next node and checks if the given target node
1487 1480
    /// is reached. If the target node is reachable from the processed
1488 1481
    /// node, then the \c reach parameter will be set to \c true.
1489 1482
    ///
1490 1483
    /// \param target The target node.
1491 1484
    /// \retval reach Indicates if the target node is reached.
1492 1485
    /// It should be initially \c false.
1493 1486
    ///
1494 1487
    /// \return The processed node.
1495 1488
    ///
1496 1489
    /// \pre The queue must not be empty.
1497 1490
    Node processNextNode(Node target, bool& reach) {
1498 1491
      Node n = _list[++_list_front];
1499 1492
      _visitor->process(n);
1500 1493
      Arc e;
1501 1494
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1502 1495
        Node m = _digraph->target(e);
1503 1496
        if (!(*_reached)[m]) {
1504 1497
          _visitor->discover(e);
1505 1498
          _visitor->reach(m);
1506 1499
          _reached->set(m, true);
1507 1500
          _list[++_list_back] = m;
1508 1501
          reach = reach || (target == m);
1509 1502
        } else {
1510 1503
          _visitor->examine(e);
1511 1504
        }
1512 1505
      }
1513 1506
      return n;
1514 1507
    }
1515 1508

	
1516 1509
    /// \brief Processes the next node.
1517 1510
    ///
1518 1511
    /// Processes the next node and checks if at least one of reached
1519 1512
    /// nodes has \c true value in the \c nm node map. If one node
1520 1513
    /// with \c true value is reachable from the processed node, then the
1521 1514
    /// \c rnode parameter will be set to the first of such nodes.
1522 1515
    ///
1523 1516
    /// \param nm A \c bool (or convertible) node map that indicates the
1524 1517
    /// possible targets.
1525 1518
    /// \retval rnode The reached target node.
1526 1519
    /// It should be initially \c INVALID.
1527 1520
    ///
1528 1521
    /// \return The processed node.
1529 1522
    ///
1530 1523
    /// \pre The queue must not be empty.
1531 1524
    template <typename NM>
1532 1525
    Node processNextNode(const NM& nm, Node& rnode) {
1533 1526
      Node n = _list[++_list_front];
1534 1527
      _visitor->process(n);
1535 1528
      Arc e;
1536 1529
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1537 1530
        Node m = _digraph->target(e);
1538 1531
        if (!(*_reached)[m]) {
1539 1532
          _visitor->discover(e);
1540 1533
          _visitor->reach(m);
1541 1534
          _reached->set(m, true);
1542 1535
          _list[++_list_back] = m;
1543 1536
          if (nm[m] && rnode == INVALID) rnode = m;
1544 1537
        } else {
1545 1538
          _visitor->examine(e);
1546 1539
        }
1547 1540
      }
1548 1541
      return n;
1549 1542
    }
1550 1543

	
1551 1544
    /// \brief The next node to be processed.
1552 1545
    ///
1553 1546
    /// Returns the next node to be processed or \c INVALID if the queue
1554 1547
    /// is empty.
1555 1548
    Node nextNode() const {
1556 1549
      return _list_front != _list_back ? _list[_list_front + 1] : INVALID;
1557 1550
    }
... ...
@@ -1573,180 +1566,176 @@
1573 1566
    /// Executes the algorithm.
1574 1567
    ///
1575 1568
    /// This method runs the %BFS algorithm from the root node(s)
1576 1569
    /// in order to compute the shortest path to each node.
1577 1570
    ///
1578 1571
    /// The algorithm computes
1579 1572
    /// - the shortest path tree (forest),
1580 1573
    /// - the distance of each node from the root(s).
1581 1574
    ///
1582 1575
    /// \pre init() must be called and at least one root node should be added
1583 1576
    /// with addSource() before using this function.
1584 1577
    ///
1585 1578
    /// \note <tt>b.start()</tt> is just a shortcut of the following code.
1586 1579
    /// \code
1587 1580
    ///   while ( !b.emptyQueue() ) {
1588 1581
    ///     b.processNextNode();
1589 1582
    ///   }
1590 1583
    /// \endcode
1591 1584
    void start() {
1592 1585
      while ( !emptyQueue() ) processNextNode();
1593 1586
    }
1594 1587

	
1595 1588
    /// \brief Executes the algorithm until the given target node is reached.
1596 1589
    ///
1597 1590
    /// Executes the algorithm until the given target node is reached.
1598 1591
    ///
1599 1592
    /// This method runs the %BFS algorithm from the root node(s)
1600 1593
    /// in order to compute the shortest path to \c t.
1601 1594
    ///
1602 1595
    /// The algorithm computes
1603 1596
    /// - the shortest path to \c t,
1604 1597
    /// - the distance of \c t from the root(s).
1605 1598
    ///
1606 1599
    /// \pre init() must be called and at least one root node should be
1607 1600
    /// added with addSource() before using this function.
1608 1601
    ///
1609 1602
    /// \note <tt>b.start(t)</tt> is just a shortcut of the following code.
1610 1603
    /// \code
1611 1604
    ///   bool reach = false;
1612 1605
    ///   while ( !b.emptyQueue() && !reach ) {
1613 1606
    ///     b.processNextNode(t, reach);
1614 1607
    ///   }
1615 1608
    /// \endcode
1616 1609
    void start(Node t) {
1617 1610
      bool reach = false;
1618 1611
      while ( !emptyQueue() && !reach ) processNextNode(t, reach);
1619 1612
    }
1620 1613

	
1621 1614
    /// \brief Executes the algorithm until a condition is met.
1622 1615
    ///
1623 1616
    /// Executes the algorithm until a condition is met.
1624 1617
    ///
1625 1618
    /// This method runs the %BFS algorithm from the root node(s) in
1626 1619
    /// order to compute the shortest path to a node \c v with
1627 1620
    /// <tt>nm[v]</tt> true, if such a node can be found.
1628 1621
    ///
1629 1622
    /// \param nm must be a bool (or convertible) node map. The
1630 1623
    /// algorithm will stop when it reaches a node \c v with
1631 1624
    /// <tt>nm[v]</tt> true.
1632 1625
    ///
1633 1626
    /// \return The reached node \c v with <tt>nm[v]</tt> true or
1634 1627
    /// \c INVALID if no such node was found.
1635 1628
    ///
1636 1629
    /// \pre init() must be called and at least one root node should be
1637 1630
    /// added with addSource() before using this function.
1638 1631
    ///
1639 1632
    /// \note <tt>b.start(nm)</tt> is just a shortcut of the following code.
1640 1633
    /// \code
1641 1634
    ///   Node rnode = INVALID;
1642 1635
    ///   while ( !b.emptyQueue() && rnode == INVALID ) {
1643 1636
    ///     b.processNextNode(nm, rnode);
1644 1637
    ///   }
1645 1638
    ///   return rnode;
1646 1639
    /// \endcode
1647 1640
    template <typename NM>
1648 1641
    Node start(const NM &nm) {
1649 1642
      Node rnode = INVALID;
1650 1643
      while ( !emptyQueue() && rnode == INVALID ) {
1651 1644
        processNextNode(nm, rnode);
1652 1645
      }
1653 1646
      return rnode;
1654 1647
    }
1655 1648

	
1656 1649
    /// \brief Runs the algorithm from the given source node.
1657 1650
    ///
1658 1651
    /// This method runs the %BFS algorithm from node \c s
1659 1652
    /// in order to compute the shortest path to each node.
1660 1653
    ///
1661 1654
    /// The algorithm computes
1662 1655
    /// - the shortest path tree,
1663 1656
    /// - the distance of each node from the root.
1664 1657
    ///
1665 1658
    /// \note <tt>b.run(s)</tt> is just a shortcut of the following code.
1666 1659
    ///\code
1667 1660
    ///   b.init();
1668 1661
    ///   b.addSource(s);
1669 1662
    ///   b.start();
1670 1663
    ///\endcode
1671 1664
    void run(Node s) {
1672 1665
      init();
1673 1666
      addSource(s);
1674 1667
      start();
1675 1668
    }
1676 1669

	
1677 1670
    /// \brief Finds the shortest path between \c s and \c t.
1678 1671
    ///
1679 1672
    /// This method runs the %BFS algorithm from node \c s
1680 1673
    /// in order to compute the shortest path to node \c t
1681 1674
    /// (it stops searching when \c t is processed).
1682 1675
    ///
1683 1676
    /// \return \c true if \c t is reachable form \c s.
1684 1677
    ///
1685 1678
    /// \note Apart from the return value, <tt>b.run(s,t)</tt> is just a
1686 1679
    /// shortcut of the following code.
1687 1680
    ///\code
1688 1681
    ///   b.init();
1689 1682
    ///   b.addSource(s);
1690 1683
    ///   b.start(t);
1691 1684
    ///\endcode
1692 1685
    bool run(Node s,Node t) {
1693 1686
      init();
1694 1687
      addSource(s);
1695 1688
      start(t);
1696 1689
      return reached(t);
1697 1690
    }
1698 1691

	
1699 1692
    /// \brief Runs the algorithm to visit all nodes in the digraph.
1700 1693
    ///
1701
    /// This method runs the %BFS algorithm in order to
1702
    /// compute the shortest path to each node.
1703
    ///
1704
    /// The algorithm computes
1705
    /// - the shortest path tree (forest),
1706
    /// - the distance of each node from the root(s).
1694
    /// This method runs the %BFS algorithm in order to visit all nodes
1695
    /// in the digraph.
1707 1696
    ///
1708 1697
    /// \note <tt>b.run(s)</tt> is just a shortcut of the following code.
1709 1698
    ///\code
1710 1699
    ///  b.init();
1711 1700
    ///  for (NodeIt n(gr); n != INVALID; ++n) {
1712 1701
    ///    if (!b.reached(n)) {
1713 1702
    ///      b.addSource(n);
1714 1703
    ///      b.start();
1715 1704
    ///    }
1716 1705
    ///  }
1717 1706
    ///\endcode
1718 1707
    void run() {
1719 1708
      init();
1720 1709
      for (NodeIt it(*_digraph); it != INVALID; ++it) {
1721 1710
        if (!reached(it)) {
1722 1711
          addSource(it);
1723 1712
          start();
1724 1713
        }
1725 1714
      }
1726 1715
    }
1727 1716

	
1728 1717
    ///@}
1729 1718

	
1730 1719
    /// \name Query Functions
1731 1720
    /// The results of the BFS algorithm can be obtained using these
1732 1721
    /// functions.\n
1733 1722
    /// Either \ref run(Node) "run()" or \ref start() should be called
1734 1723
    /// before using them.
1735 1724

	
1736 1725
    ///@{
1737 1726

	
1738
    /// \brief Checks if a node is reached from the root(s).
1727
    /// \brief Checks if the given node is reached from the root(s).
1739 1728
    ///
1740 1729
    /// Returns \c true if \c v is reached from the root(s).
1741 1730
    ///
1742 1731
    /// \pre Either \ref run(Node) "run()" or \ref init()
1743 1732
    /// must be called before using this function.
1744 1733
    bool reached(Node v) const { return (*_reached)[v]; }
1745 1734

	
1746 1735
    ///@}
1747 1736

	
1748 1737
  };
1749 1738

	
1750 1739
} //END OF NAMESPACE LEMON
1751 1740

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

	
19 19
#ifndef LEMON_BITS_GRAPH_EXTENDER_H
20 20
#define LEMON_BITS_GRAPH_EXTENDER_H
21 21

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

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

	
27 27
#include <lemon/concept_check.h>
28 28
#include <lemon/concepts/maps.h>
29 29

	
30 30
//\ingroup graphbits
31 31
//\file
32 32
//\brief Extenders for the graph types
33 33
namespace lemon {
34 34

	
35 35
  // \ingroup graphbits
36 36
  //
37 37
  // \brief Extender for the digraph implementations
38 38
  template <typename Base>
39 39
  class DigraphExtender : public Base {
40 40
    typedef Base Parent;
41 41

	
42 42
  public:
43 43

	
44 44
    typedef DigraphExtender Digraph;
45 45

	
46 46
    // Base extensions
47 47

	
48 48
    typedef typename Parent::Node Node;
49 49
    typedef typename Parent::Arc Arc;
50 50

	
51 51
    int maxId(Node) const {
52 52
      return Parent::maxNodeId();
53 53
    }
54 54

	
55 55
    int maxId(Arc) const {
56 56
      return Parent::maxArcId();
57 57
    }
58 58

	
59
    Node fromId(int id, Node) const {
59
    static Node fromId(int id, Node) {
60 60
      return Parent::nodeFromId(id);
61 61
    }
62 62

	
63
    Arc fromId(int id, Arc) const {
63
    static Arc fromId(int id, Arc) {
64 64
      return Parent::arcFromId(id);
65 65
    }
66 66

	
67 67
    Node oppositeNode(const Node &node, const Arc &arc) const {
68 68
      if (node == Parent::source(arc))
69 69
        return Parent::target(arc);
70 70
      else if(node == Parent::target(arc))
71 71
        return Parent::source(arc);
72 72
      else
73 73
        return INVALID;
74 74
    }
75 75

	
76 76
    // Alterable extension
77 77

	
78 78
    typedef AlterationNotifier<DigraphExtender, Node> NodeNotifier;
79 79
    typedef AlterationNotifier<DigraphExtender, Arc> ArcNotifier;
80 80

	
81 81

	
82 82
  protected:
83 83

	
84 84
    mutable NodeNotifier node_notifier;
85 85
    mutable ArcNotifier arc_notifier;
86 86

	
87 87
  public:
88 88

	
89 89
    NodeNotifier& notifier(Node) const {
90 90
      return node_notifier;
91 91
    }
92 92

	
93 93
    ArcNotifier& notifier(Arc) const {
94 94
      return arc_notifier;
95 95
    }
96 96

	
97 97
    class NodeIt : public Node {
98 98
      const Digraph* _digraph;
99 99
    public:
100 100

	
101 101
      NodeIt() {}
102 102

	
103 103
      NodeIt(Invalid i) : Node(i) { }
104 104

	
105 105
      explicit NodeIt(const Digraph& digraph) : _digraph(&digraph) {
106 106
        _digraph->first(static_cast<Node&>(*this));
107 107
      }
108 108

	
109 109
      NodeIt(const Digraph& digraph, const Node& node)
110 110
        : Node(node), _digraph(&digraph) {}
111 111

	
112 112
      NodeIt& operator++() {
113 113
        _digraph->next(*this);
114 114
        return *this;
115 115
      }
116 116

	
117 117
    };
118 118

	
119 119

	
120 120
    class ArcIt : public Arc {
121 121
      const Digraph* _digraph;
122 122
    public:
123 123

	
124 124
      ArcIt() { }
125 125

	
126 126
      ArcIt(Invalid i) : Arc(i) { }
127 127

	
128 128
      explicit ArcIt(const Digraph& digraph) : _digraph(&digraph) {
129 129
        _digraph->first(static_cast<Arc&>(*this));
130 130
      }
131 131

	
132 132
      ArcIt(const Digraph& digraph, const Arc& arc) :
133 133
        Arc(arc), _digraph(&digraph) { }
134 134

	
135 135
      ArcIt& operator++() {
136 136
        _digraph->next(*this);
137 137
        return *this;
138 138
      }
139 139

	
140 140
    };
141 141

	
142 142

	
143 143
    class OutArcIt : public Arc {
144 144
      const Digraph* _digraph;
145 145
    public:
146 146

	
147 147
      OutArcIt() { }
148 148

	
149 149
      OutArcIt(Invalid i) : Arc(i) { }
150 150

	
151 151
      OutArcIt(const Digraph& digraph, const Node& node)
152 152
        : _digraph(&digraph) {
153 153
        _digraph->firstOut(*this, node);
154 154
      }
155 155

	
156 156
      OutArcIt(const Digraph& digraph, const Arc& arc)
157 157
        : Arc(arc), _digraph(&digraph) {}
158 158

	
159 159
      OutArcIt& operator++() {
160 160
        _digraph->nextOut(*this);
161 161
        return *this;
162 162
      }
163 163

	
164 164
    };
165 165

	
166 166

	
167 167
    class InArcIt : public Arc {
168 168
      const Digraph* _digraph;
169 169
    public:
170 170

	
171 171
      InArcIt() { }
172 172

	
173 173
      InArcIt(Invalid i) : Arc(i) { }
174 174

	
175 175
      InArcIt(const Digraph& digraph, const Node& node)
176 176
        : _digraph(&digraph) {
177 177
        _digraph->firstIn(*this, node);
178 178
      }
179 179

	
180 180
      InArcIt(const Digraph& digraph, const Arc& arc) :
181 181
        Arc(arc), _digraph(&digraph) {}
182 182

	
183 183
      InArcIt& operator++() {
184 184
        _digraph->nextIn(*this);
185 185
        return *this;
186 186
      }
187 187

	
188 188
    };
189 189

	
190 190
    // \brief Base node of the iterator
191 191
    //
... ...
@@ -230,265 +230,265 @@
230 230
    private:
231 231
      NodeMap& operator=(const NodeMap& cmap) {
232 232
        return operator=<NodeMap>(cmap);
233 233
      }
234 234

	
235 235
      template <typename CMap>
236 236
      NodeMap& operator=(const CMap& cmap) {
237 237
        Parent::operator=(cmap);
238 238
        return *this;
239 239
      }
240 240

	
241 241
    };
242 242

	
243 243
    template <typename _Value>
244 244
    class ArcMap
245 245
      : public MapExtender<DefaultMap<Digraph, Arc, _Value> > {
246 246
      typedef MapExtender<DefaultMap<Digraph, Arc, _Value> > Parent;
247 247

	
248 248
    public:
249 249
      explicit ArcMap(const Digraph& digraph)
250 250
        : Parent(digraph) {}
251 251
      ArcMap(const Digraph& digraph, const _Value& value)
252 252
        : Parent(digraph, value) {}
253 253

	
254 254
    private:
255 255
      ArcMap& operator=(const ArcMap& cmap) {
256 256
        return operator=<ArcMap>(cmap);
257 257
      }
258 258

	
259 259
      template <typename CMap>
260 260
      ArcMap& operator=(const CMap& cmap) {
261 261
        Parent::operator=(cmap);
262 262
        return *this;
263 263
      }
264 264
    };
265 265

	
266 266

	
267 267
    Node addNode() {
268 268
      Node node = Parent::addNode();
269 269
      notifier(Node()).add(node);
270 270
      return node;
271 271
    }
272 272

	
273 273
    Arc addArc(const Node& from, const Node& to) {
274 274
      Arc arc = Parent::addArc(from, to);
275 275
      notifier(Arc()).add(arc);
276 276
      return arc;
277 277
    }
278 278

	
279 279
    void clear() {
280 280
      notifier(Arc()).clear();
281 281
      notifier(Node()).clear();
282 282
      Parent::clear();
283 283
    }
284 284

	
285 285
    template <typename Digraph, typename NodeRefMap, typename ArcRefMap>
286 286
    void build(const Digraph& digraph, NodeRefMap& nodeRef, ArcRefMap& arcRef) {
287 287
      Parent::build(digraph, nodeRef, arcRef);
288 288
      notifier(Node()).build();
289 289
      notifier(Arc()).build();
290 290
    }
291 291

	
292 292
    void erase(const Node& node) {
293 293
      Arc arc;
294 294
      Parent::firstOut(arc, node);
295 295
      while (arc != INVALID ) {
296 296
        erase(arc);
297 297
        Parent::firstOut(arc, node);
298 298
      }
299 299

	
300 300
      Parent::firstIn(arc, node);
301 301
      while (arc != INVALID ) {
302 302
        erase(arc);
303 303
        Parent::firstIn(arc, node);
304 304
      }
305 305

	
306 306
      notifier(Node()).erase(node);
307 307
      Parent::erase(node);
308 308
    }
309 309

	
310 310
    void erase(const Arc& arc) {
311 311
      notifier(Arc()).erase(arc);
312 312
      Parent::erase(arc);
313 313
    }
314 314

	
315 315
    DigraphExtender() {
316 316
      node_notifier.setContainer(*this);
317 317
      arc_notifier.setContainer(*this);
318 318
    }
319 319

	
320 320

	
321 321
    ~DigraphExtender() {
322 322
      arc_notifier.clear();
323 323
      node_notifier.clear();
324 324
    }
325 325
  };
326 326

	
327 327
  // \ingroup _graphbits
328 328
  //
329 329
  // \brief Extender for the Graphs
330 330
  template <typename Base>
331 331
  class GraphExtender : public Base {
332 332
    typedef Base Parent;
333 333

	
334 334
  public:
335 335

	
336 336
    typedef GraphExtender Graph;
337 337

	
338 338
    typedef True UndirectedTag;
339 339

	
340 340
    typedef typename Parent::Node Node;
341 341
    typedef typename Parent::Arc Arc;
342 342
    typedef typename Parent::Edge Edge;
343 343

	
344 344
    // Graph extension
345 345

	
346 346
    int maxId(Node) const {
347 347
      return Parent::maxNodeId();
348 348
    }
349 349

	
350 350
    int maxId(Arc) const {
351 351
      return Parent::maxArcId();
352 352
    }
353 353

	
354 354
    int maxId(Edge) const {
355 355
      return Parent::maxEdgeId();
356 356
    }
357 357

	
358
    Node fromId(int id, Node) const {
358
    static Node fromId(int id, Node) {
359 359
      return Parent::nodeFromId(id);
360 360
    }
361 361

	
362
    Arc fromId(int id, Arc) const {
362
    static Arc fromId(int id, Arc) {
363 363
      return Parent::arcFromId(id);
364 364
    }
365 365

	
366
    Edge fromId(int id, Edge) const {
366
    static Edge fromId(int id, Edge) {
367 367
      return Parent::edgeFromId(id);
368 368
    }
369 369

	
370 370
    Node oppositeNode(const Node &n, const Edge &e) const {
371 371
      if( n == Parent::u(e))
372 372
        return Parent::v(e);
373 373
      else if( n == Parent::v(e))
374 374
        return Parent::u(e);
375 375
      else
376 376
        return INVALID;
377 377
    }
378 378

	
379 379
    Arc oppositeArc(const Arc &arc) const {
380 380
      return Parent::direct(arc, !Parent::direction(arc));
381 381
    }
382 382

	
383 383
    using Parent::direct;
384 384
    Arc direct(const Edge &edge, const Node &node) const {
385 385
      return Parent::direct(edge, Parent::u(edge) == node);
386 386
    }
387 387

	
388 388
    // Alterable extension
389 389

	
390 390
    typedef AlterationNotifier<GraphExtender, Node> NodeNotifier;
391 391
    typedef AlterationNotifier<GraphExtender, Arc> ArcNotifier;
392 392
    typedef AlterationNotifier<GraphExtender, Edge> EdgeNotifier;
393 393

	
394 394

	
395 395
  protected:
396 396

	
397 397
    mutable NodeNotifier node_notifier;
398 398
    mutable ArcNotifier arc_notifier;
399 399
    mutable EdgeNotifier edge_notifier;
400 400

	
401 401
  public:
402 402

	
403 403
    NodeNotifier& notifier(Node) const {
404 404
      return node_notifier;
405 405
    }
406 406

	
407 407
    ArcNotifier& notifier(Arc) const {
408 408
      return arc_notifier;
409 409
    }
410 410

	
411 411
    EdgeNotifier& notifier(Edge) const {
412 412
      return edge_notifier;
413 413
    }
414 414

	
415 415

	
416 416

	
417 417
    class NodeIt : public Node {
418 418
      const Graph* _graph;
419 419
    public:
420 420

	
421 421
      NodeIt() {}
422 422

	
423 423
      NodeIt(Invalid i) : Node(i) { }
424 424

	
425 425
      explicit NodeIt(const Graph& graph) : _graph(&graph) {
426 426
        _graph->first(static_cast<Node&>(*this));
427 427
      }
428 428

	
429 429
      NodeIt(const Graph& graph, const Node& node)
430 430
        : Node(node), _graph(&graph) {}
431 431

	
432 432
      NodeIt& operator++() {
433 433
        _graph->next(*this);
434 434
        return *this;
435 435
      }
436 436

	
437 437
    };
438 438

	
439 439

	
440 440
    class ArcIt : public Arc {
441 441
      const Graph* _graph;
442 442
    public:
443 443

	
444 444
      ArcIt() { }
445 445

	
446 446
      ArcIt(Invalid i) : Arc(i) { }
447 447

	
448 448
      explicit ArcIt(const Graph& graph) : _graph(&graph) {
449 449
        _graph->first(static_cast<Arc&>(*this));
450 450
      }
451 451

	
452 452
      ArcIt(const Graph& graph, const Arc& arc) :
453 453
        Arc(arc), _graph(&graph) { }
454 454

	
455 455
      ArcIt& operator++() {
456 456
        _graph->next(*this);
457 457
        return *this;
458 458
      }
459 459

	
460 460
    };
461 461

	
462 462

	
463 463
    class OutArcIt : public Arc {
464 464
      const Graph* _graph;
465 465
    public:
466 466

	
467 467
      OutArcIt() { }
468 468

	
469 469
      OutArcIt(Invalid i) : Arc(i) { }
470 470

	
471 471
      OutArcIt(const Graph& graph, const Node& node)
472 472
        : _graph(&graph) {
473 473
        _graph->firstOut(*this, node);
474 474
      }
475 475

	
476 476
      OutArcIt(const Graph& graph, const Arc& arc)
477 477
        : Arc(arc), _graph(&graph) {}
478 478

	
479 479
      OutArcIt& operator++() {
480 480
        _graph->nextOut(*this);
481 481
        return *this;
482 482
      }
483 483

	
484 484
    };
485 485

	
486 486

	
487 487
    class InArcIt : public Arc {
488 488
      const Graph* _graph;
489 489
    public:
490 490

	
491 491
      InArcIt() { }
492 492

	
493 493
      InArcIt(Invalid i) : Arc(i) { }
494 494

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

	
19 19
#ifndef LEMON_BITS_MAP_EXTENDER_H
20 20
#define LEMON_BITS_MAP_EXTENDER_H
21 21

	
22 22
#include <iterator>
23 23

	
24 24
#include <lemon/bits/traits.h>
25 25

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

	
29 29
//\file
30 30
//\brief Extenders for iterable maps.
31 31

	
32 32
namespace lemon {
33 33

	
34 34
  // \ingroup graphbits
35 35
  //
36 36
  // \brief Extender for maps
37 37
  template <typename _Map>
38 38
  class MapExtender : public _Map {
39 39
    typedef _Map Parent;
40 40
    typedef typename Parent::GraphType GraphType;
41 41

	
42 42
  public:
43 43

	
44 44
    typedef MapExtender Map;
45 45
    typedef typename Parent::Key Item;
46 46

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

	
52
    typedef typename Parent::ReferenceMapTag ReferenceMapTag;
53

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

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

	
58 60
  public:
59 61

	
60 62
    MapExtender(const GraphType& graph)
61 63
      : Parent(graph) {}
62 64

	
63 65
    MapExtender(const GraphType& graph, const Value& value)
64 66
      : Parent(graph, value) {}
65 67

	
66 68
  private:
67 69
    MapExtender& operator=(const MapExtender& cmap) {
68 70
      return operator=<MapExtender>(cmap);
69 71
    }
70 72

	
71 73
    template <typename CMap>
72 74
    MapExtender& operator=(const CMap& cmap) {
73 75
      Parent::operator=(cmap);
74 76
      return *this;
75 77
    }
76 78

	
77 79
  public:
78 80
    class MapIt : public Item {
79 81
      typedef Item Parent;
80 82

	
81 83
    public:
82 84

	
83 85
      typedef typename Map::Value Value;
84 86

	
85 87
      MapIt() {}
86 88

	
87 89
      MapIt(Invalid i) : Parent(i) { }
88 90

	
89 91
      explicit MapIt(Map& _map) : map(_map) {
90 92
        map.notifier()->first(*this);
91 93
      }
92 94

	
93 95
      MapIt(const Map& _map, const Item& item)
94 96
        : Parent(item), map(_map) {}
95 97

	
96 98
      MapIt& operator++() {
97 99
        map.notifier()->next(*this);
98 100
        return *this;
99 101
      }
100 102

	
101 103
      typename MapTraits<Map>::ConstReturnValue operator*() const {
102 104
        return map[*this];
103 105
      }
104 106

	
105 107
      typename MapTraits<Map>::ReturnValue operator*() {
106 108
        return map[*this];
107 109
      }
108 110

	
109 111
      void set(const Value& value) {
110 112
        map.set(*this, value);
111 113
      }
112 114

	
113 115
    protected:
114 116
      Map& map;
115 117

	
116 118
    };
117 119

	
118 120
    class ConstMapIt : public Item {
119 121
      typedef Item Parent;
120 122

	
121 123
    public:
122 124

	
123 125
      typedef typename Map::Value Value;
124 126

	
125 127
      ConstMapIt() {}
126 128

	
127 129
      ConstMapIt(Invalid i) : Parent(i) { }
128 130

	
129 131
      explicit ConstMapIt(Map& _map) : map(_map) {
130 132
        map.notifier()->first(*this);
131 133
      }
132 134

	
133 135
      ConstMapIt(const Map& _map, const Item& item)
134 136
        : Parent(item), map(_map) {}
135 137

	
136 138
      ConstMapIt& operator++() {
137 139
        map.notifier()->next(*this);
138 140
        return *this;
139 141
      }
140 142

	
141 143
      typename MapTraits<Map>::ConstReturnValue operator*() const {
142 144
        return map[*this];
143 145
      }
144 146

	
145 147
    protected:
146 148
      const Map& map;
147 149
    };
148 150

	
149 151
    class ItemIt : public Item {
150 152
      typedef Item Parent;
151 153

	
152 154
    public:
153 155

	
154 156
      ItemIt() {}
155 157

	
156 158
      ItemIt(Invalid i) : Parent(i) { }
157 159

	
158 160
      explicit ItemIt(Map& _map) : map(_map) {
159 161
        map.notifier()->first(*this);
160 162
      }
161 163

	
162 164
      ItemIt(const Map& _map, const Item& item)
163 165
        : Parent(item), map(_map) {}
164 166

	
165 167
      ItemIt& operator++() {
166 168
        map.notifier()->next(*this);
167 169
        return *this;
168 170
      }
169 171

	
170 172
    protected:
171 173
      const Map& map;
172 174

	
173 175
    };
174 176
  };
175 177

	
176 178
  // \ingroup graphbits
177 179
  //
178 180
  // \brief Extender for maps which use a subset of the items.
179 181
  template <typename _Graph, typename _Map>
180 182
  class SubMapExtender : public _Map {
181 183
    typedef _Map Parent;
182 184
    typedef _Graph GraphType;
183 185

	
184 186
  public:
185 187

	
186 188
    typedef SubMapExtender Map;
187 189
    typedef typename Parent::Key Item;
188 190

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

	
196
    typedef typename Parent::ReferenceMapTag ReferenceMapTag;
197

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

	
197 201
    friend class MapIt;
198 202
    friend class ConstMapIt;
199 203

	
200 204
  public:
201 205

	
202 206
    SubMapExtender(const GraphType& _graph)
203 207
      : Parent(_graph), graph(_graph) {}
204 208

	
205 209
    SubMapExtender(const GraphType& _graph, const Value& _value)
206 210
      : Parent(_graph, _value), graph(_graph) {}
207 211

	
208 212
  private:
209 213
    SubMapExtender& operator=(const SubMapExtender& cmap) {
210 214
      return operator=<MapExtender>(cmap);
211 215
    }
212 216

	
213 217
    template <typename CMap>
214 218
    SubMapExtender& operator=(const CMap& cmap) {
215 219
      checkConcept<concepts::ReadMap<Key, Value>, CMap>();
216 220
      Item it;
217 221
      for (graph.first(it); it != INVALID; graph.next(it)) {
218 222
        Parent::set(it, cmap[it]);
219 223
      }
220 224
      return *this;
221 225
    }
222 226

	
223 227
  public:
224 228
    class MapIt : public Item {
225 229
      typedef Item Parent;
226 230

	
227 231
    public:
228 232
      typedef typename Map::Value Value;
229 233

	
230 234
      MapIt() {}
231 235

	
232 236
      MapIt(Invalid i) : Parent(i) { }
233 237

	
234 238
      explicit MapIt(Map& _map) : map(_map) {
235 239
        map.graph.first(*this);
236 240
      }
237 241

	
238 242
      MapIt(const Map& _map, const Item& item)
239 243
        : Parent(item), map(_map) {}
240 244

	
241 245
      MapIt& operator++() {
242 246
        map.graph.next(*this);
243 247
        return *this;
244 248
      }
245 249

	
246 250
      typename MapTraits<Map>::ConstReturnValue operator*() const {
247 251
        return map[*this];
248 252
      }
249 253

	
250 254
      typename MapTraits<Map>::ReturnValue operator*() {
251 255
        return map[*this];
252 256
      }
253 257

	
254 258
      void set(const Value& value) {
255 259
        map.set(*this, value);
256 260
      }
257 261

	
258 262
    protected:
259 263
      Map& map;
260 264

	
261 265
    };
262 266

	
263 267
    class ConstMapIt : public Item {
264 268
      typedef Item Parent;
265 269

	
266 270
    public:
267 271

	
268 272
      typedef typename Map::Value Value;
269 273

	
270 274
      ConstMapIt() {}
271 275

	
272 276
      ConstMapIt(Invalid i) : Parent(i) { }
273 277

	
274 278
      explicit ConstMapIt(Map& _map) : map(_map) {
275 279
        map.graph.first(*this);
276 280
      }
277 281

	
278 282
      ConstMapIt(const Map& _map, const Item& item)
279 283
        : Parent(item), map(_map) {}
280 284

	
281 285
      ConstMapIt& operator++() {
282 286
        map.graph.next(*this);
283 287
        return *this;
284 288
      }
285 289

	
286 290
      typename MapTraits<Map>::ConstReturnValue operator*() const {
287 291
        return map[*this];
288 292
      }
289 293

	
290 294
    protected:
291 295
      const Map& map;
292 296
    };
293 297

	
294 298
    class ItemIt : public Item {
295 299
      typedef Item Parent;
296 300

	
297 301
    public:
298 302

	
299 303
      ItemIt() {}
300 304

	
301 305
      ItemIt(Invalid i) : Parent(i) { }
302 306

	
303 307
      explicit ItemIt(Map& _map) : map(_map) {
304 308
        map.graph.first(*this);
305 309
      }
306 310

	
307 311
      ItemIt(const Map& _map, const Item& item)
308 312
        : Parent(item), map(_map) {}
309 313

	
310 314
      ItemIt& operator++() {
311 315
        map.graph.next(*this);
312 316
        return *this;
313 317
      }
314 318

	
315 319
    protected:
316 320
      const Map& map;
317 321

	
318 322
    };
319 323

	
320 324
  private:
321 325

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

	
19 19
///\file
20 20
///\brief Implementation of the CBC MIP solver interface.
21 21

	
22 22
#include "cbc.h"
23 23

	
24 24
#include <coin/CoinModel.hpp>
25 25
#include <coin/CbcModel.hpp>
26 26
#include <coin/OsiSolverInterface.hpp>
27 27

	
28 28
#ifdef COIN_HAS_CLP
29 29
#include "coin/OsiClpSolverInterface.hpp"
30 30
#endif
31 31
#ifdef COIN_HAS_OSL
32 32
#include "coin/OsiOslSolverInterface.hpp"
33 33
#endif
34 34

	
35 35
#include "coin/CbcCutGenerator.hpp"
36 36
#include "coin/CbcHeuristicLocal.hpp"
37 37
#include "coin/CbcHeuristicGreedy.hpp"
38 38
#include "coin/CbcHeuristicFPump.hpp"
39 39
#include "coin/CbcHeuristicRINS.hpp"
40 40

	
41 41
#include "coin/CglGomory.hpp"
42 42
#include "coin/CglProbing.hpp"
43 43
#include "coin/CglKnapsackCover.hpp"
44 44
#include "coin/CglOddHole.hpp"
45 45
#include "coin/CglClique.hpp"
46 46
#include "coin/CglFlowCover.hpp"
47 47
#include "coin/CglMixedIntegerRounding.hpp"
48 48

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

	
51 51
namespace lemon {
52 52

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

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

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

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

	
77 77
  int CbcMip::_addCol() {
78 78
    _prob->addColumn(0, 0, 0, -COIN_DBL_MAX, COIN_DBL_MAX, 0.0, 0, false);
79 79
    return _prob->numberColumns() - 1;
80 80
  }
81 81

	
82 82
  CbcMip* CbcMip::newSolver() const {
83 83
    CbcMip* newlp = new CbcMip;
84 84
    return newlp;
85 85
  }
86 86

	
87 87
  CbcMip* CbcMip::cloneSolver() const {
88 88
    CbcMip* copylp = new CbcMip(*this);
89 89
    return copylp;
90 90
  }
91 91

	
92 92
  int CbcMip::_addRow() {
93 93
    _prob->addRow(0, 0, 0, -COIN_DBL_MAX, COIN_DBL_MAX);
94 94
    return _prob->numberRows() - 1;
95 95
  }
96 96

	
97
  int CbcMip::_addRow(Value l, ExprIterator b, ExprIterator e, Value u) {
98
    std::vector<int> indexes;
99
    std::vector<Value> values;
100

	
101
    for(ExprIterator it = b; it != e; ++it) {
102
      indexes.push_back(it->first);
103
      values.push_back(it->second);
104
    }
105

	
106
    _prob->addRow(values.size(), &indexes.front(), &values.front(), l, u);
107
    return _prob->numberRows() - 1;
108
  }
97 109

	
98 110
  void CbcMip::_eraseCol(int i) {
99 111
    _prob->deleteColumn(i);
100 112
  }
101 113

	
102 114
  void CbcMip::_eraseRow(int i) {
103 115
    _prob->deleteRow(i);
104 116
  }
105 117

	
106 118
  void CbcMip::_eraseColId(int i) {
107 119
    cols.eraseIndex(i);
108 120
  }
109 121

	
110 122
  void CbcMip::_eraseRowId(int i) {
111 123
    rows.eraseIndex(i);
112 124
  }
113 125

	
114 126
  void CbcMip::_getColName(int c, std::string& name) const {
115 127
    name = _prob->getColumnName(c);
116 128
  }
117 129

	
118 130
  void CbcMip::_setColName(int c, const std::string& name) {
119 131
    _prob->setColumnName(c, name.c_str());
120 132
  }
121 133

	
122 134
  int CbcMip::_colByName(const std::string& name) const {
123 135
    return _prob->column(name.c_str());
124 136
  }
125 137

	
126 138
  void CbcMip::_getRowName(int r, std::string& name) const {
127 139
    name = _prob->getRowName(r);
128 140
  }
129 141

	
130 142
  void CbcMip::_setRowName(int r, const std::string& name) {
131 143
    _prob->setRowName(r, name.c_str());
132 144
  }
133 145

	
134 146
  int CbcMip::_rowByName(const std::string& name) const {
135 147
    return _prob->row(name.c_str());
136 148
  }
137 149

	
138 150
  void CbcMip::_setRowCoeffs(int i, ExprIterator b, ExprIterator e) {
139 151
    for (ExprIterator it = b; it != e; ++it) {
140 152
      _prob->setElement(i, it->first, it->second);
141 153
    }
142 154
  }
143 155

	
144 156
  void CbcMip::_getRowCoeffs(int ix, InsertIterator b) const {
145 157
    int length = _prob->numberRows();
146 158

	
147 159
    std::vector<int> indices(length);
148 160
    std::vector<Value> values(length);
149 161

	
150 162
    length = _prob->getRow(ix, &indices[0], &values[0]);
151 163

	
152 164
    for (int i = 0; i < length; ++i) {
153 165
      *b = std::make_pair(indices[i], values[i]);
154 166
      ++b;
155 167
    }
156 168
  }
157 169

	
158 170
  void CbcMip::_setColCoeffs(int ix, ExprIterator b, ExprIterator e) {
159 171
    for (ExprIterator it = b; it != e; ++it) {
160 172
      _prob->setElement(it->first, ix, it->second);
161 173
    }
162 174
  }
163 175

	
164 176
  void CbcMip::_getColCoeffs(int ix, InsertIterator b) const {
165 177
    int length = _prob->numberColumns();
166 178

	
167 179
    std::vector<int> indices(length);
168 180
    std::vector<Value> values(length);
169 181

	
170 182
    length = _prob->getColumn(ix, &indices[0], &values[0]);
171 183

	
172 184
    for (int i = 0; i < length; ++i) {
173 185
      *b = std::make_pair(indices[i], values[i]);
174 186
      ++b;
175 187
    }
176 188
  }
177 189

	
178 190
  void CbcMip::_setCoeff(int ix, int jx, Value value) {
179 191
    _prob->setElement(ix, jx, value);
180 192
  }
181 193

	
182 194
  CbcMip::Value CbcMip::_getCoeff(int ix, int jx) const {
183 195
    return _prob->getElement(ix, jx);
184 196
  }
185 197

	
186 198

	
187 199
  void CbcMip::_setColLowerBound(int i, Value lo) {
188 200
    LEMON_ASSERT(lo != INF, "Invalid bound");
189 201
    _prob->setColumnLower(i, lo == - INF ? - COIN_DBL_MAX : lo);
190 202
  }
191 203

	
192 204
  CbcMip::Value CbcMip::_getColLowerBound(int i) const {
193 205
    double val = _prob->getColumnLower(i);
194 206
    return val == - COIN_DBL_MAX ? - INF : val;
195 207
  }
196 208

	
197 209
  void CbcMip::_setColUpperBound(int i, Value up) {
198 210
    LEMON_ASSERT(up != -INF, "Invalid bound");
199 211
    _prob->setColumnUpper(i, up == INF ? COIN_DBL_MAX : up);
200 212
  }
201 213

	
202 214
  CbcMip::Value CbcMip::_getColUpperBound(int i) const {
203 215
    double val = _prob->getColumnUpper(i);
204 216
    return val == COIN_DBL_MAX ? INF : val;
205 217
  }
206 218

	
207 219
  void CbcMip::_setRowLowerBound(int i, Value lo) {
208 220
    LEMON_ASSERT(lo != INF, "Invalid bound");
209 221
    _prob->setRowLower(i, lo == - INF ? - COIN_DBL_MAX : lo);
210 222
  }
211 223

	
212 224
  CbcMip::Value CbcMip::_getRowLowerBound(int i) const {
213 225
    double val = _prob->getRowLower(i);
214 226
    return val == - COIN_DBL_MAX ? - INF : val;
215 227
  }
216 228

	
217 229
  void CbcMip::_setRowUpperBound(int i, Value up) {
218 230
    LEMON_ASSERT(up != -INF, "Invalid bound");
219 231
    _prob->setRowUpper(i, up == INF ? COIN_DBL_MAX : up);
220 232
  }
221 233

	
222 234
  CbcMip::Value CbcMip::_getRowUpperBound(int i) const {
223 235
    double val = _prob->getRowUpper(i);
224 236
    return val == COIN_DBL_MAX ? INF : val;

Changeset was too big and was cut off... Show full diff

0 comments (0 inline)