Changes in / [1385:8db773f19586:1388:0fdf84c79bc1] in lemon
- Files:
-
- 3 added
- 68 edited
Legend:
- Unmodified
- Added
- Removed
-
CMakeLists.txt
r1264 r1346 1 CMAKE_MINIMUM_REQUIRED(VERSION 2.6) 1 CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 2 3 IF(POLICY CMP0048) 4 CMAKE_POLICY(SET CMP0048 OLD) 5 ENDIF(POLICY CMP0048) 6 7 IF(POLICY CMP0043) 8 CMAKE_POLICY(SET CMP0043 OLD) 9 ENDIF(POLICY CMP0043) 10 11 IF(POLICY CMP0026) 12 #This is for copying the dll's needed by glpk (in lp_test and mip_test) 13 CMAKE_POLICY(SET CMP0026 OLD) 14 ENDIF(POLICY CMP0026) 2 15 3 16 SET(PROJECT_NAME "LEMON") … … 63 76 FIND_PACKAGE(Ghostscript) 64 77 78 IF(WIN32) 79 SET(LEMON_WIN32 TRUE) 80 ENDIF(WIN32) 81 65 82 SET(LEMON_ENABLE_GLPK YES CACHE STRING "Enable GLPK solver backend.") 66 83 SET(LEMON_ENABLE_ILOG YES CACHE STRING "Enable ILOG (CPLEX) solver backend.") … … 122 139 SET(LEMON_DEFAULT_LP ${DEFAULT_LP} CACHE STRING 123 140 "Default LP solver backend (GLPK, CPLEX, CLP or SOPLEX)" FORCE) 141 ELSE() 142 SET(LEMON_DEFAULT_LP ${DEFAULT_LP} CACHE STRING 143 "Default LP solver backend (GLPK, CPLEX, CLP or SOPLEX)") 124 144 ENDIF() 125 145 IF(NOT LEMON_DEFAULT_MIP OR … … 129 149 SET(LEMON_DEFAULT_MIP ${DEFAULT_MIP} CACHE STRING 130 150 "Default MIP solver backend (GLPK, CPLEX or CBC)" FORCE) 151 ELSE() 152 SET(LEMON_DEFAULT_MIP ${DEFAULT_MIP} CACHE STRING 153 "Default MIP solver backend (GLPK, CPLEX or CBC)") 131 154 ENDIF() 132 155 … … 141 164 ELSEIF(MSVC) 142 165 # This part is unnecessary 'casue the same is set by the lemon/core.h. 143 # Still keep it as an example. 144 SET(CXX_WARNING "/wd4250 /wd4355 /wd4503 /wd4800 /wd4996") 166 # Still kept as an example. 167 168 # SET(CXX_WARNING "/wd4250 /wd4267 /wd4355 /wd4503 /wd4800 /wd4996") 169 145 170 # Suppressed warnings: 146 171 # C4250: 'class1' : inherits 'class2::member' via dominance 172 # C4267: conversion from 'size_t' to 'type', possible loss of data 147 173 # C4355: 'this' : used in base member initializer list 148 174 # C4503: 'function' : decorated name length exceeded, name was truncated … … 159 185 160 186 IF(MSVC) 187 SET(CMAKE_CXX_FLAGS "/bigobj ${CMAKE_CXX_FLAGS}") 161 188 SET( CMAKE_CXX_FLAGS_MAINTAINER "/WX ${CMAKE_CXX_FLAGS_DEBUG}" CACHE STRING 162 189 "Flags used by the C++ compiler during maintainer builds." … … 181 208 ) 182 209 SET( CMAKE_EXE_LINKER_FLAGS_MAINTAINER 183 " -Wl,--warn-unresolved-symbols,--warn-once" CACHE STRING210 "${CMAKE_EXE_LINKER_FLAGS_DEBUG}" CACHE STRING 184 211 "Flags used for linking binaries during maintainer builds." 185 212 ) 186 213 SET( CMAKE_SHARED_LINKER_FLAGS_MAINTAINER 187 " -Wl,--warn-unresolved-symbols,--warn-once" CACHE STRING214 "${CMAKE_SHARED_LINKER_FLAGS_DEBUG}" CACHE STRING 188 215 "Flags used by the shared libraries linker during maintainer builds." 189 216 ) … … 212 239 FORCE ) 213 240 241 SET_DIRECTORY_PROPERTIES(PROPERTIES 242 COMPILE_DEFINITIONS_DEBUG "LEMON_ENABLE_DEBUG" 243 COMPILE_DEFINITIONS_MAINTAINER "LEMON_ENABLE_DEBUG" 244 ) 214 245 215 246 INCLUDE(CheckTypeSize) … … 240 271 241 272 ENABLE_TESTING() 273 274 275 INCLUDE(CheckCXXCompilerFlag) 276 CHECK_CXX_COMPILER_FLAG("-std=c++11" LEMON_CXX11) 277 IF(LEMON_CXX11) 278 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 279 ENDIF() 280 242 281 243 282 IF(${CMAKE_BUILD_TYPE} STREQUAL "Maintainer") -
NEWS
r962 r1281 1 2013-08-10 Version 1.3 released 2 3 This is major feature release 4 5 * New data structures 6 7 #69 : Bipartite graph concepts and implementations 8 9 * New algorithms 10 11 #177: Port Edmonds-Karp algorithm 12 #380, #405: Heuristic algorithm for the max clique problem 13 #386: Heuristic algorithms for symmetric TSP 14 ----: Nagamochi-Ibaraki algorithm [5087694945e4] 15 #397, #56: Max. cardinality search 16 17 * Other new features 18 19 #223: Thread safe graph and graph map implementations 20 #442: Different TimeStamp print formats 21 #457: File export functionality to LpBase 22 #362: Bidirectional iterator support for radixSort() 23 24 * Implementation improvements 25 26 ----: Network Simplex 27 #391: Better update process, pivot rule and arc mixing 28 #435: Improved Altering List pivot rule 29 #417: Various fine tunings in CostScaling 30 #438: Optional iteration limit in HowardMmc 31 #436: Ensure strongly polynomial running time for CycleCanceling 32 while keeping the same performance 33 ----: Make the CBC interface be compatible with latest CBC releases 34 [ee581a0ecfbf] 35 36 * CMAKE has become the default build environment (#434) 37 38 ----: Autotool support has been dropped 39 ----: Improved LP/MIP configuration 40 #465: Enable/disable options for LP/MIP backends 41 #446: Better CPLEX discovery 42 #460: Add cmake config to find SoPlex 43 ----: Allow CPACK configuration on all platforms 44 #390: Add 'Maintainer' CMAKE build type 45 #388: Add 'check' target. 46 #401: Add contrib dir 47 #389: Better version string setting in CMAKE 48 #433: Support shared library build 49 #416: Support testing with valgrind 50 51 * Doc improvements 52 53 #395: SOURCE_BROWSER Doxygen switch is configurable from CMAKE 54 update-external-tags CMAKE target 55 #455: Optionally use MathJax for rendering the math formulae 56 #402, #437, #459, #456, #463: Various doc improvements 57 58 * Bugfixes (compared to release 1.2): 59 60 #432: Add missing doc/template.h and doc/references.bib to release 61 tarball 62 ----: Intel C++ compatibility fixes 63 #441: Fix buggy reinitialization in _solver_bits::VarIndex::clear() 64 #444: Bugfix in path copy constructors and assignment operators 65 #447: Bugfix in AllArcLookUp<> 66 #448: Bugfix in adaptor_test.cc 67 #449: Fix clang compilation warnings and errors 68 #440: Fix a bug + remove redundant typedefs in dimacs-solver 69 #453: Avoid GCC 4.7 compiler warnings 70 #445: Fix missing initialization in CplexEnv::CplexEnv() 71 #428: Add missing lemon/lemon.pc.cmake to the release tarball 72 #393: Create and install lemon.pc 73 #429: Fix VS warnings 74 #430: Fix LpBase::Constr two-side limit bug 75 #392: Bug fix in Dfs::start(s,t) 76 #414: Fix wrong initialization in Preflow 77 #418: Better Win CodeBlock/MinGW support 78 #419: Build environment improvements 79 - Build of mip_test and lp_test precede the running of the tests 80 - Also search for coin libs under ${COIN_ROOT_DIR}/lib/coin 81 - Do not look for COIN_VOL libraries 82 #382: Allow lgf file without Arc maps 83 #417: Bug fix in CostScaling 84 #366: Fix Pred[Matrix]MapPath::empty() 85 #371: Bug fix in (di)graphCopy() 86 The target graph is cleared before adding nodes and arcs/edges. 87 #364: Add missing UndirectedTags 88 #368: Fix the usage of std::numeric_limits<>::min() in Network Simplex 89 #372: Fix a critical bug in preflow 90 #461: Bugfix in assert.h 91 #470: Fix compilation issues related to various gcc versions 92 #446: Fix #define indicating CPLEX availability 93 #294: Add explicit namespace to 94 ignore_unused_variable_warning() usages 95 #420: Bugfix in IterableValueMap 96 #439: Bugfix in biNodeConnected() 97 98 1 99 2010-03-19 Version 1.2 released 2 100 -
cmake/FindILOG.cmake
r1232 r1331 63 63 ${ILOG_CPLEX_ROOT_DIR}/lib/x86_debian4.0_4.1/static_pic 64 64 ${ILOG_CPLEX_ROOT_DIR}/lib/x86-64_debian4.0_4.1/static_pic 65 ${ILOG_CPLEX_ROOT_DIR}/lib/x86_linux/static_pic 66 ${ILOG_CPLEX_ROOT_DIR}/lib/x86-64_linux/static_pic 65 67 ${ILOG_CPLEX_ROOT_DIR}/lib/${ILOG_WIN_COMPILER}/stat_mda 66 68 NO_DEFAULT_PATH … … 73 75 ${ILOG_CONCERT_ROOT_DIR}/lib/x86_debian4.0_4.1/static_pic 74 76 ${ILOG_CONCERT_ROOT_DIR}/lib/x86-64_debian4.0_4.1/static_pic 77 ${ILOG_CONCERT_ROOT_DIR}/lib/x86_linux/static_pic 78 ${ILOG_CONCERT_ROOT_DIR}/lib/x86-64_linux/static_pic 75 79 ${ILOG_CONCERT_ROOT_DIR}/lib/${ILOG_WIN_COMPILER}/stat_mda 76 80 NO_DEFAULT_PATH -
doc/Doxyfile.in
r1251 r1354 20 20 STRIP_FROM_PATH = "@abs_top_srcdir@" 21 21 STRIP_FROM_INC_PATH = "@abs_top_srcdir@" 22 SHORT_NAMES = YES22 SHORT_NAMES = NO 23 23 JAVADOC_AUTOBRIEF = NO 24 24 QT_AUTOBRIEF = NO … … 40 40 SUBGROUPING = YES 41 41 TYPEDEF_HIDES_STRUCT = NO 42 SYMBOL_CACHE_SIZE = 043 42 #--------------------------------------------------------------------------- 44 43 # Build related configuration options … … 73 72 MAX_INITIALIZER_LINES = 5 74 73 SHOW_USED_FILES = NO 75 SHOW_DIRECTORIES = YES76 74 SHOW_FILES = YES 77 75 SHOW_NAMESPACES = YES … … 151 149 HTML_COLORSTYLE_GAMMA = 80 152 150 HTML_TIMESTAMP = YES 153 HTML_ALIGN_MEMBERS = YES154 151 HTML_DYNAMIC_SECTIONS = YES 155 152 GENERATE_DOCSET = NO … … 178 175 ENUM_VALUES_PER_LINE = 4 179 176 GENERATE_TREEVIEW = NO 180 USE_INLINE_TREES = NO181 177 TREEVIEW_WIDTH = 250 182 178 EXT_LINKS_IN_WINDOW = NO … … 225 221 GENERATE_XML = NO 226 222 XML_OUTPUT = xml 227 XML_SCHEMA =228 XML_DTD =229 223 XML_PROGRAMLISTING = YES 230 224 #--------------------------------------------------------------------------- … … 267 261 HAVE_DOT = YES 268 262 DOT_NUM_THREADS = 0 269 DOT_FONTNAME = FreeSans263 DOT_FONTNAME = 270 264 DOT_FONTSIZE = 10 271 265 DOT_FONTPATH = -
doc/groups.dox
r1270 r1366 423 423 However, other algorithms could be faster in special cases. 424 424 For example, if the total supply and/or capacities are rather small, 425 \ref CapacityScaling is usually the fastest algorithm (without effective scaling). 425 \ref CapacityScaling is usually the fastest algorithm 426 (without effective scaling). 426 427 427 428 These classes are intended to be used with integer-valued input data … … 561 562 562 563 /** 564 @defgroup graph_isomorphism Graph Isomorphism 565 @ingroup algs 566 \brief Algorithms for testing (sub)graph isomorphism 567 568 This group contains algorithms for finding isomorph copies of a 569 given graph in another one, or simply check whether two graphs are isomorphic. 570 571 The formal definition of subgraph isomorphism is as follows. 572 573 We are given two graphs, \f$G_1=(V_1,E_1)\f$ and \f$G_2=(V_2,E_2)\f$. A 574 function \f$f:V_1\longrightarrow V_2\f$ is called \e mapping or \e 575 embedding if \f$f(u)\neq f(v)\f$ whenever \f$u\neq v\f$. 576 577 The standard <em>Subgraph Isomorphism Problem (SIP)</em> looks for a 578 mapping with the property that whenever \f$(u,v)\in E_1\f$, then 579 \f$(f(u),f(v))\in E_2\f$. 580 581 In case of <em>Induced Subgraph Isomorphism Problem (ISIP)</em> one 582 also requires that if \f$(u,v)\not\in E_1\f$, then \f$(f(u),f(v))\not\in 583 E_2\f$ 584 585 In addition, the graph nodes may be \e labeled, i.e. we are given two 586 node labelings \f$l_1:V_1\longrightarrow L\f$ and \f$l_2:V_2\longrightarrow 587 L\f$ and we require that \f$l_1(u)=l_2(f(u))\f$ holds for all nodes \f$u \in 588 G_1\f$. 589 590 */ 591 592 /** 563 593 @defgroup planar Planar Embedding and Drawing 564 594 @ingroup algs -
doc/named-param.dox
r463 r1351 26 26 function parameters by name also when you call the function. It is 27 27 especially comfortable in case of a function having tons of parameters 28 with natural default values. Sadly, C++ lack this amenity.28 with natural default values. Sadly, C++ lacks this amenity. 29 29 30 30 However, with a crafty trick and with some little -
doc/references.bib
r1219 r1367 355 355 pages = {587--612} 356 356 } 357 358 @article{cordella2004sub, 359 author = {Cordella, Luigi P. and Foggia, Pasquale and Sansone, 360 Carlo and Vento, Mario}, 361 title = {A (sub)graph isomorphism algorithm for matching 362 large graphs}, 363 journal = {IEEE Transactions on Pattern Analysis and Machine 364 Intelligence}, 365 volume = 26, 366 number = 10, 367 pages = {1367--1372}, 368 year = 2004 369 } -
lemon/CMakeLists.txt
r1264 r1315 56 56 57 57 ADD_LIBRARY(lemon ${LEMON_SOURCES}) 58 59 TARGET_LINK_LIBRARIES(lemon 60 ${GLPK_LIBRARIES} ${COIN_LIBRARIES} ${ILOG_LIBRARIES} ${SOPLEX_LIBRARIES} 61 ) 62 58 63 IF(UNIX) 59 SET_TARGET_PROPERTIES(lemon PROPERTIES OUTPUT_NAME emon )64 SET_TARGET_PROPERTIES(lemon PROPERTIES OUTPUT_NAME emon VERSION ${LEMON_VERSION} SOVERSION ${LEMON_VERSION}) 60 65 ENDIF() 61 66 -
lemon/arg_parser.h
r959 r1327 27 27 #include <sstream> 28 28 #include <algorithm> 29 #include <lemon/core.h> 29 30 #include <lemon/assert.h> 30 31 -
lemon/bellman_ford.h
r1270 r1337 30 30 #include <lemon/maps.h> 31 31 #include <lemon/path.h> 32 #include <lemon/bits/stl_iterators.h> 32 33 33 34 #include <limits> … … 690 691 int _index; 691 692 }; 693 694 /// \brief Gets the collection of the active nodes. 695 /// 696 /// This function can be used for iterating on the active nodes of the 697 /// Bellman-Ford algorithm after the last phase. 698 /// These nodes should be checked in the next phase to 699 /// find augmenting arcs outgoing from them. 700 /// It returns a wrapped ActiveIt, which looks 701 /// like an STL container (by having begin() and end()) 702 /// which you can use in range-based for loops, STL algorithms, etc. 703 LemonRangeWrapper1<ActiveIt, BellmanFord> 704 activeNodes() const { 705 return LemonRangeWrapper1<ActiveIt, BellmanFord>(*this); 706 } 707 692 708 693 709 /// \name Query Functions -
lemon/bits/edge_set_extender.h
r1270 r1337 114 114 }; 115 115 116 LemonRangeWrapper1<NodeIt, Digraph> nodes() const { 117 return LemonRangeWrapper1<NodeIt, Digraph>(*this); 118 } 116 119 117 120 class ArcIt : public Arc { … … 137 140 }; 138 141 142 LemonRangeWrapper1<ArcIt, Digraph> arcs() const { 143 return LemonRangeWrapper1<ArcIt, Digraph>(*this); 144 } 139 145 140 146 class OutArcIt : public Arc { … … 161 167 }; 162 168 169 LemonRangeWrapper2<OutArcIt, Digraph, Node> outArcs(const Node& u) const { 170 return LemonRangeWrapper2<OutArcIt, Digraph, Node>(*this, u); 171 } 163 172 164 173 class InArcIt : public Arc { … … 184 193 185 194 }; 195 196 LemonRangeWrapper2<InArcIt, Digraph, Node> inArcs(const Node& u) const { 197 return LemonRangeWrapper2<InArcIt, Digraph, Node>(*this, u); 198 } 186 199 187 200 // \brief Base node of the iterator … … 373 386 }; 374 387 388 LemonRangeWrapper1<NodeIt, Graph> nodes() const { 389 return LemonRangeWrapper1<NodeIt, Graph>(*this); 390 } 375 391 376 392 class ArcIt : public Arc { … … 396 412 }; 397 413 414 LemonRangeWrapper1<ArcIt, Graph> arcs() const { 415 return LemonRangeWrapper1<ArcIt, Graph>(*this); 416 } 398 417 399 418 class OutArcIt : public Arc { … … 420 439 }; 421 440 441 LemonRangeWrapper2<OutArcIt, Graph, Node> outArcs(const Node& u) const { 442 return LemonRangeWrapper2<OutArcIt, Graph, Node>(*this, u); 443 } 422 444 423 445 class InArcIt : public Arc { … … 444 466 }; 445 467 468 LemonRangeWrapper2<InArcIt, Graph, Node> inArcs(const Node& u) const { 469 return LemonRangeWrapper2<InArcIt, Graph, Node>(*this, u); 470 } 446 471 447 472 class EdgeIt : public Parent::Edge { … … 466 491 467 492 }; 493 494 LemonRangeWrapper1<EdgeIt, Graph> edges() const { 495 return LemonRangeWrapper1<EdgeIt, Graph>(*this); 496 } 468 497 469 498 class IncEdgeIt : public Parent::Edge { … … 491 520 } 492 521 }; 522 523 LemonRangeWrapper2<IncEdgeIt, Graph, Node> incEdges(const Node& u) const { 524 return LemonRangeWrapper2<IncEdgeIt, Graph, Node>(*this, u); 525 } 493 526 494 527 // \brief Base node of the iterator -
lemon/bits/graph_adaptor_extender.h
r1270 r1337 86 86 }; 87 87 88 LemonRangeWrapper1<NodeIt, Adaptor> nodes() const { 89 return LemonRangeWrapper1<NodeIt, Adaptor>(*this); 90 } 88 91 89 92 class ArcIt : public Arc { … … 108 111 109 112 }; 113 114 LemonRangeWrapper1<ArcIt, Adaptor> arcs() const { 115 return LemonRangeWrapper1<ArcIt, Adaptor>(*this); 116 } 110 117 111 118 … … 133 140 }; 134 141 142 LemonRangeWrapper2<OutArcIt, Adaptor, Node> outArcs(const Node& u) const { 143 return LemonRangeWrapper2<OutArcIt, Adaptor, Node>(*this, u); 144 } 145 135 146 136 147 class InArcIt : public Arc { … … 156 167 157 168 }; 169 170 LemonRangeWrapper2<InArcIt, Adaptor, Node> inArcs(const Node& u) const { 171 return LemonRangeWrapper2<InArcIt, Adaptor, Node>(*this, u); 172 } 158 173 159 174 Node baseNode(const OutArcIt &e) const { … … 255 270 }; 256 271 272 LemonRangeWrapper1<NodeIt, Adaptor> nodes() const { 273 return LemonRangeWrapper1<NodeIt, Adaptor>(*this); 274 } 275 257 276 258 277 class ArcIt : public Arc { … … 277 296 278 297 }; 298 299 LemonRangeWrapper1<ArcIt, Adaptor> arcs() const { 300 return LemonRangeWrapper1<ArcIt, Adaptor>(*this); 301 } 279 302 280 303 … … 302 325 }; 303 326 327 LemonRangeWrapper2<OutArcIt, Adaptor, Node> outArcs(const Node& u) const { 328 return LemonRangeWrapper2<OutArcIt, Adaptor, Node>(*this, u); 329 } 330 304 331 305 332 class InArcIt : public Arc { … … 326 353 }; 327 354 355 LemonRangeWrapper2<InArcIt, Adaptor, Node> inArcs(const Node& u) const { 356 return LemonRangeWrapper2<InArcIt, Adaptor, Node>(*this, u); 357 } 358 328 359 class EdgeIt : public Parent::Edge { 329 360 const Adaptor* _adaptor; … … 347 378 348 379 }; 380 381 LemonRangeWrapper1<EdgeIt, Adaptor> edges() const { 382 return LemonRangeWrapper1<EdgeIt, Adaptor>(*this); 383 } 384 349 385 350 386 class IncEdgeIt : public Edge { … … 373 409 }; 374 410 411 LemonRangeWrapper2<IncEdgeIt, Adaptor, Node> incEdges(const Node& u) const { 412 return LemonRangeWrapper2<IncEdgeIt, Adaptor, Node>(*this, u); 413 } 414 415 375 416 Node baseNode(const OutArcIt &a) const { 376 417 return Parent::source(a); -
lemon/bits/graph_extender.h
r1270 r1336 28 28 #include <lemon/concepts/maps.h> 29 29 30 #include <lemon/bits/stl_iterators.h> 31 30 32 //\ingroup graphbits 31 33 //\file … … 117 119 }; 118 120 121 LemonRangeWrapper1<NodeIt, Digraph> nodes() const { 122 return LemonRangeWrapper1<NodeIt, Digraph>(*this); 123 } 124 119 125 120 126 class ArcIt : public Arc { … … 139 145 140 146 }; 147 148 LemonRangeWrapper1<ArcIt, Digraph> arcs() const { 149 return LemonRangeWrapper1<ArcIt, Digraph>(*this); 150 } 141 151 142 152 … … 164 174 }; 165 175 176 LemonRangeWrapper2<OutArcIt, Digraph, Node> outArcs(const Node& u) const { 177 return LemonRangeWrapper2<OutArcIt, Digraph, Node>(*this, u); 178 } 179 166 180 167 181 class InArcIt : public Arc { … … 187 201 188 202 }; 203 204 LemonRangeWrapper2<InArcIt, Digraph, Node> inArcs(const Node& u) const { 205 return LemonRangeWrapper2<InArcIt, Digraph, Node>(*this, u); 206 } 189 207 190 208 // \brief Base node of the iterator … … 437 455 }; 438 456 457 LemonRangeWrapper1<NodeIt, Graph> nodes() const { 458 return LemonRangeWrapper1<NodeIt, Graph>(*this); 459 } 460 439 461 440 462 class ArcIt : public Arc { … … 459 481 460 482 }; 483 484 LemonRangeWrapper1<ArcIt, Graph> arcs() const { 485 return LemonRangeWrapper1<ArcIt, Graph>(*this); 486 } 461 487 462 488 … … 484 510 }; 485 511 512 LemonRangeWrapper2<OutArcIt, Graph, Node> outArcs(const Node& u) const { 513 return LemonRangeWrapper2<OutArcIt, Graph, Node>(*this, u); 514 } 515 486 516 487 517 class InArcIt : public Arc { … … 508 538 }; 509 539 540 LemonRangeWrapper2<InArcIt, Graph, Node> inArcs(const Node& u) const { 541 return LemonRangeWrapper2<InArcIt, Graph, Node>(*this, u); 542 } 543 510 544 511 545 class EdgeIt : public Parent::Edge { … … 530 564 531 565 }; 566 567 LemonRangeWrapper1<EdgeIt, Graph> edges() const { 568 return LemonRangeWrapper1<EdgeIt, Graph>(*this); 569 } 570 532 571 533 572 class IncEdgeIt : public Parent::Edge { … … 555 594 } 556 595 }; 596 597 LemonRangeWrapper2<IncEdgeIt, Graph, Node> incEdges(const Node& u) const { 598 return LemonRangeWrapper2<IncEdgeIt, Graph, Node>(*this, u); 599 } 600 557 601 558 602 // \brief Base node of the iterator … … 904 948 }; 905 949 950 LemonRangeWrapper1<NodeIt, BpGraph> nodes() const { 951 return LemonRangeWrapper1<NodeIt, BpGraph>(*this); 952 } 953 954 906 955 class RedNodeIt : public RedNode { 907 956 const BpGraph* _graph; … … 926 975 }; 927 976 977 LemonRangeWrapper1<RedNodeIt, BpGraph> redNodes() const { 978 return LemonRangeWrapper1<RedNodeIt, BpGraph>(*this); 979 } 980 981 928 982 class BlueNodeIt : public BlueNode { 929 983 const BpGraph* _graph; … … 948 1002 }; 949 1003 1004 LemonRangeWrapper1<BlueNodeIt, BpGraph> blueNodes() const { 1005 return LemonRangeWrapper1<BlueNodeIt, BpGraph>(*this); 1006 } 1007 1008 950 1009 951 1010 class ArcIt : public Arc { … … 970 1029 971 1030 }; 1031 1032 LemonRangeWrapper1<ArcIt, BpGraph> arcs() const { 1033 return LemonRangeWrapper1<ArcIt, BpGraph>(*this); 1034 } 972 1035 973 1036 … … 995 1058 }; 996 1059 1060 LemonRangeWrapper2<OutArcIt, BpGraph, Node> outArcs(const Node& u) const { 1061 return LemonRangeWrapper2<OutArcIt, BpGraph, Node>(*this, u); 1062 } 1063 997 1064 998 1065 class InArcIt : public Arc { … … 1019 1086 }; 1020 1087 1088 LemonRangeWrapper2<InArcIt, BpGraph, Node> inArcs(const Node& u) const { 1089 return LemonRangeWrapper2<InArcIt, BpGraph, Node>(*this, u); 1090 } 1091 1021 1092 1022 1093 class EdgeIt : public Parent::Edge { … … 1041 1112 1042 1113 }; 1114 1115 LemonRangeWrapper1<EdgeIt, BpGraph> edges() const { 1116 return LemonRangeWrapper1<EdgeIt, BpGraph>(*this); 1117 } 1118 1043 1119 1044 1120 class IncEdgeIt : public Parent::Edge { … … 1066 1142 } 1067 1143 }; 1144 1145 LemonRangeWrapper2<IncEdgeIt, BpGraph, Node> incEdges(const Node& u) const { 1146 return LemonRangeWrapper2<IncEdgeIt, BpGraph, Node>(*this, u); 1147 } 1148 1068 1149 1069 1150 // \brief Base node of the iterator -
lemon/bits/path_dump.h
r1270 r1338 62 62 } 63 63 64 operator consttypename Digraph::Arc() const {64 operator typename Digraph::Arc() const { 65 65 return path->predMap[current]; 66 66 } -
lemon/bits/windows.cc
r1270 r1341 22 22 #include<lemon/bits/windows.h> 23 23 24 #ifdef WIN32 24 #if defined(LEMON_WIN32) && defined(__GNUC__) 25 #pragma GCC diagnostic ignored "-Wold-style-cast" 26 #endif 27 28 #ifdef LEMON_WIN32 25 29 #ifndef WIN32_LEAN_AND_MEAN 26 30 #define WIN32_LEAN_AND_MEAN … … 41 45 #include <unistd.h> 42 46 #include <ctime> 43 #ifndef WIN3247 #ifndef LEMON_WIN32 44 48 #include <sys/times.h> 45 49 #endif … … 56 60 double &cutime, double &cstime) 57 61 { 58 #ifdef WIN3262 #ifdef LEMON_WIN32 59 63 static const double ch = 4294967296.0e-7; 60 64 static const double cl = 1.0e-7; … … 95 99 { 96 100 std::ostringstream os; 97 #ifdef WIN32101 #ifdef LEMON_WIN32 98 102 SYSTEMTIME time; 99 103 GetSystemTime(&time); 100 104 char buf1[11], buf2[9], buf3[5]; 101 105 if (GetDateFormat(MY_LOCALE, 0, &time, 102 106 ("ddd MMM dd"), buf1, 11) && 103 107 GetTimeFormat(MY_LOCALE, 0, &time, … … 121 125 int getWinRndSeed() 122 126 { 123 #ifdef WIN32127 #ifdef LEMON_WIN32 124 128 FILETIME time; 125 129 GetSystemTimeAsFileTime(&time); … … 133 137 134 138 WinLock::WinLock() { 135 #ifdef WIN32139 #ifdef LEMON_WIN32 136 140 CRITICAL_SECTION *lock = new CRITICAL_SECTION; 137 141 InitializeCriticalSection(lock); … … 143 147 144 148 WinLock::~WinLock() { 145 #ifdef WIN32149 #ifdef LEMON_WIN32 146 150 CRITICAL_SECTION *lock = static_cast<CRITICAL_SECTION*>(_repr); 147 151 DeleteCriticalSection(lock); … … 151 155 152 156 void WinLock::lock() { 153 #ifdef WIN32157 #ifdef LEMON_WIN32 154 158 CRITICAL_SECTION *lock = static_cast<CRITICAL_SECTION*>(_repr); 155 159 EnterCriticalSection(lock); … … 158 162 159 163 void WinLock::unlock() { 160 #ifdef WIN32164 #ifdef LEMON_WIN32 161 165 CRITICAL_SECTION *lock = static_cast<CRITICAL_SECTION*>(_repr); 162 166 LeaveCriticalSection(lock); -
lemon/bits/windows.h
r1270 r1340 20 20 #define LEMON_BITS_WINDOWS_H 21 21 22 #include <lemon/config.h> 22 23 #include <string> 23 24 … … 35 36 ~WinLock(); 36 37 void lock(); 37 void unlock(); 38 void unlock();\ 38 39 private: 39 40 void *_repr; -
lemon/capacity_scaling.h
r1270 r1363 28 28 #include <limits> 29 29 #include <lemon/core.h> 30 #include <lemon/maps.h> 30 31 #include <lemon/bin_heap.h> 31 32 … … 164 165 165 166 // Parameters of the problem 166 bool _ha ve_lower;167 bool _has_lower; 167 168 Value _sum_supply; 168 169 … … 357 358 template <typename LowerMap> 358 359 CapacityScaling& lowerMap(const LowerMap& map) { 359 _ha ve_lower = true;360 _has_lower = true; 360 361 for (ArcIt a(_graph); a != INVALID; ++a) { 361 362 _lower[_arc_idf[a]] = map[a]; 362 _lower[_arc_idb[a]] = map[a];363 363 } 364 364 return *this; … … 544 544 _cost[j] = _forward[j] ? 1 : -1; 545 545 } 546 _ha ve_lower = false;546 _has_lower = false; 547 547 return *this; 548 548 } … … 755 755 const Value MAX = std::numeric_limits<Value>::max(); 756 756 int last_out; 757 if (_ha ve_lower) {757 if (_has_lower) { 758 758 for (int i = 0; i != _root; ++i) { 759 759 last_out = _first_out[i+1]; … … 840 840 } 841 841 842 // Check if the upper bound is greater or equal to the lower bound843 // on each arc.842 // Check if the upper bound is greater than or equal to the lower bound 843 // on each forward arc. 844 844 bool checkBoundMaps() { 845 845 for (int j = 0; j != _res_arc_num; ++j) { 846 if (_ upper[j] < _lower[j]) return false;846 if (_forward[j] && _upper[j] < _lower[j]) return false; 847 847 } 848 848 return true; … … 858 858 859 859 // Handle non-zero lower bounds 860 if (_ha ve_lower) {860 if (_has_lower) { 861 861 int limit = _first_out[_root]; 862 862 for (int j = 0; j != limit; ++j) { 863 if ( !_forward[j]) _res_cap[j] += _lower[j];863 if (_forward[j]) _res_cap[_reverse[j]] += _lower[j]; 864 864 } 865 865 } -
lemon/cbc.cc
r1270 r1336 112 112 113 113 void CbcMip::_eraseColId(int i) { 114 cols.eraseIndex(i);114 _cols.eraseIndex(i); 115 115 } 116 116 117 117 void CbcMip::_eraseRowId(int i) { 118 rows.eraseIndex(i);118 _rows.eraseIndex(i); 119 119 } 120 120 -
lemon/clp.cc
r1270 r1336 30 30 ClpLp::ClpLp(const ClpLp& other) { 31 31 _prob = new ClpSimplex(*other._prob); 32 rows = other.rows;33 cols = other.cols;32 _rows = other._rows; 33 _cols = other._cols; 34 34 _init_temporals(); 35 35 messageLevel(MESSAGE_NOTHING); … … 104 104 105 105 void ClpLp::_eraseColId(int i) { 106 cols.eraseIndex(i);107 cols.shiftIndices(i);106 _cols.eraseIndex(i); 107 _cols.shiftIndices(i); 108 108 } 109 109 110 110 void ClpLp::_eraseRowId(int i) { 111 rows.eraseIndex(i);112 rows.shiftIndices(i);111 _rows.eraseIndex(i); 112 _rows.shiftIndices(i); 113 113 } 114 114 -
lemon/clp.h
r1270 r1336 152 152 153 153 ///Returns the constraint identifier understood by CLP. 154 int clpRow(Row r) const { return rows(id(r)); }154 int clpRow(Row r) const { return _rows(id(r)); } 155 155 156 156 ///Returns the variable identifier understood by CLP. 157 int clpCol(Col c) const { return cols(id(c)); }157 int clpCol(Col c) const { return _cols(id(c)); } 158 158 159 159 }; -
lemon/concepts/bpgraph.h
r1270 r1336 28 28 #include <lemon/concept_check.h> 29 29 #include <lemon/core.h> 30 #include <lemon/bits/stl_iterators.h> 30 31 31 32 namespace lemon { … … 222 223 }; 223 224 225 /// \brief Gets the collection of the red nodes of the graph. 226 /// 227 /// This function can be used for iterating on 228 /// the red nodes of the graph. It returns a wrapped RedNodeIt, 229 /// which looks like an STL container (by having begin() and end()) 230 /// which you can use in range-based for loops, stl algorithms, etc. 231 /// For example if g is a BpGraph, you can write: 232 ///\code 233 /// for(auto v: g.redNodes()) 234 /// doSomething(v); 235 ///\endcode 236 LemonRangeWrapper1<RedNodeIt, BpGraph> redNodes() const { 237 return LemonRangeWrapper1<RedNodeIt, BpGraph>(*this); 238 } 239 240 224 241 /// Iterator class for the blue nodes. 225 242 … … 265 282 }; 266 283 284 /// \brief Gets the collection of the blue nodes of the graph. 285 /// 286 /// This function can be used for iterating on 287 /// the blue nodes of the graph. It returns a wrapped BlueNodeIt, 288 /// which looks like an STL container (by having begin() and end()) 289 /// which you can use in range-based for loops, stl algorithms, etc. 290 /// For example if g is a BpGraph, you can write: 291 ///\code 292 /// for(auto v: g.blueNodes()) 293 /// doSomething(v); 294 ///\endcode 295 LemonRangeWrapper1<BlueNodeIt, BpGraph> blueNodes() const { 296 return LemonRangeWrapper1<BlueNodeIt, BpGraph>(*this); 297 } 298 299 267 300 /// Iterator class for the nodes. 268 301 … … 307 340 NodeIt& operator++() { return *this; } 308 341 }; 342 343 /// \brief Gets the collection of the nodes of the graph. 344 /// 345 /// This function can be used for iterating on 346 /// the nodes of the graph. It returns a wrapped NodeIt, 347 /// which looks like an STL container (by having begin() and end()) 348 /// which you can use in range-based for loops, stl algorithms, etc. 349 /// For example if g is a BpGraph, you can write: 350 ///\code 351 /// for(auto v: g.nodes()) 352 /// doSomething(v); 353 ///\endcode 354 LemonRangeWrapper1<NodeIt, BpGraph> nodes() const { 355 return LemonRangeWrapper1<NodeIt, BpGraph>(*this); 356 } 357 309 358 310 359 … … 395 444 EdgeIt& operator++() { return *this; } 396 445 }; 446 447 /// \brief Gets the collection of the edges of the graph. 448 /// 449 /// This function can be used for iterating on the 450 /// edges of the graph. It returns a wrapped 451 /// EdgeIt, which looks like an STL container 452 /// (by having begin() and end()) which you can use in range-based 453 /// for loops, stl algorithms, etc. 454 /// For example if g is a BpGraph, you can write: 455 ///\code 456 /// for(auto e: g.edges()) 457 /// doSomething(e); 458 ///\endcode 459 LemonRangeWrapper1<EdgeIt, BpGraph> edges() const { 460 return LemonRangeWrapper1<EdgeIt, BpGraph>(*this); 461 } 462 397 463 398 464 /// Iterator class for the incident edges of a node. … … 444 510 }; 445 511 512 /// \brief Gets the collection of the incident edges 513 /// of a certain node of the graph. 514 /// 515 /// This function can be used for iterating on the 516 /// incident undirected edges of a certain node of the graph. 517 /// It returns a wrapped 518 /// IncEdgeIt, which looks like an STL container 519 /// (by having begin() and end()) which you can use in range-based 520 /// for loops, stl algorithms, etc. 521 /// For example if g is a BpGraph and u is a Node, you can write: 522 ///\code 523 /// for(auto e: g.incEdges(u)) 524 /// doSomething(e); 525 ///\endcode 526 LemonRangeWrapper2<IncEdgeIt, BpGraph, Node> incEdges(const Node& u) const { 527 return LemonRangeWrapper2<IncEdgeIt, BpGraph, Node>(*this, u); 528 } 529 530 446 531 /// The arc type of the graph 447 532 … … 540 625 }; 541 626 627 /// \brief Gets the collection of the directed arcs of the graph. 628 /// 629 /// This function can be used for iterating on the 630 /// arcs of the graph. It returns a wrapped 631 /// ArcIt, which looks like an STL container 632 /// (by having begin() and end()) which you can use in range-based 633 /// for loops, stl algorithms, etc. 634 /// For example if g is a BpGraph you can write: 635 ///\code 636 /// for(auto a: g.arcs()) 637 /// doSomething(a); 638 ///\endcode 639 LemonRangeWrapper1<ArcIt, BpGraph> arcs() const { 640 return LemonRangeWrapper1<ArcIt, BpGraph>(*this); 641 } 642 643 542 644 /// Iterator class for the outgoing arcs of a node. 543 645 … … 588 690 }; 589 691 692 /// \brief Gets the collection of the outgoing directed arcs of a 693 /// certain node of the graph. 694 /// 695 /// This function can be used for iterating on the 696 /// outgoing arcs of a certain node of the graph. It returns a wrapped 697 /// OutArcIt, which looks like an STL container 698 /// (by having begin() and end()) which you can use in range-based 699 /// for loops, stl algorithms, etc. 700 /// For example if g is a BpGraph and u is a Node, you can write: 701 ///\code 702 /// for(auto a: g.outArcs(u)) 703 /// doSomething(a); 704 ///\endcode 705 LemonRangeWrapper2<OutArcIt, BpGraph, Node> outArcs(const Node& u) const { 706 return LemonRangeWrapper2<OutArcIt, BpGraph, Node>(*this, u); 707 } 708 709 590 710 /// Iterator class for the incoming arcs of a node. 591 711 … … 635 755 InArcIt& operator++() { return *this; } 636 756 }; 757 758 /// \brief Gets the collection of the incoming directed arcs of a 759 /// certain node of the graph. 760 /// 761 /// This function can be used for iterating on the 762 /// incoming arcs of a certain node of the graph. It returns a wrapped 763 /// InArcIt, which looks like an STL container 764 /// (by having begin() and end()) which you can use in range-based 765 /// for loops, stl algorithms, etc. 766 /// For example if g is a BpGraph and u is a Node, you can write: 767 ///\code 768 /// for(auto a: g.inArcs(u)) 769 /// doSomething(a); 770 ///\endcode 771 LemonRangeWrapper2<InArcIt, BpGraph, Node> inArcs(const Node& u) const { 772 return LemonRangeWrapper2<InArcIt, BpGraph, Node>(*this, u); 773 } 774 637 775 638 776 /// \brief Standard graph map type for the nodes. -
lemon/concepts/digraph.h
r1270 r1336 28 28 #include <lemon/concept_check.h> 29 29 #include <lemon/concepts/graph_components.h> 30 #include <lemon/bits/stl_iterators.h> 30 31 31 32 namespace lemon { … … 148 149 }; 149 150 151 /// \brief Gets the collection of the nodes of the digraph. 152 /// 153 /// This function can be used for iterating on 154 /// the nodes of the digraph. It returns a wrapped NodeIt, which looks 155 /// like an STL container (by having begin() and end()) 156 /// which you can use in range-based for loops, STL algorithms, etc. 157 /// For example you can write: 158 ///\code 159 /// ListDigraph g; 160 /// for(auto v: g.nodes()) 161 /// doSomething(v); 162 /// 163 /// //Using an STL algorithm: 164 /// copy(g.nodes().begin(), g.nodes().end(), vect.begin()); 165 ///\endcode 166 LemonRangeWrapper1<NodeIt, Digraph> nodes() const { 167 return LemonRangeWrapper1<NodeIt, Digraph>(*this); 168 } 169 150 170 151 171 /// The arc type of the digraph … … 238 258 }; 239 259 260 /// \brief Gets the collection of the outgoing arcs of a certain node 261 /// of the digraph. 262 /// 263 /// This function can be used for iterating on the 264 /// outgoing arcs of a certain node of the digraph. It returns a wrapped 265 /// OutArcIt, which looks like an STL container 266 /// (by having begin() and end()) which you can use in range-based 267 /// for loops, STL algorithms, etc. 268 /// For example if g is a Digraph and u is a node, you can write: 269 ///\code 270 /// for(auto a: g.outArcs(u)) 271 /// doSomething(a); 272 /// 273 /// //Using an STL algorithm: 274 /// copy(g.outArcs(u).begin(), g.outArcs(u).end(), vect.begin()); 275 ///\endcode 276 LemonRangeWrapper2<OutArcIt, Digraph, Node> outArcs(const Node& u) const { 277 return LemonRangeWrapper2<OutArcIt, Digraph, Node>(*this, u); 278 } 279 280 240 281 /// Iterator class for the incoming arcs of a node. 241 282 … … 283 324 }; 284 325 326 /// \brief Gets the collection of the incoming arcs of a certain node 327 /// of the digraph. 328 /// 329 /// This function can be used for iterating on the 330 /// incoming arcs of a certain node of the digraph. It returns a wrapped 331 /// InArcIt, which looks like an STL container 332 /// (by having begin() and end()) which you can use in range-based 333 /// for loops, STL algorithms, etc. 334 /// For example if g is a Digraph and u is a node, you can write: 335 ///\code 336 /// for(auto a: g.inArcs(u)) 337 /// doSomething(a); 338 /// 339 /// //Using an STL algorithm: 340 /// copy(g.inArcs(u).begin(), g.inArcs(u).end(), vect.begin()); 341 ///\endcode 342 LemonRangeWrapper2<InArcIt, Digraph, Node> inArcs(const Node& u) const { 343 return LemonRangeWrapper2<InArcIt, Digraph, Node>(*this, u); 344 } 345 346 285 347 /// Iterator class for the arcs. 286 348 … … 313 375 /// Sets the iterator to the first arc of the given digraph. 314 376 /// 315 explicit ArcIt(const Digraph& g) { ::lemon::ignore_unused_variable_warning(g); } 377 explicit ArcIt(const Digraph& g) { 378 ::lemon::ignore_unused_variable_warning(g); 379 } 316 380 /// Sets the iterator to the given arc. 317 381 … … 325 389 ArcIt& operator++() { return *this; } 326 390 }; 391 392 /// \brief Gets the collection of the arcs of the digraph. 393 /// 394 /// This function can be used for iterating on the 395 /// arcs of the digraph. It returns a wrapped 396 /// ArcIt, which looks like an STL container 397 /// (by having begin() and end()) which you can use in range-based 398 /// for loops, STL algorithms, etc. 399 /// For example you can write: 400 ///\code 401 /// ListDigraph g; 402 /// for(auto a: g.arcs()) 403 /// doSomething(a); 404 /// 405 /// //Using an STL algorithm: 406 /// copy(g.arcs().begin(), g.arcs().end(), vect.begin()); 407 ///\endcode 408 LemonRangeWrapper1<ArcIt, Digraph> arcs() const { 409 return LemonRangeWrapper1<ArcIt, Digraph>(*this); 410 } 411 327 412 328 413 /// \brief The source node of the arc. -
lemon/concepts/graph.h
r1270 r1336 28 28 #include <lemon/concept_check.h> 29 29 #include <lemon/core.h> 30 #include <lemon/bits/stl_iterators.h> 30 31 31 32 namespace lemon { … … 181 182 }; 182 183 184 /// \brief Gets the collection of the nodes of the graph. 185 /// 186 /// This function can be used for iterating on 187 /// the nodes of the graph. It returns a wrapped NodeIt, which looks 188 /// like an STL container (by having begin() and end()) 189 /// which you can use in range-based for loops, STL algorithms, etc. 190 /// For example you can write: 191 ///\code 192 /// ListGraph g; 193 /// for(auto v: g.nodes()) 194 /// doSomething(v); 195 /// 196 /// //Using an STL algorithm: 197 /// copy(g.nodes().begin(), g.nodes().end(), vect.begin()); 198 ///\endcode 199 LemonRangeWrapper1<NodeIt, Graph> nodes() const { 200 return LemonRangeWrapper1<NodeIt, Graph>(*this); 201 } 202 183 203 184 204 /// The edge type of the graph … … 268 288 EdgeIt& operator++() { return *this; } 269 289 }; 290 291 /// \brief Gets the collection of the edges of the graph. 292 /// 293 /// This function can be used for iterating on the 294 /// edges of the graph. It returns a wrapped 295 /// EdgeIt, which looks like an STL container 296 /// (by having begin() and end()) which you can use in range-based 297 /// for loops, STL algorithms, etc. 298 /// For example you can write: 299 ///\code 300 /// ListGraph g; 301 /// for(auto e: g.edges()) 302 /// doSomething(e); 303 /// 304 /// //Using an STL algorithm: 305 /// copy(g.edges().begin(), g.edges().end(), vect.begin()); 306 ///\endcode 307 LemonRangeWrapper1<EdgeIt, Graph> edges() const { 308 return LemonRangeWrapper1<EdgeIt, Graph>(*this); 309 } 310 270 311 271 312 /// Iterator class for the incident edges of a node. … … 317 358 }; 318 359 360 /// \brief Gets the collection of the incident undirected edges 361 /// of a certain node of the graph. 362 /// 363 /// This function can be used for iterating on the 364 /// incident undirected edges of a certain node of the graph. 365 /// It returns a wrapped 366 /// IncEdgeIt, which looks like an STL container 367 /// (by having begin() and end()) which you can use in range-based 368 /// for loops, STL algorithms, etc. 369 /// For example if g is a Graph and u is a Node, you can write: 370 ///\code 371 /// for(auto e: g.incEdges(u)) 372 /// doSomething(e); 373 /// 374 /// //Using an STL algorithm: 375 /// copy(g.incEdges(u).begin(), g.incEdges(u).end(), vect.begin()); 376 ///\endcode 377 LemonRangeWrapper2<IncEdgeIt, Graph, Node> incEdges(const Node& u) const { 378 return LemonRangeWrapper2<IncEdgeIt, Graph, Node>(*this, u); 379 } 380 381 319 382 /// The arc type of the graph 320 383 … … 397 460 /// Sets the iterator to the first arc of the given graph. 398 461 /// 399 explicit ArcIt(const Graph &g) { ::lemon::ignore_unused_variable_warning(g); } 462 explicit ArcIt(const Graph &g) { 463 ::lemon::ignore_unused_variable_warning(g); 464 } 400 465 /// Sets the iterator to the given arc. 401 466 … … 409 474 ArcIt& operator++() { return *this; } 410 475 }; 476 477 /// \brief Gets the collection of the directed arcs of the graph. 478 /// 479 /// This function can be used for iterating on the 480 /// arcs of the graph. It returns a wrapped 481 /// ArcIt, which looks like an STL container 482 /// (by having begin() and end()) which you can use in range-based 483 /// for loops, STL algorithms, etc. 484 /// For example you can write: 485 ///\code 486 /// ListGraph g; 487 /// for(auto a: g.arcs()) 488 /// doSomething(a); 489 /// 490 /// //Using an STL algorithm: 491 /// copy(g.arcs().begin(), g.arcs().end(), vect.begin()); 492 ///\endcode 493 LemonRangeWrapper1<ArcIt, Graph> arcs() const { 494 return LemonRangeWrapper1<ArcIt, Graph>(*this); 495 } 496 411 497 412 498 /// Iterator class for the outgoing arcs of a node. … … 458 544 }; 459 545 546 /// \brief Gets the collection of the outgoing directed arcs of a 547 /// certain node of the graph. 548 /// 549 /// This function can be used for iterating on the 550 /// outgoing arcs of a certain node of the graph. It returns a wrapped 551 /// OutArcIt, which looks like an STL container 552 /// (by having begin() and end()) which you can use in range-based 553 /// for loops, STL algorithms, etc. 554 /// For example if g is a Graph and u is a Node, you can write: 555 ///\code 556 /// for(auto a: g.outArcs(u)) 557 /// doSomething(a); 558 /// 559 /// //Using an STL algorithm: 560 /// copy(g.outArcs(u).begin(), g.outArcs(u).end(), vect.begin()); 561 ///\endcode 562 LemonRangeWrapper2<OutArcIt, Graph, Node> outArcs(const Node& u) const { 563 return LemonRangeWrapper2<OutArcIt, Graph, Node>(*this, u); 564 } 565 566 460 567 /// Iterator class for the incoming arcs of a node. 461 568 … … 505 612 InArcIt& operator++() { return *this; } 506 613 }; 614 615 /// \brief Gets the collection of the incoming directed arcs of 616 /// a certain node of the graph. 617 /// 618 /// This function can be used for iterating on the 619 /// incoming directed arcs of a certain node of the graph. It returns 620 /// a wrapped InArcIt, which looks like an STL container 621 /// (by having begin() and end()) which you can use in range-based 622 /// for loops, STL algorithms, etc. 623 /// For example if g is a Graph and u is a Node, you can write: 624 ///\code 625 /// for(auto a: g.inArcs(u)) 626 /// doSomething(a); 627 /// 628 /// //Using an STL algorithm: 629 /// copy(g.inArcs(u).begin(), g.inArcs(u).end(), vect.begin()); 630 ///\endcode 631 LemonRangeWrapper2<InArcIt, Graph, Node> inArcs(const Node& u) const { 632 return LemonRangeWrapper2<InArcIt, Graph, Node>(*this, u); 633 } 507 634 508 635 /// \brief Standard graph map type for the nodes. -
lemon/concepts/path.h
r1270 r1336 27 27 #include <lemon/core.h> 28 28 #include <lemon/concept_check.h> 29 #include <lemon/bits/stl_iterators.h> 29 30 30 31 namespace lemon { … … 116 117 }; 117 118 119 /// \brief Gets the collection of the arcs of the path. 120 /// 121 /// This function can be used for iterating on the 122 /// arcs of the path. It returns a wrapped 123 /// ArcIt, which looks like an STL container 124 /// (by having begin() and end()) which you can use in range-based 125 /// for loops, STL algorithms, etc. 126 /// For example you can write: 127 ///\code 128 /// for(auto a: p.arcs()) 129 /// doSomething(a); 130 ///\endcode 131 LemonRangeWrapper1<ArcIt, Path> arcs() const { 132 return LemonRangeWrapper1<ArcIt, Path>(*this); 133 } 134 135 118 136 template <typename _Path> 119 137 struct Constraints { … … 264 282 265 283 }; 284 285 /// \brief Gets the collection of the arcs of the path. 286 /// 287 /// This function can be used for iterating on the 288 /// arcs of the path. It returns a wrapped 289 /// ArcIt, which looks like an STL container 290 /// (by having begin() and end()) which you can use in range-based 291 /// for loops, STL algorithms, etc. 292 /// For example you can write: 293 ///\code 294 /// for(auto a: p.arcs()) 295 /// doSomething(a); 296 ///\endcode 297 LemonRangeWrapper1<ArcIt, PathDumper> arcs() const { 298 return LemonRangeWrapper1<ArcIt, PathDumper>(*this); 299 } 300 266 301 267 302 /// \brief LEMON style iterator for enumerating the arcs of a path … … 294 329 }; 295 330 331 /// \brief Gets the collection of the arcs of the path 332 /// in reverse direction. 333 /// 334 /// This function can be used for iterating on the 335 /// arcs of the path in reverse direction. It returns a wrapped 336 /// RevArcIt, which looks like an STL container 337 /// (by having begin() and end()) which you can use in range-based 338 /// for loops, STL algorithms, etc. 339 /// For example you can write: 340 ///\code 341 /// for(auto a: p.revArcs()) 342 /// doSomething(a); 343 ///\endcode 344 LemonRangeWrapper1<RevArcIt, PathDumper> revArcs() const { 345 return LemonRangeWrapper1<RevArcIt, PathDumper>(*this); 346 } 347 348 296 349 template <typename _Path> 297 350 struct Constraints { -
lemon/config.h.in
r1264 r1343 1 #ifndef LEMON_CONFIG_H 2 #define LEMON_CONFIG_H 3 1 4 #define LEMON_VERSION "@PROJECT_VERSION@" 2 5 #cmakedefine LEMON_HAVE_LONG_LONG 1 6 7 #cmakedefine LEMON_CXX11 1 8 9 #cmakedefine LEMON_WIN32 1 10 3 11 #cmakedefine LEMON_HAVE_LP 1 4 12 #cmakedefine LEMON_HAVE_MIP 1 … … 8 16 #cmakedefine LEMON_HAVE_CLP 1 9 17 #cmakedefine LEMON_HAVE_CBC 1 10 #cmakedefine LEMON_DEFAULT_LP @LEMON_DEFAULT_LP@ 11 #cmakedefine LEMON_DEFAULT_MIP @LEMON_DEFAULT_MIP@ 18 19 #define LEMON_CPLEX_ 1 20 #define LEMON_CLP_ 2 21 #define LEMON_GLPK_ 3 22 #define LEMON_SOPLEX_ 4 23 #define LEMON_CBC_ 5 24 25 #cmakedefine LEMON_DEFAULT_LP LEMON_@LEMON_DEFAULT_LP@_ 26 #cmakedefine LEMON_DEFAULT_MIP LEMON_@LEMON_DEFAULT_MIP@_ 27 12 28 #cmakedefine LEMON_USE_PTHREAD 1 13 29 #cmakedefine LEMON_USE_WIN32_THREADS 1 30 31 #endif -
lemon/core.h
r1270 r1341 20 20 #define LEMON_CORE_H 21 21 22 #include <vector>23 #include <algorithm>24 25 #include <lemon/config.h>26 #include <lemon/bits/enable_if.h>27 #include <lemon/bits/traits.h>28 #include <lemon/assert.h>29 30 // Disable the following warnings when compiling with MSVC:31 // C4250: 'class1' : inherits 'class2::member' via dominance32 // C4355: 'this' : used in base member initializer list33 // C4503: 'function' : decorated name length exceeded, name was truncated34 // C4800: 'type' : forcing value to bool 'true' or 'false' (performance warning)35 // C4996: 'function': was declared deprecated36 #ifdef _MSC_VER37 #pragma warning( disable : 4250 4355 4503 4800 4996 )38 #endif39 40 #ifdef __GNUC__41 #define GCC_VERSION (__GNUC__ * 10000 \42 + __GNUC_MINOR__ * 100 \43 + __GNUC_PATCHLEVEL__)44 #endif45 46 #if GCC_VERSION >= 4080047 // Needed by the [DI]GRAPH_TYPEDEFS marcos for gcc 4.848 #pragma GCC diagnostic ignored "-Wunused-local-typedefs"49 #endif50 51 22 ///\file 52 23 ///\brief LEMON core utilities. … … 55 26 ///It is automatically included by all graph types, therefore it usually 56 27 ///do not have to be included directly. 28 29 // Disable the following warnings when compiling with MSVC: 30 // C4250: 'class1' : inherits 'class2::member' via dominance 31 // C4267: conversion from 'size_t' to 'type', possible loss of data 32 // C4355: 'this' : used in base member initializer list 33 // C4503: 'function' : decorated name length exceeded, name was truncated 34 // C4800: 'type' : forcing value to bool 'true' or 'false' (performance warning) 35 // C4996: 'function': was declared deprecated 36 #ifdef _MSC_VER 37 #pragma warning( disable : 4250 4267 4355 4503 4800 4996 ) 38 #endif 39 40 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) 41 // Needed by the [DI]GRAPH_TYPEDEFS marcos for gcc 4.8 42 #pragma GCC diagnostic ignored "-Wunused-local-typedefs" 43 #endif 44 45 #include <vector> 46 #include <algorithm> 47 48 #include <lemon/config.h> 49 #include <lemon/bits/enable_if.h> 50 #include <lemon/bits/traits.h> 51 #include <lemon/assert.h> 52 53 57 54 58 55 namespace lemon { -
lemon/cost_scaling.h
r1270 r1298 92 92 /// \ref CostScaling implements a cost scaling algorithm that performs 93 93 /// push/augment and relabel operations for finding a \ref min_cost_flow 94 /// "minimum cost flow" \cite amo93networkflows, \cite goldberg90approximation, 94 /// "minimum cost flow" \cite amo93networkflows, 95 /// \cite goldberg90approximation, 95 96 /// \cite goldberg97efficient, \cite bunnagel98efficient. 96 97 /// It is a highly efficient primal-dual solution method, which … … 214 215 typedef std::vector<LargeCost> LargeCostVector; 215 216 typedef std::vector<char> BoolVector; 216 // Note: vector<char> is used instead of vector<bool> for efficiency reasons 217 // Note: vector<char> is used instead of vector<bool> 218 // for efficiency reasons 217 219 218 220 private: … … 255 257 256 258 // Parameters of the problem 257 bool _ha ve_lower;259 bool _has_lower; 258 260 Value _sum_supply; 259 261 int _sup_node_num; … … 371 373 template <typename LowerMap> 372 374 CostScaling& lowerMap(const LowerMap& map) { 373 _ha ve_lower = true;375 _has_lower = true; 374 376 for (ArcIt a(_graph); a != INVALID; ++a) { 375 377 _lower[_arc_idf[a]] = map[a]; 376 _lower[_arc_idb[a]] = map[a];377 378 } 378 379 return *this; … … 567 568 _scost[_reverse[j]] = 0; 568 569 } 569 _ha ve_lower = false;570 _has_lower = false; 570 571 return *this; 571 572 } … … 779 780 const Value MAX = std::numeric_limits<Value>::max(); 780 781 int last_out; 781 if (_ha ve_lower) {782 if (_has_lower) { 782 783 for (int i = 0; i != _root; ++i) { 783 784 last_out = _first_out[i+1]; … … 836 837 sup[n] = _supply[_node_id[n]]; 837 838 } 838 if (_ha ve_lower) {839 if (_has_lower) { 839 840 for (ArcIt a(_graph); a != INVALID; ++a) { 840 841 int j = _arc_idf[a]; … … 906 907 } 907 908 908 // Check if the upper bound is greater or equal to the lower bound909 // on each arc.909 // Check if the upper bound is greater than or equal to the lower bound 910 // on each forward arc. 910 911 bool checkBoundMaps() { 911 912 for (int j = 0; j != _res_arc_num; ++j) { 912 if (_ upper[j] < _lower[j]) return false;913 if (_forward[j] && _upper[j] < _lower[j]) return false; 913 914 } 914 915 return true; … … 990 991 991 992 // Handle non-zero lower bounds 992 if (_ha ve_lower) {993 if (_has_lower) { 993 994 int limit = _first_out[_root]; 994 995 for (int j = 0; j != limit; ++j) { 995 if ( !_forward[j]) _res_cap[j] += _lower[j];996 if (_forward[j]) _res_cap[_reverse[j]] += _lower[j]; 996 997 } 997 998 } -
lemon/counter.h
r833 r1327 22 22 #include <string> 23 23 #include <iostream> 24 25 #include <lemon/core.h> 24 26 25 27 ///\ingroup timecount -
lemon/cplex.cc
r1270 r1349 38 38 } 39 39 40 void CplexEnv::incCnt() 41 { 42 _cnt_lock->lock(); 43 ++(*_cnt); 44 _cnt_lock->unlock(); 45 } 46 47 void CplexEnv::decCnt() 48 { 49 _cnt_lock->lock(); 50 --(*_cnt); 51 if (*_cnt == 0) { 52 delete _cnt; 53 _cnt_lock->unlock(); 54 delete _cnt_lock; 55 CPXcloseCPLEX(&_env); 56 } 57 else _cnt_lock->unlock(); 58 } 59 40 60 CplexEnv::CplexEnv() { 41 61 int status; 62 _env = CPXopenCPLEX(&status); 63 if (_env == 0) 64 throw LicenseError(status); 42 65 _cnt = new int; 43 66 (*_cnt) = 1; 44 _env = CPXopenCPLEX(&status); 45 if (_env == 0) { 46 delete _cnt; 47 _cnt = 0; 48 throw LicenseError(status); 49 } 67 _cnt_lock = new bits::Lock; 50 68 } 51 69 … … 53 71 _env = other._env; 54 72 _cnt = other._cnt; 55 ++(*_cnt); 73 _cnt_lock = other._cnt_lock; 74 incCnt(); 56 75 } 57 76 58 77 CplexEnv& CplexEnv::operator=(const CplexEnv& other) { 78 decCnt(); 59 79 _env = other._env; 60 80 _cnt = other._cnt; 61 ++(*_cnt); 81 _cnt_lock = other._cnt_lock; 82 incCnt(); 62 83 return *this; 63 84 } 64 85 65 86 CplexEnv::~CplexEnv() { 66 --(*_cnt); 67 if (*_cnt == 0) { 68 delete _cnt; 69 CPXcloseCPLEX(&_env); 70 } 87 decCnt(); 71 88 } 72 89 … … 88 105 int status; 89 106 _prob = CPXcloneprob(cplexEnv(), cplex._prob, &status); 90 rows = cplex.rows;91 cols = cplex.cols;107 _rows = cplex._rows; 108 _cols = cplex._cols; 92 109 messageLevel(MESSAGE_NOTHING); 93 110 } … … 116 133 ExprIterator e, Value ub) { 117 134 int i = CPXgetnumrows(cplexEnv(), _prob); 135 136 int rmatbeg = 0; 137 138 std::vector<int> indices; 139 std::vector<Value> values; 140 141 for(ExprIterator it=b; it!=e; ++it) { 142 indices.push_back(it->first); 143 values.push_back(it->second); 144 } 145 118 146 if (lb == -INF) { 119 147 const char s = 'L'; 120 CPXnewrows(cplexEnv(), _prob, 1, &ub, &s, 0, 0); 148 CPXaddrows(cplexEnv(), _prob, 0, 1, values.size(), &ub, &s, 149 &rmatbeg, &indices.front(), &values.front(), 0, 0); 121 150 } else if (ub == INF) { 122 151 const char s = 'G'; 123 CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, 0, 0); 152 CPXaddrows(cplexEnv(), _prob, 0, 1, values.size(), &lb, &s, 153 &rmatbeg, &indices.front(), &values.front(), 0, 0); 124 154 } else if (lb == ub){ 125 155 const char s = 'E'; 126 CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, 0, 0); 156 CPXaddrows(cplexEnv(), _prob, 0, 1, values.size(), &lb, &s, 157 &rmatbeg, &indices.front(), &values.front(), 0, 0); 127 158 } else { 128 159 const char s = 'R'; 129 160 double len = ub - lb; 130 CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, &len, 0); 131 } 132 133 std::vector<int> indices; 134 std::vector<int> rowlist; 135 std::vector<Value> values; 136 137 for(ExprIterator it=b; it!=e; ++it) { 138 indices.push_back(it->first); 139 values.push_back(it->second); 140 rowlist.push_back(i); 141 } 142 143 CPXchgcoeflist(cplexEnv(), _prob, values.size(), 144 &rowlist.front(), &indices.front(), &values.front()); 145 161 CPXaddrows(cplexEnv(), _prob, 0, 1, values.size(), &ub, &s, 162 &rmatbeg, &indices.front(), &values.front(), 0, 0); 163 CPXchgrngval(cplexEnv(), _prob, 1, &i, &len); 164 } 165 146 166 return i; 147 167 } … … 156 176 157 177 void CplexBase::_eraseColId(int i) { 158 cols.eraseIndex(i);159 cols.shiftIndices(i);178 _cols.eraseIndex(i); 179 _cols.shiftIndices(i); 160 180 } 161 181 void CplexBase::_eraseRowId(int i) { 162 rows.eraseIndex(i);163 rows.shiftIndices(i);182 _rows.eraseIndex(i); 183 _rows.shiftIndices(i); 164 184 } 165 185 -
lemon/cplex.h
r1270 r1347 24 24 25 25 #include <lemon/lp_base.h> 26 #include <lemon/bits/lock.h> 26 27 27 28 struct cpxenv; … … 41 42 cpxenv* _env; 42 43 mutable int* _cnt; 43 44 mutable bits::Lock* _cnt_lock; 45 46 void incCnt(); 47 void decCnt(); 48 44 49 public: 45 50 -
lemon/cycle_canceling.h
r1270 r1298 196 196 197 197 // Parameters of the problem 198 bool _ha ve_lower;198 bool _has_lower; 199 199 Value _sum_supply; 200 200 … … 279 279 template <typename LowerMap> 280 280 CycleCanceling& lowerMap(const LowerMap& map) { 281 _ha ve_lower = true;281 _has_lower = true; 282 282 for (ArcIt a(_graph); a != INVALID; ++a) { 283 283 _lower[_arc_idf[a]] = map[a]; 284 _lower[_arc_idb[a]] = map[a];285 284 } 286 285 return *this; … … 472 471 _cost[_reverse[j]] = 0; 473 472 } 474 _ha ve_lower = false;473 _has_lower = false; 475 474 return *this; 476 475 } … … 685 684 const Value MAX = std::numeric_limits<Value>::max(); 686 685 int last_out; 687 if (_ha ve_lower) {686 if (_has_lower) { 688 687 for (int i = 0; i != _root; ++i) { 689 688 last_out = _first_out[i+1]; … … 728 727 sup[n] = _supply[_node_id[n]]; 729 728 } 730 if (_ha ve_lower) {729 if (_has_lower) { 731 730 for (ArcIt a(_graph); a != INVALID; ++a) { 732 731 int j = _arc_idf[a]; … … 785 784 } 786 785 787 // Check if the upper bound is greater or equal to the lower bound788 // on each arc.786 // Check if the upper bound is greater than or equal to the lower bound 787 // on each forward arc. 789 788 bool checkBoundMaps() { 790 789 for (int j = 0; j != _res_arc_num; ++j) { 791 if (_ upper[j] < _lower[j]) return false;790 if (_forward[j] && _upper[j] < _lower[j]) return false; 792 791 } 793 792 return true; … … 836 835 837 836 // Handle non-zero lower bounds 838 if (_ha ve_lower) {837 if (_has_lower) { 839 838 int limit = _first_out[_root]; 840 839 for (int j = 0; j != limit; ++j) { 841 if ( !_forward[j]) _res_cap[j] += _lower[j];840 if (_forward[j]) _res_cap[_reverse[j]] += _lower[j]; 842 841 } 843 842 } -
lemon/dim2.h
r761 r1311 21 21 22 22 #include <iostream> 23 #include <algorithm> 23 24 24 25 ///\ingroup geomdat -
lemon/dimacs.h
r1270 r1375 26 26 #include <lemon/maps.h> 27 27 #include <lemon/error.h> 28 28 29 /// \ingroup dimacs_group 29 30 /// \file … … 123 124 /// 124 125 /// If the file type was previously evaluated by dimacsType(), then 125 /// the descriptor struct should be given by the \c des tparameter.126 /// the descriptor struct should be given by the \c desc parameter. 126 127 template <typename Digraph, typename LowerMap, 127 128 typename CapacityMap, typename CostMap, … … 277 278 /// 278 279 /// If the file type was previously evaluated by dimacsType(), then 279 /// the descriptor struct should be given by the \c des tparameter.280 /// the descriptor struct should be given by the \c desc parameter. 280 281 template<typename Digraph, typename CapacityMap> 281 282 void readDimacsMax(std::istream& is, … … 304 305 /// 305 306 /// If the file type was previously evaluated by dimacsType(), then 306 /// the descriptor struct should be given by the \c des tparameter.307 /// the descriptor struct should be given by the \c desc parameter. 307 308 template<typename Digraph, typename LengthMap> 308 309 void readDimacsSp(std::istream& is, … … 335 336 /// 336 337 /// If the file type was previously evaluated by dimacsType(), then 337 /// the descriptor struct should be given by the \c des tparameter.338 /// the descriptor struct should be given by the \c desc parameter. 338 339 template<typename Digraph, typename CapacityMap> 339 340 void readDimacsCap(std::istream& is, … … 344 345 typename Digraph::Node u,v; 345 346 if(desc.type==DimacsDescriptor::NONE) desc=dimacsType(is); 346 if(desc.type!=DimacsDescriptor::MAX ||desc.type!=DimacsDescriptor::SP)347 if(desc.type!=DimacsDescriptor::MAX && desc.type!=DimacsDescriptor::SP) 347 348 throw FormatError("Problem type mismatch"); 348 349 _readDimacs(is, g, capacity, u, v, infty, desc); … … 375 376 /// 376 377 /// If the file type was previously evaluated by dimacsType(), then 377 /// the descriptor struct should be given by the \c des tparameter.378 /// the descriptor struct should be given by the \c desc parameter. 378 379 template<typename Graph> 379 380 void readDimacsMat(std::istream& is, Graph &g, -
lemon/elevator.h
r628 r1328 168 168 int onLevel(int l) const 169 169 { 170 return _first[l+1]-_first[l];170 return static_cast<int>(_first[l+1]-_first[l]); 171 171 } 172 172 ///Return true if level \c l is empty. … … 178 178 int aboveLevel(int l) const 179 179 { 180 return _first[_max_level+1]-_first[l+1];180 return static_cast<int>(_first[_max_level+1]-_first[l+1]); 181 181 } 182 182 ///Return the number of active items on level \c l. 183 183 int activesOnLevel(int l) const 184 184 { 185 return _last_active[l]-_first[l]+1;185 return static_cast<int>(_last_active[l]-_first[l]+1); 186 186 } 187 187 ///Return true if there is no active item on level \c l. -
lemon/glpk.cc
r1270 r1336 39 39 glp_copy_prob(lp, other.lp, GLP_ON); 40 40 glp_create_index(lp); 41 rows = other.rows;42 cols = other.cols;41 _rows = other._rows; 42 _cols = other._cols; 43 43 messageLevel(MESSAGE_NOTHING); 44 44 } … … 109 109 110 110 void GlpkBase::_eraseColId(int i) { 111 cols.eraseIndex(i);112 cols.shiftIndices(i);111 _cols.eraseIndex(i); 112 _cols.shiftIndices(i); 113 113 } 114 114 115 115 void GlpkBase::_eraseRowId(int i) { 116 rows.eraseIndex(i);117 rows.shiftIndices(i);116 _rows.eraseIndex(i); 117 _rows.shiftIndices(i); 118 118 } 119 119 -
lemon/glpk.h
r1270 r1336 142 142 143 143 ///Returns the constraint identifier understood by GLPK. 144 int lpxRow(Row r) const { return rows(id(r)); }144 int lpxRow(Row r) const { return _rows(id(r)); } 145 145 146 146 ///Returns the variable identifier understood by GLPK. 147 int lpxCol(Col c) const { return cols(id(c)); }147 int lpxCol(Col c) const { return _cols(id(c)); } 148 148 149 149 #ifdef DOXYGEN -
lemon/graph_to_eps.h
r1270 r1340 26 26 #include<vector> 27 27 28 #ifndef WIN3228 #ifndef LEMON_WIN32 29 29 #include<sys/time.h> 30 30 #include<ctime> … … 223 223 using T::_copyright; 224 224 225 using T::NodeTextColorType;226 225 using T::CUST_COL; 227 226 using T::DIST_COL; … … 676 675 { 677 676 os << "%%CreationDate: "; 678 #ifndef WIN32677 #ifndef LEMON_WIN32 679 678 timeval tv; 680 679 gettimeofday(&tv, 0); -
lemon/howard_mmc.h
r1270 r1271 362 362 /// \return The termination cause of the search process. 363 363 /// For more information, see \ref TerminationCause. 364 TerminationCause findCycleMean(int limit = std::numeric_limits<int>::max()) { 364 TerminationCause findCycleMean(int limit = 365 std::numeric_limits<int>::max()) { 365 366 // Initialize and find strongly connected components 366 367 init(); -
lemon/lgf_reader.h
r1270 r1377 452 452 /// 453 453 ///\code 454 /// DigraphReader<DGR>(digraph, std::cin) .455 /// nodeMap("coordinates", coord_map).456 /// arcMap("capacity", cap_map).457 /// node("source", src).458 /// node("target", trg).459 /// attribute("caption", caption).460 /// run();454 /// DigraphReader<DGR>(digraph, std::cin) 455 /// .nodeMap("coordinates", coord_map) 456 /// .arcMap("capacity", cap_map) 457 /// .node("source", src) 458 /// .node("target", trg) 459 /// .attribute("caption", caption) 460 /// .run(); 461 461 ///\endcode 462 462 /// … … 1245 1245 ///\code 1246 1246 ///ListDigraph digraph; 1247 ///ListDigraph::ArcMap<int> c m(digraph);1247 ///ListDigraph::ArcMap<int> cap(digraph); 1248 1248 ///ListDigraph::Node src, trg; 1249 ///digraphReader(digraph, std::cin) .1250 /// arcMap("capacity", cap).1251 /// node("source", src).1252 /// node("target", trg).1253 /// run();1249 ///digraphReader(digraph, std::cin) 1250 /// .arcMap("capacity", cap) 1251 /// .node("source", src) 1252 /// .node("target", trg) 1253 /// .run(); 1254 1254 ///\endcode 1255 1255 /// … … 2124 2124 ///ListGraph graph; 2125 2125 ///ListGraph::EdgeMap<int> weight(graph); 2126 ///graphReader(graph, std::cin) .2127 /// edgeMap("weight", weight).2128 /// run();2126 ///graphReader(graph, std::cin) 2127 /// .edgeMap("weight", weight) 2128 /// .run(); 2129 2129 ///\endcode 2130 2130 /// … … 3192 3192 ///ListBpGraph graph; 3193 3193 ///ListBpGraph::EdgeMap<int> weight(graph); 3194 ///bpGraphReader(graph, std::cin) .3195 /// edgeMap("weight", weight).3196 /// run();3194 ///bpGraphReader(graph, std::cin) 3195 /// .edgeMap("weight", weight) 3196 /// .run(); 3197 3197 ///\endcode 3198 3198 /// -
lemon/lgf_writer.h
r1270 r1377 409 409 /// 410 410 ///\code 411 /// DigraphWriter<DGR>(digraph, std::cout) .412 /// nodeMap("coordinates", coord_map).413 /// nodeMap("size", size).414 /// nodeMap("title", title).415 /// arcMap("capacity", cap_map).416 /// node("source", src).417 /// node("target", trg).418 /// attribute("caption", caption).419 /// run();411 /// DigraphWriter<DGR>(digraph, std::cout) 412 /// .nodeMap("coordinates", coord_map) 413 /// .nodeMap("size", size) 414 /// .nodeMap("title", title) 415 /// .arcMap("capacity", cap_map) 416 /// .node("source", src) 417 /// .node("target", trg) 418 /// .attribute("caption", caption) 419 /// .run(); 420 420 ///\endcode 421 421 /// … … 962 962 ///ListDigraph::Node src, trg; 963 963 /// // Setting the capacity map and source and target nodes 964 ///digraphWriter(digraph, std::cout) .965 /// arcMap("capacity", cap).966 /// node("source", src).967 /// node("target", trg).968 /// run();964 ///digraphWriter(digraph, std::cout) 965 /// .arcMap("capacity", cap) 966 /// .node("source", src) 967 /// .node("target", trg) 968 /// .run(); 969 969 ///\endcode 970 970 /// … … 1600 1600 ///ListGraph::EdgeMap<int> weight(graph); 1601 1601 /// // Setting the weight map 1602 ///graphWriter(graph, std::cout) .1603 /// edgeMap("weight", weight).1604 /// run();1602 ///graphWriter(graph, std::cout) 1603 /// .edgeMap("weight", weight) 1604 /// .run(); 1605 1605 ///\endcode 1606 1606 /// … … 2420 2420 ///ListBpGraph::EdgeMap<int> weight(graph); 2421 2421 /// // Setting the weight map 2422 ///bpGraphWriter(graph, std::cout) .2423 /// edgeMap("weight", weight).2424 /// run();2422 ///bpGraphWriter(graph, std::cout) 2423 /// .edgeMap("weight", weight) 2424 /// .run(); 2425 2425 ///\endcode 2426 2426 /// -
lemon/list_graph.h
r1270 r1359 49 49 }; 50 50 51 std::vector<NodeT> nodes;51 std::vector<NodeT> _nodes; 52 52 53 53 int first_node; … … 55 55 int first_free_node; 56 56 57 std::vector<ArcT> arcs;57 std::vector<ArcT> _arcs; 58 58 59 59 int first_free_arc; … … 98 98 99 99 ListDigraphBase() 100 : nodes(), first_node(-1),101 first_free_node(-1), arcs(), first_free_arc(-1) {}102 103 104 int maxNodeId() const { return nodes.size()-1; }105 int maxArcId() const { return arcs.size()-1; }106 107 Node source(Arc e) const { return Node( arcs[e.id].source); }108 Node target(Arc e) const { return Node( arcs[e.id].target); }100 : _nodes(), first_node(-1), 101 first_free_node(-1), _arcs(), first_free_arc(-1) {} 102 103 104 int maxNodeId() const { return _nodes.size()-1; } 105 int maxArcId() const { return _arcs.size()-1; } 106 107 Node source(Arc e) const { return Node(_arcs[e.id].source); } 108 Node target(Arc e) const { return Node(_arcs[e.id].target); } 109 109 110 110 … … 114 114 115 115 void next(Node& node) const { 116 node.id = nodes[node.id].next;116 node.id = _nodes[node.id].next; 117 117 } 118 118 … … 121 121 int n; 122 122 for(n = first_node; 123 n != -1 && nodes[n].first_out == -1;124 n = nodes[n].next) {}125 arc.id = (n == -1) ? -1 : nodes[n].first_out;123 n != -1 && _nodes[n].first_out == -1; 124 n = _nodes[n].next) {} 125 arc.id = (n == -1) ? -1 : _nodes[n].first_out; 126 126 } 127 127 128 128 void next(Arc& arc) const { 129 if ( arcs[arc.id].next_out != -1) {130 arc.id = arcs[arc.id].next_out;129 if (_arcs[arc.id].next_out != -1) { 130 arc.id = _arcs[arc.id].next_out; 131 131 } else { 132 132 int n; 133 for(n = nodes[arcs[arc.id].source].next;134 n != -1 && nodes[n].first_out == -1;135 n = nodes[n].next) {}136 arc.id = (n == -1) ? -1 : nodes[n].first_out;133 for(n = _nodes[_arcs[arc.id].source].next; 134 n != -1 && _nodes[n].first_out == -1; 135 n = _nodes[n].next) {} 136 arc.id = (n == -1) ? -1 : _nodes[n].first_out; 137 137 } 138 138 } 139 139 140 140 void firstOut(Arc &e, const Node& v) const { 141 e.id = nodes[v.id].first_out;141 e.id = _nodes[v.id].first_out; 142 142 } 143 143 void nextOut(Arc &e) const { 144 e.id= arcs[e.id].next_out;144 e.id=_arcs[e.id].next_out; 145 145 } 146 146 147 147 void firstIn(Arc &e, const Node& v) const { 148 e.id = nodes[v.id].first_in;148 e.id = _nodes[v.id].first_in; 149 149 } 150 150 void nextIn(Arc &e) const { 151 e.id= arcs[e.id].next_in;151 e.id=_arcs[e.id].next_in; 152 152 } 153 153 … … 160 160 161 161 bool valid(Node n) const { 162 return n.id >= 0 && n.id < static_cast<int>( nodes.size()) &&163 nodes[n.id].prev != -2;162 return n.id >= 0 && n.id < static_cast<int>(_nodes.size()) && 163 _nodes[n.id].prev != -2; 164 164 } 165 165 166 166 bool valid(Arc a) const { 167 return a.id >= 0 && a.id < static_cast<int>( arcs.size()) &&168 arcs[a.id].prev_in != -2;167 return a.id >= 0 && a.id < static_cast<int>(_arcs.size()) && 168 _arcs[a.id].prev_in != -2; 169 169 } 170 170 … … 173 173 174 174 if(first_free_node==-1) { 175 n = nodes.size();176 nodes.push_back(NodeT());175 n = _nodes.size(); 176 _nodes.push_back(NodeT()); 177 177 } else { 178 178 n = first_free_node; 179 first_free_node = nodes[n].next;180 } 181 182 nodes[n].next = first_node;183 if(first_node != -1) nodes[first_node].prev = n;179 first_free_node = _nodes[n].next; 180 } 181 182 _nodes[n].next = first_node; 183 if(first_node != -1) _nodes[first_node].prev = n; 184 184 first_node = n; 185 nodes[n].prev = -1;186 187 nodes[n].first_in =nodes[n].first_out = -1;185 _nodes[n].prev = -1; 186 187 _nodes[n].first_in = _nodes[n].first_out = -1; 188 188 189 189 return Node(n); … … 194 194 195 195 if (first_free_arc == -1) { 196 n = arcs.size();197 arcs.push_back(ArcT());196 n = _arcs.size(); 197 _arcs.push_back(ArcT()); 198 198 } else { 199 199 n = first_free_arc; 200 first_free_arc = arcs[n].next_in;201 } 202 203 arcs[n].source = u.id;204 arcs[n].target = v.id;205 206 arcs[n].next_out =nodes[u.id].first_out;207 if( nodes[u.id].first_out != -1) {208 arcs[nodes[u.id].first_out].prev_out = n;209 } 210 211 arcs[n].next_in =nodes[v.id].first_in;212 if( nodes[v.id].first_in != -1) {213 arcs[nodes[v.id].first_in].prev_in = n;214 } 215 216 arcs[n].prev_in =arcs[n].prev_out = -1;217 218 nodes[u.id].first_out =nodes[v.id].first_in = n;200 first_free_arc = _arcs[n].next_in; 201 } 202 203 _arcs[n].source = u.id; 204 _arcs[n].target = v.id; 205 206 _arcs[n].next_out = _nodes[u.id].first_out; 207 if(_nodes[u.id].first_out != -1) { 208 _arcs[_nodes[u.id].first_out].prev_out = n; 209 } 210 211 _arcs[n].next_in = _nodes[v.id].first_in; 212 if(_nodes[v.id].first_in != -1) { 213 _arcs[_nodes[v.id].first_in].prev_in = n; 214 } 215 216 _arcs[n].prev_in = _arcs[n].prev_out = -1; 217 218 _nodes[u.id].first_out = _nodes[v.id].first_in = n; 219 219 220 220 return Arc(n); … … 224 224 int n = node.id; 225 225 226 if( nodes[n].next != -1) {227 nodes[nodes[n].next].prev =nodes[n].prev;228 } 229 230 if( nodes[n].prev != -1) {231 nodes[nodes[n].prev].next =nodes[n].next;232 } else { 233 first_node = nodes[n].next;234 } 235 236 nodes[n].next = first_free_node;226 if(_nodes[n].next != -1) { 227 _nodes[_nodes[n].next].prev = _nodes[n].prev; 228 } 229 230 if(_nodes[n].prev != -1) { 231 _nodes[_nodes[n].prev].next = _nodes[n].next; 232 } else { 233 first_node = _nodes[n].next; 234 } 235 236 _nodes[n].next = first_free_node; 237 237 first_free_node = n; 238 nodes[n].prev = -2;238 _nodes[n].prev = -2; 239 239 240 240 } … … 243 243 int n = arc.id; 244 244 245 if( arcs[n].next_in!=-1) {246 arcs[arcs[n].next_in].prev_in =arcs[n].prev_in;247 } 248 249 if( arcs[n].prev_in!=-1) {250 arcs[arcs[n].prev_in].next_in =arcs[n].next_in;251 } else { 252 nodes[arcs[n].target].first_in =arcs[n].next_in;253 } 254 255 256 if( arcs[n].next_out!=-1) {257 arcs[arcs[n].next_out].prev_out =arcs[n].prev_out;258 } 259 260 if( arcs[n].prev_out!=-1) {261 arcs[arcs[n].prev_out].next_out =arcs[n].next_out;262 } else { 263 nodes[arcs[n].source].first_out =arcs[n].next_out;264 } 265 266 arcs[n].next_in = first_free_arc;245 if(_arcs[n].next_in!=-1) { 246 _arcs[_arcs[n].next_in].prev_in = _arcs[n].prev_in; 247 } 248 249 if(_arcs[n].prev_in!=-1) { 250 _arcs[_arcs[n].prev_in].next_in = _arcs[n].next_in; 251 } else { 252 _nodes[_arcs[n].target].first_in = _arcs[n].next_in; 253 } 254 255 256 if(_arcs[n].next_out!=-1) { 257 _arcs[_arcs[n].next_out].prev_out = _arcs[n].prev_out; 258 } 259 260 if(_arcs[n].prev_out!=-1) { 261 _arcs[_arcs[n].prev_out].next_out = _arcs[n].next_out; 262 } else { 263 _nodes[_arcs[n].source].first_out = _arcs[n].next_out; 264 } 265 266 _arcs[n].next_in = first_free_arc; 267 267 first_free_arc = n; 268 arcs[n].prev_in = -2;268 _arcs[n].prev_in = -2; 269 269 } 270 270 271 271 void clear() { 272 arcs.clear();273 nodes.clear();272 _arcs.clear(); 273 _nodes.clear(); 274 274 first_node = first_free_node = first_free_arc = -1; 275 275 } … … 278 278 void changeTarget(Arc e, Node n) 279 279 { 280 if( arcs[e.id].next_in != -1)281 arcs[arcs[e.id].next_in].prev_in =arcs[e.id].prev_in;282 if( arcs[e.id].prev_in != -1)283 arcs[arcs[e.id].prev_in].next_in =arcs[e.id].next_in;284 else nodes[arcs[e.id].target].first_in =arcs[e.id].next_in;285 if ( nodes[n.id].first_in != -1) {286 arcs[nodes[n.id].first_in].prev_in = e.id;287 } 288 arcs[e.id].target = n.id;289 arcs[e.id].prev_in = -1;290 arcs[e.id].next_in =nodes[n.id].first_in;291 nodes[n.id].first_in = e.id;280 if(_arcs[e.id].next_in != -1) 281 _arcs[_arcs[e.id].next_in].prev_in = _arcs[e.id].prev_in; 282 if(_arcs[e.id].prev_in != -1) 283 _arcs[_arcs[e.id].prev_in].next_in = _arcs[e.id].next_in; 284 else _nodes[_arcs[e.id].target].first_in = _arcs[e.id].next_in; 285 if (_nodes[n.id].first_in != -1) { 286 _arcs[_nodes[n.id].first_in].prev_in = e.id; 287 } 288 _arcs[e.id].target = n.id; 289 _arcs[e.id].prev_in = -1; 290 _arcs[e.id].next_in = _nodes[n.id].first_in; 291 _nodes[n.id].first_in = e.id; 292 292 } 293 293 void changeSource(Arc e, Node n) 294 294 { 295 if( arcs[e.id].next_out != -1)296 arcs[arcs[e.id].next_out].prev_out =arcs[e.id].prev_out;297 if( arcs[e.id].prev_out != -1)298 arcs[arcs[e.id].prev_out].next_out =arcs[e.id].next_out;299 else nodes[arcs[e.id].source].first_out =arcs[e.id].next_out;300 if ( nodes[n.id].first_out != -1) {301 arcs[nodes[n.id].first_out].prev_out = e.id;302 } 303 arcs[e.id].source = n.id;304 arcs[e.id].prev_out = -1;305 arcs[e.id].next_out =nodes[n.id].first_out;306 nodes[n.id].first_out = e.id;295 if(_arcs[e.id].next_out != -1) 296 _arcs[_arcs[e.id].next_out].prev_out = _arcs[e.id].prev_out; 297 if(_arcs[e.id].prev_out != -1) 298 _arcs[_arcs[e.id].prev_out].next_out = _arcs[e.id].next_out; 299 else _nodes[_arcs[e.id].source].first_out = _arcs[e.id].next_out; 300 if (_nodes[n.id].first_out != -1) { 301 _arcs[_nodes[n.id].first_out].prev_out = e.id; 302 } 303 _arcs[e.id].source = n.id; 304 _arcs[e.id].prev_out = -1; 305 _arcs[e.id].next_out = _nodes[n.id].first_out; 306 _nodes[n.id].first_out = e.id; 307 307 } 308 308 … … 487 487 Node split(Node n, bool connect = true) { 488 488 Node b = addNode(); 489 nodes[b.id].first_out=nodes[n.id].first_out;490 nodes[n.id].first_out=-1;491 for(int i= nodes[b.id].first_out; i!=-1; i=arcs[i].next_out) {492 arcs[i].source=b.id;489 _nodes[b.id].first_out=_nodes[n.id].first_out; 490 _nodes[n.id].first_out=-1; 491 for(int i=_nodes[b.id].first_out; i!=-1; i=_arcs[i].next_out) { 492 _arcs[i].source=b.id; 493 493 } 494 494 if (connect) addArc(n,b); … … 533 533 /// to build the digraph. 534 534 /// \sa reserveArc() 535 void reserveNode(int n) { nodes.reserve(n); };535 void reserveNode(int n) { _nodes.reserve(n); }; 536 536 537 537 /// Reserve memory for arcs. … … 543 543 /// to build the digraph. 544 544 /// \sa reserveNode() 545 void reserveArc(int m) { arcs.reserve(m); };545 void reserveArc(int m) { _arcs.reserve(m); }; 546 546 547 547 /// \brief Class to make a snapshot of the digraph and restore … … 583 583 } 584 584 virtual void add(const std::vector<Node>& nodes) { 585 for (int i = nodes.size() - 1; i >= 0; ++i) {585 for (int i = nodes.size() - 1; i >= 0; --i) { 586 586 snapshot.addNode(nodes[i]); 587 587 } … … 633 633 } 634 634 virtual void add(const std::vector<Arc>& arcs) { 635 for (int i = arcs.size() - 1; i >= 0; ++i) {635 for (int i = arcs.size() - 1; i >= 0; --i) { 636 636 snapshot.addArc(arcs[i]); 637 637 } … … 804 804 }; 805 805 806 std::vector<NodeT> nodes;806 std::vector<NodeT> _nodes; 807 807 808 808 int first_node; … … 810 810 int first_free_node; 811 811 812 std::vector<ArcT> arcs;812 std::vector<ArcT> _arcs; 813 813 814 814 int first_free_arc; … … 868 868 869 869 ListGraphBase() 870 : nodes(), first_node(-1),871 first_free_node(-1), arcs(), first_free_arc(-1) {}872 873 874 int maxNodeId() const { return nodes.size()-1; }875 int maxEdgeId() const { return arcs.size() / 2 - 1; }876 int maxArcId() const { return arcs.size()-1; }877 878 Node source(Arc e) const { return Node( arcs[e.id ^ 1].target); }879 Node target(Arc e) const { return Node( arcs[e.id].target); }880 881 Node u(Edge e) const { return Node( arcs[2 * e.id].target); }882 Node v(Edge e) const { return Node( arcs[2 * e.id + 1].target); }870 : _nodes(), first_node(-1), 871 first_free_node(-1), _arcs(), first_free_arc(-1) {} 872 873 874 int maxNodeId() const { return _nodes.size()-1; } 875 int maxEdgeId() const { return _arcs.size() / 2 - 1; } 876 int maxArcId() const { return _arcs.size()-1; } 877 878 Node source(Arc e) const { return Node(_arcs[e.id ^ 1].target); } 879 Node target(Arc e) const { return Node(_arcs[e.id].target); } 880 881 Node u(Edge e) const { return Node(_arcs[2 * e.id].target); } 882 Node v(Edge e) const { return Node(_arcs[2 * e.id + 1].target); } 883 883 884 884 static bool direction(Arc e) { … … 895 895 896 896 void next(Node& node) const { 897 node.id = nodes[node.id].next;897 node.id = _nodes[node.id].next; 898 898 } 899 899 900 900 void first(Arc& e) const { 901 901 int n = first_node; 902 while (n != -1 && nodes[n].first_out == -1) {903 n = nodes[n].next;904 } 905 e.id = (n == -1) ? -1 : nodes[n].first_out;902 while (n != -1 && _nodes[n].first_out == -1) { 903 n = _nodes[n].next; 904 } 905 e.id = (n == -1) ? -1 : _nodes[n].first_out; 906 906 } 907 907 908 908 void next(Arc& e) const { 909 if ( arcs[e.id].next_out != -1) {910 e.id = arcs[e.id].next_out;911 } else { 912 int n = nodes[arcs[e.id ^ 1].target].next;913 while(n != -1 && nodes[n].first_out == -1) {914 n = nodes[n].next;915 } 916 e.id = (n == -1) ? -1 : nodes[n].first_out;909 if (_arcs[e.id].next_out != -1) { 910 e.id = _arcs[e.id].next_out; 911 } else { 912 int n = _nodes[_arcs[e.id ^ 1].target].next; 913 while(n != -1 && _nodes[n].first_out == -1) { 914 n = _nodes[n].next; 915 } 916 e.id = (n == -1) ? -1 : _nodes[n].first_out; 917 917 } 918 918 } … … 921 921 int n = first_node; 922 922 while (n != -1) { 923 e.id = nodes[n].first_out;923 e.id = _nodes[n].first_out; 924 924 while ((e.id & 1) != 1) { 925 e.id = arcs[e.id].next_out;925 e.id = _arcs[e.id].next_out; 926 926 } 927 927 if (e.id != -1) { … … 929 929 return; 930 930 } 931 n = nodes[n].next;931 n = _nodes[n].next; 932 932 } 933 933 e.id = -1; … … 935 935 936 936 void next(Edge& e) const { 937 int n = arcs[e.id * 2].target;938 e.id = arcs[(e.id * 2) | 1].next_out;937 int n = _arcs[e.id * 2].target; 938 e.id = _arcs[(e.id * 2) | 1].next_out; 939 939 while ((e.id & 1) != 1) { 940 e.id = arcs[e.id].next_out;940 e.id = _arcs[e.id].next_out; 941 941 } 942 942 if (e.id != -1) { … … 944 944 return; 945 945 } 946 n = nodes[n].next;946 n = _nodes[n].next; 947 947 while (n != -1) { 948 e.id = nodes[n].first_out;948 e.id = _nodes[n].first_out; 949 949 while ((e.id & 1) != 1) { 950 e.id = arcs[e.id].next_out;950 e.id = _arcs[e.id].next_out; 951 951 } 952 952 if (e.id != -1) { … … 954 954 return; 955 955 } 956 n = nodes[n].next;956 n = _nodes[n].next; 957 957 } 958 958 e.id = -1; … … 960 960 961 961 void firstOut(Arc &e, const Node& v) const { 962 e.id = nodes[v.id].first_out;962 e.id = _nodes[v.id].first_out; 963 963 } 964 964 void nextOut(Arc &e) const { 965 e.id = arcs[e.id].next_out;965 e.id = _arcs[e.id].next_out; 966 966 } 967 967 968 968 void firstIn(Arc &e, const Node& v) const { 969 e.id = (( nodes[v.id].first_out) ^ 1);969 e.id = ((_nodes[v.id].first_out) ^ 1); 970 970 if (e.id == -2) e.id = -1; 971 971 } 972 972 void nextIn(Arc &e) const { 973 e.id = (( arcs[e.id ^ 1].next_out) ^ 1);973 e.id = ((_arcs[e.id ^ 1].next_out) ^ 1); 974 974 if (e.id == -2) e.id = -1; 975 975 } 976 976 977 977 void firstInc(Edge &e, bool& d, const Node& v) const { 978 int a = nodes[v.id].first_out;978 int a = _nodes[v.id].first_out; 979 979 if (a != -1 ) { 980 980 e.id = a / 2; … … 986 986 } 987 987 void nextInc(Edge &e, bool& d) const { 988 int a = ( arcs[(e.id * 2) | (d ? 1 : 0)].next_out);988 int a = (_arcs[(e.id * 2) | (d ? 1 : 0)].next_out); 989 989 if (a != -1 ) { 990 990 e.id = a / 2; … … 1005 1005 1006 1006 bool valid(Node n) const { 1007 return n.id >= 0 && n.id < static_cast<int>( nodes.size()) &&1008 nodes[n.id].prev != -2;1007 return n.id >= 0 && n.id < static_cast<int>(_nodes.size()) && 1008 _nodes[n.id].prev != -2; 1009 1009 } 1010 1010 1011 1011 bool valid(Arc a) const { 1012 return a.id >= 0 && a.id < static_cast<int>( arcs.size()) &&1013 arcs[a.id].prev_out != -2;1012 return a.id >= 0 && a.id < static_cast<int>(_arcs.size()) && 1013 _arcs[a.id].prev_out != -2; 1014 1014 } 1015 1015 1016 1016 bool valid(Edge e) const { 1017 return e.id >= 0 && 2 * e.id < static_cast<int>( arcs.size()) &&1018 arcs[2 * e.id].prev_out != -2;1017 return e.id >= 0 && 2 * e.id < static_cast<int>(_arcs.size()) && 1018 _arcs[2 * e.id].prev_out != -2; 1019 1019 } 1020 1020 … … 1023 1023 1024 1024 if(first_free_node==-1) { 1025 n = nodes.size();1026 nodes.push_back(NodeT());1025 n = _nodes.size(); 1026 _nodes.push_back(NodeT()); 1027 1027 } else { 1028 1028 n = first_free_node; 1029 first_free_node = nodes[n].next;1030 } 1031 1032 nodes[n].next = first_node;1033 if (first_node != -1) nodes[first_node].prev = n;1029 first_free_node = _nodes[n].next; 1030 } 1031 1032 _nodes[n].next = first_node; 1033 if (first_node != -1) _nodes[first_node].prev = n; 1034 1034 first_node = n; 1035 nodes[n].prev = -1;1036 1037 nodes[n].first_out = -1;1035 _nodes[n].prev = -1; 1036 1037 _nodes[n].first_out = -1; 1038 1038 1039 1039 return Node(n); … … 1044 1044 1045 1045 if (first_free_arc == -1) { 1046 n = arcs.size();1047 arcs.push_back(ArcT());1048 arcs.push_back(ArcT());1046 n = _arcs.size(); 1047 _arcs.push_back(ArcT()); 1048 _arcs.push_back(ArcT()); 1049 1049 } else { 1050 1050 n = first_free_arc; 1051 first_free_arc = arcs[n].next_out;1052 } 1053 1054 arcs[n].target = u.id;1055 arcs[n | 1].target = v.id;1056 1057 arcs[n].next_out =nodes[v.id].first_out;1058 if ( nodes[v.id].first_out != -1) {1059 arcs[nodes[v.id].first_out].prev_out = n;1060 } 1061 arcs[n].prev_out = -1;1062 nodes[v.id].first_out = n;1063 1064 arcs[n | 1].next_out =nodes[u.id].first_out;1065 if ( nodes[u.id].first_out != -1) {1066 arcs[nodes[u.id].first_out].prev_out = (n | 1);1067 } 1068 arcs[n | 1].prev_out = -1;1069 nodes[u.id].first_out = (n | 1);1051 first_free_arc = _arcs[n].next_out; 1052 } 1053 1054 _arcs[n].target = u.id; 1055 _arcs[n | 1].target = v.id; 1056 1057 _arcs[n].next_out = _nodes[v.id].first_out; 1058 if (_nodes[v.id].first_out != -1) { 1059 _arcs[_nodes[v.id].first_out].prev_out = n; 1060 } 1061 _arcs[n].prev_out = -1; 1062 _nodes[v.id].first_out = n; 1063 1064 _arcs[n | 1].next_out = _nodes[u.id].first_out; 1065 if (_nodes[u.id].first_out != -1) { 1066 _arcs[_nodes[u.id].first_out].prev_out = (n | 1); 1067 } 1068 _arcs[n | 1].prev_out = -1; 1069 _nodes[u.id].first_out = (n | 1); 1070 1070 1071 1071 return Edge(n / 2); … … 1075 1075 int n = node.id; 1076 1076 1077 if( nodes[n].next != -1) {1078 nodes[nodes[n].next].prev =nodes[n].prev;1079 } 1080 1081 if( nodes[n].prev != -1) {1082 nodes[nodes[n].prev].next =nodes[n].next;1083 } else { 1084 first_node = nodes[n].next;1085 } 1086 1087 nodes[n].next = first_free_node;1077 if(_nodes[n].next != -1) { 1078 _nodes[_nodes[n].next].prev = _nodes[n].prev; 1079 } 1080 1081 if(_nodes[n].prev != -1) { 1082 _nodes[_nodes[n].prev].next = _nodes[n].next; 1083 } else { 1084 first_node = _nodes[n].next; 1085 } 1086 1087 _nodes[n].next = first_free_node; 1088 1088 first_free_node = n; 1089 nodes[n].prev = -2;1089 _nodes[n].prev = -2; 1090 1090 } 1091 1091 … … 1093 1093 int n = edge.id * 2; 1094 1094 1095 if ( arcs[n].next_out != -1) {1096 arcs[arcs[n].next_out].prev_out =arcs[n].prev_out;1097 } 1098 1099 if ( arcs[n].prev_out != -1) {1100 arcs[arcs[n].prev_out].next_out =arcs[n].next_out;1101 } else { 1102 nodes[arcs[n | 1].target].first_out =arcs[n].next_out;1103 } 1104 1105 if ( arcs[n | 1].next_out != -1) {1106 arcs[arcs[n | 1].next_out].prev_out =arcs[n | 1].prev_out;1107 } 1108 1109 if ( arcs[n | 1].prev_out != -1) {1110 arcs[arcs[n | 1].prev_out].next_out =arcs[n | 1].next_out;1111 } else { 1112 nodes[arcs[n].target].first_out =arcs[n | 1].next_out;1113 } 1114 1115 arcs[n].next_out = first_free_arc;1095 if (_arcs[n].next_out != -1) { 1096 _arcs[_arcs[n].next_out].prev_out = _arcs[n].prev_out; 1097 } 1098 1099 if (_arcs[n].prev_out != -1) { 1100 _arcs[_arcs[n].prev_out].next_out = _arcs[n].next_out; 1101 } else { 1102 _nodes[_arcs[n | 1].target].first_out = _arcs[n].next_out; 1103 } 1104 1105 if (_arcs[n | 1].next_out != -1) { 1106 _arcs[_arcs[n | 1].next_out].prev_out = _arcs[n | 1].prev_out; 1107 } 1108 1109 if (_arcs[n | 1].prev_out != -1) { 1110 _arcs[_arcs[n | 1].prev_out].next_out = _arcs[n | 1].next_out; 1111 } else { 1112 _nodes[_arcs[n].target].first_out = _arcs[n | 1].next_out; 1113 } 1114 1115 _arcs[n].next_out = first_free_arc; 1116 1116 first_free_arc = n; 1117 arcs[n].prev_out = -2;1118 arcs[n | 1].prev_out = -2;1117 _arcs[n].prev_out = -2; 1118 _arcs[n | 1].prev_out = -2; 1119 1119 1120 1120 } 1121 1121 1122 1122 void clear() { 1123 arcs.clear();1124 nodes.clear();1123 _arcs.clear(); 1124 _nodes.clear(); 1125 1125 first_node = first_free_node = first_free_arc = -1; 1126 1126 } … … 1129 1129 1130 1130 void changeV(Edge e, Node n) { 1131 if( arcs[2 * e.id].next_out != -1) {1132 arcs[arcs[2 * e.id].next_out].prev_out =arcs[2 * e.id].prev_out;1133 } 1134 if( arcs[2 * e.id].prev_out != -1) {1135 arcs[arcs[2 * e.id].prev_out].next_out =1136 arcs[2 * e.id].next_out;1137 } else { 1138 nodes[arcs[(2 * e.id) | 1].target].first_out =1139 arcs[2 * e.id].next_out;1140 } 1141 1142 if ( nodes[n.id].first_out != -1) {1143 arcs[nodes[n.id].first_out].prev_out = 2 * e.id;1144 } 1145 arcs[(2 * e.id) | 1].target = n.id;1146 arcs[2 * e.id].prev_out = -1;1147 arcs[2 * e.id].next_out =nodes[n.id].first_out;1148 nodes[n.id].first_out = 2 * e.id;1131 if(_arcs[2 * e.id].next_out != -1) { 1132 _arcs[_arcs[2 * e.id].next_out].prev_out = _arcs[2 * e.id].prev_out; 1133 } 1134 if(_arcs[2 * e.id].prev_out != -1) { 1135 _arcs[_arcs[2 * e.id].prev_out].next_out = 1136 _arcs[2 * e.id].next_out; 1137 } else { 1138 _nodes[_arcs[(2 * e.id) | 1].target].first_out = 1139 _arcs[2 * e.id].next_out; 1140 } 1141 1142 if (_nodes[n.id].first_out != -1) { 1143 _arcs[_nodes[n.id].first_out].prev_out = 2 * e.id; 1144 } 1145 _arcs[(2 * e.id) | 1].target = n.id; 1146 _arcs[2 * e.id].prev_out = -1; 1147 _arcs[2 * e.id].next_out = _nodes[n.id].first_out; 1148 _nodes[n.id].first_out = 2 * e.id; 1149 1149 } 1150 1150 1151 1151 void changeU(Edge e, Node n) { 1152 if( arcs[(2 * e.id) | 1].next_out != -1) {1153 arcs[arcs[(2 * e.id) | 1].next_out].prev_out =1154 arcs[(2 * e.id) | 1].prev_out;1155 } 1156 if( arcs[(2 * e.id) | 1].prev_out != -1) {1157 arcs[arcs[(2 * e.id) | 1].prev_out].next_out =1158 arcs[(2 * e.id) | 1].next_out;1159 } else { 1160 nodes[arcs[2 * e.id].target].first_out =1161 arcs[(2 * e.id) | 1].next_out;1162 } 1163 1164 if ( nodes[n.id].first_out != -1) {1165 arcs[nodes[n.id].first_out].prev_out = ((2 * e.id) | 1);1166 } 1167 arcs[2 * e.id].target = n.id;1168 arcs[(2 * e.id) | 1].prev_out = -1;1169 arcs[(2 * e.id) | 1].next_out =nodes[n.id].first_out;1170 nodes[n.id].first_out = ((2 * e.id) | 1);1152 if(_arcs[(2 * e.id) | 1].next_out != -1) { 1153 _arcs[_arcs[(2 * e.id) | 1].next_out].prev_out = 1154 _arcs[(2 * e.id) | 1].prev_out; 1155 } 1156 if(_arcs[(2 * e.id) | 1].prev_out != -1) { 1157 _arcs[_arcs[(2 * e.id) | 1].prev_out].next_out = 1158 _arcs[(2 * e.id) | 1].next_out; 1159 } else { 1160 _nodes[_arcs[2 * e.id].target].first_out = 1161 _arcs[(2 * e.id) | 1].next_out; 1162 } 1163 1164 if (_nodes[n.id].first_out != -1) { 1165 _arcs[_nodes[n.id].first_out].prev_out = ((2 * e.id) | 1); 1166 } 1167 _arcs[2 * e.id].target = n.id; 1168 _arcs[(2 * e.id) | 1].prev_out = -1; 1169 _arcs[(2 * e.id) | 1].next_out = _nodes[n.id].first_out; 1170 _nodes[n.id].first_out = ((2 * e.id) | 1); 1171 1171 } 1172 1172 … … 1210 1210 ListGraph() {} 1211 1211 1212 typedef Parent:: OutArcIt IncEdgeIt;1212 typedef Parent::IncEdgeIt IncEdgeIt; 1213 1213 1214 1214 /// \brief Add a new node to the graph. … … 1345 1345 /// to build the graph. 1346 1346 /// \sa reserveEdge() 1347 void reserveNode(int n) { nodes.reserve(n); };1347 void reserveNode(int n) { _nodes.reserve(n); }; 1348 1348 1349 1349 /// Reserve memory for edges. … … 1355 1355 /// to build the graph. 1356 1356 /// \sa reserveNode() 1357 void reserveEdge(int m) { arcs.reserve(2 * m); };1357 void reserveEdge(int m) { _arcs.reserve(2 * m); }; 1358 1358 1359 1359 /// \brief Class to make a snapshot of the graph and restore … … 1395 1395 } 1396 1396 virtual void add(const std::vector<Node>& nodes) { 1397 for (int i = nodes.size() - 1; i >= 0; ++i) {1397 for (int i = nodes.size() - 1; i >= 0; --i) { 1398 1398 snapshot.addNode(nodes[i]); 1399 1399 } … … 1445 1445 } 1446 1446 virtual void add(const std::vector<Edge>& edges) { 1447 for (int i = edges.size() - 1; i >= 0; ++i) {1447 for (int i = edges.size() - 1; i >= 0; --i) { 1448 1448 snapshot.addEdge(edges[i]); 1449 1449 } … … 1618 1618 }; 1619 1619 1620 std::vector<NodeT> nodes;1620 std::vector<NodeT> _nodes; 1621 1621 1622 1622 int first_node, first_red, first_blue; … … 1625 1625 int first_free_red, first_free_blue; 1626 1626 1627 std::vector<ArcT> arcs;1627 std::vector<ArcT> _arcs; 1628 1628 1629 1629 int first_free_arc; … … 1707 1707 1708 1708 ListBpGraphBase() 1709 : nodes(), first_node(-1),1709 : _nodes(), first_node(-1), 1710 1710 first_red(-1), first_blue(-1), 1711 1711 max_red(-1), max_blue(-1), 1712 1712 first_free_red(-1), first_free_blue(-1), 1713 arcs(), first_free_arc(-1) {}1714 1715 1716 bool red(Node n) const { return nodes[n.id].red; }1717 bool blue(Node n) const { return ! nodes[n.id].red; }1713 _arcs(), first_free_arc(-1) {} 1714 1715 1716 bool red(Node n) const { return _nodes[n.id].red; } 1717 bool blue(Node n) const { return !_nodes[n.id].red; } 1718 1718 1719 1719 static RedNode asRedNodeUnsafe(Node n) { return RedNode(n.id); } 1720 1720 static BlueNode asBlueNodeUnsafe(Node n) { return BlueNode(n.id); } 1721 1721 1722 int maxNodeId() const { return nodes.size()-1; }1722 int maxNodeId() const { return _nodes.size()-1; } 1723 1723 int maxRedId() const { return max_red; } 1724 1724 int maxBlueId() const { return max_blue; } 1725 int maxEdgeId() const { return arcs.size() / 2 - 1; }1726 int maxArcId() const { return arcs.size()-1; }1727 1728 Node source(Arc e) const { return Node( arcs[e.id ^ 1].target); }1729 Node target(Arc e) const { return Node( arcs[e.id].target); }1725 int maxEdgeId() const { return _arcs.size() / 2 - 1; } 1726 int maxArcId() const { return _arcs.size()-1; } 1727 1728 Node source(Arc e) const { return Node(_arcs[e.id ^ 1].target); } 1729 Node target(Arc e) const { return Node(_arcs[e.id].target); } 1730 1730 1731 1731 RedNode redNode(Edge e) const { 1732 return RedNode( arcs[2 * e.id].target);1732 return RedNode(_arcs[2 * e.id].target); 1733 1733 } 1734 1734 BlueNode blueNode(Edge e) const { 1735 return BlueNode( arcs[2 * e.id + 1].target);1735 return BlueNode(_arcs[2 * e.id + 1].target); 1736 1736 } 1737 1737 … … 1749 1749 1750 1750 void next(Node& node) const { 1751 node.id = nodes[node.id].next;1751 node.id = _nodes[node.id].next; 1752 1752 } 1753 1753 … … 1757 1757 1758 1758 void next(RedNode& node) const { 1759 node.id = nodes[node.id].partition_next;1759 node.id = _nodes[node.id].partition_next; 1760 1760 } 1761 1761 … … 1765 1765 1766 1766 void next(BlueNode& node) const { 1767 node.id = nodes[node.id].partition_next;1767 node.id = _nodes[node.id].partition_next; 1768 1768 } 1769 1769 1770 1770 void first(Arc& e) const { 1771 1771 int n = first_node; 1772 while (n != -1 && nodes[n].first_out == -1) {1773 n = nodes[n].next;1774 } 1775 e.id = (n == -1) ? -1 : nodes[n].first_out;1772 while (n != -1 && _nodes[n].first_out == -1) { 1773 n = _nodes[n].next; 1774 } 1775 e.id = (n == -1) ? -1 : _nodes[n].first_out; 1776 1776 } 1777 1777 1778 1778 void next(Arc& e) const { 1779 if ( arcs[e.id].next_out != -1) {1780 e.id = arcs[e.id].next_out;1781 } else { 1782 int n = nodes[arcs[e.id ^ 1].target].next;1783 while(n != -1 && nodes[n].first_out == -1) {1784 n = nodes[n].next;1785 } 1786 e.id = (n == -1) ? -1 : nodes[n].first_out;1779 if (_arcs[e.id].next_out != -1) { 1780 e.id = _arcs[e.id].next_out; 1781 } else { 1782 int n = _nodes[_arcs[e.id ^ 1].target].next; 1783 while(n != -1 && _nodes[n].first_out == -1) { 1784 n = _nodes[n].next; 1785 } 1786 e.id = (n == -1) ? -1 : _nodes[n].first_out; 1787 1787 } 1788 1788 } … … 1791 1791 int n = first_node; 1792 1792 while (n != -1) { 1793 e.id = nodes[n].first_out;1793 e.id = _nodes[n].first_out; 1794 1794 while ((e.id & 1) != 1) { 1795 e.id = arcs[e.id].next_out;1795 e.id = _arcs[e.id].next_out; 1796 1796 } 1797 1797 if (e.id != -1) { … … 1799 1799 return; 1800 1800 } 1801 n = nodes[n].next;1801 n = _nodes[n].next; 1802 1802 } 1803 1803 e.id = -1; … … 1805 1805 1806 1806 void next(Edge& e) const { 1807 int n = arcs[e.id * 2].target;1808 e.id = arcs[(e.id * 2) | 1].next_out;1807 int n = _arcs[e.id * 2].target; 1808 e.id = _arcs[(e.id * 2) | 1].next_out; 1809 1809 while ((e.id & 1) != 1) { 1810 e.id = arcs[e.id].next_out;1810 e.id = _arcs[e.id].next_out; 1811 1811 } 1812 1812 if (e.id != -1) { … … 1814 1814 return; 1815 1815 } 1816 n = nodes[n].next;1816 n = _nodes[n].next; 1817 1817 while (n != -1) { 1818 e.id = nodes[n].first_out;1818 e.id = _nodes[n].first_out; 1819 1819 while ((e.id & 1) != 1) { 1820 e.id = arcs[e.id].next_out;1820 e.id = _arcs[e.id].next_out; 1821 1821 } 1822 1822 if (e.id != -1) { … … 1824 1824 return; 1825 1825 } 1826 n = nodes[n].next;1826 n = _nodes[n].next; 1827 1827 } 1828 1828 e.id = -1; … … 1830 1830 1831 1831 void firstOut(Arc &e, const Node& v) const { 1832 e.id = nodes[v.id].first_out;1832 e.id = _nodes[v.id].first_out; 1833 1833 } 1834 1834 void nextOut(Arc &e) const { 1835 e.id = arcs[e.id].next_out;1835 e.id = _arcs[e.id].next_out; 1836 1836 } 1837 1837 1838 1838 void firstIn(Arc &e, const Node& v) const { 1839 e.id = (( nodes[v.id].first_out) ^ 1);1839 e.id = ((_nodes[v.id].first_out) ^ 1); 1840 1840 if (e.id == -2) e.id = -1; 1841 1841 } 1842 1842 void nextIn(Arc &e) const { 1843 e.id = (( arcs[e.id ^ 1].next_out) ^ 1);1843 e.id = ((_arcs[e.id ^ 1].next_out) ^ 1); 1844 1844 if (e.id == -2) e.id = -1; 1845 1845 } 1846 1846 1847 1847 void firstInc(Edge &e, bool& d, const Node& v) const { 1848 int a = nodes[v.id].first_out;1848 int a = _nodes[v.id].first_out; 1849 1849 if (a != -1 ) { 1850 1850 e.id = a / 2; … … 1856 1856 } 1857 1857 void nextInc(Edge &e, bool& d) const { 1858 int a = ( arcs[(e.id * 2) | (d ? 1 : 0)].next_out);1858 int a = (_arcs[(e.id * 2) | (d ? 1 : 0)].next_out); 1859 1859 if (a != -1 ) { 1860 1860 e.id = a / 2; … … 1867 1867 1868 1868 static int id(Node v) { return v.id; } 1869 int id(RedNode v) const { return nodes[v.id].partition_index; }1870 int id(BlueNode v) const { return nodes[v.id].partition_index; }1869 int id(RedNode v) const { return _nodes[v.id].partition_index; } 1870 int id(BlueNode v) const { return _nodes[v.id].partition_index; } 1871 1871 static int id(Arc e) { return e.id; } 1872 1872 static int id(Edge e) { return e.id; } … … 1877 1877 1878 1878 bool valid(Node n) const { 1879 return n.id >= 0 && n.id < static_cast<int>( nodes.size()) &&1880 nodes[n.id].prev != -2;1879 return n.id >= 0 && n.id < static_cast<int>(_nodes.size()) && 1880 _nodes[n.id].prev != -2; 1881 1881 } 1882 1882 1883 1883 bool valid(Arc a) const { 1884 return a.id >= 0 && a.id < static_cast<int>( arcs.size()) &&1885 arcs[a.id].prev_out != -2;1884 return a.id >= 0 && a.id < static_cast<int>(_arcs.size()) && 1885 _arcs[a.id].prev_out != -2; 1886 1886 } 1887 1887 1888 1888 bool valid(Edge e) const { 1889 return e.id >= 0 && 2 * e.id < static_cast<int>( arcs.size()) &&1890 arcs[2 * e.id].prev_out != -2;1889 return e.id >= 0 && 2 * e.id < static_cast<int>(_arcs.size()) && 1890 _arcs[2 * e.id].prev_out != -2; 1891 1891 } 1892 1892 … … 1895 1895 1896 1896 if(first_free_red==-1) { 1897 n = nodes.size();1898 nodes.push_back(NodeT());1899 nodes[n].partition_index = ++max_red;1900 nodes[n].red = true;1897 n = _nodes.size(); 1898 _nodes.push_back(NodeT()); 1899 _nodes[n].partition_index = ++max_red; 1900 _nodes[n].red = true; 1901 1901 } else { 1902 1902 n = first_free_red; 1903 first_free_red = nodes[n].next;1904 } 1905 1906 nodes[n].next = first_node;1907 if (first_node != -1) nodes[first_node].prev = n;1903 first_free_red = _nodes[n].next; 1904 } 1905 1906 _nodes[n].next = first_node; 1907 if (first_node != -1) _nodes[first_node].prev = n; 1908 1908 first_node = n; 1909 nodes[n].prev = -1;1910 1911 nodes[n].partition_next = first_red;1912 if (first_red != -1) nodes[first_red].partition_prev = n;1909 _nodes[n].prev = -1; 1910 1911 _nodes[n].partition_next = first_red; 1912 if (first_red != -1) _nodes[first_red].partition_prev = n; 1913 1913 first_red = n; 1914 nodes[n].partition_prev = -1;1915 1916 nodes[n].first_out = -1;1914 _nodes[n].partition_prev = -1; 1915 1916 _nodes[n].first_out = -1; 1917 1917 1918 1918 return RedNode(n); … … 1923 1923 1924 1924 if(first_free_blue==-1) { 1925 n = nodes.size();1926 nodes.push_back(NodeT());1927 nodes[n].partition_index = ++max_blue;1928 nodes[n].red = false;1925 n = _nodes.size(); 1926 _nodes.push_back(NodeT()); 1927 _nodes[n].partition_index = ++max_blue; 1928 _nodes[n].red = false; 1929 1929 } else { 1930 1930 n = first_free_blue; 1931 first_free_blue = nodes[n].next;1932 } 1933 1934 nodes[n].next = first_node;1935 if (first_node != -1) nodes[first_node].prev = n;1931 first_free_blue = _nodes[n].next; 1932 } 1933 1934 _nodes[n].next = first_node; 1935 if (first_node != -1) _nodes[first_node].prev = n; 1936 1936 first_node = n; 1937 nodes[n].prev = -1;1938 1939 nodes[n].partition_next = first_blue;1940 if (first_blue != -1) nodes[first_blue].partition_prev = n;1937 _nodes[n].prev = -1; 1938 1939 _nodes[n].partition_next = first_blue; 1940 if (first_blue != -1) _nodes[first_blue].partition_prev = n; 1941 1941 first_blue = n; 1942 nodes[n].partition_prev = -1;1943 1944 nodes[n].first_out = -1;1942 _nodes[n].partition_prev = -1; 1943 1944 _nodes[n].first_out = -1; 1945 1945 1946 1946 return BlueNode(n); … … 1951 1951 1952 1952 if (first_free_arc == -1) { 1953 n = arcs.size();1954 arcs.push_back(ArcT());1955 arcs.push_back(ArcT());1953 n = _arcs.size(); 1954 _arcs.push_back(ArcT()); 1955 _arcs.push_back(ArcT()); 1956 1956 } else { 1957 1957 n = first_free_arc; 1958 first_free_arc = arcs[n].next_out;1959 } 1960 1961 arcs[n].target = u.id;1962 arcs[n | 1].target = v.id;1963 1964 arcs[n].next_out =nodes[v.id].first_out;1965 if ( nodes[v.id].first_out != -1) {1966 arcs[nodes[v.id].first_out].prev_out = n;1967 } 1968 arcs[n].prev_out = -1;1969 nodes[v.id].first_out = n;1970 1971 arcs[n | 1].next_out =nodes[u.id].first_out;1972 if ( nodes[u.id].first_out != -1) {1973 arcs[nodes[u.id].first_out].prev_out = (n | 1);1974 } 1975 arcs[n | 1].prev_out = -1;1976 nodes[u.id].first_out = (n | 1);1958 first_free_arc = _arcs[n].next_out; 1959 } 1960 1961 _arcs[n].target = u.id; 1962 _arcs[n | 1].target = v.id; 1963 1964 _arcs[n].next_out = _nodes[v.id].first_out; 1965 if (_nodes[v.id].first_out != -1) { 1966 _arcs[_nodes[v.id].first_out].prev_out = n; 1967 } 1968 _arcs[n].prev_out = -1; 1969 _nodes[v.id].first_out = n; 1970 1971 _arcs[n | 1].next_out = _nodes[u.id].first_out; 1972 if (_nodes[u.id].first_out != -1) { 1973 _arcs[_nodes[u.id].first_out].prev_out = (n | 1); 1974 } 1975 _arcs[n | 1].prev_out = -1; 1976 _nodes[u.id].first_out = (n | 1); 1977 1977 1978 1978 return Edge(n / 2); … … 1982 1982 int n = node.id; 1983 1983 1984 if( nodes[n].next != -1) {1985 nodes[nodes[n].next].prev =nodes[n].prev;1986 } 1987 1988 if( nodes[n].prev != -1) {1989 nodes[nodes[n].prev].next =nodes[n].next;1990 } else { 1991 first_node = nodes[n].next;1992 } 1993 1994 if ( nodes[n].partition_next != -1) {1995 nodes[nodes[n].partition_next].partition_prev =nodes[n].partition_prev;1996 } 1997 1998 if ( nodes[n].partition_prev != -1) {1999 nodes[nodes[n].partition_prev].partition_next =nodes[n].partition_next;2000 } else { 2001 if ( nodes[n].red) {2002 first_red = nodes[n].partition_next;1984 if(_nodes[n].next != -1) { 1985 _nodes[_nodes[n].next].prev = _nodes[n].prev; 1986 } 1987 1988 if(_nodes[n].prev != -1) { 1989 _nodes[_nodes[n].prev].next = _nodes[n].next; 1990 } else { 1991 first_node = _nodes[n].next; 1992 } 1993 1994 if (_nodes[n].partition_next != -1) { 1995 _nodes[_nodes[n].partition_next].partition_prev = _nodes[n].partition_prev; 1996 } 1997 1998 if (_nodes[n].partition_prev != -1) { 1999 _nodes[_nodes[n].partition_prev].partition_next = _nodes[n].partition_next; 2000 } else { 2001 if (_nodes[n].red) { 2002 first_red = _nodes[n].partition_next; 2003 2003 } else { 2004 first_blue = nodes[n].partition_next;2005 } 2006 } 2007 2008 if ( nodes[n].red) {2009 nodes[n].next = first_free_red;2004 first_blue = _nodes[n].partition_next; 2005 } 2006 } 2007 2008 if (_nodes[n].red) { 2009 _nodes[n].next = first_free_red; 2010 2010 first_free_red = n; 2011 2011 } else { 2012 nodes[n].next = first_free_blue;2012 _nodes[n].next = first_free_blue; 2013 2013 first_free_blue = n; 2014 2014 } 2015 nodes[n].prev = -2;2015 _nodes[n].prev = -2; 2016 2016 } 2017 2017 … … 2019 2019 int n = edge.id * 2; 2020 2020 2021 if ( arcs[n].next_out != -1) {2022 arcs[arcs[n].next_out].prev_out =arcs[n].prev_out;2023 } 2024 2025 if ( arcs[n].prev_out != -1) {2026 arcs[arcs[n].prev_out].next_out =arcs[n].next_out;2027 } else { 2028 nodes[arcs[n | 1].target].first_out =arcs[n].next_out;2029 } 2030 2031 if ( arcs[n | 1].next_out != -1) {2032 arcs[arcs[n | 1].next_out].prev_out =arcs[n | 1].prev_out;2033 } 2034 2035 if ( arcs[n | 1].prev_out != -1) {2036 arcs[arcs[n | 1].prev_out].next_out =arcs[n | 1].next_out;2037 } else { 2038 nodes[arcs[n].target].first_out =arcs[n | 1].next_out;2039 } 2040 2041 arcs[n].next_out = first_free_arc;2021 if (_arcs[n].next_out != -1) { 2022 _arcs[_arcs[n].next_out].prev_out = _arcs[n].prev_out; 2023 } 2024 2025 if (_arcs[n].prev_out != -1) { 2026 _arcs[_arcs[n].prev_out].next_out = _arcs[n].next_out; 2027 } else { 2028 _nodes[_arcs[n | 1].target].first_out = _arcs[n].next_out; 2029 } 2030 2031 if (_arcs[n | 1].next_out != -1) { 2032 _arcs[_arcs[n | 1].next_out].prev_out = _arcs[n | 1].prev_out; 2033 } 2034 2035 if (_arcs[n | 1].prev_out != -1) { 2036 _arcs[_arcs[n | 1].prev_out].next_out = _arcs[n | 1].next_out; 2037 } else { 2038 _nodes[_arcs[n].target].first_out = _arcs[n | 1].next_out; 2039 } 2040 2041 _arcs[n].next_out = first_free_arc; 2042 2042 first_free_arc = n; 2043 arcs[n].prev_out = -2;2044 arcs[n | 1].prev_out = -2;2043 _arcs[n].prev_out = -2; 2044 _arcs[n | 1].prev_out = -2; 2045 2045 2046 2046 } 2047 2047 2048 2048 void clear() { 2049 arcs.clear();2050 nodes.clear();2049 _arcs.clear(); 2050 _nodes.clear(); 2051 2051 first_node = first_free_arc = first_red = first_blue = 2052 2052 max_red = max_blue = first_free_red = first_free_blue = -1; … … 2056 2056 2057 2057 void changeRed(Edge e, RedNode n) { 2058 if( arcs[(2 * e.id) | 1].next_out != -1) {2059 arcs[arcs[(2 * e.id) | 1].next_out].prev_out =2060 arcs[(2 * e.id) | 1].prev_out;2061 } 2062 if( arcs[(2 * e.id) | 1].prev_out != -1) {2063 arcs[arcs[(2 * e.id) | 1].prev_out].next_out =2064 arcs[(2 * e.id) | 1].next_out;2065 } else { 2066 nodes[arcs[2 * e.id].target].first_out =2067 arcs[(2 * e.id) | 1].next_out;2068 } 2069 2070 if ( nodes[n.id].first_out != -1) {2071 arcs[nodes[n.id].first_out].prev_out = ((2 * e.id) | 1);2072 } 2073 arcs[2 * e.id].target = n.id;2074 arcs[(2 * e.id) | 1].prev_out = -1;2075 arcs[(2 * e.id) | 1].next_out =nodes[n.id].first_out;2076 nodes[n.id].first_out = ((2 * e.id) | 1);2058 if(_arcs[(2 * e.id) | 1].next_out != -1) { 2059 _arcs[_arcs[(2 * e.id) | 1].next_out].prev_out = 2060 _arcs[(2 * e.id) | 1].prev_out; 2061 } 2062 if(_arcs[(2 * e.id) | 1].prev_out != -1) { 2063 _arcs[_arcs[(2 * e.id) | 1].prev_out].next_out = 2064 _arcs[(2 * e.id) | 1].next_out; 2065 } else { 2066 _nodes[_arcs[2 * e.id].target].first_out = 2067 _arcs[(2 * e.id) | 1].next_out; 2068 } 2069 2070 if (_nodes[n.id].first_out != -1) { 2071 _arcs[_nodes[n.id].first_out].prev_out = ((2 * e.id) | 1); 2072 } 2073 _arcs[2 * e.id].target = n.id; 2074 _arcs[(2 * e.id) | 1].prev_out = -1; 2075 _arcs[(2 * e.id) | 1].next_out = _nodes[n.id].first_out; 2076 _nodes[n.id].first_out = ((2 * e.id) | 1); 2077 2077 } 2078 2078 2079 2079 void changeBlue(Edge e, BlueNode n) { 2080 if( arcs[2 * e.id].next_out != -1) {2081 arcs[arcs[2 * e.id].next_out].prev_out =arcs[2 * e.id].prev_out;2082 } 2083 if( arcs[2 * e.id].prev_out != -1) {2084 arcs[arcs[2 * e.id].prev_out].next_out =2085 arcs[2 * e.id].next_out;2086 } else { 2087 nodes[arcs[(2 * e.id) | 1].target].first_out =2088 arcs[2 * e.id].next_out;2089 } 2090 2091 if ( nodes[n.id].first_out != -1) {2092 arcs[nodes[n.id].first_out].prev_out = 2 * e.id;2093 } 2094 arcs[(2 * e.id) | 1].target = n.id;2095 arcs[2 * e.id].prev_out = -1;2096 arcs[2 * e.id].next_out =nodes[n.id].first_out;2097 nodes[n.id].first_out = 2 * e.id;2080 if(_arcs[2 * e.id].next_out != -1) { 2081 _arcs[_arcs[2 * e.id].next_out].prev_out = _arcs[2 * e.id].prev_out; 2082 } 2083 if(_arcs[2 * e.id].prev_out != -1) { 2084 _arcs[_arcs[2 * e.id].prev_out].next_out = 2085 _arcs[2 * e.id].next_out; 2086 } else { 2087 _nodes[_arcs[(2 * e.id) | 1].target].first_out = 2088 _arcs[2 * e.id].next_out; 2089 } 2090 2091 if (_nodes[n.id].first_out != -1) { 2092 _arcs[_nodes[n.id].first_out].prev_out = 2 * e.id; 2093 } 2094 _arcs[(2 * e.id) | 1].target = n.id; 2095 _arcs[2 * e.id].prev_out = -1; 2096 _arcs[2 * e.id].next_out = _nodes[n.id].first_out; 2097 _nodes[n.id].first_out = 2 * e.id; 2098 2098 } 2099 2099 … … 2137 2137 ListBpGraph() {} 2138 2138 2139 typedef Parent:: OutArcIt IncEdgeIt;2139 typedef Parent::IncEdgeIt IncEdgeIt; 2140 2140 2141 2141 /// \brief Add a new red node to the graph. … … 2250 2250 /// to build the graph. 2251 2251 /// \sa reserveEdge() 2252 void reserveNode(int n) { nodes.reserve(n); };2252 void reserveNode(int n) { _nodes.reserve(n); }; 2253 2253 2254 2254 /// Reserve memory for edges. … … 2260 2260 /// to build the graph. 2261 2261 /// \sa reserveNode() 2262 void reserveEdge(int m) { arcs.reserve(2 * m); };2262 void reserveEdge(int m) { _arcs.reserve(2 * m); }; 2263 2263 2264 2264 /// \brief Class to make a snapshot of the graph and restore … … 2300 2300 } 2301 2301 virtual void add(const std::vector<Node>& nodes) { 2302 for (int i = nodes.size() - 1; i >= 0; ++i) {2302 for (int i = nodes.size() - 1; i >= 0; --i) { 2303 2303 snapshot.addNode(nodes[i]); 2304 2304 } … … 2350 2350 } 2351 2351 virtual void add(const std::vector<Edge>& edges) { 2352 for (int i = edges.size() - 1; i >= 0; ++i) {2352 for (int i = edges.size() - 1; i >= 0; --i) { 2353 2353 snapshot.addEdge(edges[i]); 2354 2354 } -
lemon/lp.h
r1270 r1340 23 23 24 24 25 #if def LEMON_HAVE_GLPK25 #if LEMON_DEFAULT_LP == LEMON_GLPK_ || LEMON_DEFAULT_MIP == LEMON_GLPK_ 26 26 #include <lemon/glpk.h> 27 #elif LEMON_HAVE_CPLEX 27 #endif 28 #if LEMON_DEFAULT_LP == LEMON_CPLEX_ || LEMON_DEFAULT_MIP == LEMON_CPLEX_ 28 29 #include <lemon/cplex.h> 29 #elif LEMON_HAVE_SOPLEX 30 #endif 31 #if LEMON_DEFAULT_LP == LEMON_SOPLEX_ 30 32 #include <lemon/soplex.h> 31 #elif LEMON_HAVE_CLP 33 #endif 34 #if LEMON_DEFAULT_LP == LEMON_CLP_ 32 35 #include <lemon/clp.h> 36 #endif 37 #if LEMON_DEFAULT_MIP == LEMON_CBC_ 38 #include <lemon/cbc.h> 33 39 #endif 34 40 … … 44 50 ///\ingroup lp_group 45 51 /// 46 ///Currently, the possible values are \c GLPK, \c CPLEX,47 ///\c SOPLEX or \c CLP52 ///Currently, the possible values are \c LEMON_GLPK_, \c LEMON_CPLEX_, 53 ///\c LEMON_SOPLEX_ or \c LEMON_CLP_ 48 54 #define LEMON_DEFAULT_LP SOLVER 49 55 ///The default LP solver … … 60 66 ///\ingroup lp_group 61 67 /// 62 ///Currently, the possible values are \c GLPK, \c CPLEX or \c CBC 68 ///Currently, the possible values are \c LEMON_GLPK_, \c LEMON_CPLEX_ 69 ///or \c LEMON_CBC_ 63 70 #define LEMON_DEFAULT_MIP SOLVER 64 71 ///The default MIP solver. … … 70 77 typedef GlpkMip Mip; 71 78 #else 72 #if LEMON_DEFAULT_LP == GLPK79 #if LEMON_DEFAULT_LP == LEMON_GLPK_ 73 80 typedef GlpkLp Lp; 74 #elif LEMON_DEFAULT_LP == CPLEX81 #elif LEMON_DEFAULT_LP == LEMON_CPLEX_ 75 82 typedef CplexLp Lp; 76 #elif LEMON_DEFAULT_LP == SOPLEX83 #elif LEMON_DEFAULT_LP == LEMON_SOPLEX_ 77 84 typedef SoplexLp Lp; 78 #elif LEMON_DEFAULT_LP == CLP85 #elif LEMON_DEFAULT_LP == LEMON_CLP_ 79 86 typedef ClpLp Lp; 80 87 #endif 81 #if LEMON_DEFAULT_MIP == GLPK82 typedef Glpk Lp Mip;83 #elif LEMON_DEFAULT_MIP == CPLEX88 #if LEMON_DEFAULT_MIP == LEMON_GLPK_ 89 typedef GlpkMip Mip; 90 #elif LEMON_DEFAULT_MIP == LEMON_CPLEX_ 84 91 typedef CplexMip Mip; 85 #elif LEMON_DEFAULT_MIP == CBC92 #elif LEMON_DEFAULT_MIP == LEMON_CBC_ 86 93 typedef CbcMip Mip; 87 94 #endif -
lemon/lp_base.h
r1270 r1353 32 32 #include<lemon/bits/solver_bits.h> 33 33 34 #include<lemon/bits/stl_iterators.h> 35 34 36 ///\file 35 37 ///\brief The interface of the LP solver interface. … … 46 48 protected: 47 49 48 _solver_bits::VarIndex rows;49 _solver_bits::VarIndex cols;50 _solver_bits::VarIndex _rows; 51 _solver_bits::VarIndex _cols; 50 52 51 53 public: … … 167 169 ColIt(const LpBase &solver) : _solver(&solver) 168 170 { 169 _solver-> cols.firstItem(_id);171 _solver->_cols.firstItem(_id); 170 172 } 171 173 /// Invalid constructor \& conversion … … 180 182 ColIt &operator++() 181 183 { 182 _solver-> cols.nextItem(_id);184 _solver->_cols.nextItem(_id); 183 185 return *this; 184 186 } 185 187 }; 188 189 /// \brief Gets the collection of the columns of the LP problem. 190 /// 191 /// This function can be used for iterating on 192 /// the columns of the LP problem. It returns a wrapped ColIt, which looks 193 /// like an STL container (by having begin() and end()) 194 /// which you can use in range-based for loops, STL algorithms, etc. 195 /// For example you can write: 196 ///\code 197 /// for(auto c: lp.cols()) 198 /// doSomething(c); 199 ///\endcode 200 LemonRangeWrapper1<ColIt, LpBase> cols() { 201 return LemonRangeWrapper1<ColIt, LpBase>(*this); 202 } 203 186 204 187 205 /// \brief Returns the ID of the column. … … 262 280 RowIt(const LpBase &solver) : _solver(&solver) 263 281 { 264 _solver-> rows.firstItem(_id);282 _solver->_rows.firstItem(_id); 265 283 } 266 284 /// Invalid constructor \& conversion … … 275 293 RowIt &operator++() 276 294 { 277 _solver-> rows.nextItem(_id);295 _solver->_rows.nextItem(_id); 278 296 return *this; 279 297 } 280 298 }; 299 300 /// \brief Gets the collection of the rows of the LP problem. 301 /// 302 /// This function can be used for iterating on 303 /// the rows of the LP problem. It returns a wrapped RowIt, which looks 304 /// like an STL container (by having begin() and end()) 305 /// which you can use in range-based for loops, STL algorithms, etc. 306 /// For example you can write: 307 ///\code 308 /// for(auto c: lp.rows()) 309 /// doSomething(c); 310 ///\endcode 311 LemonRangeWrapper1<RowIt, LpBase> rows() { 312 return LemonRangeWrapper1<RowIt, LpBase>(*this); 313 } 314 281 315 282 316 /// \brief Returns the ID of the row. … … 626 660 ///This data structure represents a column of the matrix, 627 661 ///thas is it strores a linear expression of the dual variables 628 ///(\ref Row "Row"s).662 ///(\ref LpBase::Row "Row"s). 629 663 /// 630 664 ///There are several ways to access and modify the contents of this … … 643 677 ///(This code computes the sum of all coefficients). 644 678 ///- Numbers (<tt>double</tt>'s) 645 ///and variables (\ref Row "Row"s) directly convert to an679 ///and variables (\ref LpBase::Row "Row"s) directly convert to an 646 680 ///\ref DualExpr and the usual linear operations are defined, so 647 681 ///\code … … 935 969 //Abstract virtual functions 936 970 937 virtual int _addColId(int col) { return cols.addIndex(col); }938 virtual int _addRowId(int row) { return rows.addIndex(row); }939 940 virtual void _eraseColId(int col) { cols.eraseIndex(col); }941 virtual void _eraseRowId(int row) { rows.eraseIndex(row); }971 virtual int _addColId(int col) { return _cols.addIndex(col); } 972 virtual int _addRowId(int row) { return _rows.addIndex(row); } 973 974 virtual void _eraseColId(int col) { _cols.eraseIndex(col); } 975 virtual void _eraseRowId(int row) { _rows.eraseIndex(row); } 942 976 943 977 virtual int _addCol() = 0; … … 1004 1038 Value obj_const_comp; 1005 1039 1006 LpBase() : rows(),cols(), obj_const_comp(0) {}1040 LpBase() : _rows(), _cols(), obj_const_comp(0) {} 1007 1041 1008 1042 public: … … 1116 1150 void col(Col c, const DualExpr &e) { 1117 1151 e.simplify(); 1118 _setColCoeffs( cols(id(c)), ExprIterator(e.comps.begin(),rows),1119 ExprIterator(e.comps.end(), rows));1152 _setColCoeffs(_cols(id(c)), ExprIterator(e.comps.begin(), _rows), 1153 ExprIterator(e.comps.end(), _rows)); 1120 1154 } 1121 1155 … … 1126 1160 DualExpr col(Col c) const { 1127 1161 DualExpr e; 1128 _getColCoeffs( cols(id(c)), InsertIterator(e.comps,rows));1162 _getColCoeffs(_cols(id(c)), InsertIterator(e.comps, _rows)); 1129 1163 return e; 1130 1164 } … … 1155 1189 ///\param t can be 1156 1190 ///- a standard STL compatible iterable container with 1157 ///\ref Rowas its \c values_type like1191 ///\ref LpBase::Row "Row" as its \c values_type like 1158 1192 ///\code 1159 1193 ///std::vector<LpBase::Row> … … 1161 1195 ///\endcode 1162 1196 ///- a standard STL compatible iterable container with 1163 ///\ref Rowas its \c mapped_type like1197 ///\ref LpBase::Row "Row" as its \c mapped_type like 1164 1198 ///\code 1165 1199 ///std::map<AnyType,LpBase::Row> … … 1213 1247 void row(Row r, Value l, const Expr &e, Value u) { 1214 1248 e.simplify(); 1215 _setRowCoeffs( rows(id(r)), ExprIterator(e.comps.begin(),cols),1216 ExprIterator(e.comps.end(), cols));1217 _setRowLowerBound( rows(id(r)),l - *e);1218 _setRowUpperBound( rows(id(r)),u - *e);1249 _setRowCoeffs(_rows(id(r)), ExprIterator(e.comps.begin(), _cols), 1250 ExprIterator(e.comps.end(), _cols)); 1251 _setRowLowerBound(_rows(id(r)),l - *e); 1252 _setRowUpperBound(_rows(id(r)),u - *e); 1219 1253 } 1220 1254 … … 1235 1269 Expr row(Row r) const { 1236 1270 Expr e; 1237 _getRowCoeffs( rows(id(r)), InsertIterator(e.comps,cols));1271 _getRowCoeffs(_rows(id(r)), InsertIterator(e.comps, _cols)); 1238 1272 return e; 1239 1273 } … … 1248 1282 Row r; 1249 1283 e.simplify(); 1250 r._id = _addRowId(_addRow(l - *e, ExprIterator(e.comps.begin(), cols),1251 ExprIterator(e.comps.end(), cols), u - *e));1284 r._id = _addRowId(_addRow(l - *e, ExprIterator(e.comps.begin(), _cols), 1285 ExprIterator(e.comps.end(), _cols), u - *e)); 1252 1286 return r; 1253 1287 } … … 1261 1295 c.expr().simplify(); 1262 1296 r._id = _addRowId(_addRow(c.lowerBounded()?c.lowerBound()-*c.expr():-INF, 1263 ExprIterator(c.expr().comps.begin(), cols),1264 ExprIterator(c.expr().comps.end(), cols),1297 ExprIterator(c.expr().comps.begin(), _cols), 1298 ExprIterator(c.expr().comps.end(), _cols), 1265 1299 c.upperBounded()?c.upperBound()-*c.expr():INF)); 1266 1300 return r; … … 1270 1304 ///\param c is the column to be deleted 1271 1305 void erase(Col c) { 1272 _eraseCol( cols(id(c)));1273 _eraseColId( cols(id(c)));1306 _eraseCol(_cols(id(c))); 1307 _eraseColId(_cols(id(c))); 1274 1308 } 1275 1309 ///Erase a row (i.e a constraint) from the LP … … 1277 1311 ///\param r is the row to be deleted 1278 1312 void erase(Row r) { 1279 _eraseRow( rows(id(r)));1280 _eraseRowId( rows(id(r)));1313 _eraseRow(_rows(id(r))); 1314 _eraseRowId(_rows(id(r))); 1281 1315 } 1282 1316 … … 1287 1321 std::string colName(Col c) const { 1288 1322 std::string name; 1289 _getColName( cols(id(c)), name);1323 _getColName(_cols(id(c)), name); 1290 1324 return name; 1291 1325 } … … 1296 1330 ///\param name The name to be given 1297 1331 void colName(Col c, const std::string& name) { 1298 _setColName( cols(id(c)), name);1332 _setColName(_cols(id(c)), name); 1299 1333 } 1300 1334 … … 1305 1339 Col colByName(const std::string& name) const { 1306 1340 int k = _colByName(name); 1307 return k != -1 ? Col( cols[k]) : Col(INVALID);1341 return k != -1 ? Col(_cols[k]) : Col(INVALID); 1308 1342 } 1309 1343 … … 1314 1348 std::string rowName(Row r) const { 1315 1349 std::string name; 1316 _getRowName( rows(id(r)), name);1350 _getRowName(_rows(id(r)), name); 1317 1351 return name; 1318 1352 } … … 1323 1357 ///\param name The name to be given 1324 1358 void rowName(Row r, const std::string& name) { 1325 _setRowName( rows(id(r)), name);1359 _setRowName(_rows(id(r)), name); 1326 1360 } 1327 1361 … … 1332 1366 Row rowByName(const std::string& name) const { 1333 1367 int k = _rowByName(name); 1334 return k != -1 ? Row( rows[k]) : Row(INVALID);1368 return k != -1 ? Row(_rows[k]) : Row(INVALID); 1335 1369 } 1336 1370 … … 1341 1375 ///\param val is the new value of the coefficient 1342 1376 void coeff(Row r, Col c, Value val) { 1343 _setCoeff( rows(id(r)),cols(id(c)), val);1377 _setCoeff(_rows(id(r)),_cols(id(c)), val); 1344 1378 } 1345 1379 … … 1350 1384 ///\return the corresponding coefficient 1351 1385 Value coeff(Row r, Col c) const { 1352 return _getCoeff( rows(id(r)),cols(id(c)));1386 return _getCoeff(_rows(id(r)),_cols(id(c))); 1353 1387 } 1354 1388 … … 1359 1393 /// Value or -\ref INF. 1360 1394 void colLowerBound(Col c, Value value) { 1361 _setColLowerBound( cols(id(c)),value);1395 _setColLowerBound(_cols(id(c)),value); 1362 1396 } 1363 1397 … … 1368 1402 ///\return The lower bound for column \c c 1369 1403 Value colLowerBound(Col c) const { 1370 return _getColLowerBound( cols(id(c)));1404 return _getColLowerBound(_cols(id(c))); 1371 1405 } 1372 1406 … … 1414 1448 /// Value or \ref INF. 1415 1449 void colUpperBound(Col c, Value value) { 1416 _setColUpperBound( cols(id(c)),value);1450 _setColUpperBound(_cols(id(c)),value); 1417 1451 }; 1418 1452 … … 1423 1457 /// \return The upper bound for column \c c 1424 1458 Value colUpperBound(Col c) const { 1425 return _getColUpperBound( cols(id(c)));1459 return _getColUpperBound(_cols(id(c))); 1426 1460 } 1427 1461 … … 1470 1504 /// Value, -\ref INF or \ref INF. 1471 1505 void colBounds(Col c, Value lower, Value upper) { 1472 _setColLowerBound( cols(id(c)),lower);1473 _setColUpperBound( cols(id(c)),upper);1506 _setColLowerBound(_cols(id(c)),lower); 1507 _setColUpperBound(_cols(id(c)),upper); 1474 1508 } 1475 1509 … … 1516 1550 /// Value or -\ref INF. 1517 1551 void rowLowerBound(Row r, Value value) { 1518 _setRowLowerBound( rows(id(r)),value);1552 _setRowLowerBound(_rows(id(r)),value); 1519 1553 } 1520 1554 … … 1525 1559 ///\return The lower bound for row \c r 1526 1560 Value rowLowerBound(Row r) const { 1527 return _getRowLowerBound( rows(id(r)));1561 return _getRowLowerBound(_rows(id(r))); 1528 1562 } 1529 1563 … … 1534 1568 /// Value or -\ref INF. 1535 1569 void rowUpperBound(Row r, Value value) { 1536 _setRowUpperBound( rows(id(r)),value);1570 _setRowUpperBound(_rows(id(r)),value); 1537 1571 } 1538 1572 … … 1543 1577 ///\return The upper bound for row \c r 1544 1578 Value rowUpperBound(Row r) const { 1545 return _getRowUpperBound( rows(id(r)));1579 return _getRowUpperBound(_rows(id(r))); 1546 1580 } 1547 1581 1548 1582 ///Set an element of the objective function 1549 void objCoeff(Col c, Value v) {_setObjCoeff( cols(id(c)),v); };1583 void objCoeff(Col c, Value v) {_setObjCoeff(_cols(id(c)),v); }; 1550 1584 1551 1585 ///Get an element of the objective function 1552 Value objCoeff(Col c) const { return _getObjCoeff( cols(id(c))); };1586 Value objCoeff(Col c) const { return _getObjCoeff(_cols(id(c))); }; 1553 1587 1554 1588 ///Set the objective function … … 1557 1591 /// 1558 1592 void obj(const Expr& e) { 1559 _setObjCoeffs(ExprIterator(e.comps.begin(), cols),1560 ExprIterator(e.comps.end(), cols));1593 _setObjCoeffs(ExprIterator(e.comps.begin(), _cols), 1594 ExprIterator(e.comps.end(), _cols)); 1561 1595 obj_const_comp = *e; 1562 1596 } … … 1568 1602 Expr obj() const { 1569 1603 Expr e; 1570 _getObjCoeffs(InsertIterator(e.comps, cols));1604 _getObjCoeffs(InsertIterator(e.comps, _cols)); 1571 1605 *e = obj_const_comp; 1572 1606 return e; … … 1587 1621 1588 1622 ///Clear the problem 1589 void clear() { _clear(); rows.clear();cols.clear(); }1623 void clear() { _clear(); _rows.clear(); _cols.clear(); } 1590 1624 1591 1625 /// Set the message level of the solver … … 1930 1964 /// Return the primal value of the column. 1931 1965 /// \pre The problem is solved. 1932 Value primal(Col c) const { return _getPrimal( cols(id(c))); }1966 Value primal(Col c) const { return _getPrimal(_cols(id(c))); } 1933 1967 1934 1968 /// Return the primal value of the expression … … 1957 1991 /// \note Some solvers does not provide primal ray calculation 1958 1992 /// functions. 1959 Value primalRay(Col c) const { return _getPrimalRay( cols(id(c))); }1993 Value primalRay(Col c) const { return _getPrimalRay(_cols(id(c))); } 1960 1994 1961 1995 /// Return the dual value of the row … … 1963 1997 /// Return the dual value of the row. 1964 1998 /// \pre The problem is solved. 1965 Value dual(Row r) const { return _getDual( rows(id(r))); }1999 Value dual(Row r) const { return _getDual(_rows(id(r))); } 1966 2000 1967 2001 /// Return the dual value of the dual expression … … 1991 2025 /// \note Some solvers does not provide dual ray calculation 1992 2026 /// functions. 1993 Value dualRay(Row r) const { return _getDualRay( rows(id(r))); }2027 Value dualRay(Row r) const { return _getDualRay(_rows(id(r))); } 1994 2028 1995 2029 /// Return the basis status of the column 1996 2030 1997 2031 /// \see VarStatus 1998 VarStatus colStatus(Col c) const { return _getColStatus( cols(id(c))); }2032 VarStatus colStatus(Col c) const { return _getColStatus(_cols(id(c))); } 1999 2033 2000 2034 /// Return the basis status of the row 2001 2035 2002 2036 /// \see VarStatus 2003 VarStatus rowStatus(Row r) const { return _getRowStatus( rows(id(r))); }2037 VarStatus rowStatus(Row r) const { return _getRowStatus(_rows(id(r))); } 2004 2038 2005 2039 ///The value of the objective function … … 2081 2115 /// 2082 2116 void colType(Col c, ColTypes col_type) { 2083 _setColType( cols(id(c)),col_type);2117 _setColType(_cols(id(c)),col_type); 2084 2118 } 2085 2119 … … 2089 2123 /// 2090 2124 ColTypes colType(Col c) const { 2091 return _getColType( cols(id(c)));2125 return _getColType(_cols(id(c))); 2092 2126 } 2093 2127 ///@} … … 2106 2140 /// Return the value of the row in the solution. 2107 2141 /// \pre The problem is solved. 2108 Value sol(Col c) const { return _getSol( cols(id(c))); }2142 Value sol(Col c) const { return _getSol(_cols(id(c))); } 2109 2143 2110 2144 /// Return the value of the expression in the solution -
lemon/maps.h
r1270 r1336 26 26 27 27 #include <lemon/core.h> 28 #include <lemon/bits/stl_iterators.h> 28 29 29 30 ///\file … … 2582 2583 }; 2583 2584 2585 /// \brief STL style iterator for the keys mapped to \c true. 2586 /// 2587 /// This is an STL style wrapper for \ref TrueIt. 2588 /// It can be used in range-based for loops, STL algorithms, etc. 2589 LemonRangeWrapper1<TrueIt, IterableBoolMap> 2590 trueKeys() { 2591 return LemonRangeWrapper1<TrueIt, IterableBoolMap>(*this); 2592 } 2593 2594 2584 2595 /// \brief Iterator for the keys mapped to \c false. 2585 2596 /// … … 2620 2631 const IterableBoolMap* _map; 2621 2632 }; 2633 2634 /// \brief STL style iterator for the keys mapped to \c false. 2635 /// 2636 /// This is an STL style wrapper for \ref FalseIt. 2637 /// It can be used in range-based for loops, STL algorithms, etc. 2638 LemonRangeWrapper1<FalseIt, IterableBoolMap> 2639 falseKeys() { 2640 return LemonRangeWrapper1<FalseIt, IterableBoolMap>(*this); 2641 } 2642 2622 2643 2623 2644 /// \brief Iterator for the keys mapped to a given value. … … 2664 2685 const IterableBoolMap* _map; 2665 2686 }; 2687 2688 /// \brief STL style iterator for the keys mapped to a given value. 2689 /// 2690 /// This is an STL style wrapper for \ref ItemIt. 2691 /// It can be used in range-based for loops, STL algorithms, etc. 2692 LemonRangeWrapper2<ItemIt, IterableBoolMap, bool> 2693 items(bool value) { 2694 return LemonRangeWrapper2<ItemIt, IterableBoolMap, bool>(*this, value); 2695 } 2666 2696 2667 2697 protected: … … 3006 3036 }; 3007 3037 3038 /// \brief STL style iterator for the keys with the same value. 3039 /// 3040 /// This is an STL style wrapper for \ref ItemIt. 3041 /// It can be used in range-based for loops, STL algorithms, etc. 3042 LemonRangeWrapper2<ItemIt, IterableIntMap, int> 3043 items(int value) { 3044 return LemonRangeWrapper2<ItemIt, IterableIntMap, int>(*this, value); 3045 } 3046 3047 3008 3048 protected: 3009 3049 … … 3249 3289 }; 3250 3290 3291 /// \brief STL style iterator for the keys with the same value. 3292 /// 3293 /// This is an STL style wrapper for \ref ItemIt. 3294 /// It can be used in range-based for loops, STL algorithms, etc. 3295 LemonRangeWrapper2<ItemIt, IterableValueMap, V> 3296 items(const V& value) { 3297 return LemonRangeWrapper2<ItemIt, IterableValueMap, V>(*this, value); 3298 } 3299 3300 3251 3301 protected: 3252 3302 -
lemon/math.h
r1270 r1311 68 68 ///Round a value to its closest integer 69 69 inline double round(double r) { 70 return (r > 0.0) ? floor(r + 0.5) :ceil(r - 0.5);70 return (r > 0.0) ? std::floor(r + 0.5) : std::ceil(r - 0.5); 71 71 } 72 72 -
lemon/max_cardinality_search.h
r1270 r1271 165 165 /// 166 166 /// This function instantiates a \ref CardinalityMap. 167 /// \param digraph is the digraph, to which we would like to define the \ref168 /// CardinalityMap167 /// \param digraph is the digraph, to which we would like to 168 /// define the \ref CardinalityMap 169 169 static CardinalityMap *createCardinalityMap(const Digraph &digraph) { 170 170 return new CardinalityMap(digraph); … … 181 181 /// Search algorithm. The maximum cardinality search first chooses any 182 182 /// node of the digraph. Then every time it chooses one unprocessed node 183 /// with maximum cardinality, i.e the sum of capacities on out arcs to the nodes 183 /// with maximum cardinality, i.e the sum of capacities on out arcs 184 /// to the nodes 184 185 /// which were previusly processed. 185 186 /// If there is a cut in the digraph the algorithm should choose -
lemon/nearest_neighbor_tsp.h
r1270 r1294 116 116 for (IncEdgeIt e(_gr, n1); e != INVALID; ++e) { 117 117 if (!used[_gr.runningNode(e)] && 118 ( _cost[e] < _cost[min_edge1] || min_edge1 == INVALID)) {118 (min_edge1 == INVALID || _cost[e] < _cost[min_edge1])) { 119 119 min_edge1 = e; 120 120 } … … 125 125 for (IncEdgeIt e(_gr, n2); e != INVALID; ++e) { 126 126 if (!used[_gr.runningNode(e)] && 127 ( _cost[e] < _cost[min_edge2] || min_edge2 == INVALID)) {127 (min_edge2 == INVALID||_cost[e] < _cost[min_edge2])) { 128 128 min_edge2 = e; 129 129 } -
lemon/network_simplex.h
r1270 r1318 199 199 200 200 // Parameters of the problem 201 bool _ha ve_lower;201 bool _has_lower; 202 202 SupplyType _stype; 203 203 Value _sum_supply; … … 683 683 template <typename LowerMap> 684 684 NetworkSimplex& lowerMap(const LowerMap& map) { 685 _ha ve_lower = true;685 _has_lower = true; 686 686 for (ArcIt a(_graph); a != INVALID; ++a) { 687 687 _lower[_arc_id[a]] = map[a]; … … 880 880 _cost[i] = 1; 881 881 } 882 _ha ve_lower = false;882 _has_lower = false; 883 883 _stype = GEQ; 884 884 return *this; … … 937 937 _node_id[n] = i; 938 938 } 939 if (_arc_mixing ) {939 if (_arc_mixing && _node_num > 1) { 940 940 // Store the arcs in a mixed order 941 941 const int skip = std::max(_arc_num / _node_num, 3); … … 1073 1073 1074 1074 // Remove non-zero lower bounds 1075 if (_ha ve_lower) {1075 if (_has_lower) { 1076 1076 for (int i = 0; i != _arc_num; ++i) { 1077 1077 Value c = _lower[i]; … … 1236 1236 } 1237 1237 1238 // Check if the upper bound is greater or equal to the lower bound1238 // Check if the upper bound is greater than or equal to the lower bound 1239 1239 // on each arc. 1240 1240 bool checkBoundMaps() { … … 1613 1613 1614 1614 // Transform the solution and the supply map to the original form 1615 if (_ha ve_lower) {1615 if (_has_lower) { 1616 1616 for (int i = 0; i != _arc_num; ++i) { 1617 1617 Value c = _lower[i]; -
lemon/path.h
r1270 r1336 31 31 #include <lemon/core.h> 32 32 #include <lemon/concepts/path.h> 33 #include <lemon/bits/stl_iterators.h> 33 34 34 35 namespace lemon { … … 140 141 int idx; 141 142 }; 143 144 /// \brief Gets the collection of the arcs of the path. 145 /// 146 /// This function can be used for iterating on the 147 /// arcs of the path. It returns a wrapped 148 /// ArcIt, which looks like an STL container 149 /// (by having begin() and end()) which you can use in range-based 150 /// for loops, STL algorithms, etc. 151 /// For example you can write: 152 ///\code 153 /// for(auto a: p.arcs()) 154 /// doSomething(a); 155 ///\endcode 156 LemonRangeWrapper1<ArcIt, Path> arcs() const { 157 return LemonRangeWrapper1<ArcIt, Path>(*this); 158 } 159 142 160 143 161 /// \brief Length of the path. … … 346 364 }; 347 365 366 /// \brief Gets the collection of the arcs of the path. 367 /// 368 /// This function can be used for iterating on the 369 /// arcs of the path. It returns a wrapped 370 /// ArcIt, which looks like an STL container 371 /// (by having begin() and end()) which you can use in range-based 372 /// for loops, STL algorithms, etc. 373 /// For example you can write: 374 ///\code 375 /// for(auto a: p.arcs()) 376 /// doSomething(a); 377 ///\endcode 378 LemonRangeWrapper1<ArcIt, SimplePath> arcs() const { 379 return LemonRangeWrapper1<ArcIt, SimplePath>(*this); 380 } 381 382 348 383 /// \brief Length of the path. 349 384 int length() const { return data.size(); } … … 543 578 Node *node; 544 579 }; 580 581 /// \brief Gets the collection of the arcs of the path. 582 /// 583 /// This function can be used for iterating on the 584 /// arcs of the path. It returns a wrapped 585 /// ArcIt, which looks like an STL container 586 /// (by having begin() and end()) which you can use in range-based 587 /// for loops, STL algorithms, etc. 588 /// For example you can write: 589 ///\code 590 /// for(auto a: p.arcs()) 591 /// doSomething(a); 592 ///\endcode 593 LemonRangeWrapper1<ArcIt, ListPath> arcs() const { 594 return LemonRangeWrapper1<ArcIt, ListPath>(*this); 595 } 596 545 597 546 598 /// \brief The n-th arc. … … 796 848 /// 797 849 /// Default constructor 798 StaticPath() : len(0), arcs(0) {}850 StaticPath() : len(0), _arcs(0) {} 799 851 800 852 /// \brief Copy constructor 801 853 /// 802 StaticPath(const StaticPath& cpath) : arcs(0) {854 StaticPath(const StaticPath& cpath) : _arcs(0) { 803 855 pathCopy(cpath, *this); 804 856 } … … 808 860 /// This path can be initialized from any other path type. 809 861 template <typename CPath> 810 StaticPath(const CPath& cpath) : arcs(0) {862 StaticPath(const CPath& cpath) : _arcs(0) { 811 863 pathCopy(cpath, *this); 812 864 } … … 816 868 /// Destructor of the path 817 869 ~StaticPath() { 818 if ( arcs) delete[]arcs;870 if (_arcs) delete[] _arcs; 819 871 } 820 872 … … 883 935 int idx; 884 936 }; 937 938 /// \brief Gets the collection of the arcs of the path. 939 /// 940 /// This function can be used for iterating on the 941 /// arcs of the path. It returns a wrapped 942 /// ArcIt, which looks like an STL container 943 /// (by having begin() and end()) which you can use in range-based 944 /// for loops, STL algorithms, etc. 945 /// For example you can write: 946 ///\code 947 /// for(auto a: p.arcs()) 948 /// doSomething(a); 949 ///\endcode 950 LemonRangeWrapper1<ArcIt, StaticPath> arcs() const { 951 return LemonRangeWrapper1<ArcIt, StaticPath>(*this); 952 } 953 885 954 886 955 /// \brief The n-th arc. … … 888 957 /// \pre \c n is in the <tt>[0..length() - 1]</tt> range. 889 958 const Arc& nth(int n) const { 890 return arcs[n];959 return _arcs[n]; 891 960 } 892 961 … … 905 974 void clear() { 906 975 len = 0; 907 if ( arcs) delete[]arcs;908 arcs = 0;976 if (_arcs) delete[] _arcs; 977 _arcs = 0; 909 978 } 910 979 911 980 /// \brief The first arc of the path. 912 981 const Arc& front() const { 913 return arcs[0];982 return _arcs[0]; 914 983 } 915 984 916 985 /// \brief The last arc of the path. 917 986 const Arc& back() const { 918 return arcs[len - 1];987 return _arcs[len - 1]; 919 988 } 920 989 … … 925 994 void build(const CPath& path) { 926 995 len = path.length(); 927 arcs = new Arc[len];996 _arcs = new Arc[len]; 928 997 int index = 0; 929 998 for (typename CPath::ArcIt it(path); it != INVALID; ++it) { 930 arcs[index] = it;999 _arcs[index] = it; 931 1000 ++index; 932 1001 } … … 936 1005 void buildRev(const CPath& path) { 937 1006 len = path.length(); 938 arcs = new Arc[len];1007 _arcs = new Arc[len]; 939 1008 int index = len; 940 1009 for (typename CPath::RevArcIt it(path); it != INVALID; ++it) { 941 1010 --index; 942 arcs[index] = it;1011 _arcs[index] = it; 943 1012 } 944 1013 } … … 946 1015 private: 947 1016 int len; 948 Arc* arcs;1017 Arc* _arcs; 949 1018 }; 950 1019 … … 1158 1227 }; 1159 1228 1229 /// \brief Gets the collection of the nodes of the path. 1230 /// 1231 /// This function can be used for iterating on the 1232 /// nodes of the path. It returns a wrapped 1233 /// PathNodeIt, which looks like an STL container 1234 /// (by having begin() and end()) which you can use in range-based 1235 /// for loops, STL algorithms, etc. 1236 /// For example you can write: 1237 ///\code 1238 /// for(auto u: pathNodes(g,p)) 1239 /// doSomething(u); 1240 ///\endcode 1241 template<typename Path> 1242 LemonRangeWrapper2<PathNodeIt<Path>, typename Path::Digraph, Path> 1243 pathNodes(const typename Path::Digraph &g, const Path &p) { 1244 return 1245 LemonRangeWrapper2<PathNodeIt<Path>, typename Path::Digraph, Path>(g,p); 1246 } 1247 1160 1248 ///@} 1161 1249 -
lemon/radix_sort.h
r1270 r1328 329 329 Allocator allocator; 330 330 331 int length = st d::distance(first, last);331 int length = static_cast<int>(std::distance(first, last)); 332 332 Key* buffer = allocator.allocate(2 * length); 333 333 try { -
lemon/random.h
r631 r1343 63 63 #define LEMON_RANDOM_H 64 64 65 #include <lemon/config.h> 66 65 67 #include <algorithm> 66 68 #include <iterator> … … 72 74 #include <lemon/dim2.h> 73 75 74 #ifndef WIN3276 #ifndef LEMON_WIN32 75 77 #include <sys/time.h> 76 78 #include <ctime> … … 200 202 initState(init); 201 203 202 num = length > end - begin ? length : end - begin;204 num = static_cast<int>(length > end - begin ? length : end - begin); 203 205 while (num--) { 204 206 curr[0] = (curr[0] ^ ((curr[1] ^ (curr[1] >> (bits - 2))) * mul1)) … … 214 216 } 215 217 216 num = length - 1; cnt = length - (curr - state) - 1;218 num = length - 1; cnt = static_cast<int>(length - (curr - state) - 1); 217 219 while (num--) { 218 220 curr[0] = (curr[0] ^ ((curr[1] ^ (curr[1] >> (bits - 2))) * mul2)) … … 250 252 current = state + length; 251 253 252 registerWord *curr = state + length - 1;253 registerlong num;254 Word *curr = state + length - 1; 255 long num; 254 256 255 257 num = length - shift; … … 606 608 /// \return Currently always \c true. 607 609 bool seed() { 608 #ifndef WIN32610 #ifndef LEMON_WIN32 609 611 if (seedFromFile("/dev/urandom", 0)) return true; 610 612 #endif … … 626 628 /// \param offset The offset, from the file read. 627 629 /// \return \c true when the seeding successes. 628 #ifndef WIN32630 #ifndef LEMON_WIN32 629 631 bool seedFromFile(const std::string& file = "/dev/urandom", int offset = 0) 630 632 #else … … 648 650 /// \return Currently always \c true. 649 651 bool seedFromTime() { 650 #ifndef WIN32652 #ifndef LEMON_WIN32 651 653 timeval tv; 652 654 gettimeofday(&tv, 0); -
lemon/smart_graph.h
r1270 r1336 48 48 }; 49 49 50 std::vector<NodeT> nodes;51 std::vector<ArcT> arcs;50 std::vector<NodeT> _nodes; 51 std::vector<ArcT> _arcs; 52 52 53 53 public: … … 60 60 public: 61 61 62 SmartDigraphBase() : nodes(),arcs() { }62 SmartDigraphBase() : _nodes(), _arcs() { } 63 63 SmartDigraphBase(const SmartDigraphBase &_g) 64 : nodes(_g.nodes), arcs(_g.arcs) { }64 : _nodes(_g._nodes), _arcs(_g._arcs) { } 65 65 66 66 typedef True NodeNumTag; 67 67 typedef True ArcNumTag; 68 68 69 int nodeNum() const { return nodes.size(); }70 int arcNum() const { return arcs.size(); }71 72 int maxNodeId() const { return nodes.size()-1; }73 int maxArcId() const { return arcs.size()-1; }69 int nodeNum() const { return _nodes.size(); } 70 int arcNum() const { return _arcs.size(); } 71 72 int maxNodeId() const { return _nodes.size()-1; } 73 int maxArcId() const { return _arcs.size()-1; } 74 74 75 75 Node addNode() { 76 int n = nodes.size();77 nodes.push_back(NodeT());78 nodes[n].first_in = -1;79 nodes[n].first_out = -1;76 int n = _nodes.size(); 77 _nodes.push_back(NodeT()); 78 _nodes[n].first_in = -1; 79 _nodes[n].first_out = -1; 80 80 return Node(n); 81 81 } 82 82 83 83 Arc addArc(Node u, Node v) { 84 int n = arcs.size();85 arcs.push_back(ArcT());86 arcs[n].source = u._id;87 arcs[n].target = v._id;88 arcs[n].next_out =nodes[u._id].first_out;89 arcs[n].next_in =nodes[v._id].first_in;90 nodes[u._id].first_out =nodes[v._id].first_in = n;84 int n = _arcs.size(); 85 _arcs.push_back(ArcT()); 86 _arcs[n].source = u._id; 87 _arcs[n].target = v._id; 88 _arcs[n].next_out = _nodes[u._id].first_out; 89 _arcs[n].next_in = _nodes[v._id].first_in; 90 _nodes[u._id].first_out = _nodes[v._id].first_in = n; 91 91 92 92 return Arc(n); … … 94 94 95 95 void clear() { 96 arcs.clear();97 nodes.clear();98 } 99 100 Node source(Arc a) const { return Node( arcs[a._id].source); }101 Node target(Arc a) const { return Node( arcs[a._id].target); }96 _arcs.clear(); 97 _nodes.clear(); 98 } 99 100 Node source(Arc a) const { return Node(_arcs[a._id].source); } 101 Node target(Arc a) const { return Node(_arcs[a._id].target); } 102 102 103 103 static int id(Node v) { return v._id; } … … 108 108 109 109 bool valid(Node n) const { 110 return n._id >= 0 && n._id < static_cast<int>( nodes.size());110 return n._id >= 0 && n._id < static_cast<int>(_nodes.size()); 111 111 } 112 112 bool valid(Arc a) const { 113 return a._id >= 0 && a._id < static_cast<int>( arcs.size());113 return a._id >= 0 && a._id < static_cast<int>(_arcs.size()); 114 114 } 115 115 … … 146 146 147 147 void first(Node& node) const { 148 node._id = nodes.size() - 1;148 node._id = _nodes.size() - 1; 149 149 } 150 150 … … 154 154 155 155 void first(Arc& arc) const { 156 arc._id = arcs.size() - 1;156 arc._id = _arcs.size() - 1; 157 157 } 158 158 … … 162 162 163 163 void firstOut(Arc& arc, const Node& node) const { 164 arc._id = nodes[node._id].first_out;164 arc._id = _nodes[node._id].first_out; 165 165 } 166 166 167 167 void nextOut(Arc& arc) const { 168 arc._id = arcs[arc._id].next_out;168 arc._id = _arcs[arc._id].next_out; 169 169 } 170 170 171 171 void firstIn(Arc& arc, const Node& node) const { 172 arc._id = nodes[node._id].first_in;172 arc._id = _nodes[node._id].first_in; 173 173 } 174 174 175 175 void nextIn(Arc& arc) const { 176 arc._id = arcs[arc._id].next_in;176 arc._id = _arcs[arc._id].next_in; 177 177 } 178 178 … … 267 267 { 268 268 Node b = addNode(); 269 nodes[b._id].first_out=nodes[n._id].first_out;270 nodes[n._id].first_out=-1;271 for(int i= nodes[b._id].first_out; i!=-1; i=arcs[i].next_out) {272 arcs[i].source=b._id;269 _nodes[b._id].first_out=_nodes[n._id].first_out; 270 _nodes[n._id].first_out=-1; 271 for(int i=_nodes[b._id].first_out; i!=-1; i=_arcs[i].next_out) { 272 _arcs[i].source=b._id; 273 273 } 274 274 if(connect) addArc(n,b); … … 292 292 /// to build the digraph. 293 293 /// \sa reserveArc() 294 void reserveNode(int n) { nodes.reserve(n); };294 void reserveNode(int n) { _nodes.reserve(n); }; 295 295 296 296 /// Reserve memory for arcs. … … 302 302 /// to build the digraph. 303 303 /// \sa reserveNode() 304 void reserveArc(int m) { arcs.reserve(m); };304 void reserveArc(int m) { _arcs.reserve(m); }; 305 305 306 306 public: … … 312 312 void restoreSnapshot(const Snapshot &s) 313 313 { 314 while(s.arc_num< arcs.size()) {315 Arc arc = arcFromId( arcs.size()-1);314 while(s.arc_num<_arcs.size()) { 315 Arc arc = arcFromId(_arcs.size()-1); 316 316 Parent::notifier(Arc()).erase(arc); 317 nodes[arcs.back().source].first_out=arcs.back().next_out;318 nodes[arcs.back().target].first_in=arcs.back().next_in;319 arcs.pop_back();320 } 321 while(s.node_num< nodes.size()) {322 Node node = nodeFromId( nodes.size()-1);317 _nodes[_arcs.back().source].first_out=_arcs.back().next_out; 318 _nodes[_arcs.back().target].first_in=_arcs.back().next_in; 319 _arcs.pop_back(); 320 } 321 while(s.node_num<_nodes.size()) { 322 Node node = nodeFromId(_nodes.size()-1); 323 323 Parent::notifier(Node()).erase(node); 324 nodes.pop_back();324 _nodes.pop_back(); 325 325 } 326 326 } … … 363 363 /// 364 364 Snapshot(SmartDigraph &gr) : _graph(&gr) { 365 node_num=_graph-> nodes.size();366 arc_num=_graph-> arcs.size();365 node_num=_graph->_nodes.size(); 366 arc_num=_graph->_arcs.size(); 367 367 } 368 368 … … 374 374 void save(SmartDigraph &gr) { 375 375 _graph=&gr; 376 node_num=_graph-> nodes.size();377 arc_num=_graph-> arcs.size();376 node_num=_graph->_nodes.size(); 377 arc_num=_graph->_arcs.size(); 378 378 } 379 379 … … 403 403 }; 404 404 405 std::vector<NodeT> nodes;406 std::vector<ArcT> arcs;405 std::vector<NodeT> _nodes; 406 std::vector<ArcT> _arcs; 407 407 408 408 public: … … 466 466 467 467 SmartGraphBase() 468 : nodes(),arcs() {}468 : _nodes(), _arcs() {} 469 469 470 470 typedef True NodeNumTag; … … 472 472 typedef True ArcNumTag; 473 473 474 int nodeNum() const { return nodes.size(); }475 int edgeNum() const { return arcs.size() / 2; }476 int arcNum() const { return arcs.size(); }477 478 int maxNodeId() const { return nodes.size()-1; }479 int maxEdgeId() const { return arcs.size() / 2 - 1; }480 int maxArcId() const { return arcs.size()-1; }481 482 Node source(Arc e) const { return Node( arcs[e._id ^ 1].target); }483 Node target(Arc e) const { return Node( arcs[e._id].target); }484 485 Node u(Edge e) const { return Node( arcs[2 * e._id].target); }486 Node v(Edge e) const { return Node( arcs[2 * e._id + 1].target); }474 int nodeNum() const { return _nodes.size(); } 475 int edgeNum() const { return _arcs.size() / 2; } 476 int arcNum() const { return _arcs.size(); } 477 478 int maxNodeId() const { return _nodes.size()-1; } 479 int maxEdgeId() const { return _arcs.size() / 2 - 1; } 480 int maxArcId() const { return _arcs.size()-1; } 481 482 Node source(Arc e) const { return Node(_arcs[e._id ^ 1].target); } 483 Node target(Arc e) const { return Node(_arcs[e._id].target); } 484 485 Node u(Edge e) const { return Node(_arcs[2 * e._id].target); } 486 Node v(Edge e) const { return Node(_arcs[2 * e._id + 1].target); } 487 487 488 488 static bool direction(Arc e) { … … 495 495 496 496 void first(Node& node) const { 497 node._id = nodes.size() - 1;497 node._id = _nodes.size() - 1; 498 498 } 499 499 … … 503 503 504 504 void first(Arc& arc) const { 505 arc._id = arcs.size() - 1;505 arc._id = _arcs.size() - 1; 506 506 } 507 507 … … 511 511 512 512 void first(Edge& arc) const { 513 arc._id = arcs.size() / 2 - 1;513 arc._id = _arcs.size() / 2 - 1; 514 514 } 515 515 … … 519 519 520 520 void firstOut(Arc &arc, const Node& v) const { 521 arc._id = nodes[v._id].first_out;521 arc._id = _nodes[v._id].first_out; 522 522 } 523 523 void nextOut(Arc &arc) const { 524 arc._id = arcs[arc._id].next_out;524 arc._id = _arcs[arc._id].next_out; 525 525 } 526 526 527 527 void firstIn(Arc &arc, const Node& v) const { 528 arc._id = (( nodes[v._id].first_out) ^ 1);528 arc._id = ((_nodes[v._id].first_out) ^ 1); 529 529 if (arc._id == -2) arc._id = -1; 530 530 } 531 531 void nextIn(Arc &arc) const { 532 arc._id = (( arcs[arc._id ^ 1].next_out) ^ 1);532 arc._id = ((_arcs[arc._id ^ 1].next_out) ^ 1); 533 533 if (arc._id == -2) arc._id = -1; 534 534 } 535 535 536 536 void firstInc(Edge &arc, bool& d, const Node& v) const { 537 int de = nodes[v._id].first_out;537 int de = _nodes[v._id].first_out; 538 538 if (de != -1) { 539 539 arc._id = de / 2; … … 545 545 } 546 546 void nextInc(Edge &arc, bool& d) const { 547 int de = ( arcs[(arc._id * 2) | (d ? 1 : 0)].next_out);547 int de = (_arcs[(arc._id * 2) | (d ? 1 : 0)].next_out); 548 548 if (de != -1) { 549 549 arc._id = de / 2; … … 564 564 565 565 bool valid(Node n) const { 566 return n._id >= 0 && n._id < static_cast<int>( nodes.size());566 return n._id >= 0 && n._id < static_cast<int>(_nodes.size()); 567 567 } 568 568 bool valid(Arc a) const { 569 return a._id >= 0 && a._id < static_cast<int>( arcs.size());569 return a._id >= 0 && a._id < static_cast<int>(_arcs.size()); 570 570 } 571 571 bool valid(Edge e) const { 572 return e._id >= 0 && 2 * e._id < static_cast<int>( arcs.size());572 return e._id >= 0 && 2 * e._id < static_cast<int>(_arcs.size()); 573 573 } 574 574 575 575 Node addNode() { 576 int n = nodes.size();577 nodes.push_back(NodeT());578 nodes[n].first_out = -1;576 int n = _nodes.size(); 577 _nodes.push_back(NodeT()); 578 _nodes[n].first_out = -1; 579 579 580 580 return Node(n); … … 582 582 583 583 Edge addEdge(Node u, Node v) { 584 int n = arcs.size();585 arcs.push_back(ArcT());586 arcs.push_back(ArcT());587 588 arcs[n].target = u._id;589 arcs[n | 1].target = v._id;590 591 arcs[n].next_out =nodes[v._id].first_out;592 nodes[v._id].first_out = n;593 594 arcs[n | 1].next_out =nodes[u._id].first_out;595 nodes[u._id].first_out = (n | 1);584 int n = _arcs.size(); 585 _arcs.push_back(ArcT()); 586 _arcs.push_back(ArcT()); 587 588 _arcs[n].target = u._id; 589 _arcs[n | 1].target = v._id; 590 591 _arcs[n].next_out = _nodes[v._id].first_out; 592 _nodes[v._id].first_out = n; 593 594 _arcs[n | 1].next_out = _nodes[u._id].first_out; 595 _nodes[u._id].first_out = (n | 1); 596 596 597 597 return Edge(n / 2); … … 599 599 600 600 void clear() { 601 arcs.clear();602 nodes.clear();601 _arcs.clear(); 602 _nodes.clear(); 603 603 } 604 604 … … 702 702 /// to build the graph. 703 703 /// \sa reserveEdge() 704 void reserveNode(int n) { nodes.reserve(n); };704 void reserveNode(int n) { _nodes.reserve(n); }; 705 705 706 706 /// Reserve memory for edges. … … 712 712 /// to build the graph. 713 713 /// \sa reserveNode() 714 void reserveEdge(int m) { arcs.reserve(2 * m); };714 void reserveEdge(int m) { _arcs.reserve(2 * m); }; 715 715 716 716 public: … … 723 723 { 724 724 s._graph = this; 725 s.node_num = nodes.size();726 s.arc_num = arcs.size();725 s.node_num = _nodes.size(); 726 s.arc_num = _arcs.size(); 727 727 } 728 728 729 729 void restoreSnapshot(const Snapshot &s) 730 730 { 731 while(s.arc_num< arcs.size()) {732 int n= arcs.size()-1;731 while(s.arc_num<_arcs.size()) { 732 int n=_arcs.size()-1; 733 733 Edge arc=edgeFromId(n/2); 734 734 Parent::notifier(Edge()).erase(arc); … … 737 737 dir.push_back(arcFromId(n-1)); 738 738 Parent::notifier(Arc()).erase(dir); 739 nodes[arcs[n-1].target].first_out=arcs[n].next_out;740 nodes[arcs[n].target].first_out=arcs[n-1].next_out;741 arcs.pop_back();742 arcs.pop_back();743 } 744 while(s.node_num< nodes.size()) {745 int n= nodes.size()-1;739 _nodes[_arcs[n-1].target].first_out=_arcs[n].next_out; 740 _nodes[_arcs[n].target].first_out=_arcs[n-1].next_out; 741 _arcs.pop_back(); 742 _arcs.pop_back(); 743 } 744 while(s.node_num<_nodes.size()) { 745 int n=_nodes.size()-1; 746 746 Node node = nodeFromId(n); 747 747 Parent::notifier(Node()).erase(node); 748 nodes.pop_back();748 _nodes.pop_back(); 749 749 } 750 750 } … … 826 826 }; 827 827 828 std::vector<NodeT> nodes;829 std::vector<ArcT> arcs;828 std::vector<NodeT> _nodes; 829 std::vector<ArcT> _arcs; 830 830 831 831 int first_red, first_blue; … … 916 916 917 917 SmartBpGraphBase() 918 : nodes(),arcs(), first_red(-1), first_blue(-1),918 : _nodes(), _arcs(), first_red(-1), first_blue(-1), 919 919 max_red(-1), max_blue(-1) {} 920 920 … … 923 923 typedef True ArcNumTag; 924 924 925 int nodeNum() const { return nodes.size(); }925 int nodeNum() const { return _nodes.size(); } 926 926 int redNum() const { return max_red + 1; } 927 927 int blueNum() const { return max_blue + 1; } 928 int edgeNum() const { return arcs.size() / 2; }929 int arcNum() const { return arcs.size(); }930 931 int maxNodeId() const { return nodes.size()-1; }928 int edgeNum() const { return _arcs.size() / 2; } 929 int arcNum() const { return _arcs.size(); } 930 931 int maxNodeId() const { return _nodes.size()-1; } 932 932 int maxRedId() const { return max_red; } 933 933 int maxBlueId() const { return max_blue; } 934 int maxEdgeId() const { return arcs.size() / 2 - 1; }935 int maxArcId() const { return arcs.size()-1; }936 937 bool red(Node n) const { return nodes[n._id].red; }938 bool blue(Node n) const { return ! nodes[n._id].red; }934 int maxEdgeId() const { return _arcs.size() / 2 - 1; } 935 int maxArcId() const { return _arcs.size()-1; } 936 937 bool red(Node n) const { return _nodes[n._id].red; } 938 bool blue(Node n) const { return !_nodes[n._id].red; } 939 939 940 940 static RedNode asRedNodeUnsafe(Node n) { return RedNode(n._id); } 941 941 static BlueNode asBlueNodeUnsafe(Node n) { return BlueNode(n._id); } 942 942 943 Node source(Arc a) const { return Node( arcs[a._id ^ 1].target); }944 Node target(Arc a) const { return Node( arcs[a._id].target); }943 Node source(Arc a) const { return Node(_arcs[a._id ^ 1].target); } 944 Node target(Arc a) const { return Node(_arcs[a._id].target); } 945 945 946 946 RedNode redNode(Edge e) const { 947 return RedNode( arcs[2 * e._id].target);947 return RedNode(_arcs[2 * e._id].target); 948 948 } 949 949 BlueNode blueNode(Edge e) const { 950 return BlueNode( arcs[2 * e._id + 1].target);950 return BlueNode(_arcs[2 * e._id + 1].target); 951 951 } 952 952 … … 960 960 961 961 void first(Node& node) const { 962 node._id = nodes.size() - 1;962 node._id = _nodes.size() - 1; 963 963 } 964 964 … … 972 972 973 973 void next(RedNode& node) const { 974 node._id = nodes[node._id].partition_next;974 node._id = _nodes[node._id].partition_next; 975 975 } 976 976 … … 980 980 981 981 void next(BlueNode& node) const { 982 node._id = nodes[node._id].partition_next;982 node._id = _nodes[node._id].partition_next; 983 983 } 984 984 985 985 void first(Arc& arc) const { 986 arc._id = arcs.size() - 1;986 arc._id = _arcs.size() - 1; 987 987 } 988 988 … … 992 992 993 993 void first(Edge& arc) const { 994 arc._id = arcs.size() / 2 - 1;994 arc._id = _arcs.size() / 2 - 1; 995 995 } 996 996 … … 1000 1000 1001 1001 void firstOut(Arc &arc, const Node& v) const { 1002 arc._id = nodes[v._id].first_out;1002 arc._id = _nodes[v._id].first_out; 1003 1003 } 1004 1004 void nextOut(Arc &arc) const { 1005 arc._id = arcs[arc._id].next_out;1005 arc._id = _arcs[arc._id].next_out; 1006 1006 } 1007 1007 1008 1008 void firstIn(Arc &arc, const Node& v) const { 1009 arc._id = (( nodes[v._id].first_out) ^ 1);1009 arc._id = ((_nodes[v._id].first_out) ^ 1); 1010 1010 if (arc._id == -2) arc._id = -1; 1011 1011 } 1012 1012 void nextIn(Arc &arc) const { 1013 arc._id = (( arcs[arc._id ^ 1].next_out) ^ 1);1013 arc._id = ((_arcs[arc._id ^ 1].next_out) ^ 1); 1014 1014 if (arc._id == -2) arc._id = -1; 1015 1015 } 1016 1016 1017 1017 void firstInc(Edge &arc, bool& d, const Node& v) const { 1018 int de = nodes[v._id].first_out;1018 int de = _nodes[v._id].first_out; 1019 1019 if (de != -1) { 1020 1020 arc._id = de / 2; … … 1026 1026 } 1027 1027 void nextInc(Edge &arc, bool& d) const { 1028 int de = ( arcs[(arc._id * 2) | (d ? 1 : 0)].next_out);1028 int de = (_arcs[(arc._id * 2) | (d ? 1 : 0)].next_out); 1029 1029 if (de != -1) { 1030 1030 arc._id = de / 2; … … 1037 1037 1038 1038 static int id(Node v) { return v._id; } 1039 int id(RedNode v) const { return nodes[v._id].partition_index; }1040 int id(BlueNode v) const { return nodes[v._id].partition_index; }1039 int id(RedNode v) const { return _nodes[v._id].partition_index; } 1040 int id(BlueNode v) const { return _nodes[v._id].partition_index; } 1041 1041 static int id(Arc e) { return e._id; } 1042 1042 static int id(Edge e) { return e._id; } … … 1047 1047 1048 1048 bool valid(Node n) const { 1049 return n._id >= 0 && n._id < static_cast<int>( nodes.size());1049 return n._id >= 0 && n._id < static_cast<int>(_nodes.size()); 1050 1050 } 1051 1051 bool valid(Arc a) const { 1052 return a._id >= 0 && a._id < static_cast<int>( arcs.size());1052 return a._id >= 0 && a._id < static_cast<int>(_arcs.size()); 1053 1053 } 1054 1054 bool valid(Edge e) const { 1055 return e._id >= 0 && 2 * e._id < static_cast<int>( arcs.size());1055 return e._id >= 0 && 2 * e._id < static_cast<int>(_arcs.size()); 1056 1056 } 1057 1057 1058 1058 RedNode addRedNode() { 1059 int n = nodes.size();1060 nodes.push_back(NodeT());1061 nodes[n].first_out = -1;1062 nodes[n].red = true;1063 nodes[n].partition_index = ++max_red;1064 nodes[n].partition_next = first_red;1059 int n = _nodes.size(); 1060 _nodes.push_back(NodeT()); 1061 _nodes[n].first_out = -1; 1062 _nodes[n].red = true; 1063 _nodes[n].partition_index = ++max_red; 1064 _nodes[n].partition_next = first_red; 1065 1065 first_red = n; 1066 1066 … … 1069 1069 1070 1070 BlueNode addBlueNode() { 1071 int n = nodes.size();1072 nodes.push_back(NodeT());1073 nodes[n].first_out = -1;1074 nodes[n].red = false;1075 nodes[n].partition_index = ++max_blue;1076 nodes[n].partition_next = first_blue;1071 int n = _nodes.size(); 1072 _nodes.push_back(NodeT()); 1073 _nodes[n].first_out = -1; 1074 _nodes[n].red = false; 1075 _nodes[n].partition_index = ++max_blue; 1076 _nodes[n].partition_next = first_blue; 1077 1077 first_blue = n; 1078 1078 … … 1081 1081 1082 1082 Edge addEdge(RedNode u, BlueNode v) { 1083 int n = arcs.size();1084 arcs.push_back(ArcT());1085 arcs.push_back(ArcT());1086 1087 arcs[n].target = u._id;1088 arcs[n | 1].target = v._id;1089 1090 arcs[n].next_out =nodes[v._id].first_out;1091 nodes[v._id].first_out = n;1092 1093 arcs[n | 1].next_out =nodes[u._id].first_out;1094 nodes[u._id].first_out = (n | 1);1083 int n = _arcs.size(); 1084 _arcs.push_back(ArcT()); 1085 _arcs.push_back(ArcT()); 1086 1087 _arcs[n].target = u._id; 1088 _arcs[n | 1].target = v._id; 1089 1090 _arcs[n].next_out = _nodes[v._id].first_out; 1091 _nodes[v._id].first_out = n; 1092 1093 _arcs[n | 1].next_out = _nodes[u._id].first_out; 1094 _nodes[u._id].first_out = (n | 1); 1095 1095 1096 1096 return Edge(n / 2); … … 1098 1098 1099 1099 void clear() { 1100 arcs.clear();1101 nodes.clear();1100 _arcs.clear(); 1101 _nodes.clear(); 1102 1102 first_red = -1; 1103 1103 first_blue = -1; … … 1214 1214 /// to build the graph. 1215 1215 /// \sa reserveEdge() 1216 void reserveNode(int n) { nodes.reserve(n); };1216 void reserveNode(int n) { _nodes.reserve(n); }; 1217 1217 1218 1218 /// Reserve memory for edges. … … 1224 1224 /// to build the graph. 1225 1225 /// \sa reserveNode() 1226 void reserveEdge(int m) { arcs.reserve(2 * m); };1226 void reserveEdge(int m) { _arcs.reserve(2 * m); }; 1227 1227 1228 1228 public: … … 1235 1235 { 1236 1236 s._graph = this; 1237 s.node_num = nodes.size();1238 s.arc_num = arcs.size();1237 s.node_num = _nodes.size(); 1238 s.arc_num = _arcs.size(); 1239 1239 } 1240 1240 1241 1241 void restoreSnapshot(const Snapshot &s) 1242 1242 { 1243 while(s.arc_num< arcs.size()) {1244 int n= arcs.size()-1;1243 while(s.arc_num<_arcs.size()) { 1244 int n=_arcs.size()-1; 1245 1245 Edge arc=edgeFromId(n/2); 1246 1246 Parent::notifier(Edge()).erase(arc); … … 1249 1249 dir.push_back(arcFromId(n-1)); 1250 1250 Parent::notifier(Arc()).erase(dir); 1251 nodes[arcs[n-1].target].first_out=arcs[n].next_out;1252 nodes[arcs[n].target].first_out=arcs[n-1].next_out;1253 arcs.pop_back();1254 arcs.pop_back();1255 } 1256 while(s.node_num< nodes.size()) {1257 int n= nodes.size()-1;1251 _nodes[_arcs[n-1].target].first_out=_arcs[n].next_out; 1252 _nodes[_arcs[n].target].first_out=_arcs[n-1].next_out; 1253 _arcs.pop_back(); 1254 _arcs.pop_back(); 1255 } 1256 while(s.node_num<_nodes.size()) { 1257 int n=_nodes.size()-1; 1258 1258 Node node = nodeFromId(n); 1259 1259 if (Parent::red(node)) { 1260 first_red = nodes[n].partition_next;1260 first_red = _nodes[n].partition_next; 1261 1261 if (first_red != -1) { 1262 max_red = nodes[first_red].partition_index;1262 max_red = _nodes[first_red].partition_index; 1263 1263 } else { 1264 1264 max_red = -1; … … 1266 1266 Parent::notifier(RedNode()).erase(asRedNodeUnsafe(node)); 1267 1267 } else { 1268 first_blue = nodes[n].partition_next;1268 first_blue = _nodes[n].partition_next; 1269 1269 if (first_blue != -1) { 1270 max_blue = nodes[first_blue].partition_index;1270 max_blue = _nodes[first_blue].partition_index; 1271 1271 } else { 1272 1272 max_blue = -1; … … 1275 1275 } 1276 1276 Parent::notifier(Node()).erase(node); 1277 nodes.pop_back();1277 _nodes.pop_back(); 1278 1278 } 1279 1279 } -
lemon/soplex.cc
r1270 r1336 38 38 39 39 SoplexLp::SoplexLp(const SoplexLp& lp) { 40 rows = lp.rows;41 cols = lp.cols;40 _rows = lp._rows; 41 _cols = lp._cols; 42 42 43 43 soplex = new soplex::SoPlex; … … 123 123 124 124 void SoplexLp::_eraseColId(int i) { 125 cols.eraseIndex(i);126 cols.relocateIndex(i,cols.maxIndex());125 _cols.eraseIndex(i); 126 _cols.relocateIndex(i, _cols.maxIndex()); 127 127 } 128 128 void SoplexLp::_eraseRowId(int i) { 129 rows.eraseIndex(i);130 rows.relocateIndex(i,rows.maxIndex());129 _rows.eraseIndex(i); 130 _rows.relocateIndex(i, _rows.maxIndex()); 131 131 } 132 132 … … 433 433 _row_names.clear(); 434 434 _row_names_ref.clear(); 435 cols.clear();436 rows.clear();435 _cols.clear(); 436 _rows.clear(); 437 437 _clear_temporals(); 438 438 } -
lemon/static_graph.h
r956 r1371 30 30 31 31 class StaticDigraphBase { 32 32 33 public: 33 34 … … 204 205 205 206 node_num = n; 206 arc_num = st d::distance(first, last);207 arc_num = static_cast<int>(std::distance(first, last)); 207 208 208 209 node_first_out = new int[node_num + 1]; … … 297 298 /// \sa concepts::Digraph 298 299 class StaticDigraph : public ExtendedStaticDigraphBase { 300 301 private: 302 /// Graphs are \e not copy constructible. Use DigraphCopy instead. 303 StaticDigraph(const StaticDigraph &) : ExtendedStaticDigraphBase() {}; 304 /// \brief Assignment of a graph to another one is \e not allowed. 305 /// Use DigraphCopy instead. 306 void operator=(const StaticDigraph&) {} 307 299 308 public: 300 309 -
lemon/time_measure.h
r1270 r1340 24 24 ///\brief Tools for measuring cpu usage 25 25 26 #ifdef WIN32 26 #include <lemon/config.h> 27 28 #ifdef LEMON_WIN32 27 29 #include <lemon/bits/windows.h> 28 30 #else … … 103 105 void stamp() 104 106 { 105 #ifndef WIN32107 #ifndef LEMON_WIN32 106 108 timeval tv; 107 109 gettimeofday(&tv, 0); -
test/CMakeLists.txt
r1264 r1350 55 55 tsp_test 56 56 unionfind_test 57 vf2_test 57 58 ) 58 59 -
test/arc_look_up_test.cc
r1270 r1312 25 25 using namespace lemon; 26 26 27 const int lgfn = 4;28 27 const std::string lgf = 29 28 "@nodes\n" -
test/bellman_ford_test.cc
r1270 r1378 101 101 pp = const_bf_test.negativeCycle(); 102 102 103 #ifdef LEMON_CXX11 103 104 for (BF::ActiveIt it(const_bf_test); it != INVALID; ++it) {} 105 for (auto n: const_bf_test.activeNodes()) { ::lemon::ignore_unused_variable_warning(n); } 106 for (Digraph::Node n: const_bf_test.activeNodes()) { 107 ::lemon::ignore_unused_variable_warning(n); 108 } 109 #endif 104 110 } 105 111 { -
test/bpgraph_test.cc
r1270 r1292 79 79 e2 = G.addEdge(bn1, rn1), 80 80 e3 = G.addEdge(rn1, bn2); 81 ::lemon::ignore_unused_variable_warning(e2,e3); 81 82 82 83 checkGraphNodeList(G, 3); … … 120 121 e1 = G.addEdge(n1, n2), e2 = G.addEdge(n1, n3), 121 122 e3 = G.addEdge(n4, n2), e4 = G.addEdge(n4, n3); 123 ::lemon::ignore_unused_variable_warning(e1,e3,e4); 122 124 123 125 // Check edge deletion … … 168 170 e1 = G.addEdge(n1, n2), e2 = G.addEdge(n1, n3), 169 171 e3 = G.addEdge(n4, n2), e4 = G.addEdge(n4, n3); 172 ::lemon::ignore_unused_variable_warning(e1,e3,e4); 170 173 171 174 G.changeRed(e2, n4); … … 220 223 e1 = G.addEdge(n1, n2), 221 224 e2 = G.addEdge(n1, n3); 225 ::lemon::ignore_unused_variable_warning(e1,e2); 222 226 223 227 checkGraphNodeList(G, 3); … … 305 309 e1 = g.addEdge(n1, n2), 306 310 e2 = g.addEdge(n1, n3); 311 ::lemon::ignore_unused_variable_warning(e2); 307 312 308 313 check(g.valid(n1), "Wrong validity check"); -
test/graph_test.h
r1270 r1337 39 39 check(n==INVALID,"Wrong Node list linking."); 40 40 check(countNodes(G)==cnt,"Wrong Node number."); 41 42 #ifdef LEMON_CXX11 43 { 44 typename Graph::NodeIt n(G); 45 for(auto u: G.nodes()) 46 { 47 check(n==u,"Wrong STL Node iterator."); 48 ++n; 49 } 50 check(n==INVALID,"Wrong STL Node iterator."); 51 } 52 { 53 typename Graph::NodeIt n(G); 54 for(typename Graph::Node u: G.nodes()) 55 { 56 check(n==u,"Wrong STL Node iterator."); 57 ++n; 58 } 59 check(n==INVALID,"Wrong STL Node iterator."); 60 } 61 #endif 41 62 } 42 63 … … 57 78 check(n==INVALID,"Wrong red Node list linking."); 58 79 check(countRedNodes(G)==cnt,"Wrong red Node number."); 80 #ifdef LEMON_CXX11 81 { 82 typename Graph::RedNodeIt n(G); 83 for(auto u: G.redNodes()) 84 { 85 check(n==u,"Wrong STL RedNode iterator."); 86 ++n; 87 } 88 check(n==INVALID,"Wrong STL RedNode iterator."); 89 } 90 { 91 typename Graph::RedNodeIt n(G); 92 for(typename Graph::RedNode u: G.redNodes()) 93 { 94 check(n==u,"Wrong STL RedNode iterator."); 95 ++n; 96 } 97 check(n==INVALID,"Wrong STL RedNode iterator."); 98 } 99 #endif 59 100 } 60 101 … … 75 116 check(n==INVALID,"Wrong blue Node list linking."); 76 117 check(countBlueNodes(G)==cnt,"Wrong blue Node number."); 118 #ifdef LEMON_CXX11 119 { 120 typename Graph::BlueNodeIt n(G); 121 for(auto u: G.blueNodes()) 122 { 123 check(n==u,"Wrong STL BlueNode iterator."); 124 ++n; 125 } 126 check(n==INVALID,"Wrong STL BlueNode iterator."); 127 } 128 { 129 typename Graph::BlueNodeIt n(G); 130 for(typename Graph::BlueNode u: G.blueNodes()) 131 { 132 check(n==u,"Wrong STL BlueNode iterator."); 133 ++n; 134 } 135 check(n==INVALID,"Wrong STL BlueNode iterator."); 136 } 137 #endif 138 77 139 } 78 140 … … 91 153 check(e==INVALID,"Wrong Arc list linking."); 92 154 check(countArcs(G)==cnt,"Wrong Arc number."); 155 #ifdef LEMON_CXX11 156 { 157 typename Graph::ArcIt a(G); 158 for(auto e: G.arcs()) 159 { 160 check(a==e,"Wrong STL Arc iterator."); 161 ++a; 162 } 163 check(a==INVALID,"Wrong STL Arc iterator."); 164 } 165 { 166 typename Graph::ArcIt a(G); 167 for(typename Graph::Arc e: G.arcs()) 168 { 169 check(a==e,"Wrong STL Arc iterator."); 170 ++a; 171 } 172 check(a==INVALID,"Wrong STL Arc iterator."); 173 } 174 #endif 175 93 176 } 94 177 … … 106 189 check(e==INVALID,"Wrong OutArc list linking."); 107 190 check(countOutArcs(G,n)==cnt,"Wrong OutArc number."); 191 #ifdef LEMON_CXX11 192 { 193 typename Graph::OutArcIt a(G,n); 194 for(auto e: G.outArcs(n)) 195 { 196 check(a==e,"Wrong STL OutArc iterator."); 197 ++a; 198 } 199 check(a==INVALID,"Wrong STL OutArc iterator."); 200 } 201 { 202 typename Graph::OutArcIt a(G,n); 203 for(typename Graph::Arc e: G.outArcs(n)) 204 { 205 check(a==e,"Wrong STL OutArc iterator."); 206 ++a; 207 } 208 check(a==INVALID,"Wrong STL OutArc iterator."); 209 } 210 #endif 211 108 212 } 109 213 … … 121 225 check(e==INVALID,"Wrong InArc list linking."); 122 226 check(countInArcs(G,n)==cnt,"Wrong InArc number."); 227 #ifdef LEMON_CXX11 228 { 229 typename Graph::InArcIt a(G,n); 230 for(auto e: G.inArcs(n)) 231 { 232 check(a==e,"Wrong STL InArc iterator."); 233 ++a; 234 } 235 check(a==INVALID,"Wrong STL InArc iterator."); 236 } 237 { 238 typename Graph::InArcIt a(G,n); 239 for(typename Graph::Arc e: G.inArcs(n)) 240 { 241 check(a==e,"Wrong STL InArc iterator."); 242 ++a; 243 } 244 check(a==INVALID,"Wrong STL InArc iterator."); 245 } 246 #endif 123 247 } 124 248 … … 135 259 check(e==INVALID,"Wrong Edge list linking."); 136 260 check(countEdges(G)==cnt,"Wrong Edge number."); 261 #ifdef LEMON_CXX11 262 { 263 typename Graph::EdgeIt a(G); 264 for(auto e: G.edges()) 265 { 266 check(a==e,"Wrong STL Edge iterator."); 267 ++a; 268 } 269 check(a==INVALID,"Wrong STL Edge iterator."); 270 } 271 { 272 typename Graph::EdgeIt a(G); 273 for(typename Graph::Edge e: G.edges()) 274 { 275 check(a==e,"Wrong STL Edge iterator."); 276 ++a; 277 } 278 check(a==INVALID,"Wrong STL Edge iterator."); 279 } 280 #endif 281 137 282 } 138 283 … … 151 296 check(e==INVALID,"Wrong IncEdge list linking."); 152 297 check(countIncEdges(G,n)==cnt,"Wrong IncEdge number."); 298 #ifdef LEMON_CXX11 299 { 300 typename Graph::IncEdgeIt a(G,n); 301 for(auto e: G.incEdges(n)) 302 { 303 check(a==e,"Wrong STL IncEdge iterator."); 304 ++a; 305 } 306 check(a==INVALID,"Wrong STL IncEdge iterator."); 307 } 308 { 309 typename Graph::IncEdgeIt a(G,n); 310 for(typename Graph::Edge e: G.incEdges(n)) 311 { 312 check(a==e,"Wrong STL IncEdge iterator."); 313 ++a; 314 } 315 check(a==INVALID,"Wrong STL IncEdge iterator."); 316 } 317 #endif 318 153 319 } 154 320 -
test/lp_test.cc
r1270 r1337 21 21 #include "test_tools.h" 22 22 #include <lemon/tolerance.h> 23 23 #include <lemon/concept_check.h> 24 24 #include <lemon/config.h> 25 25 … … 40 40 #endif 41 41 42 #ifdef LEMON_HAVE_LP 43 #include <lemon/lp.h> 44 #endif 42 45 using namespace lemon; 43 46 … … 45 48 int count=0; 46 49 for (LpBase::ColIt c(lp); c!=INVALID; ++c) ++count; 50 #ifdef LEMON_CXX11 51 int cnt = 0; 52 for(auto c: lp.cols()) { cnt++; ::lemon::ignore_unused_variable_warning(c); } 53 check(count == cnt, "Wrong STL iterator"); 54 #endif 47 55 return count; 48 56 } … … 51 59 int count=0; 52 60 for (LpBase::RowIt r(lp); r!=INVALID; ++r) ++count; 61 #ifdef LEMON_CXX11 62 int cnt = 0; 63 for(auto r: lp.rows()) { cnt++; ::lemon::ignore_unused_variable_warning(r); } 64 check(count == cnt, "Wrong STL iterator"); 65 #endif 53 66 return count; 54 67 } … … 417 430 lpTest(lp_skel); 418 431 432 #ifdef LEMON_HAVE_LP 433 { 434 Lp lp,lp2; 435 lpTest(lp); 436 aTest(lp2); 437 cloneTest<Lp>(); 438 } 439 #endif 440 419 441 #ifdef LEMON_HAVE_GLPK 420 442 { -
test/maps_test.cc
r1270 r1337 731 731 check(n == 3, "Wrong number"); 732 732 check(map1.falseNum() == 3, "Wrong number"); 733 734 #ifdef LEMON_CXX11 735 { 736 int c = 0; 737 for(auto v: map1.items(false)) { c++; ::lemon::ignore_unused_variable_warning(v); } 738 check(c == map1.falseNum(), "Wrong number"); 739 } 740 { 741 int c = 0; 742 for(auto v: map1.items(true)) { c++; ::lemon::ignore_unused_variable_warning(v); } 743 check(c == map1.trueNum(), "Wrong number"); 744 } 745 { 746 int c = 0; 747 for(auto v: map1.falseKeys()) { c++; ::lemon::ignore_unused_variable_warning(v); } 748 check(c == map1.falseNum(), "Wrong number"); 749 } 750 { 751 int c = 0; 752 for(auto v: map1.trueKeys()) { c++; ::lemon::ignore_unused_variable_warning(v); } 753 check(c == map1.trueNum(), "Wrong number"); 754 } 755 #endif 756 733 757 } 734 758 … … 781 805 } 782 806 check(n == num, "Wrong number"); 807 #ifdef LEMON_CXX11 808 { 809 int c = 0; 810 for(auto v: map1.items(0)) { c++; ::lemon::ignore_unused_variable_warning(v); } 811 check(c == (num + 1) / 2, "Wrong number"); 812 for(auto v: map1.items(1)) { c++; ::lemon::ignore_unused_variable_warning(v); } 813 check(c == num, "Wrong number"); 814 } 815 #endif 783 816 784 817 } … … 839 872 } 840 873 check(n == num, "Wrong number"); 874 875 #ifdef LEMON_CXX11 876 { 877 int c = 0; 878 for(auto v: map1.items(0.0)) { c++; ::lemon::ignore_unused_variable_warning(v); } 879 check(c == (num + 1) / 2, "Wrong number"); 880 for(auto v: map1.items(1.0)) { c++; ::lemon::ignore_unused_variable_warning(v); } 881 check(c == num, "Wrong number"); 882 } 883 #endif 841 884 842 885 } -
test/min_cost_flow_test.cc
r1270 r1318 396 396 checkMcf(mcf3, mcf3.run(param), neg2_gr, neg2_l, neg2_u, neg2_c, neg2_s, 397 397 mcf3.OPTIMAL, true, -300, test_str + "-18", GEQ); 398 399 // Tests for empty graph 400 Digraph gr0; 401 MCF mcf0(gr0); 402 mcf0.run(param); 403 check(mcf0.totalCost() == 0, "Wrong total cost"); 398 404 } 399 405 -
test/mip_test.cc
r795 r1300 31 31 #ifdef LEMON_HAVE_CBC 32 32 #include <lemon/cbc.h> 33 #endif 34 35 #ifdef LEMON_HAVE_MIP 36 #include <lemon/lp.h> 33 37 #endif 34 38 … … 129 133 { 130 134 135 #ifdef LEMON_HAVE_MIP 136 { 137 Mip mip1; 138 aTest(mip1); 139 cloneTest<Mip>(); 140 } 141 #endif 142 131 143 #ifdef LEMON_HAVE_GLPK 132 144 { -
test/radix_sort_test.cc
r1270 r1341 16 16 * 17 17 */ 18 19 #include <lemon/core.h> 18 20 19 21 #include <lemon/time_measure.h> -
test/tsp_test.cc
r1270 r1303 67 67 68 68 int node_cnt = 0; 69 for (typename Container::const_iterator it = p.begin(); it != p.end(); ++it) { 70 FullGraph::Node node = *it; 71 if (used[node]) return false; 72 used[node] = true; 73 ++node_cnt; 74 } 69 for (typename Container::const_iterator it = p.begin(); it != p.end(); ++it) 70 { 71 FullGraph::Node node = *it; 72 if (used[node]) return false; 73 used[node] = true; 74 ++node_cnt; 75 } 75 76 76 77 return (node_cnt == gr.nodeNum()); … … 132 133 int esize = n <= 1 ? 0 : n; 133 134 134 TSP alg(g, constMap<Edge, int>(1)); 135 ConstMap<Edge, int> cost_map(1); 136 TSP alg(g, cost_map); 135 137 136 138 check(alg.run() == esize, alg_name + ": Wrong total cost"); … … 265 267 tspTestSmall<GreedyTsp<ConstMap<Edge, int> > >("Greedy"); 266 268 tspTestSmall<NearestInsertionTsp<ConstMap<Edge, int> > >("Nearest Insertion"); 267 tspTestSmall<FarthestInsertionTsp<ConstMap<Edge, int> > >("Farthest Insertion"); 268 tspTestSmall<CheapestInsertionTsp<ConstMap<Edge, int> > >("Cheapest Insertion"); 269 tspTestSmall<FarthestInsertionTsp<ConstMap<Edge, int> > > 270 ("Farthest Insertion"); 271 tspTestSmall<CheapestInsertionTsp<ConstMap<Edge, int> > > 272 ("Cheapest Insertion"); 269 273 tspTestSmall<RandomInsertionTsp<ConstMap<Edge, int> > >("Random Insertion"); 270 274 tspTestSmall<ChristofidesTsp<ConstMap<Edge, int> > >("Christofides"); -
tools/dimacs-solver.cc
r1270 r1386 128 128 if (report) { 129 129 std::cerr << "Run NetworkSimplex: " << ti << "\n\n"; 130 std::cerr << "Feasible flow: " << (res == MCF::OPTIMAL ? "found" : "not found") << '\n'; 130 std::cerr << "Feasible flow: " << (res == MCF::OPTIMAL ? "found" : 131 "not found") << '\n'; 131 132 if (res) std::cerr << "Min flow cost: " 132 133 << ns.template totalCost<LargeValue>() << '\n'; … … 222 223 throw IoError("Cannot open the file for writing", ap.files()[1]); 223 224 } 225 // fall through 224 226 case 1: 225 227 input.open(ap.files()[0].c_str()); … … 227 229 throw IoError("File cannot be found", ap.files()[0]); 228 230 } 231 // fall through 229 232 case 0: 230 233 break; … … 251 254 case DimacsDescriptor::SP: 252 255 std::cout << "sp"; 256 break; 253 257 case DimacsDescriptor::MAT: 254 258 std::cout << "mat"; -
tools/lgf-gen.cc
r701 r1308 247 247 struct BeachIt; 248 248 249 typedef std::multimap<double, BeachIt > SpikeHeap;249 typedef std::multimap<double, BeachIt*> SpikeHeap; 250 250 251 251 typedef std::multimap<Part, SpikeHeap::iterator, YLess> Beach; … … 330 330 331 331 if (bit->second != spikeheap.end()) { 332 delete bit->second->second; 332 333 spikeheap.erase(bit->second); 333 334 } … … 343 344 circle_form(points[prev], points[curr], points[site])) { 344 345 double x = circle_point(points[prev], points[curr], points[site]); 345 pit = spikeheap.insert(std::make_pair(x, BeachIt(beach.end())));346 pit->second .it =346 pit = spikeheap.insert(std::make_pair(x, new BeachIt(beach.end()))); 347 pit->second->it = 347 348 beach.insert(std::make_pair(Part(prev, curr, site), pit)); 348 349 } else { … … 356 357 circle_form(points[site], points[curr],points[next])) { 357 358 double x = circle_point(points[site], points[curr], points[next]); 358 nit = spikeheap.insert(std::make_pair(x, BeachIt(beach.end())));359 nit->second .it =359 nit = spikeheap.insert(std::make_pair(x, new BeachIt(beach.end()))); 360 nit->second->it = 360 361 beach.insert(std::make_pair(Part(site, curr, next), nit)); 361 362 } else { … … 367 368 sweep = spit->first; 368 369 369 Beach::iterator bit = spit->second .it;370 Beach::iterator bit = spit->second->it; 370 371 371 372 int prev = bit->first.prev; … … 400 401 int nnt = nbit->first.next; 401 402 402 if (bit->second != spikeheap.end()) spikeheap.erase(bit->second); 403 if (pbit->second != spikeheap.end()) spikeheap.erase(pbit->second); 404 if (nbit->second != spikeheap.end()) spikeheap.erase(nbit->second); 405 403 if (bit->second != spikeheap.end()) 404 { 405 delete bit->second->second; 406 spikeheap.erase(bit->second); 407 } 408 if (pbit->second != spikeheap.end()) 409 { 410 delete pbit->second->second; 411 spikeheap.erase(pbit->second); 412 } 413 if (nbit->second != spikeheap.end()) 414 { 415 delete nbit->second->second; 416 spikeheap.erase(nbit->second); 417 } 418 406 419 beach.erase(nbit); 407 420 beach.erase(bit); … … 413 426 double x = circle_point(points[ppv], points[prev], points[next]); 414 427 if (x < sweep) x = sweep; 415 pit = spikeheap.insert(std::make_pair(x, BeachIt(beach.end())));416 pit->second .it =428 pit = spikeheap.insert(std::make_pair(x, new BeachIt(beach.end()))); 429 pit->second->it = 417 430 beach.insert(std::make_pair(Part(ppv, prev, next), pit)); 418 431 } else { … … 425 438 double x = circle_point(points[prev], points[next], points[nnt]); 426 439 if (x < sweep) x = sweep; 427 nit = spikeheap.insert(std::make_pair(x, BeachIt(beach.end())));428 nit->second .it =440 nit = spikeheap.insert(std::make_pair(x, new BeachIt(beach.end()))); 441 nit->second->it = 429 442 beach.insert(std::make_pair(Part(prev, next, nnt), nit)); 430 443 } else {
Note: See TracChangeset
for help on using the changeset viewer.