Changes in / [932:773dd96ecdd8:931:f112c18bc304] in lemon-main
- Files:
-
- 1 added
- 9 deleted
- 36 edited
Legend:
- Unmodified
- Added
- Removed
-
CMakeLists.txt
r930 r744 3 3 SET(PROJECT_NAME "LEMON") 4 4 PROJECT(${PROJECT_NAME}) 5 6 INCLUDE(FindPythonInterp)7 INCLUDE(FindWget)8 5 9 6 IF(EXISTS ${PROJECT_SOURCE_DIR}/cmake/version.cmake) … … 12 9 SET(LEMON_VERSION $ENV{LEMON_VERSION} CACHE STRING "LEMON version string.") 13 10 ELSE() 14 EXECUTE_PROCESS(15 COMMAND ${PYTHON_EXECUTABLE} ./scripts/chg-len.py16 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}17 OUTPUT_VARIABLE HG_REVISION_PATH18 ERROR_QUIET19 OUTPUT_STRIP_TRAILING_WHITESPACE20 )21 11 EXECUTE_PROCESS( 22 12 COMMAND hg id -i … … 27 17 ) 28 18 IF(HG_REVISION STREQUAL "") 29 SET(HG_REVISION_ID "hg-tip") 30 ELSE() 31 IF(HG_REVISION_PATH STREQUAL "") 32 SET(HG_REVISION_ID ${HG_REVISION}) 33 ELSE() 34 SET(HG_REVISION_ID ${HG_REVISION_PATH}.${HG_REVISION}) 35 ENDIF() 19 SET(HG_REVISION "hg-tip") 36 20 ENDIF() 37 SET(LEMON_VERSION ${HG_REVISION _ID} CACHE STRING "LEMON version string.")21 SET(LEMON_VERSION ${HG_REVISION} CACHE STRING "LEMON version string.") 38 22 ENDIF() 39 23 … … 48 32 FIND_PACKAGE(COIN) 49 33 50 IF(DEFINED ENV{LEMON_CXX_WARNING})51 SET(CXX_WARNING $ENV{LEMON_CXX_WARNING})52 ELSE()53 IF(CMAKE_COMPILER_IS_GNUCXX)54 SET(CXX_WARNING "-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")55 SET(CMAKE_CXX_FLAGS_DEBUG CACHE STRING "-ggdb")56 SET(CMAKE_C_FLAGS_DEBUG CACHE STRING "-ggdb")57 ELSEIF(MSVC)58 # This part is unnecessary 'casue the same is set by the lemon/core.h.59 # Still keep it as an example.60 SET(CXX_WARNING "/wd4250 /wd4355 /wd4503 /wd4800 /wd4996")61 # Suppressed warnings:62 # C4250: 'class1' : inherits 'class2::member' via dominance63 # C4355: 'this' : used in base member initializer list64 # C4503: 'function' : decorated name length exceeded, name was truncated65 # C4800: 'type' : forcing value to bool 'true' or 'false'66 # (performance warning)67 # C4996: 'function': was declared deprecated68 ELSE()69 SET(CXX_WARNING "-Wall -W")70 ENDIF()71 ENDIF()72 SET(LEMON_CXX_WARNING_FLAGS ${CXX_WARNING} CACHE STRING "LEMON warning flags.")73 74 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LEMON_CXX_WARNING_FLAGS}")75 76 SET( CMAKE_CXX_FLAGS_MAINTAINER "-Werror -ggdb" CACHE STRING77 "Flags used by the C++ compiler during maintainer builds."78 FORCE )79 SET( CMAKE_C_FLAGS_MAINTAINER "-Werror" CACHE STRING80 "Flags used by the C compiler during maintainer builds."81 FORCE )82 SET( CMAKE_EXE_LINKER_FLAGS_MAINTAINER83 "-Wl,--warn-unresolved-symbols,--warn-once" CACHE STRING84 "Flags used for linking binaries during maintainer builds."85 FORCE )86 SET( CMAKE_SHARED_LINKER_FLAGS_MAINTAINER87 "-Wl,--warn-unresolved-symbols,--warn-once" CACHE STRING88 "Flags used by the shared libraries linker during maintainer builds."89 FORCE )90 MARK_AS_ADVANCED(91 CMAKE_CXX_FLAGS_MAINTAINER92 CMAKE_C_FLAGS_MAINTAINER93 CMAKE_EXE_LINKER_FLAGS_MAINTAINER94 CMAKE_SHARED_LINKER_FLAGS_MAINTAINER )95 96 IF(CMAKE_CONFIGURATION_TYPES)97 LIST(APPEND CMAKE_CONFIGURATION_TYPES Maintainer)98 LIST(REMOVE_DUPLICATES CMAKE_CONFIGURATION_TYPES)99 SET(CMAKE_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" CACHE STRING100 "Add the configurations that we need"101 FORCE)102 endif()103 104 IF(NOT CMAKE_BUILD_TYPE)105 SET(CMAKE_BUILD_TYPE "Release")106 ENDIF()107 108 SET( CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING109 "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel Maintainer."110 FORCE )111 112 113 34 INCLUDE(CheckTypeSize) 114 35 CHECK_TYPE_SIZE("long long" LONG_LONG) 115 36 SET(LEMON_HAVE_LONG_LONG ${HAVE_LONG_LONG}) 116 37 38 INCLUDE(FindPythonInterp) 39 117 40 ENABLE_TESTING() 118 119 IF(${CMAKE_BUILD_TYPE} STREQUAL "Maintainer")120 ADD_CUSTOM_TARGET(check ALL COMMAND ${CMAKE_CTEST_COMMAND})121 ELSE()122 ADD_CUSTOM_TARGET(check COMMAND ${CMAKE_CTEST_COMMAND})123 ENDIF()124 41 125 42 ADD_SUBDIRECTORY(lemon) 126 43 IF(${CMAKE_SOURCE_DIR} STREQUAL ${PROJECT_SOURCE_DIR}) 127 ADD_SUBDIRECTORY(contrib)128 44 ADD_SUBDIRECTORY(demo) 129 45 ADD_SUBDIRECTORY(tools) … … 149 65 ENDIF() 150 66 151 IF(${CMAKE_SOURCE_DIR} STREQUAL ${PROJECT_SOURCE_DIR} )67 IF(${CMAKE_SOURCE_DIR} STREQUAL ${PROJECT_SOURCE_DIR} AND WIN32) 152 68 SET(CPACK_PACKAGE_NAME ${PROJECT_NAME}) 153 69 SET(CPACK_PACKAGE_VENDOR "EGRES") -
LICENSE
r879 r553 2 2 copyright/license. 3 3 4 Copyright (C) 2003-20 10Egervary Jeno Kombinatorikus Optimalizalasi4 Copyright (C) 2003-2009 Egervary Jeno Kombinatorikus Optimalizalasi 5 5 Kutatocsoport (Egervary Combinatorial Optimization Research Group, 6 6 EGRES). -
NEWS
r881 r665 1 2010-03-19 Version 1.2 released2 3 This is major feature release4 5 * New algorithms6 * Bellman-Ford algorithm (#51)7 * Minimum mean cycle algorithms (#179)8 * Karp, Hartman-Orlin and Howard algorithms9 * New minimum cost flow algorithms (#180)10 * Cost Scaling algorithms11 * Capacity Scaling algorithm12 * Cycle-Canceling algorithms13 * Planarity related algorithms (#62)14 * Planarity checking algorithm15 * Planar embedding algorithm16 * Schnyder's planar drawing algorithm17 * Coloring planar graphs with five or six colors18 * Fractional matching algorithms (#314)19 * New data structures20 * StaticDigraph structure (#68)21 * Several new priority queue structures (#50, #301)22 * Fibonacci, Radix, Bucket, Pairing, Binomial23 D-ary and fourary heaps (#301)24 * Iterable map structures (#73)25 * Other new tools and functionality26 * Map utility functions (#320)27 * Reserve functions are added to ListGraph and SmartGraph (#311)28 * A resize() function is added to HypercubeGraph (#311)29 * A count() function is added to CrossRefMap (#302)30 * Support for multiple targets in Suurballe using fullInit() (#181)31 * Traits class and named parameters for Suurballe (#323)32 * Separate reset() and resetParams() functions in NetworkSimplex33 to handle graph changes (#327)34 * tolerance() functions are added to HaoOrlin (#306)35 * Implementation improvements36 * Improvements in weighted matching algorithms (#314)37 * Jumpstart initialization38 * ArcIt iteration is based on out-arc lists instead of in-arc lists39 in ListDigraph (#311)40 * Faster add row operation in CbcMip (#203)41 * Better implementation for split() in ListDigraph (#311)42 * ArgParser can also throw exception instead of exit(1) (#332)43 * Miscellaneous44 * A simple interactive bootstrap script45 * Doc improvements (#62,#180,#299,#302,#303,#304,#307,#311,#331,#315,46 #316,#319)47 * BibTeX references in the doc (#184)48 * Optionally use valgrind when running tests49 * Also check ReferenceMapTag in concept checks (#312)50 * dimacs-solver uses long long type by default.51 * Several bugfixes (compared to release 1.1):52 #295: Suppress MSVC warnings using pragmas53 ----: Various CMAKE related improvements54 * Remove duplications from doc/CMakeLists.txt55 * Rename documentation install folder from 'docs' to 'html'56 * Add tools/CMakeLists.txt to the tarball57 * Generate and install LEMONConfig.cmake58 * Change the label of the html project in Visual Studio59 * Fix the check for the 'long long' type60 * Put the version string into config.h61 * Minor CMake improvements62 * Set the version to 'hg-tip' if everything fails63 #311: Add missing 'explicit' keywords64 #302: Fix the implementation and doc of CrossRefMap65 #308: Remove duplicate list_graph.h entry from source list66 #307: Bugfix in Preflow and Circulation67 #305: Bugfix and extension in the rename script68 #312: Also check ReferenceMapTag in concept checks69 #250: Bugfix in pathSource() and pathTarget()70 #321: Use pathCopy(from,to) instead of copyPath(to,from)71 #322: Distribure LEMONConfig.cmake.in72 #330: Bug fix in map_extender.h73 #336: Fix the date field comment of graphToEps() output74 #323: Bug fix in Suurballe75 #335: Fix clear() function in ExtendFindEnum76 #337: Use void* as the LPX object pointer77 #317: Fix (and improve) error message in mip_test.cc78 Remove unnecessary OsiCbc dependency79 #356: Allow multiple executions of weighted matching algorithms (#356)80 81 1 2009-05-13 Version 1.1 released 82 2 … … 153 73 ----: Add missing unistd.h include to time_measure.h 154 74 #204: Compilation bug fixed in graph_to_eps.h with VS2005 155 #214,#215: windows.h should never be included by LEMONheaders75 #214,#215: windows.h should never be included by lemon headers 156 76 #230: Build systems check the availability of 'long long' type 157 77 #229: Default implementation of Tolerance<> is used for integer types … … 175 95 2008-10-13 Version 1.0 released 176 96 177 178 179 180 97 This is the first stable release of LEMON. Compared to the 0.x 98 release series, it features a considerably smaller but more 99 matured set of tools. The API has also completely revised and 100 changed in several places. 181 101 182 102 * The major name changes compared to the 0.x series (see the 183 103 Migration Guide in the doc for more details) 184 104 * Graph -> Digraph, UGraph -> Graph 185 105 * Edge -> Arc, UEdge -> Edge 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 106 * source(UEdge)/target(UEdge) -> u(Edge)/v(Edge) 107 * Other improvements 108 * Better documentation 109 * Reviewed and cleaned up codebase 110 * CMake based build system (along with the autotools based one) 111 * Contents of the library (ported from 0.x) 112 * Algorithms 113 * breadth-first search (bfs.h) 114 * depth-first search (dfs.h) 115 * Dijkstra's algorithm (dijkstra.h) 116 * Kruskal's algorithm (kruskal.h) 117 * Data structures 118 * graph data structures (list_graph.h, smart_graph.h) 119 * path data structures (path.h) 120 * binary heap data structure (bin_heap.h) 121 * union-find data structures (unionfind.h) 122 * miscellaneous property maps (maps.h) 123 * two dimensional vector and bounding box (dim2.h) 204 124 * Concepts 205 125 * graph structure concepts (concepts/digraph.h, concepts/graph.h, 206 126 concepts/graph_components.h) 207 208 209 210 211 212 213 214 215 127 * concepts for other structures (concepts/heap.h, concepts/maps.h, 128 concepts/path.h) 129 * Tools 130 * Mersenne twister random number generator (random.h) 131 * tools for measuring cpu and wall clock time (time_measure.h) 132 * tools for counting steps and events (counter.h) 133 * tool for parsing command line arguments (arg_parser.h) 134 * tool for visualizing graphs (graph_to_eps.h) 135 * tools for reading and writing data in LEMON Graph Format 216 136 (lgf_reader.h, lgf_writer.h) 217 137 * tools to handle the anomalies of calculations with 218 138 floating point numbers (tolerance.h) 219 139 * tools to manage RGB colors (color.h) 220 221 222 223 224 140 * Infrastructure 141 * extended assertion handling (assert.h) 142 * exception classes and error handling (error.h) 143 * concept checking (concept_check.h) 144 * commonly used mathematical constants (math.h) -
configure.ac
r930 r793 115 115 dnl Add dependencies on files generated by configure. 116 116 AC_SUBST([CONFIG_STATUS_DEPENDENCIES], 117 ['$(top_srcdir)/doc/Doxyfile.in $(top_srcdir)/ doc/mainpage.dox.in $(top_srcdir)/lemon/lemon.pc.in $(top_srcdir)/cmake/version.cmake.in'])117 ['$(top_srcdir)/doc/Doxyfile.in $(top_srcdir)/lemon/lemon.pc.in $(top_srcdir)/cmake/version.cmake.in']) 118 118 119 119 AC_CONFIG_FILES([ … … 122 122 cmake/version.cmake 123 123 doc/Doxyfile 124 doc/mainpage.dox125 124 lemon/lemon.pc 126 125 ]) -
doc/CMakeLists.txt
r930 r865 4 4 SET(abs_top_builddir ${PROJECT_BINARY_DIR}) 5 5 6 SET(LEMON_DOC_SOURCE_BROWSER "NO" CACHE STRING "Include source into the doc (YES/NO).")7 8 6 CONFIGURE_FILE( 9 7 ${PROJECT_SOURCE_DIR}/doc/Doxyfile.in 10 8 ${PROJECT_BINARY_DIR}/doc/Doxyfile 11 @ONLY12 )13 14 CONFIGURE_FILE(15 ${PROJECT_SOURCE_DIR}/doc/mainpage.dox.in16 ${PROJECT_BINARY_DIR}/doc/mainpage.dox17 9 @ONLY 18 10 ) … … 61 53 62 54 ENDIF() 63 64 IF(WGET_FOUND)65 ADD_CUSTOM_TARGET(update-external-tags66 COMMAND ${CMAKE_COMMAND} -E make_directory dl67 # COMMAND ${CMAKE_COMMAND} -E copy libstdc++.tag dl68 COMMAND ${WGET_EXECUTABLE} wget -P dl -N libstdc++.tag.tmp http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/libstdc++.tag69 COMMAND ${CMAKE_COMMAND} -E rename dl/libstdc++.tag libstdc++.tag70 COMMAND ${CMAKE_COMMAND} -E remove dl/libstdc++.tag71 COMMAND ${CMAKE_COMMAND} -E remove_directory dl72 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}73 )74 ENDIF() -
doc/Doxyfile.in
r930 r756 1 # Doxyfile 1. 7.31 # Doxyfile 1.5.9 2 2 3 3 #--------------------------------------------------------------------------- … … 5 5 #--------------------------------------------------------------------------- 6 6 DOXYFILE_ENCODING = UTF-8 7 PROJECT_NAME = 8 PROJECT_NUMBER = 9 PROJECT_BRIEF = 10 PROJECT_LOGO = 7 PROJECT_NAME = @PACKAGE_NAME@ 8 PROJECT_NUMBER = @PACKAGE_VERSION@ 11 9 OUTPUT_DIRECTORY = 12 10 CREATE_SUBDIRS = NO … … 32 30 OPTIMIZE_FOR_FORTRAN = NO 33 31 OPTIMIZE_OUTPUT_VHDL = NO 34 EXTENSION_MAPPING =35 32 BUILTIN_STL_SUPPORT = YES 36 33 CPP_CLI_SUPPORT = NO … … 58 55 HIDE_SCOPE_NAMES = YES 59 56 SHOW_INCLUDE_FILES = YES 60 FORCE_LOCAL_INCLUDES = NO61 57 INLINE_INFO = YES 62 58 SORT_MEMBER_DOCS = NO 63 59 SORT_BRIEF_DOCS = NO 64 SORT_MEMBERS_CTORS_1ST = NO65 60 SORT_GROUP_NAMES = NO 66 61 SORT_BY_SCOPE_NAME = NO 67 STRICT_PROTO_MATCHING = NO68 62 GENERATE_TODOLIST = YES 69 63 GENERATE_TESTLIST = YES … … 77 71 SHOW_NAMESPACES = YES 78 72 FILE_VERSION_FILTER = 79 LAYOUT_FILE = "@abs_top_srcdir@/doc/DoxygenLayout.xml"73 LAYOUT_FILE = DoxygenLayout.xml 80 74 #--------------------------------------------------------------------------- 81 75 # configuration options related to warning and progress messages … … 96 90 "@abs_top_srcdir@/lemon/concepts" \ 97 91 "@abs_top_srcdir@/demo" \ 98 "@abs_top_srcdir@/contrib" \99 92 "@abs_top_srcdir@/tools" \ 100 93 "@abs_top_srcdir@/test/test_tools.h" \ 101 "@abs_top_builddir@/doc/mainpage.dox" \102 94 "@abs_top_builddir@/doc/references.dox" 103 95 INPUT_ENCODING = UTF-8 … … 120 112 FILTER_PATTERNS = 121 113 FILTER_SOURCE_FILES = NO 122 FILTER_SOURCE_PATTERNS =123 114 #--------------------------------------------------------------------------- 124 115 # configuration options related to source browsing 125 116 #--------------------------------------------------------------------------- 126 SOURCE_BROWSER = @LEMON_DOC_SOURCE_BROWSER@117 SOURCE_BROWSER = NO 127 118 INLINE_SOURCES = NO 128 119 STRIP_CODE_COMMENTS = YES … … 147 138 HTML_FOOTER = 148 139 HTML_STYLESHEET = 149 HTML_COLORSTYLE_HUE = 220150 HTML_COLORSTYLE_SAT = 100151 HTML_COLORSTYLE_GAMMA = 80152 HTML_TIMESTAMP = YES153 140 HTML_ALIGN_MEMBERS = YES 154 HTML_DYNAMIC_SECTIONS = YES141 HTML_DYNAMIC_SECTIONS = NO 155 142 GENERATE_DOCSET = NO 156 143 DOCSET_FEEDNAME = "Doxygen generated docs" 157 144 DOCSET_BUNDLE_ID = org.doxygen.Project 158 DOCSET_PUBLISHER_ID = org.doxygen.Publisher159 DOCSET_PUBLISHER_NAME = Publisher160 145 GENERATE_HTMLHELP = NO 161 146 CHM_FILE = … … 169 154 QHP_NAMESPACE = org.doxygen.Project 170 155 QHP_VIRTUAL_FOLDER = doc 171 QHP_CUST_FILTER_NAME =172 QHP_CUST_FILTER_ATTRS =173 QHP_SECT_FILTER_ATTRS =174 156 QHG_LOCATION = 175 GENERATE_ECLIPSEHELP = NO176 ECLIPSE_DOC_ID = org.doxygen.Project177 157 DISABLE_INDEX = NO 178 158 ENUM_VALUES_PER_LINE = 4 179 159 GENERATE_TREEVIEW = NO 180 USE_INLINE_TREES = NO181 160 TREEVIEW_WIDTH = 250 182 EXT_LINKS_IN_WINDOW = NO183 161 FORMULA_FONTSIZE = 10 184 FORMULA_TRANSPARENT = YES185 USE_MATHJAX = NO186 MATHJAX_RELPATH = http://www.mathjax.org/mathjax187 SEARCHENGINE = YES188 SERVER_BASED_SEARCH = NO189 162 #--------------------------------------------------------------------------- 190 163 # configuration options related to the LaTeX output … … 203 176 LATEX_BATCHMODE = NO 204 177 LATEX_HIDE_INDICES = NO 205 LATEX_SOURCE_CODE = NO206 178 #--------------------------------------------------------------------------- 207 179 # configuration options related to the RTF output … … 252 224 SKIP_FUNCTION_MACROS = YES 253 225 #--------------------------------------------------------------------------- 254 # Configuration::additions related to external references255 #--------------------------------------------------------------------------- 256 TAGFILES = "@abs_top_ builddir@/doc/libstdc++.tag = http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/ "226 # Options related to the search engine 227 #--------------------------------------------------------------------------- 228 TAGFILES = "@abs_top_srcdir@/doc/libstdc++.tag = http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/ " 257 229 GENERATE_TAGFILE = html/lemon.tag 258 230 ALLEXTERNALS = NO … … 266 238 HIDE_UNDOC_RELATIONS = YES 267 239 HAVE_DOT = YES 268 DOT_NUM_THREADS = 0269 240 DOT_FONTNAME = FreeSans 270 241 DOT_FONTSIZE = 10 … … 284 255 DOT_PATH = 285 256 DOTFILE_DIRS = 286 MSCFILE_DIRS =287 257 DOT_GRAPH_MAX_NODES = 50 288 258 MAX_DOT_GRAPH_DEPTH = 0 … … 291 261 GENERATE_LEGEND = YES 292 262 DOT_CLEANUP = YES 263 #--------------------------------------------------------------------------- 264 # Configuration::additions related to the search engine 265 #--------------------------------------------------------------------------- 266 SEARCHENGINE = NO -
doc/DoxygenLayout.xml
r928 r316 3 3 <navindex> 4 4 <tab type="mainpage" visible="yes" title=""/> 5 <tab type="modules" visible="yes" title="" intro=""/>5 <tab type="modules" visible="yes" title=""/> 6 6 <tab type="classes" visible="yes" title=""> 7 <tab type="classes" visible="yes" title="" intro=""/>8 <tab type="classindex" visible="$ALPHABETICAL_INDEX" title=""/> 9 <tab type="hierarchy" visible="yes" title="" intro=""/>10 <tab type="classmembers" visible="yes" title="" intro=""/>7 <tab type="classes" visible="yes" title=""/> 8 <tab type="classindex" visible="$ALPHABETICAL_INDEX" title=""/> 9 <tab type="hierarchy" visible="yes" title=""/> 10 <tab type="classmembers" visible="yes" title=""/> 11 11 </tab> 12 12 <tab type="namespaces" visible="yes" title=""> 13 <tab type="namespaces" visible="yes" title="" intro=""/>14 <tab type="namespacemembers" visible="yes" title="" intro=""/>13 <tab type="namespaces" visible="yes" title=""/> 14 <tab type="namespacemembers" visible="yes" title=""/> 15 15 </tab> 16 16 <tab type="files" visible="yes" title=""> 17 <tab type="files" visible="yes" title="" intro=""/>18 <tab type="globals" visible="yes" title="" intro=""/>17 <tab type="files" visible="yes" title=""/> 18 <tab type="globals" visible="yes" title=""/> 19 19 </tab> 20 <tab type="dirs" visible="yes" title="" intro=""/>21 <tab type="examples" visible="yes" title="" intro=""/>22 <tab type="pages" visible="yes" title="" intro=""/>20 <tab type="dirs" visible="yes" title=""/> 21 <tab type="examples" visible="yes" title=""/> 22 <tab type="pages" visible="yes" title=""/> 23 23 </navindex> 24 24 -
doc/coding_style.dox
r919 r440 99 99 \subsection pri-loc-var Private member variables 100 100 101 Private member variables should start with underscore .101 Private member variables should start with underscore 102 102 103 103 \code 104 _start_with_underscore 104 _start_with_underscores 105 105 \endcode 106 106 -
doc/dirs.dox
r925 r440 32 32 documentation. 33 33 */ 34 35 /**36 \dir contrib37 \brief Directory for user contributed source codes.38 39 You can place your own C++ code using LEMON into this directory, which40 will compile to an executable along with LEMON when you build the41 library. This is probably the easiest way of compiling short to medium42 codes, for this does require neither a LEMON installed system-wide nor43 adding several paths to the compiler.44 45 Please have a look at <tt>contrib/CMakeLists.txt</tt> for46 instruction on how to add your own files into the build process. */47 34 48 35 /** -
doc/groups.dox
r919 r877 264 264 265 265 /** 266 @defgroup matrices Matrices 267 @ingroup datas 268 \brief Two dimensional data storages implemented in LEMON. 269 270 This group contains two dimensional data storages implemented in LEMON. 271 */ 272 273 /** 266 274 @defgroup auxdat Auxiliary Data Structures 267 275 @ingroup datas … … 407 415 strongly polynomial \ref klein67primal, \ref goldberg89cyclecanceling. 408 416 409 In general , \ref NetworkSimplex and \ref CostScaling are the most efficient410 implementations, but the other two algorithms could be faster in special cases.417 In general NetworkSimplex is the most efficient implementation, 418 but in special cases other algorithms could be faster. 411 419 For example, if the total supply and/or capacities are rather small, 412 \refCapacityScaling is usually the fastest algorithm (without effective scaling).420 CapacityScaling is usually the fastest algorithm (without effective scaling). 413 421 */ 414 422 … … 465 473 466 474 LEMON contains three algorithms for solving the minimum mean cycle problem: 467 - \ref Karp Mmc Karp's original algorithm \ref amo93networkflows,475 - \ref Karp "Karp"'s original algorithm \ref amo93networkflows, 468 476 \ref dasdan98minmeancycle. 469 - \ref HartmannOrlin Mmc Hartmann-Orlin's algorithm, which is an improved477 - \ref HartmannOrlin "Hartmann-Orlin"'s algorithm, which is an improved 470 478 version of Karp's algorithm \ref dasdan98minmeancycle. 471 - \ref Howard Mmc Howard's policy iteration algorithm479 - \ref Howard "Howard"'s policy iteration algorithm 472 480 \ref dasdan98minmeancycle. 473 481 474 In practice, the \ref HowardMmc "Howard" algorithm turned out to be by far the475 most efficient one, though the best known theoretical bound on its running 476 time isexponential.477 Both \ref KarpMmc "Karp" and \ref HartmannOrlinMmc "Hartmann-Orlin" algorithms478 run in time O(ne) and use space O(n<sup>2</sup>+e), but the latter one is 479 typically faster due to theapplied early termination scheme.482 In practice, the Howard algorithm proved to be by far the most efficient 483 one, though the best known theoretical bound on its running time is 484 exponential. 485 Both Karp and HartmannOrlin algorithms run in time O(ne) and use space 486 O(n<sup>2</sup>+e), but the latter one is typically faster due to the 487 applied early termination scheme. 480 488 */ 481 489 … … 540 548 541 549 /** 542 @defgroup planar Planar Embedding and Drawing550 @defgroup planar Planarity Embedding and Drawing 543 551 @ingroup algs 544 552 \brief Algorithms for planarity checking, embedding and drawing … … 552 560 553 561 /** 554 @defgroup approx _algsApproximation Algorithms562 @defgroup approx Approximation Algorithms 555 563 @ingroup algs 556 564 \brief Approximation algorithms. … … 558 566 This group contains the approximation and heuristic algorithms 559 567 implemented in LEMON. 560 561 <b>Maximum Clique Problem</b>562 - \ref GrossoLocatelliPullanMc An efficient heuristic algorithm of563 Grosso, Locatelli, and Pullan.564 568 */ 565 569 -
doc/references.bib
r904 r755 298 298 address = {Dublin, Ireland}, 299 299 year = 1991, 300 month = sep 301 } 302 303 %%%%% Other algorithms %%%%% 304 305 @article{grosso08maxclique, 306 author = {Andrea Grosso and Marco Locatelli and Wayne Pullan}, 307 title = {Simple ingredients leading to very efficient 308 heuristics for the maximum clique problem}, 309 journal = {Journal of Heuristics}, 310 year = 2008, 311 volume = 14, 312 number = 6, 313 pages = {587--612} 314 } 300 month = sep, 301 } -
lemon/CMakeLists.txt
r908 r679 7 7 ${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake 8 8 ${CMAKE_CURRENT_BINARY_DIR}/config.h 9 )10 11 CONFIGURE_FILE(12 ${CMAKE_CURRENT_SOURCE_DIR}/lemon.pc.cmake13 ${CMAKE_CURRENT_BINARY_DIR}/lemon.pc14 @ONLY15 9 ) 16 10 … … 73 67 COMPONENT headers 74 68 ) 75 76 INSTALL(77 FILES ${CMAKE_CURRENT_BINARY_DIR}/lemon.pc78 DESTINATION lib/pkgconfig79 )80 -
lemon/Makefile.am
r917 r874 91 91 lemon/graph_to_eps.h \ 92 92 lemon/grid_graph.h \ 93 lemon/grosso_locatelli_pullan_mc.h \94 93 lemon/hartmann_orlin_mmc.h \ 95 94 lemon/howard_mmc.h \ … … 108 107 lemon/math.h \ 109 108 lemon/min_cost_arborescence.h \ 110 lemon/max_cardinality_search.h \111 lemon/nagamochi_ibaraki.h \112 109 lemon/nauty_reader.h \ 113 110 lemon/network_simplex.h \ -
lemon/arg_parser.h
r879 r877 36 36 37 37 ///Exception used by ArgParser 38 39 ///Exception used by ArgParser.40 ///41 38 class ArgParserException : public Exception { 42 39 public: 43 /// Reasons for failure44 45 /// Reasons for failure.46 ///47 40 enum Reason { 48 HELP, /// < <tt>--help</tt> option was given.49 UNKNOWN_OPT, /// < Unknown option was given.50 INVALID_OPT /// < Invalid combination of options.41 HELP, /// <tt>--help</tt> option was given 42 UNKNOWN_OPT, /// Unknown option was given 43 INVALID_OPT /// Invalid combination of options 51 44 }; 52 45 -
lemon/bellman_ford.h
r880 r877 29 29 #include <lemon/error.h> 30 30 #include <lemon/maps.h> 31 #include <lemon/tolerance.h> 31 32 #include <lemon/path.h> 32 33 … … 35 36 namespace lemon { 36 37 37 /// \brief Default OperationTraits for the BellmanFord algorithm class.38 /// \brief Default operation traits for the BellmanFord algorithm class. 38 39 /// 39 40 /// This operation traits class defines all computational operations … … 42 43 /// If the numeric type does not have infinity value, then the maximum 43 44 /// value is used as extremal infinity value. 45 /// 46 /// \see BellmanFordToleranceOperationTraits 44 47 template < 45 48 typename V, 46 49 bool has_inf = std::numeric_limits<V>::has_infinity> 47 50 struct BellmanFordDefaultOperationTraits { 48 /// \ e51 /// \brief Value type for the algorithm. 49 52 typedef V Value; 50 53 /// \brief Gives back the zero value of the type. … … 82 85 static bool less(const Value& left, const Value& right) { 83 86 return left < right; 87 } 88 }; 89 90 /// \brief Operation traits for the BellmanFord algorithm class 91 /// using tolerance. 92 /// 93 /// This operation traits class defines all computational operations 94 /// and constants that are used in the Bellman-Ford algorithm. 95 /// The only difference between this implementation and 96 /// \ref BellmanFordDefaultOperationTraits is that this class uses 97 /// the \ref Tolerance "tolerance technique" in its \ref less() 98 /// function. 99 /// 100 /// \tparam V The value type. 101 /// \tparam eps The epsilon value for the \ref less() function. 102 /// By default, it is the epsilon value used by \ref Tolerance 103 /// "Tolerance<V>". 104 /// 105 /// \see BellmanFordDefaultOperationTraits 106 #ifdef DOXYGEN 107 template <typename V, V eps> 108 #else 109 template < 110 typename V, 111 V eps = Tolerance<V>::def_epsilon> 112 #endif 113 struct BellmanFordToleranceOperationTraits { 114 /// \brief Value type for the algorithm. 115 typedef V Value; 116 /// \brief Gives back the zero value of the type. 117 static Value zero() { 118 return static_cast<Value>(0); 119 } 120 /// \brief Gives back the positive infinity value of the type. 121 static Value infinity() { 122 return std::numeric_limits<Value>::infinity(); 123 } 124 /// \brief Gives back the sum of the given two elements. 125 static Value plus(const Value& left, const Value& right) { 126 return left + right; 127 } 128 /// \brief Gives back \c true only if the first value is less than 129 /// the second. 130 static bool less(const Value& left, const Value& right) { 131 return left + eps < right; 84 132 } 85 133 }; … … 108 156 /// It defines the used operations and the infinity value for the 109 157 /// given \c Value type. 110 /// \see BellmanFordDefaultOperationTraits 158 /// \see BellmanFordDefaultOperationTraits, 159 /// BellmanFordToleranceOperationTraits 111 160 typedef BellmanFordDefaultOperationTraits<Value> OperationTraits; 112 161 … … 838 887 /// It defines the used operations and the infinity value for the 839 888 /// given \c Value type. 840 /// \see BellmanFordDefaultOperationTraits 889 /// \see BellmanFordDefaultOperationTraits, 890 /// BellmanFordToleranceOperationTraits 841 891 typedef BellmanFordDefaultOperationTraits<Value> OperationTraits; 842 892 -
lemon/bits/edge_set_extender.h
r884 r877 281 281 typedef EdgeSetExtender Graph; 282 282 283 typedef True UndirectedTag;284 285 283 typedef typename Parent::Node Node; 286 284 typedef typename Parent::Arc Arc; -
lemon/bits/graph_adaptor_extender.h
r882 r617 182 182 typedef GraphAdaptorExtender Adaptor; 183 183 184 typedef True UndirectedTag;185 186 184 typedef typename Parent::Node Node; 187 185 typedef typename Parent::Arc Arc; -
lemon/bits/path_dump.h
r887 r529 50 50 51 51 bool empty() const { 52 return predMap[target] == INVALID;52 return predMap[target] != INVALID; 53 53 } 54 54 … … 124 124 125 125 bool empty() const { 126 return predMatrixMap(source, target) == INVALID;126 return source != target; 127 127 } 128 128 -
lemon/capacity_scaling.h
r922 r877 87 87 /// consider to use the named template parameters instead. 88 88 /// 89 /// \warning Both \c V and \c C must be signed number types. 90 /// \warning All input data (capacities, supply values, and costs) must 89 /// \warning Both number types must be signed and all input data must 91 90 /// be integer. 92 /// \warning This algorithm does not support negative costs for 93 /// arcs havinginfinite upper bound.91 /// \warning This algorithm does not support negative costs for such 92 /// arcs that have infinite upper bound. 94 93 #ifdef DOXYGEN 95 94 template <typename GR, typename V, typename C, typename TR> … … 424 423 /// 425 424 /// Using this function has the same effect as using \ref supplyMap() 426 /// with a map in which \c k is assigned to \c s, \c -k is425 /// with such a map in which \c k is assigned to \c s, \c -k is 427 426 /// assigned to \c t and all other nodes have zero supply value. 428 427 /// -
lemon/core.h
r919 r877 395 395 static void copy(const From& from, Digraph &to, 396 396 NodeRefMap& nodeRefMap, ArcRefMap& arcRefMap) { 397 to.clear();398 397 for (typename From::NodeIt it(from); it != INVALID; ++it) { 399 398 nodeRefMap[it] = to.addNode(); … … 423 422 static void copy(const From& from, Graph &to, 424 423 NodeRefMap& nodeRefMap, EdgeRefMap& edgeRefMap) { 425 to.clear();426 424 for (typename From::NodeIt it(from); it != INVALID; ++it) { 427 425 nodeRefMap[it] = to.addNode(); … … 447 445 448 446 } 449 450 /// \brief Check whether a graph is undirected.451 ///452 /// This function returns \c true if the given graph is undirected.453 #ifdef DOXYGEN454 template <typename GR>455 bool undirected(const GR& g) { return false; }456 #else457 template <typename GR>458 typename enable_if<UndirectedTagIndicator<GR>, bool>::type459 undirected(const GR&) {460 return true;461 }462 template <typename GR>463 typename disable_if<UndirectedTagIndicator<GR>, bool>::type464 undirected(const GR&) {465 return false;466 }467 #endif468 447 469 448 /// \brief Class to copy a digraph. -
lemon/cost_scaling.h
r932 r931 98 98 /// "preflow push-relabel" algorithm for the maximum flow problem. 99 99 /// 100 /// In general, \ref NetworkSimplex and \ref CostScaling are the fastest101 /// implementations available in LEMON for this problem.102 ///103 100 /// Most of the parameters of the problem (except for the digraph) 104 101 /// can be given using separate functions, and the algorithm can be … … 117 114 /// consider to use the named template parameters instead. 118 115 /// 119 /// \warning Both \c V and \c C must be signed number types. 120 /// \warning All input data (capacities, supply values, and costs) must 116 /// \warning Both number types must be signed and all input data must 121 117 /// be integer. 122 /// \warning This algorithm does not support negative costs for 123 /// arcs havinginfinite upper bound.118 /// \warning This algorithm does not support negative costs for such 119 /// arcs that have infinite upper bound. 124 120 /// 125 121 /// \note %CostScaling provides three different internal methods, … … 183 179 /// relabel operation. 184 180 /// By default, the so called \ref PARTIAL_AUGMENT 185 /// "Partial Augment-Relabel" method is used, which turned outto be181 /// "Partial Augment-Relabel" method is used, which proved to be 186 182 /// the most efficient and the most robust on various test inputs. 187 183 /// However, the other methods can be selected using the \ref run() … … 452 448 /// 453 449 /// Using this function has the same effect as using \ref supplyMap() 454 /// with a map in which \c k is assigned to \c s, \c -k is450 /// with such a map in which \c k is assigned to \c s, \c -k is 455 451 /// assigned to \c t and all other nodes have zero supply value. 456 452 /// -
lemon/cycle_canceling.h
r922 r877 66 66 /// algorithm. By default, it is the same as \c V. 67 67 /// 68 /// \warning Both \c V and \c C must be signed number types. 69 /// \warning All input data (capacities, supply values, and costs) must 68 /// \warning Both number types must be signed and all input data must 70 69 /// be integer. 71 /// \warning This algorithm does not support negative costs for 72 /// arcs havinginfinite upper bound.70 /// \warning This algorithm does not support negative costs for such 71 /// arcs that have infinite upper bound. 73 72 /// 74 73 /// \note For more information about the three available methods, … … 118 117 /// \ref CycleCanceling provides three different cycle-canceling 119 118 /// methods. By default, \ref CANCEL_AND_TIGHTEN "Cancel and Tighten" 120 /// is used, which is by far the most efficient and the most robust. 119 /// is used, which proved to be the most efficient and the most robust 120 /// on various test inputs. 121 121 /// However, the other methods can be selected using the \ref run() 122 122 /// function with the proper parameter. … … 350 350 /// 351 351 /// Using this function has the same effect as using \ref supplyMap() 352 /// with a map in which \c k is assigned to \c s, \c -k is352 /// with such a map in which \c k is assigned to \c s, \c -k is 353 353 /// assigned to \c t and all other nodes have zero supply value. 354 354 /// -
lemon/dfs.h
r907 r877 566 566 void start(Node t) 567 567 { 568 while ( !emptyQueue() && !(*_reached)[t])568 while ( !emptyQueue() && G->target(_stack[_stack_head])!=t ) 569 569 processNextArc(); 570 570 } … … 1513 1513 /// with addSource() before using this function. 1514 1514 void start(Node t) { 1515 while ( !emptyQueue() && !(*_reached)[t])1515 while ( !emptyQueue() && _digraph->target(_stack[_stack_head]) != t ) 1516 1516 processNextArc(); 1517 1517 } -
lemon/euler.h
r919 r877 37 37 ///Euler tour iterator for digraphs. 38 38 39 /// \ingroup graph_prop erties39 /// \ingroup graph_prop 40 40 ///This iterator provides an Euler tour (Eulerian circuit) of a \e directed 41 41 ///graph (if there exists) and it converts to the \c Arc type of the digraph. -
lemon/hao_orlin.h
r915 r877 54 54 /// preflow push-relabel algorithm. Our implementation calculates 55 55 /// the minimum cut in \f$ O(n^2\sqrt{m}) \f$ time (we use the 56 /// highest-label rule), or in \f$O(nm)\f$ for unit capacities. A notable57 /// use of this algorithm istesting network reliability.56 /// highest-label rule), or in \f$O(nm)\f$ for unit capacities. The 57 /// purpose of such algorithm is e.g. testing network reliability. 58 58 /// 59 59 /// For an undirected graph you can run just the first phase of the … … 913 913 /// source-side (i.e. a set \f$ X\subsetneq V \f$ with 914 914 /// \f$ source \in X \f$ and minimal outgoing capacity). 915 /// It updates the stored cut if (and only if) the newly found one916 /// is better.917 915 /// 918 916 /// \pre \ref init() must be called before using this function. … … 927 925 /// sink-side (i.e. a set \f$ X\subsetneq V \f$ with 928 926 /// \f$ source \notin X \f$ and minimal outgoing capacity). 929 /// It updates the stored cut if (and only if) the newly found one930 /// is better.931 927 /// 932 928 /// \pre \ref init() must be called before using this function. … … 938 934 /// \brief Run the algorithm. 939 935 /// 940 /// This function runs the algorithm. It chooses source node,941 /// then calls \ref init(), \ref calculateOut()936 /// This function runs the algorithm. It finds nodes \c source and 937 /// \c target arbitrarily and then calls \ref init(), \ref calculateOut() 942 938 /// and \ref calculateIn(). 943 939 void run() { … … 949 945 /// \brief Run the algorithm. 950 946 /// 951 /// This function runs the algorithm. It calls \ref init(),952 /// \ref calculateOut() and \ref calculateIn() with the given953 /// source node.947 /// This function runs the algorithm. It uses the given \c source node, 948 /// finds a proper \c target node and then calls the \ref init(), 949 /// \ref calculateOut() and \ref calculateIn(). 954 950 void run(const Node& s) { 955 951 init(s); … … 970 966 /// \brief Return the value of the minimum cut. 971 967 /// 972 /// This function returns the value of the best cut found by the 973 /// previously called \ref run(), \ref calculateOut() or \ref 974 /// calculateIn(). 968 /// This function returns the value of the minimum cut. 975 969 /// 976 970 /// \pre \ref run(), \ref calculateOut() or \ref calculateIn() … … 983 977 /// \brief Return a minimum cut. 984 978 /// 985 /// This function gives the best cut found by the 986 /// previously called \ref run(), \ref calculateOut() or \ref 987 /// calculateIn(). 988 /// 989 /// It sets \c cutMap to the characteristic vector of the found 990 /// minimum value cut - a non-empty set \f$ X\subsetneq V \f$ 991 /// of minimum outgoing capacity (i.e. \c cutMap will be \c true exactly 979 /// This function sets \c cutMap to the characteristic vector of a 980 /// minimum value cut: it will give a non-empty set \f$ X\subsetneq V \f$ 981 /// with minimal outgoing capacity (i.e. \c cutMap will be \c true exactly 992 982 /// for the nodes of \f$ X \f$). 993 983 /// -
lemon/hartmann_orlin_mmc.h
r879 r877 39 39 /// \tparam GR The type of the digraph. 40 40 /// \tparam CM The type of the cost map. 41 /// It must conform to the \ref concepts::Rea dMap "ReadMap" concept.41 /// It must conform to the \ref concepts::Rea_data "Rea_data" concept. 42 42 #ifdef DOXYGEN 43 43 template <typename GR, typename CM> … … 100 100 /// a directed cycle of minimum mean cost in a digraph 101 101 /// \ref amo93networkflows, \ref dasdan98minmeancycle. 102 /// It is an improved version of \ref Karp Mmc"Karp"'s original algorithm,102 /// It is an improved version of \ref Karp "Karp"'s original algorithm, 103 103 /// it applies an efficient early termination scheme. 104 104 /// It runs in time O(ne) and uses space O(n<sup>2</sup>+e). -
lemon/kruskal.h
r921 r584 31 31 ///\file 32 32 ///\brief Kruskal's algorithm to compute a minimum cost spanning tree 33 /// 34 ///Kruskal's algorithm to compute a minimum cost spanning tree. 35 /// 33 36 34 37 namespace lemon { -
lemon/network_simplex.h
r922 r877 48 48 /// flow problem. 49 49 /// 50 /// In general, \ref NetworkSimplex and \ref CostScaling are the fastest51 /// i mplementations available in LEMON for this problem.52 /// Furthermore, this class supports both directions of the supply/demand53 /// inequalityconstraints. For more information, see \ref SupplyType.50 /// In general, %NetworkSimplex is the fastest implementation available 51 /// in LEMON for this problem. 52 /// Moreover, it supports both directions of the supply/demand inequality 53 /// constraints. For more information, see \ref SupplyType. 54 54 /// 55 55 /// Most of the parameters of the problem (except for the digraph) … … 64 64 /// algorithm. By default, it is the same as \c V. 65 65 /// 66 /// \warning Both \c V and \c C must be signed number types. 67 /// \warning All input data (capacities, supply values, and costs) must 66 /// \warning Both number types must be signed and all input data must 68 67 /// be integer. 69 68 /// … … 127 126 /// of the algorithm. 128 127 /// By default, \ref BLOCK_SEARCH "Block Search" is used, which 129 /// turend outto be the most efficient and the most robust on various128 /// proved to be the most efficient and the most robust on various 130 129 /// test inputs. 131 130 /// However, another pivot rule can be selected using the \ref run() … … 168 167 typedef std::vector<Value> ValueVector; 169 168 typedef std::vector<Cost> CostVector; 170 typedef std::vector<signed char> CharVector; 171 // Note: vector<signed char> is used instead of vector<ArcState> and 172 // vector<ArcDirection> for efficiency reasons 169 typedef std::vector<char> BoolVector; 170 // Note: vector<char> is used instead of vector<bool> for efficiency reasons 173 171 174 172 // State constants for arcs … … 179 177 }; 180 178 181 // Direction constants for tree arcs 182 enum ArcDirection { 183 DIR_DOWN = -1, 184 DIR_UP = 1 185 }; 179 typedef std::vector<signed char> StateVector; 180 // Note: vector<signed char> is used instead of vector<ArcState> for 181 // efficiency reasons 186 182 187 183 private: … … 222 218 IntVector _succ_num; 223 219 IntVector _last_succ; 224 CharVector _pred_dir;225 CharVector _state;226 220 IntVector _dirty_revs; 221 BoolVector _forward; 222 StateVector _state; 227 223 int _root; 228 224 229 225 // Temporary data used in the current pivot iteration 230 226 int in_arc, join, u_in, v_in, u_out, v_out; 227 int first, second, right, last; 228 int stem, par_stem, new_stem; 231 229 Value delta; 232 230 … … 253 251 const IntVector &_target; 254 252 const CostVector &_cost; 255 const CharVector &_state;253 const StateVector &_state; 256 254 const CostVector &_pi; 257 255 int &_in_arc; … … 305 303 const IntVector &_target; 306 304 const CostVector &_cost; 307 const CharVector &_state;305 const StateVector &_state; 308 306 const CostVector &_pi; 309 307 int &_in_arc; … … 344 342 const IntVector &_target; 345 343 const CostVector &_cost; 346 const CharVector &_state;344 const StateVector &_state; 347 345 const CostVector &_pi; 348 346 int &_in_arc; … … 417 415 const IntVector &_target; 418 416 const CostVector &_cost; 419 const CharVector &_state;417 const StateVector &_state; 420 418 const CostVector &_pi; 421 419 int &_in_arc; … … 520 518 const IntVector &_target; 521 519 const CostVector &_cost; 522 const CharVector &_state;520 const StateVector &_state; 523 521 const CostVector &_pi; 524 522 int &_in_arc; … … 573 571 // Check the current candidate list 574 572 int e; 575 Cost c;576 573 for (int i = 0; i != _curr_length; ++i) { 577 574 e = _candidates[i]; 578 c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]); 579 if (c < 0) { 580 _cand_cost[e] = c; 581 } else { 575 _cand_cost[e] = _state[e] * 576 (_cost[e] + _pi[_source[e]] - _pi[_target[e]]); 577 if (_cand_cost[e] >= 0) { 582 578 _candidates[i--] = _candidates[--_curr_length]; 583 579 } … … 589 585 590 586 for (e = _next_arc; e != _search_arc_num; ++e) { 591 c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);592 if (c < 0) {593 _cand_cost[e] = c;587 _cand_cost[e] = _state[e] * 588 (_cost[e] + _pi[_source[e]] - _pi[_target[e]]); 589 if (_cand_cost[e] < 0) { 594 590 _candidates[_curr_length++] = e; 595 591 } … … 638 634 /// 639 635 /// \param graph The digraph the algorithm runs on. 640 /// \param arc_mixing Indicate if the arcs willbe stored in a636 /// \param arc_mixing Indicate if the arcs have to be stored in a 641 637 /// mixed order in the internal data structure. 642 /// In general, it leads to similar performance as using the original 643 /// arc order, but it makes the algorithm more robust and in special 644 /// cases, even significantly faster. Therefore, it is enabled by default. 645 NetworkSimplex(const GR& graph, bool arc_mixing = true) : 638 /// In special cases, it could lead to better overall performance, 639 /// but it is usually slower. Therefore it is disabled by default. 640 NetworkSimplex(const GR& graph, bool arc_mixing = false) : 646 641 _graph(graph), _node_id(graph), _arc_id(graph), 647 642 _arc_mixing(arc_mixing), … … 736 731 /// 737 732 /// \return <tt>(*this)</tt> 738 ///739 /// \sa supplyType()740 733 template<typename SupplyMap> 741 734 NetworkSimplex& supplyMap(const SupplyMap& map) { … … 754 747 /// 755 748 /// Using this function has the same effect as using \ref supplyMap() 756 /// with a map in which \c k is assigned to \c s, \c -k is749 /// with such a map in which \c k is assigned to \c s, \c -k is 757 750 /// assigned to \c t and all other nodes have zero supply value. 758 751 /// … … 921 914 _parent.resize(all_node_num); 922 915 _pred.resize(all_node_num); 923 _ pred_dir.resize(all_node_num);916 _forward.resize(all_node_num); 924 917 _thread.resize(all_node_num); 925 918 _rev_thread.resize(all_node_num); … … 935 928 if (_arc_mixing) { 936 929 // Store the arcs in a mixed order 937 const int skip = std::max(_arc_num / _node_num, 3);930 int k = std::max(int(std::sqrt(double(_arc_num))), 10); 938 931 int i = 0, j = 0; 939 932 for (ArcIt a(_graph); a != INVALID; ++a) { … … 941 934 _source[i] = _node_id[_graph.source(a)]; 942 935 _target[i] = _node_id[_graph.target(a)]; 943 if ((i += skip) >= _arc_num) i = ++j;936 if ((i += k) >= _arc_num) i = ++j; 944 937 } 945 938 } else { … … 1085 1078 ART_COST = std::numeric_limits<Cost>::max() / 2 + 1; 1086 1079 } else { 1087 ART_COST = 0;1080 ART_COST = std::numeric_limits<Cost>::min(); 1088 1081 for (int i = 0; i != _arc_num; ++i) { 1089 1082 if (_cost[i] > ART_COST) ART_COST = _cost[i]; … … 1124 1117 _state[e] = STATE_TREE; 1125 1118 if (_supply[u] >= 0) { 1126 _ pred_dir[u] = DIR_UP;1119 _forward[u] = true; 1127 1120 _pi[u] = 0; 1128 1121 _source[e] = u; … … 1131 1124 _cost[e] = 0; 1132 1125 } else { 1133 _ pred_dir[u] = DIR_DOWN;1126 _forward[u] = false; 1134 1127 _pi[u] = ART_COST; 1135 1128 _source[e] = _root; … … 1151 1144 _last_succ[u] = u; 1152 1145 if (_supply[u] >= 0) { 1153 _ pred_dir[u] = DIR_UP;1146 _forward[u] = true; 1154 1147 _pi[u] = 0; 1155 1148 _pred[u] = e; … … 1161 1154 _state[e] = STATE_TREE; 1162 1155 } else { 1163 _ pred_dir[u] = DIR_DOWN;1156 _forward[u] = false; 1164 1157 _pi[u] = ART_COST; 1165 1158 _pred[u] = f; … … 1192 1185 _last_succ[u] = u; 1193 1186 if (_supply[u] <= 0) { 1194 _ pred_dir[u] = DIR_DOWN;1187 _forward[u] = false; 1195 1188 _pi[u] = 0; 1196 1189 _pred[u] = e; … … 1202 1195 _state[e] = STATE_TREE; 1203 1196 } else { 1204 _ pred_dir[u] = DIR_UP;1197 _forward[u] = true; 1205 1198 _pi[u] = -ART_COST; 1206 1199 _pred[u] = f; … … 1245 1238 // Initialize first and second nodes according to the direction 1246 1239 // of the cycle 1247 int first, second;1248 1240 if (_state[in_arc] == STATE_LOWER) { 1249 1241 first = _source[in_arc]; … … 1255 1247 delta = _cap[in_arc]; 1256 1248 int result = 0; 1257 Value c,d;1249 Value d; 1258 1250 int e; 1259 1251 1260 // Search the cycle form the first node to the join node1252 // Search the cycle along the path form the first node to the root 1261 1253 for (int u = first; u != join; u = _parent[u]) { 1262 1254 e = _pred[u]; 1263 d = _flow[e]; 1264 if (_pred_dir[u] == DIR_DOWN) { 1265 c = _cap[e]; 1266 d = c >= MAX ? INF : c - d; 1267 } 1255 d = _forward[u] ? 1256 _flow[e] : (_cap[e] >= MAX ? INF : _cap[e] - _flow[e]); 1268 1257 if (d < delta) { 1269 1258 delta = d; … … 1272 1261 } 1273 1262 } 1274 1275 // Search the cycle form the second node to the join node 1263 // Search the cycle along the path form the second node to the root 1276 1264 for (int u = second; u != join; u = _parent[u]) { 1277 1265 e = _pred[u]; 1278 d = _flow[e]; 1279 if (_pred_dir[u] == DIR_UP) { 1280 c = _cap[e]; 1281 d = c >= MAX ? INF : c - d; 1282 } 1266 d = _forward[u] ? 1267 (_cap[e] >= MAX ? INF : _cap[e] - _flow[e]) : _flow[e]; 1283 1268 if (d <= delta) { 1284 1269 delta = d; … … 1305 1290 _flow[in_arc] += val; 1306 1291 for (int u = _source[in_arc]; u != join; u = _parent[u]) { 1307 _flow[_pred[u]] -= _pred_dir[u] *val;1292 _flow[_pred[u]] += _forward[u] ? -val : val; 1308 1293 } 1309 1294 for (int u = _target[in_arc]; u != join; u = _parent[u]) { 1310 _flow[_pred[u]] += _ pred_dir[u] *val;1295 _flow[_pred[u]] += _forward[u] ? val : -val; 1311 1296 } 1312 1297 } … … 1323 1308 // Update the tree structure 1324 1309 void updateTreeStructure() { 1310 int u, w; 1325 1311 int old_rev_thread = _rev_thread[u_out]; 1326 1312 int old_succ_num = _succ_num[u_out]; … … 1328 1314 v_out = _parent[u_out]; 1329 1315 1330 // Check if u_in and u_out coincide 1331 if (u_in == u_out) { 1332 // Update _parent, _pred, _pred_dir 1333 _parent[u_in] = v_in; 1334 _pred[u_in] = in_arc; 1335 _pred_dir[u_in] = u_in == _source[in_arc] ? DIR_UP : DIR_DOWN; 1336 1337 // Update _thread and _rev_thread 1338 if (_thread[v_in] != u_out) { 1339 int after = _thread[old_last_succ]; 1340 _thread[old_rev_thread] = after; 1341 _rev_thread[after] = old_rev_thread; 1342 after = _thread[v_in]; 1343 _thread[v_in] = u_out; 1344 _rev_thread[u_out] = v_in; 1345 _thread[old_last_succ] = after; 1346 _rev_thread[after] = old_last_succ; 1347 } 1316 u = _last_succ[u_in]; // the last successor of u_in 1317 right = _thread[u]; // the node after it 1318 1319 // Handle the case when old_rev_thread equals to v_in 1320 // (it also means that join and v_out coincide) 1321 if (old_rev_thread == v_in) { 1322 last = _thread[_last_succ[u_out]]; 1348 1323 } else { 1349 // Handle the case when old_rev_thread equals to v_in 1350 // (it also means that join and v_out coincide) 1351 int thread_continue = old_rev_thread == v_in ? 1352 _thread[old_last_succ] : _thread[v_in]; 1353 1354 // Update _thread and _parent along the stem nodes (i.e. the nodes 1355 // between u_in and u_out, whose parent have to be changed) 1356 int stem = u_in; // the current stem node 1357 int par_stem = v_in; // the new parent of stem 1358 int next_stem; // the next stem node 1359 int last = _last_succ[u_in]; // the last successor of stem 1360 int before, after = _thread[last]; 1361 _thread[v_in] = u_in; 1362 _dirty_revs.clear(); 1363 _dirty_revs.push_back(v_in); 1364 while (stem != u_out) { 1365 // Insert the next stem node into the thread list 1366 next_stem = _parent[stem]; 1367 _thread[last] = next_stem; 1368 _dirty_revs.push_back(last); 1369 1370 // Remove the subtree of stem from the thread list 1371 before = _rev_thread[stem]; 1372 _thread[before] = after; 1373 _rev_thread[after] = before; 1374 1375 // Change the parent node and shift stem nodes 1376 _parent[stem] = par_stem; 1377 par_stem = stem; 1378 stem = next_stem; 1379 1380 // Update last and after 1381 last = _last_succ[stem] == _last_succ[par_stem] ? 1382 _rev_thread[par_stem] : _last_succ[stem]; 1383 after = _thread[last]; 1384 } 1385 _parent[u_out] = par_stem; 1386 _thread[last] = thread_continue; 1387 _rev_thread[thread_continue] = last; 1388 _last_succ[u_out] = last; 1389 1390 // Remove the subtree of u_out from the thread list except for 1391 // the case when old_rev_thread equals to v_in 1392 if (old_rev_thread != v_in) { 1393 _thread[old_rev_thread] = after; 1394 _rev_thread[after] = old_rev_thread; 1395 } 1396 1397 // Update _rev_thread using the new _thread values 1398 for (int i = 0; i != int(_dirty_revs.size()); ++i) { 1399 int u = _dirty_revs[i]; 1400 _rev_thread[_thread[u]] = u; 1401 } 1402 1403 // Update _pred, _pred_dir, _last_succ and _succ_num for the 1404 // stem nodes from u_out to u_in 1405 int tmp_sc = 0, tmp_ls = _last_succ[u_out]; 1406 for (int u = u_out, p = _parent[u]; u != u_in; u = p, p = _parent[u]) { 1407 _pred[u] = _pred[p]; 1408 _pred_dir[u] = -_pred_dir[p]; 1409 tmp_sc += _succ_num[u] - _succ_num[p]; 1410 _succ_num[u] = tmp_sc; 1411 _last_succ[p] = tmp_ls; 1412 } 1413 _pred[u_in] = in_arc; 1414 _pred_dir[u_in] = u_in == _source[in_arc] ? DIR_UP : DIR_DOWN; 1415 _succ_num[u_in] = old_succ_num; 1324 last = _thread[v_in]; 1325 } 1326 1327 // Update _thread and _parent along the stem nodes (i.e. the nodes 1328 // between u_in and u_out, whose parent have to be changed) 1329 _thread[v_in] = stem = u_in; 1330 _dirty_revs.clear(); 1331 _dirty_revs.push_back(v_in); 1332 par_stem = v_in; 1333 while (stem != u_out) { 1334 // Insert the next stem node into the thread list 1335 new_stem = _parent[stem]; 1336 _thread[u] = new_stem; 1337 _dirty_revs.push_back(u); 1338 1339 // Remove the subtree of stem from the thread list 1340 w = _rev_thread[stem]; 1341 _thread[w] = right; 1342 _rev_thread[right] = w; 1343 1344 // Change the parent node and shift stem nodes 1345 _parent[stem] = par_stem; 1346 par_stem = stem; 1347 stem = new_stem; 1348 1349 // Update u and right 1350 u = _last_succ[stem] == _last_succ[par_stem] ? 1351 _rev_thread[par_stem] : _last_succ[stem]; 1352 right = _thread[u]; 1353 } 1354 _parent[u_out] = par_stem; 1355 _thread[u] = last; 1356 _rev_thread[last] = u; 1357 _last_succ[u_out] = u; 1358 1359 // Remove the subtree of u_out from the thread list except for 1360 // the case when old_rev_thread equals to v_in 1361 // (it also means that join and v_out coincide) 1362 if (old_rev_thread != v_in) { 1363 _thread[old_rev_thread] = right; 1364 _rev_thread[right] = old_rev_thread; 1365 } 1366 1367 // Update _rev_thread using the new _thread values 1368 for (int i = 0; i != int(_dirty_revs.size()); ++i) { 1369 u = _dirty_revs[i]; 1370 _rev_thread[_thread[u]] = u; 1371 } 1372 1373 // Update _pred, _forward, _last_succ and _succ_num for the 1374 // stem nodes from u_out to u_in 1375 int tmp_sc = 0, tmp_ls = _last_succ[u_out]; 1376 u = u_out; 1377 while (u != u_in) { 1378 w = _parent[u]; 1379 _pred[u] = _pred[w]; 1380 _forward[u] = !_forward[w]; 1381 tmp_sc += _succ_num[u] - _succ_num[w]; 1382 _succ_num[u] = tmp_sc; 1383 _last_succ[w] = tmp_ls; 1384 u = w; 1385 } 1386 _pred[u_in] = in_arc; 1387 _forward[u_in] = (u_in == _source[in_arc]); 1388 _succ_num[u_in] = old_succ_num; 1389 1390 // Set limits for updating _last_succ form v_in and v_out 1391 // towards the root 1392 int up_limit_in = -1; 1393 int up_limit_out = -1; 1394 if (_last_succ[join] == v_in) { 1395 up_limit_out = join; 1396 } else { 1397 up_limit_in = join; 1416 1398 } 1417 1399 1418 1400 // Update _last_succ from v_in towards the root 1419 int up_limit_out = _last_succ[join] == v_in ? join : -1; 1420 int last_succ_out = _last_succ[u_out]; 1421 for (int u = v_in; u != -1 && _last_succ[u] == v_in; u = _parent[u]) { 1422 _last_succ[u] = last_succ_out; 1423 } 1424 1401 for (u = v_in; u != up_limit_in && _last_succ[u] == v_in; 1402 u = _parent[u]) { 1403 _last_succ[u] = _last_succ[u_out]; 1404 } 1425 1405 // Update _last_succ from v_out towards the root 1426 1406 if (join != old_rev_thread && v_in != old_rev_thread) { 1427 for ( intu = v_out; u != up_limit_out && _last_succ[u] == old_last_succ;1407 for (u = v_out; u != up_limit_out && _last_succ[u] == old_last_succ; 1428 1408 u = _parent[u]) { 1429 1409 _last_succ[u] = old_rev_thread; 1430 1410 } 1431 } 1432 else if (last_succ_out != old_last_succ) { 1433 for (int u = v_out; u != up_limit_out && _last_succ[u] == old_last_succ; 1411 } else { 1412 for (u = v_out; u != up_limit_out && _last_succ[u] == old_last_succ; 1434 1413 u = _parent[u]) { 1435 _last_succ[u] = last_succ_out;1414 _last_succ[u] = _last_succ[u_out]; 1436 1415 } 1437 1416 } 1438 1417 1439 1418 // Update _succ_num from v_in to join 1440 for ( intu = v_in; u != join; u = _parent[u]) {1419 for (u = v_in; u != join; u = _parent[u]) { 1441 1420 _succ_num[u] += old_succ_num; 1442 1421 } 1443 1422 // Update _succ_num from v_out to join 1444 for ( intu = v_out; u != join; u = _parent[u]) {1423 for (u = v_out; u != join; u = _parent[u]) { 1445 1424 _succ_num[u] -= old_succ_num; 1446 1425 } 1447 1426 } 1448 1427 1449 // Update potentials in the subtree that has been moved1428 // Update potentials 1450 1429 void updatePotential() { 1451 Cost sigma = _pi[v_in] - _pi[u_in] - 1452 _pred_dir[u_in] * _cost[in_arc]; 1430 Cost sigma = _forward[u_in] ? 1431 _pi[v_in] - _pi[u_in] - _cost[_pred[u_in]] : 1432 _pi[v_in] - _pi[u_in] + _cost[_pred[u_in]]; 1433 // Update potentials in the subtree, which has been moved 1453 1434 int end = _thread[_last_succ[u_in]]; 1454 1435 for (int u = u_in; u != end; u = _thread[u]) { … … 1609 1590 if (_sum_supply == 0) { 1610 1591 if (_stype == GEQ) { 1611 Cost max_pot = -std::numeric_limits<Cost>::max();1592 Cost max_pot = std::numeric_limits<Cost>::min(); 1612 1593 for (int i = 0; i != _node_num; ++i) { 1613 1594 if (_pi[i] > max_pot) max_pot = _pi[i]; -
lemon/path.h
r920 r877 44 44 /// 45 45 /// In a sense, the path can be treated as a list of arcs. The 46 /// LEMONpath type stores just this list. As a consequence, it46 /// lemon path type stores just this list. As a consequence, it 47 47 /// cannot enumerate the nodes of the path and the source node of 48 48 /// a zero length path is undefined. … … 136 136 void clear() { head.clear(); tail.clear(); } 137 137 138 /// \brief The n -th arc.138 /// \brief The nth arc. 139 139 /// 140 140 /// \pre \c n is in the <tt>[0..length() - 1]</tt> range. … … 144 144 } 145 145 146 /// \brief Initialize arc iterator to point to the n -th arc146 /// \brief Initialize arc iterator to point to the nth arc 147 147 /// 148 148 /// \pre \c n is in the <tt>[0..length() - 1]</tt> range. … … 232 232 /// 233 233 /// In a sense, the path can be treated as a list of arcs. The 234 /// LEMONpath type stores just this list. As a consequence it234 /// lemon path type stores just this list. As a consequence it 235 235 /// cannot enumerate the nodes in the path and the zero length paths 236 236 /// cannot store the source. … … 328 328 void clear() { data.clear(); } 329 329 330 /// \brief The n -th arc.330 /// \brief The nth arc. 331 331 /// 332 332 /// \pre \c n is in the <tt>[0..length() - 1]</tt> range. … … 335 335 } 336 336 337 /// \brief Initializes arc iterator to point to the n -th arc.337 /// \brief Initializes arc iterator to point to the nth arc. 338 338 ArcIt nthIt(int n) const { 339 339 return ArcIt(*this, n); … … 396 396 /// 397 397 /// In a sense, the path can be treated as a list of arcs. The 398 /// LEMONpath type stores just this list. As a consequence it398 /// lemon path type stores just this list. As a consequence it 399 399 /// cannot enumerate the nodes in the path and the zero length paths 400 400 /// cannot store the source. … … 505 505 }; 506 506 507 /// \brief The n -th arc.508 /// 509 /// This function looks for the n -th arc in O(n) time.507 /// \brief The nth arc. 508 /// 509 /// This function looks for the nth arc in O(n) time. 510 510 /// \pre \c n is in the <tt>[0..length() - 1]</tt> range. 511 511 const Arc& nth(int n) const { … … 517 517 } 518 518 519 /// \brief Initializes arc iterator to point to the n -th arc.519 /// \brief Initializes arc iterator to point to the nth arc. 520 520 ArcIt nthIt(int n) const { 521 521 Node *node = first; … … 736 736 /// 737 737 /// In a sense, the path can be treated as a list of arcs. The 738 /// LEMONpath type stores just this list. As a consequence it738 /// lemon path type stores just this list. As a consequence it 739 739 /// cannot enumerate the nodes in the path and the source node of 740 740 /// a zero length path is undefined. … … 832 832 }; 833 833 834 /// \brief The n -th arc.834 /// \brief The nth arc. 835 835 /// 836 836 /// \pre \c n is in the <tt>[0..length() - 1]</tt> range. … … 839 839 } 840 840 841 /// \brief The arc iterator pointing to the n -th arc.841 /// \brief The arc iterator pointing to the nth arc. 842 842 ArcIt nthIt(int n) const { 843 843 return ArcIt(*this, n); … … 1043 1043 /// 1044 1044 /// In a sense, the path can be treated as a list of arcs. The 1045 /// LEMONpath type stores only this list. As a consequence, it1045 /// lemon path type stores only this list. As a consequence, it 1046 1046 /// cannot enumerate the nodes in the path and the zero length paths 1047 1047 /// cannot have a source node. -
lemon/preflow.h
r924 r877 544 544 _flow->set(e, (*_capacity)[e]); 545 545 (*_excess)[u] += rem; 546 if (u != _target && !_level->active(u)) { 547 _level->activate(u); 548 } 546 549 } 547 550 } … … 553 556 _flow->set(e, 0); 554 557 (*_excess)[v] += rem; 555 } 556 } 557 for (NodeIt n(_graph); n != INVALID; ++n) 558 if(n!=_source && n!=_target && _tolerance.positive((*_excess)[n])) 559 _level->activate(n); 560 558 if (v != _target && !_level->active(v)) { 559 _level->activate(v); 560 } 561 } 562 } 561 563 return true; 562 564 } … … 575 577 _phase = true; 576 578 577 while (true) { 579 Node n = _level->highestActive(); 580 int level = _level->highestActiveLevel(); 581 while (n != INVALID) { 578 582 int num = _node_num; 579 583 580 Node n = INVALID; 581 int level = -1; 582 583 while (num > 0) { 584 n = _level->highestActive(); 585 if (n == INVALID) goto first_phase_done; 586 level = _level->highestActiveLevel(); 587 --num; 588 584 while (num > 0 && n != INVALID) { 589 585 Value excess = (*_excess)[n]; 590 586 int new_level = _level->maxLevel(); … … 652 648 _level->deactivate(n); 653 649 } 650 651 n = _level->highestActive(); 652 level = _level->highestActiveLevel(); 653 --num; 654 654 } 655 655 656 656 num = _node_num * 20; 657 while (num > 0) { 658 while (level >= 0 && _level->activeFree(level)) { 659 --level; 660 } 661 if (level == -1) { 662 n = _level->highestActive(); 663 level = _level->highestActiveLevel(); 664 if (n == INVALID) goto first_phase_done; 665 } else { 666 n = _level->activeOn(level); 667 } 668 --num; 669 657 while (num > 0 && n != INVALID) { 670 658 Value excess = (*_excess)[n]; 671 659 int new_level = _level->maxLevel(); … … 733 721 _level->deactivate(n); 734 722 } 735 } 736 } 737 first_phase_done:; 723 724 while (level >= 0 && _level->activeFree(level)) { 725 --level; 726 } 727 if (level == -1) { 728 n = _level->highestActive(); 729 level = _level->highestActiveLevel(); 730 } else { 731 n = _level->activeOn(level); 732 } 733 --num; 734 } 735 } 738 736 } 739 737 -
test/CMakeLists.txt
r930 r874 32 32 maps_test 33 33 matching_test 34 max_cardinality_search_test35 max_clique_test36 34 min_cost_arborescence_test 37 35 min_cost_flow_test 38 36 min_mean_cycle_test 39 nagamochi_ibaraki_test40 37 path_test 41 38 planarity_test … … 49 46 50 47 IF(LEMON_HAVE_LP) 51 IF(${CMAKE_BUILD_TYPE} STREQUAL "Maintainer") 52 ADD_EXECUTABLE(lp_test lp_test.cc) 53 ELSE() 54 ADD_EXECUTABLE(lp_test EXCLUDE_FROM_ALL lp_test.cc) 55 ENDIF() 56 48 ADD_EXECUTABLE(lp_test lp_test.cc) 57 49 SET(LP_TEST_LIBS lemon) 58 50 … … 90 82 91 83 IF(LEMON_HAVE_MIP) 92 IF(${CMAKE_BUILD_TYPE} STREQUAL "Maintainer") 93 ADD_EXECUTABLE(mip_test mip_test.cc) 94 ELSE() 95 ADD_EXECUTABLE(mip_test EXCLUDE_FROM_ALL mip_test.cc) 96 ENDIF() 97 84 ADD_EXECUTABLE(mip_test mip_test.cc) 98 85 SET(MIP_TEST_LIBS lemon) 99 86 … … 131 118 132 119 FOREACH(TEST_NAME ${TESTS}) 133 IF(${CMAKE_BUILD_TYPE} STREQUAL "Maintainer") 134 ADD_EXECUTABLE(${TEST_NAME} ${TEST_NAME}.cc) 135 ELSE() 136 ADD_EXECUTABLE(${TEST_NAME} EXCLUDE_FROM_ALL ${TEST_NAME}.cc) 137 ENDIF() 120 ADD_EXECUTABLE(${TEST_NAME} ${TEST_NAME}.cc) 138 121 TARGET_LINK_LIBRARIES(${TEST_NAME} lemon) 139 122 ADD_TEST(${TEST_NAME} ${TEST_NAME}) 140 ADD_DEPENDENCIES(check ${TEST_NAME})141 123 ENDFOREACH() -
test/Makefile.am
r917 r874 34 34 test/maps_test \ 35 35 test/matching_test \ 36 test/max_cardinality_search_test \37 test/max_clique_test \38 36 test/min_cost_arborescence_test \ 39 37 test/min_cost_flow_test \ 40 38 test/min_mean_cycle_test \ 41 test/nagamochi_ibaraki_test \42 39 test/path_test \ 43 40 test/planarity_test \ … … 88 85 test_mip_test_SOURCES = test/mip_test.cc 89 86 test_matching_test_SOURCES = test/matching_test.cc 90 test_max_cardinality_search_test_SOURCES = test/max_cardinality_search_test.cc91 test_max_clique_test_SOURCES = test/max_clique_test.cc92 87 test_min_cost_arborescence_test_SOURCES = test/min_cost_arborescence_test.cc 93 88 test_min_cost_flow_test_SOURCES = test/min_cost_flow_test.cc 94 89 test_min_mean_cycle_test_SOURCES = test/min_mean_cycle_test.cc 95 test_nagamochi_ibaraki_test_SOURCES = test/nagamochi_ibaraki_test.cc96 90 test_path_test_SOURCES = test/path_test.cc 97 91 test_planarity_test_SOURCES = test/planarity_test.cc -
test/bellman_ford_test.cc
r880 r877 105 105 ::SetDistMap<concepts::ReadWriteMap<Node,Value> > 106 106 ::SetOperationTraits<BellmanFordDefaultOperationTraits<Value> > 107 ::SetOperationTraits<BellmanFordToleranceOperationTraits<Value, 0> > 107 108 ::Create bf_test(gr,length); 108 109 -
test/dfs_test.cc
r907 r877 51 51 "@attributes\n" 52 52 "source 0\n" 53 "target 5\n" 54 "source1 6\n" 55 "target1 3\n"; 56 53 "target 5\n"; 57 54 58 55 void checkDfsCompile() … … 183 180 Digraph G; 184 181 Node s, t; 185 Node s1, t1;186 182 187 183 std::istringstream input(test_lgf); … … 189 185 node("source", s). 190 186 node("target", t). 191 node("source1", s1).192 node("target1", t1).193 187 run(); 194 188 … … 217 211 218 212 { 219 Dfs<Digraph> dfs(G);220 check(dfs.run(s1,t1) && dfs.reached(t1),"Node 3 is reachable from Node 6.");221 }222 223 {224 213 NullMap<Node,Arc> myPredMap; 225 214 dfs(G).predMap(myPredMap).run(s); -
test/graph_copy_test.cc
r894 r440 19 19 #include <lemon/smart_graph.h> 20 20 #include <lemon/list_graph.h> 21 #include <lemon/static_graph.h>22 21 #include <lemon/lgf_reader.h> 23 22 #include <lemon/error.h> … … 28 27 using namespace lemon; 29 28 30 template <typename GR>31 29 void digraph_copy_test() { 32 30 const int nn = 10; 33 31 34 // Build a digraph35 32 SmartDigraph from; 36 33 SmartDigraph::NodeMap<int> fnm(from); … … 54 51 } 55 52 } 56 57 // Test digraph copy58 GR to;59 typename GR::template NodeMap<int> tnm(to);60 typename GR::template ArcMap<int> tam(to);61 typename GR::Node tn;62 typename GR::Arc ta;63 53 64 SmartDigraph::NodeMap<typename GR::Node> nr(from); 65 SmartDigraph::ArcMap<typename GR::Arc> er(from); 54 ListDigraph to; 55 ListDigraph::NodeMap<int> tnm(to); 56 ListDigraph::ArcMap<int> tam(to); 57 ListDigraph::Node tn; 58 ListDigraph::Arc ta; 66 59 67 typename GR::template NodeMap<SmartDigraph::Node> ncr(to); 68 typename GR::template ArcMap<SmartDigraph::Arc> ecr(to); 60 SmartDigraph::NodeMap<ListDigraph::Node> nr(from); 61 SmartDigraph::ArcMap<ListDigraph::Arc> er(from); 62 63 ListDigraph::NodeMap<SmartDigraph::Node> ncr(to); 64 ListDigraph::ArcMap<SmartDigraph::Arc> ecr(to); 69 65 70 66 digraphCopy(from, to). … … 73 69 nodeCrossRef(ncr).arcCrossRef(ecr). 74 70 node(fn, tn).arc(fa, ta).run(); 75 76 check(countNodes(from) == countNodes(to), "Wrong copy.");77 check(countArcs(from) == countArcs(to), "Wrong copy.");78 71 79 72 for (SmartDigraph::NodeIt it(from); it != INVALID; ++it) { … … 89 82 } 90 83 91 for ( typename GR::NodeIt it(to); it != INVALID; ++it) {84 for (ListDigraph::NodeIt it(to); it != INVALID; ++it) { 92 85 check(nr[ncr[it]] == it, "Wrong copy."); 93 86 } 94 87 95 for ( typename GR::ArcIt it(to); it != INVALID; ++it) {88 for (ListDigraph::ArcIt it(to); it != INVALID; ++it) { 96 89 check(er[ecr[it]] == it, "Wrong copy."); 97 90 } 98 91 check(tn == nr[fn], "Wrong copy."); 99 92 check(ta == er[fa], "Wrong copy."); 100 101 // Test repeated copy102 digraphCopy(from, to).run();103 104 check(countNodes(from) == countNodes(to), "Wrong copy.");105 check(countArcs(from) == countArcs(to), "Wrong copy.");106 93 } 107 94 108 template <typename GR>109 95 void graph_copy_test() { 110 96 const int nn = 10; 111 97 112 // Build a graph113 98 SmartGraph from; 114 99 SmartGraph::NodeMap<int> fnm(from); … … 138 123 } 139 124 140 // Test graph copy 141 GR to; 142 typename GR::template NodeMap<int> tnm(to); 143 typename GR::template ArcMap<int> tam(to); 144 typename GR::template EdgeMap<int> tem(to); 145 typename GR::Node tn; 146 typename GR::Arc ta; 147 typename GR::Edge te; 125 ListGraph to; 126 ListGraph::NodeMap<int> tnm(to); 127 ListGraph::ArcMap<int> tam(to); 128 ListGraph::EdgeMap<int> tem(to); 129 ListGraph::Node tn; 130 ListGraph::Arc ta; 131 ListGraph::Edge te; 148 132 149 SmartGraph::NodeMap< typename GR::Node> nr(from);150 SmartGraph::ArcMap< typename GR::Arc> ar(from);151 SmartGraph::EdgeMap< typename GR::Edge> er(from);133 SmartGraph::NodeMap<ListGraph::Node> nr(from); 134 SmartGraph::ArcMap<ListGraph::Arc> ar(from); 135 SmartGraph::EdgeMap<ListGraph::Edge> er(from); 152 136 153 typename GR::templateNodeMap<SmartGraph::Node> ncr(to);154 typename GR::templateArcMap<SmartGraph::Arc> acr(to);155 typename GR::templateEdgeMap<SmartGraph::Edge> ecr(to);137 ListGraph::NodeMap<SmartGraph::Node> ncr(to); 138 ListGraph::ArcMap<SmartGraph::Arc> acr(to); 139 ListGraph::EdgeMap<SmartGraph::Edge> ecr(to); 156 140 157 141 graphCopy(from, to). … … 160 144 nodeCrossRef(ncr).arcCrossRef(acr).edgeCrossRef(ecr). 161 145 node(fn, tn).arc(fa, ta).edge(fe, te).run(); 162 163 check(countNodes(from) == countNodes(to), "Wrong copy.");164 check(countEdges(from) == countEdges(to), "Wrong copy.");165 check(countArcs(from) == countArcs(to), "Wrong copy.");166 146 167 147 for (SmartGraph::NodeIt it(from); it != INVALID; ++it) { … … 188 168 } 189 169 190 for ( typename GR::NodeIt it(to); it != INVALID; ++it) {170 for (ListGraph::NodeIt it(to); it != INVALID; ++it) { 191 171 check(nr[ncr[it]] == it, "Wrong copy."); 192 172 } 193 173 194 for ( typename GR::ArcIt it(to); it != INVALID; ++it) {174 for (ListGraph::ArcIt it(to); it != INVALID; ++it) { 195 175 check(ar[acr[it]] == it, "Wrong copy."); 196 176 } 197 for ( typename GR::EdgeIt it(to); it != INVALID; ++it) {177 for (ListGraph::EdgeIt it(to); it != INVALID; ++it) { 198 178 check(er[ecr[it]] == it, "Wrong copy."); 199 179 } … … 201 181 check(ta == ar[fa], "Wrong copy."); 202 182 check(te == er[fe], "Wrong copy."); 203 204 // Test repeated copy205 graphCopy(from, to).run();206 207 check(countNodes(from) == countNodes(to), "Wrong copy.");208 check(countEdges(from) == countEdges(to), "Wrong copy.");209 check(countArcs(from) == countArcs(to), "Wrong copy.");210 183 } 211 184 212 185 213 186 int main() { 214 digraph_copy_test<SmartDigraph>(); 215 digraph_copy_test<ListDigraph>(); 216 digraph_copy_test<StaticDigraph>(); 217 graph_copy_test<SmartGraph>(); 218 graph_copy_test<ListGraph>(); 187 digraph_copy_test(); 188 graph_copy_test(); 219 189 220 190 return 0; -
test/preflow_test.cc
r924 r877 157 157 } 158 158 159 void initFlowTest()160 {161 DIGRAPH_TYPEDEFS(SmartDigraph);162 163 SmartDigraph g;164 SmartDigraph::ArcMap<int> cap(g),iflow(g);165 Node s=g.addNode(); Node t=g.addNode();166 Node n1=g.addNode(); Node n2=g.addNode();167 Arc a;168 a=g.addArc(s,n1); cap[a]=20; iflow[a]=20;169 a=g.addArc(n1,n2); cap[a]=10; iflow[a]=0;170 a=g.addArc(n2,t); cap[a]=20; iflow[a]=0;171 172 Preflow<SmartDigraph> pre(g,cap,s,t);173 pre.init(iflow);174 pre.startFirstPhase();175 check(pre.flowValue() == 10, "The incorrect max flow value.");176 check(pre.minCut(s), "Wrong min cut (Node s).");177 check(pre.minCut(n1), "Wrong min cut (Node n1).");178 check(!pre.minCut(n2), "Wrong min cut (Node n2).");179 check(!pre.minCut(t), "Wrong min cut (Node t).");180 }181 182 183 159 int main() { 184 160 … … 271 247 "The max flow value or the three min cut values are incorrect."); 272 248 273 initFlowTest();274 275 249 return 0; 276 250 }
Note: See TracChangeset
for help on using the changeset viewer.